# web-ui Specification ## Purpose Презентационный слой веб-интерфейса: встроенная (`go:embed`) отдача статики и self-hosted шрифтов, единая дизайн-система (`jellybit.css`, тёмная тема по настройке ОС), рендеринг страниц (список загрузок, ревью, просмотр) с бейджами состояний и клиентскими взаимодействиями без сборки (копирование идентификатора загрузки, спойлер контекста). Превью раскладки берётся из единой логики `internal/layout`, а не дублируется в шаблонах. Тонкий транспорт над ядром (приём — `ingest`, команды — `worker`, чтение — `store`). ## Requirements ### Requirement: Встроенная отдача статики Сервис SHALL отдавать статические ассеты (CSS, клиентский JS, вендорные библиотеки, шрифты) из встроенной (`go:embed`) файловой системы под префиксом `/static/`, без внешних зависимостей времени выполнения. Бинарь остаётся единым и самодостаточным. #### Scenario: Запрос встроенного ассета - **WHEN** клиент запрашивает `GET /static/css/jellybit.css` - **THEN** сервис отвечает `200` с телом из встроенной FS и корректным `Content-Type` #### Scenario: Кэширование статики - **WHEN** сервис отдаёт ответ на запрос под `/static/` - **THEN** ответ содержит заголовок `Cache-Control`, разрешающий кэширование ассета браузером #### Scenario: Несуществующий ассет - **WHEN** клиент запрашивает несуществующий путь под `/static/` - **THEN** сервис отвечает `404` и не раскрывает структуру файловой системы ### Requirement: Шрифты без внешних сетей Веб-UI SHALL подключать шрифты (IBM Plex Sans, IBM Plex Mono) только из локально встроенных файлов через `@font-face`. Страницы MUST NOT обращаться к сторонним хостам (Google Fonts CDN и т. п.) для загрузки шрифтов или стилей. #### Scenario: Нет внешних ссылок на шрифты - **WHEN** браузер открывает любую страницу веб-UI - **THEN** все используемые шрифты загружаются из-под `/static/` того же origin, без обращений к внешним доменам ### Requirement: Единая дизайн-система Все страницы веб-UI SHALL использовать единственный CSS-файл `jellybit.css` с дизайн-токенами; страницы MUST NOT содержать инлайн-`