Install ReUI (MCP, skill, @reui registry, Tailwind v4, shadcn base-nova) and move the shared UI onto it: Button, Tag, Check, Input/Textarea, Segmented, Alert, Panel, Dialog, Tooltip, Menu and Select (Popover), Toast (sonner), the Table frame (DataGrid), the Dashboard KPI strip, the shnt Ops palette, Geist and the type scale. Design only: behaviour, texts and roles are unchanged. Tests that asserted the old DOM were updated; the tests now format numbers in English wherever they run. docs/reui-migration-plan.md records the plan and its decisions. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
8.4 KiB
8.4 KiB
План перевода консоли на ReUI PRO
Рамки
- Design only, zero functionality (PRODUCT.md, CONVENTIONS.md): меняется только внешний вид. Те же элементы управления, шаги, порядок валидации и те же английские тексты (литералы Technitium остаются как есть, интерфейс не русифицируется).
- Система оформления: «shnt Ops · ReUI PRO» (shadcn
base-nova, блоки ReUI PRO,FrameвместоCard, токеныdark/light/contrast). Референсы: общий холст Auth Portal + MikrotikManager v2 + EvoFirewall + EvoBGP. - 32 реальных URL, адаптив до 390 px без горизонтального переполнения и темы System / Light / Dark сохраняются. Amber по-прежнему не рисуется.
Этап 1. Дизайн на холсте /design
Один холст «Technitium Console · ReUI PRO». Экраны рисуются по порядку, каждый на реальных данных из src/screens:
- Каркас: AppShell (сайдбар 240/60 px, шапка 48 px, ⌘K, меню профиля с Change Theme / My Profile / Change Password / 2FA / API token), пункты из
SECTIONS. - Login (+ OTP, Forgot password, LoginCover).
- Dashboard: KpiStrip, график (Chart.js), heatmap, Top-таблицы, BlockingMenu, сравнение периодов, custom range.
- Zones: дерево/список зон, записи, панели Add/Edit Record, Add / Clone / Convert / Import / Sign / Unsign Zone, DNSSEC, Zone Options, Permissions, Edit Zone File.
- Cache: дерево кэша и записи.
- Blocking: Overview, Rules, Lists, Domain check, Recent blocked.
- Apps: каталог, установленные, Install / Update / Config.
- DNS Client.
- Settings: 9 вкладок (General, Web Service, Optional Protocols, TSIG, Recursion, Cache, Blocking, Proxy & Forwarders, Logging).
- DHCP: Leases, Scopes, ScopeForm.
- Administration: Sessions, Users, Groups, Permissions, SSO, LDAP, Cluster, UserDetails.
- Logs: View Logs, Query Logs.
- About и состояния: пусто, ошибка, нет доступа, загрузка.
- Вариации: светлая тема, высокий контраст, телефон 390 px, свёрнутое меню.
Результат этапа: холст, проверенный по чек-листу системы (Frame, одна primary-кнопка, DataGrid вместо ручных таблиц, статус = слово + глиф + токен).
Этап 2. Основа во фронтенде
- Подключить Tailwind v4 и shadcn (
base-nova), создатьcomponents.json(уже есть), алиас@/,src/theme/globals.cssна токенах системы. - Мост токенов: сопоставить
src/theme/tokens.css(893 строки) токенам ReUI, не ломая ThemeProvider (System / Light / Dark). - Установить компоненты ReUI:
data-grid,filters,sheet,badge,sonner,tabsи т. д.
Этап 3. Миграция src/ui, затем экранов
Порядок: примитивы → общие части → экраны, по одному экрану на коммит, зелёные тесты на каждом шаге.
Текущее (src/ui) |
ReUI / shadcn |
|---|---|
| Button, Field, Form, Select, Check, Segmented | Button, Field, Select, Checkbox, Switch, ToggleGroup |
| Table, EditableTable, Pagination | вид DataGrid поверх собственной таблицы (см. «Решения по плану») |
| Dialog, Confirm, Details | Dialog / AlertDialog / Sheet |
| Toast, Notifier | собственный Toast с темой ReUI (см. «Решения по плану») |
| Menu, Tooltip, SubTabs | Popover, Tooltip, стиль Tabs (линия под активной) |
| Panel, SectionHeader, Alert, Tag, Empty | Frame, Alert, Badge, Empty state |
Этап 4. Проверка
Все существующие тесты (npm test), lint, lint:language, lint:colours, typecheck, сборка, ручной обход в dev (Docker, :5380) против ref (:5381); 390 px без горизонтального переполнения; три темы.
Риски
- Chart.js: цвета серий из
chart-1…4, поведение прежнее. - Скрипты
lint:colours,lint:dashesпотребуют обновления под новые токены. - Размер бандла: Tailwind и Radix/Base UI добавляются к статической сборке, нужно следить за размером.
Состояние на 2026-10-26
| Компонент | Состояние |
|---|---|
| Button, Tag, Check, Input/Textarea | ReUI Button, Badge, Checkbox/Switch, Input/Textarea |
| Segmented, SubTabs | стиль ReUI Tabs, нативные кнопки |
| Alert, Panel, Dialog, Confirm | ReUI Alert, Frame, Dialog |
| Tooltip | ReUI Tooltip (роль tooltip и aria-describedby сохранены) |
| Menu | ReUI Popover (роли и клавиатура меню остались в Menu.tsx) |
| Select | ReUI Popover (поиск, группы и набор по буквам сохранены) |
| Table | Рамка таблицы теперь ReUI DataGrid (DataGrid, DataGridTableViewport, DataGridTableBase, DataGridTableHead, DataGridTableBody, DataGridTableFoot) с экземпляром TanStack useTable. Строки остаются своими <tr>/<td> внутри тела: колонки как данные не описываются, потому что ячейки несут меню, ссылки, colSpan и классы строк. Режим карточек на телефоне, подписи колонок и сортировка «как в оригинале» сохранены (проверено в браузере на моке: на 1440 px таблица, ниже 560 px карточки, без горизонтальной прокрутки). |
| Toast | свой (фокус возвращается, пауза под курсором, действие с правом); цвета и шрифты из темы ReUI |
| Тема | палитра shnt Ops в tokens.css, Geist, шкала 12/13/14 px, радиусы 8/10/14 px |
Решения по плану
| Пункт | Что сделано |
|---|---|
| Toast | Уведомление рисует ReUI sonner. Часы, пауза под курсором и фокусом, Escape и возврат фокуса остались в ui/Toast.tsx. Живая область role="status" по-прежнему всегда в странице. Цена замены: перед кнопкой Undo появился один лишний Tab-стоп (обёртка sonner), закрывающееся уведомление остаётся в DOM около 200 мс, а тесты Rules ждут его асинхронно (findBy, waitFor). |
| Карточки Dashboard | Одиннадцать карточек собраны в одну панель KPI как на холсте: границы-волоски вместо рамок, плитка с иконкой, подпись без капса. Спарклайны, доля, изменение и переход в Query Logs сохранены. |
| Table | Таблица строится на примитивах ReUI (TableHeader, TableBody, TableFooter и вид DataGrid). Перевод на TanStack DataGrid не сделан: строки и ячейки 23 таблиц несут свои атрибуты (классы строк, colSpan, aria-sort в <th>), а DataGrid отдаёт <tr>/<td> без хуков для них. Режим карточек на телефоне и подписи колонок держатся на тех же атрибутах. |
Сборка, tsc, lint:colours, oxlint проходят. Тесты (npx vitest run --maxWorkers=3): 28 падений из 2076, все они падали и до миграции (локаль Windows и отсутствие коммита).