From 3c9096804b85609f0765af32b71f7a200a71e157 Mon Sep 17 00:00:00 2001 From: Denozordec Date: Thu, 15 Oct 2026 14:15:56 +0700 Subject: [PATCH] =?UTF-8?q?fix(ui):=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D1=82=D1=8C=20=D1=84=D0=BE=D0=BA=D1=83=D1=81=20=D1=81?= =?UTF-8?q?=D0=BF=D0=B8=D1=81=D0=BA=D0=B0=20=D1=81=D0=B5=D1=80=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=20=D0=B8=20=D0=BA=D0=BE=D0=BD=D1=82=D1=80?= =?UTF-8?q?=D0=B0=D1=81=D1=82=20=D0=BE=D0=B1=D1=89=D0=B8=D1=85=20=D1=8D?= =?UTF-8?q?=D0=BB=D0=B5=D0=BC=D0=B5=D0=BD=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(main)/bgp/page.tsx | 6 +- app/(main)/vxlan/page.tsx | 2 +- .../scripts/acceptance/ui-readonly-audit.mjs | 137 ++ components/data-grids/servers-data-grid.tsx | 19 +- components/form-kit/segmented-control.tsx | 2 +- components/server-tile-rail.tsx | 40 +- docs/ux-ui-external-acceptance.md | 23 +- docs/ux-ui-plan.md | 49 +- docs/ux-ui-progress.md | 25 +- docs/ux-ui-remaining-acceptance.md | 57 +- docs/ux-ui-stage-12.md | 23 +- docs/ux-ui-test-server.md | 25 +- docs/ux-ui/acceptance/ui260-baseline.json | 2063 ++++++++++++++++ docs/ux-ui/acceptance/ui260-deployment.json | 20 + docs/ux-ui/acceptance/ui260-final.json | 2122 ++++++++++++++++ .../ux-ui/acceptance/ui260-first-recheck.json | 2132 +++++++++++++++++ .../ux-ui/acceptance/ui260-servers-final.json | 135 ++ docs/ux-ui/acceptance/ui260-summary.json | 62 + docs/ux-ui/screens/ui260-bgp.png | Bin 0 -> 51264 bytes docs/ux-ui/screens/ui260-servers.png | Bin 0 -> 124138 bytes tests/e2e/server-rail-accessibility.spec.ts | 68 + 21 files changed, 6952 insertions(+), 58 deletions(-) create mode 100644 backend/scripts/acceptance/ui-readonly-audit.mjs create mode 100644 docs/ux-ui/acceptance/ui260-baseline.json create mode 100644 docs/ux-ui/acceptance/ui260-deployment.json create mode 100644 docs/ux-ui/acceptance/ui260-final.json create mode 100644 docs/ux-ui/acceptance/ui260-first-recheck.json create mode 100644 docs/ux-ui/acceptance/ui260-servers-final.json create mode 100644 docs/ux-ui/acceptance/ui260-summary.json create mode 100644 docs/ux-ui/screens/ui260-bgp.png create mode 100644 docs/ux-ui/screens/ui260-servers.png create mode 100644 tests/e2e/server-rail-accessibility.spec.ts diff --git a/app/(main)/bgp/page.tsx b/app/(main)/bgp/page.tsx index 3e845db6..2a377b1f 100644 --- a/app/(main)/bgp/page.tsx +++ b/app/(main)/bgp/page.tsx @@ -761,11 +761,11 @@ function BgpPageContent({ selectedServerId, selectedSessionId, activeTab, onSele } banner={
-
+
{TABS.map(t => ( - ))} diff --git a/components/server-tile-rail.tsx b/components/server-tile-rail.tsx index 7e5fde08..1c07b816 100644 --- a/components/server-tile-rail.tsx +++ b/components/server-tile-rail.tsx @@ -35,6 +35,10 @@ import { LayersIcon, SearchIcon, ServerIcon } from "lucide-react" /** Preview: https://reui.io/preview/base/list-9 · https://reui.io/docs/components/base/icon-tile · https://reui.io/docs/components/base/frame · https://reui.io/docs/components/base/badge */ export const ALL_SERVERS_ID = "all" +// Device URL changes can remount the page. Keep only the current keyboard intent, +// and never restore it after the user has focused another control. +let pendingKeyboardFocus: { path: string; id: string; source: Element | null; until: number } | null = null + export interface ServerTileItem { id: string name: string @@ -185,7 +189,15 @@ function ServerTileRail({ useEffect(() => { const viewport = listRef.current?.closest('[data-slot="scroll-area-viewport"]') viewport?.scrollTo({ top: 0 }) - listRef.current?.querySelector('[aria-selected="true"]')?.scrollIntoView({ block: "nearest" }) + const selected = listRef.current?.querySelector('[aria-selected="true"]') + selected?.scrollIntoView({ block: "nearest" }) + const pending = pendingKeyboardFocus + if (pending && (pending.until < performance.now() || pending.path !== window.location.pathname)) { + pendingKeyboardFocus = null + } else if (pending && pending.id === resolvedId && selected?.getClientRects().length) { + if (document.activeElement === document.body || document.activeElement === pending.source) selected.focus({ preventScroll: true }) + pendingKeyboardFocus = null + } }, [pageIndex, resolvedId, q, pageSize]) const visibleIds = new Set(table.getRowModel().rows.map(row => row.id)) const visibleGroups = groups.map(group => ({ ...group, items: group.items.filter(item => visibleIds.has(item.id)) })).filter(group => group.items.length > 0) @@ -200,6 +212,19 @@ function ServerTileRail({ return ids }, [filtered, showAllTile]) + const tabStopId = activeId && selectableIds.includes(activeId) + ? activeId + : showAllTile ? ALL_SERVERS_ID : table.getRowModel().rows.find(row => isSelectable(row.original))?.id + + function selectWithKeyboard(id: string) { + if (id === resolvedId) { + listRef.current?.querySelector('[aria-selected="true"]')?.focus() + return + } + pendingKeyboardFocus = { path: window.location.pathname, id, source: document.activeElement, until: performance.now() + 10000 } + onSelect(id) + } + function moveSelection(delta: number) { if (selectableIds.length === 0) return const idx = selectableIds.indexOf(resolvedId) @@ -208,7 +233,7 @@ function ServerTileRail({ ? delta > 0 ? 0 : selectableIds.length - 1 : Math.min(selectableIds.length - 1, Math.max(0, idx + delta)) const nextId = selectableIds[nextIdx] - if (nextId) onSelect(nextId) + if (nextId) selectWithKeyboard(nextId) } function handleListKeyDown(event: KeyboardEvent) { @@ -225,13 +250,13 @@ function ServerTileRail({ } if (event.key === "Home") { event.preventDefault() - if (selectableIds[0]) onSelect(selectableIds[0]) + if (selectableIds[0]) selectWithKeyboard(selectableIds[0]) return } if (event.key === "End") { event.preventDefault() const last = selectableIds[selectableIds.length - 1] - if (last) onSelect(last) + if (last) selectWithKeyboard(last) } } @@ -283,8 +308,6 @@ function ServerTileRail({ className="flex flex-col gap-0.5 p-1.5" role="listbox" aria-label="Серверы" - aria-activedescendant={activeId ? `${railId}-server-tile-${activeId}` : undefined} - tabIndex={0} onKeyDown={handleListKeyDown} > {showAllTile ? ( @@ -292,6 +315,7 @@ function ServerTileRail({ id={`${railId}-server-tile-${ALL_SERVERS_ID}`} item={allItem} selected={resolvedId === ALL_SERVERS_ID} + tabStop={tabStopId === ALL_SERVERS_ID} onSelect={() => onSelect(ALL_SERVERS_ID)} showCount={showCount} showType={false} @@ -315,6 +339,7 @@ function ServerTileRail({ id={`${railId}-server-tile-${item.id}`} item={item} selected={resolvedId === item.id} + tabStop={tabStopId === item.id} onSelect={() => onSelect(item.id)} showCount={showCount} showType={showType} @@ -354,6 +379,7 @@ function ServerTileButton({ id, item, selected, + tabStop, onSelect, showCount, showType, @@ -363,6 +389,7 @@ function ServerTileButton({ id: string item: ServerTileItem selected: boolean + tabStop: boolean onSelect: () => void showCount: boolean showType: boolean @@ -385,6 +412,7 @@ function ServerTileButton({ type="button" role="option" aria-selected={selected} + tabIndex={tabStop ? 0 : -1} title={item.title ?? hostname} disabled={!selectable} onClick={onSelect} diff --git a/docs/ux-ui-external-acceptance.md b/docs/ux-ui-external-acceptance.md index a508c84b..c7321332 100644 --- a/docs/ux-ui-external-acceptance.md +++ b/docs/ux-ui-external-acceptance.md @@ -1,6 +1,6 @@ # UX/UI: протокол внешней приёмки 12.5 -Актуальное продолжение 2026-10-15: 259 — реальный first issue и scheduler renewal приняты: trusted TLS сменил SHA-256, один logical leaf, старые native ID/fingerprint/private-key сохранены в архиве. Native/export/SSL/SQL/DNS восстановлены, private fixtures удалены. Runtime backend258/frontend251 healthy. Следующий260 — актуализировать остаток и выполнить профильную приёмку UX/доступности/производительности; этап12.5 открыт. +Актуальное продолжение 2026-10-15: 260 — исправлены общие focus/target-size/contrast и BGP320 tabs; production frontend ux-accessibility260-final развёрнут, backend258 healthy.72 live WCAG/layout состояния прошли,59 уникальных E2E прошли в записанных итерациях; synthetic timing сохранён. Следующий261 — оставшиеся12 экранов и точные границы приёмки; этап12.5 открыт. IPsec78: реальный PSK responder established, mode-config198.18.78.10 и online=true подтверждены API; точные собственные объекты удалены. Сертификатный/DN online, late failure и history restore остаются открытыми. [Отчёт](ux-ui/acceptance/ipsec-mode-config-2026-10-09.json), [журнал](ux-ui-progress.md). @@ -18,6 +18,27 @@ OSPF84: real GRE Full adjacency/private routes/Ping3/3 и4 live PC/320px URL/bro BFD85: Up/Full/own route/Ping,4 live UI и loss/withdrawal/recovery приняты; exact own cleanup8 коллекций×2 passed. Withdrawal5,245ms не подтверждает sub-second BFD timing; этот вопрос открыт. Runtime routing83 без новой сборки. [Отчёт](ux-ui/acceptance/ospf-bfd-loss-2026-10-09.json). +## 12.5.260 — общая доступность, клавиатура и профильная скорость UI (2026-10-15) + +Проведён read-only аудит18 разделов×2 темы×1440/320px:72 состояния текущего стенда/настоящий Portal UI, без response mocks. Baseline выявил23 состояния с axe нарушениями: недостаточная независимая pointer-area у focusable listbox-контейнера, контраст счётчиков SegmentedControl, raw type badges серверов и заголовка VXLAN. Document overflow0/JS errors0/API errors0; BGP320 имел2 внутренних переполнения main. Dashboard в baseline ещё содержал skeleton: его ранние timings не считаются готовностью данных. [Baseline](ux-ui/acceptance/ui260-baseline.json). + +ServerTileRail сохраняет существующие Item/ScrollArea/DataGrid/44px варианты: один Tab stop на option, стрелки/Home/End перемещают selection и DOM focus, включая переход через страницу50. Root больше не конкурирует с вложенными option за фокус/target. Первые2 новые keyboard tests обнаружили remount GrePageContent при смене server URL; короткий10s keyboard intent восстанавливает фокус на новом выбранном элементе, только если пользователь не сфокусировал другой control, и игнорирует скрытый rail. Настройки устройств/URL selection/API не изменены. + +TypeBadge переиспользует установленный ReUI Badge primary/info/success-light и text-foreground (как существующий rail), поскольку текущий dark success-foreground не прошёл4.5:1; vendor/style/theme не менялись, декоративные иконки скрыты от AT. У счётчиков снята opacity, заголовок VXLAN использует text-foreground. Вкладки BGP на узком экране имеют собственную горизонтальную прокрутку и не сжимаются. [Badge API](https://reui.io/docs/components/base/badge?ref=mcp), [preview](https://reui.io/components/badge?ref=mcp); audit checklist получен через MCP, выполнен в изменённых границах. + +Локально initial57 E2E:55 passed/2 keyboard failed; после исправления remount rerun6 (2 keyboard+4 GRE/VXLAN) passed. Затем добавлены2 contrast tests всех3 типов серверов; final shared4 (2 contrast+2 keyboard) passed. Это59 уникальных принятых случаев; повторные прогоны не прибавляются к числу сценариев; initial отказ сохранён в сводке. Проверены серверные операции/отказы/RBAC/формы, BGP data states, GRE/VXLAN layout и backup layout. TypeScript/scoped ESLint passed. Production frontend build passed,528 source files matched; финальный образ ux-accessibility260-final развёрнут, backend258/DB/Portal сохранены. + +Первый live recheck72 оставил2 color-contrast failures только на servers/dark; прочие70 прошли. После text-foreground final server recheck4 прошёл. Итоговое покрытие72 уникальных состояний объединено с явным происхождением результатов, а не выдано за76 разных случаев: axe WCAG2/2.1/2.2 tagged violations0, document/main overflow0, JS/API errors0, blocked writes0. Для data pages сначала ожидаются200 required endpoint responses; dashboard после этого skeleton0. Synthetic main-visible p50/p95=548/1052ms; required API response p50/p95=1033/2494ms. Это один Edge/headless lab run через SSH, без throttling, стандартный viewport snapshot; не field CWV/maximum load/полная ручная AT сертификация. [Полный протокол](ux-ui/acceptance/ui260-final.json), [сводка](ux-ui/acceptance/ui260-summary.json). + +Визуально просмотрены screenshots servers1440 и BGP320. На BGP320 подписи KPI ещё сокращаются; эту отдельную проблему читаемости включить в261 вместе с оставшимися экранами, не считать её проверенной axe. + +| Референс | Схема и экран | +| --- | --- | +| [ReUI Badge](https://reui.io/components/badge?ref=mcp) | Тип устройства → semantic variant → читаемая подпись; [servers1440](ux-ui/screens/ui260-servers.png) | +| [ReUI Frame](https://reui.io/components/frame?ref=mcp) | Узкий экран → прокрутка вкладок → выбранный раздел; [BGP320](ux-ui/screens/ui260-bgp.png) | + +Устройства не перенастраивались; новых native объектов/DNS/ACME не создавали. Текущая матрица исправлена: containers248 и ACME issue250/renewal259 приняты, старое отсутствие пакета/токена больше не записано как blocker. Семь групп описывают охват, не обязательные семь новых этапов. Следующий261 —12 оставшихся default screens: users/firewall/probes/terminal/data-collection/recursive-routes/route-optimizer/network-map/ip-ranges/asns/communities/domains; затем актуальные границы выпуска. Новая реализация CA revoke/MaxMind или внешняя публикация не объявляются выполненными. + ## 12.5.259 — реальная ротация сертификата и подтверждённый откат (2026-10-15) По сохранённому разрешению254 выполнен тот же exact mmt253-8e62a941.pngs.top на104.165.244.7. Перед началом снят свежий приватный native/export/SSL/files/SQL baseline; own certificate/files/jobs/DNS0, Cloudflare token/zone/account проверены. Renewal временно выключен. Подготовленный backend258 активирован; frontend251/Portal/DB сохранены, backend healthy. [Развёртывание](ux-ui/acceptance/acme259-deployment.json). diff --git a/docs/ux-ui-plan.md b/docs/ux-ui-plan.md index b35a8861..5cf697f8 100644 --- a/docs/ux-ui-plan.md +++ b/docs/ux-ui-plan.md @@ -1,8 +1,29 @@ # План реализации UX/UI по пятичасовым окнам -Актуальное продолжение 2026-10-15: 259 — реальный first issue и scheduler renewal приняты: trusted TLS сменил SHA-256, один logical leaf, старые native ID/fingerprint/private-key сохранены в архиве. Native/export/SSL/SQL/DNS восстановлены, private fixtures удалены. Runtime backend258/frontend251 healthy. Следующий260 — актуализировать остаток и выполнить профильную приёмку UX/доступности/производительности; этап12.5 открыт. +Актуальное продолжение 2026-10-15: 260 — исправлены общие focus/target-size/contrast и BGP320 tabs; production frontend ux-accessibility260-final развёрнут, backend258 healthy.72 live WCAG/layout состояния прошли,59 уникальных E2E прошли в записанных итерациях; synthetic timing сохранён. Следующий261 — оставшиеся12 экранов и точные границы приёмки; этап12.5 открыт. -Общий план проекта MikrotikManager. Основан на согласованном плане из задачи; точка продолжения обновлена 2026-10-14. Источник фактического прогресса, проверок и ограничений — [журнал реализации](ux-ui-progress.md). Этот документ задаёт объём и критерии завершения, журнал фиксирует результат. +Общий план проекта MikrotikManager. Основан на согласованном плане из задачи; точка продолжения обновлена 2026-10-15. Источник фактического прогресса, проверок и ограничений — [журнал реализации](ux-ui-progress.md). Этот документ задаёт объём и критерии завершения, журнал фиксирует результат. + +## 12.5.260 — общая доступность, клавиатура и профильная скорость UI (2026-10-15) + +Проведён read-only аудит18 разделов×2 темы×1440/320px:72 состояния текущего стенда/настоящий Portal UI, без response mocks. Baseline выявил23 состояния с axe нарушениями: недостаточная независимая pointer-area у focusable listbox-контейнера, контраст счётчиков SegmentedControl, raw type badges серверов и заголовка VXLAN. Document overflow0/JS errors0/API errors0; BGP320 имел2 внутренних переполнения main. Dashboard в baseline ещё содержал skeleton: его ранние timings не считаются готовностью данных. [Baseline](ux-ui/acceptance/ui260-baseline.json). + +ServerTileRail сохраняет существующие Item/ScrollArea/DataGrid/44px варианты: один Tab stop на option, стрелки/Home/End перемещают selection и DOM focus, включая переход через страницу50. Root больше не конкурирует с вложенными option за фокус/target. Первые2 новые keyboard tests обнаружили remount GrePageContent при смене server URL; короткий10s keyboard intent восстанавливает фокус на новом выбранном элементе, только если пользователь не сфокусировал другой control, и игнорирует скрытый rail. Настройки устройств/URL selection/API не изменены. + +TypeBadge переиспользует установленный ReUI Badge primary/info/success-light и text-foreground (как существующий rail), поскольку текущий dark success-foreground не прошёл4.5:1; vendor/style/theme не менялись, декоративные иконки скрыты от AT. У счётчиков снята opacity, заголовок VXLAN использует text-foreground. Вкладки BGP на узком экране имеют собственную горизонтальную прокрутку и не сжимаются. [Badge API](https://reui.io/docs/components/base/badge?ref=mcp), [preview](https://reui.io/components/badge?ref=mcp); audit checklist получен через MCP, выполнен в изменённых границах. + +Локально initial57 E2E:55 passed/2 keyboard failed; после исправления remount rerun6 (2 keyboard+4 GRE/VXLAN) passed. Затем добавлены2 contrast tests всех3 типов серверов; final shared4 (2 contrast+2 keyboard) passed. Это59 уникальных принятых случаев; повторные прогоны не прибавляются к числу сценариев; initial отказ сохранён в сводке. Проверены серверные операции/отказы/RBAC/формы, BGP data states, GRE/VXLAN layout и backup layout. TypeScript/scoped ESLint passed. Production frontend build passed,528 source files matched; финальный образ ux-accessibility260-final развёрнут, backend258/DB/Portal сохранены. + +Первый live recheck72 оставил2 color-contrast failures только на servers/dark; прочие70 прошли. После text-foreground final server recheck4 прошёл. Итоговое покрытие72 уникальных состояний объединено с явным происхождением результатов, а не выдано за76 разных случаев: axe WCAG2/2.1/2.2 tagged violations0, document/main overflow0, JS/API errors0, blocked writes0. Для data pages сначала ожидаются200 required endpoint responses; dashboard после этого skeleton0. Synthetic main-visible p50/p95=548/1052ms; required API response p50/p95=1033/2494ms. Это один Edge/headless lab run через SSH, без throttling, стандартный viewport snapshot; не field CWV/maximum load/полная ручная AT сертификация. [Полный протокол](ux-ui/acceptance/ui260-final.json), [сводка](ux-ui/acceptance/ui260-summary.json). + +Визуально просмотрены screenshots servers1440 и BGP320. На BGP320 подписи KPI ещё сокращаются; эту отдельную проблему читаемости включить в261 вместе с оставшимися экранами, не считать её проверенной axe. + +| Референс | Схема и экран | +| --- | --- | +| [ReUI Badge](https://reui.io/components/badge?ref=mcp) | Тип устройства → semantic variant → читаемая подпись; [servers1440](ux-ui/screens/ui260-servers.png) | +| [ReUI Frame](https://reui.io/components/frame?ref=mcp) | Узкий экран → прокрутка вкладок → выбранный раздел; [BGP320](ux-ui/screens/ui260-bgp.png) | + +Устройства не перенастраивались; новых native объектов/DNS/ACME не создавали. Текущая матрица исправлена: containers248 и ACME issue250/renewal259 приняты, старое отсутствие пакета/токена больше не записано как blocker. Семь групп описывают охват, не обязательные семь новых этапов. Следующий261 —12 оставшихся default screens: users/firewall/probes/terminal/data-collection/recursive-routes/route-optimizer/network-map/ip-ranges/asns/communities/domains; затем актуальные границы выпуска. Новая реализация CA revoke/MaxMind или внешняя публикация не объявляются выполненными. ## 12.5.259 — реальная ротация сертификата и подтверждённый откат (2026-10-15) @@ -314,27 +335,27 @@ Production backend/frontend ux-backups237 собраны и развёрнуты Следующий238 фиксирует уже выполненное длительное REST-наблюдение. Затем — S3 restore через реальный UI в пределах собственного bridge и retention. Полная конфигурация CHR, arbitrary PKI, другие ОС, public IPv6, multi-instance и внешние jobs не приняты этим блоком. -## Актуальная точка продолжения — 2026-10-14 +## Актуальная точка продолжения — 2026-10-15 Этапы0–11 завершены в локальных границах журнала. История выполненных внешних блоков и доказательства сохранены в [журнале](ux-ui-stage-12.md) и [протоколе](ux-ui-external-acceptance.md). Реальная Telegram доставка201 и Portal SSO195–199 приняты в описанных границах. Multi-instance, внешние аккаунты/клиентские ОС и оставшиеся профильные сетевые ограничения открыты. По поручению2026-10-09 работать укрупнёнными разделами, последовательно на текущей модели: карта возможностей → исправления → профильные тесты → build/deploy → собственные реальные сценарии → cleanup → один локальный коммит без push. Проверять квоту после завершённого раздела; незавершённые проверки явно переносить в журнал. -## Остаток приёмки по группам — 2026-10-14 +## Остаток приёмки по группам — 2026-10-15 -Этапы0–11 завершены в локальных границах. Этап12.5 открыт: ниже7 групп проверок, а не7 обещанных окон или точное число тестов. Детали и исторические ограничения сохраняются в [матрице](ux-ui-remaining-acceptance.md). +Этапы0–11 завершены в локальных границах. Этап12.5 открыт. Ниже семь групп охвата; это не семь обязательных новых этапов и не обещание числа окон. Принятые сценарии не запускать заново без изменения кода или найденного риска. Для расширения стенда отдельно нужны перечисленные условия. -| Группа | Что уже подтверждено | Оставшийся результат / что требуется | +| Группа | Подтверждено | Открытый объём / условие | | --- | --- | --- | -| REST и достоверность данных | Ошибки OSPF/BFD/BGP/GRE/WAN215–221 явные; latest API smoke222 прошёл | Причина единичных native401/500 неизвестна. Короткое независимое наблюдение возможно сейчас; оно не даст SLA | -| Клиентские ОС и внешняя сеть | CHR↔CHR/Linux, private IPv4/ULA и synthetic IPv6/IPFIX; Android full-tunnel/reconnect227 подтверждены пользователем | Windows/macOS/iOS VPN, расширенная Android приёмка, независимые WAN/multi-WAN и public IPv6; public IPv6 на текущем стенде отсутствует | -| Масштаб и длительная устойчивость | Контролируемые lock/dedupe/loss/recovery и короткие native проверки | Несколько backend/worker/writers, длительный rekey/REST/traffic, physical disconnect и maximum throughput | -| Внешние хранилища и jobs | Локальные API/errors/RBAC/owned SQL; реальные Portal1.3.1/Telegram195–201 и Selectel S3/client/API/ownSQL228–229 | Native S3 backup/restore/live UI/retention; provider/container/Gitea/MaxMind jobs с соответствующими endpoints/аккаунтами; private/paid credentials не выдумывать | -| Расширенные сетевые конфигурации | GRE/WG/VXLAN/IPsec/OSPF/BFD/BGP сценарии и точные границы записаны | from-pool/EUI-64/multiple-address import/export, outer IPv6, произвольная PKI/OID/policy/path-length и длительные переходы; BFD-only gate гарантией не стал | -| Общий UX, доступность и производительность | Полная UI192 исторически; latest backend25/UI52, scoped contrast/live218 и keyboard206 | Финальная свежая UI-регрессия перед выпуском, профильный performance и ручная accessibility/screen-reader приёмка; scoped axe не полный WCAG | -| Границы выпуска | План/доказательства/датированные блоки сохранены; коммиты локальные | Определить требуемые конфигурации и принять результат в этих границах; невыполненные варианты остаются явными ограничениями | +| REST и достоверность данных | Нативные наблюдения236/238; ограничение shared REST pools257,12 параллельных чтений двух CHR и25 backend-профилей прошли | Длительное наблюдение после transport fix; историческая причинность всех401/500 и сравнение версий RouterOS полностью не доказаны | +| Клиентские ОС и внешняя сеть | CHR↔CHR/Linux; Android StrongSwan full-tunnel и reconnect227 подтверждены пользователем | Windows/macOS/iOS и другие клиенты; независимые WAN/multi-WAN. Публичного IPv6 на предоставленном стенде нет — проверка требует другого подключения | +| Масштаб и устойчивость | Контролируемые PG lock/dedupe/loss/recovery, отдельные multi-process сценарии194/200/201 | Несколько полноценных backend/worker со всеми writers, длительный rekey/traffic, физические потери WAN/DB и maximum throughput | +| Хранилища и внешние jobs | Реальные Portal/Telegram195–201, Selectel S3/limited bridge restore/retention228–240, GeoIP mirror242; контейнеры248; production ACME250 и реальное renewal/rotation259 с trusted TLS/cleanup | Large native export/migration buckets/multi-instance S3; CA revocation отдельно не принят. Gitea publishing CI не запускался: действует no push. Direct licensed MaxMind отсутствует в текущей реализации | +| Расширенные сетевые конфигурации | GRE/WG/VXLAN/IPsec/OSPF/BFD/BGP в записанных сценариях, включая private IPv6 | from-pool/EUI-64/multiple-address import/export, outer IPv6, произвольная PKI/OID/path-length, независимые внешние peers и длительные переходы. BFD-only gate не гарантирован | +| UX, доступность и производительность | UI226, ARIA мастеров251, новая проверка260 текущего runtime описана выше | Исправления260 и72 live состояния приняты; оставшиеся12 экранов и ручная screen-reader приёмка отдельно. Synthetic timing не field CWV, scoped axe не полная WCAG сертификация | +| Границы выпуска | Датированный журнал, протоколы и локальные коммиты без push | Подготовить итоговый перечень принятых конфигураций/исключений для решения о выпуске; лабораторный успех не объявлять приёмкой всех конфигураций | -Portal offline JWT действует доexp после logout/role change; это принятая граница198, а не мгновенная revocation. Controlled Telegram unknown/retry201 не доказывает physical WAN lost ACK. User screenshots и vendor ReUI/theme сохранены. +Portal offline JWT действует доexp после logout/role change; это записанная граница198, не мгновенная revocation. Controlled Telegram unknown/retry201 не доказывает физическую потерю ACK в WAN. Архивные записи ниже отражают состояние на свою дату; актуальный статус задают эта таблица и верхняя точка продолжения. ## Цель и обязательные требования diff --git a/docs/ux-ui-progress.md b/docs/ux-ui-progress.md index bc79ae33..1a7d79d9 100644 --- a/docs/ux-ui-progress.md +++ b/docs/ux-ui-progress.md @@ -1,6 +1,6 @@ # UX/UI: журнал реализации -Актуальное продолжение 2026-10-15: 259 — реальный first issue и scheduler renewal приняты: trusted TLS сменил SHA-256, один logical leaf, старые native ID/fingerprint/private-key сохранены в архиве. Native/export/SSL/SQL/DNS восстановлены, private fixtures удалены. Runtime backend258/frontend251 healthy. Следующий260 — актуализировать остаток и выполнить профильную приёмку UX/доступности/производительности; этап12.5 открыт. +Актуальное продолжение 2026-10-15: 260 — исправлены общие focus/target-size/contrast и BGP320 tabs; production frontend ux-accessibility260-final развёрнут, backend258 healthy.72 live WCAG/layout состояния прошли,59 уникальных E2E прошли в записанных итерациях; synthetic timing сохранён. Следующий261 — оставшиеся12 экранов и точные границы приёмки; этап12.5 открыт. Общий план: [UX/UI по этапам и пятичасовым окнам](ux-ui-plan.md). План задаёт объём, этот журнал фиксирует выполненные блоки и ограничения. Записи расположены от новых к старым; подробная история этапа12 также сохранена в [ux-ui-stage-12.md](ux-ui-stage-12.md). @@ -36,7 +36,28 @@ | 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–259 в записанных границах. Реальная ротация/renewal259 и полный откат приняты. Runtime backend ux-certificates258/frontend ux-certificates251. Общая backend-регрессия257 и профиль сертификатов258 прошли. Следующий260 — актуальный остаток и профильная итоговая приёмка. | +| 12 | Итоговая доступность, адаптивность, производительность и регрессия | Локальная12.3.83; внешняя12.5 открыта, блоки1–260 в записанных границах. Ротация/renewal259 и откат приняты; общий UI260:72 live states passed. Runtime backend258/frontend260. Следующий261 — оставшиеся12 экранов и итоговые границы. | + +## 12.5.260 — общая доступность, клавиатура и профильная скорость UI (2026-10-15) + +Проведён read-only аудит18 разделов×2 темы×1440/320px:72 состояния текущего стенда/настоящий Portal UI, без response mocks. Baseline выявил23 состояния с axe нарушениями: недостаточная независимая pointer-area у focusable listbox-контейнера, контраст счётчиков SegmentedControl, raw type badges серверов и заголовка VXLAN. Document overflow0/JS errors0/API errors0; BGP320 имел2 внутренних переполнения main. Dashboard в baseline ещё содержал skeleton: его ранние timings не считаются готовностью данных. [Baseline](ux-ui/acceptance/ui260-baseline.json). + +ServerTileRail сохраняет существующие Item/ScrollArea/DataGrid/44px варианты: один Tab stop на option, стрелки/Home/End перемещают selection и DOM focus, включая переход через страницу50. Root больше не конкурирует с вложенными option за фокус/target. Первые2 новые keyboard tests обнаружили remount GrePageContent при смене server URL; короткий10s keyboard intent восстанавливает фокус на новом выбранном элементе, только если пользователь не сфокусировал другой control, и игнорирует скрытый rail. Настройки устройств/URL selection/API не изменены. + +TypeBadge переиспользует установленный ReUI Badge primary/info/success-light и text-foreground (как существующий rail), поскольку текущий dark success-foreground не прошёл4.5:1; vendor/style/theme не менялись, декоративные иконки скрыты от AT. У счётчиков снята opacity, заголовок VXLAN использует text-foreground. Вкладки BGP на узком экране имеют собственную горизонтальную прокрутку и не сжимаются. [Badge API](https://reui.io/docs/components/base/badge?ref=mcp), [preview](https://reui.io/components/badge?ref=mcp); audit checklist получен через MCP, выполнен в изменённых границах. + +Локально initial57 E2E:55 passed/2 keyboard failed; после исправления remount rerun6 (2 keyboard+4 GRE/VXLAN) passed. Затем добавлены2 contrast tests всех3 типов серверов; final shared4 (2 contrast+2 keyboard) passed. Это59 уникальных принятых случаев; повторные прогоны не прибавляются к числу сценариев; initial отказ сохранён в сводке. Проверены серверные операции/отказы/RBAC/формы, BGP data states, GRE/VXLAN layout и backup layout. TypeScript/scoped ESLint passed. Production frontend build passed,528 source files matched; финальный образ ux-accessibility260-final развёрнут, backend258/DB/Portal сохранены. + +Первый live recheck72 оставил2 color-contrast failures только на servers/dark; прочие70 прошли. После text-foreground final server recheck4 прошёл. Итоговое покрытие72 уникальных состояний объединено с явным происхождением результатов, а не выдано за76 разных случаев: axe WCAG2/2.1/2.2 tagged violations0, document/main overflow0, JS/API errors0, blocked writes0. Для data pages сначала ожидаются200 required endpoint responses; dashboard после этого skeleton0. Synthetic main-visible p50/p95=548/1052ms; required API response p50/p95=1033/2494ms. Это один Edge/headless lab run через SSH, без throttling, стандартный viewport snapshot; не field CWV/maximum load/полная ручная AT сертификация. [Полный протокол](ux-ui/acceptance/ui260-final.json), [сводка](ux-ui/acceptance/ui260-summary.json). + +Визуально просмотрены screenshots servers1440 и BGP320. На BGP320 подписи KPI ещё сокращаются; эту отдельную проблему читаемости включить в261 вместе с оставшимися экранами, не считать её проверенной axe. + +| Референс | Схема и экран | +| --- | --- | +| [ReUI Badge](https://reui.io/components/badge?ref=mcp) | Тип устройства → semantic variant → читаемая подпись; [servers1440](ux-ui/screens/ui260-servers.png) | +| [ReUI Frame](https://reui.io/components/frame?ref=mcp) | Узкий экран → прокрутка вкладок → выбранный раздел; [BGP320](ux-ui/screens/ui260-bgp.png) | + +Устройства не перенастраивались; новых native объектов/DNS/ACME не создавали. Текущая матрица исправлена: containers248 и ACME issue250/renewal259 приняты, старое отсутствие пакета/токена больше не записано как blocker. Семь групп описывают охват, не обязательные семь новых этапов. Следующий261 —12 оставшихся default screens: users/firewall/probes/terminal/data-collection/recursive-routes/route-optimizer/network-map/ip-ranges/asns/communities/domains; затем актуальные границы выпуска. Новая реализация CA revoke/MaxMind или внешняя публикация не объявляются выполненными. ## 12.5.259 — реальная ротация сертификата и подтверждённый откат (2026-10-15) diff --git a/docs/ux-ui-remaining-acceptance.md b/docs/ux-ui-remaining-acceptance.md index 596ef729..ae3a89b6 100644 --- a/docs/ux-ui-remaining-acceptance.md +++ b/docs/ux-ui-remaining-acceptance.md @@ -1,10 +1,31 @@ -# Оставшаяся внешняя приёмка — 2026-10-14 +# Оставшаяся внешняя приёмка — 2026-10-15 -Актуальное продолжение 2026-10-15: 259 — реальный first issue и scheduler renewal приняты: trusted TLS сменил SHA-256, один logical leaf, старые native ID/fingerprint/private-key сохранены в архиве. Native/export/SSL/SQL/DNS восстановлены, private fixtures удалены. Runtime backend258/frontend251 healthy. Следующий260 — актуализировать остаток и выполнить профильную приёмку UX/доступности/производительности; этап12.5 открыт. +Актуальное продолжение 2026-10-15: 260 — исправлены общие focus/target-size/contrast и BGP320 tabs; production frontend ux-accessibility260-final развёрнут, backend258 healthy.72 live WCAG/layout состояния прошли,59 уникальных E2E прошли в записанных итерациях; synthetic timing сохранён. Следующий261 — оставшиеся12 экранов и точные границы приёмки; этап12.5 открыт. -Это актуальная матрица после 12.5.259. Исторические записи сохраняют версии и ограничения на момент выполнения; поздние проверки ниже уточняют их. Этап 12.5 открыт. Успех в двух CHR и одном backend не означает приёмку всех конфигураций, интеграций или полной регрессии. +Это актуальная матрица после 12.5.260. Исторические записи сохраняют версии и ограничения на момент выполнения; поздние проверки ниже уточняют их. Этап 12.5 открыт. Успех в двух CHR и одном backend не означает приёмку всех конфигураций, интеграций или полной регрессии. -Стенд: Debian13/Compose, PostgreSQL18.6, два CHR RouterOS7.24.5. Backend `ux-certificates258`, frontend `ux-certificates251`; production lab с195 использует AUTH_REQUIRED=true и Portal1.3.1. Подписанные JWT/RBAC проверялись в изолированных процессах. Все собственные объекты112 удалены, исходные13 коллекций×2 (включая logging/certificates/files/routes) проверены; пароли не менялись. +Стенд: Debian13/Compose, PostgreSQL18.6, два CHR RouterOS7.24.5. Backend `ux-certificates258`, frontend `ux-accessibility260-final`; production lab с195 использует AUTH_REQUIRED=true и Portal1.3.1. Подписанные JWT/RBAC проверялись в изолированных процессах. Все собственные объекты112 удалены, исходные13 коллекций×2 (включая logging/certificates/files/routes) проверены; пароли не менялись. + +## 12.5.260 — общая доступность, клавиатура и профильная скорость UI (2026-10-15) + +Проведён read-only аудит18 разделов×2 темы×1440/320px:72 состояния текущего стенда/настоящий Portal UI, без response mocks. Baseline выявил23 состояния с axe нарушениями: недостаточная независимая pointer-area у focusable listbox-контейнера, контраст счётчиков SegmentedControl, raw type badges серверов и заголовка VXLAN. Document overflow0/JS errors0/API errors0; BGP320 имел2 внутренних переполнения main. Dashboard в baseline ещё содержал skeleton: его ранние timings не считаются готовностью данных. [Baseline](ux-ui/acceptance/ui260-baseline.json). + +ServerTileRail сохраняет существующие Item/ScrollArea/DataGrid/44px варианты: один Tab stop на option, стрелки/Home/End перемещают selection и DOM focus, включая переход через страницу50. Root больше не конкурирует с вложенными option за фокус/target. Первые2 новые keyboard tests обнаружили remount GrePageContent при смене server URL; короткий10s keyboard intent восстанавливает фокус на новом выбранном элементе, только если пользователь не сфокусировал другой control, и игнорирует скрытый rail. Настройки устройств/URL selection/API не изменены. + +TypeBadge переиспользует установленный ReUI Badge primary/info/success-light и text-foreground (как существующий rail), поскольку текущий dark success-foreground не прошёл4.5:1; vendor/style/theme не менялись, декоративные иконки скрыты от AT. У счётчиков снята opacity, заголовок VXLAN использует text-foreground. Вкладки BGP на узком экране имеют собственную горизонтальную прокрутку и не сжимаются. [Badge API](https://reui.io/docs/components/base/badge?ref=mcp), [preview](https://reui.io/components/badge?ref=mcp); audit checklist получен через MCP, выполнен в изменённых границах. + +Локально initial57 E2E:55 passed/2 keyboard failed; после исправления remount rerun6 (2 keyboard+4 GRE/VXLAN) passed. Затем добавлены2 contrast tests всех3 типов серверов; final shared4 (2 contrast+2 keyboard) passed. Это59 уникальных принятых случаев; повторные прогоны не прибавляются к числу сценариев; initial отказ сохранён в сводке. Проверены серверные операции/отказы/RBAC/формы, BGP data states, GRE/VXLAN layout и backup layout. TypeScript/scoped ESLint passed. Production frontend build passed,528 source files matched; финальный образ ux-accessibility260-final развёрнут, backend258/DB/Portal сохранены. + +Первый live recheck72 оставил2 color-contrast failures только на servers/dark; прочие70 прошли. После text-foreground final server recheck4 прошёл. Итоговое покрытие72 уникальных состояний объединено с явным происхождением результатов, а не выдано за76 разных случаев: axe WCAG2/2.1/2.2 tagged violations0, document/main overflow0, JS/API errors0, blocked writes0. Для data pages сначала ожидаются200 required endpoint responses; dashboard после этого skeleton0. Synthetic main-visible p50/p95=548/1052ms; required API response p50/p95=1033/2494ms. Это один Edge/headless lab run через SSH, без throttling, стандартный viewport snapshot; не field CWV/maximum load/полная ручная AT сертификация. [Полный протокол](ux-ui/acceptance/ui260-final.json), [сводка](ux-ui/acceptance/ui260-summary.json). + +Визуально просмотрены screenshots servers1440 и BGP320. На BGP320 подписи KPI ещё сокращаются; эту отдельную проблему читаемости включить в261 вместе с оставшимися экранами, не считать её проверенной axe. + +| Референс | Схема и экран | +| --- | --- | +| [ReUI Badge](https://reui.io/components/badge?ref=mcp) | Тип устройства → semantic variant → читаемая подпись; [servers1440](ux-ui/screens/ui260-servers.png) | +| [ReUI Frame](https://reui.io/components/frame?ref=mcp) | Узкий экран → прокрутка вкладок → выбранный раздел; [BGP320](ux-ui/screens/ui260-bgp.png) | + +Устройства не перенастраивались; новых native объектов/DNS/ACME не создавали. Текущая матрица исправлена: containers248 и ACME issue250/renewal259 приняты, старое отсутствие пакета/токена больше не записано как blocker. Семь групп описывают охват, не обязательные семь новых этапов. Следующий261 —12 оставшихся default screens: users/firewall/probes/terminal/data-collection/recursive-routes/route-optimizer/network-map/ip-ranges/asns/communities/domains; затем актуальные границы выпуска. Новая реализация CA revoke/MaxMind или внешняя публикация не объявляются выполненными. ## 12.5.259 — реальная ротация сертификата и подтверждённый откат (2026-10-15) @@ -316,21 +337,21 @@ Production backend/frontend ux-backups237 собраны и развёрнуты Следующий238 фиксирует уже выполненное длительное REST-наблюдение. Затем — S3 restore через реальный UI в пределах собственного bridge и retention. Полная конфигурация CHR, arbitrary PKI, другие ОС, public IPv6, multi-instance и внешние jobs не приняты этим блоком. -## Остаток приёмки по группам — 2026-10-14 +## Остаток приёмки по группам — 2026-10-15 -Этапы0–11 завершены в локальных границах. Этап12.5 открыт: ниже7 групп проверок, а не7 обещанных окон или точное число тестов. Детали и исторические ограничения сохраняются в [матрице](ux-ui-remaining-acceptance.md). +Этапы0–11 завершены в локальных границах. Этап12.5 открыт. Ниже семь групп охвата; это не семь обязательных новых этапов и не обещание числа окон. Принятые сценарии не запускать заново без изменения кода или найденного риска. Для расширения стенда отдельно нужны перечисленные условия. -| Группа | Что уже подтверждено | Оставшийся результат / что требуется | +| Группа | Подтверждено | Открытый объём / условие | | --- | --- | --- | -| REST и достоверность данных | Ошибки OSPF/BFD/BGP/GRE/WAN215–221 явные; latest API smoke222 прошёл | Correlated236:384 samples/40 diagnostics без отказов; current policies/address/load исправны.828/304 retained REST sessions и vendor inactive-session fix — гипотеза; 238:763.844s/624samples/24diagnostics все200, API records изменились без отказа; причинность401/500 и version control остаются открытыми | -| Клиентские ОС и внешняя сеть | CHR↔CHR/Linux, private IPv4/ULA и synthetic IPv6/IPFIX; Android full-tunnel/reconnect227 подтверждены пользователем | Windows/macOS/iOS VPN, расширенная Android приёмка, независимые WAN/multi-WAN и public IPv6; public IPv6 на текущем стенде отсутствует | -| Масштаб и длительная устойчивость | Контролируемые lock/dedupe/loss/recovery и короткие native проверки | Несколько backend/worker/writers, длительный rekey/REST/traffic, physical disconnect и maximum throughput | -| Внешние хранилища и jobs | Portal/Telegram195–201; native S3230, persistence235, missing UX237, bridge-only live restore239, isolated retention240; real GeoIP mirror242; availability243 | Large native export только HTTP fixture; migration buckets/multi-instance. Containers:feature=true, package не обнаружен,/container400 — нужны package/lifecycle. ACME:no token/zone, нужен test-domain/scoped Cloudflare/staging. Gitea:local dry-run принят; publishing CI не запускался (no push). Direct licensed MaxMind не реализован | -| Расширенные сетевые конфигурации | GRE/WG/VXLAN/IPsec/OSPF/BFD/BGP сценарии и точные границы записаны | from-pool/EUI-64/multiple-address import/export, outer IPv6, произвольная PKI/OID/policy/path-length и длительные переходы; BFD-only gate гарантией не стал | -| Общий UX, доступность и производительность | Полная UI192 исторически; latest backend25/UI52, scoped contrast/live218 и keyboard206 | Свежая UI226 принята в записанных границах; профильный performance и ручная accessibility/screen-reader приёмка; scoped axe не полный WCAG | -| Границы выпуска | План/доказательства/датированные блоки сохранены; коммиты локальные | Определить требуемые конфигурации и принять результат в этих границах; невыполненные варианты остаются явными ограничениями | +| REST и достоверность данных | Нативные наблюдения236/238; ограничение shared REST pools257,12 параллельных чтений двух CHR и25 backend-профилей прошли | Длительное наблюдение после transport fix; историческая причинность всех401/500 и сравнение версий RouterOS полностью не доказаны | +| Клиентские ОС и внешняя сеть | CHR↔CHR/Linux; Android StrongSwan full-tunnel и reconnect227 подтверждены пользователем | Windows/macOS/iOS и другие клиенты; независимые WAN/multi-WAN. Публичного IPv6 на предоставленном стенде нет — проверка требует другого подключения | +| Масштаб и устойчивость | Контролируемые PG lock/dedupe/loss/recovery, отдельные multi-process сценарии194/200/201 | Несколько полноценных backend/worker со всеми writers, длительный rekey/traffic, физические потери WAN/DB и maximum throughput | +| Хранилища и внешние jobs | Реальные Portal/Telegram195–201, Selectel S3/limited bridge restore/retention228–240, GeoIP mirror242; контейнеры248; production ACME250 и реальное renewal/rotation259 с trusted TLS/cleanup | Large native export/migration buckets/multi-instance S3; CA revocation отдельно не принят. Gitea publishing CI не запускался: действует no push. Direct licensed MaxMind отсутствует в текущей реализации | +| Расширенные сетевые конфигурации | GRE/WG/VXLAN/IPsec/OSPF/BFD/BGP в записанных сценариях, включая private IPv6 | from-pool/EUI-64/multiple-address import/export, outer IPv6, произвольная PKI/OID/path-length, независимые внешние peers и длительные переходы. BFD-only gate не гарантирован | +| UX, доступность и производительность | UI226, ARIA мастеров251, новая проверка260 текущего runtime описана выше | Исправления260 и72 live состояния приняты; оставшиеся12 экранов и ручная screen-reader приёмка отдельно. Synthetic timing не field CWV, scoped axe не полная WCAG сертификация | +| Границы выпуска | Датированный журнал, протоколы и локальные коммиты без push | Подготовить итоговый перечень принятых конфигураций/исключений для решения о выпуске; лабораторный успех не объявлять приёмкой всех конфигураций | -Portal offline JWT действует доexp после logout/role change; это принятая граница198, а не мгновенная revocation. Controlled Telegram unknown/retry201 не доказывает physical WAN lost ACK. User screenshots и vendor ReUI/theme сохранены. +Portal offline JWT действует доexp после logout/role change; это записанная граница198, не мгновенная revocation. Controlled Telegram unknown/retry201 не доказывает физическую потерю ACK в WAN. Архивные записи ниже отражают состояние на свою дату; актуальный статус задают эта таблица и верхняя точка продолжения. | Раздел | Подтверждено | Осталось / условие завершения | | --- | --- | --- | @@ -345,14 +366,14 @@ Portal offline JWT действует доexp после logout/role change; э | BGP | Established83, exact /32 exchange/API/UI/administrative withdrawal92, BFD primary GRE loss/alternate/recovery93; basic native IPv6 eBGP/AFI/NLRI/Ping/withdrawal/API/UI155; native IPv6 BGP/BFD scoped withdrawal/recovery160; private4-byte ASN/as4/API/UI162 | Hold timer/TCP loss безBFD принят104; packet loss в переходе, разные внешние peers/WAN policy, basic BFDv6 принят160; IPv6 outer/public WAN/scale. Два логических пути используют тот же public WAN; physical redundancy не принята | | Recursive routes | Production PUT/change/own history restore88, disabled guards, partial/unknown/applied outcomes, live формы/контекст | Автоматический rollback/retry, durable receipts и несколько экземпляров отсутствуют; PUT не является idempotent noop. Полная произвольная legacy catalog миграция не принята | | Diagnostics/terminal | Allowlist/native reads, Ping/trace/route/MTU/DNS, actual avg-rtt, disabled guards, JWT/live PC/mobile89; real default memory tail/log limits/API/UI133 | DNS использует backend resolver; MTU — ограниченная оценка, не гарантированный максимум. Stop ожидания не доказывает остановку RouterOS команды; arbitrary CLI и physical disconnect не приняты | -| Portal/интеграции | Portal1.3.1/issuer/login/RBAC/expiry/context195–199, actual Telegram201; Selectel S3 native/API/live limited restore/retention228–240; real GeoIP mirror242 | Offline JWT сохраняетдоступ доexp; S3 large-native/migration/multi-instance отдельно; containers lifecycle248 принят в записанных границах; ACME issuance250 принят; automatic renewal/CA revoke и remote Gitea publishing не приняты; direct licensed MaxMind не реализован. ClientOS/scale/WAN отдельно | +| Portal/интеграции | Portal1.3.1/issuer/login/RBAC/expiry/context195–199, actual Telegram201; Selectel S3 native/API/live limited restore/retention228–240; real GeoIP mirror242 | Offline JWT сохраняетдоступ доexp; S3 large-native/migration/multi-instance отдельно; containers lifecycle248 принят в записанных границах; ACME issuance250 принят; automatic renewal/rotation259 приняты в конкретном сценарии; CA revoke и remote Gitea publishing не приняты; direct licensed MaxMind не реализован. ClientOS/scale/WAN отдельно | | Общая приёмка | Локальная12.3.83; UI1244/context221/compiled984 parity139; профильные build/E2E/live проверки последующих блоков | Traffic initial live mock-id gate passed141; IPv6 special ranges/cache passed142; unknown RIPE coordinates passed143; IPv6 synthetic UDP/worker/SQL passed144; native CHR ULA/IPFIX/API/UI passed145; ICMPv6/IPv6 endpoint labels passed146; HTTP DTO validation passed147; scoped flow catalog/serverId guards passed148; strict monthly calendar passed149; Sessions labels passed150; application GRE static IPv6 lifecycle151 passed; WireGuard static IPv6 lifecycle152 и disabled SQL/API gates passed; OSPF/BFD boundary/warning153 passed; OSPFv3 routes154 accepted in recorded bounds; BGP IPv6 basic155 passed; bigint ID/SQL guards156 passed; общая UI1260/context221/backend24 regression157 passed; IPv6 BFD correlation158 profile/deployed passed; native OSPFv3/BFDv6 boundary/recovery159 passed; BGP IPv6/BFD withdrawal/recovery160 passed; selected BGP/alert unknown guards161 replay/profiles/deployed passed (SQL stability skipped); private4-byte ASN162 native/API/UI passed; duplicate BGP alert keys163 replay/profiles/deployed passed; nullable selected BGP164 replay/profiles/API/UI passed; collector165 parallel/current guards/read-only PG passed; positive partial/error SQL166/full24 with PG passed (optional network SQL not repeated); GRE/BGP freshness167/SQL8 passed; other source audit168 выявил identity/disabled/freshness gaps; локальный server/traffic identity guard169 passed без SQL/deploy, source/per-probe/freshness170/ownSQL16/compiled1008/deployed passed; source diagnostics171/42E2E/ownSQL metadata/live2 passed; monitoring history172/ownSQL26/compiled1020/deployed passed; Ping known/error173/ownHTTP-SQL8/85uniqueE2E/native4/4/deployed passed; traffic confidence174 baseline reproduced/local guard passed; owned SQL9/9358ms/deploy175/1024compiled/live smoke passed; legacy history/provenance open; compound RTT176 local/native replay2 passed, SQL10/deploy177/1024compiled/live smoke passed; history178/legacy provenance/current TTL/manual truth/SQL9+14/35unique E2E/native GET/deployed passed; live179 complete/disable-config/bounded fallback/ownSQL10/nativeSSE2/liveUI2 passed; volume180 exact/unit marker/ownSQL6/18E2E/API/liveUI/deployed passed; binding status181 native/ownSQL9/8E2E/deployed passed; peer atomicity182 ownSQL3/native/API/UI passed; peer failure warning183 ownSQL2/4E2E/deployed passed; inactive history184 ownSQL2/deployed passed; gap185/identity186/restore187/wave188/sourceguard189/confirmed peak190 passed; aggregate peaks191, request dedupe193, cross-process lock194/200, full regression192 (1286 unique E2E и25-й профиль privacy196 scoped), Portal195–199/Telegram201 passed; последующие изменения проверять отдельно; scoped axe не означает полную WCAG сертификацию | Доказательства и точные ограничения: [полная история этапа12](ux-ui-stage-12.md), [внешний протокол](ux-ui-external-acceptance.md), [BGP93](ux-ui/acceptance/bgp-failover-2026-10-10.json), [паспорт стенда](ux-ui-test-server.md). Невыполненные пункты не являются все блокерами данного лабораторного сценария: для выпуска необходимо явно определить требуемые конфигурации и принять их либо согласовать ограничение. -## Следующая последовательность — 2026-10-14 +## Следующая последовательность — 2026-10-15 -1. **Приёмка260:** обновить актуальный остаток без устаревших blockers; профильный UX/a11y/performance контроль текущего runtime. Реальная ротация и откат259 приняты. +1. **Приёмка261:**12 оставшихся default screens с real Portal/API и точным read-only guard; профильный audit/layout/performance. Сертификаты259 и UI260 приняты в записанных границах. 2. **Профильный контроль:** для новых изменений выполнять затронутые SQL/API/UI проверки. Общая регрессия192 выполнена; не повторять её без изменений общей основы или нового основания. 3. **Внешние зависимости:** Portal issuer/login/revoke, Telegram bot/chat/разрешённое сообщение, клиентские ОС, независимые WAN/public IPv6 и scale/multi-instance — отдельные группы по таблице выше. Ограничения текущего стенда не превращать в обещание приёмки всех конфигураций. diff --git a/docs/ux-ui-stage-12.md b/docs/ux-ui-stage-12.md index a4cabb6f..3868ea1a 100644 --- a/docs/ux-ui-stage-12.md +++ b/docs/ux-ui-stage-12.md @@ -1,6 +1,6 @@ # Этап 12: итоговая приёмка UX/UI -Актуальное продолжение 2026-10-15: 259 — реальный first issue и scheduler renewal приняты: trusted TLS сменил SHA-256, один logical leaf, старые native ID/fingerprint/private-key сохранены в архиве. Native/export/SSL/SQL/DNS восстановлены, private fixtures удалены. Runtime backend258/frontend251 healthy. Следующий260 — актуализировать остаток и выполнить профильную приёмку UX/доступности/производительности; этап12.5 открыт. +Актуальное продолжение 2026-10-15: 260 — исправлены общие focus/target-size/contrast и BGP320 tabs; production frontend ux-accessibility260-final развёрнут, backend258 healthy.72 live WCAG/layout состояния прошли,59 уникальных E2E прошли в записанных итерациях; synthetic timing сохранён. Следующий261 — оставшиеся12 экранов и точные границы приёмки; этап12.5 открыт. План: [ux-ui-plan.md](ux-ui-plan.md). Фактические результаты: [ux-ui-progress.md](ux-ui-progress.md). Подготовлен после сводных проверок 11Б; завершение каждого блока требует локального коммита без push. @@ -4152,6 +4152,27 @@ Real Portal/browser API, provider local verified: создан один job ро Runtime backend ux-backup234/frontend ux-routing218 healthy; новое application image для volume-only fix не требовалось. Пароли CHR не менялись, S3 mutations0 в235, configs body/JWT не опубликованы, private local manifest удалён. Исходные10 missing local files не восстановлены и records не удалены. Force-recreate — не host reboot/power loss/fsync/DR приёмка. Далее236 — UX недоступных local files, затем version retention границы и оставшиеся7 группы матрицы; multi-instance guard не принимается. Этап12.5 открыт. +## 12.5.260 — общая доступность, клавиатура и профильная скорость UI (2026-10-15) + +Проведён read-only аудит18 разделов×2 темы×1440/320px:72 состояния текущего стенда/настоящий Portal UI, без response mocks. Baseline выявил23 состояния с axe нарушениями: недостаточная независимая pointer-area у focusable listbox-контейнера, контраст счётчиков SegmentedControl, raw type badges серверов и заголовка VXLAN. Document overflow0/JS errors0/API errors0; BGP320 имел2 внутренних переполнения main. Dashboard в baseline ещё содержал skeleton: его ранние timings не считаются готовностью данных. [Baseline](ux-ui/acceptance/ui260-baseline.json). + +ServerTileRail сохраняет существующие Item/ScrollArea/DataGrid/44px варианты: один Tab stop на option, стрелки/Home/End перемещают selection и DOM focus, включая переход через страницу50. Root больше не конкурирует с вложенными option за фокус/target. Первые2 новые keyboard tests обнаружили remount GrePageContent при смене server URL; короткий10s keyboard intent восстанавливает фокус на новом выбранном элементе, только если пользователь не сфокусировал другой control, и игнорирует скрытый rail. Настройки устройств/URL selection/API не изменены. + +TypeBadge переиспользует установленный ReUI Badge primary/info/success-light и text-foreground (как существующий rail), поскольку текущий dark success-foreground не прошёл4.5:1; vendor/style/theme не менялись, декоративные иконки скрыты от AT. У счётчиков снята opacity, заголовок VXLAN использует text-foreground. Вкладки BGP на узком экране имеют собственную горизонтальную прокрутку и не сжимаются. [Badge API](https://reui.io/docs/components/base/badge?ref=mcp), [preview](https://reui.io/components/badge?ref=mcp); audit checklist получен через MCP, выполнен в изменённых границах. + +Локально initial57 E2E:55 passed/2 keyboard failed; после исправления remount rerun6 (2 keyboard+4 GRE/VXLAN) passed. Затем добавлены2 contrast tests всех3 типов серверов; final shared4 (2 contrast+2 keyboard) passed. Это59 уникальных принятых случаев; повторные прогоны не прибавляются к числу сценариев; initial отказ сохранён в сводке. Проверены серверные операции/отказы/RBAC/формы, BGP data states, GRE/VXLAN layout и backup layout. TypeScript/scoped ESLint passed. Production frontend build passed,528 source files matched; финальный образ ux-accessibility260-final развёрнут, backend258/DB/Portal сохранены. + +Первый live recheck72 оставил2 color-contrast failures только на servers/dark; прочие70 прошли. После text-foreground final server recheck4 прошёл. Итоговое покрытие72 уникальных состояний объединено с явным происхождением результатов, а не выдано за76 разных случаев: axe WCAG2/2.1/2.2 tagged violations0, document/main overflow0, JS/API errors0, blocked writes0. Для data pages сначала ожидаются200 required endpoint responses; dashboard после этого skeleton0. Synthetic main-visible p50/p95=548/1052ms; required API response p50/p95=1033/2494ms. Это один Edge/headless lab run через SSH, без throttling, стандартный viewport snapshot; не field CWV/maximum load/полная ручная AT сертификация. [Полный протокол](ux-ui/acceptance/ui260-final.json), [сводка](ux-ui/acceptance/ui260-summary.json). + +Визуально просмотрены screenshots servers1440 и BGP320. На BGP320 подписи KPI ещё сокращаются; эту отдельную проблему читаемости включить в261 вместе с оставшимися экранами, не считать её проверенной axe. + +| Референс | Схема и экран | +| --- | --- | +| [ReUI Badge](https://reui.io/components/badge?ref=mcp) | Тип устройства → semantic variant → читаемая подпись; [servers1440](ux-ui/screens/ui260-servers.png) | +| [ReUI Frame](https://reui.io/components/frame?ref=mcp) | Узкий экран → прокрутка вкладок → выбранный раздел; [BGP320](ux-ui/screens/ui260-bgp.png) | + +Устройства не перенастраивались; новых native объектов/DNS/ACME не создавали. Текущая матрица исправлена: containers248 и ACME issue250/renewal259 приняты, старое отсутствие пакета/токена больше не записано как blocker. Семь групп описывают охват, не обязательные семь новых этапов. Следующий261 —12 оставшихся default screens: users/firewall/probes/terminal/data-collection/recursive-routes/route-optimizer/network-map/ip-ranges/asns/communities/domains; затем актуальные границы выпуска. Новая реализация CA revoke/MaxMind или внешняя публикация не объявляются выполненными. + ## 12.5.259 — реальная ротация сертификата и подтверждённый откат (2026-10-15) По сохранённому разрешению254 выполнен тот же exact mmt253-8e62a941.pngs.top на104.165.244.7. Перед началом снят свежий приватный native/export/SSL/files/SQL baseline; own certificate/files/jobs/DNS0, Cloudflare token/zone/account проверены. Renewal временно выключен. Подготовленный backend258 активирован; frontend251/Portal/DB сохранены, backend healthy. [Развёртывание](ux-ui/acceptance/acme259-deployment.json). diff --git a/docs/ux-ui-test-server.md b/docs/ux-ui-test-server.md index 24936032..dd636915 100644 --- a/docs/ux-ui-test-server.md +++ b/docs/ux-ui-test-server.md @@ -1,6 +1,6 @@ # Тестовый сервер UX/UI — 2026-10-10 -Актуальное продолжение 2026-10-15: 259 — реальный first issue и scheduler renewal приняты: trusted TLS сменил SHA-256, один logical leaf, старые native ID/fingerprint/private-key сохранены в архиве. Native/export/SSL/SQL/DNS восстановлены, private fixtures удалены. Runtime backend258/frontend251 healthy. Следующий260 — актуализировать остаток и выполнить профильную приёмку UX/доступности/производительности; этап12.5 открыт. +Актуальное продолжение 2026-10-15: 260 — исправлены общие focus/target-size/contrast и BGP320 tabs; production frontend ux-accessibility260-final развёрнут, backend258 healthy.72 live WCAG/layout состояния прошли,59 уникальных E2E прошли в записанных итерациях; synthetic timing сохранён. Следующий261 — оставшиеся12 экранов и точные границы приёмки; этап12.5 открыт. | Параметр | Проверенное состояние | | --- | --- | @@ -14,7 +14,7 @@ | PostgreSQL | postgres:18-alpine,18.6;mmapp-test-postgres healthy;SELECT version() passed | | Данные | Отдельный Compose project mmapp-test,том mmapp-test_mmapp-pgdata и каталог ./data | | Доступ | PostgreSQL не публикуется;frontend3000/backend8000 привязаны к127.0.0.1 после запуска | -| Образы приложения | mmapp-test/backend:ux-certificates258 и mmapp-test/frontend:ux-certificates251; backend healthy, проверено2026-10-15 в259 | +| Образы приложения | mmapp-test/backend:ux-certificates258 и mmapp-test/frontend:ux-accessibility260-final; backend healthy, проверено2026-10-15 в260 | Compose SHA256:3052bd6ab5d9865f97605cebfb5ff27a4410cd3357b81153a65a87fb7c92582f. OptionalBACKEND_IMAGE_TAG позволяетобновлятьbackendотдельно. Локальный и удалённый файлы совпали. Шаблоны: [Compose](../deploy/docker-compose.test.yml), [env без секретов](../deploy/env.test.example). @@ -34,6 +34,27 @@ OSPF84: real GRE Full adjacency/private routes/Ping3/3 и4 live PC/320px URL/bro BFD85: Up/Full/own route/Ping,4 live UI и loss/withdrawal/recovery приняты; exact own cleanup8 коллекций×2 passed. Withdrawal5,245ms не подтверждает sub-second BFD timing; этот вопрос открыт. Runtime routing83 без новой сборки. [Отчёт](ux-ui/acceptance/ospf-bfd-loss-2026-10-09.json). +## 12.5.260 — общая доступность, клавиатура и профильная скорость UI (2026-10-15) + +Проведён read-only аудит18 разделов×2 темы×1440/320px:72 состояния текущего стенда/настоящий Portal UI, без response mocks. Baseline выявил23 состояния с axe нарушениями: недостаточная независимая pointer-area у focusable listbox-контейнера, контраст счётчиков SegmentedControl, raw type badges серверов и заголовка VXLAN. Document overflow0/JS errors0/API errors0; BGP320 имел2 внутренних переполнения main. Dashboard в baseline ещё содержал skeleton: его ранние timings не считаются готовностью данных. [Baseline](ux-ui/acceptance/ui260-baseline.json). + +ServerTileRail сохраняет существующие Item/ScrollArea/DataGrid/44px варианты: один Tab stop на option, стрелки/Home/End перемещают selection и DOM focus, включая переход через страницу50. Root больше не конкурирует с вложенными option за фокус/target. Первые2 новые keyboard tests обнаружили remount GrePageContent при смене server URL; короткий10s keyboard intent восстанавливает фокус на новом выбранном элементе, только если пользователь не сфокусировал другой control, и игнорирует скрытый rail. Настройки устройств/URL selection/API не изменены. + +TypeBadge переиспользует установленный ReUI Badge primary/info/success-light и text-foreground (как существующий rail), поскольку текущий dark success-foreground не прошёл4.5:1; vendor/style/theme не менялись, декоративные иконки скрыты от AT. У счётчиков снята opacity, заголовок VXLAN использует text-foreground. Вкладки BGP на узком экране имеют собственную горизонтальную прокрутку и не сжимаются. [Badge API](https://reui.io/docs/components/base/badge?ref=mcp), [preview](https://reui.io/components/badge?ref=mcp); audit checklist получен через MCP, выполнен в изменённых границах. + +Локально initial57 E2E:55 passed/2 keyboard failed; после исправления remount rerun6 (2 keyboard+4 GRE/VXLAN) passed. Затем добавлены2 contrast tests всех3 типов серверов; final shared4 (2 contrast+2 keyboard) passed. Это59 уникальных принятых случаев; повторные прогоны не прибавляются к числу сценариев; initial отказ сохранён в сводке. Проверены серверные операции/отказы/RBAC/формы, BGP data states, GRE/VXLAN layout и backup layout. TypeScript/scoped ESLint passed. Production frontend build passed,528 source files matched; финальный образ ux-accessibility260-final развёрнут, backend258/DB/Portal сохранены. + +Первый live recheck72 оставил2 color-contrast failures только на servers/dark; прочие70 прошли. После text-foreground final server recheck4 прошёл. Итоговое покрытие72 уникальных состояний объединено с явным происхождением результатов, а не выдано за76 разных случаев: axe WCAG2/2.1/2.2 tagged violations0, document/main overflow0, JS/API errors0, blocked writes0. Для data pages сначала ожидаются200 required endpoint responses; dashboard после этого skeleton0. Synthetic main-visible p50/p95=548/1052ms; required API response p50/p95=1033/2494ms. Это один Edge/headless lab run через SSH, без throttling, стандартный viewport snapshot; не field CWV/maximum load/полная ручная AT сертификация. [Полный протокол](ux-ui/acceptance/ui260-final.json), [сводка](ux-ui/acceptance/ui260-summary.json). + +Визуально просмотрены screenshots servers1440 и BGP320. На BGP320 подписи KPI ещё сокращаются; эту отдельную проблему читаемости включить в261 вместе с оставшимися экранами, не считать её проверенной axe. + +| Референс | Схема и экран | +| --- | --- | +| [ReUI Badge](https://reui.io/components/badge?ref=mcp) | Тип устройства → semantic variant → читаемая подпись; [servers1440](ux-ui/screens/ui260-servers.png) | +| [ReUI Frame](https://reui.io/components/frame?ref=mcp) | Узкий экран → прокрутка вкладок → выбранный раздел; [BGP320](ux-ui/screens/ui260-bgp.png) | + +Устройства не перенастраивались; новых native объектов/DNS/ACME не создавали. Текущая матрица исправлена: containers248 и ACME issue250/renewal259 приняты, старое отсутствие пакета/токена больше не записано как blocker. Семь групп описывают охват, не обязательные семь новых этапов. Следующий261 —12 оставшихся default screens: users/firewall/probes/terminal/data-collection/recursive-routes/route-optimizer/network-map/ip-ranges/asns/communities/domains; затем актуальные границы выпуска. Новая реализация CA revoke/MaxMind или внешняя публикация не объявляются выполненными. + ## 12.5.259 — реальная ротация сертификата и подтверждённый откат (2026-10-15) По сохранённому разрешению254 выполнен тот же exact mmt253-8e62a941.pngs.top на104.165.244.7. Перед началом снят свежий приватный native/export/SSL/files/SQL baseline; own certificate/files/jobs/DNS0, Cloudflare token/zone/account проверены. Renewal временно выключен. Подготовленный backend258 активирован; frontend251/Portal/DB сохранены, backend healthy. [Развёртывание](ux-ui/acceptance/acme259-deployment.json). diff --git a/docs/ux-ui/acceptance/ui260-baseline.json b/docs/ux-ui/acceptance/ui260-baseline.json new file mode 100644 index 00000000..c10eefb7 --- /dev/null +++ b/docs/ux-ui/acceptance/ui260-baseline.json @@ -0,0 +1,2063 @@ +{ + "date": "2026-10-15", + "block": "12.5.260", + "origin": "http://localhost:3000", + "realPortalUiLogin": true, + "responseMocks": false, + "deviceWritesPermitted": false, + "cases": [ + { + "theme": "dark", + "path": "/dashboard", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 703, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 16 + }, + "performance": { + "lcp": 668, + "cls": 0.18394311005015432, + "longTasks": 1, + "longTaskMs": 118, + "ttfbMs": 94.30000000074506, + "domInteractiveMs": 289, + "durationMs": 523.1999999992549 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/dashboard", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 555, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 16 + }, + "performance": { + "lcp": 528, + "cls": 0.035963546874999995, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 54.5, + "domInteractiveMs": 222.5, + "durationMs": 493.19999999925494 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/servers", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 553, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 672, + "cls": 0.000044211847752700614, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 97.30000000074506, + "domInteractiveMs": 239.69999999925494, + "durationMs": 471.19999999925494 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/servers", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 536, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 548, + "cls": 0.000062321875, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 108, + "domInteractiveMs": 207.60000000149012, + "durationMs": 480.69999999925494 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/uptime", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 832, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 772, + "cls": 0.01717699266975309, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 56.70000000298023, + "domInteractiveMs": 201.5, + "durationMs": 498.69999999925494 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/uptime", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 777, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 756, + "cls": 0.08757044687499999, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 53, + "domInteractiveMs": 151.5, + "durationMs": 386.19999999925494 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/traffic", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 563, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 1488, + "cls": 0.025900711534288193, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 87, + "domInteractiveMs": 234, + "durationMs": 532.8999999985099 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/traffic", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 524, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 488, + "cls": 0.11047610429687499, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 57.599999997764826, + "domInteractiveMs": 203.80000000074506, + "durationMs": 444.0999999977648 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/statistics", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 633, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 804, + "cls": 0.05435100839120371, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 154.20000000298023, + "domInteractiveMs": 288.30000000074506, + "durationMs": 611.1999999992549 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/statistics", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 612, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 776, + "cls": 0.07823437187499999, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 50.400000002235174, + "domInteractiveMs": 205.39999999850988, + "durationMs": 586 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/wireguard", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 590, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 900, + "cls": 0.00016905755690586422, + "longTasks": 1, + "longTaskMs": 54, + "ttfbMs": 95.10000000149012, + "domInteractiveMs": 239.79999999701977, + "durationMs": 470.0999999977648 + }, + "violations": [ + { + "id": "target-size", + "impact": "serious", + "targets": [ + [ + ".p-1\\.5" + ] + ] + } + ], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/wireguard", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 526, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 524, + "cls": 0.00063807578125, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 52.19999999925494, + "domInteractiveMs": 201.30000000074506, + "durationMs": 411.1000000014901 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/ipsec", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 553, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 944, + "cls": 0.00006102382330246914, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 98.40000000223517, + "domInteractiveMs": 233.5, + "durationMs": 440.30000000074506 + }, + "violations": [ + { + "id": "target-size", + "impact": "serious", + "targets": [ + [ + ".p-1\\.5" + ] + ] + } + ], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/ipsec", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 564, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 560, + "cls": 0.000062321875, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 51.399999998509884, + "domInteractiveMs": 216.19999999925494, + "durationMs": 486.5999999977648 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/gre", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 586, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 564, + "cls": 0.06258026005497686, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 98.09999999776483, + "domInteractiveMs": 271.30000000074506, + "durationMs": 478.4000000022352 + }, + "violations": [ + { + "id": "target-size", + "impact": "serious", + "targets": [ + [ + ".p-1\\.5" + ] + ] + } + ], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/gre", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 566, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 564, + "cls": 0.10702192187500001, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 92.60000000149012, + "domInteractiveMs": 257.30000000074506, + "durationMs": 486.5 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/vxlan", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 553, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 548, + "cls": 0.12087190923996914, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 99.19999999925494, + "domInteractiveMs": 234.5, + "durationMs": 432.5 + }, + "violations": [ + { + "id": "target-size", + "impact": "serious", + "targets": [ + [ + ".p-1\\.5" + ] + ] + } + ], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/vxlan", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 519, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 480, + "cls": 0.24465938125, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 49.5, + "domInteractiveMs": 209.09999999776483, + "durationMs": 432.19999999925494 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/ospf", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 1113, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 752, + "cls": 0.0054106802782600315, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 154, + "domInteractiveMs": 291, + "durationMs": 722.5 + }, + "violations": [ + { + "id": "target-size", + "impact": "serious", + "targets": [ + [ + ".p-1\\.5" + ] + ] + } + ], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/ospf", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 464, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 428, + "cls": 0.019630139453125, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 54.899999998509884, + "domInteractiveMs": 140.80000000074506, + "durationMs": 350.30000000074506 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/bgp", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 552, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 540, + "cls": 0.008227206790123459, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 107.39999999850988, + "domInteractiveMs": 238.39999999850988, + "durationMs": 461.80000000074506 + }, + "violations": [ + { + "id": "target-size", + "impact": "serious", + "targets": [ + [ + ".p-1\\.5" + ] + ] + } + ], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/bgp", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 533, + "layout": { + "overflow": false, + "mainOverflow": true, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 712, + "cls": 0.043276721875, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 52.69999999925494, + "domInteractiveMs": 211.5, + "durationMs": 427.3999999985099 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/filters", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 638, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 656, + "cls": 0.036411010079089506, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 96.89999999850988, + "domInteractiveMs": 239.39999999850988, + "durationMs": 458.5999999977648 + }, + "violations": [ + { + "id": "target-size", + "impact": "serious", + "targets": [ + [ + ".p-1\\.5" + ] + ] + } + ], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/filters", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 554, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 520, + "cls": 0.073080721875, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 60.599999997764826, + "domInteractiveMs": 162, + "durationMs": 378.5 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/backups", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 535, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 524, + "cls": 0.000029851948302469136, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 91.30000000074506, + "domInteractiveMs": 219.10000000149012, + "durationMs": 511.80000000074506 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/backups", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 1024, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 552, + "cls": 0.1396459982421875, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 51.900000002235174, + "domInteractiveMs": 199.30000000074506, + "durationMs": 523.2000000029802 + }, + "violations": [ + { + "id": "color-contrast", + "impact": "serious", + "targets": [ + [ + ".rounded.py-1.transition-colors:nth-child(2) > .opacity-60.tabular-nums.text-xs" + ] + ] + } + ], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/certificates", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 586, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 856, + "cls": 0.032897526041666666, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 52.79999999701977, + "domInteractiveMs": 222.30000000074506, + "durationMs": 492.30000000074506 + }, + "violations": [ + { + "id": "target-size", + "impact": "serious", + "targets": [ + [ + ".p-1\\.5" + ] + ] + } + ], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/certificates", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 499, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 508, + "cls": 0.013925775000000001, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 48.100000001490116, + "domInteractiveMs": 151, + "durationMs": 421.80000000074506 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/containers", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 547, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 548, + "cls": 0.011791851851851852, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 100.89999999850988, + "domInteractiveMs": 233.19999999925494, + "durationMs": 435.8999999985099 + }, + "violations": [ + { + "id": "target-size", + "impact": "serious", + "targets": [ + [ + ".p-1\\.5" + ] + ] + } + ], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/containers", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 468, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 404, + "cls": 0.025738421874999997, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 55.899999998509884, + "domInteractiveMs": 160.39999999850988, + "durationMs": 347.3999999985099 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/alerts", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 528, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 1000, + "cls": 0.2825991898148148, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 92.5, + "domInteractiveMs": 220.89999999850988, + "durationMs": 395.8999999985099 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/alerts", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 521, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 912, + "cls": 0.67899836875, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 49.5, + "domInteractiveMs": 197.59999999776483, + "durationMs": 378.69999999925494 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/settings", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 549, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 544, + "cls": 0.0034562909613715283, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 75.89999999850988, + "domInteractiveMs": 204.80000000074506, + "durationMs": 447.30000000074506 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/settings", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 545, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 472, + "cls": 0.0003595375, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 50.599999997764826, + "domInteractiveMs": 216.20000000298023, + "durationMs": 388.1000000014901 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/releases", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 847, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 808, + "cls": 0.000013114872685185185, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 391.79999999701977, + "domInteractiveMs": 533.5, + "durationMs": 708.5 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/releases", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 511, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 452, + "cls": 0.000062321875, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 65.20000000298023, + "domInteractiveMs": 197.80000000074506, + "durationMs": 367.19999999925494 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/dashboard", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 680, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 16 + }, + "performance": { + "lcp": 676, + "cls": 0.10677783227237654, + "longTasks": 1, + "longTaskMs": 53, + "ttfbMs": 95.30000000074506, + "domInteractiveMs": 279.6000000014901, + "durationMs": 667.1999999992549 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/dashboard", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 672, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 16 + }, + "performance": { + "lcp": 640, + "cls": 0.111360046875, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 94.09999999776483, + "domInteractiveMs": 333.5, + "durationMs": 557.1999999992549 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/servers", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 550, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 636, + "cls": 0.000044211847752700614, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 99.70000000298023, + "domInteractiveMs": 236.19999999925494, + "durationMs": 465.1000000014901 + }, + "violations": [ + { + "id": "color-contrast", + "impact": "serious", + "targets": [ + [ + "tr[data-row-id=\"1\"] > td:nth-child(2) > .bg-emerald-500\\/10.text-emerald-400.border-emerald-500\\/20" + ], + [ + "tr[data-row-id=\"2\"] > td:nth-child(2) > .bg-emerald-500\\/10.text-emerald-400.border-emerald-500\\/20" + ] + ] + } + ], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/servers", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 502, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 492, + "cls": 0.000062321875, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 55.69999999925494, + "domInteractiveMs": 195.70000000298023, + "durationMs": 449.30000000074506 + }, + "violations": [ + { + "id": "color-contrast", + "impact": "serious", + "targets": [ + [ + "tr[data-row-id=\"1\"] > td:nth-child(2) > .bg-emerald-500\\/10.text-emerald-400.border-emerald-500\\/20" + ], + [ + "tr[data-row-id=\"2\"] > td:nth-child(2) > .bg-emerald-500\\/10.text-emerald-400.border-emerald-500\\/20" + ] + ] + } + ], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/uptime", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 814, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 756, + "cls": 0.01717699266975309, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 50.69999999925494, + "domInteractiveMs": 187.10000000149012, + "durationMs": 484.80000000074506 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/uptime", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 793, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 780, + "cls": 0.08757044687499999, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 48.599999997764826, + "domInteractiveMs": 175.39999999850988, + "durationMs": 422.0999999977648 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/traffic", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 538, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 988, + "cls": 0.02607868776674624, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 86.19999999925494, + "domInteractiveMs": 218.90000000223517, + "durationMs": 461 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/traffic", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 1018, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 588, + "cls": 0.11048095278320312, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 56.399999998509884, + "domInteractiveMs": 203, + "durationMs": 573.3999999985099 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/statistics", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 689, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 808, + "cls": 0.05435100839120371, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 101.5, + "domInteractiveMs": 308, + "durationMs": 641.3000000007451 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/statistics", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 461, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 576, + "cls": 0.07823437187499999, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 50.899999998509884, + "domInteractiveMs": 142.70000000298023, + "durationMs": 417.6000000014901 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/wireguard", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 1039, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 1024, + "cls": 0.00016905755690586422, + "longTasks": 1, + "longTaskMs": 57, + "ttfbMs": 93.69999999925494, + "domInteractiveMs": 230.69999999925494, + "durationMs": 619.1000000014901 + }, + "violations": [ + { + "id": "target-size", + "impact": "serious", + "targets": [ + [ + ".p-1\\.5" + ] + ] + } + ], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/wireguard", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 520, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 504, + "cls": 0.00063807578125, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 56, + "domInteractiveMs": 210.39999999850988, + "durationMs": 417.19999999925494 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/ipsec", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 574, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 576, + "cls": 0.00004806086033950618, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 100.39999999850988, + "domInteractiveMs": 243.59999999776483, + "durationMs": 536.6999999992549 + }, + "violations": [ + { + "id": "target-size", + "impact": "serious", + "targets": [ + [ + ".p-1\\.5" + ] + ] + } + ], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/ipsec", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 477, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 428, + "cls": 0.000062321875, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 57.69999999925494, + "domInteractiveMs": 161.60000000149012, + "durationMs": 363.6000000014901 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/gre", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 554, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 532, + "cls": 0.06258026005497686, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 97.79999999701977, + "domInteractiveMs": 243.30000000074506, + "durationMs": 448.4000000022352 + }, + "violations": [ + { + "id": "target-size", + "impact": "serious", + "targets": [ + [ + ".p-1\\.5" + ] + ] + } + ], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/gre", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 528, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 488, + "cls": 0.10702192187500001, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 55.400000002235174, + "domInteractiveMs": 207, + "durationMs": 411.6000000014901 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/vxlan", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 538, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 516, + "cls": 0.12087190923996914, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 95.19999999925494, + "domInteractiveMs": 226.89999999850988, + "durationMs": 424.69999999925494 + }, + "violations": [ + { + "id": "color-contrast", + "impact": "serious", + "targets": [ + [ + ".text-sky-600" + ] + ] + }, + { + "id": "target-size", + "impact": "serious", + "targets": [ + [ + ".p-1\\.5" + ] + ] + } + ], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/vxlan", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 1070, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 608, + "cls": 0.24465938125, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 55, + "domInteractiveMs": 225.39999999850988, + "durationMs": 554.0999999977648 + }, + "violations": [ + { + "id": "color-contrast", + "impact": "serious", + "targets": [ + [ + ".text-sky-600" + ] + ] + } + ], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/ospf", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 543, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 532, + "cls": 0.0054106802782600315, + "longTasks": 1, + "longTaskMs": 51, + "ttfbMs": 97.30000000074506, + "domInteractiveMs": 231.19999999925494, + "durationMs": 447 + }, + "violations": [ + { + "id": "target-size", + "impact": "serious", + "targets": [ + [ + ".p-1\\.5" + ] + ] + } + ], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/ospf", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 530, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 480, + "cls": 0.019630139453125, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 56.600000001490116, + "domInteractiveMs": 216.60000000149012, + "durationMs": 428 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/bgp", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 553, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 540, + "cls": 0.008227206790123459, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 95, + "domInteractiveMs": 231.90000000223517, + "durationMs": 478.6000000014901 + }, + "violations": [ + { + "id": "target-size", + "impact": "serious", + "targets": [ + [ + ".p-1\\.5" + ] + ] + } + ], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/bgp", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 533, + "layout": { + "overflow": false, + "mainOverflow": true, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 688, + "cls": 0.043276721875, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 55.899999998509884, + "domInteractiveMs": 209.10000000149012, + "durationMs": 424.19999999925494 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/filters", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 594, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 604, + "cls": 0.036411010079089506, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 96.80000000074506, + "domInteractiveMs": 226.80000000074506, + "durationMs": 445.30000000074506 + }, + "violations": [ + { + "id": "target-size", + "impact": "serious", + "targets": [ + [ + ".p-1\\.5" + ] + ] + } + ], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/filters", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 600, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 576, + "cls": 0.073080721875, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 49.100000001490116, + "domInteractiveMs": 199.89999999850988, + "durationMs": 421.8999999985099 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/backups", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 542, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 544, + "cls": 0.000029851948302469136, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 90.79999999701977, + "domInteractiveMs": 224, + "durationMs": 528.5 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/backups", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 492, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 492, + "cls": 0.0657015625, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 58.5, + "domInteractiveMs": 167.40000000223517, + "durationMs": 482.30000000074506 + }, + "violations": [ + { + "id": "color-contrast", + "impact": "serious", + "targets": [ + [ + ".rounded.py-1.transition-colors:nth-child(2) > .opacity-60.tabular-nums.text-xs" + ] + ] + } + ], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/certificates", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 497, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 752, + "cls": 0.032897526041666666, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 50, + "domInteractiveMs": 181.20000000298023, + "durationMs": 385 + }, + "violations": [ + { + "id": "target-size", + "impact": "serious", + "targets": [ + [ + ".p-1\\.5" + ] + ] + } + ], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/certificates", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 507, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 496, + "cls": 0.013925775000000001, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 55.100000001490116, + "domInteractiveMs": 172, + "durationMs": 397 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/containers", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 561, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 560, + "cls": 0.011791851851851852, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 100.89999999850988, + "domInteractiveMs": 240.5, + "durationMs": 448.1000000014901 + }, + "violations": [ + { + "id": "target-size", + "impact": "serious", + "targets": [ + [ + ".p-1\\.5" + ] + ] + } + ], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/containers", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 478, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 432, + "cls": 0.025738421874999997, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 52.900000002235174, + "domInteractiveMs": 162.5, + "durationMs": 362.6000000014901 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/alerts", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 531, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 972, + "cls": 0.2825991898148148, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 89.19999999925494, + "domInteractiveMs": 218.89999999850988, + "durationMs": 395.5999999977648 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/alerts", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 527, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 940, + "cls": 0.67622226875, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 48.5, + "domInteractiveMs": 200.20000000298023, + "durationMs": 385.20000000298023 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/settings", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 504, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 468, + "cls": 0.0035598427553530094, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 50.19999999925494, + "domInteractiveMs": 185.29999999701977, + "durationMs": 361.29999999701977 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/settings", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 468, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 460, + "cls": 0.0003595375, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 50, + "domInteractiveMs": 152.29999999701977, + "durationMs": 368.5 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/releases", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 555, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 508, + "cls": 0.000013114872685185185, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 99.10000000149012, + "domInteractiveMs": 241.59999999776483, + "durationMs": 415.5 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/releases", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 566, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 488, + "cls": 0.000062321875, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 82.10000000149012, + "domInteractiveMs": 242, + "durationMs": 402.5999999977648 + }, + "violations": [], + "auditCompleted": true + } + ], + "blockedWrites": [], + "bounds": [ + "Default rendered state only; data can still be refreshing", + "Synthetic lab timing over SSH, no CPU/network throttling; not field Core Web Vitals", + "Automated WCAG-tagged checks, not manual screen-reader certification" + ], + "completed": true, + "passed": false +} diff --git a/docs/ux-ui/acceptance/ui260-deployment.json b/docs/ux-ui/acceptance/ui260-deployment.json new file mode 100644 index 00000000..64573650 --- /dev/null +++ b/docs/ux-ui/acceptance/ui260-deployment.json @@ -0,0 +1,20 @@ +{ + "date": "2026-10-15", + "block": "12.5.260", + "productionBuild": "passed", + "sourceMatched": 528, + "services": { + "backend": { + "image": "mmapp-test/backend:ux-certificates258", + "imageId": "sha256:984684709e619972bae8657208e3150d12f1c4f2b5642fecf5286a5d87e9fe71", + "status": "running", + "health": "healthy" + }, + "frontend": { + "image": "mmapp-test/frontend:ux-accessibility260-final", + "imageId": "sha256:0b7b12cfa0e64a021c8c77a3362cc54488c6aea75269f0c2ae2a0cb0b4b5192a", + "status": "running", + "health": null + } + } +} \ No newline at end of file diff --git a/docs/ux-ui/acceptance/ui260-final.json b/docs/ux-ui/acceptance/ui260-final.json new file mode 100644 index 00000000..e4aed324 --- /dev/null +++ b/docs/ux-ui/acceptance/ui260-final.json @@ -0,0 +1,2122 @@ +{ + "date": "2026-10-15", + "block": "12.5.260", + "origin": "http://localhost:3000", + "realPortalUiLogin": true, + "responseMocks": false, + "deviceWritesPermitted": false, + "cases": [ + { + "theme": "dark", + "path": "/dashboard", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 1243, + "requiredReads": [ + "/api/servers", + "/api/uptime/overview", + "/api/filters/rules", + "/api/bgp/catalog", + "/api/internet-path/latest", + "/api/filters/gre-tunnels", + "/api/wireguard", + "/api/traffic/servers", + "/api/vxlan" + ], + "dataResponsesMs": 3114, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 876, + "cls": 0.18891521697621286, + "longTasks": 1, + "longTaskMs": 106, + "ttfbMs": 101.19999999925494, + "domInteractiveMs": 390.6000000014901, + "durationMs": 745.3000000007451 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/dashboard", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 469, + "requiredReads": [ + "/api/servers", + "/api/uptime/overview", + "/api/filters/rules", + "/api/bgp/catalog", + "/api/internet-path/latest", + "/api/filters/gre-tunnels", + "/api/wireguard", + "/api/traffic/servers", + "/api/vxlan" + ], + "dataResponsesMs": 2342, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 432, + "cls": 0.071583796875, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 57.600000001490116, + "domInteractiveMs": 148.5, + "durationMs": 404.4000000022352 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/servers", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 760, + "requiredReads": [ + "/api/servers" + ], + "dataResponsesMs": 1639, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 1232, + "cls": 0.000044211847752700614, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 144.09999999776483, + "domInteractiveMs": 413.5, + "durationMs": 740.3000000007451 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/servers", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 480, + "requiredReads": [ + "/api/servers" + ], + "dataResponsesMs": 585, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 452, + "cls": 0.000062321875, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 55.30000000074506, + "domInteractiveMs": 157.19999999925494, + "durationMs": 389.29999999701977 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/uptime", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 816, + "requiredReads": [ + "/api/uptime/overview" + ], + "dataResponsesMs": 1180, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 796, + "cls": 0.01717699266975309, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 53.899999998509884, + "domInteractiveMs": 192.5, + "durationMs": 412.30000000074506 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/uptime", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 890, + "requiredReads": [ + "/api/uptime/overview" + ], + "dataResponsesMs": 1246, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 880, + "cls": 0.08757044687499999, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 97.29999999701977, + "domInteractiveMs": 247.39999999850988, + "durationMs": 517.1000000014901 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/traffic", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 568, + "requiredReads": [ + "/api/traffic/servers" + ], + "dataResponsesMs": 921, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 1056, + "cls": 0.007212276415412808, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 92, + "domInteractiveMs": 226.5, + "durationMs": 540.6999999992549 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/traffic", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 543, + "requiredReads": [ + "/api/traffic/servers" + ], + "dataResponsesMs": 896, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 556, + "cls": 0.11047610429687499, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 52.20000000298023, + "domInteractiveMs": 199.60000000149012, + "durationMs": 526.9000000022352 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/statistics", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 551, + "requiredReads": [ + "/api/statistics" + ], + "dataResponsesMs": 911, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 720, + "cls": 0.05435100839120371, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 56.5, + "domInteractiveMs": 189.20000000298023, + "durationMs": 533.2000000029802 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/statistics", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 531, + "requiredReads": [ + "/api/statistics" + ], + "dataResponsesMs": 641, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 620, + "cls": 0.07823437187499999, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 51.100000001490116, + "domInteractiveMs": 178.80000000074506, + "durationMs": 462.8999999985099 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/wireguard", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 562, + "requiredReads": [ + "/api/wireguard" + ], + "dataResponsesMs": 918, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 836, + "cls": 0.00016905755690586422, + "longTasks": 1, + "longTaskMs": 58, + "ttfbMs": 87, + "domInteractiveMs": 235, + "durationMs": 452.69999999925494 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/wireguard", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 473, + "requiredReads": [ + "/api/wireguard" + ], + "dataResponsesMs": 830, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 460, + "cls": 0.00063807578125, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 65.69999999925494, + "domInteractiveMs": 156.10000000149012, + "durationMs": 396.80000000074506 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/ipsec", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 587, + "requiredReads": [ + "/api/ipsec" + ], + "dataResponsesMs": 1449, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 980, + "cls": 0.00006102382330246914, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 102.80000000074506, + "domInteractiveMs": 233.69999999925494, + "durationMs": 519.3000000007451 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/ipsec", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 958, + "requiredReads": [ + "/api/ipsec" + ], + "dataResponsesMs": 958, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 540, + "cls": 0.000062321875, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 56.69999999925494, + "domInteractiveMs": 141.79999999701977, + "durationMs": 446.8999999985099 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/gre", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 574, + "requiredReads": [ + "/api/gre/tunnels" + ], + "dataResponsesMs": 950, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 552, + "cls": 0.06258026005497686, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 124.40000000223517, + "domInteractiveMs": 253.20000000298023, + "durationMs": 474.80000000074506 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/gre", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 478, + "requiredReads": [ + "/api/gre/tunnels" + ], + "dataResponsesMs": 2353, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 476, + "cls": 0.10702192187500001, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 50.20000000298023, + "domInteractiveMs": 158, + "durationMs": 407.4000000022352 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/vxlan", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 581, + "requiredReads": [ + "/api/vxlan" + ], + "dataResponsesMs": 948, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 556, + "cls": 0.12087190923996914, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 110.89999999850988, + "domInteractiveMs": 249.19999999925494, + "durationMs": 457.8999999985099 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/vxlan", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 452, + "requiredReads": [ + "/api/vxlan" + ], + "dataResponsesMs": 1315, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 444, + "cls": 0.24465938125, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 58.69999999925494, + "domInteractiveMs": 150.30000000074506, + "durationMs": 383.5999999977648 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/ospf", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 571, + "requiredReads": [ + "/api/ospf/catalog" + ], + "dataResponsesMs": 1434, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 540, + "cls": 0.0054106802782600315, + "longTasks": 1, + "longTaskMs": 50, + "ttfbMs": 105.90000000223517, + "domInteractiveMs": 244.89999999850988, + "durationMs": 470.29999999701977 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/ospf", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 485, + "requiredReads": [ + "/api/ospf/catalog" + ], + "dataResponsesMs": 2343, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 444, + "cls": 0.019630139453125, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 56.80000000074506, + "domInteractiveMs": 147.5, + "durationMs": 403.80000000074506 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/bgp", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 626, + "requiredReads": [ + "/api/bgp/catalog" + ], + "dataResponsesMs": 2508, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 628, + "cls": 0.008227206790123459, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 109.10000000149012, + "domInteractiveMs": 242.89999999850988, + "durationMs": 571.3000000007451 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/bgp", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 1032, + "requiredReads": [ + "/api/bgp/catalog" + ], + "dataResponsesMs": 1033, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 764, + "cls": 0.043276721875, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 52.400000002235174, + "domInteractiveMs": 178.30000000074506, + "durationMs": 471.1000000014901 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/filters", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 875, + "requiredReads": [ + "/api/filters/rules" + ], + "dataResponsesMs": 875, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 816, + "cls": 0.036411010079089506, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 166.10000000149012, + "domInteractiveMs": 310.20000000298023, + "durationMs": 603.6000000014901 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/filters", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 516, + "requiredReads": [ + "/api/filters/rules" + ], + "dataResponsesMs": 516, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 524, + "cls": 0.073080721875, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 49.100000001490116, + "domInteractiveMs": 163.89999999850988, + "durationMs": 382 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/backups", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 520, + "requiredReads": [ + "/api/backups" + ], + "dataResponsesMs": 877, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 500, + "cls": 0.000029851948302469136, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 96.5, + "domInteractiveMs": 191.80000000074506, + "durationMs": 421.3999999985099 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/backups", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 501, + "requiredReads": [ + "/api/backups" + ], + "dataResponsesMs": 601, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 468, + "cls": 0.1396483580078125, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 54.899999998509884, + "domInteractiveMs": 181.09999999776483, + "durationMs": 457.8999999985099 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/certificates", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 546, + "requiredReads": [ + "/api/certificates/state" + ], + "dataResponsesMs": 2408, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 856, + "cls": 0.062860234375, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 53.099999997764826, + "domInteractiveMs": 203.5, + "durationMs": 428.8999999985099 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/certificates", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 520, + "requiredReads": [ + "/api/certificates/state" + ], + "dataResponsesMs": 2416, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 520, + "cls": 0.061482699999999994, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 55.19999999925494, + "domInteractiveMs": 176.89999999850988, + "durationMs": 450.30000000074506 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/containers", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 548, + "requiredReads": [ + "/api/containers/state" + ], + "dataResponsesMs": 2414, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 544, + "cls": 0.11558015046296297, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 109.20000000298023, + "domInteractiveMs": 239.30000000074506, + "durationMs": 441.5 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/containers", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 502, + "requiredReads": [ + "/api/containers/state" + ], + "dataResponsesMs": 2361, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 456, + "cls": 0.11563842187500001, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 50, + "domInteractiveMs": 173.80000000074506, + "durationMs": 391.6000000014901 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/alerts", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 581, + "requiredReads": [ + "/api/alerts" + ], + "dataResponsesMs": 942, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 960, + "cls": 0.2825991898148148, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 94.40000000223517, + "domInteractiveMs": 226.10000000149012, + "durationMs": 504.1000000014901 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/alerts", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 510, + "requiredReads": [ + "/api/alerts" + ], + "dataResponsesMs": 1381, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 948, + "cls": 0.67899836875, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 56.19999999925494, + "domInteractiveMs": 180.09999999776483, + "durationMs": 347.69999999925494 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/settings", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 620, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 620, + "cls": 0.0035598427553530094, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 117.5, + "domInteractiveMs": 269.5, + "durationMs": 509.0999999977648 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/settings", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 531, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 480, + "cls": 0.0003595375, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 65.09999999776483, + "domInteractiveMs": 216.60000000149012, + "durationMs": 391 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/releases", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 743, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 696, + "cls": 0.000013114872685185185, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 278.5, + "domInteractiveMs": 428.29999999701977, + "durationMs": 603.2999999970198 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/releases", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 530, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 464, + "cls": 0.000062321875, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 62.5, + "domInteractiveMs": 217.09999999776483, + "durationMs": 386.5999999977648 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/dashboard", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 588, + "requiredReads": [ + "/api/servers", + "/api/uptime/overview", + "/api/filters/rules", + "/api/bgp/catalog", + "/api/internet-path/latest", + "/api/filters/gre-tunnels", + "/api/wireguard", + "/api/traffic/servers", + "/api/vxlan" + ], + "dataResponsesMs": 3482, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 596, + "cls": 0.11174993919843508, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 97.29999999701977, + "domInteractiveMs": 239.5, + "durationMs": 553 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/dashboard", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 607, + "requiredReads": [ + "/api/servers", + "/api/uptime/overview", + "/api/filters/rules", + "/api/bgp/catalog", + "/api/internet-path/latest", + "/api/filters/gre-tunnels", + "/api/wireguard", + "/api/traffic/servers", + "/api/vxlan" + ], + "dataResponsesMs": 2484, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 556, + "cls": 0.071302821875, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 66.80000000074506, + "domInteractiveMs": 167.69999999925494, + "durationMs": 490.3999999985099 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/servers", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 1150, + "requiredReads": [ + "/api/servers" + ], + "dataResponsesMs": 1150, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 988, + "cls": 0.000044211847752700614, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 115.19999999925494, + "domInteractiveMs": 323.6000000014901, + "durationMs": 730.5 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/servers", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 1052, + "requiredReads": [ + "/api/servers" + ], + "dataResponsesMs": 1052, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 632, + "cls": 0.000062321875, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 63, + "domInteractiveMs": 236, + "durationMs": 567 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/uptime", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 804, + "requiredReads": [ + "/api/uptime/overview" + ], + "dataResponsesMs": 910, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 736, + "cls": 0.01717699266975309, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 49.5, + "domInteractiveMs": 182.90000000223517, + "durationMs": 465.30000000074506 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/uptime", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 808, + "requiredReads": [ + "/api/uptime/overview" + ], + "dataResponsesMs": 916, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 748, + "cls": 0.08757044687499999, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 55.600000001490116, + "domInteractiveMs": 181.09999999776483, + "durationMs": 454.79999999701977 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/traffic", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 541, + "requiredReads": [ + "/api/traffic/servers" + ], + "dataResponsesMs": 895, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 908, + "cls": 0.025901459757486978, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 90.80000000074506, + "domInteractiveMs": 218.69999999925494, + "durationMs": 509.6000000014901 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/traffic", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 572, + "requiredReads": [ + "/api/traffic/servers" + ], + "dataResponsesMs": 930, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 588, + "cls": 0.11093063403320312, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 52.399999998509884, + "domInteractiveMs": 218.5, + "durationMs": 566.6999999992549 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/statistics", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 536, + "requiredReads": [ + "/api/statistics" + ], + "dataResponsesMs": 900, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 676, + "cls": 0.05435100839120371, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 50.5, + "domInteractiveMs": 201.29999999701977, + "durationMs": 514.0999999977648 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/statistics", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 516, + "requiredReads": [ + "/api/statistics" + ], + "dataResponsesMs": 616, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 620, + "cls": 0.07823437187499999, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 48.5, + "domInteractiveMs": 177.20000000298023, + "durationMs": 449.9000000022352 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/wireguard", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 548, + "requiredReads": [ + "/api/wireguard" + ], + "dataResponsesMs": 900, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 820, + "cls": 0.00016905755690586422, + "longTasks": 1, + "longTaskMs": 54, + "ttfbMs": 88.60000000149012, + "domInteractiveMs": 221.59999999776483, + "durationMs": 433.19999999925494 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/wireguard", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 448, + "requiredReads": [ + "/api/wireguard" + ], + "dataResponsesMs": 807, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 400, + "cls": 0.00063807578125, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 49.399999998509884, + "domInteractiveMs": 136.80000000074506, + "durationMs": 341.30000000074506 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/ipsec", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 621, + "requiredReads": [ + "/api/ipsec" + ], + "dataResponsesMs": 2492, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 1804, + "cls": 0.00006102382330246914, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 95.5, + "domInteractiveMs": 226.90000000223517, + "durationMs": 654.1000000014901 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/ipsec", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 516, + "requiredReads": [ + "/api/ipsec" + ], + "dataResponsesMs": 1378, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 504, + "cls": 0.000062321875, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 65.39999999850988, + "domInteractiveMs": 203.30000000074506, + "durationMs": 432.5 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/gre", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 553, + "requiredReads": [ + "/api/gre/tunnels" + ], + "dataResponsesMs": 1409, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 524, + "cls": 0.06258026005497686, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 108.19999999925494, + "domInteractiveMs": 243.70000000298023, + "durationMs": 460.80000000074506 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/gre", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 484, + "requiredReads": [ + "/api/gre/tunnels" + ], + "dataResponsesMs": 2342, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 488, + "cls": 0.10702192187500001, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 48.899999998509884, + "domInteractiveMs": 133.89999999850988, + "durationMs": 448.69999999925494 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/vxlan", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 564, + "requiredReads": [ + "/api/vxlan" + ], + "dataResponsesMs": 929, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 528, + "cls": 0.12087190923996914, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 106.80000000074506, + "domInteractiveMs": 244.5, + "durationMs": 446.6000000014901 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/vxlan", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 498, + "requiredReads": [ + "/api/vxlan" + ], + "dataResponsesMs": 854, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 444, + "cls": 0.24465938125, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 55.5, + "domInteractiveMs": 184.19999999925494, + "durationMs": 368.6000000014901 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/ospf", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 544, + "requiredReads": [ + "/api/ospf/catalog" + ], + "dataResponsesMs": 2408, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 544, + "cls": 0.0054106802782600315, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 95.80000000074506, + "domInteractiveMs": 225.70000000298023, + "durationMs": 637.6000000014901 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/ospf", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 503, + "requiredReads": [ + "/api/ospf/catalog" + ], + "dataResponsesMs": 2382, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 444, + "cls": 0.019630139453125, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 49.900000002235174, + "domInteractiveMs": 178.80000000074506, + "durationMs": 421.0999999977648 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/bgp", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 616, + "requiredReads": [ + "/api/bgp/catalog" + ], + "dataResponsesMs": 968, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 612, + "cls": 0.008227206790123459, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 106.70000000298023, + "domInteractiveMs": 275.9000000022352, + "durationMs": 549.1999999992549 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/bgp", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 478, + "requiredReads": [ + "/api/bgp/catalog" + ], + "dataResponsesMs": 1363, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 1228, + "cls": 0.043276721875, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 49.399999998509884, + "domInteractiveMs": 156, + "durationMs": 394.30000000074506 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/filters", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 770, + "requiredReads": [ + "/api/filters/rules" + ], + "dataResponsesMs": 770, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 700, + "cls": 0.036411010079089506, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 109.39999999850988, + "domInteractiveMs": 247.5, + "durationMs": 474.30000000074506 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/filters", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 609, + "requiredReads": [ + "/api/filters/rules" + ], + "dataResponsesMs": 609, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 580, + "cls": 0.073081659375, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 52.30000000074506, + "domInteractiveMs": 184.19999999925494, + "durationMs": 407.5 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/backups", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 1066, + "requiredReads": [ + "/api/backups" + ], + "dataResponsesMs": 1066, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 652, + "cls": 0.000029851948302469136, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 94.30000000074506, + "domInteractiveMs": 237.69999999925494, + "durationMs": 623.8999999985099 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/backups", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 462, + "requiredReads": [ + "/api/backups" + ], + "dataResponsesMs": 815, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 420, + "cls": 0.1396459982421875, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 52.30000000074506, + "domInteractiveMs": 142.5, + "durationMs": 394.19999999925494 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/certificates", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 536, + "requiredReads": [ + "/api/certificates/state" + ], + "dataResponsesMs": 2389, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 804, + "cls": 0.06154219907407407, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 56.100000001490116, + "domInteractiveMs": 200.30000000074506, + "durationMs": 442.8999999985099 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/certificates", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 508, + "requiredReads": [ + "/api/certificates/state" + ], + "dataResponsesMs": 2377, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 432, + "cls": 0.060179696874999994, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 52.5, + "domInteractiveMs": 181.39999999850988, + "durationMs": 371.3999999985099 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/containers", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 615, + "requiredReads": [ + "/api/containers/state" + ], + "dataResponsesMs": 2494, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 612, + "cls": 0.11558015046296297, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 119.5, + "domInteractiveMs": 282.30000000074506, + "durationMs": 490.69999999925494 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/containers", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 494, + "requiredReads": [ + "/api/containers/state" + ], + "dataResponsesMs": 2352, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 464, + "cls": 0.11563842187500001, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 50.29999999701977, + "domInteractiveMs": 179.69999999925494, + "durationMs": 386.3999999985099 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/alerts", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 617, + "requiredReads": [ + "/api/alerts" + ], + "dataResponsesMs": 970, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 972, + "cls": 0.2825991898148148, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 88, + "domInteractiveMs": 277.69999999925494, + "durationMs": 480.80000000074506 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/alerts", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 472, + "requiredReads": [ + "/api/alerts" + ], + "dataResponsesMs": 842, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 808, + "cls": 0.67622226875, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 49.69999999925494, + "domInteractiveMs": 148.19999999925494, + "durationMs": 367.19999999925494 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/settings", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 539, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 496, + "cls": 0.0034562909613715283, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 50.400000002235174, + "domInteractiveMs": 221.60000000149012, + "durationMs": 397.4000000022352 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/settings", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 488, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 424, + "cls": 0.0003595375, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 59.69999999925494, + "domInteractiveMs": 168.19999999925494, + "durationMs": 342.8999999985099 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/releases", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 557, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 504, + "cls": 0.000013114872685185185, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 105.30000000074506, + "domInteractiveMs": 234.19999999925494, + "durationMs": 408.1000000014901 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/releases", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 576, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 496, + "cls": 0.000062321875, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 66.09999999776483, + "domInteractiveMs": 238.80000000074506, + "durationMs": 412 + }, + "violations": [], + "auditCompleted": true + } + ], + "blockedWrites": [], + "bounds": [ + "Default rendered state only; data can still be refreshing", + "Synthetic lab timing over SSH, no CPU/network throttling; not field Core Web Vitals", + "Automated WCAG-tagged checks, not manual screen-reader certification" + ], + "completed": true, + "passed": true, + "phases": [ + { + "report": "ui260-first-recheck.json", + "cases": 72, + "violating": 2, + "frontend": "ux-accessibility260" + }, + { + "report": "ui260-servers-final.json", + "cases": 4, + "violating": 0, + "frontend": "ux-accessibility260-final", + "onlyProductChange": "TypeBadge text-foreground" + } + ], + "coverageNote": "72 unique states accepted across two rechecks; four server cases replace prior results, not added as distinct states" +} diff --git a/docs/ux-ui/acceptance/ui260-first-recheck.json b/docs/ux-ui/acceptance/ui260-first-recheck.json new file mode 100644 index 00000000..b4dc8de4 --- /dev/null +++ b/docs/ux-ui/acceptance/ui260-first-recheck.json @@ -0,0 +1,2132 @@ +{ + "date": "2026-10-15", + "block": "12.5.260", + "origin": "http://localhost:3000", + "realPortalUiLogin": true, + "responseMocks": false, + "deviceWritesPermitted": false, + "cases": [ + { + "theme": "dark", + "path": "/dashboard", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 1243, + "requiredReads": [ + "/api/servers", + "/api/uptime/overview", + "/api/filters/rules", + "/api/bgp/catalog", + "/api/internet-path/latest", + "/api/filters/gre-tunnels", + "/api/wireguard", + "/api/traffic/servers", + "/api/vxlan" + ], + "dataResponsesMs": 3114, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 876, + "cls": 0.18891521697621286, + "longTasks": 1, + "longTaskMs": 106, + "ttfbMs": 101.19999999925494, + "domInteractiveMs": 390.6000000014901, + "durationMs": 745.3000000007451 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/dashboard", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 469, + "requiredReads": [ + "/api/servers", + "/api/uptime/overview", + "/api/filters/rules", + "/api/bgp/catalog", + "/api/internet-path/latest", + "/api/filters/gre-tunnels", + "/api/wireguard", + "/api/traffic/servers", + "/api/vxlan" + ], + "dataResponsesMs": 2342, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 432, + "cls": 0.071583796875, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 57.600000001490116, + "domInteractiveMs": 148.5, + "durationMs": 404.4000000022352 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/servers", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 502, + "requiredReads": [ + "/api/servers" + ], + "dataResponsesMs": 865, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 628, + "cls": 0.000044211847752700614, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 53, + "domInteractiveMs": 187.80000000074506, + "durationMs": 415.30000000074506 + }, + "violations": [ + { + "id": "color-contrast", + "impact": "serious", + "targets": [ + [ + "tr[data-row-id=\"1\"] > td:nth-child(2) > .text-success-foreground.px-1\\.25.h-5" + ], + [ + "tr[data-row-id=\"2\"] > td:nth-child(2) > .text-success-foreground.px-1\\.25.h-5" + ] + ] + } + ], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/servers", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 468, + "requiredReads": [ + "/api/servers" + ], + "dataResponsesMs": 836, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 464, + "cls": 0.000062321875, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 57.5, + "domInteractiveMs": 151.80000000074506, + "durationMs": 416.70000000298023 + }, + "violations": [ + { + "id": "color-contrast", + "impact": "serious", + "targets": [ + [ + "tr[data-row-id=\"1\"] > td:nth-child(2) > .text-success-foreground.px-1\\.25.h-5" + ], + [ + "tr[data-row-id=\"2\"] > td:nth-child(2) > .text-success-foreground.px-1\\.25.h-5" + ] + ] + } + ], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/uptime", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 816, + "requiredReads": [ + "/api/uptime/overview" + ], + "dataResponsesMs": 1180, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 796, + "cls": 0.01717699266975309, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 53.899999998509884, + "domInteractiveMs": 192.5, + "durationMs": 412.30000000074506 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/uptime", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 890, + "requiredReads": [ + "/api/uptime/overview" + ], + "dataResponsesMs": 1246, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 880, + "cls": 0.08757044687499999, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 97.29999999701977, + "domInteractiveMs": 247.39999999850988, + "durationMs": 517.1000000014901 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/traffic", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 568, + "requiredReads": [ + "/api/traffic/servers" + ], + "dataResponsesMs": 921, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 1056, + "cls": 0.007212276415412808, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 92, + "domInteractiveMs": 226.5, + "durationMs": 540.6999999992549 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/traffic", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 543, + "requiredReads": [ + "/api/traffic/servers" + ], + "dataResponsesMs": 896, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 556, + "cls": 0.11047610429687499, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 52.20000000298023, + "domInteractiveMs": 199.60000000149012, + "durationMs": 526.9000000022352 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/statistics", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 551, + "requiredReads": [ + "/api/statistics" + ], + "dataResponsesMs": 911, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 720, + "cls": 0.05435100839120371, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 56.5, + "domInteractiveMs": 189.20000000298023, + "durationMs": 533.2000000029802 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/statistics", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 531, + "requiredReads": [ + "/api/statistics" + ], + "dataResponsesMs": 641, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 620, + "cls": 0.07823437187499999, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 51.100000001490116, + "domInteractiveMs": 178.80000000074506, + "durationMs": 462.8999999985099 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/wireguard", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 562, + "requiredReads": [ + "/api/wireguard" + ], + "dataResponsesMs": 918, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 836, + "cls": 0.00016905755690586422, + "longTasks": 1, + "longTaskMs": 58, + "ttfbMs": 87, + "domInteractiveMs": 235, + "durationMs": 452.69999999925494 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/wireguard", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 473, + "requiredReads": [ + "/api/wireguard" + ], + "dataResponsesMs": 830, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 460, + "cls": 0.00063807578125, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 65.69999999925494, + "domInteractiveMs": 156.10000000149012, + "durationMs": 396.80000000074506 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/ipsec", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 587, + "requiredReads": [ + "/api/ipsec" + ], + "dataResponsesMs": 1449, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 980, + "cls": 0.00006102382330246914, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 102.80000000074506, + "domInteractiveMs": 233.69999999925494, + "durationMs": 519.3000000007451 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/ipsec", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 958, + "requiredReads": [ + "/api/ipsec" + ], + "dataResponsesMs": 958, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 540, + "cls": 0.000062321875, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 56.69999999925494, + "domInteractiveMs": 141.79999999701977, + "durationMs": 446.8999999985099 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/gre", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 574, + "requiredReads": [ + "/api/gre/tunnels" + ], + "dataResponsesMs": 950, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 552, + "cls": 0.06258026005497686, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 124.40000000223517, + "domInteractiveMs": 253.20000000298023, + "durationMs": 474.80000000074506 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/gre", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 478, + "requiredReads": [ + "/api/gre/tunnels" + ], + "dataResponsesMs": 2353, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 476, + "cls": 0.10702192187500001, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 50.20000000298023, + "domInteractiveMs": 158, + "durationMs": 407.4000000022352 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/vxlan", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 581, + "requiredReads": [ + "/api/vxlan" + ], + "dataResponsesMs": 948, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 556, + "cls": 0.12087190923996914, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 110.89999999850988, + "domInteractiveMs": 249.19999999925494, + "durationMs": 457.8999999985099 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/vxlan", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 452, + "requiredReads": [ + "/api/vxlan" + ], + "dataResponsesMs": 1315, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 444, + "cls": 0.24465938125, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 58.69999999925494, + "domInteractiveMs": 150.30000000074506, + "durationMs": 383.5999999977648 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/ospf", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 571, + "requiredReads": [ + "/api/ospf/catalog" + ], + "dataResponsesMs": 1434, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 540, + "cls": 0.0054106802782600315, + "longTasks": 1, + "longTaskMs": 50, + "ttfbMs": 105.90000000223517, + "domInteractiveMs": 244.89999999850988, + "durationMs": 470.29999999701977 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/ospf", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 485, + "requiredReads": [ + "/api/ospf/catalog" + ], + "dataResponsesMs": 2343, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 444, + "cls": 0.019630139453125, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 56.80000000074506, + "domInteractiveMs": 147.5, + "durationMs": 403.80000000074506 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/bgp", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 626, + "requiredReads": [ + "/api/bgp/catalog" + ], + "dataResponsesMs": 2508, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 628, + "cls": 0.008227206790123459, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 109.10000000149012, + "domInteractiveMs": 242.89999999850988, + "durationMs": 571.3000000007451 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/bgp", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 1032, + "requiredReads": [ + "/api/bgp/catalog" + ], + "dataResponsesMs": 1033, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 764, + "cls": 0.043276721875, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 52.400000002235174, + "domInteractiveMs": 178.30000000074506, + "durationMs": 471.1000000014901 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/filters", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 875, + "requiredReads": [ + "/api/filters/rules" + ], + "dataResponsesMs": 875, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 816, + "cls": 0.036411010079089506, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 166.10000000149012, + "domInteractiveMs": 310.20000000298023, + "durationMs": 603.6000000014901 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/filters", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 516, + "requiredReads": [ + "/api/filters/rules" + ], + "dataResponsesMs": 516, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 524, + "cls": 0.073080721875, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 49.100000001490116, + "domInteractiveMs": 163.89999999850988, + "durationMs": 382 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/backups", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 520, + "requiredReads": [ + "/api/backups" + ], + "dataResponsesMs": 877, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 500, + "cls": 0.000029851948302469136, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 96.5, + "domInteractiveMs": 191.80000000074506, + "durationMs": 421.3999999985099 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/backups", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 501, + "requiredReads": [ + "/api/backups" + ], + "dataResponsesMs": 601, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 468, + "cls": 0.1396483580078125, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 54.899999998509884, + "domInteractiveMs": 181.09999999776483, + "durationMs": 457.8999999985099 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/certificates", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 546, + "requiredReads": [ + "/api/certificates/state" + ], + "dataResponsesMs": 2408, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 856, + "cls": 0.062860234375, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 53.099999997764826, + "domInteractiveMs": 203.5, + "durationMs": 428.8999999985099 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/certificates", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 520, + "requiredReads": [ + "/api/certificates/state" + ], + "dataResponsesMs": 2416, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 520, + "cls": 0.061482699999999994, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 55.19999999925494, + "domInteractiveMs": 176.89999999850988, + "durationMs": 450.30000000074506 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/containers", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 548, + "requiredReads": [ + "/api/containers/state" + ], + "dataResponsesMs": 2414, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 544, + "cls": 0.11558015046296297, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 109.20000000298023, + "domInteractiveMs": 239.30000000074506, + "durationMs": 441.5 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/containers", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 502, + "requiredReads": [ + "/api/containers/state" + ], + "dataResponsesMs": 2361, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 456, + "cls": 0.11563842187500001, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 50, + "domInteractiveMs": 173.80000000074506, + "durationMs": 391.6000000014901 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/alerts", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 581, + "requiredReads": [ + "/api/alerts" + ], + "dataResponsesMs": 942, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 960, + "cls": 0.2825991898148148, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 94.40000000223517, + "domInteractiveMs": 226.10000000149012, + "durationMs": 504.1000000014901 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/alerts", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 510, + "requiredReads": [ + "/api/alerts" + ], + "dataResponsesMs": 1381, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 948, + "cls": 0.67899836875, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 56.19999999925494, + "domInteractiveMs": 180.09999999776483, + "durationMs": 347.69999999925494 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/settings", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 620, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 620, + "cls": 0.0035598427553530094, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 117.5, + "domInteractiveMs": 269.5, + "durationMs": 509.0999999977648 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/settings", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 531, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 480, + "cls": 0.0003595375, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 65.09999999776483, + "domInteractiveMs": 216.60000000149012, + "durationMs": 391 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/releases", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 743, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 696, + "cls": 0.000013114872685185185, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 278.5, + "domInteractiveMs": 428.29999999701977, + "durationMs": 603.2999999970198 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/releases", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 530, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 464, + "cls": 0.000062321875, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 62.5, + "domInteractiveMs": 217.09999999776483, + "durationMs": 386.5999999977648 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/dashboard", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 588, + "requiredReads": [ + "/api/servers", + "/api/uptime/overview", + "/api/filters/rules", + "/api/bgp/catalog", + "/api/internet-path/latest", + "/api/filters/gre-tunnels", + "/api/wireguard", + "/api/traffic/servers", + "/api/vxlan" + ], + "dataResponsesMs": 3482, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 596, + "cls": 0.11174993919843508, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 97.29999999701977, + "domInteractiveMs": 239.5, + "durationMs": 553 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/dashboard", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 607, + "requiredReads": [ + "/api/servers", + "/api/uptime/overview", + "/api/filters/rules", + "/api/bgp/catalog", + "/api/internet-path/latest", + "/api/filters/gre-tunnels", + "/api/wireguard", + "/api/traffic/servers", + "/api/vxlan" + ], + "dataResponsesMs": 2484, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 556, + "cls": 0.071302821875, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 66.80000000074506, + "domInteractiveMs": 167.69999999925494, + "durationMs": 490.3999999985099 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/servers", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 534, + "requiredReads": [ + "/api/servers" + ], + "dataResponsesMs": 635, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 608, + "cls": 0.000044211847752700614, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 58, + "domInteractiveMs": 218.59999999776483, + "durationMs": 449.79999999701977 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/servers", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 453, + "requiredReads": [ + "/api/servers" + ], + "dataResponsesMs": 559, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 396, + "cls": 0.000062321875, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 48.899999998509884, + "domInteractiveMs": 136.30000000074506, + "durationMs": 375.70000000298023 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/uptime", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 804, + "requiredReads": [ + "/api/uptime/overview" + ], + "dataResponsesMs": 910, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 736, + "cls": 0.01717699266975309, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 49.5, + "domInteractiveMs": 182.90000000223517, + "durationMs": 465.30000000074506 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/uptime", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 808, + "requiredReads": [ + "/api/uptime/overview" + ], + "dataResponsesMs": 916, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 748, + "cls": 0.08757044687499999, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 55.600000001490116, + "domInteractiveMs": 181.09999999776483, + "durationMs": 454.79999999701977 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/traffic", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 541, + "requiredReads": [ + "/api/traffic/servers" + ], + "dataResponsesMs": 895, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 908, + "cls": 0.025901459757486978, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 90.80000000074506, + "domInteractiveMs": 218.69999999925494, + "durationMs": 509.6000000014901 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/traffic", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 572, + "requiredReads": [ + "/api/traffic/servers" + ], + "dataResponsesMs": 930, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 588, + "cls": 0.11093063403320312, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 52.399999998509884, + "domInteractiveMs": 218.5, + "durationMs": 566.6999999992549 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/statistics", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 536, + "requiredReads": [ + "/api/statistics" + ], + "dataResponsesMs": 900, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 676, + "cls": 0.05435100839120371, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 50.5, + "domInteractiveMs": 201.29999999701977, + "durationMs": 514.0999999977648 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/statistics", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 516, + "requiredReads": [ + "/api/statistics" + ], + "dataResponsesMs": 616, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 620, + "cls": 0.07823437187499999, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 48.5, + "domInteractiveMs": 177.20000000298023, + "durationMs": 449.9000000022352 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/wireguard", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 548, + "requiredReads": [ + "/api/wireguard" + ], + "dataResponsesMs": 900, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 820, + "cls": 0.00016905755690586422, + "longTasks": 1, + "longTaskMs": 54, + "ttfbMs": 88.60000000149012, + "domInteractiveMs": 221.59999999776483, + "durationMs": 433.19999999925494 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/wireguard", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 448, + "requiredReads": [ + "/api/wireguard" + ], + "dataResponsesMs": 807, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 400, + "cls": 0.00063807578125, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 49.399999998509884, + "domInteractiveMs": 136.80000000074506, + "durationMs": 341.30000000074506 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/ipsec", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 621, + "requiredReads": [ + "/api/ipsec" + ], + "dataResponsesMs": 2492, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 1804, + "cls": 0.00006102382330246914, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 95.5, + "domInteractiveMs": 226.90000000223517, + "durationMs": 654.1000000014901 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/ipsec", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 516, + "requiredReads": [ + "/api/ipsec" + ], + "dataResponsesMs": 1378, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 504, + "cls": 0.000062321875, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 65.39999999850988, + "domInteractiveMs": 203.30000000074506, + "durationMs": 432.5 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/gre", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 553, + "requiredReads": [ + "/api/gre/tunnels" + ], + "dataResponsesMs": 1409, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 524, + "cls": 0.06258026005497686, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 108.19999999925494, + "domInteractiveMs": 243.70000000298023, + "durationMs": 460.80000000074506 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/gre", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 484, + "requiredReads": [ + "/api/gre/tunnels" + ], + "dataResponsesMs": 2342, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 488, + "cls": 0.10702192187500001, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 48.899999998509884, + "domInteractiveMs": 133.89999999850988, + "durationMs": 448.69999999925494 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/vxlan", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 564, + "requiredReads": [ + "/api/vxlan" + ], + "dataResponsesMs": 929, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 528, + "cls": 0.12087190923996914, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 106.80000000074506, + "domInteractiveMs": 244.5, + "durationMs": 446.6000000014901 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/vxlan", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 498, + "requiredReads": [ + "/api/vxlan" + ], + "dataResponsesMs": 854, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 444, + "cls": 0.24465938125, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 55.5, + "domInteractiveMs": 184.19999999925494, + "durationMs": 368.6000000014901 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/ospf", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 544, + "requiredReads": [ + "/api/ospf/catalog" + ], + "dataResponsesMs": 2408, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 544, + "cls": 0.0054106802782600315, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 95.80000000074506, + "domInteractiveMs": 225.70000000298023, + "durationMs": 637.6000000014901 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/ospf", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 503, + "requiredReads": [ + "/api/ospf/catalog" + ], + "dataResponsesMs": 2382, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 444, + "cls": 0.019630139453125, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 49.900000002235174, + "domInteractiveMs": 178.80000000074506, + "durationMs": 421.0999999977648 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/bgp", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 616, + "requiredReads": [ + "/api/bgp/catalog" + ], + "dataResponsesMs": 968, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 612, + "cls": 0.008227206790123459, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 106.70000000298023, + "domInteractiveMs": 275.9000000022352, + "durationMs": 549.1999999992549 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/bgp", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 478, + "requiredReads": [ + "/api/bgp/catalog" + ], + "dataResponsesMs": 1363, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 1228, + "cls": 0.043276721875, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 49.399999998509884, + "domInteractiveMs": 156, + "durationMs": 394.30000000074506 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/filters", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 770, + "requiredReads": [ + "/api/filters/rules" + ], + "dataResponsesMs": 770, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 700, + "cls": 0.036411010079089506, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 109.39999999850988, + "domInteractiveMs": 247.5, + "durationMs": 474.30000000074506 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/filters", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 609, + "requiredReads": [ + "/api/filters/rules" + ], + "dataResponsesMs": 609, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 580, + "cls": 0.073081659375, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 52.30000000074506, + "domInteractiveMs": 184.19999999925494, + "durationMs": 407.5 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/backups", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 1066, + "requiredReads": [ + "/api/backups" + ], + "dataResponsesMs": 1066, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 652, + "cls": 0.000029851948302469136, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 94.30000000074506, + "domInteractiveMs": 237.69999999925494, + "durationMs": 623.8999999985099 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/backups", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 462, + "requiredReads": [ + "/api/backups" + ], + "dataResponsesMs": 815, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 420, + "cls": 0.1396459982421875, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 52.30000000074506, + "domInteractiveMs": 142.5, + "durationMs": 394.19999999925494 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/certificates", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 536, + "requiredReads": [ + "/api/certificates/state" + ], + "dataResponsesMs": 2389, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 804, + "cls": 0.06154219907407407, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 56.100000001490116, + "domInteractiveMs": 200.30000000074506, + "durationMs": 442.8999999985099 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/certificates", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 508, + "requiredReads": [ + "/api/certificates/state" + ], + "dataResponsesMs": 2377, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 432, + "cls": 0.060179696874999994, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 52.5, + "domInteractiveMs": 181.39999999850988, + "durationMs": 371.3999999985099 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/containers", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 615, + "requiredReads": [ + "/api/containers/state" + ], + "dataResponsesMs": 2494, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 612, + "cls": 0.11558015046296297, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 119.5, + "domInteractiveMs": 282.30000000074506, + "durationMs": 490.69999999925494 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/containers", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 494, + "requiredReads": [ + "/api/containers/state" + ], + "dataResponsesMs": 2352, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 464, + "cls": 0.11563842187500001, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 50.29999999701977, + "domInteractiveMs": 179.69999999925494, + "durationMs": 386.3999999985099 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/alerts", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 617, + "requiredReads": [ + "/api/alerts" + ], + "dataResponsesMs": 970, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 972, + "cls": 0.2825991898148148, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 88, + "domInteractiveMs": 277.69999999925494, + "durationMs": 480.80000000074506 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/alerts", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 472, + "requiredReads": [ + "/api/alerts" + ], + "dataResponsesMs": 842, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 808, + "cls": 0.67622226875, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 49.69999999925494, + "domInteractiveMs": 148.19999999925494, + "durationMs": 367.19999999925494 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/settings", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 539, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 496, + "cls": 0.0034562909613715283, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 50.400000002235174, + "domInteractiveMs": 221.60000000149012, + "durationMs": 397.4000000022352 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/settings", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 488, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 424, + "cls": 0.0003595375, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 59.69999999925494, + "domInteractiveMs": 168.19999999925494, + "durationMs": 342.8999999985099 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/releases", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 557, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 504, + "cls": 0.000013114872685185185, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 105.30000000074506, + "domInteractiveMs": 234.19999999925494, + "durationMs": 408.1000000014901 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/releases", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 576, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 496, + "cls": 0.000062321875, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 66.09999999776483, + "domInteractiveMs": 238.80000000074506, + "durationMs": 412 + }, + "violations": [], + "auditCompleted": true + } + ], + "blockedWrites": [], + "bounds": [ + "Default rendered state only; data can still be refreshing", + "Synthetic lab timing over SSH, no CPU/network throttling; not field Core Web Vitals", + "Automated WCAG-tagged checks, not manual screen-reader certification" + ], + "completed": true, + "passed": false +} diff --git a/docs/ux-ui/acceptance/ui260-servers-final.json b/docs/ux-ui/acceptance/ui260-servers-final.json new file mode 100644 index 00000000..60f79d45 --- /dev/null +++ b/docs/ux-ui/acceptance/ui260-servers-final.json @@ -0,0 +1,135 @@ +{ + "date": "2026-10-15", + "block": "12.5.260", + "origin": "http://localhost:3000", + "realPortalUiLogin": true, + "responseMocks": false, + "deviceWritesPermitted": false, + "cases": [ + { + "theme": "dark", + "path": "/servers", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 760, + "requiredReads": [ + "/api/servers" + ], + "dataResponsesMs": 1639, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 1232, + "cls": 0.000044211847752700614, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 144.09999999776483, + "domInteractiveMs": 413.5, + "durationMs": 740.3000000007451 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "dark", + "path": "/servers", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 480, + "requiredReads": [ + "/api/servers" + ], + "dataResponsesMs": 585, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "dark", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 452, + "cls": 0.000062321875, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 55.30000000074506, + "domInteractiveMs": 157.19999999925494, + "durationMs": 389.29999999701977 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/servers", + "width": 1440, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 1150, + "requiredReads": [ + "/api/servers" + ], + "dataResponsesMs": 1150, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 988, + "cls": 0.000044211847752700614, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 115.19999999925494, + "domInteractiveMs": 323.6000000014901, + "durationMs": 730.5 + }, + "violations": [], + "auditCompleted": true + }, + { + "theme": "light", + "path": "/servers", + "width": 320, + "pageErrors": [], + "apiErrors": [], + "mainVisibleMs": 1052, + "requiredReads": [ + "/api/servers" + ], + "dataResponsesMs": 1052, + "layout": { + "overflow": false, + "mainOverflow": false, + "theme": "light", + "pendingSkeletons": 0 + }, + "performance": { + "lcp": 632, + "cls": 0.000062321875, + "longTasks": 0, + "longTaskMs": 0, + "ttfbMs": 63, + "domInteractiveMs": 236, + "durationMs": 567 + }, + "violations": [], + "auditCompleted": true + } + ], + "blockedWrites": [], + "readOnlyPosts": [], + "bounds": [ + "Default rendered state only; data can still be refreshing", + "Synthetic lab timing over SSH, no CPU/network throttling; not field Core Web Vitals", + "Automated WCAG-tagged checks, not manual screen-reader certification" + ], + "completed": true, + "passed": true +} diff --git a/docs/ux-ui/acceptance/ui260-summary.json b/docs/ux-ui/acceptance/ui260-summary.json new file mode 100644 index 00000000..f226af55 --- /dev/null +++ b/docs/ux-ui/acceptance/ui260-summary.json @@ -0,0 +1,62 @@ +{ + "date": "2026-10-15", + "block": "12.5.260", + "runtime": { + "backend": "ux-certificates258", + "frontend": "ux-accessibility260-final" + }, + "baseline": { + "cases": 72, + "violatingCases": 23, + "documentOverflow": 0, + "internalBgpOverflowCases": 2 + }, + "final": { + "cases": 72, + "axeViolations": 0, + "documentOverflow": 0, + "mainOverflow": 0, + "pageErrors": 0, + "apiErrors": 0, + "blockedWrites": 0, + "pendingSkeletonCases": 0 + }, + "timings": { + "mainVisible": { + "count": 72, + "p50Ms": 548, + "p95Ms": 1052, + "maxMs": 1243 + }, + "requiredApiResponses": { + "count": 64, + "p50Ms": 1033, + "p95Ms": 2494, + "maxMs": 3482 + } + }, + "local": { + "initialE2E": { + "passed": 55, + "failed": 2 + }, + "afterFocusRemountFix": { + "passed": 6, + "failed": 0 + }, + "finalSharedCases": { + "passed": 4, + "failed": 0 + }, + "uniqueCasesThatPassed": 59, + "typecheck": "passed", + "scopedLint": "passed", + "productionBuild": "passed", + "sourceManifestMatched": 528 + }, + "bounds": [ + "Default rendered state only; data can still be refreshing", + "Synthetic lab timing over SSH, no CPU/network throttling; not field Core Web Vitals", + "Automated WCAG-tagged checks, not manual screen-reader certification" + ] +} diff --git a/docs/ux-ui/screens/ui260-bgp.png b/docs/ux-ui/screens/ui260-bgp.png new file mode 100644 index 0000000000000000000000000000000000000000..cfcd121fc4112c504114bcf36db0013e2046cb6d GIT binary patch literal 51264 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éqpoYz3)7rE6 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 literal 0 HcmV?d00001 diff --git a/docs/ux-ui/screens/ui260-servers.png b/docs/ux-ui/screens/ui260-servers.png new file mode 100644 index 0000000000000000000000000000000000000000..4112f41ef8b70bde5c23bedea4ef321aeb986367 GIT binary patch literal 124138 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 { + await page.addInitScript(value => localStorage.setItem("rl-theme", value), theme) + await page.route("**/health", route => route.fulfill({ json: { ok: true } })) + const servers = ["home-router", "exit-node", "jump-host"].map((type, i) => serverReadSchema.parse({ + id: i + 1, name: `Контраст ${i + 1}`, host: `192.0.2.${i + 1}`, port: 443, + username: "fixture", password: "fixture", useSsl: true, verifySsl: true, type, site: "TEST", country: "RU", asn: "", comment: "", + enabled: true, lanSubnet: "", wanUplinks: [], createdAt: "2026-10-15T00:00:00Z", updatedAt: "2026-10-15T00:00:00Z", + status: "online", latency: 1, os: "7.24.5", model: "CHR", uptime: null, cpuLoad: null, + freeMemory: null, totalMemory: null, identityName: null, sessions: 0, polledAt: null, + })) + await page.route("**/api/**", route => route.fulfill({ json: new URL(route.request().url()).pathname === "/api/servers" ? servers + : new URL(route.request().url()).pathname === "/api/auth/config" ? { required: false } : {} })) + await page.goto("/servers") + for (const name of ["Home Router", "Exit Node", "JumpHost"]) await expect(page.getByRole("cell", { name, exact: true })).toBeVisible() + await page.addScriptTag({ content: axe.source }) + const violations = await page.evaluate(async () => (await (window as unknown as { axe: typeof axe }).axe.run("#main-content", { + runOnly: { type: "rule", values: ["color-contrast"] }, + })).violations.map(v => ({ id: v.id, targets: v.nodes.map(n => n.target) }))) + expect(violations).toEqual([]) +}) + +for (const theme of ["light", "dark"]) test(`Server rail: keyboard selection across pages and target sizes/${theme}`, async ({ page }) => { + await page.addInitScript(value => localStorage.setItem("rl-theme", value), theme) + await page.route("**/health", route => route.fulfill({ json: { ok: true } })) + await page.route("**/api/**", route => { + const path = new URL(route.request().url()).pathname + return route.fulfill({ json: path === "/api/auth/config" ? { required: false } + : path === "/api/servers" ? Array.from({ length: 61 }, (_, i) => ({ + id: i + 1, name: `Роутер ${String(i + 1).padStart(3, "0")}`, host: `192.0.2.${i + 1}`, + enabled: true, status: "online", type: "home-router", country: "RU", + })) : path === "/api/gre/tunnels" ? { tunnels: [], failures: [] } : {} }) + }) + await page.goto("/gre") + const rail = page.getByRole("listbox", { name: "Серверы", exact: true }) + const all = rail.getByRole("option", { name: /Все серверы/ }) + await expect(all).toHaveAttribute("aria-selected", "true") + await all.focus() + await page.keyboard.press("ArrowDown") + const first = rail.getByRole("option", { name: /Роутер 001/ }) + await expect(first).toBeFocused() + await expect(first).toHaveAttribute("aria-selected", "true") + await expect(page).toHaveURL(/server=1(?:&|$)/) + await page.keyboard.press("End") + const last = rail.getByRole("option", { name: /Роутер 061/ }) + await expect(last).toBeFocused() + await expect(last).toHaveAttribute("aria-selected", "true") + await expect(last).toBeInViewport() + await expect(page).toHaveURL(/server=61(?:&|$)/) + await page.keyboard.press("ArrowUp") + await expect(rail.getByRole("option", { name: /Роутер 060/ })).toBeFocused() + await page.keyboard.press("Home") + await expect(all).toBeFocused() + await expect(all).toHaveAttribute("aria-selected", "true") + await page.keyboard.press("Tab") + await expect.poll(() => rail.evaluate(el => el.contains(document.activeElement))).toBe(false) + await page.addScriptTag({ content: axe.source }) + const violations = await page.evaluate(async () => { + const engine = (window as unknown as { axe: typeof axe }).axe + return (await engine.run(document.querySelector('[role="listbox"][aria-label="Серверы"]')!, { + runOnly: { type: "tag", values: ["wcag2a", "wcag2aa", "wcag21a", "wcag21aa", "wcag22aa"] }, + })).violations.map(v => ({ id: v.id, targets: v.nodes.map(n => n.target) })) + }) + expect(violations).toEqual([]) +})