Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 50 additions & 5 deletions DECISIONS.md
Original file line number Diff line number Diff line change
Expand Up @@ -200,8 +200,20 @@
средняя ошибка чуть выше, чем у «размах × пиксели», зато мелкий акцент
(глаз, блик) не растворяется уже с 16 цветов.
Увеличение снимается автоматически, но отключается одной галочкой.
- Браузерный декодер (canvas) не используем: управление цветом может
сдвинуть значения, а для Aseprite его нет вовсе.
- Пиксель-арт браузерный декодер (canvas) не трогает: управление цветом
может сдвинуть значения, а для Aseprite его нет вовсе. Браузер нужен
только фото и картинкам крупнее холста: он декодирует (JPEG, WebP…) и
уменьшает выбранный квадрат, а палитру подбирает всё равно ядро.
- **Импорт живёт в редакторе** («Ещё → Новая карточка → Из картинки»),
отдельной вкладки нет. Результат — обычный рисунок на холсте: название,
рамку и подпись даёт редактор, прежний рисунок возвращает «Отменить».
Имя файла названием карточки не становится.
- Карточка квадратная. Пиксель-арт до 64×64 ложится как есть: неквадратный
— в середину холста, который его вмещает, на пустые клетки (ничего не
теряется). Крупнее или фото — через обрезку: квадрат двигают пальцем и
тянут за углы (колесо — на компьютере). Пиксель-арт режется по своей
сетке и не больше 64, чтобы пиксели остались; фото уменьшается до
выбранного размера.

## Экземпляры и чтение QR

Expand Down Expand Up @@ -308,8 +320,30 @@

- Только что полученная (или сделанная) карточка открывается крупно в
коллекции, где она теперь и лежит.
- Экран импорта — неизменный каркас: рамка-паспарту → строка состояния
фиксированной высоты → поля → кнопки; редкие галочки — под кнопками.
- Вкладка «Отдать» (на месте «Импорта»): свои карточки с кодом наготове —
выбранная лежит на бумаге своей рамки тем же компонентом, что и лист
«Поделиться»; внизу ряд своих карточек, выбранная приподнята. Код
получателя здесь не нужен — он для получения, и живёт на сканере.
- Способы отдать, везде одинаковые: код, «Ссылкой», «Файлом» (.pips — тот
же конверт, что в коде, со всеми подписями) и «Картинкой». Скачанный
файл называется латиницей: иначе некоторые браузеры называют его просто
«download».
- «Картинкой» — карточка целиком (1080×1440): бумага рамки, рисунок, имя,
автор и, если карточка помещается в один код, этот код — в цветах рамки,
на небольшой скруглённой подложке, одинаковой по виду на любой бумаге:
на светлой подложка — осветлённая бумага, модули — чернила, смягчённые к
серому ровно настолько, насколько позволяет контраст (≥ 7:1); на тёмной —
подложка светлого тона чернил, модули цветом бумаги (светлый код на
тёмном читают не все). Модуль ≥ 3 px; тест читает код на всех восьми бумагах после JPEG,
в полный размер и в ¾. Тот же конверт
лежит и внутри PNG (свой блок `piPs`, `png-card.js`). Файл открывается в
Pips как сама карточка, с автором и подписями; если мессенджер пережал
картинку или это скриншот — карточку читает код на ней. Поэтому так
можно отдать и чужую карточку: автор виден и подписан. Открытая в
редакторе «Из картинки», такая картинка сначала предлагает добавить
карточку в коллекцию.
- «Новая из неё» — только у своих карточек: рисунок уходит в редактор как
новая карточка, без названия. Чужой рисунок своим стать не может.
- Секреты на вкладке «Профиль» показываются и скрываются той же кнопкой; текст
бумажного ключа свёрнут — печатается QR.
- Уведомления — всегда в одном месте, под верхней панелью: низ занят то
Expand All @@ -336,8 +370,19 @@
- Запись в хранилище считается сделанной, когда транзакция завершилась, а
не когда принят запрос: иначе переполненный диск выдаёт ложное «сохранено».
- Резервную копию больше лимита ядра (64 МБ) не читаем в память вовсе.
- Версия раскладки данных — это номер версии самой базы IndexedDB
(`schema.js`). Новая версия приложения переводит данные шагами внутри
транзакции обновления: всё или ничего. Старые вкладки получают сигнал и
уступают («обновите страницу»). Старое приложение данные новее себя не
открывает и говорит об этом, а не показывает пустую коллекцию. Шаг после
выпуска не меняется: новая раскладка — новый шаг в конце.
- Редактор: у неподвижной картинки полоса кадров — одна кнопка «Кадр
анимации»; плитка проигрывания и пронумерованные кадры — с двух кадров.
Пустой холст не подписывается.
- Сканер (везде, где он есть): пока камера выключена, рамка сама — кнопка
«Включить камеру». Подсказки и ошибки — внизу рамки, поверх видео тоже.
«Включить камеру»; подсказки и ошибки — под её надписью, внутри уголков.
С камерой — внизу, поверх видео. Без доступа рамка так и говорит и
повторяет запрос по касанию.

## Модули

Expand Down
4 changes: 3 additions & 1 deletion scripts/samples.py
Original file line number Diff line number Diff line change
Expand Up @@ -106,9 +106,11 @@ def mushroom():
(1, 'M5 2h6v1h-6zM3 3h2v1h-2zM7 3h6v1h-6zM2 4h2v1h-2zM7 4h4v1h-4zM13 4h1v1h-1zM2 5h3v1h-3zM6 5h5v1h-5zM13 5h1v1h-1zM1 6h7v1h-7zM9 6h6v1h-6zM1 7h1v1h-1zM4 7h11v1h-11z'),
(2, 'M5 3h2v1h-2zM4 4h3v1h-3zM11 4h2v1h-2zM5 5h1v1h-1zM11 5h2v1h-2zM8 6h1v1h-1zM2 7h2v1h-2z'),
(3, 'M2 8h12v1h-12z'),
# The cap's underside edge is the cap's: it sinks with it, over the stem.
(0, 'M2 9h4v1h-4zM10 9h4v1h-4z'),
]
stem = [
(0, 'M2 9h4v1h-4zM10 9h4v1h-4zM5 10h1v1h-1zM10 10h1v1h-1zM4 11h1v1h-1zM11 11h1v1h-1zM4 12h1v1h-1zM11 12h1v1h-1zM4 13h1v1h-1zM11 13h1v1h-1zM5 14h6v1h-6z'),
(0, 'M5 10h1v1h-1zM10 10h1v1h-1zM4 11h1v1h-1zM11 11h1v1h-1zM4 12h1v1h-1zM11 12h1v1h-1zM4 13h1v1h-1zM11 13h1v1h-1zM5 14h6v1h-6z'),
(4, 'M6 9h4v1h-4zM6 10h4v1h-4zM5 11h4v1h-4zM5 12h4v1h-4zM5 13h3v1h-3z'),
(5, 'M9 11h2v1h-2zM9 12h2v1h-2zM8 13h3v1h-3z'),
]
Expand Down
Loading
Loading