34 KiB
⚠ ЭТО НЕ ЗАДАНИЕ, а носитель норм зоны — референсы с измеренными значениями, продуктовый сценарий экранов, жёсткие ограничения владельца и порядок работы. На него так ссылается
frontend/README.md. Статус этапов и что уже построено — ТОЛЬКОfrontend-PROGRESS.md, здесь этого нет намеренно (копия отставала); очередь этапов S2–S7 —BACKLOG.mdФ-1. Поставлено оркестратором №15 08.08 по слепому онбординг-замеру: холодная сессия открывала файл первым по указателям и читала запрет «дальше не идти», адресованный давно отработавшей сессии.
Промт: сессия ФРОНТ TextMachine — MVP веб-интерфейса
Обязательное чтение перед работой
frontend/docs/STACK_DECISIONS.md— пины версий и ловушки. Все версии сверены 02.08.2026 многоагентным исследованием с адверсариальной проверкой. Не выбирай библиотеки сам, не «обновляй» пины по памяти: твои знания об экосистеме устарели, а вся документация в сети описывает ПРОШЛЫЕ версии этих инструментов.docs/product-requirements.md— реестр продуктовых требований владельца.docs/glossary.md— расшифровка проектных сокращений.frontend/references/*.png— три скриншота, открой и посмотри (ты умеешь читать изображения).
Кто ты и твоя зона
Ты фронтенд-сессия. Зона записи — только frontend/. backend/, platform/, docs/, eval/ — read-only; расхождения и вопросы — пингом владельцу, не правкой чужой зоны.
⚠ Зона и git (читать ДО первой строки кода)
Ты не коммитишь — лендит оркестратор. Твоё дело: довести дерево до зелёного npm run check,
описать сделанное в frontend/docs/frontend-PROGRESS.md и передать.
- Писать только внутрь
frontend/. Ничего за её пределами — ниdocs/, ниbackend/, ниplatform/, ни корневых файлов, ни.gitignore. Нужна правка вне зоны — пинг владельцу, её сделает оркестратор. - Чужие незакоммиченные файлы в дереве не трогать. Параллельные сессии — норма: то, что лежит рядом изменённым, принадлежит не тебе.
- НИКАКИХ
git add -A,git add .,reset --hard,amend/rebase,checkoutповерх грязного дерева и любой перезаписи истории. - Никогда не готовить к лендингу:
START_PROMT.MD(файл владельца),.claude/settings.local.json.
Общие правила проекта — в CLAUDE.md в корне (там же эта норма в каноническом виде).
Что за продукт
Веб-сервис перевода книг (веб-новеллы, ранобэ) с одного языка на другой через ИИ. Пользователь загружает книгу, запускает перевод, подписывает словарь терминов, читает результат, выгружает готовое.
⚠ API у ПЛАТФОРМЫ, а не у движка; движок фронту не виден вообще (D39.85, research/23).
Ошибка дорогая: моки, снятые не с того уровня контракта, разойдутся с API. Прежде чем писать слой
данных, прочитай FRONTEND_PLAN.md §0.1–0.2 (карта канона и два провода) и первоисточник
docs/research/23-engine-platform-seam.md.
Контракт API v0 РАТИФИЦИРОВАН (D39.99/100/101; канон docs/architecture/14-api-contract/ —
OpenAPI 3.1, типы генерятся из спеки), и слой данных строится ПО КОНТРАКТУ, а не по гипотезам.
Что у платформы уже живо и чего ещё нет — platform/BACKLOG.md и её зонный журнал.
1. Референсы — копировать, а не вдохновляться
В frontend/references/ лежат скриншоты-референсы (кладёт владелец, в git они не едут). Открой их своим инструментом чтения файлов — ты умеешь смотреть изображения. Это обязательный первый шаг, до единой строки кода.
fleet.png— главная основа макета. Копируем оболочку целиком: как устроены панели, отступы, скругления, плотность, палитра.antigravity_main.png— пустое состояние (ничего не выбрано).antigravity_chat.png— рабочее состояние с тремя колонками и правой панелью-документом.
Владелец сформулировал прямо: «взять макет Fleet как он есть по блокам и стилю и полностью скопировать, переделав под наши нужды». Это не тот случай, где нужна своя эстетика. Нужна чужая, воспроизведённая точно.
1.1. Измеренные значения — брать эти, не выводить свои
Ниже — не оценка на глаз, а замер пикселей fleet.png (Python/PIL: гистограмма поверхностей, поиск насыщенных пикселей, срез по горизонтали, детект края скругления). Скриншот снят при масштабе 2x — установлено по кнопкам окна macOS: шаг 40 физических пикселей против штатных 20 CSS. Все размеры ниже уже переведены в CSS-пиксели.
Поверхности Fleet:
| Роль | Значение | Где замерено |
|---|---|---|
| Фон оболочки: промежутки, верхняя полоса, статус-полоса | #090909 |
10.5% площади |
| Заливка панели (все три панели одинаковы) | #17191a |
80.5% площади |
| Приподнятая поверхность / наведение | #27292b |
|
| Выбранная строка дерева, клавиша-чип | #353739 |
⚠ не активная вкладка: пере-замер развёл роли, вкладка документа — #142f4c (FRONTEND_PLAN.md §5.1) |
| Подсветка текущей строки (синеватая) | #152945 |
|
| Выделение | #164e8d |
|
| Основной текст | #dfe1e3 |
|
| Акцент (фокус ввода) | #746deb |
тон 243°, насыщенность 0.76 |
| Красный индикатора | #b82e45 |
тон 350° |
Геометрия Fleet:
- Промежуток между панелями — ровно 8px, одинаковый везде: слева, между всеми панелями, справа (замер среза: четыре промежутка по 16 физических пикселей, без единого исключения).
- Радиус скругления панели — 6px (край выходит на прямую за ~11 физических пикселей).
- Панели не имеют ни рамок, ни теней: отделение только промежутком и разницей заливки
#090909→#17191a.
Antigravity — для пустого состояния и настроек (чистый нейтральный серый, без холодного оттенка, в отличие от Fleet):
| Роль | Значение |
|---|---|
| Фон | #101010 |
| Боковая панель | #161616 |
| Приподнятая карточка (поле ввода) | #1c1c1c |
| Заливка кнопки основного действия | #252525 |
| Разделитель / граница | #323232 |
| Текст | #cecece |
Что НЕ замерено и требует проверки скриншот-циклом: размеры шрифтов, высота строк, внутренние отступы панелей. Их снимай сам сравнением своей витрины с fleet.png.
Что именно снято с fleet.png (следуй этому буквально)
Оболочка. Очень тёмный, почти чёрный фон окна. Панели лежат на нём отдельными скруглёнными «карточками» (радиус ~8–10px) с чуть более светлой заливкой, разделённые узкими промежутками фона ~6–8px. Теней нет вообще — разделение только промежутком и разницей заливки. Это главная визуальная подпись Fleet, и владельцу нравится именно она.
Верхняя полоса. Слева кнопки сворачивания панелей (левая / нижняя / правая), по центру — название текущего контекста, справа — ряд иконок-действий. Тонкие линейные монохромные иконки.
Левая панель. Сверху ряд вкладок внутри самой панели (Files · Search · Git · History · +) — не отдельный сайдбар с иконками, а вкладки в шапке панели. Ниже дерево: корень, узлы с шевронами, иконки типов, у выбранной строки — светлая скруглённая подложка (~6px), а не рамка.
Центр. Полоса вкладок: иконка + имя + крестик; активная вкладка светлее и скруглена. Ниже содержимое с колонкой номеров строк приглушённого цвета, у текущей строки — едва заметная подсветка всей полосы. Мелкие подписи-подсказки над блоками очень тусклым серым. В правом верхнем углу — компактный индикатор проблем.
Нижняя панель центра — отдельная скруглённая карточка со своей вкладкой.
Правая панель. Вкладка с заголовком и +. В пустом состоянии — центрированный блок: иконка, заголовок, описание, ряды «клавиша + подпись». Внизу поле ввода с акцентной рамкой — единственное цветное пятно в панели.
Нижняя статус-полоса лежит на фоне оболочки, вне карточек: слева хлебные крошки, справа компактные метаданные состояния.
Цвет. Практически монохром: серый текст на тёмном. Цвет встречается редко и всегда что-то означает. Акцент — один, холодный.
Типографика. Компактный чистый гротеск ~13px в интерфейсе, моноширинный в содержимом. Плотные строки.
Что снято с antigravity_main.png — пустое состояние
Главная область почти пустая, и по её центру стоит один составной блок — скруглённая карточка ввода с подсказкой внутри и рядом мелких управляющих элементов по нижнему краю. Никаких иллюстраций, никаких «начните работу» с картинками. Просто действие по центру пустоты.
В левой панели: выделенная кнопка основного действия во всю ширину сверху, ниже пункты навигации с иконками, ниже секция-заголовок мелким приглушённым шрифтом с иконками действий справа, ниже дерево. Настройки прибиты к самому низу панели.
Что снято с antigravity_chat.png — рабочее состояние
Три колонки. В правой панели — ряд вкладок сверху (несколько именованных разделов) и содержимое как форматированный документ: заголовки, абзацы, блоки-выноски с цветной левой границей (синяя — заметка, зелёная — подсказка) и мелкие «чипы» с моноширинным текстом внутри абзацев.
Эти выноски — наша модель для подсветки неточностей перевода (см. §4, пункт про ненавязчивость). Цветная полоска слева и тусклая подпись — вместо заливки текста.
2. Раскладка нашего приложения
Оболочка Fleet, наполнение наше: три сворачиваемые панели, вкладки в шапке каждой, верхняя полоса и статус-полоса.
⚠ Схемы раскладки здесь больше нет: оболочка ПОСТРОЕНА, и её описывал устаревающий рисунок.
Действующая раскладка — код src/shell/ (Shell.tsx, Panel.tsx, layout.ts) плюс наполнение
панелей; продуктовые решения по составу вкладок и панелей перевешивают из «Решений владельца
по продукту» в frontend-PROGRESS.md.
⚠ Метки глав — из ДАННЫХ книги; зашитого «Глава N» не существует (D39.100 К-3).
3. Сценарий и экраны
3.1. Пусто — ни одной книги
Центр пустой, по центру — блок добавления книги в духе antigravity_main.png: скруглённая карточка, зона переноса файла с подсказкой, под ней компактный ряд полей (язык оригинала, язык перевода, жанр) и кнопка. Без иллюстраций.
3.2. Загрузка книги
После выбора файла: видимое подтверждение, что файл загружен целиком и успешно — размер, объём, определённый язык. Не молчаливый переход.
3.3. Разбор на главы
Дальше книга разбирается на главы. Показать прогресс разбора; по завершении главы появляются деревом в левой панели. Это отдельный видимый шаг, а не часть перевода.
3.4. Перевод — первый проход
Кнопка запуска перевода. Пока идёт:
- у каждой главы в дереве — свой индикатор выполнения (крутящийся/прогресс), главы обрабатываются не по порядку и это нормально;
- общий прогресс по книге в статус-полосе (+ ETA — решение владельца, D39.100 К-5; поле в спеке есть);
- ⚠ не рассказывать, что происходит внутри. Никаких «сейчас работает редактор», «идёт добыча глоссария», никаких названий моделей. Пользователь видит «идёт перевод» и прогресс. Всё.
3.5. Банк памяти — подпись
По завершении первого прохода становится доступен банк памяти: таблица терминов книги (имена персонажей, места, термины) с предложенным переводом. Пользователь правит и подписывает.
Таблица должна быть быстрой в работе: терминов бывают сотни, идут подряд, клавиатура важнее мыши (перемещение по строкам, утверждение, правка без мыши). Массовые действия. Отдельная кнопка завершения подписи.
3.6. Перевод — финальный проход
После подписи — кнопка запуска финального перевода. Те же индикаторы, что и в 3.4.
3.7. Чтение и сравнение
Открытая глава в центре: две колонки — оригинал и перевод, пролистываются вместе. Абзацы слева и справа по количеству часто НЕ совпадают — это нормально для художественного перевода, выравнивание идёт по крупным блокам, не построчно. Возможность листать главы вперёд-назад.
3.8. Замечания
Места, где перевод может быть неточен, помечаются ненавязчиво: тонкая цветная полоска у левого края блока и тусклая подпись — по образцу выносок из antigravity_chat.png. Никакой заливки текста, никаких ярких маркеров, никаких иконок-восклицаний. Список всех замечаний главы — в правой панели, вкладка Замечания.
Правило: если экран выглядит тревожным — он неправильный. Замечание — это приглашение посмотреть, а не сигнал аварии.
3.9. Метаданные книги
Правая панель, вкладка О книге: название, языки, жанр, число глав, объём, даты, состояние перевода. Спокойный список пар «поле — значение», не карточки со статистикой.
⚠ Денежных полей здесь нет — см. §4.8.
3.10. Добавление главы
В дереве, под главами книги — действие добавления новой главы. Загруженная глава встаёт в дерево и может быть переведена отдельно.
3.11. Экспорт
Кнопка выгрузки текущей книги. Выбор формата, подтверждение готовности.
3.12. Настройки
Отдельный раздел (открывается из низа левой панели). Внутри: профиль и доступ, конфигурация моделей, параметры перевода по умолчанию. Всё техническое живёт здесь и только здесь — в рабочем потоке его нет.
⚠ Подписки, тарифов, остатка и счетов в MVP НЕТ — см. §4.8.
4. Жёсткие ограничения
- Не раскрывать устройство бэкенда. Ни названий моделей, ни стадий конвейера, ни внутренней терминологии в рабочих экранах. Пользователю видны: загрузка, разбор, перевод, банк, готово. Всё техническое — в настройках.
- Цвет означает состояние и больше ничего. Интерфейс монохромный. Цветными бывают: полоска замечания, индикатор состояния главы, акцент фокуса. Никаких зелёных кнопок «сохранить» и красных «удалить».
- Ненавязчивость замечаний — §3.8. Это отдельное требование владельца, не деталь.
- Плотность. Работают подолгу; лучше видеть много, чем красиво и мало. Компактные строки, небольшие отступы, маленькие скругления — как во Fleet.
- Только десктоп, тёмная тема, базовая ширина 1440, работать должно и на 1920. Мобильной версии нет.
- Русский интерфейс, кириллица в реальных пропорциях.
- Никаких готовых UI-китов (MUI, Ant, Chakra) — они не дадут воспроизвести Fleet. Только собственные компоненты на токенах; для поведения выпадающих меню, диалогов и подсказок — headless-примитивы без своих стилей.
Решения владельца от 02.08 — приняты, не переоткрывать
- Денег в интерфейсе MVP нет вообще (⚠ поправка 04.08, D39.100/ПТ-35: запрет СУММ в силе, но добавлены статус
paused, оповещение «лимиты исчерпаны» и страница СТАТУСА использования в настройках — без долларов). Ни сумм, ни потолков, ни оценки стоимости до запуска, ни счётчика во время прогона, ни подписки, ни остатка. Оплаты в MVP не будет, показывать нечего. Учёт расхода остаётся внутри движка как телеметрия владельца. Если видишь денежное поле в каком-либо разделе этого промта — это остаток прошлой редакции, его быть не должно. - Подсветка сомнительных мест — только на уровне блока и главы. Подчёркивания внутри текста не делаем: у проверок движка нет байтовых смещений, только счётчики. Вопрос закрыт, к нему не возвращаться.
- Выравнивание колонок — грубое, по единицам экспорта, ориентир «глава целиком». Механизм в
движке уже есть (
tmctl export --pairs), достраивать ничего не надо. Читалка обязана нормально выглядеть и когда вся глава оказалась одним блоком. - Остановка на подписи банка — параметр запуска, задаётся галочкой в форме перед каждым прогоном, а не глобальной настройкой.
5. Технический стек
Стек зафиксирован в frontend/docs/STACK_DECISIONS.md — бери пины оттуда, не выбирай сам.
Перечня пинов здесь нет намеренно: третий экземпляр списка версий отставал бы первым.
Три вещи, которые чаще всего делают неправильно, — прочитай про них в STACK_DECISIONS:
раздел про гейт «одно место для цвета», раздел про читалку без синхронизации прокруток,
и §7 «Ловушки». Карта src/ с назначением каждой папки и правилом зависимостей —
FRONTEND_PLAN.md §2.
Никакого редактора текста в этом MVP: тексты только читают и сравнивают.
5.1. Поддерживаемость — требование владельца, не пожелание
Владелец сформулировал прямо: «главное, чтоб это было очень легко поддерживаемо». Этот код будут править другие сессии, не ты.
Сами правила — в FRONTEND_PLAN.md §3, и там у каждого стоит его проверка (машинный гейт либо ревью-вопрос с однозначным ответом). Здесь их перечня нет намеренно: правило без проверки — лозунг, а два экземпляра списка расходятся.
Проверка на поддерживаемость, которую применяй к своему коду: добавление нового состояния главы или нового вида замечания должно требовать правки одного файла. Если требует трёх — структура неверная, переделай до того, как двинешься дальше.
6. Данные: моков придерживаться, API не выдумывать
Весь доступ к данным — через src/api/, внутри которого пока моки. Компоненты не знают, что данные поддельные; когда появится сервер, меняется один модуль. Мир фикстур на маршрут — карта в FRONTEND_PLAN.md §2 и шапка src/mock/worlds.ts.
Материал для фикстур бери реальный — китайский текст с русским переводом, имена и термины. Выдуманный «Lorem ipsum» даст неверную плотность: кириллица длиннее латиницы, иероглифы короче всего, и колонки поедут. Пример реального фрагмента лежит в backend/example/chapter1-zh.txt (читать можно, править нельзя).
Состояния фикстур — по словарю КОНТРАКТА, а не по списку в прозе: перечень значений живёт в канонической спеке docs/architecture/14-api-contract/openapi.yaml и приезжает в код генерацией. Прозаический список снят намеренно — он отставал от спеки на редакции.
7. Как работать — это важнее, чем что писать
7.1. Смотри на то, что построил
Заведи цикл со скриншотами первым делом, до экранов. Скрипт npm run shot поднимает приложение, снимает PNG в frontend/.shots/, ты открываешь этот PNG и смотришь на него (ты умеешь читать изображения), сравниваешь с references/fleet.png, правишь.
Без этого цикла ты пишешь вслепую: код валиден, вид случаен. Это единственный способ выполнить требование «скопировать Fleet».
Стенд ставится без sudo (WSL2/Ubuntu, пароль root недоступен): Chromium Playwright плюс четыре системные библиотеки локально в .tooling/. Процедура — FRONTEND_PLAN.md §4, второго её экземпляра здесь нет намеренно: команды уже разошлись бы (там же CJK-шрифт стенда, без которого весь китайский в кадре — квадраты).
Проверка, что цикл живой, если ставишь его заново: отрисуй страницу с панелью #17191a на фоне #090909, радиус 6, отступ 8 — сними, открой, убедись, что видишь именно это. Браузер headless, окна нет, графический сервер не нужен.
7.2. Ревью исполнением — обязательно
Проектная норма: любая сессия, пишущая код, обязана проверять себя исполнением, а не заявлением. Для тебя это значит:
- приложение реально запускается, экран реально открывается — проверено запуском, не предположением;
- скриншот снят и просмотрен, а не «должно выглядеть так»;
- расхождения с референсом названы вслух, даже если исправить не успел;
- если чего-то не сделал — сказано прямо, без «в основном готово».
Отчёт в конце: что построено, что видно на скриншотах, где отошёл от референса и почему, что осталось.
7.3. Чего не делать
- Не изобретать API и не ходить в
backend/за данными — только моки. - Не тащить UI-киты и не «улучшать» референс своим вкусом.
- Не рисовать мобильную версию, светлую тему, иллюстрации пустых состояний.
- Не раскрывать конвейер (§4.1) — это самое лёгкое требование забыть.
- Не хардкодить цвета и размеры мимо
tokens.css.
8. Критерий сравнения с референсом
⚠ Не растровое совпадение. JetBrains Fleet закрыт (скачивание прекращено 22.12.2025), референс снят на macOS при 2x, наша цель — Windows-Chromium с другим хинтингом шрифтов. Пиксель-в-пиксель недостижим и целью не является. Сходиться обязаны: замеренные цвета, промежутки 8px, радиусы 6px, плотность строк и общее впечатление. Кегли и интерлиньяж — подбором на глаз до похожести, потому что померить их больше негде.
Гейт против хардкода цвета и размера обязан быть проверен живым нарушением (вставить #fff
в компонент, убедиться, что проверка падает, убрать) — а не объявлен зелёным. Что именно уже
проверено этим способом и чего гейты НЕ видят — FRONTEND_PLAN.md §5.4.
9. Форма данных — из контракта
⚠ Пересказ того, что движок отдаёт фронту, снят: он отставал от канона. Форму задаёт
ратифицированный контракт docs/architecture/14-api-contract/ (спека + спутник с провенансом
и К-вопросами), а что достраивается в движке — STACK_DECISIONS.md §8. Цена расхождения
замерена на этой же зоне: редакция 0.3.0 сняла с провода пофазный прогресс, который здесь ещё
предписывалось строить (К-10, вердикт «НЕ строить», D39.138).
Что остаётся правилом ФРОНТА, а не контракта, — FRONTEND_PLAN.md §6.