{card.error}
- {:else} -{card.description}
- {/if} -diff --git a/.cursor/rules/frontend-ui-patterns.mdc b/.cursor/rules/frontend-ui-patterns.mdc
index c439b47..f336da7 100644
--- a/.cursor/rules/frontend-ui-patterns.mdc
+++ b/.cursor/rules/frontend-ui-patterns.mdc
@@ -31,7 +31,7 @@ apps/web/src/lib/components/ ← shared + domain + layout
| Элемент | Компонент | Primitive |
|---------|-----------|-----------|
| Page wrapper | `PageShell` | — |
-| Page title | `PageHeader` (`ui/app/page-header`) | — |
+| Page title | `PageHeader` (`ui/app/page-header`) — **без icon** | — |
| Stat metrics | `SectionCards` | `Card` |
| Data list | `DataTableCard` + `AppDataTable` | `Table` |
| Filters | `ListFiltersBar` | `Select`, `Badge` |
@@ -40,8 +40,16 @@ apps/web/src/lib/components/ ← shared + domain + layout
| Status | `StatusBadge` | `Badge` |
| Create/Edit form | `FormSheet` / Dialog | `Sheet`, `Field` |
| Delete confirm | `ConfirmDialog` | `AlertDialog` |
-| Nav | `AppShell` | `Sidebar` |
-| Breadcrumbs | `AppShell` header | `Breadcrumb` |
+| Nav | `AppShell` + `navGroups` | `Sidebar` |
+| Breadcrumbs | `AppShell` header (parent route) | `Breadcrumb` |
+| Tabs (dashboard, ops) | `LINE_TAB_TRIGGER_CLASS` | `Tabs` |
+
+## Запрещено
+
+- `icon` / `iconClass` в `PageHeader`
+- `KpiMetricsGrid` — только `SectionCards`
+- `mx-auto max-w-*` на `PageShell` list-страниц
+- Голый `AppDataTable` без `DataTableCard` на list-экранах
## Spacing
diff --git a/AGENTS.md b/AGENTS.md
index 61b5654..26b8163 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -39,9 +39,14 @@ pnpm --filter @evobgp/web lint
После правок `apps/web/**` — **обязательно** `check` и `lint` (WEB-19).
-## UX-эталон
+## UX-эталон (vps-tracker, без ReUI)
-vps-tracker: `PageShell`, `SectionCards`, `QueryState`, `DataTableCard`, sidebar-07 layout. ReUI не используется — Data Table на shadcn-svelte.
+- **Shell:** `layout/app-shell.svelte` — sidebar-07, `collapsible="icon"`, 5 nav-групп (`nav.ts`), `AppBrand`, `ThemeMenu` в top header, breadcrumb с parent
+- **Страница:** `PageShell` → `PageHeader` (без icon) → `QueryState` / контент
+- **Метрики:** `SectionCards` (не KpiMetricsGrid)
+- **Таблицы:** `DataTableCard` + `AppDataTable` (не голый `Card` + `Table`)
+- **Tabs:** line-variant через `LINE_TAB_TRIGGER_CLASS` (`$lib/ui/app/tabs.ts`)
+- **Тема:** `packages/ui/src/styles/globals.css` синхронизирован с vps-tracker (semantic tokens)
## Коммиты
diff --git a/apps/web/src/lib/components/crud-list-page.svelte b/apps/web/src/lib/components/crud-list-page.svelte
index 79042a8..9c1e494 100644
--- a/apps/web/src/lib/components/crud-list-page.svelte
+++ b/apps/web/src/lib/components/crud-list-page.svelte
@@ -1,20 +1,26 @@
-
@@ -39,15 +50,24 @@
{/if}
{/snippet}
- {#if isLoading}
- {#if skeleton}
- {@render skeleton()}
- {/if}
- {:else if isError}
-
{title}
- {#if description} -{description}
- {/if} - {#if action} -Панель управления
-{card.error}
- {:else} -{card.description}
- {/if} -