fix(wireguard): расширить мобильные панели и сохранить видимость кнопок
This commit is contained in:
1 parent
ae0162db53
commit
bf43263e43
16 files changed
+440
-8
No files matched your search
@@ -80,7 +80,7 @@ function WgCreateSheet({
|
||||
|
||||
return (
|
||||
<Sheet open={open} onOpenChange={v => { if (!busy) onOpenChange(v) }}>
|
||||
<SheetContent showCloseButton={!busy} side="right" className="w-full sm:max-w-md flex flex-col gap-0 p-0">
|
||||
<SheetContent showCloseButton={!busy} side="right" className="data-[side=right]:w-full data-[side=right]:sm:max-w-md flex flex-col gap-0 p-0">
|
||||
<SheetHeader className="px-6 pt-6 pb-4 border-b shrink-0">
|
||||
<SheetTitle>Быстрый туннель WireGuard</SheetTitle>
|
||||
<SheetDescription>
|
||||
|
||||
@@ -88,7 +88,7 @@ function WgImportSheet({
|
||||
onOpenChange(v)
|
||||
}}
|
||||
>
|
||||
<SheetContent showCloseButton={!busy} side="right" className="w-full sm:max-w-lg flex flex-col gap-0 p-0">
|
||||
<SheetContent showCloseButton={!busy} side="right" className="data-[side=right]:w-full data-[side=right]:sm:max-w-lg flex flex-col gap-0 p-0">
|
||||
<SheetHeader className="px-6 pt-6 pb-4 border-b shrink-0">
|
||||
<SheetTitle>Импорт конфига WireGuard</SheetTitle>
|
||||
<SheetDescription>
|
||||
|
||||
@@ -59,7 +59,7 @@ function WgPeerSheet({
|
||||
onOpenChange(v)
|
||||
}}
|
||||
>
|
||||
<SheetContent showCloseButton={!busy} side="right" className="w-full sm:max-w-md flex flex-col gap-0 p-0">
|
||||
<SheetContent showCloseButton={!busy} side="right" className="data-[side=right]:w-full data-[side=right]:sm:max-w-md flex flex-col gap-0 p-0">
|
||||
<SheetHeader className="px-6 pt-6 pb-4 border-b shrink-0">
|
||||
<SheetTitle>Добавить пира</SheetTitle>
|
||||
<SheetDescription>
|
||||
|
||||
@@ -477,3 +477,15 @@ Runtime backend/frontend3722fad, локальное меню ещё не раз
|
||||
Итоговый observer exit0, afterBrowser пуст на обеих сторонах; selected WG/peers/IP/routes/IPv4 Firewall baseline совпал. Fallback удаления не понадобился; эфемерный контейнер удалён, остались три основные Compose-службы. DB controls до/после servers2/speedHistory9/retention14/migrations9 совпали, audit revisions намеренно сохранены. Приватный baseline с возможными ключами чужой конфигурации не скачивался и не коммитился. [Smoke](ux-ui/acceptance/deploy-browser-6a46fb1-2026-10-08.json): dashboard/servers/uptime/settings/filters/alerts200,320px fit, JS/API errors0.
|
||||
|
||||
[Мобильная форма создания](ux-ui/screens/wg-ui-create-server2-6a46fb1-320-2026-10-08.png) просмотрена, без ключей. Выявлена отдельная UX-недоработка: WireGuard create/peer/import используют обычный w-full, который не переопределяет data-side width общего Sheet; мобильная панель фактически240px при320px, footer сжат. Следующий12.5.63 — точные responsive width overrides по существующему GRE образцу, проверка полной ширины/кнопок в обеих темах и профильные UI проверки. Export/import, throughput, IPv6, внешние failures/RBAC/multi-instance, Telegram/Portal и остальные интеграционные ограничения остаются открытыми. Пользовательское правило настоящих VPN объектов сохраняется. Локальный коммит без push.
|
||||
|
||||
## 12.5.63 — полная ширина мобильных WireGuard Sheets (2026-10-08)
|
||||
|
||||
В components/wireguard/wg-create-sheet.tsx, wg-peer-sheet.tsx и wg-import-sheet.tsx заменены только width utilities на data-[side=right]:w-full и data-[side=right]:sm:max-w-md/lg. Это существующий GRE образец: одинаковые data-side modifiers корректно переопределяют default ширину установленного Sheet. Создание/пир наsm имеют448px, импорт512px; доsm панели занимают полную ширину экрана. Содержимое форм, API, footer composition и общие primitives не менялись.
|
||||
|
||||
[Светлая тема](ux-ui/acceptance/wg-sheets-layout-light-2026-10-08.json), [тёмная тема](ux-ui/acceptance/wg-sheets-layout-dark-2026-10-08.json): временный локальный Playwright visual harness, три панели ×320/640/1280px × две темы —18 комбинаций passed. Actual bounding width равна320/448/512px; все footer buttons находятся внутри панели, scrollWidth не превышает clientWidth, page overflow отсутствует. Tab идёт по ожидаемым полям, Escape закрывает панель. HTTP API подменён, реальные RouterOS операции в этой проверке не выполнялись.
|
||||
|
||||
Мобильные скриншоты: [создание dark](ux-ui/screens/wg-create-dark-full-width-320-2026-10-08.png), [создание light](ux-ui/screens/wg-create-light-full-width-320-2026-10-08.png), [пир dark](ux-ui/screens/wg-peer-dark-full-width-320-2026-10-08.png), [пир light](ux-ui/screens/wg-peer-light-full-width-320-2026-10-08.png), [импорт light](ux-ui/screens/wg-import-light-full-width-320-2026-10-08.png), [импорт dark](ux-ui/screens/wg-import-dark-full-width-320-2026-10-08.png). Create dark/peer dark/import light визуально просмотрены: текст действий читается полностью, IP/endpoint имеют достаточную ширину; ключи в снимках не заполнялись.
|
||||
|
||||
Profile wireguard-links.spec.ts --grep импорт/создание сохраняет форму —5/5 passed: interface,interface DTO,peer, импорт без подтверждённого результата и pending/retry. Сохранение ввода, API ошибки/неподтверждённые ответы и ожидание результата сохранились. Scoped TypeScript выполнен после остановки Next, ESLint трёх изменённых компонентов и ReUI checklist passed. Полная регрессия не повторялась для трёх responsive class overrides.
|
||||
|
||||
Изменение локальное: удалённый runtime backend3722fad/frontend6a46fb1 healthy остаётся прежним. Следующий12.5.64 — frontend production Docker deploy и live мобильные create/peer/import панели на новой собственной WG паре; real UI lifecycle/связность и очистка, baseline. Просмотр импортной формы не будет заявляться как проверенный настоящий import. Import/export, throughput/IPv6/внешние failures/RBAC/multi-instance/Telegram/Portal и другие внешние ограничения открыты. Правило пользователя создавать настоящие VPN объекты сохраняется. Локальный коммит без push.
|
||||
+2
-2
@@ -1,12 +1,12 @@
|
||||
# План реализации UX/UI по пятичасовым окнам
|
||||
|
||||
Актуальное продолжение 2026-10-08: 12.5.62 развернул frontend6a46fb1 (backend3722fad healthy) и завершил WireGuard UI lifecycle на обоих CHR: create interface/peer201, disable/enable PATCH200, Ping3/3 до/после переключения, DELETE200 без остатков. Меню открывались однократно, JS/API errors0. Observer сохранил private baseline0600, итоговый exit0/selected baseline и DB controls совпали; readRetries0. Следующий12.5.63 — мобильные Sheets WireGuard: полная ширина и читаемый footer (создание/пир/импорт); текущая панель240px при viewport320px. Этап12.5 открыт.
|
||||
Актуальное продолжение 2026-10-08: 12.5.63 локально исправил ширину WireGuard create/peer/import Sheets:320px целиком, отsm create/peer448px и import512px. Три панели × две темы ×320/640/1280px —18 комбинаций/Tab/Escape/footer passed; profile5/5, scoped TypeScript/ESLint/ReUI checklist passed. Runtime backend3722fad/frontend6a46fb1, новая ширина ещё не развёрнута. Следующий12.5.64 — frontend Docker deploy и проверка live мобильных форм на новой собственной WG паре с очисткой; реальный import/export пока открыт. Этап12.5 открыт.
|
||||
|
||||
Общий план проекта MikrotikManager. Основан на согласованном плане из задачи; точка продолжения обновлена 2026-10-08. Источник фактического прогресса, проверок и ограничений — [журнал реализации](ux-ui-progress.md). Этот документ задаёт объём и критерии завершения, журнал фиксирует результат.
|
||||
|
||||
## Актуальная точка продолжения — 2026-10-08
|
||||
|
||||
Этапы0–11 завершены в описанных локальных границах. Этап12 открыт. На тестовом сервере161.104.46.222 работают backend3722fad/frontend6a46fb1 и два CHR. Внешние проверки подтвердили PG backup/restore/rollback, остановку фоновой работы для одного экземпляра, API JWT/RBAC и браузерные состояния восстановления. Native TCP/UDP speed, история и UI проверены в границах журнала; доступ ко второму CHR восстановлен пользователем. Очередь Telegram проверена на реальном PG: dedupe, конкурентный claim, retry/version, ошибки сохранения и неопределённый исход; ответы отправителя подменялись, реальной доставки это не доказывает. Блоки12.5.43–45 подтвердили browser retry/checkpoint и развернули понятное пояснение HTTP500. 12.5.46 подтвердил browser JWT/RBAC очереди на реальном HTTP/PG; 12.5.47 подтвердил изоляцию checkpoint при смене двух реальных HTTP/PG источников в конфигурации local; 12.5.48 подтвердил scoped axe/клавиатуру в обеих темах и320px; 12.5.49 собрал Q-матрицу и подтвердил отсутствие настройки Telegram; 12.5.50 подтвердил GET-only инвентаризацию: VPN/BGP/OSPF пусты, роли home-router/home-router; По уточнению пользователя12.5.51 создал реальные GRE туннели и подтвердил lifecycle/связность; обнаружена потеря peer IP, 12.5.52 локально исправил сохранение peer metadata, профильные проверки passed; 12.5.53 развернул исправление и подтвердил его на реальной GRE паре/API/UI; 12.5.54 локально исправил устойчивость меню GRE, профильные проверки passed; 12.5.55 развернул frontend731803b и подтвердил устойчивость меню на реальной GRE паре; 12.5.56 локально адаптировал внутренние IP поля GRE для320px, обе темы и профильные проверки passed; 12.5.57 развернул frontendfd521f6 и подтвердил мобильную GRE форму на реальной паре CHR; 12.5.58 подтвердил настоящую WireGuard пару, handshake/Ping/native/UI и финальную очистку; 12.5.59 подтвердил оставшиеся peers/IP после удаления WG и локально исправил backend; 12.5.60 развернул backend/frontend3722fad и подтвердил полное обычное удаление WG; 12.5.61 подтвердил UI создание WG и локально исправил remount меню; переключение осталось открытым. 12.5.62 развернул frontend6a46fb1 и подтвердил полный WG UI lifecycle; следующий12.5.63 — полная ширина мобильных WireGuard Sheets и footer. Реальная Telegram доставка, Portal SSO, физический TCP disconnect, multi-instance и остальные профильные сетевые сценарии остаются открытыми. [Протокол](ux-ui-external-acceptance.md) и [журнал](ux-ui-stage-12.md) содержат доказательства и ограничения.
|
||||
Этапы0–11 завершены в описанных локальных границах. Этап12 открыт. На тестовом сервере161.104.46.222 работают backend3722fad/frontend6a46fb1 и два CHR. Внешние проверки подтвердили PG backup/restore/rollback, остановку фоновой работы для одного экземпляра, API JWT/RBAC и браузерные состояния восстановления. Native TCP/UDP speed, история и UI проверены в границах журнала; доступ ко второму CHR восстановлен пользователем. Очередь Telegram проверена на реальном PG: dedupe, конкурентный claim, retry/version, ошибки сохранения и неопределённый исход; ответы отправителя подменялись, реальной доставки это не доказывает. Блоки12.5.43–45 подтвердили browser retry/checkpoint и развернули понятное пояснение HTTP500. 12.5.46 подтвердил browser JWT/RBAC очереди на реальном HTTP/PG; 12.5.47 подтвердил изоляцию checkpoint при смене двух реальных HTTP/PG источников в конфигурации local; 12.5.48 подтвердил scoped axe/клавиатуру в обеих темах и320px; 12.5.49 собрал Q-матрицу и подтвердил отсутствие настройки Telegram; 12.5.50 подтвердил GET-only инвентаризацию: VPN/BGP/OSPF пусты, роли home-router/home-router; По уточнению пользователя12.5.51 создал реальные GRE туннели и подтвердил lifecycle/связность; обнаружена потеря peer IP, 12.5.52 локально исправил сохранение peer metadata, профильные проверки passed; 12.5.53 развернул исправление и подтвердил его на реальной GRE паре/API/UI; 12.5.54 локально исправил устойчивость меню GRE, профильные проверки passed; 12.5.55 развернул frontend731803b и подтвердил устойчивость меню на реальной GRE паре; 12.5.56 локально адаптировал внутренние IP поля GRE для320px, обе темы и профильные проверки passed; 12.5.57 развернул frontendfd521f6 и подтвердил мобильную GRE форму на реальной паре CHR; 12.5.58 подтвердил настоящую WireGuard пару, handshake/Ping/native/UI и финальную очистку; 12.5.59 подтвердил оставшиеся peers/IP после удаления WG и локально исправил backend; 12.5.60 развернул backend/frontend3722fad и подтвердил полное обычное удаление WG; 12.5.61 подтвердил UI создание WG и локально исправил remount меню; переключение осталось открытым. 12.5.62 развернул frontend6a46fb1 и подтвердил полный WG UI lifecycle; 12.5.63 локально адаптировал ширину трёх WireGuard Sheets и подтвердил footer/клавиатуру в обеих темах; следующий12.5.64 — frontend deploy и live мобильные формы на собственной WG паре. Реальная Telegram доставка, Portal SSO, физический TCP disconnect, multi-instance и остальные профильные сетевые сценарии остаются открытыми. [Протокол](ux-ui-external-acceptance.md) и [журнал](ux-ui-stage-12.md) содержат доказательства и ограничения.
|
||||
|
||||
Выполненные внешние сценарии не заменяют приёмку оставшихся интеграций и условий эксплуатации. Датированные продолжения ниже — история; точный следующий шаг указан в начале [журнала](ux-ui-progress.md).
|
||||
|
||||
|
||||
+14
-2
@@ -1,6 +1,6 @@
|
||||
# UX/UI: журнал реализации
|
||||
|
||||
Актуальное продолжение 2026-10-08: 12.5.62 развернул frontend6a46fb1 (backend3722fad healthy) и завершил WireGuard UI lifecycle на обоих CHR: create interface/peer201, disable/enable PATCH200, Ping3/3 до/после переключения, DELETE200 без остатков. Меню открывались однократно, JS/API errors0. Observer сохранил private baseline0600, итоговый exit0/selected baseline и DB controls совпали; readRetries0. Следующий12.5.63 — мобильные Sheets WireGuard: полная ширина и читаемый footer (создание/пир/импорт); текущая панель240px при viewport320px. Этап12.5 открыт.
|
||||
Актуальное продолжение 2026-10-08: 12.5.63 локально исправил ширину WireGuard create/peer/import Sheets:320px целиком, отsm create/peer448px и import512px. Три панели × две темы ×320/640/1280px —18 комбинаций/Tab/Escape/footer passed; profile5/5, scoped TypeScript/ESLint/ReUI checklist passed. Runtime backend3722fad/frontend6a46fb1, новая ширина ещё не развёрнута. Следующий12.5.64 — frontend Docker deploy и проверка live мобильных форм на новой собственной WG паре с очисткой; реальный import/export пока открыт. Этап12.5 открыт.
|
||||
|
||||
Общий план: [UX/UI по этапам и пятичасовым окнам](ux-ui-plan.md). План задаёт объём, этот журнал фиксирует выполненные блоки и ограничения. Записи расположены от новых к старым; подробная история этапа12 также сохранена в [ux-ui-stage-12.md](ux-ui-stage-12.md).
|
||||
|
||||
@@ -34,7 +34,19 @@
|
||||
| 10 | Маршрутизация, диагностика, карта и терминал | Завершён в границах локальной приёмки 2026-10-01; блоки 10.1–10.71, внешние ограничения в 10.71 |
|
||||
| 11А | Пользователи, контейнеры, сертификаты и резервные копии | Завершён в границах локальной приёмки 2026-10-01; 11А.1–11А.33, внешние ограничения в 11А.33 |
|
||||
| 11Б | Оповещения, сбор данных, интеграции, релизы и настройки | Завершён в границах локальной приёмки 2026-10-03; ограничения и evidence в11Б.7 |
|
||||
| 12 | Итоговая доступность, адаптивность, производительность и регрессия | Локальная приёмка завершена в границах12.3.83; внешняя12.5 в работе, выполненные блоки1–62 и ограничения ниже. Runtime backend3722fad/frontend6a46fb1. |
|
||||
| 12 | Итоговая доступность, адаптивность, производительность и регрессия | Локальная приёмка завершена в границах12.3.83; внешняя12.5 в работе, выполненные блоки1–63 и ограничения ниже. Runtime backend3722fad/frontend6a46fb1. |
|
||||
|
||||
## 12.5.63 — полная ширина мобильных WireGuard Sheets (2026-10-08)
|
||||
|
||||
В components/wireguard/wg-create-sheet.tsx, wg-peer-sheet.tsx и wg-import-sheet.tsx заменены только width utilities на data-[side=right]:w-full и data-[side=right]:sm:max-w-md/lg. Это существующий GRE образец: одинаковые data-side modifiers корректно переопределяют default ширину установленного Sheet. Создание/пир наsm имеют448px, импорт512px; доsm панели занимают полную ширину экрана. Содержимое форм, API, footer composition и общие primitives не менялись.
|
||||
|
||||
[Светлая тема](ux-ui/acceptance/wg-sheets-layout-light-2026-10-08.json), [тёмная тема](ux-ui/acceptance/wg-sheets-layout-dark-2026-10-08.json): временный локальный Playwright visual harness, три панели ×320/640/1280px × две темы —18 комбинаций passed. Actual bounding width равна320/448/512px; все footer buttons находятся внутри панели, scrollWidth не превышает clientWidth, page overflow отсутствует. Tab идёт по ожидаемым полям, Escape закрывает панель. HTTP API подменён, реальные RouterOS операции в этой проверке не выполнялись.
|
||||
|
||||
Мобильные скриншоты: [создание dark](ux-ui/screens/wg-create-dark-full-width-320-2026-10-08.png), [создание light](ux-ui/screens/wg-create-light-full-width-320-2026-10-08.png), [пир dark](ux-ui/screens/wg-peer-dark-full-width-320-2026-10-08.png), [пир light](ux-ui/screens/wg-peer-light-full-width-320-2026-10-08.png), [импорт light](ux-ui/screens/wg-import-light-full-width-320-2026-10-08.png), [импорт dark](ux-ui/screens/wg-import-dark-full-width-320-2026-10-08.png). Create dark/peer dark/import light визуально просмотрены: текст действий читается полностью, IP/endpoint имеют достаточную ширину; ключи в снимках не заполнялись.
|
||||
|
||||
Profile wireguard-links.spec.ts --grep импорт/создание сохраняет форму —5/5 passed: interface,interface DTO,peer, импорт без подтверждённого результата и pending/retry. Сохранение ввода, API ошибки/неподтверждённые ответы и ожидание результата сохранились. Scoped TypeScript выполнен после остановки Next, ESLint трёх изменённых компонентов и ReUI checklist passed. Полная регрессия не повторялась для трёх responsive class overrides.
|
||||
|
||||
Изменение локальное: удалённый runtime backend3722fad/frontend6a46fb1 healthy остаётся прежним. Следующий12.5.64 — frontend production Docker deploy и live мобильные create/peer/import панели на новой собственной WG паре; real UI lifecycle/связность и очистка, baseline. Просмотр импортной формы не будет заявляться как проверенный настоящий import. Import/export, throughput/IPv6/внешние failures/RBAC/multi-instance/Telegram/Portal и другие внешние ограничения открыты. Правило пользователя создавать настоящие VPN объекты сохраняется. Локальный коммит без push.
|
||||
|
||||
## 12.5.62 — развёртывание стабильного меню и полный WireGuard UI lifecycle (2026-10-08)
|
||||
|
||||
|
||||
+13
-1
@@ -1,6 +1,6 @@
|
||||
# Этап 12: итоговая приёмка UX/UI
|
||||
|
||||
Актуальное продолжение 2026-10-08: 12.5.62 развернул frontend6a46fb1 (backend3722fad healthy) и завершил WireGuard UI lifecycle на обоих CHR: create interface/peer201, disable/enable PATCH200, Ping3/3 до/после переключения, DELETE200 без остатков. Меню открывались однократно, JS/API errors0. Observer сохранил private baseline0600, итоговый exit0/selected baseline и DB controls совпали; readRetries0. Следующий12.5.63 — мобильные Sheets WireGuard: полная ширина и читаемый footer (создание/пир/импорт); текущая панель240px при viewport320px. Этап12.5 открыт.
|
||||
Актуальное продолжение 2026-10-08: 12.5.63 локально исправил ширину WireGuard create/peer/import Sheets:320px целиком, отsm create/peer448px и import512px. Три панели × две темы ×320/640/1280px —18 комбинаций/Tab/Escape/footer passed; profile5/5, scoped TypeScript/ESLint/ReUI checklist passed. Runtime backend3722fad/frontend6a46fb1, новая ширина ещё не развёрнута. Следующий12.5.64 — frontend Docker deploy и проверка live мобильных форм на новой собственной WG паре с очисткой; реальный import/export пока открыт. Этап12.5 открыт.
|
||||
|
||||
План: [ux-ui-plan.md](ux-ui-plan.md). Фактические результаты: [ux-ui-progress.md](ux-ui-progress.md). Подготовлен после сводных проверок 11Б; завершение каждого блока требует локального коммита без push.
|
||||
|
||||
@@ -1642,3 +1642,15 @@ Runtime backend/frontend3722fad, локальное меню ещё не раз
|
||||
Итоговый observer exit0, afterBrowser пуст на обеих сторонах; selected WG/peers/IP/routes/IPv4 Firewall baseline совпал. Fallback удаления не понадобился; эфемерный контейнер удалён, остались три основные Compose-службы. DB controls до/после servers2/speedHistory9/retention14/migrations9 совпали, audit revisions намеренно сохранены. Приватный baseline с возможными ключами чужой конфигурации не скачивался и не коммитился. [Smoke](ux-ui/acceptance/deploy-browser-6a46fb1-2026-10-08.json): dashboard/servers/uptime/settings/filters/alerts200,320px fit, JS/API errors0.
|
||||
|
||||
[Мобильная форма создания](ux-ui/screens/wg-ui-create-server2-6a46fb1-320-2026-10-08.png) просмотрена, без ключей. Выявлена отдельная UX-недоработка: WireGuard create/peer/import используют обычный w-full, который не переопределяет data-side width общего Sheet; мобильная панель фактически240px при320px, footer сжат. Следующий12.5.63 — точные responsive width overrides по существующему GRE образцу, проверка полной ширины/кнопок в обеих темах и профильные UI проверки. Export/import, throughput, IPv6, внешние failures/RBAC/multi-instance, Telegram/Portal и остальные интеграционные ограничения остаются открытыми. Пользовательское правило настоящих VPN объектов сохраняется. Локальный коммит без push.
|
||||
|
||||
## 12.5.63 — полная ширина мобильных WireGuard Sheets (2026-10-08)
|
||||
|
||||
В components/wireguard/wg-create-sheet.tsx, wg-peer-sheet.tsx и wg-import-sheet.tsx заменены только width utilities на data-[side=right]:w-full и data-[side=right]:sm:max-w-md/lg. Это существующий GRE образец: одинаковые data-side modifiers корректно переопределяют default ширину установленного Sheet. Создание/пир наsm имеют448px, импорт512px; доsm панели занимают полную ширину экрана. Содержимое форм, API, footer composition и общие primitives не менялись.
|
||||
|
||||
[Светлая тема](ux-ui/acceptance/wg-sheets-layout-light-2026-10-08.json), [тёмная тема](ux-ui/acceptance/wg-sheets-layout-dark-2026-10-08.json): временный локальный Playwright visual harness, три панели ×320/640/1280px × две темы —18 комбинаций passed. Actual bounding width равна320/448/512px; все footer buttons находятся внутри панели, scrollWidth не превышает clientWidth, page overflow отсутствует. Tab идёт по ожидаемым полям, Escape закрывает панель. HTTP API подменён, реальные RouterOS операции в этой проверке не выполнялись.
|
||||
|
||||
Мобильные скриншоты: [создание dark](ux-ui/screens/wg-create-dark-full-width-320-2026-10-08.png), [создание light](ux-ui/screens/wg-create-light-full-width-320-2026-10-08.png), [пир dark](ux-ui/screens/wg-peer-dark-full-width-320-2026-10-08.png), [пир light](ux-ui/screens/wg-peer-light-full-width-320-2026-10-08.png), [импорт light](ux-ui/screens/wg-import-light-full-width-320-2026-10-08.png), [импорт dark](ux-ui/screens/wg-import-dark-full-width-320-2026-10-08.png). Create dark/peer dark/import light визуально просмотрены: текст действий читается полностью, IP/endpoint имеют достаточную ширину; ключи в снимках не заполнялись.
|
||||
|
||||
Profile wireguard-links.spec.ts --grep импорт/создание сохраняет форму —5/5 passed: interface,interface DTO,peer, импорт без подтверждённого результата и pending/retry. Сохранение ввода, API ошибки/неподтверждённые ответы и ожидание результата сохранились. Scoped TypeScript выполнен после остановки Next, ESLint трёх изменённых компонентов и ReUI checklist passed. Полная регрессия не повторялась для трёх responsive class overrides.
|
||||
|
||||
Изменение локальное: удалённый runtime backend3722fad/frontend6a46fb1 healthy остаётся прежним. Следующий12.5.64 — frontend production Docker deploy и live мобильные create/peer/import панели на новой собственной WG паре; real UI lifecycle/связность и очистка, baseline. Просмотр импортной формы не будет заявляться как проверенный настоящий import. Import/export, throughput/IPv6/внешние failures/RBAC/multi-instance/Telegram/Portal и другие внешние ограничения открыты. Правило пользователя создавать настоящие VPN объекты сохраняется. Локальный коммит без push.
|
||||
@@ -485,3 +485,15 @@ Runtime backend/frontend3722fad, локальное меню ещё не раз
|
||||
Итоговый observer exit0, afterBrowser пуст на обеих сторонах; selected WG/peers/IP/routes/IPv4 Firewall baseline совпал. Fallback удаления не понадобился; эфемерный контейнер удалён, остались три основные Compose-службы. DB controls до/после servers2/speedHistory9/retention14/migrations9 совпали, audit revisions намеренно сохранены. Приватный baseline с возможными ключами чужой конфигурации не скачивался и не коммитился. [Smoke](ux-ui/acceptance/deploy-browser-6a46fb1-2026-10-08.json): dashboard/servers/uptime/settings/filters/alerts200,320px fit, JS/API errors0.
|
||||
|
||||
[Мобильная форма создания](ux-ui/screens/wg-ui-create-server2-6a46fb1-320-2026-10-08.png) просмотрена, без ключей. Выявлена отдельная UX-недоработка: WireGuard create/peer/import используют обычный w-full, который не переопределяет data-side width общего Sheet; мобильная панель фактически240px при320px, footer сжат. Следующий12.5.63 — точные responsive width overrides по существующему GRE образцу, проверка полной ширины/кнопок в обеих темах и профильные UI проверки. Export/import, throughput, IPv6, внешние failures/RBAC/multi-instance, Telegram/Portal и остальные интеграционные ограничения остаются открытыми. Пользовательское правило настоящих VPN объектов сохраняется. Локальный коммит без push.
|
||||
|
||||
## 12.5.63 — полная ширина мобильных WireGuard Sheets (2026-10-08)
|
||||
|
||||
В components/wireguard/wg-create-sheet.tsx, wg-peer-sheet.tsx и wg-import-sheet.tsx заменены только width utilities на data-[side=right]:w-full и data-[side=right]:sm:max-w-md/lg. Это существующий GRE образец: одинаковые data-side modifiers корректно переопределяют default ширину установленного Sheet. Создание/пир наsm имеют448px, импорт512px; доsm панели занимают полную ширину экрана. Содержимое форм, API, footer composition и общие primitives не менялись.
|
||||
|
||||
[Светлая тема](ux-ui/acceptance/wg-sheets-layout-light-2026-10-08.json), [тёмная тема](ux-ui/acceptance/wg-sheets-layout-dark-2026-10-08.json): временный локальный Playwright visual harness, три панели ×320/640/1280px × две темы —18 комбинаций passed. Actual bounding width равна320/448/512px; все footer buttons находятся внутри панели, scrollWidth не превышает clientWidth, page overflow отсутствует. Tab идёт по ожидаемым полям, Escape закрывает панель. HTTP API подменён, реальные RouterOS операции в этой проверке не выполнялись.
|
||||
|
||||
Мобильные скриншоты: [создание dark](ux-ui/screens/wg-create-dark-full-width-320-2026-10-08.png), [создание light](ux-ui/screens/wg-create-light-full-width-320-2026-10-08.png), [пир dark](ux-ui/screens/wg-peer-dark-full-width-320-2026-10-08.png), [пир light](ux-ui/screens/wg-peer-light-full-width-320-2026-10-08.png), [импорт light](ux-ui/screens/wg-import-light-full-width-320-2026-10-08.png), [импорт dark](ux-ui/screens/wg-import-dark-full-width-320-2026-10-08.png). Create dark/peer dark/import light визуально просмотрены: текст действий читается полностью, IP/endpoint имеют достаточную ширину; ключи в снимках не заполнялись.
|
||||
|
||||
Profile wireguard-links.spec.ts --grep импорт/создание сохраняет форму —5/5 passed: interface,interface DTO,peer, импорт без подтверждённого результата и pending/retry. Сохранение ввода, API ошибки/неподтверждённые ответы и ожидание результата сохранились. Scoped TypeScript выполнен после остановки Next, ESLint трёх изменённых компонентов и ReUI checklist passed. Полная регрессия не повторялась для трёх responsive class overrides.
|
||||
|
||||
Изменение локальное: удалённый runtime backend3722fad/frontend6a46fb1 healthy остаётся прежним. Следующий12.5.64 — frontend production Docker deploy и live мобильные create/peer/import панели на новой собственной WG паре; real UI lifecycle/связность и очистка, baseline. Просмотр импортной формы не будет заявляться как проверенный настоящий import. Import/export, throughput/IPv6/внешние failures/RBAC/multi-instance/Telegram/Portal и другие внешние ограничения открыты. Правило пользователя создавать настоящие VPN объекты сохраняется. Локальный коммит без push.
|
||||
@@ -0,0 +1,192 @@
|
||||
{
|
||||
"date": "2026-10-08",
|
||||
"theme": "dark",
|
||||
"localWorkingTree": true,
|
||||
"httpMocks": true,
|
||||
"cases": [
|
||||
{
|
||||
"kind": "create",
|
||||
"width": 320,
|
||||
"sheetWidth": 320,
|
||||
"footerButtonsFit": true,
|
||||
"footerButtons": [
|
||||
{
|
||||
"label": "Отмена",
|
||||
"scrollWidth": 124,
|
||||
"clientWidth": 124
|
||||
},
|
||||
{
|
||||
"label": "Создать туннель",
|
||||
"scrollWidth": 135,
|
||||
"clientWidth": 135
|
||||
}
|
||||
],
|
||||
"keyboardOrder": true,
|
||||
"noPageOverflow": true
|
||||
},
|
||||
{
|
||||
"kind": "create",
|
||||
"width": 640,
|
||||
"sheetWidth": 448,
|
||||
"footerButtonsFit": true,
|
||||
"footerButtons": [
|
||||
{
|
||||
"label": "Отмена",
|
||||
"scrollWidth": 194,
|
||||
"clientWidth": 194
|
||||
},
|
||||
{
|
||||
"label": "Создать туннель",
|
||||
"scrollWidth": 194,
|
||||
"clientWidth": 194
|
||||
}
|
||||
],
|
||||
"keyboardOrder": true,
|
||||
"noPageOverflow": true
|
||||
},
|
||||
{
|
||||
"kind": "create",
|
||||
"width": 1280,
|
||||
"sheetWidth": 448,
|
||||
"footerButtonsFit": true,
|
||||
"footerButtons": [
|
||||
{
|
||||
"label": "Отмена",
|
||||
"scrollWidth": 194,
|
||||
"clientWidth": 194
|
||||
},
|
||||
{
|
||||
"label": "Создать туннель",
|
||||
"scrollWidth": 194,
|
||||
"clientWidth": 194
|
||||
}
|
||||
],
|
||||
"keyboardOrder": true,
|
||||
"noPageOverflow": true
|
||||
},
|
||||
{
|
||||
"kind": "peer",
|
||||
"width": 320,
|
||||
"sheetWidth": 320,
|
||||
"footerButtonsFit": true,
|
||||
"footerButtons": [
|
||||
{
|
||||
"label": "Отмена",
|
||||
"scrollWidth": 130,
|
||||
"clientWidth": 130
|
||||
},
|
||||
{
|
||||
"label": "Добавить",
|
||||
"scrollWidth": 130,
|
||||
"clientWidth": 130
|
||||
}
|
||||
],
|
||||
"keyboardOrder": true,
|
||||
"noPageOverflow": true
|
||||
},
|
||||
{
|
||||
"kind": "peer",
|
||||
"width": 640,
|
||||
"sheetWidth": 448,
|
||||
"footerButtonsFit": true,
|
||||
"footerButtons": [
|
||||
{
|
||||
"label": "Отмена",
|
||||
"scrollWidth": 194,
|
||||
"clientWidth": 194
|
||||
},
|
||||
{
|
||||
"label": "Добавить",
|
||||
"scrollWidth": 194,
|
||||
"clientWidth": 194
|
||||
}
|
||||
],
|
||||
"keyboardOrder": true,
|
||||
"noPageOverflow": true
|
||||
},
|
||||
{
|
||||
"kind": "peer",
|
||||
"width": 1280,
|
||||
"sheetWidth": 448,
|
||||
"footerButtonsFit": true,
|
||||
"footerButtons": [
|
||||
{
|
||||
"label": "Отмена",
|
||||
"scrollWidth": 194,
|
||||
"clientWidth": 194
|
||||
},
|
||||
{
|
||||
"label": "Добавить",
|
||||
"scrollWidth": 194,
|
||||
"clientWidth": 194
|
||||
}
|
||||
],
|
||||
"keyboardOrder": true,
|
||||
"noPageOverflow": true
|
||||
},
|
||||
{
|
||||
"kind": "import",
|
||||
"width": 320,
|
||||
"sheetWidth": 320,
|
||||
"footerButtonsFit": true,
|
||||
"footerButtons": [
|
||||
{
|
||||
"label": "Отмена",
|
||||
"scrollWidth": 93,
|
||||
"clientWidth": 93
|
||||
},
|
||||
{
|
||||
"label": "Применить на роутер",
|
||||
"scrollWidth": 166,
|
||||
"clientWidth": 166
|
||||
}
|
||||
],
|
||||
"keyboardOrder": true,
|
||||
"noPageOverflow": true
|
||||
},
|
||||
{
|
||||
"kind": "import",
|
||||
"width": 640,
|
||||
"sheetWidth": 512,
|
||||
"footerButtonsFit": true,
|
||||
"footerButtons": [
|
||||
{
|
||||
"label": "Отмена",
|
||||
"scrollWidth": 226,
|
||||
"clientWidth": 226
|
||||
},
|
||||
{
|
||||
"label": "Применить на роутер",
|
||||
"scrollWidth": 226,
|
||||
"clientWidth": 226
|
||||
}
|
||||
],
|
||||
"keyboardOrder": true,
|
||||
"noPageOverflow": true
|
||||
},
|
||||
{
|
||||
"kind": "import",
|
||||
"width": 1280,
|
||||
"sheetWidth": 512,
|
||||
"footerButtonsFit": true,
|
||||
"footerButtons": [
|
||||
{
|
||||
"label": "Отмена",
|
||||
"scrollWidth": 226,
|
||||
"clientWidth": 226
|
||||
},
|
||||
{
|
||||
"label": "Применить на роутер",
|
||||
"scrollWidth": 226,
|
||||
"clientWidth": 226
|
||||
}
|
||||
],
|
||||
"keyboardOrder": true,
|
||||
"noPageOverflow": true
|
||||
}
|
||||
],
|
||||
"limits": [
|
||||
"Local layout/keyboard check; no real RouterOS mutations",
|
||||
"Existing functional API regressions run separately"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,192 @@
|
||||
{
|
||||
"date": "2026-10-08",
|
||||
"theme": "light",
|
||||
"localWorkingTree": true,
|
||||
"httpMocks": true,
|
||||
"cases": [
|
||||
{
|
||||
"kind": "create",
|
||||
"width": 320,
|
||||
"sheetWidth": 320,
|
||||
"footerButtonsFit": true,
|
||||
"footerButtons": [
|
||||
{
|
||||
"label": "Отмена",
|
||||
"scrollWidth": 124,
|
||||
"clientWidth": 124
|
||||
},
|
||||
{
|
||||
"label": "Создать туннель",
|
||||
"scrollWidth": 135,
|
||||
"clientWidth": 135
|
||||
}
|
||||
],
|
||||
"keyboardOrder": true,
|
||||
"noPageOverflow": true
|
||||
},
|
||||
{
|
||||
"kind": "create",
|
||||
"width": 640,
|
||||
"sheetWidth": 448,
|
||||
"footerButtonsFit": true,
|
||||
"footerButtons": [
|
||||
{
|
||||
"label": "Отмена",
|
||||
"scrollWidth": 194,
|
||||
"clientWidth": 194
|
||||
},
|
||||
{
|
||||
"label": "Создать туннель",
|
||||
"scrollWidth": 194,
|
||||
"clientWidth": 194
|
||||
}
|
||||
],
|
||||
"keyboardOrder": true,
|
||||
"noPageOverflow": true
|
||||
},
|
||||
{
|
||||
"kind": "create",
|
||||
"width": 1280,
|
||||
"sheetWidth": 448,
|
||||
"footerButtonsFit": true,
|
||||
"footerButtons": [
|
||||
{
|
||||
"label": "Отмена",
|
||||
"scrollWidth": 194,
|
||||
"clientWidth": 194
|
||||
},
|
||||
{
|
||||
"label": "Создать туннель",
|
||||
"scrollWidth": 194,
|
||||
"clientWidth": 194
|
||||
}
|
||||
],
|
||||
"keyboardOrder": true,
|
||||
"noPageOverflow": true
|
||||
},
|
||||
{
|
||||
"kind": "peer",
|
||||
"width": 320,
|
||||
"sheetWidth": 320,
|
||||
"footerButtonsFit": true,
|
||||
"footerButtons": [
|
||||
{
|
||||
"label": "Отмена",
|
||||
"scrollWidth": 130,
|
||||
"clientWidth": 130
|
||||
},
|
||||
{
|
||||
"label": "Добавить",
|
||||
"scrollWidth": 130,
|
||||
"clientWidth": 130
|
||||
}
|
||||
],
|
||||
"keyboardOrder": true,
|
||||
"noPageOverflow": true
|
||||
},
|
||||
{
|
||||
"kind": "peer",
|
||||
"width": 640,
|
||||
"sheetWidth": 448,
|
||||
"footerButtonsFit": true,
|
||||
"footerButtons": [
|
||||
{
|
||||
"label": "Отмена",
|
||||
"scrollWidth": 194,
|
||||
"clientWidth": 194
|
||||
},
|
||||
{
|
||||
"label": "Добавить",
|
||||
"scrollWidth": 194,
|
||||
"clientWidth": 194
|
||||
}
|
||||
],
|
||||
"keyboardOrder": true,
|
||||
"noPageOverflow": true
|
||||
},
|
||||
{
|
||||
"kind": "peer",
|
||||
"width": 1280,
|
||||
"sheetWidth": 448,
|
||||
"footerButtonsFit": true,
|
||||
"footerButtons": [
|
||||
{
|
||||
"label": "Отмена",
|
||||
"scrollWidth": 194,
|
||||
"clientWidth": 194
|
||||
},
|
||||
{
|
||||
"label": "Добавить",
|
||||
"scrollWidth": 194,
|
||||
"clientWidth": 194
|
||||
}
|
||||
],
|
||||
"keyboardOrder": true,
|
||||
"noPageOverflow": true
|
||||
},
|
||||
{
|
||||
"kind": "import",
|
||||
"width": 320,
|
||||
"sheetWidth": 320,
|
||||
"footerButtonsFit": true,
|
||||
"footerButtons": [
|
||||
{
|
||||
"label": "Отмена",
|
||||
"scrollWidth": 93,
|
||||
"clientWidth": 93
|
||||
},
|
||||
{
|
||||
"label": "Применить на роутер",
|
||||
"scrollWidth": 166,
|
||||
"clientWidth": 166
|
||||
}
|
||||
],
|
||||
"keyboardOrder": true,
|
||||
"noPageOverflow": true
|
||||
},
|
||||
{
|
||||
"kind": "import",
|
||||
"width": 640,
|
||||
"sheetWidth": 512,
|
||||
"footerButtonsFit": true,
|
||||
"footerButtons": [
|
||||
{
|
||||
"label": "Отмена",
|
||||
"scrollWidth": 226,
|
||||
"clientWidth": 226
|
||||
},
|
||||
{
|
||||
"label": "Применить на роутер",
|
||||
"scrollWidth": 226,
|
||||
"clientWidth": 226
|
||||
}
|
||||
],
|
||||
"keyboardOrder": true,
|
||||
"noPageOverflow": true
|
||||
},
|
||||
{
|
||||
"kind": "import",
|
||||
"width": 1280,
|
||||
"sheetWidth": 512,
|
||||
"footerButtonsFit": true,
|
||||
"footerButtons": [
|
||||
{
|
||||
"label": "Отмена",
|
||||
"scrollWidth": 226,
|
||||
"clientWidth": 226
|
||||
},
|
||||
{
|
||||
"label": "Применить на роутер",
|
||||
"scrollWidth": 226,
|
||||
"clientWidth": 226
|
||||
}
|
||||
],
|
||||
"keyboardOrder": true,
|
||||
"noPageOverflow": true
|
||||
}
|
||||
],
|
||||
"limits": [
|
||||
"Local layout/keyboard check; no real RouterOS mutations",
|
||||
"Existing functional API regressions run separately"
|
||||
]
|
||||
}
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 61 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 60 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 35 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 35 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 33 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 33 KiB |
Reference in new issue
Block a user