| 2026-10-10 |
Шторка дропдауна из шапки, полосы прокрутки, меню у правого края (0.79)
...
- App.vue: position:relative + z-index у .page-header — только с 768px.
На мобильных они запирали fixed-шторку в контексте наложения шапки, и
затемнение (вне #app, z 1090) ложилось поверх неё, съедая тапы: меню «⋯»
на странице задачи открывалось затемнённым и не нажималось.
- kit-overrides.css: полосы прокрутки снова китовые (10px, дорожка #16161e,
бегунок #414868) — добавлено только скругление бегунка; scrollbar-width /
scrollbar-color больше не задаются, иначе Chromium игнорирует
::-webkit-scrollbar-* и скругление пропадает.
- dropdownClamp.ts: при развороте меню влево выставляем ещё и left: auto —
китовый left:0 продолжал действовать, и у правой колонки карточек меню
выезжало за вьюпорт (right 1593 при ширине 1440).
- ТЗ 0.79.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
16 hours ago
|
Страница задачи не едет по горизонтали, отступ табов статуса (0.78)
...
- TaskView: мобильный трек сетки — minmax(0, 1fr) вместо голого 1fr
(тот не сжимается ниже min-content: 517px в коробке 358px), колонки
получили min-width: 0 — на 390px страница уезжала вбок (scrollWidth 533).
- TaskView: overflow-wrap: break-word у md-view — длинный неразрывный токен
в описании (URL, инлайновый code) заставлял абзац скроллиться по горизонтали.
- ListView: отступ снизу у табов статуса 0.6rem → 1.25rem, табы липли
к первой карточке списка.
- ТЗ 0.78.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
17 hours ago
|

Список задач, карточки и шторка дропдауна на мобильных (0.68–0.77)
...
- Цвета проектов (0.68–0.72): палитра пересобрана с объективным порогом
различимости — 8 базовых тонов × ступени светлоты + 5 нейтральных = 27
клеток, минимальная попарная ΔE76 в CIELAB 12.5 (приглушённые варианты
сливались, чёрный не виден на тёмной панели). Метка проекта — кружок, у
проекта с сайтом — фавикон внутри метки.
- Список задач (0.70–0.74): фильтр по проекту и табы приоритета убраны,
приоритет — переключателем «Приоритетные» с серверной отсечкой
priority_min (7–10; задача без приоритета в отсечку не попадает). Тег
ищется подстрокой имени (параметр tag, icontains с autoescape) с debounce,
ввод — GnCombobox; статус — табы кита с горизонтальной прокруткой. То же
на странице проекта. Фильтры-поля переехали в слот действий шапки.
- Выравнивание фильтров (0.76): кит держит 8px margin-top у input и 15px
margin-bottom у form-group — внутри flex-обёртки они не схлопываются, и
поле стояло на 3.5px выше центра ряда, а крестик сброса (отсчёт от низа
обёртки) уезжал к нижнему краю поля. Отступы внутри фильтра обнулены:
обёртка стала ровно в коробку поля, центры сходятся до пикселя.
- Карточка задачи (0.75–0.76): кликабельна целиком (клик мимо внутренних
ссылок/кнопок и по невыделенному тексту), бейдж проекта — ссылкой.
Свежесть задачи переехала из ряда бейджей в подвал карточки (слот footer,
черта 1px, прижат к низу — в сетке все карточки на одной линии): height
100% содержимого у кита выталкивало подвал, карточка стала flex-колонкой.
Иконка рядом с текстом — с китовым классом normalize.
- Полосы прокрутки (0.76): тонкие, бегунок акцентом, скругление в пилюлю,
прозрачная дорожка — как у полосы меню-дровера кита. Заданы и
scrollbar-width/color, и ::-webkit-scrollbar-*; у дровера приоритетнее
правило кита.
- Шторка дропдауна на мобильных (0.77): до 767px меню — лист снизу во всю
ширину экрана с затемнением и «ручкой», пункты 44px, выезд снизу 0.22s
вместо китового overlay_reveal. Слой затемнения — div вне #app (index.html)
и body:has(.dropdown.is-open): для китового обработчика клик по нему «вне
меню», поэтому тап по затемнению закрывает меню без JS, а JS-кламп
координат на мобильных выключен. Китовый panel_boot оставляет у шапки
transform (содержащий блок для position:fixed) — на мобильных анимация
шапки снята, правило «меню в шапке прижато вправо» тоже оставлено
десктопу. Задача на перенос в кит оформлена отдельно:
gnexus-ui-kit/docs/tasks/gn-dropdown-mobile-sheet.md.
- Кнопка «назад» над шапкой страницы (0.70): показывается, когда в истории
приложения есть предыдущий экран; возврат на экран входа не предлагается.
ТЗ 0.68–0.77; тесты бэкенда 209, ruff/mypy чисто, сборка фронта зелёная.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
17 hours ago
|
| 2026-10-09 |

Проекты: цвет, сайт, фавикон, закрепление, README из репозитория (0.63–0.67)
...
- Цвет-метка проекта (0.63): у проекта может быть цвет-кружок. Селектор
цвета — сырым блоком в стиле кита (в ките компонента нет); кружок рисует
общий компонент ProjectColorDot.
- Сайт проекта (0.63): отдельное поле site_url. Иконку сайта тянет
бэкенд-прокси с кэшем (GET /api/projects/{id}/favicon, том favicons) —
сторонние favicon-сервисы не используются, данные не покидают VPS. В 0.65
иконка встала в метку проекта (кружок + фавикон), а ссылка на сайт —
чипом в шапке страницы проекта.
- Карточка списка кликабельна целиком (0.63; кнопка «Открыть» дублировала
ссылку), тайтл крупнее (0.65), клетки прогресса — поверх полосы кита
(0.64): сегментированной полосы в ките нет.
- Закрепление проектов (0.66): поле pinned, закреплённые — секцией сверху,
сортировка списка по свежести активности, подвал карточки — отсчёт до
ближайшего дедлайна.
- Место булавки переставлено (0.67): на карточке — правый верхний угол
рядом с бейджем актуальности и видна всегда (была приглушена в подвале),
на странице проекта — кнопка-булавка рядом с именем (искали строкой
«Закреплён» в параметрах).
- Репозиторий проекта (0.67): ссылка на git-репозиторий — отдельное поле
repository_url, отдельно от заметки и сайта. README из репозитория
показывается вторым описанием — карточкой «README из репозитория» под
заметкой, со ссылкой на репозиторий и сворачиванием длинного текста;
тянет такой же бэкенд-прокси с кэшем (GET /api/projects/{id}/readme),
не нашли — «README не найден». Распознавание ссылки на репозиторий в
заметке проекта снято (у задачи README-вместо-описания остаётся),
данные в БД не мигрировались.
- Фантомный отступ перед именем у проекта без цвета и фавикона (0.67):
ProjectMark рисовал пустой спан в ряду с gap.
- ТЗ 0.63–0.67; MCP зеркалит поля проекта (color, site_url,
repository_url, pinned). Тесты: 207.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
1 day ago
|
Карточка проекта — метрики вместо заметки (0.62)
...
Заметка убрана с карточки списка (целиком живёт на странице проекта): она
делала карточки разной высоты и мешала сравнивать. Вместо неё — актуальность
в шапке справа, ряд метрик (приоритет, «N в работе», «просрочено N» — только
ненулевые), полоса прогресса «Закрыто N из M» и подвал с ближайшим дедлайном
(просроченный красным) и кнопкой «Открыть»; у проекта без задач — подсказка.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
1 day ago
|
Проекты карточками по две в ряд (0.61)
...
Карточка проекта несёт бейджи и заметку — в две колонки список читается
компактнее; на узких экранах одна колонка (860px). Заголовок секции
занимает всю ширину строки, скелетон повторяет ту же сетку.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
1 day ago
|
Проекты без задач — отдельной секцией в конце списка (0.60)
...
Бейдж «Задач закрыто 0/0» у пустого проекта ничем не отличался от
заполненных, и такой проект терялся среди остальных. Список делится на
секции «С задачами» и «Без задач» (ph-folder-dotted, приём подписи
секции из стека); счётчики в заголовках — по всему списку, а не по
странице.
Заголовки показываются только когда пустые проекты есть — без них
список выглядит как раньше. Порядок (с задачами сверху, пустые в конце)
применяется до пагинации, иначе секция разъезжается по страницам.
- ТЗ 0.60.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
1 day ago
|
Карточки стека по три в ряд; заголовок без двойного отступа (0.59)
...
- Стек входящих — сетка по три карточки (0.59): две на узких экранах,
одна на телефоне; карточки выравниваются по верху, скелетон повторяет
ту же сетку, чтобы загрузка не дёргала раскладку.
- Заголовок-ссылка карточки носит собственный card-link: класс card-title
принадлежит шапке карточки кита (header.card-title, padding 15px), и на
вложенной ссылке он давал вторые 15px — заголовок уезжал вправо от
остального содержимого карточки.
- tools/rasterize_icons.sh теперь обновляет и копию лого в public/
расширения (попап показывает лого из своего корня) — одна команда на
правку логотипа, копию больше нельзя забыть. Иконки расширения, dist и
ZIP пересобраны: всё с текущим знаком.
- ТЗ 0.59.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
1 day ago
|

Сад отключён (0.58): страница «Достижения» вместо сада
...
Сад не готов к использованию, а сервис разрастается — убрали его из
интерфейса и сосредоточились на основном функционале. Код сада,
модель GardenItem, coin_events и rarity у xp_events сохранены: сад
вернётся для доработки.
- Выдача растений прекращается сама: GardenItem создавался лениво в
ensure_garden(), которую звал только GET /api/garden, — UI его
больше не запрашивает.
- Прогресс и ачивки переехали на новую страницу /achievements (пункт
меню на месте «Сада»); /garden редиректит туда же.
- Блок ачивок вынесен в общий components/AchievementsPanel.vue —
им пользуются и «Достижения», и сад (для возврата).
- Баланс монет отдаёт GET /api/xp (coins) — единственная правка
бэкенда; паритет с /api/garden покрыт тестом.
- Тост закрытия — «+N XP • +N монет» с похвалой, без слов про
растение; золотое конфетти за xp >= 25 и «не хочется делать».
- Тексты прогресса — в общем неймспейсе progress.*, сад-специфичные
остались под garden.*.
- ТЗ 0.58: пункт «Сад отключён» с причиной, детальное описание сада
оставлено историческим блоком.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
1 day ago
|
Лого и иконки — знак на 10% меньше в холсте (0.57)
...
scale(.9) вокруг центра знака (32, 32.5): строки занимают ~56% холста
(36×35, поля ~14) вместо 62.5% — у холста появился воздух, как у creds.
PNG перегенерированы tools/rasterize_icons.sh, ZIP перепакован, фронт
пересобран.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
1 day ago
|
Лого и иконки — холст со скруглёнными краями (0.56)
...
Приём gnexus-creds: знак не «голым», а на холсте 64×64 со скруглёнными
краями (rx 10, заливка страницы). logo.svg и favicon icon.svg — один файл,
как у creds; PNG (PWA 192/512/maskable, расширение 16/32/48/128) теперь
растеризуются скриптом tools/rasterize_icons.sh из logo.svg, фон впечатан
(прозрачность iOS рисует чёрным). maskable — холст 80% кадра.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
1 day ago
|
Экран входа — карточка кита (0.55)
...
Как на экране входа gnexus-creds: GnCard 460px по центру вместо голой
колонки, содержимое — своя колонка-обёртка (внутренности .card-content
кита не трогаем). Пока /auth/me не ответил, в карточке лого и лоадер —
кнопка не вспыхивает перед редиректом уже залогиненного.
Кнопка на узком экране (<=420px) уменьшена: «ВОЙТИ ЧЕРЕЗ GNEXUS»
переносилась на две строки.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
1 day ago
|
Лого и иконки — знак «стек входящих» (0.54)
...
Бренд-чип кита заменён на знак «три строки задач»: синий маркер — в работе,
зелёный — закрытая, прочие строки приглушены. Без рамки и буквы, поэтому
работает и в шапке (навигационная оболочка, экран входа, попап расширения),
и как favicon/PWA-иконка.
- frontend/public/logo.svg, icons/icon.svg + PNG 192/512/maskable
- extension/public/logo.svg + icons 16/32/48/128, ZIP перепакован
- viewBox подрезан по глифу (11 11.5 42 42): в сетке 64 глиф занимает
12..52 × 13..52, иначе знак выглядел на треть мельче прежнего чипа
- .gitignore: *.local.html (страницы-превью вариантов)
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
1 day ago
|
| 2026-09-30 |
Паста изображений в описании при создании задачи/заметки
...
Вложения привязаны к документу, а он создаётся лениво при сохранении —
в форме создания задачи паста молча ничего не делала. Теперь файлы
держатся локально, в поле blob-плейсхолдер с живым превью, после
создания они грузятся к документу и ссылки заменяются настоящими
(PATCH описания). MdEditor получает imageHref для URL заглушки.
В заметке проекта без документа он материализуется текущей заметкой.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
10 days ago
|
Лого и иконки — бренд-чип кита 1.0.0 (0.52)
...
logo.svg/icon.svg и все PNG (PWA 192/512, maskable, иконки расширения)
перерисованы в язык кита: панель, 2px бордер, 6px левая кромка accent,
скругление — глиф «промпт + чек» прежний. Бренд-марка попапа — само лого
вместо phosphor-иконки в CSS-рамке.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
10 days ago
|
Попап: черновик форм переживает закрытие (0.51)
...
Транзиентное окно (клик мимо, Win+Space) убивает несохранённый ввод —
текст, проект, вкладка и настройка адреса/токена пишутся в
chrome.storage.local и восстанавливаются при следующем открытии.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
10 days ago
|
ТЗ 0.50: визуальный стиль и кастомные компоненты (§3.19) — кит 1.0.0, единый язык рамок
...
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
10 days ago
|
| 2026-09-23 |
Ачивки: описание условия по клику (GnPopover)
...
Карточка-ачивка в саду — триггер GnPopover кита: клик открывает панель
с кратким описанием условия (garden.achHint, ru/en/uk). Тултип по hover
не годится — не работает на тач-экранах; карточка стала button-триггером
и тянется на всю колонку грида. ТЗ 0.49 (§3.13).
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
18 days ago
|
Ребаланс сада: монеты ×2 за закрытие, микронаграды и бонус уровня ×2
...
- Монеты за закрытие: xp целиком вместо floor(xp/2)
- Микронаграды: создание задачи 1 → 2, проекта 2 → 4
- Бонус за уровень: 25·L → 50·L; ежедневная не менялась (50)
- Заголовки X-Created-* теперь из констант (были захардкожены и
разошлись бы с новыми значениями)
Цены (семена, апгрейды, декор, расширения) не тронуты. ТЗ 0.48 (§3.13).
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
18 days ago
|
| 2026-09-22 |
iOS Safari: типовые проблемы iPhone-версии
...
- 16px на полях/селектах/поле тегов на touch (media hover:none, pointer:coarse) —
иначе iOS зумит страницу при фокусе и зум застревает
- 100dvh у drawer'ов/меню/модалок (100vh в iOS выше видимой области — низ
уезжал под панель браузера), фолбэк 100vh остаётся
- safe-area (viewport-fit=cover): тосты, drawer-body, топбар и refresh-лоадер
отступают от индикатора «домой» и статус-бара
- apple-mobile-web-app-* меты: standalone до iOS 16.4, black-translucent
статус-бар, тайтл
- тап-подсветка WebKit отключена; кнопка fullscreen сада скрыта там, где
requestFullscreen нет (iPhone Safari умеет только video)
ТЗ 0.47 (§3.15).
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
18 days ago
|
Детализация: выброшенные из заголовка детали не теряются
...
Промпт (ru/en) требует переносить убранное из заголовка (условия, числа,
уточнения) в описание, few-shot пример теперь учит переносу (description
не null). Страховка от нарушения правила маленькими моделями: если заголовок
сокращён, описания нет, а содержательные слова/числа исходника пропали —
исходный заголовок целиком кладётся в описание (при заполненном пользователем
описании не срабатывает). ТЗ 0.46 (§3.2).
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
18 days ago
|
MCP: управление проектами — создание, обновление, архив/восстановление
...
Тулы create_project (микронаграда + фоновая суммаризация заметки),
update_project (имя/заметка/relevance_status/приоритет) и
archive_project/restore_project — архив вместо безвозвратного удаления:
задачи и история переживают архив, вызовы идемпотентны, delete-тула
в MCP нет намеренно. ТЗ 0.45 (§3.10).
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
18 days ago
|
Попап расширения на компонентах кита + список только «В работе»
...
GnInput/GnTextarea/GnSelect вместо сырых полей (тёмные стили кита живут
в .form-group), GnTabs вместо самодельных вкладок, GnBadge у проекта
и тегов, лоадер по центру; тосты кита перекрывали сплошной фон тинтом
rgba(…,.18) — в попапе фон приведён к #1f2335. Вкладка «В работе» —
только in_progress (ТЗ 0.44).
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
18 days ago
|
ТЗ 0.43: страница-инструкция расширения (§3.18)
...
Меню только в веб-версии (скрыто в PWA), ZIP раздаётся статикой фронта.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
18 days ago
|
ТЗ 0.42: браузерное расширение быстрого захвата (§3.18)
...
Две вкладки («Добавить»/«Активные» — просмотр), аутентификация Bearer
MCP-токеном, настраиваемый базовый URL; кросс-ссылка в §3.10.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
18 days ago
|
Подсказка: описание можно заполнить ссылкой на публичный репозиторий
...
В подписи редактора при создании задачи и на странице задачи
(пустое описание, инлайн-правка) — «вставьте ссылку на публичный
репозиторий — вместо описания подтянется README». Локали ×3, ТЗ 0.41.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
18 days ago
|
Линки маркдауна — в новой вкладке (PWA не ловит навигацию)
...
renderMarkdown добавляет <a target="_blank" rel="noopener">: описание
задачи, заметка проекта, README и превью MdEditor — все ссылки
открываются во внешность, standalone-PWA окно не уводят.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
18 days ago
|
Длинная заметка проекта сворачивается: начало + «Развернуть»
...
Высота блока заметки (или README от ссылки) мерится по факту рендера
(ResizeObserver — картинки догружаются и растут): выше ~420px —
сворачивается, под ней подсказка «Заметка большая — показано начало»
и кнопка «Развернуть»/«Свернуть». Локали ×3, ТЗ 3.8/0.41.
Проверено headless: длинный README свёрнут (420px, подсказка на
месте), «Развернуть» раскрывает до полных ~4700px.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
18 days ago
|
README вместо заметки-ссылки на проекте — как в описании задачи
...
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
18 days ago
|
README.md вместо описания-ссылки на репозиторий
...
Если описание задачи — одна ссылка на git-репозиторий, на странице
задачи вместо неё показывается README.md оттуда (с подписью-ссылкой
на источник; сырое описание в БД не меняется, чекбоксы README не
патчат описание).
Хост не обязан быть GitHub/GitLab (ТЗ 3.3, 0.41): селф-хостед системы
ищутся эвристикой — API github/gitlab/gitea + raw-пути web-интерфейсов
с дефолтной веткой HEAD (проверено на селф-хостед GitBucket);
не нашли — 404, остаётся ссылка. Кэш прочтений в памяти, 10 минут.
- backend: services/readme.py (эвристика + перебор, кэш),
GET /api/repo-readme?url=, тесты (кандидаты, кэш) — 159 тестов
- frontend: api.getRepoReadme, TaskView показывает README вместо
описания при одиночной ссылке; локали task.readmeFrom ×3
Проверено headless на живом фронте: git.gnexus.space (GitBucket) и
github.com — README рендерится, при неудаче остаётся ссылка.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
18 days ago
|