diff --git a/docs/TZ.md b/docs/TZ.md index a1b325b..c6ab147 100644 --- a/docs/TZ.md +++ b/docs/TZ.md @@ -4,7 +4,7 @@ | | | |---|---| -| Версия ТЗ | 0.95 | +| Версия ТЗ | 0.96 | | Дата | 2026-10-10 | | Статус | На обсуждении | @@ -914,16 +914,21 @@ - **Манифест**: standalone, тёмная палитра кита (`#16161e` — фон и theme-color, чтобы не мигало белым при запуске и не зеленела шапка окна), иконки 192/512 + maskable-512, `id`/`start_url` = `/`, язык ru. -- **Иконки** (0.90): растрируются из лого скриптом `tools/rasterize_icons.sh` — - единственный источник, поэтому знак в шапке, иконка вкладки и иконка приложения - не разъезжаются. У скругления холста логотипа (`rx` 10 = 15% стороны) в иконках - «any» **углы прозрачные**: с впечатанным фоном скругление сливается с заливкой - холста, и иконка читается квадратом с острыми углами — в том числе в шторке - системных уведомлений (3.21), где она и была замечена владельцем. Эти же 192/512 - отдаются уведомлению как `icon` (0.90). Где прозрачность недопустима, фон - впечатан: `apple-touch-icon.png` (180, iOS рисует прозрачность чёрным и обрезает - иконку своей маской — отдельный файл, а не 192 из «any») и `maskable-512.png` - (Android обрезает по кругу, холст в safe zone 80%). +- **Иконки** (0.90; иконки расширения и «прозрачные углы у всех» — 0.96): растрируются + из лого скриптом `tools/rasterize_icons.sh` — единственный источник, поэтому знак в + шапке, иконка вкладки и иконка приложения не разъезжаются. У скругления холста + логотипа (`rx` 10 = 15% стороны) **углы прозрачны у всех иконок без исключения** + (решение владельца 2026-10-10): фон впечатывался ровно тот же, что заливка холста, и + скругление сливалось с ней — иконка читалась квадратом с острыми углами. Замечено + владельцем в шторке системных уведомлений (3.21), а затем и в панели браузера у + иконок расширения. Знак во весь кадр идут `icon-192`/`icon-512` (они же `icon` + уведомления, 0.90), `apple-touch-icon.png` (180 — отдельный файл с тем же знаком, а + не 192 из «any»: iOS рисует прозрачность чёрным) и иконки расширения 16/32/48/128 + (панель браузера, страница расширений и магазин PNG не маскируют). У + `maskable-512.png` скруглён во всю иконку кадр, а знак стоит в safe zone 80%: при + обрезке по кругу Android срезает кадр, но не знак. Свои маски iOS и Android + накладывают поверх и углы срезают сами — а там, где иконка показывается без маски + (лаунчер, магазин, панель браузера), скруглённая читается лучше квадрата. - **Service Worker** (vite-plugin-pwa, `autoUpdate`; с 0.88 — свой воркер `src/sw.ts`, стратегия `injectManifest`): precache оболочки — собранные ассеты, шрифты/иконки кита (~6 МБ лимит), `/api/*`, `/auth/*`, `/mcp/*` никогда не кэшируются и не получают @@ -1231,9 +1236,9 @@ `logo.svg` (шапка, экран входа, попап расширения) и favicon `icon.svg` — один и тот же файл (тоже как у creds). PWA: icon-192/512 (any) и maskable-512 — холст 80% кадра (safe zone адаптивных иконок Android). PNG расширения 16/32/48/128 и - все PWA-иконки растеризуются из `logo.svg` скриптом `tools/rasterize_icons.sh`: - фон `--gn-surface-page` впечатан, потому что прозрачность iOS рисует чёрным - (углы холста скруглены, за ними — ничего). До 0.54 знак был в рамке-чипе, + все PWA-иконки растеризуются из `logo.svg` скриптом `tools/rasterize_icons.sh` — + что там с фоном и углами у каждой, см. «Иконки» в этом разделе. До 0.54 знак был + в рамке-чипе, в 0.54 рамку сняли с подрезкой `viewBox` по глифу — знак занимал всю отведённую коробку, но в шапке и на экране входа выглядел «голым»; с 0.56 знак подан на холсте. Попап расширения показывает лого из своего `public/` (у упакованного @@ -1772,7 +1777,7 @@ | M5 — MCP | MCP-сервер, инструменты для агентов | | M5+ — мандат агента | Доступность задачи для ИИ-агента, взятие в работу (аренда), приёмка работы, журнал `task_events` (0.85, 3.20) | | M6 — мобильность | PWA (Android-приложение — позже, вне стартового скоупа) | -| M6+ — уведомления | Системные уведомления (Web Push): подписки устройств, ключи VAPID, блок настроек, работа агента в закрытом приложении (0.88, 3.21). Напоминания: дедлайны, ритм регулярных задач, утренняя сводка, тихие часы (0.89, 3.21). Регулярные задачи: дата следующего экземпляра у клона, метка в карточке, фильтр «Регулярные» (0.91, 3.5). Импорт задачи из ссылки на багрепорт BugTrail — в форме задачи и в попапе расширения (0.92, 3.22). Автодетализация переведена на теги, приоритет и оценку времени — заголовок и описание ИИ не предлагает (0.93, 3.2). Журнал и шапка списка приспособлены к телефону, «Кто создал» стал переключателем (0.94, 3.20, 3.6). В стек идут только задачи без проекта, карточка стека собрана из обычной карточки задачи (карточки ряда одной высоты), выдача раскладывается тремя карточками в ряд (0.95, 3.1, 3.7, 3.9) | +| M6+ — уведомления | Системные уведомления (Web Push): подписки устройств, ключи VAPID, блок настроек, работа агента в закрытом приложении (0.88, 3.21). Напоминания: дедлайны, ритм регулярных задач, утренняя сводка, тихие часы (0.89, 3.21). Регулярные задачи: дата следующего экземпляра у клона, метка в карточке, фильтр «Регулярные» (0.91, 3.5). Импорт задачи из ссылки на багрепорт BugTrail — в форме задачи и в попапе расширения (0.92, 3.22). Автодетализация переведена на теги, приоритет и оценку времени — заголовок и описание ИИ не предлагает (0.93, 3.2). Журнал и шапка списка приспособлены к телефону, «Кто создал» стал переключателем (0.94, 3.20, 3.6). В стек идут только задачи без проекта, карточка стека собрана из обычной карточки задачи (карточки ряда одной высоты), выдача раскладывается тремя карточками в ряд (0.95, 3.1, 3.7, 3.9). Иконки: углы прозрачны у всех без исключения — скругление знака видно и в расширении, и на «Домой» в iOS (0.96, 3.19) | | M7 — упаковка | Docker (docker-compose: API, PostgreSQL, фронт, Ollama + модель) | Порядок M4/M5 может меняться — MCP можно поднять раньше ради ИИ-сценария. diff --git a/extension/public/icons/icon-128.png b/extension/public/icons/icon-128.png index db80bb2..7720831 100644 --- a/extension/public/icons/icon-128.png +++ b/extension/public/icons/icon-128.png Binary files differ diff --git a/extension/public/icons/icon-16.png b/extension/public/icons/icon-16.png index 45a4cd5..4a477fe 100644 --- a/extension/public/icons/icon-16.png +++ b/extension/public/icons/icon-16.png Binary files differ diff --git a/extension/public/icons/icon-32.png b/extension/public/icons/icon-32.png index f9743bc..3bd4413 100644 --- a/extension/public/icons/icon-32.png +++ b/extension/public/icons/icon-32.png Binary files differ diff --git a/extension/public/icons/icon-48.png b/extension/public/icons/icon-48.png index 81d21c9..7a43ae3 100644 --- a/extension/public/icons/icon-48.png +++ b/extension/public/icons/icon-48.png Binary files differ diff --git a/frontend/index.html b/frontend/index.html index 11e6fee..01e9468 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -10,9 +10,9 @@ - + GNexus Tasks diff --git a/frontend/public/icons/apple-touch-icon.png b/frontend/public/icons/apple-touch-icon.png index cc6af26..d3f520a 100644 --- a/frontend/public/icons/apple-touch-icon.png +++ b/frontend/public/icons/apple-touch-icon.png Binary files differ diff --git a/frontend/public/icons/maskable-512.png b/frontend/public/icons/maskable-512.png index 288165a..03c5577 100644 --- a/frontend/public/icons/maskable-512.png +++ b/frontend/public/icons/maskable-512.png Binary files differ diff --git a/tools/rasterize_icons.sh b/tools/rasterize_icons.sh index 9d50907..e0162f3 100755 --- a/tools/rasterize_icons.sh +++ b/tools/rasterize_icons.sh @@ -14,40 +14,44 @@ # # Нужен ImageMagick с rsvg (проверка: magick -list format | grep SVG → RSVG). # -# Углы. Скругление логотипа (rx 10 = 15% стороны) у иконок "any" остаётся -# прозрачным: впечатанный фон сравнялся бы с заливкой холста, скругление стало бы -# невидимым, и иконка читалась бы квадратом с острыми углами — и в шторке -# уведомлений, и у установленного приложения. Там, где прозрачность нельзя, фон -# впечатываем: iOS рисует её чёрным (apple-touch-icon), а maskable на Android -# обрезается по кругу — ему нужен непрозрачный кадр, холст в safe zone (80%). +# Углы. Скругление логотипа (rx 10 = 15% стороны) видно, только пока за холстом +# прозрачность: с впечатанным фоном оно сливается с заливкой холста, и иконка +# читается квадратом с острыми углами. Поэтому углы прозрачны у всех иконок без +# исключения (решение владельца 2026-10-10): у PWA «any», apple-touch-icon и иконок +# расширения знак идёт во весь кадр, у maskable — в safe zone 80% (иначе Android +# срежет знак при обрезке по кругу), а кадр и там скруглён во всю иконку. iOS +# прозрачность рисует чёрным, но свою маску он накладывает поверх и углы срезает — +# а показывать иконку без маски (лаунчер, магазин) лучше скруглённой, чем квадратом. # После правки логотипа: ./tools/rasterize_icons.sh set -euo pipefail cd "$(dirname "$0")/.." LOGO=frontend/public/logo.svg -PAGE='#16161E' # фон страницы кита — тот же, что у холста логотипа -SAFE=80 # maskable: холст = 80% кадра (safe zone адаптивных иконок Android) +PAGE='#16161E' # заливка холста логотипа — ею же залит кадр иконок с полями +SAFE=80 # maskable: знак = 80% кадра (safe zone адаптивных иконок Android) APPLE=180 # apple-touch-icon: рекомендованный iOS размер -raster_rounded() { # raster_rounded <размер> <файл> — скругление источника, углы прозрачны +raster_rounded() { # <размер> <файл> — знак во весь кадр, углы прозрачны local size=$1 out=$2 magick -background none -density $((96 * size / 64)) "$LOGO" \ -resize "${size}x${size}" -depth 8 -strip "$out" } -raster_opaque() { # raster_opaque <итоговый размер> <файл> [размер холста внутри кадра] - local size=$1 out=$2 canvas=${3:-$1} - magick -background "$PAGE" -density $((96 * canvas / 64)) "$LOGO" \ - -resize "${canvas}x${canvas}" -gravity center -extent "${size}x${size}" \ - -background "$PAGE" -alpha remove -alpha off -depth 8 -strip \ - -define png:color-type=2 "$out" # truecolor без альфы — одинаково у всех размеров +raster_maskable() { # <размер> <файл> — кадр во всю иконку, знак в safe zone (80%) + local size=$1 out=$2 + local inner=$((size * SAFE / 100)) + local r=$((size * 10 / 64)) # то же скругление, что у холста логотипа + magick -size "${size}x${size}" xc:none -fill "$PAGE" \ + -draw "roundrectangle 0,0,$((size - 1)),$((size - 1)),$r,$r" \ + \( -background none -density $((96 * inner / 64)) "$LOGO" -resize "${inner}x${inner}" \) \ + -gravity center -composite -depth 8 -strip "$out" } raster_rounded 192 frontend/public/icons/icon-192.png raster_rounded 512 frontend/public/icons/icon-512.png -raster_opaque "$APPLE" frontend/public/icons/apple-touch-icon.png -raster_opaque 512 frontend/public/icons/maskable-512.png $((512 * SAFE / 100)) -for s in 16 32 48 128; do raster_opaque "$s" "extension/public/icons/icon-$s.png"; done +raster_rounded "$APPLE" frontend/public/icons/apple-touch-icon.png +raster_maskable 512 frontend/public/icons/maskable-512.png +for s in 16 32 48 128; do raster_rounded "$s" "extension/public/icons/icon-$s.png"; done # лого попапа расширения — копия источника (см. шапку скрипта) cp "$LOGO" extension/public/logo.svg