@akcelik/strct 1.0.0 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/akcelik-strct.mjs +735 -209
- package/fesm2022/akcelik-strct.mjs.map +1 -1
- package/package.json +1 -1
- package/types/akcelik-strct.d.ts +82 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"akcelik-strct.mjs","sources":["../../../projects/strct/src/lib/theme/theme.service.ts","../../../projects/strct/src/lib/icon/icon.ts","../../../projects/strct/src/lib/theme/theme-switcher.ts","../../../projects/strct/src/lib/overlay/overlay.ts","../../../projects/strct/src/lib/layout/layout.ts","../../../projects/strct/src/lib/layout/nav.ts","../../../projects/strct/src/lib/layout/rail.ts","../../../projects/strct/src/lib/layout/login.ts","../../../projects/strct/src/lib/button/button.ts","../../../projects/strct/src/lib/badge/badge.ts","../../../projects/strct/src/lib/tag/tag.ts","../../../projects/strct/src/lib/avatar/avatar.ts","../../../projects/strct/src/lib/progress/progress.ts","../../../projects/strct/src/lib/spinner/spinner.ts","../../../projects/strct/src/lib/skeleton/skeleton.ts","../../../projects/strct/src/lib/speed-dial/speed-dial.ts","../../../projects/strct/src/lib/card/card.ts","../../../projects/strct/src/lib/accordion/accordion.ts","../../../projects/strct/src/lib/tabs/tabs.ts","../../../projects/strct/src/lib/context-menu/menu.ts","../../../projects/strct/src/lib/tree/tree.ts","../../../projects/strct/src/lib/modal/modal.ts","../../../projects/strct/src/lib/drawer/drawer.ts","../../../projects/strct/src/lib/dropdown/dropdown.ts","../../../projects/strct/src/lib/context-menu/context-menu.ts","../../../projects/strct/src/lib/context-menu/submenu.ts","../../../projects/strct/src/lib/wizard/wizard.ts","../../../projects/strct/src/lib/divider/divider.ts","../../../projects/strct/src/lib/breadcrumb/breadcrumb.ts","../../../projects/strct/src/lib/pagination/pagination.ts","../../../projects/strct/src/lib/section-menu/section-menu.ts","../../../projects/strct/src/lib/kbd/kbd.ts","../../../projects/strct/src/lib/command-palette/command-palette.ts","../../../projects/strct/src/lib/validation/validation.ts","../../../projects/strct/src/lib/forms/field.ts","../../../projects/strct/src/lib/forms/input.ts","../../../projects/strct/src/lib/forms/checkbox.ts","../../../projects/strct/src/lib/forms/toggle.ts","../../../projects/strct/src/lib/forms/radio.ts","../../../projects/strct/src/lib/segmented/segmented.ts","../../../projects/strct/src/lib/forms/range.ts","../../../projects/strct/src/lib/forms/password.ts","../../../projects/strct/src/lib/forms/file.ts","../../../projects/strct/src/lib/rating/rating.ts","../../../projects/strct/src/lib/chips/chips.ts","../../../projects/strct/src/lib/input-otp/input-otp.ts","../../../projects/strct/src/lib/knob/knob.ts","../../../projects/strct/src/lib/input-mask/input-mask.ts","../../../projects/strct/src/lib/combobox/combobox.ts","../../../projects/strct/src/lib/datepicker/datepicker.ts","../../../projects/strct/src/lib/color-picker/color-picker.ts","../../../projects/strct/src/lib/cascade-select/cascade-select.ts","../../../projects/strct/src/lib/description-list/description-list.ts","../../../projects/strct/src/lib/table/table.ts","../../../projects/strct/src/lib/datagrid/datagrid.ts","../../../projects/strct/src/lib/timeline/timeline.ts","../../../projects/strct/src/lib/stack/stack.ts","../../../projects/strct/src/lib/charts/sparkline.ts","../../../projects/strct/src/lib/charts/chart.ts","../../../projects/strct/src/lib/charts/donut.ts","../../../projects/strct/src/lib/charts/gauge.ts","../../../projects/strct/src/lib/flow/flow.ts","../../../projects/strct/src/lib/metric-tile/metric-tile.ts","../../../projects/strct/src/lib/hero/hero.ts","../../../projects/strct/src/lib/alert/alert.ts","../../../projects/strct/src/lib/tooltip/tooltip.ts","../../../projects/strct/src/lib/signpost/signpost.ts","../../../projects/strct/src/lib/toast/toast.ts","../../../projects/strct/src/lib/empty-state/empty-state.ts","../../../projects/strct/src/public-api.ts","../../../projects/strct/src/akcelik-strct.ts"],"sourcesContent":["import { DOCUMENT, Injectable, computed, inject, signal } from '@angular/core';\n\n/** Available color palettes. */\nexport type StrctPalette = 'arctic' | 'ember' | 'sage';\n/** Light or dark mode. */\nexport type StrctMode = 'dark' | 'light';\n\n/** Metadata for a color palette. */\nexport interface StrctPaletteInfo {\n id: StrctPalette;\n /** Human label, shown in switchers. */\n label: string;\n /** Swatch color used by the palette dot. */\n swatch: string;\n}\n\n/** All palettes the token system ships with, in display order. */\nexport const STRCT_PALETTES: readonly StrctPaletteInfo[] = [\n { id: 'arctic', label: 'Arctic Steel', swatch: '#5a7ea3' },\n { id: 'ember', label: 'Warm Ember', swatch: '#96724e' },\n { id: 'sage', label: 'Forest Sage', swatch: '#4e8a68' },\n];\n\nconst PALETTE_KEY = 'strct-palette';\nconst MODE_KEY = 'strct-theme';\n\n/**\n * Owns the active palette + light/dark mode. Writes `data-palette` and\n * `data-theme` onto the document root (which the token layer keys off) and\n * persists the choice to localStorage. Inject it anywhere and read the signals\n * or call the setters.\n */\n@Injectable({ providedIn: 'root' })\nexport class StrctThemeService {\n private readonly doc = inject(DOCUMENT);\n\n private readonly _palette = signal<StrctPalette>('arctic');\n private readonly _mode = signal<StrctMode>('dark');\n\n readonly palette = this._palette.asReadonly();\n readonly mode = this._mode.asReadonly();\n readonly palettes = STRCT_PALETTES;\n readonly isDark = computed(() => this._mode() === 'dark');\n\n constructor() {\n const root = this.doc.documentElement;\n const storedPalette = this.read(PALETTE_KEY) as StrctPalette | null;\n const storedMode = this.read(MODE_KEY) as StrctMode | null;\n\n // Palette: stored choice, else whatever the host declared, else default.\n this.applyPalette(\n storedPalette ?? (root.getAttribute('data-palette') as StrctPalette | null) ?? 'arctic',\n );\n\n // Mode: an explicit stored choice always wins. Otherwise follow the operating\n // system's light/dark preference — and keep following it live — so a user\n // working at night / in a dim room is never forced onto a bright screen. The\n // initial resolution is NOT persisted, so it stays OS-driven until the user\n // makes a deliberate choice via setMode/toggleMode.\n if (storedMode) {\n this.applyMode(storedMode);\n } else {\n // OS preference wins over a host-declared default; the attribute is only a\n // fallback for environments without matchMedia (SSR).\n this.applyMode(\n this.systemMode() ?? (root.getAttribute('data-theme') as StrctMode | null) ?? 'dark',\n );\n this.watchSystemMode();\n }\n }\n\n setPalette(palette: StrctPalette): void {\n this.applyPalette(palette);\n this.write(PALETTE_KEY, palette);\n }\n\n setMode(mode: StrctMode): void {\n this.applyMode(mode);\n this.write(MODE_KEY, mode);\n }\n\n private applyPalette(palette: StrctPalette): void {\n this._palette.set(palette);\n this.doc.documentElement.setAttribute('data-palette', palette);\n }\n\n private applyMode(mode: StrctMode): void {\n this._mode.set(mode);\n this.doc.documentElement.setAttribute('data-theme', mode);\n }\n\n /** The OS-level light/dark preference, or null when matchMedia is unavailable. */\n private systemMode(): StrctMode | null {\n try {\n const view = this.doc.defaultView;\n if (!view?.matchMedia) return null;\n return view.matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark';\n } catch {\n return null;\n }\n }\n\n /** Track OS theme changes until the user makes an explicit choice. */\n private watchSystemMode(): void {\n try {\n const mq = this.doc.defaultView?.matchMedia('(prefers-color-scheme: dark)');\n mq?.addEventListener('change', (e: MediaQueryListEvent) => {\n if (this.read(MODE_KEY)) return; // user has since chosen — stop following\n this.applyMode(e.matches ? 'dark' : 'light');\n });\n } catch {\n // matchMedia unavailable (SSR) — stay on the resolved default.\n }\n }\n\n toggleMode(): void {\n this.setMode(this._mode() === 'dark' ? 'light' : 'dark');\n }\n\n private read(key: string): string | null {\n try {\n return this.doc.defaultView?.localStorage.getItem(key) ?? null;\n } catch {\n return null;\n }\n }\n\n private write(key: string, value: string): void {\n try {\n this.doc.defaultView?.localStorage.setItem(key, value);\n } catch {\n // Storage unavailable (private mode / SSR) — choice is session-only.\n }\n }\n}\n","import {\n Component,\n ChangeDetectionStrategy,\n ViewEncapsulation,\n computed,\n input,\n} from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { inject } from '@angular/core';\n\n/**\n * Inner markup (path/shape contents) for each icon, drawn on a 0 0 16 16\n * viewBox with `currentColor` stroke. Keep strokes at 1.3–1.5 for crispness.\n *\n * RENDER SIZES (\"16 Native\" policy): object / semantic glyphs must render at the\n * grid's native 16px or larger — never downscaled (fractional scaling blurs\n * hairlines). Simple single-stroke glyphs (chevrons, close, check, dots) may\n * render at 11–14px; their wide details survive scaling.\n *\n * DETAIL BUDGET (small-size legibility): icons render as small as 14px, so keep\n * gaps between parallel details ≥ 1.5px on the 16-grid (≈ max 3 parallel lines),\n * prefer one large distinguishing feature over many small ones, and cap a glyph\n * at ~6 drawing elements. Filled dots should be r ≥ 0.55.\n *\n * The set is intentionally datacenter-flavoured (hosts, clusters, switches,\n * storage, VMs …). Object state — running / stopped / maintenance — is layered\n * on with the `badge` input rather than a separate icon per state.\n */\nexport const STRCT_ICONS: Record<string, string> = {\n // ── General UI ───────────────────────────────────────────────\n hexagon: '<path d=\"M8 1.6l5.5 3.2v6.4L8 14.4 2.5 11.2V4.8L8 1.6z\"/>',\n chevronRight: '<path d=\"M6 3.5L10.5 8 6 12.5\"/>',\n chevronLeft: '<path d=\"M10 3.5L5.5 8 10 12.5\"/>',\n chevronDoubleRight: '<path d=\"M3.5 3.5L8 8l-4.5 4.5M8.5 3.5L13 8l-4.5 4.5\"/>',\n chevronDown: '<path d=\"M3.5 6L8 10.5 12.5 6\"/>',\n compass: '<circle cx=\"8\" cy=\"8\" r=\"6\"/><path d=\"M10.6 5.4l-1.5 3.7-3.7 1.5 1.5-3.7 3.7-1.5z\"/>',\n close: '<path d=\"M4 4l8 8M12 4l-8 8\"/>',\n check: '<path d=\"M3.5 8.5l3 3 6-7\"/>',\n menu: '<path d=\"M3 4.5h10M3 8h10M3 11.5h10\"/>',\n dots: '<circle cx=\"8\" cy=\"3.5\" r=\"1.1\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"8\" cy=\"8\" r=\"1.1\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"8\" cy=\"12.5\" r=\"1.1\" fill=\"currentColor\" stroke=\"none\"/>',\n ellipsis:\n '<circle cx=\"3.5\" cy=\"8\" r=\"1.1\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"8\" cy=\"8\" r=\"1.1\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"12.5\" cy=\"8\" r=\"1.1\" fill=\"currentColor\" stroke=\"none\"/>',\n search: '<circle cx=\"7\" cy=\"7\" r=\"4\"/><path d=\"M10 10l3.5 3.5\"/>',\n calendar:\n '<rect x=\"2.5\" y=\"3.5\" width=\"11\" height=\"10\" rx=\"1.5\"/><path d=\"M2.5 6.5h11M5.5 2v3M10.5 2v3\"/>',\n eye: '<path d=\"M1.5 8S4 3.5 8 3.5 14.5 8 14.5 8 12 12.5 8 12.5 1.5 8 1.5 8z\"/><circle cx=\"8\" cy=\"8\" r=\"2\"/>',\n upload: '<path d=\"M8 10.5V3M5 5.8L8 2.8l3 3M3 12.8h10\"/>',\n download: '<path d=\"M8 2.5V10M5 7.2L8 10.2l3-3M3 12.8h10\"/>',\n droplet: '<path d=\"M8 2.4S12 6.6 12 9.4a4 4 0 01-8 0c0-2.8 4-7 4-7z\"/>',\n sortAsc: '<path d=\"M8 3.5v9M5 6.5L8 3.5l3 3\"/>',\n sortDesc: '<path d=\"M8 12.5v-9M5 9.5l3 3 3-3\"/>',\n sortNone: '<path d=\"M5.5 6.5L8 4l2.5 2.5M5.5 9.5L8 12l2.5-2.5\"/>',\n sun: '<circle cx=\"8\" cy=\"8\" r=\"3.2\"/><path d=\"M8 1.5v1.5M8 13v1.5M1.5 8H3M13 8h1.5M3.8 3.8l1 1M11.2 11.2l1 1M3.8 12.2l1-1M11.2 4.8l1-1\"/>',\n moon: '<path d=\"M13 9a5 5 0 01-6-6 5.5 5.5 0 106 6z\"/>',\n info: '<circle cx=\"8\" cy=\"8\" r=\"6\"/><path d=\"M8 7.2v3.6M8 5.2v.2\"/>',\n warning: '<path d=\"M8 2.5l6 11H2l6-11z\"/><path d=\"M8 6.8v3M8 11.6v.2\"/>',\n critical: '<circle cx=\"8\" cy=\"8\" r=\"6\"/><path d=\"M8 5v3.6M8 10.8v.2\"/>',\n success: '<circle cx=\"8\" cy=\"8\" r=\"6\"/><path d=\"M5.2 8.2l2 2 3.6-4\"/>',\n bell: '<path d=\"M8 2.6a3.4 3.4 0 00-3.4 3.4c0 2.9-1.1 3.9-1.1 3.9h9s-1.1-1-1.1-3.9A3.4 3.4 0 008 2.6z\"/><path d=\"M6.8 12.8a1.3 1.3 0 002.4 0\"/>',\n heart:\n '<path d=\"M8 13.3S2.7 10 2.7 6.3A2.6 2.6 0 018 4.9a2.6 2.6 0 015.3 1.4C13.3 10 8 13.3 8 13.3z\"/>',\n layers:\n '<path d=\"M8 2l5.5 3-5.5 3-5.5-3L8 2z\"/><path d=\"M2.5 8L8 11l5.5-3\"/><path d=\"M2.5 11L8 14l5.5-3\"/>',\n grid: '<rect x=\"2\" y=\"2.5\" width=\"5\" height=\"5\" rx=\"1\"/><rect x=\"9\" y=\"2.5\" width=\"5\" height=\"5\" rx=\"1\"/><rect x=\"2\" y=\"9\" width=\"5\" height=\"5\" rx=\"1\"/><rect x=\"9\" y=\"9\" width=\"5\" height=\"5\" rx=\"1\"/>',\n form: '<rect x=\"2.5\" y=\"2.5\" width=\"11\" height=\"11\" rx=\"1.5\"/><path d=\"M5 6h6M5 8.5h6M5 11h3.5\"/>',\n chart: '<path d=\"M2.5 13V3M2.5 13H13\"/><path d=\"M5 10l2.3-2.3 2 1.4L12.5 5.5\"/>',\n bars: '<path d=\"M2.5 13V3M2.5 13H13\"/><rect x=\"4.3\" y=\"8.5\" width=\"1.8\" height=\"2.5\"/><rect x=\"7.4\" y=\"6.5\" width=\"1.8\" height=\"4.5\"/><rect x=\"10.5\" y=\"4.5\" width=\"1.8\" height=\"6.5\"/>',\n sidebar:\n '<rect x=\"2\" y=\"3\" width=\"12\" height=\"10\" rx=\"1.5\"/><line x1=\"6.2\" y1=\"3\" x2=\"6.2\" y2=\"13\"/>',\n palette:\n '<path d=\"M8 2.2a5.8 5.8 0 100 11.6c.9 0 1.4-.7 1.4-1.4 0-.9-.8-1.2-.8-1.9 0-.5.4-.9 1-.9h1A3.2 3.2 0 0013.8 6 5.9 5.9 0 008 2.2z\"/><circle cx=\"5.4\" cy=\"6.6\" r=\".7\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"8\" cy=\"5.2\" r=\".7\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"10.4\" cy=\"6.6\" r=\".7\" fill=\"currentColor\" stroke=\"none\"/>',\n gauge:\n '<path d=\"M2.6 11.5a6 6 0 1110.8 0\"/><path d=\"M8 8.5l2.6-2.2\"/><circle cx=\"8\" cy=\"8.6\" r=\".7\" fill=\"currentColor\" stroke=\"none\"/>',\n copy: '<rect x=\"5\" y=\"5\" width=\"8\" height=\"8\" rx=\"1.4\"/><path d=\"M11 5V3.9A1.4 1.4 0 0 0 9.6 2.5H3.9A1.4 1.4 0 0 0 2.5 3.9v5.7A1.4 1.4 0 0 0 3.9 11H5\"/>',\n code: '<path d=\"M5.5 5L2.5 8l3 3M10.5 5l3 3-3 3M9 3.5l-2 9\"/>',\n book: '<path d=\"M3 3.2h6a1.5 1.5 0 0 1 1.5 1.5v8.1H4.5A1.5 1.5 0 0 1 3 11.3z\"/><path d=\"M13 3.2H9.5A1.5 1.5 0 0 0 8 4.7v8.1h5z\"/>',\n terminal:\n '<rect x=\"2\" y=\"3\" width=\"12\" height=\"10\" rx=\"1.5\"/><path d=\"M4.8 6.5L7 8.2 4.8 9.9M8.2 10.2h3\"/>',\n folder:\n '<path d=\"M2 4.6a1 1 0 0 1 1-1h3.1l1.3 1.6H13a1 1 0 0 1 1 1V12a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1z\"/>',\n template:\n '<path d=\"M4.3 2.5h4.6l3.1 3.1V13a.5.5 0 0 1-.5.5H4.3a.5.5 0 0 1-.5-.5V3a.5.5 0 0 1 .5-.5z\"/><path d=\"M8.7 2.6v3.1h3.1\"/><path d=\"M5.8 9h4.2M5.8 11h2.6\"/>',\n // Plain document — a file with a dog-ear fold, no field/text lines (vs `template` / `form`).\n file: '<path d=\"M4 2.5h4.9l3.1 3.1v7.9a.5.5 0 0 1-.5.5H4a.5.5 0 0 1-.5-.5V3a.5.5 0 0 1 .5-.5z\"/><path d=\"M8.8 2.6v3.1h3.1\"/>',\n // Clipboard with a checklist — task list (vs `logs`, which reads as a stream).\n clipboard:\n '<rect x=\"3.3\" y=\"3.2\" width=\"9.4\" height=\"10.4\" rx=\"1.3\"/><rect x=\"5.8\" y=\"1.9\" width=\"4.4\" height=\"2.2\" rx=\".8\"/><path d=\"M6 8.2l1 1 2.2-2.4M6 11h4\"/>',\n tag: '<path d=\"M2.6 7.7V3.2a.6.6 0 0 1 .6-.6h4.5l5.6 5.6a1 1 0 0 1 0 1.4l-3.5 3.5a1 1 0 0 1-1.4 0z\"/><circle cx=\"5.4\" cy=\"5.4\" r=\".9\" fill=\"currentColor\" stroke=\"none\"/>',\n\n // ── Actions ──────────────────────────────────────────────────\n plus: '<path d=\"M8 3v10M3 8h10\"/>',\n minus: '<path d=\"M3 8h10\"/>',\n pencil: '<path d=\"M11.5 2.5l2 2-8.5 8.5-3 .5.5-3z\"/>',\n trash:\n '<path d=\"M3 4.5h10\"/><path d=\"M6.3 4.5v-1a1 1 0 0 1 1-1h1.4a1 1 0 0 1 1 1v1\"/><path d=\"M4.2 4.5L5 13.3a1 1 0 0 0 1 .9h4a1 1 0 0 0 1-.9L11.8 4.5\"/><path d=\"M6.6 6.9v4.6M8 6.9v4.6M9.4 6.9v4.6\"/>',\n refresh: '<path d=\"M13.5 7.5a5.5 5.5 0 11-2-5.2\"/><path d=\"M13.5 2.5v3.5H10\"/>',\n filter: '<path d=\"M2 3.5h12l-4.5 5.5v4.5h-3V9z\"/>',\n settings:\n '<path d=\"M8 5.5a2.5 2.5 0 100 5 2.5 2.5 0 000-5z\"/><path d=\"M7.2 1.5h1.6l.3 1.8c.4.1.8.3 1.2.5l1.5-1.1 1.1 1.1-1.1 1.5c.2.4.4.8.5 1.2l1.8.3v1.6l-1.8.3c-.1.4-.3.8-.5 1.2l1.1 1.5-1.1 1.1-1.5-1.1c-.4.2-.8.4-1.2.5l-.3 1.8H7.2l-.3-1.8a5.4 5.4 0 01-1.2-.5l-1.5 1.1-1.1-1.1 1.1-1.5a5.4 5.4 0 01-.5-1.2l-1.8-.3V7.2l1.8-.3c.1-.4.3-.8.5-1.2L2.7 4.2l1.1-1.1 1.5 1.1c.4-.2.8-.4 1.2-.5z\"/>',\n user: '<path d=\"M8 8a2.5 2.5 0 100-5A2.5 2.5 0 008 8z\"/><path d=\"M3 14.5c0-2.8 2.2-5 5-5s5 2.2 5 5\"/>',\n logout: '<path d=\"M10 3.5h2a1 1 0 011 1v7a1 1 0 01-1 1h-2M6.5 5.5L3.5 8l3 3M3.5 8h6.5\"/>',\n undo: '<path d=\"M4.5 5.5L2 8l2.5 2.5M2.5 8h7a3 3 0 013 3v.5\"/>',\n redo: '<path d=\"M11.5 5.5L14 8l-2.5 2.5M13.5 8h-7a3 3 0 00-3 3v.5\"/>',\n arrowUp: '<path d=\"M8 13V3M3.5 6.5L8 2l4.5 4.5\"/>',\n arrowDown: '<path d=\"M8 3v10M3.5 9.5L8 14l4.5-4.5\"/>',\n arrowLeft: '<path d=\"M13 8H3M6.5 3.5L2 8l4.5 4.5\"/>',\n arrowRight: '<path d=\"M3 8h10M9.5 3.5L14 8l-4.5 4.5\"/>',\n externalLink:\n '<path d=\"M9 2.5h4.5V7M13.5 2.5L8.5 7.5M11.5 9v3.5a1 1 0 01-1 1h-7a1 1 0 01-1-1v-7a1 1 0 011-1H7\"/>',\n\n // ── Datacenter / infrastructure ─────────────────────────────\n datacenter:\n '<rect x=\"2.5\" y=\"2.5\" width=\"11\" height=\"11\" rx=\"1\"/><path d=\"M5 5h6M5 7.3h6M5 9.6h3.5\"/><circle cx=\"11\" cy=\"9.7\" r=\".5\" fill=\"currentColor\" stroke=\"none\"/>',\n rack: '<rect x=\"3.5\" y=\"2\" width=\"9\" height=\"12\" rx=\"1\"/><path d=\"M3.5 5.2h9M3.5 8.4h9M3.5 11.6h9\"/><circle cx=\"5.4\" cy=\"3.6\" r=\".4\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"5.4\" cy=\"6.8\" r=\".4\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"5.4\" cy=\"10\" r=\".4\" fill=\"currentColor\" stroke=\"none\"/>',\n cluster:\n '<rect x=\"3\" y=\"3.5\" width=\"3\" height=\"9\" rx=\"1\"/><rect x=\"6.5\" y=\"2.5\" width=\"3\" height=\"11\" rx=\"1\"/><rect x=\"10\" y=\"3.5\" width=\"3\" height=\"9\" rx=\"1\"/><circle cx=\"4.5\" cy=\"6\" r=\".5\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"4.5\" cy=\"8\" r=\".5\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"4.5\" cy=\"10\" r=\".5\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"8\" cy=\"5\" r=\".5\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"8\" cy=\"7\" r=\".5\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"8\" cy=\"9\" r=\".5\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"8\" cy=\"11\" r=\".5\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"11.5\" cy=\"6\" r=\".5\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"11.5\" cy=\"8\" r=\".5\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"11.5\" cy=\"10\" r=\".5\" fill=\"currentColor\" stroke=\"none\"/>',\n host: '<rect x=\"2.5\" y=\"3\" width=\"11\" height=\"4.2\" rx=\"1\"/><rect x=\"2.5\" y=\"8.8\" width=\"11\" height=\"4.2\" rx=\"1\"/><circle cx=\"4.7\" cy=\"5.1\" r=\".55\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"4.7\" cy=\"10.9\" r=\".55\" fill=\"currentColor\" stroke=\"none\"/><path d=\"M7 5.1h4M7 10.9h4\"/>',\n vm: '<rect x=\"2\" y=\"3\" width=\"12\" height=\"8\" rx=\"1\"/><path d=\"M6 14h4M8 11v3\"/>',\n // Network switch — front-panel view: chassis + status LEDs + a row of RJ45 ports.\n switch:\n '<rect x=\"2.2\" y=\"4.8\" width=\"11.6\" height=\"6.4\" rx=\"1\"/><circle cx=\"4.4\" cy=\"7\" r=\".55\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"6.2\" cy=\"7\" r=\".55\" fill=\"currentColor\" stroke=\"none\"/><path d=\"M4 9.4h1.8M7.1 9.4h1.8M10.2 9.4h1.8\"/>',\n storage:\n '<ellipse cx=\"8\" cy=\"3.6\" rx=\"5\" ry=\"2\"/><path d=\"M3 3.6v8.8c0 1.1 2.2 2 5 2s5-.9 5-2V3.6\"/><path d=\"M3 8c0 1.1 2.2 2 5 2s5-.9 5-2\"/>',\n network:\n '<circle cx=\"8\" cy=\"3.4\" r=\"1.7\"/><circle cx=\"3.6\" cy=\"12.4\" r=\"1.7\"/><circle cx=\"12.4\" cy=\"12.4\" r=\"1.7\"/><path d=\"M8 5.1v2.6M7 8.8l-2.4 2M9 8.8l2.4 2\"/>',\n cpu: '<rect x=\"4.5\" y=\"4.5\" width=\"7\" height=\"7\" rx=\"1\"/><rect x=\"6.6\" y=\"6.6\" width=\"2.8\" height=\"2.8\" rx=\".5\"/><path d=\"M6.5 2.6v1.9M9.5 2.6v1.9M6.5 11.5v1.9M9.5 11.5v1.9M2.6 6.5h1.9M2.6 9.5h1.9M11.5 6.5h1.9M11.5 9.5h1.9\"/>',\n memory:\n '<rect x=\"2.4\" y=\"4.4\" width=\"11.2\" height=\"5.6\" rx=\"1\"/><path d=\"M4.6 10v2M8 10v2M11.4 10v2\"/><path d=\"M5 7.2h2.2M8.8 7.2H11\"/>',\n disk: '<circle cx=\"8\" cy=\"8\" r=\"5.6\"/><circle cx=\"8\" cy=\"8\" r=\"1.3\"/><path d=\"M8 2.4v2.3\"/>',\n port: '<rect x=\"3\" y=\"5\" width=\"10\" height=\"6\" rx=\"1\"/><path d=\"M6.5 5V3.6h3V5M5 11v1.6M11 11v1.6\"/>',\n power: '<path d=\"M8 2.4v5\"/><path d=\"M5.2 4.6a5 5 0 105.6 0\"/>',\n // Network Adapter Card (NIC) — PCIe card with an RJ45 (square) port.\n nic: '<rect x=\"2.3\" y=\"3.6\" width=\"11.4\" height=\"6.2\" rx=\"1\"/><rect x=\"4.1\" y=\"5.3\" width=\"3.6\" height=\"2.8\" rx=\".4\"/><path d=\"M9.6 6.7h2.4\"/><path d=\"M5 9.8v2.4M11 9.8v2.4\"/>',\n // Host Bus Adapter (HBA) — PCIe card with optical/SFP (round) ports.\n hba: '<rect x=\"2.3\" y=\"3.6\" width=\"11.4\" height=\"6.2\" rx=\"1\"/><circle cx=\"5.4\" cy=\"6.7\" r=\"1.5\"/><circle cx=\"9.2\" cy=\"6.7\" r=\"1.5\"/><path d=\"M5 9.8v2.4M11 9.8v2.4\"/>',\n // RJ45 ethernet port (switch / server) — keyed jack with contact pins.\n ethernet:\n '<rect x=\"3\" y=\"4.8\" width=\"10\" height=\"6.6\" rx=\"1\"/><path d=\"M6 4.8V3.2h4v1.6\"/><path d=\"M5.6 8.4v1.8M8 8.4v1.8M10.4 8.4v1.8\"/>',\n // Resource pool — a proportional allocation (pie with two radii).\n resourcePool: '<circle cx=\"8\" cy=\"8\" r=\"5.6\"/><path d=\"M8 8V2.4M8 8l4.9 2.7\"/>',\n // Port group — a grouped set of switch ports under a shared rail.\n portGroup:\n '<path d=\"M2.5 5h11\"/><rect x=\"3\" y=\"6.8\" width=\"2.7\" height=\"3.6\" rx=\".4\"/><rect x=\"6.65\" y=\"6.8\" width=\"2.7\" height=\"3.6\" rx=\".4\"/><rect x=\"10.3\" y=\"6.8\" width=\"2.7\" height=\"3.6\" rx=\".4\"/>',\n\n // ── Modern infrastructure ────────────────────────────────────\n pod: '<path d=\"M3 4.5c0-1.1 2.2-2 5-2s5 .9 5 2v7c0 1.1-2.2 2-5 2s-5-.9-5-2z\"/><path d=\"M3 4.5c0 1.1 2.2 2 5 2s5-.9 5-2\"/>',\n deployment:\n '<rect x=\"2.5\" y=\"2.5\" width=\"11\" height=\"4.5\" rx=\"1\"/><rect x=\"2.5\" y=\"9\" width=\"11\" height=\"4.5\" rx=\"1\"/><path d=\"M11.5 5.5l2.5-1.5v4l-2.5-1.5\"/>',\n service:\n '<circle cx=\"4.5\" cy=\"8\" r=\"2\"/><circle cx=\"11.5\" cy=\"4.5\" r=\"2\"/><circle cx=\"11.5\" cy=\"11.5\" r=\"2\"/><path d=\"M6.2 6.8l3.3-1.3M6.2 9.2l3.3 1.3\"/>',\n node: '<rect x=\"2.5\" y=\"4\" width=\"11\" height=\"8\" rx=\"1\"/><path d=\"M5 7h6M5 10h3\"/><circle cx=\"11\" cy=\"10\" r=\".7\" fill=\"currentColor\" stroke=\"none\"/>',\n ingress: '<path d=\"M1.5 4.5h10M1.5 8h8M1.5 11.5h10\"/><path d=\"M10.5 6.5l3 1.5-3 1.5\"/>',\n cloud: '<path d=\"M11.5 10.5a2.5 2.5 0 00-1.5-4.5 2.8 2.8 0 00-5.2.3A2.5 2.5 0 004 10.5z\"/>',\n container:\n '<rect x=\"2.5\" y=\"2.5\" width=\"11\" height=\"11\" rx=\"1.5\"/><path d=\"M2.5 5.5h11M5.5 5.5V3M8 5.5V3M10.5 5.5V3\"/>',\n firewall: '<path d=\"M1.5 4h13v8h-13z\"/><path d=\"M1.5 6.5h13M5 6.5V12M8 4V12M11 6.5V12\"/>',\n shield: '<path d=\"M8 2.3l5.2 1.9v3.3c0 3.1-2.3 5.1-5.2 6.4C5.1 12.6 2.8 10.6 2.8 7.5V4.2z\"/>',\n certificate:\n '<path d=\"M3 2.5h10v9H3z\"/><path d=\"M3 5.5h10M6 8h4\"/><circle cx=\"8\" cy=\"11\" r=\".6\" fill=\"currentColor\" stroke=\"none\"/><path d=\"M12 3.5l2 1.5-2 1.5V3.5z\"/>',\n key: '<circle cx=\"5\" cy=\"9\" r=\"2.8\"/><path d=\"M6.9 7.1l5.6-5.6M11 4.5h2.5V7\"/>',\n metrics: '<path d=\"M2.5 13V3M2.5 13H13\"/><path d=\"M4.5 10l2.5-4 2 2 3-5\"/>',\n logs: '<path d=\"M3 4.5h10M3 7h10M3 9.5h7M3 12h4\"/>',\n trace:\n '<circle cx=\"3.5\" cy=\"5.5\" r=\"1.2\"/><circle cx=\"8\" cy=\"11\" r=\"1.2\"/><circle cx=\"12.5\" cy=\"5.5\" r=\"1.2\"/><path d=\"M4.5 6.3l2.5 3.4M9 9.2l2.5-3.4\"/>',\n\n // ── Accessibility (original glyphs for generic concepts) ─────\n universalAccess:\n '<circle cx=\"8\" cy=\"8\" r=\"6\"/><circle cx=\"8\" cy=\"4.9\" r=\".9\" fill=\"currentColor\" stroke=\"none\"/><path d=\"M4.9 6.3c2 .8 4.2 .8 6.2 0M8 6.4v3.1M6.3 11.9 8 9.4l1.7 2.5\"/>',\n wheelchair:\n '<circle cx=\"6.5\" cy=\"3.1\" r=\"1.3\"/><path d=\"M6.5 4.5v3.3h3.1l1.7 3.4\"/><circle cx=\"6.7\" cy=\"11.3\" r=\"2.6\"/><path d=\"M9.3 11.3h2.1l-.5 1.6\"/>',\n hearing:\n '<path d=\"M5 6.2a3 3 0 0 1 6 0c0 2.2-2.2 2.6-2.2 4.7A1.8 1.8 0 0 1 5 10.8\"/><path d=\"M8.6 13.1a2.2 2.2 0 0 0 2.1-2.2\"/>',\n lowVision:\n '<path d=\"M1.8 8S4.2 4 8 4s6.2 4 6.2 4\"/><circle cx=\"8\" cy=\"8.3\" r=\"2.1\"/><path d=\"M2.6 10.8 4 9.4M13.4 10.8 12 9.4\"/>',\n braille:\n '<circle cx=\"5\" cy=\"4.5\" r=\"1.05\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"5\" cy=\"8\" r=\"1.05\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"5\" cy=\"11.5\" r=\"1.05\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"9\" cy=\"4.5\" r=\"1.05\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"9\" cy=\"8\" r=\"1.05\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"11.2\" cy=\"6\" r=\"1.05\" fill=\"currentColor\" stroke=\"none\"/>',\n signLanguage:\n '<path d=\"M5.6 9.4V5a1 1 0 0 1 2 0M7.6 8V4.3a1 1 0 0 1 2 0V8M9.6 8V5.3a1 1 0 0 1 2 0v4.2c0 2.1-1.7 3.7-3.8 3.7-1.2 0-2.3-.5-3.1-1.5L4.1 11.5a1 1 0 0 1 1.5-1.3z\"/>',\n\n // ── Alert (original glyphs) ─────────────────────────────────\n siren: '<path d=\"M3.5 13h9M5 13V8a3 3 0 0 1 6 0v5M8 2.4V4M3.6 4.6l1 .9M12.4 4.6l-1 .9\"/>',\n alarm:\n '<circle cx=\"8\" cy=\"9\" r=\"4.4\"/><path d=\"M8 6.6V9l1.7 1M5 2.6 3.1 4.3M11 2.6l1.9 1.7M8 4.6V3\"/>',\n megaphone: '<path d=\"M3 7.3v1.6l7 3V4.3zM10 5.7 12.5 4.2v7.6L10 10.3M4 9.6l.9 3.1h1.6l-.7-2.9\"/>',\n flag: '<path d=\"M4 13.5V3M4 3.6h7.4L9.8 6.2l1.6 2.6H4\"/>',\n shieldAlert:\n '<path d=\"M8 2.3l5.2 1.9v3.3c0 3.1-2.3 5.1-5.2 6.4C5.1 12.6 2.8 10.6 2.8 7.5V4.2z\"/><path d=\"M8 5.5v3.1M8 10.6v.2\"/>',\n\n // ── State / action (also usable as badges via the icon `badge` input) ─\n running: '<path d=\"M5.5 4l6 4-6 4z\"/>',\n stopped: '<rect x=\"4.5\" y=\"4.5\" width=\"7\" height=\"7\" rx=\"1\"/>',\n paused:\n '<rect x=\"5.2\" y=\"4\" width=\"2\" height=\"8\" rx=\".5\"/><rect x=\"8.8\" y=\"4\" width=\"2\" height=\"8\" rx=\".5\"/>',\n maintenance:\n '<path d=\"M10.8 3.2a2.7 2.7 0 00-3.5 3.4l-4.2 4.2L4.6 12.7l4.2-4.2a2.7 2.7 0 003.4-3.5L10.5 6.7 9.3 6.4 9 5.2z\"/>',\n sync: '<path d=\"M12.5 7a4.5 4.5 0 00-8-2.5M3.5 9a4.5 4.5 0 008 2.5\"/><path d=\"M12.5 3v2.5H10M3.5 13v-2.5H6\"/>',\n snapshot:\n '<rect x=\"2.5\" y=\"4.5\" width=\"11\" height=\"8\" rx=\"1.5\"/><circle cx=\"8\" cy=\"8.5\" r=\"2.3\"/><path d=\"M6 4.5l1-1.5h2l1 1.5\"/>',\n lock: '<rect x=\"3.5\" y=\"7\" width=\"9\" height=\"6\" rx=\"1.5\"/><path d=\"M5.5 7V5.4a2.5 2.5 0 015 0V7\"/>',\n\n // ── Time & scheduling ────────────────────────────────────────\n clock: '<circle cx=\"8\" cy=\"8\" r=\"5.8\"/><path d=\"M8 4.6V8l2.4 1.7\"/>',\n history: '<path d=\"M3.2 5.4A5.8 5.8 0 112.4 9\"/><path d=\"M3 2.6v3h3\"/><path d=\"M8 5.4V8l2 1.4\"/>',\n timer: '<circle cx=\"8\" cy=\"9.2\" r=\"4.6\"/><path d=\"M6.4 2.2h3.2M8 2.2v2.4M8 9.2l1.9-1.9\"/>',\n hourglass:\n '<path d=\"M4.4 2.5h7.2M4.4 13.5h7.2M5.2 2.5v2L8 8l2.8-3.5v-2M5.2 13.5v-2L8 8l2.8 3.5v2\"/>',\n\n // ── Communication ────────────────────────────────────────────\n mail: '<rect x=\"2.2\" y=\"3.6\" width=\"11.6\" height=\"8.8\" rx=\"1.2\"/><path d=\"M2.8 4.6L8 8.8l5.2-4.2\"/>',\n chat: '<path d=\"M3.7 3h8.6a1.2 1.2 0 011.2 1.2v5a1.2 1.2 0 01-1.2 1.2H7l-3.3 2.8v-2.8h0a1.2 1.2 0 01-1.2-1.2v-5A1.2 1.2 0 013.7 3z\"/><path d=\"M5.4 6h5.2M5.4 8h3.4\"/>',\n\n // ── General additions ────────────────────────────────────────\n help: '<circle cx=\"8\" cy=\"8\" r=\"6\"/><path d=\"M6.2 6.3a1.8 1.8 0 113 1.3c-.7.6-1.2 1-1.2 1.8\"/><path d=\"M8 11.6v.2\"/>',\n home: '<path d=\"M2.8 7.4L8 3l5.2 4.4\"/><path d=\"M4.2 6.6V13h7.6V6.6\"/><path d=\"M6.6 13V9.4h2.8V13\"/>',\n link: '<path d=\"M6.4 9.6l3.2-3.2\"/><path d=\"M7.4 4.7l1.3-1.3a2.6 2.6 0 013.7 3.7l-1.3 1.3\"/><path d=\"M8.6 11.3l-1.3 1.3a2.6 2.6 0 01-3.7-3.7l1.3-1.3\"/>',\n globe:\n '<circle cx=\"8\" cy=\"8\" r=\"5.8\"/><ellipse cx=\"8\" cy=\"8\" rx=\"2.6\" ry=\"5.8\"/><path d=\"M2.2 8h11.6\"/>',\n star: '<path d=\"M8 2.6l1.7 3.5 3.9.6-2.8 2.7.7 3.9L8 11.4l-3.5 1.9.7-3.9-2.8-2.7 3.9-.6z\"/>',\n pin: '<path d=\"M9.6 2.4l4 4-1.7.5-2.3 2.3-.3 2.7L4.6 7.2l2.7-.3L9.6 4.6z\"/><path d=\"M5.6 10.4l-2.8 2.8\"/>',\n share:\n '<circle cx=\"11.6\" cy=\"3.8\" r=\"1.6\"/><circle cx=\"4.2\" cy=\"8\" r=\"1.6\"/><circle cx=\"11.6\" cy=\"12.2\" r=\"1.6\"/><path d=\"M5.7 7.2l4.4-2.6M5.7 8.8l4.4 2.6\"/>',\n archive:\n '<rect x=\"2.4\" y=\"3\" width=\"11.2\" height=\"3.2\" rx=\".8\"/><path d=\"M3.4 6.2V12a1 1 0 001 1h7.2a1 1 0 001-1V6.2\"/><path d=\"M6.6 8.6h2.8\"/>',\n\n // ── View / layout controls ───────────────────────────────────\n zoomIn: '<circle cx=\"7\" cy=\"7\" r=\"4\"/><path d=\"M10 10l3.5 3.5M5.4 7h3.2M7 5.4v3.2\"/>',\n zoomOut: '<circle cx=\"7\" cy=\"7\" r=\"4\"/><path d=\"M10 10l3.5 3.5M5.4 7h3.2\"/>',\n fullscreen: '<path d=\"M2.5 5.5v-3h3M13.5 5.5v-3h-3M2.5 10.5v3h3M13.5 10.5v3h-3\"/>',\n exitFullscreen: '<path d=\"M5.5 2.5v3h-3M10.5 2.5v3h3M5.5 13.5v-3h-3M10.5 13.5v-3h3\"/>',\n listView:\n '<path d=\"M5.6 4h7.9M5.6 8h7.9M5.6 12h7.9\"/><circle cx=\"2.9\" cy=\"4\" r=\".9\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"2.9\" cy=\"8\" r=\".9\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"2.9\" cy=\"12\" r=\".9\" fill=\"currentColor\" stroke=\"none\"/>',\n dragHandle:\n '<circle cx=\"5.6\" cy=\"3.6\" r=\"1.05\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"10.4\" cy=\"3.6\" r=\"1.05\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"5.6\" cy=\"8\" r=\"1.05\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"10.4\" cy=\"8\" r=\"1.05\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"5.6\" cy=\"12.4\" r=\"1.05\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"10.4\" cy=\"12.4\" r=\"1.05\" fill=\"currentColor\" stroke=\"none\"/>',\n chevronUp: '<path d=\"M3.5 10L8 5.5 12.5 10\"/>',\n chevronDoubleLeft: '<path d=\"M12.5 3.5L8 8l4.5 4.5M7.5 3.5L3 8l4.5 4.5\"/>',\n chevronDoubleUp: '<path d=\"M3.5 12.5L8 8l4.5 4.5M3.5 8L8 3.5 12.5 8\"/>',\n chevronDoubleDown: '<path d=\"M3.5 3.5L8 8l4.5-4.5M3.5 8L8 12.5 12.5 8\"/>',\n\n // ── Infrastructure & identity ────────────────────────────────\n dns: '<circle cx=\"8\" cy=\"3.4\" r=\"1.5\"/><circle cx=\"4\" cy=\"12.4\" r=\"1.5\"/><circle cx=\"12\" cy=\"12.4\" r=\"1.5\"/><path d=\"M8 4.9v2.7M8 7.6l-3.2 3.5M8 7.6l3.2 3.5\"/>',\n vpn: '<path d=\"M8 2.3l5.2 1.9v3.3c0 3.1-2.3 5.1-5.2 6.4C5.1 12.6 2.8 10.6 2.8 7.5V4.2z\"/><circle cx=\"8\" cy=\"6.8\" r=\"1.2\"/><path d=\"M8 8v2.2\"/>',\n api: '<path d=\"M5 3.5L2.5 8 5 12.5M11 3.5L13.5 8 11 12.5\"/><circle cx=\"8\" cy=\"8\" r=\".9\" fill=\"currentColor\" stroke=\"none\"/>',\n bolt: '<path d=\"M8.8 2.2L4.6 8.8h2.8L7.2 13.8l4.2-6.8H8.6z\"/>',\n queue: '<path d=\"M3 4.6h10M3 8h10M3 11.4h5.6\"/><path d=\"M11 10l2 1.4-2 1.4\"/>',\n users:\n '<circle cx=\"6\" cy=\"5.6\" r=\"2.2\"/><path d=\"M2.2 13.4c0-2.3 1.7-3.9 3.8-3.9s3.8 1.6 3.8 3.9\"/><path d=\"M10.4 3.8a2.2 2.2 0 010 3.8M11.6 9.8c1.5.6 2.4 1.9 2.4 3.5\"/>',\n login: '<path d=\"M9.5 3.5h2.5a1 1 0 011 1v7a1 1 0 01-1 1H9.5M6.5 5.5L9.5 8l-3 3M9.5 8H3\"/>',\n unlock:\n '<rect x=\"3.5\" y=\"7\" width=\"9\" height=\"6\" rx=\"1.5\"/><path d=\"M5.5 7V5.2A2.5 2.5 0 0110.4 4.4\"/>',\n ban: '<circle cx=\"8\" cy=\"8\" r=\"5.8\"/><path d=\"M3.9 3.9l8.2 8.2\"/>',\n\n // ── Generic vendor marks (abstract glyphs, NOT real trademarked logos) ─\n vendorVmware:\n '<rect x=\"2.5\" y=\"6.5\" width=\"3\" height=\"3.4\" rx=\".5\"/><rect x=\"6.5\" y=\"6.5\" width=\"3\" height=\"3.4\" rx=\".5\"/><rect x=\"10.5\" y=\"6.5\" width=\"3\" height=\"3.4\" rx=\".5\"/>',\n vendorCisco: '<path d=\"M2.5 10.5V7.5M5.5 10.5V5M8 10.5V3.5M10.5 10.5V5M13.5 10.5V7.5\"/>',\n vendorHpe: '<rect x=\"2.5\" y=\"5\" width=\"11\" height=\"6\" rx=\"1\"/><path d=\"M5.5 5v6\"/>',\n vendorDell: '<circle cx=\"8\" cy=\"8\" r=\"5.6\"/><path d=\"M5.4 8h3.4M5.4 6.6h2.6M5.4 9.4h2.6\"/>',\n vendorKaytus: '<path d=\"M5 3v10M5 8l4.5-4.5M5 8l4.5 5\"/>',\n\n // ── Storage & removable media ────────────────────────────────\n // Optical disc (CD / DVD) — platter with a wide hub and a reflective sheen arc.\n opticalDisc:\n '<circle cx=\"8\" cy=\"8\" r=\"5.8\"/><circle cx=\"8\" cy=\"8\" r=\"1.9\"/><path d=\"M10.9 4.7a4.6 4.6 0 011.1 2.4\"/>',\n // SSD — board with two memory chips and an edge connector.\n ssd: '<rect x=\"2.4\" y=\"4.2\" width=\"11.2\" height=\"7.6\" rx=\"1\"/><rect x=\"4\" y=\"6\" width=\"2.6\" height=\"4\" rx=\".4\"/><rect x=\"7.2\" y=\"6\" width=\"2.6\" height=\"4\" rx=\".4\"/><path d=\"M11.2 6.6h1.2M11.2 9.4h1.2\"/>',\n // USB flash drive — body with a metal connector (two contacts) and a label line.\n usb: '<rect x=\"6.2\" y=\"4.3\" width=\"7.3\" height=\"7.4\" rx=\"1.3\"/><rect x=\"2.5\" y=\"6\" width=\"3.7\" height=\"4\" rx=\".4\"/><path d=\"M8.6 6.8h2.7M8.6 9.2h2.7\"/>',\n // SD card — keyed (clipped corner) body with gold contact lines.\n sdCard:\n '<path d=\"M5 2.8h4.6l1.9 1.9v8.2a.5.5 0 01-.5.5H5a.5.5 0 01-.5-.5V3.3a.5.5 0 01.5-.5z\"/><path d=\"M6.8 4.2v2M9.2 4.2v2\"/>',\n // Backup tape (LTO cartridge) — shell with a label strip and two reels.\n tape: '<rect x=\"2.4\" y=\"3.6\" width=\"11.2\" height=\"8.8\" rx=\"1\"/><path d=\"M2.4 5.7h11.2\"/><circle cx=\"6.1\" cy=\"9\" r=\"1.6\"/><circle cx=\"9.9\" cy=\"9\" r=\"1.6\"/>',\n\n // ── Hardware components ──────────────────────────────────────\n // GPU — expansion card with a cooling fan, heatsink fins and a PCIe edge.\n gpu: '<rect x=\"2.3\" y=\"4.4\" width=\"10.4\" height=\"6.6\" rx=\"1\"/><circle cx=\"6.2\" cy=\"7.7\" r=\"2\"/><path d=\"M6.2 5.7v4M4.2 7.7h4\"/><path d=\"M10.3 6.5h1.7M10.3 9h1.7\"/><path d=\"M4.3 11v1.6M9 11v1.6\"/>',\n // PSU — enclosure with a fan and an IEC power socket.\n psu: '<rect x=\"2.4\" y=\"3.6\" width=\"11.2\" height=\"8.8\" rx=\"1\"/><circle cx=\"6.8\" cy=\"8\" r=\"2.5\"/><path d=\"M6.8 5.5v5M4.3 8h5\"/><path d=\"M11.8 6.6v2.8\"/>',\n // Cooling fan — hub with four swept blades.\n fan: '<circle cx=\"8\" cy=\"8\" r=\"5.8\"/><circle cx=\"8\" cy=\"8\" r=\"1.2\"/><path d=\"M8 6.8c2.1-1.6 4-1.2 4.7.5M8 9.2c-2.1 1.6-4 1.2-4.7-.5M9.2 8c1.6 2.1 1.2 4-.5 4.7M6.8 8c-1.6-2.1-1.2-4 .5-4.7\"/>',\n // Battery — cell with terminal nub and charge bars.\n battery:\n '<rect x=\"2.4\" y=\"4.8\" width=\"10\" height=\"6.4\" rx=\"1.2\"/><path d=\"M13 6.8v2.4\"/><path d=\"M4.3 6.8v2.4M6 6.8v2.4M7.7 6.8v2.4\"/>',\n // UPS — tower unit with a lightning bolt and a base line.\n ups: '<rect x=\"3.4\" y=\"2.4\" width=\"9.2\" height=\"11.2\" rx=\"1\"/><path d=\"M8.5 4.6L6.3 8h1.9l-1.7 3.4\"/><path d=\"M5.4 12.4h5.2\"/>',\n // Motherboard — board with a CPU socket, RAM slots and traces.\n motherboard:\n '<rect x=\"2.4\" y=\"2.4\" width=\"11.2\" height=\"11.2\" rx=\"1\"/><rect x=\"4.4\" y=\"4.4\" width=\"4\" height=\"4\" rx=\".5\"/><path d=\"M10.8 4.6v3.8\"/><path d=\"M4.4 11.2h4.6\"/><circle cx=\"11.2\" cy=\"11.2\" r=\".6\" fill=\"currentColor\" stroke=\"none\"/>',\n // Sensor — central node with symmetric detection arcs.\n sensor:\n '<circle cx=\"8\" cy=\"8\" r=\"1.4\" fill=\"currentColor\" stroke=\"none\"/><path d=\"M5.3 5.3a4 4 0 000 5.4M10.7 5.3a4 4 0 010 5.4M3.5 3.5a6.5 6.5 0 000 9M12.5 3.5a6.5 6.5 0 010 9\"/>',\n // Thermometer — stem, bulb and a fill line.\n thermometer:\n '<path d=\"M9.6 8.7V4.6a1.6 1.6 0 10-3.2 0v4.1a2.7 2.7 0 103.2 0z\"/><path d=\"M8 5.6v3.3\"/>',\n\n // ── AI / machine learning ────────────────────────────────────\n // Sparkles — the four-point \"generate / AI\" star plus a small twinkle.\n sparkles:\n '<path d=\"M7.5 2.6l1 2.9 2.9 1-2.9 1-1 2.9-1-2.9-2.9-1 2.9-1z\"/><path d=\"M12 9.8l.45 1.3 1.3.45-1.3.45L12 13.3l-.45-1.3-1.3-.45 1.3-.45z\"/>',\n // Brain — two lobed hemispheres with folds around a central fissure.\n brain:\n '<path d=\"M8 3.3a2.3 2.3 0 00-2.2 1.7 2 2 0 00-1.2 3 2 2 0 001 3 2.2 2.2 0 002.4 1.2\"/><path d=\"M8 3.3a2.3 2.3 0 012.2 1.7 2 2 0 011.2 3 2 2 0 01-1 3 2.2 2.2 0 01-2.4 1.2\"/><path d=\"M8 3.3v9.5\"/><path d=\"M5.8 6.2c.9.2 1.4.9 1.4 1.8M10.2 6.2c-.9.2-1.4.9-1.4 1.8M6 9.6c.8-.1 1.3-.7 1.3-1.5M10 9.6c-.8-.1-1.3-.7-1.3-1.5\"/>',\n // Robot — head with eyes, an antenna and a mouth.\n robot:\n '<rect x=\"3.6\" y=\"5.2\" width=\"8.8\" height=\"7.4\" rx=\"2\"/><circle cx=\"6.4\" cy=\"8.6\" r=\"1\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"9.6\" cy=\"8.6\" r=\"1\" fill=\"currentColor\" stroke=\"none\"/><path d=\"M6.6 10.9h2.8\"/><path d=\"M8 3.1v2\"/><circle cx=\"8\" cy=\"2.6\" r=\".75\"/>',\n // Neural network — four nodes, fully connected.\n neuralNetwork:\n '<circle cx=\"4.5\" cy=\"4.6\" r=\"1.3\"/><circle cx=\"4.5\" cy=\"11.4\" r=\"1.3\"/><circle cx=\"11.5\" cy=\"4.6\" r=\"1.3\"/><circle cx=\"11.5\" cy=\"11.4\" r=\"1.3\"/><path d=\"M5.8 4.6h4.4M5.8 11.4h4.4M5.6 5.6l4.8 4.8M5.6 10.4l4.8-4.8\"/>',\n // AI chip — a CPU frame with a sparkle inside instead of a plain core.\n aiChip:\n '<rect x=\"4.3\" y=\"4.3\" width=\"7.4\" height=\"7.4\" rx=\"1\"/><path d=\"M8 5.9l.55 1.55L10.1 8l-1.55.55L8 10.1l-.55-1.55L5.9 8l1.55-.45z\"/><path d=\"M6.5 2.6v1.7M9.5 2.6v1.7M6.5 11.7v1.7M9.5 11.7v1.7M2.6 6.5h1.7M2.6 9.5h1.7M11.7 6.5h1.7M11.7 9.5h1.7\"/>',\n // Wand — magic wand with a sparkle at the tip.\n wand: '<path d=\"M3.8 12.2l6.4-6.4\"/><path d=\"M10.4 3.1l.5 1.4 1.4.5-1.4.5-.5 1.4-.5-1.4-1.4-.5 1.4-.5z\"/><path d=\"M4.7 4.4l.32.9.9.32-.9.32-.32.9-.32-.9-.9-.32.9-.32z\"/>',\n // Model — a packaged 3D artifact (solid box).\n model:\n '<path d=\"M8 2.4l4.9 2.7v5.8L8 13.6l-4.9-2.7V5.1z\"/><path d=\"M3.2 5.2L8 7.9l4.8-2.7M8 7.9v5.7\"/>',\n\n // ── Peripherals & networking ─────────────────────────────────\n // Router — chassis with status LEDs and two antennas.\n router:\n '<rect x=\"2.4\" y=\"7\" width=\"11.2\" height=\"5.2\" rx=\"1\"/><circle cx=\"5\" cy=\"9.6\" r=\".55\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"7\" cy=\"9.6\" r=\".55\" fill=\"currentColor\" stroke=\"none\"/><path d=\"M10.6 9.6h1.4\"/><path d=\"M6 7V4.4M10 7V4.4\"/><path d=\"M6 4.4l-1-1.2M10 4.4l1-1.2\"/>',\n // Load balancer — one source distributing to three targets.\n loadBalancer:\n '<circle cx=\"3.8\" cy=\"8\" r=\"1.4\"/><circle cx=\"12.2\" cy=\"4.4\" r=\"1.3\"/><circle cx=\"12.2\" cy=\"8\" r=\"1.3\"/><circle cx=\"12.2\" cy=\"11.6\" r=\"1.3\"/><path d=\"M5.2 8h1.2M6.4 8l4.5-3.4M6.4 8h4.5M6.4 8l4.5 3.4\"/>',\n // Wi-Fi — three broadcast arcs over a node.\n wifi: '<path d=\"M2.6 6.6a8 8 0 0110.8 0\"/><path d=\"M4.8 9a5 5 0 016.4 0\"/><path d=\"M6.9 11.3a2 2 0 012.2 0\"/><circle cx=\"8\" cy=\"12.6\" r=\".6\" fill=\"currentColor\" stroke=\"none\"/>',\n // Bluetooth — the rune.\n bluetooth: '<path d=\"M6 5.6l5 5-3 2.4V3.1l3 2.4-5 5\"/>',\n // Monitor — screen on a stand.\n monitor:\n '<rect x=\"2.4\" y=\"3\" width=\"11.2\" height=\"7.6\" rx=\"1\"/><path d=\"M6.4 13.2h3.2M8 10.6v2.6\"/>',\n // Keyboard — keys and a spacebar.\n keyboard:\n '<rect x=\"2\" y=\"4.4\" width=\"12\" height=\"7.2\" rx=\"1\"/><path d=\"M4.4 7h1.4M7.3 7h1.4M10.2 7h1.4M5.2 9.6h5.6\"/>',\n // Printer — paper feed, body, output sheet and an LED.\n printer:\n '<path d=\"M5 6.4V3.2h6v3.2\"/><rect x=\"2.8\" y=\"6.4\" width=\"10.4\" height=\"4.8\" rx=\"1\"/><path d=\"M5 9.2h6v3.6H5z\"/><circle cx=\"11\" cy=\"8.4\" r=\".5\" fill=\"currentColor\" stroke=\"none\"/>',\n};\n\n// Composite \"off\" variants — re-use base glyph + diagonal slash.\nSTRCT_ICONS['eyeOff'] = `${STRCT_ICONS['eye']}<path d=\"M2.5 2.5l11 11\"/>`;\nSTRCT_ICONS['bellOff'] = `${STRCT_ICONS['bell']}<path d=\"M2.6 2.6l10.8 10.8\"/>`;\nSTRCT_ICONS['wifiOff'] = `${STRCT_ICONS['wifi']}<path d=\"M2.5 2.5l11 11\"/>`;\nSTRCT_ICONS['cloudOff'] = `${STRCT_ICONS['cloud']}<path d=\"M2.5 2.5l11 11\"/>`;\nSTRCT_ICONS['linkOff'] = `${STRCT_ICONS['link']}<path d=\"M2.5 2.5l11 11\"/>`;\n// Semantic aliases.\nSTRCT_ICONS['unlink'] = STRCT_ICONS['linkOff'];\nSTRCT_ICONS['webhook'] = STRCT_ICONS['bolt'];\n\n/** Icon names grouped for galleries / documentation. */\nexport const STRCT_ICON_GROUPS: { label: string; names: string[] }[] = [\n {\n label: 'General',\n names: [\n 'hexagon',\n 'search',\n 'menu',\n 'dots',\n 'ellipsis',\n 'close',\n 'check',\n 'calendar',\n 'eye',\n 'eyeOff',\n 'upload',\n 'download',\n 'sun',\n 'moon',\n 'bell',\n 'heart',\n 'layers',\n 'grid',\n 'form',\n 'chart',\n 'bars',\n 'gauge',\n 'palette',\n 'sidebar',\n 'compass',\n 'copy',\n 'code',\n 'book',\n 'terminal',\n 'folder',\n 'file',\n 'template',\n 'clipboard',\n 'tag',\n 'clock',\n 'history',\n 'timer',\n 'hourglass',\n 'help',\n 'home',\n 'link',\n 'linkOff',\n 'star',\n 'pin',\n 'share',\n 'archive',\n 'mail',\n 'chat',\n 'globe',\n 'listView',\n 'dragHandle',\n 'zoomIn',\n 'zoomOut',\n 'fullscreen',\n 'exitFullscreen',\n 'chevronUp',\n 'chevronDown',\n 'chevronDoubleLeft',\n 'chevronDoubleRight',\n 'chevronDoubleUp',\n 'chevronDoubleDown',\n ],\n },\n {\n label: 'Actions',\n names: [\n 'plus',\n 'minus',\n 'pencil',\n 'trash',\n 'refresh',\n 'filter',\n 'settings',\n 'user',\n 'logout',\n 'login',\n 'users',\n 'unlock',\n 'ban',\n 'undo',\n 'redo',\n 'arrowUp',\n 'arrowDown',\n 'arrowLeft',\n 'arrowRight',\n 'externalLink',\n ],\n },\n {\n label: 'Status',\n names: ['info', 'success', 'warning', 'critical', 'sync', 'lock', 'snapshot'],\n },\n {\n label: 'Alert',\n names: ['bell', 'bellOff', 'siren', 'alarm', 'megaphone', 'flag', 'shieldAlert', 'warning'],\n },\n {\n label: 'Accessibility',\n names: ['universalAccess', 'wheelchair', 'hearing', 'lowVision', 'braille', 'signLanguage'],\n },\n {\n label: 'Datacenter',\n names: [\n 'datacenter',\n 'rack',\n 'cluster',\n 'host',\n 'vm',\n 'switch',\n 'storage',\n 'network',\n 'cpu',\n 'memory',\n 'disk',\n 'port',\n 'nic',\n 'hba',\n 'ethernet',\n 'power',\n 'resourcePool',\n 'portGroup',\n ],\n },\n {\n label: 'Infrastructure',\n names: [\n 'pod',\n 'deployment',\n 'service',\n 'node',\n 'ingress',\n 'cloud',\n 'container',\n 'firewall',\n 'shield',\n 'certificate',\n 'key',\n 'metrics',\n 'logs',\n 'trace',\n 'dns',\n 'vpn',\n 'api',\n 'bolt',\n 'queue',\n ],\n },\n {\n label: 'Storage & media',\n names: ['disk', 'ssd', 'opticalDisc', 'usb', 'sdCard', 'tape', 'snapshot'],\n },\n {\n label: 'Hardware',\n names: ['gpu', 'psu', 'fan', 'battery', 'ups', 'motherboard', 'sensor', 'thermometer'],\n },\n {\n label: 'AI',\n names: ['sparkles', 'brain', 'robot', 'neuralNetwork', 'aiChip', 'wand', 'model'],\n },\n {\n label: 'Peripherals & network',\n names: [\n 'router',\n 'loadBalancer',\n 'wifi',\n 'wifiOff',\n 'cloudOff',\n 'bluetooth',\n 'monitor',\n 'keyboard',\n 'printer',\n ],\n },\n {\n label: 'Object state',\n names: ['running', 'stopped', 'paused', 'maintenance'],\n },\n {\n label: 'Vendor (generic)',\n names: ['vendorVmware', 'vendorCisco', 'vendorHpe', 'vendorDell', 'vendorKaytus'],\n },\n];\n\n/**\n * Full-SVG icons that keep their own viewBox and colors (no stroke wrapper).\n * Use this for brand / vendor logos you have the rights to ship — register the\n * official asset's markup yourself; the library does not bundle any logos.\n */\nexport const STRCT_RAW_ICONS: Record<string, string> = {};\n\n/**\n * Register an icon at runtime.\n * registerStrctIcon('mything', '<path d=\"…\"/>'); // stroke glyph\n * registerStrctIcon('vendorDell', '<svg viewBox=\"…\">…</svg>', { raw: true });\n */\nexport function registerStrctIcon(\n name: string,\n content: string,\n options: { raw?: boolean } = {},\n): void {\n if (options.raw) {\n STRCT_RAW_ICONS[name] = content;\n } else {\n STRCT_ICONS[name] = content;\n }\n}\n\n/**\n * Icon status badge variants — two families, both color-blind safe:\n *\n * **Health** (silhouette-coded): circle ✓ success · triangle ! warning ·\n * diamond × critical · circle i info · circle wrench maintenance.\n *\n * **Lifecycle** (vCenter media language — glyphs in a badge disc):\n * green disc ▶ running · amber disc ⏸ paused · grey disc ■ off.\n */\nexport type StrctIconBadge =\n | 'none'\n | 'success'\n | 'warning'\n | 'critical'\n | 'running'\n | 'paused'\n | 'off'\n | 'info'\n | 'maintenance';\n\n/**\n * Inline stroke icon. `<strct-icon name=\"host\" badge=\"success\" />` renders the host\n * glyph with a green status dot (a \"running host\"). Unknown names render\n * nothing rather than throwing.\n */\n@Component({\n selector: 'strct-icon',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `@if (isRaw()) {\n <span\n class=\"strct-icon__raw\"\n [style.width.px]=\"size()\"\n [style.height.px]=\"size()\"\n [innerHTML]=\"rawSvg()\"\n ></span>\n } @else {\n <svg\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n [attr.stroke-width]=\"strokeWidth()\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n [style.width.px]=\"size()\"\n [style.height.px]=\"size()\"\n [innerHTML]=\"svg()\"\n role=\"img\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-hidden]=\"ariaLabel() ? null : 'true'\"\n ></svg>\n }\n @if (badge() !== 'none') {\n <span class=\"strct-icon__badge strct-icon__badge--{{ badge() }}\">\n @if (badge() === 'maintenance') {\n <svg\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path\n d=\"M3.5 2.5c-1.5 0-2.5 1.5-1.5 3l3.5 3.5c-.5 1.5 0 3 1.5 3.5s3 0 3.5-1.5M6.5 5.5l6 6M7.5 10.5c1 1.5 2.5 2.5 4 1.5s1.5-2.5.5-4\"\n />\n </svg>\n }\n </span>\n }`,\n host: { class: 'strct-icon' },\n styles: [\n `\n .strct-icon {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n line-height: 0;\n }\n .strct-icon__raw {\n display: inline-flex;\n }\n .strct-icon__raw > svg {\n width: 100%;\n height: 100%;\n display: block;\n }\n .strct-icon__badge {\n position: absolute;\n inset-inline-end: -3px;\n bottom: -3px;\n width: 50%;\n height: 50%;\n min-width: 8px;\n min-height: 8px;\n max-width: 12px;\n max-height: 12px;\n border-radius: 50%;\n box-shadow: 0 0 0 1.5px var(--bg-1);\n }\n /* Health states are silhouette-coded (circle ✓ · triangle ! · diamond ×\n · circle i); lifecycle states speak vCenter's media language inside a\n badge disc (▶ running · ⏸ paused · ■ off). Both read without color. */\n .strct-icon__badge--success,\n .strct-icon__badge--critical,\n .strct-icon__badge--info,\n .strct-icon__badge--off,\n .strct-icon__badge--paused,\n .strct-icon__badge--running {\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: clamp(6px, 68%, 10px);\n font-weight: 800;\n line-height: 1;\n color: var(--inv);\n }\n .strct-icon__badge--success {\n background: var(--success);\n }\n .strct-icon__badge--success::before {\n content: '✓';\n }\n .strct-icon__badge--warning {\n background: var(--warning);\n border-radius: 1px;\n clip-path: polygon(50% 10%, 92% 90%, 8% 90%);\n box-shadow: none;\n filter: drop-shadow(0 0 1.5px var(--bg-1));\n inset-inline-end: -2px;\n bottom: -2px;\n width: 60%;\n height: 60%;\n min-width: 11px;\n min-height: 11px;\n max-width: 18px;\n max-height: 18px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: clamp(6px, 70%, 10px);\n font-weight: 800;\n color: var(--inv);\n line-height: 1;\n }\n .strct-icon__badge--warning::before {\n content: '!';\n }\n /* Critical: diamond silhouette (vSphere-style alarm language). */\n .strct-icon__badge--critical {\n background: var(--critical);\n border-radius: 1px;\n clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%);\n box-shadow: none;\n filter: drop-shadow(0 0 1.5px var(--bg-1));\n width: 58%;\n height: 58%;\n min-width: 10px;\n min-height: 10px;\n max-width: 15px;\n max-height: 15px;\n font-size: clamp(6px, 56%, 9px);\n }\n .strct-icon__badge--critical::before {\n content: '×';\n }\n /* Running: green disc with a play triangle. */\n .strct-icon__badge--running {\n background: var(--success);\n }\n .strct-icon__badge--running::before {\n content: '';\n width: 46%;\n height: 46%;\n min-width: 4px;\n min-height: 4px;\n background: var(--inv);\n clip-path: polygon(15% 2%, 100% 50%, 15% 98%);\n transform: translateX(9%);\n }\n /* Paused: amber disc with two pause bars. */\n .strct-icon__badge--paused {\n background: var(--warning);\n }\n .strct-icon__badge--paused::before {\n content: '';\n width: 1.6px;\n height: 42%;\n min-height: 4px;\n background: var(--inv);\n box-shadow: 2.6px 0 0 var(--inv);\n transform: translateX(-1.3px);\n }\n /* Off / stopped: neutral grey disc with a stop square. */\n .strct-icon__badge--off {\n background: var(--t3);\n }\n .strct-icon__badge--off::before {\n content: '';\n width: 40%;\n height: 40%;\n min-width: 3.5px;\n min-height: 3.5px;\n background: var(--inv);\n border-radius: 1px;\n }\n .strct-icon__badge--info {\n background: var(--acc);\n }\n .strct-icon__badge--info::before {\n content: 'i';\n }\n .strct-icon__badge--maintenance {\n background: var(--warning);\n inset-inline-end: -2px;\n bottom: -2px;\n width: 58%;\n height: 58%;\n min-width: 10px;\n min-height: 10px;\n max-width: 16px;\n max-height: 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 1px;\n box-shadow: 0 0 0 1.5px var(--bg-1);\n }\n .strct-icon__badge--maintenance svg {\n width: 84%;\n height: 84%;\n color: var(--inv);\n }\n `,\n ],\n})\nexport class StrctIcon {\n private readonly sanitizer = inject(DomSanitizer);\n\n /** Icon name from the STRCT_ICONS registry. */\n readonly name = input.required<string>();\n /** Icon size in pixels. */\n readonly size = input(16);\n /** Stroke width for outline icons. */\n readonly strokeWidth = input(1.4);\n /** Optional status dot overlaid on the glyph (object state). */\n readonly badge = input<StrctIconBadge>('none');\n /** Accessible label for the icon. When empty the icon is hidden from assistive tech. */\n readonly ariaLabel = input<string>('');\n\n /** True when the named icon is a full-SVG (raw) icon registered by the app. */\n protected readonly isRaw = computed(() =>\n Object.prototype.hasOwnProperty.call(STRCT_RAW_ICONS, this.name()),\n );\n\n protected readonly svg = computed<SafeHtml>(() =>\n this.sanitizer.bypassSecurityTrustHtml(STRCT_ICONS[this.name()] ?? ''),\n );\n protected readonly rawSvg = computed<SafeHtml>(() =>\n this.sanitizer.bypassSecurityTrustHtml(STRCT_RAW_ICONS[this.name()] ?? ''),\n );\n}\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation, inject } from '@angular/core';\nimport { StrctIcon } from '../icon/icon';\nimport { StrctThemeService } from './theme.service';\n\n/** Palette dots + light/dark pill, wired to {@link StrctThemeService}. */\n@Component({\n selector: 'strct-theme-switcher',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon],\n template: `\n <div class=\"strct-ts__pal\">\n @for (p of theme.palettes; track p.id) {\n <button\n type=\"button\"\n class=\"strct-ts__dot\"\n [class.strct-ts__dot--on]=\"theme.palette() === p.id\"\n [title]=\"p.label\"\n [attr.aria-label]=\"p.label\"\n [attr.aria-pressed]=\"theme.palette() === p.id\"\n (click)=\"theme.setPalette(p.id)\"\n >\n <span class=\"strct-ts__inner\" [style.background]=\"p.swatch\"></span>\n </button>\n }\n </div>\n <div class=\"strct-ts__pill\">\n <button\n type=\"button\"\n class=\"strct-ts__pbtn\"\n [class.strct-ts__pbtn--on]=\"!theme.isDark()\"\n title=\"Light\"\n aria-label=\"Light theme\"\n (click)=\"theme.setMode('light')\"\n >\n <strct-icon name=\"sun\" [size]=\"16\" [strokeWidth]=\"1.5\" />\n </button>\n <button\n type=\"button\"\n class=\"strct-ts__pbtn\"\n [class.strct-ts__pbtn--on]=\"theme.isDark()\"\n title=\"Dark\"\n aria-label=\"Dark theme\"\n (click)=\"theme.setMode('dark')\"\n >\n <strct-icon name=\"moon\" [size]=\"16\" [strokeWidth]=\"1.5\" />\n </button>\n </div>\n `,\n host: { class: 'strct-ts' },\n styles: [\n `\n .strct-ts {\n display: inline-flex;\n align-items: center;\n gap: 14px;\n }\n .strct-ts__pal {\n display: inline-flex;\n gap: 7px;\n }\n .strct-ts__dot {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 18px;\n border-radius: 50%;\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 1.5px solid rgba(255, 255, 255, 0.35);\n transition:\n transform 0.15s ease,\n border-color 0.15s ease;\n }\n .strct-ts__dot:hover {\n transform: scale(1.12);\n }\n .strct-ts__inner {\n width: 11px;\n height: 11px;\n border-radius: 50%;\n display: block;\n }\n .strct-ts__dot--on {\n border-color: var(--hdr-fg);\n box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.25);\n }\n\n .strct-ts__pill {\n display: inline-flex;\n padding: 2px;\n gap: 2px;\n border-radius: 7px;\n background: rgba(255, 255, 255, 0.1);\n }\n .strct-ts__pbtn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 22px;\n border: 0;\n border-radius: 5px;\n cursor: pointer;\n background: transparent;\n color: rgba(255, 255, 255, 0.6);\n transition:\n background 0.14s ease,\n color 0.14s ease;\n }\n .strct-ts__pbtn--on {\n background: rgba(255, 255, 255, 0.18);\n color: var(--hdr-fg);\n }\n `,\n ],\n})\nexport class StrctThemeSwitcher {\n protected readonly theme = inject(StrctThemeService);\n}\n","import {\n Directive,\n ElementRef,\n NgZone,\n OnDestroy,\n afterNextRender,\n inject,\n input,\n} from '@angular/core';\n\n/** Overlay positioning strategies. */\nexport type StrctOverlayPlacement =\n | 'bottom-start'\n | 'bottom-end'\n | 'top-start'\n | 'top-end'\n | 'right'\n | 'left';\n\n/**\n * Positions an overlay panel with `position: fixed` relative to an anchor\n * element, so it escapes ancestor `overflow: hidden/scroll` clipping.\n * Repositions on scroll/resize and flips vertically near the viewport edge.\n *\n * <button #trigger>…</button>\n * <div class=\"menu\" [strctOverlay]=\"trigger\" strctOverlayPlacement=\"bottom-end\">…</div>\n *\n * Note: like any fixed-positioned element, the panel is positioned relative to\n * a transformed/filtered ancestor if one exists (a CSS containing-block rule).\n * Avoid wrapping a trigger in `transform`/`filter` if you need viewport-anchored\n * overlays. (The tooltip sidesteps this by rendering into `<body>`.)\n */\n@Directive({ selector: '[strctOverlay]' })\nexport class StrctOverlay implements OnDestroy {\n private readonly el = inject(ElementRef<HTMLElement>).nativeElement as HTMLElement;\n private readonly zone = inject(NgZone);\n\n /** Anchor element for positioning. */\n readonly anchor = input.required<HTMLElement>({ alias: 'strctOverlay' });\n /** Preferred placement relative to the anchor. */\n readonly placement = input<StrctOverlayPlacement>('bottom-start', {\n alias: 'strctOverlayPlacement',\n });\n /** Match the panel width to the anchor (combobox / date / cascade fields). */\n readonly matchWidth = input(false, { alias: 'strctOverlayMatchWidth' });\n /** Gap between anchor and panel in pixels. */\n readonly gap = input(5, { alias: 'strctOverlayGap' });\n\n private readonly onScrollResize = () => this.position();\n private bound = false;\n\n constructor() {\n const s = this.el.style;\n s.position = 'fixed';\n s.top = '0';\n s.left = '0';\n s.right = 'auto';\n s.bottom = 'auto';\n s.margin = '0';\n afterNextRender(() => {\n this.position();\n this.zone.runOutsideAngular(() => {\n window.addEventListener('scroll', this.onScrollResize, true);\n window.addEventListener('resize', this.onScrollResize);\n this.bound = true;\n });\n });\n }\n\n /** Recompute and apply the fixed coordinates. */\n position(): void {\n const anchor = this.anchor();\n if (!anchor) return;\n const a = anchor.getBoundingClientRect();\n const el = this.el;\n if (this.matchWidth()) el.style.width = `${a.width}px`;\n\n const w = el.offsetWidth;\n const h = el.offsetHeight;\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const gap = this.gap();\n const p = this.placement();\n const margin = 4;\n\n let top: number;\n let left: number;\n\n if (p === 'right') {\n left = a.right + gap;\n // Flip to the left of the anchor if it would overflow the right edge.\n if (left + w > vw - margin && a.left - gap - w > margin) left = a.left - gap - w;\n top = a.top;\n } else if (p === 'left') {\n left = a.left - gap - w;\n // Flip to the right of the anchor if it would overflow the left edge.\n if (left < margin && a.right + gap + w < vw - margin) left = a.right + gap;\n top = a.top;\n } else {\n const below = p.startsWith('bottom');\n top = below ? a.bottom + gap : a.top - gap - h;\n if (below && top + h > vh - margin && a.top - gap - h > margin) {\n top = a.top - gap - h;\n } else if (!below && top < margin && a.bottom + gap + h < vh - margin) {\n top = a.bottom + gap;\n }\n left = p.endsWith('end') ? a.right - w : a.left;\n }\n\n left = Math.max(margin, Math.min(left, vw - w - margin));\n top = Math.max(margin, Math.min(top, vh - h - margin));\n\n el.style.left = `${Math.round(left)}px`;\n el.style.top = `${Math.round(top)}px`;\n }\n\n ngOnDestroy(): void {\n if (this.bound) {\n window.removeEventListener('scroll', this.onScrollResize, true);\n window.removeEventListener('resize', this.onScrollResize);\n }\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n inject,\n signal,\n} from '@angular/core';\nimport { StrctIcon } from '../icon/icon';\n\n/** Shared layout state between shell parts. */\nexport class StrctShellService {\n readonly mobileNavOpen = signal(false);\n}\n\n/**\n * Application frame: a full-viewport grid of header / body / footer rows.\n * <strct-shell>\n * <strct-header>…</strct-header>\n * <div strctShellMain>… sidebar + content …</div>\n * <strct-footer>…</strct-footer>\n * </strct-shell>\n */\n@Component({\n selector: 'strct-shell',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n providers: [StrctShellService],\n template: `\n <ng-content select=\"strct-header\" />\n <div class=\"strct-shell__main\"><ng-content /></div>\n <ng-content select=\"strct-footer\" />\n `,\n host: { class: 'strct-shell' },\n styles: [\n `\n .strct-shell {\n display: grid;\n grid-template-rows: auto 1fr auto;\n height: 100vh;\n overflow: hidden;\n background: var(--bg-2);\n }\n .strct-shell__main {\n display: flex;\n min-height: 0;\n overflow: hidden;\n }\n `,\n ],\n})\nexport class StrctShell {}\n\n/** Top application bar. Holds brand on the left and actions on the right. */\n@Component({\n selector: 'strct-header',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon],\n template: `\n <button\n type=\"button\"\n class=\"strct-header__drawer-toggle\"\n aria-label=\"Toggle navigation\"\n (click)=\"shell.mobileNavOpen.update((v) => !v)\"\n >\n <strct-icon name=\"menu\" [size]=\"18\" />\n </button>\n <ng-content />\n `,\n host: { class: 'strct-header' },\n styles: [\n `\n .strct-header {\n display: flex;\n align-items: center;\n gap: 14px;\n height: 56px;\n padding: 0 18px;\n background: var(--hdr);\n border-bottom: 1px solid var(--b2);\n color: rgba(255, 255, 255, 0.92);\n }\n .strct-header__drawer-toggle {\n display: none;\n align-items: center;\n justify-content: center;\n padding: 4px;\n border: 0;\n border-radius: 5px;\n background: transparent;\n color: rgba(255, 255, 255, 0.85);\n cursor: pointer;\n }\n .strct-header__drawer-toggle:hover {\n background: rgba(255, 255, 255, 0.12);\n color: var(--hdr-fg);\n }\n @media (max-width: 768px) {\n .strct-header__drawer-toggle {\n display: inline-flex;\n }\n }\n `,\n ],\n})\nexport class StrctHeader {\n protected readonly shell = inject(StrctShellService);\n}\n\n/** Bottom status bar. */\n@Component({\n selector: 'strct-footer',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `<ng-content />`,\n host: { class: 'strct-footer' },\n styles: [\n `\n .strct-footer {\n display: flex;\n align-items: center;\n gap: 12px;\n height: 32px;\n padding: 0 16px;\n background: var(--bg-1);\n border-top: 1px solid var(--b2);\n font-size: 12px;\n color: var(--t2);\n }\n `,\n ],\n})\nexport class StrctFooter {}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n input,\n inject,\n} from '@angular/core';\nimport { StrctShellService } from './layout';\n\n/** Scrollable left sidebar surface. Holds the icon nav and/or a tree. */\n@Component({\n selector: 'strct-vertical-nav',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n @if (shell.mobileNavOpen()) {\n <div\n class=\"strct-vnav__backdrop\"\n tabindex=\"0\"\n role=\"button\"\n aria-label=\"Close navigation\"\n (click)=\"shell.mobileNavOpen.set(false)\"\n (keydown.enter)=\"shell.mobileNavOpen.set(false)\"\n (keydown.space)=\"shell.mobileNavOpen.set(false)\"\n ></div>\n }\n <ng-content />\n `,\n host: {\n class: 'strct-vnav',\n '[class.strct-vnav--open]': 'shell.mobileNavOpen()',\n },\n styles: [\n `\n .strct-vnav {\n display: flex;\n flex-direction: column;\n width: 264px;\n flex-shrink: 0;\n background: var(--bg-1);\n border-inline-end: 1px solid var(--b2);\n overflow: hidden;\n }\n @media (max-width: 768px) {\n .strct-vnav {\n position: fixed;\n top: 0;\n inset-inline-start: 0;\n bottom: 0;\n z-index: 300;\n transform: translateX(-100%);\n transition: transform 0.2s ease;\n }\n [dir='rtl'] .strct-vnav {\n transform: translateX(100%);\n }\n .strct-vnav--open,\n [dir='rtl'] .strct-vnav--open {\n transform: translateX(0);\n }\n .strct-vnav__backdrop {\n position: fixed;\n inset: 0;\n z-index: 299;\n background: rgba(0, 0, 0, 0.5);\n animation: strct-vnav-backdrop-in 0.2s ease;\n }\n }\n @media (min-width: 769px) {\n .strct-vnav__backdrop {\n display: none;\n }\n }\n @keyframes strct-vnav-backdrop-in {\n from {\n opacity: 0;\n }\n }\n `,\n ],\n})\nexport class StrctVerticalNav {\n protected readonly shell = inject(StrctShellService);\n}\n\n/** Horizontal strip of icon tabs (e.g. section switcher at the top of a sidebar). */\n@Component({\n selector: 'strct-nav',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `<ng-content />`,\n host: { class: 'strct-nav' },\n styles: [\n `\n .strct-nav {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 8px 10px;\n border-bottom: 1px solid var(--b1);\n }\n `,\n ],\n})\nexport class StrctNav {}\n\n/** A single icon tab inside `<strct-nav>`. */\n@Component({\n selector: 'strct-nav-item',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `<ng-content />`,\n host: {\n class: 'strct-nav-item',\n role: 'button',\n tabindex: '0',\n '[class.strct-nav-item--active]': 'active()',\n '[attr.title]': 'label() || null',\n '[attr.aria-label]': 'label() || null',\n '[attr.aria-pressed]': 'active()',\n },\n styles: [\n `\n .strct-nav-item {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 34px;\n height: 34px;\n border-radius: 7px;\n cursor: pointer;\n color: var(--t2);\n transition:\n background 0.14s ease,\n color 0.14s ease;\n }\n .strct-nav-item:hover {\n background: var(--bg-3);\n color: var(--t1);\n }\n .strct-nav-item--active {\n background: var(--acc-m);\n color: var(--acc);\n }\n .strct-nav-item:focus-visible {\n outline: 2px solid var(--acc50);\n outline-offset: 1px;\n }\n `,\n ],\n})\nexport class StrctNavItem {\n /** Whether the item is active / selected. */\n readonly active = input(false);\n /** Label text. */\n readonly label = input('');\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n input,\n model,\n output,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { RouterLink, RouterLinkActive } from '@angular/router';\nimport { StrctIcon } from '../icon/icon';\n\n/** Semantic colour for a rail item's count badge. */\nexport type StrctRailStatus = 'accent' | 'success' | 'warning' | 'critical';\n\n/** A single entry in a {@link StrctRail}. */\nexport interface StrctRailItem {\n /** Stable identity, matched against the rail's `activeId`. */\n id: string;\n label: string;\n /** Icon name (see the icon set). */\n icon: string;\n /** Optional count/indicator — e.g. number of active alerts. */\n badge?: string | number;\n /** Badge colour (defaults to `accent`). When collapsed it renders as a dot. */\n badgeStatus?: StrctRailStatus;\n disabled?: boolean;\n /** `'bottom'` pins the item to the foot of the rail (e.g. Administration). */\n placement?: 'top' | 'bottom';\n /**\n * Render as a real router link (`<a routerLink>`): middle-click, ⌘/Ctrl-click\n * and \"open in new tab\" work; `(select)` still fires on plain activation.\n * When neither `routerLink` nor `href` is set the item stays a `<button>`.\n */\n routerLink?: string | unknown[];\n /** Render as a plain `<a href>` (external or non-router destinations). */\n href?: string;\n /** Small trailing status dot with no text (e.g. \"unsaved changes\"). */\n dot?: boolean;\n /** Dot tone; defaults to `accent`. */\n dotStatus?: StrctRailStatus;\n /** Muted trailing icon (e.g. \"restart required\"), before any badge / dot. */\n trailingIcon?: string;\n}\n\n/**\n * Collapsible, data-driven primary navigation rail for an application shell.\n * Each item is an icon + label + optional status badge; collapsing shrinks it to\n * an icon-only rail (badges become dots, labels become tooltips).\n *\n * <strct-rail [items]=\"navItems\" [(activeId)]=\"section\" [(collapsed)]=\"railOff\"\n * (select)=\"go($event)\" />\n */\n@Component({\n selector: 'strct-rail',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [NgTemplateOutlet, RouterLink, RouterLinkActive, StrctIcon],\n template: `\n <!-- Shared row content: icon, label, trailing indicator, badge / dot. -->\n <ng-template #rowContent let-item>\n <strct-icon class=\"strct-rail__icon\" [name]=\"item.icon\" [size]=\"18\" [strokeWidth]=\"1.6\" />\n @if (!collapsed()) {\n <span class=\"strct-rail__label\">{{ item.label }}</span>\n @if (item.trailingIcon) {\n <strct-icon\n class=\"strct-rail__trailing\"\n [name]=\"item.trailingIcon\"\n [size]=\"14\"\n [strokeWidth]=\"1.5\"\n />\n }\n }\n @if (item.badge !== undefined && item.badge !== null && item.badge !== '') {\n <span\n class=\"strct-rail__badge strct-rail__badge--{{ item.badgeStatus ?? 'accent' }}\"\n [class.strct-rail__badge--dot]=\"collapsed()\"\n >\n @if (!collapsed()) {\n {{ item.badge }}\n }\n </span>\n } @else if (item.dot) {\n <span class=\"strct-rail__dot strct-rail__dot--{{ item.dotStatus ?? 'accent' }}\"></span>\n }\n </ng-template>\n\n <!-- One rail row: a router link, a plain link, or a button (today's default). -->\n <ng-template #row let-item>\n @if (isRouted(item)) {\n <a\n class=\"strct-rail__item\"\n [routerLink]=\"item.routerLink\"\n routerLinkActive\n #rla=\"routerLinkActive\"\n [class.strct-rail__item--active]=\"isActive(item, rla.isActive)\"\n [attr.aria-current]=\"isActive(item, rla.isActive) ? 'page' : null\"\n [attr.title]=\"collapsed() ? item.label : null\"\n (click)=\"pick(item, $event)\"\n >\n <ng-container *ngTemplateOutlet=\"rowContent; context: { $implicit: item }\" />\n </a>\n } @else if (item.href && !item.disabled) {\n <a\n class=\"strct-rail__item\"\n [href]=\"item.href\"\n [class.strct-rail__item--active]=\"item.id === activeId()\"\n [attr.aria-current]=\"item.id === activeId() ? 'page' : null\"\n [attr.title]=\"collapsed() ? item.label : null\"\n (click)=\"pick(item, $event)\"\n >\n <ng-container *ngTemplateOutlet=\"rowContent; context: { $implicit: item }\" />\n </a>\n } @else {\n <button\n type=\"button\"\n class=\"strct-rail__item\"\n [class.strct-rail__item--active]=\"item.id === activeId()\"\n [disabled]=\"item.disabled\"\n [attr.aria-current]=\"item.id === activeId() ? 'page' : null\"\n [attr.title]=\"collapsed() ? item.label : null\"\n (click)=\"pick(item, $event)\"\n >\n <ng-container *ngTemplateOutlet=\"rowContent; context: { $implicit: item }\" />\n </button>\n }\n </ng-template>\n\n <nav class=\"strct-rail__nav\" [attr.aria-label]=\"ariaLabel()\">\n <div class=\"strct-rail__group strct-rail__group--top\">\n @for (item of topItems(); track item.id) {\n <ng-container *ngTemplateOutlet=\"row; context: { $implicit: item }\" />\n }\n </div>\n @if (bottomItems().length) {\n <div class=\"strct-rail__group strct-rail__group--bottom\">\n @for (item of bottomItems(); track item.id) {\n <ng-container *ngTemplateOutlet=\"row; context: { $implicit: item }\" />\n }\n </div>\n }\n </nav>\n\n @if (collapsible()) {\n <button\n type=\"button\"\n class=\"strct-rail__toggle\"\n [attr.aria-label]=\"collapsed() ? 'Expand navigation' : 'Collapse navigation'\"\n [attr.aria-expanded]=\"!collapsed()\"\n (click)=\"collapsed.set(!collapsed())\"\n >\n <strct-icon class=\"strct-rail__toggle-icon\" name=\"chevronRight\" [size]=\"16\" />\n @if (!collapsed()) {\n <span class=\"strct-rail__toggle-label\">Collapse</span>\n }\n </button>\n }\n `,\n host: {\n class: 'strct-rail',\n '[class.strct-rail--collapsed]': 'collapsed()',\n },\n styles: [\n `\n .strct-rail {\n display: flex;\n flex-direction: column;\n width: 232px;\n flex-shrink: 0;\n background: var(--bg-1);\n border-inline-end: 1px solid var(--b2);\n overflow: hidden;\n transition: width 0.16s ease;\n }\n .strct-rail--collapsed {\n width: 60px;\n }\n .strct-rail__nav {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n padding: 8px;\n }\n .strct-rail__group {\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n /* Top group scrolls; the bottom group stays pinned under a divider. */\n .strct-rail__group--top {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n }\n .strct-rail__group--bottom {\n margin-top: 8px;\n padding-top: 8px;\n border-top: 1px solid var(--b1);\n }\n .strct-rail__item {\n position: relative;\n display: flex;\n align-items: center;\n gap: 11px;\n width: 100%;\n box-sizing: border-box;\n padding: 8px 10px;\n border: 0;\n border-radius: 8px;\n background: transparent;\n color: var(--t2);\n cursor: pointer;\n font-size: 13.5px;\n font-family: var(--font);\n text-align: start;\n text-decoration: none;\n white-space: nowrap;\n transition:\n background 0.14s ease,\n color 0.14s ease;\n }\n .strct-rail--collapsed .strct-rail__item {\n justify-content: center;\n padding: 8px;\n }\n .strct-rail__item:hover:not(:disabled) {\n background: var(--bg-3);\n color: var(--t1);\n }\n .strct-rail__item--active {\n background: var(--acc-m);\n color: var(--acc);\n }\n .strct-rail__item--active .strct-rail__icon {\n color: var(--acc);\n }\n .strct-rail__item:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .strct-rail__item:focus-visible {\n outline: 2px solid var(--acc50);\n outline-offset: -2px;\n }\n .strct-rail__icon {\n flex-shrink: 0;\n }\n .strct-rail__label {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n .strct-rail__badge {\n flex-shrink: 0;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n font-weight: 600;\n line-height: 1;\n border-radius: 9px;\n font-variant-numeric: tabular-nums;\n }\n .strct-rail__badge--dot {\n position: absolute;\n top: 5px;\n inset-inline-end: 7px;\n min-width: 8px;\n width: 8px;\n height: 8px;\n padding: 0;\n border-radius: 50%;\n }\n .strct-rail__badge--accent {\n background: var(--acc-m);\n color: var(--acc);\n }\n .strct-rail__badge--success {\n background: var(--success-bg);\n color: var(--success);\n }\n .strct-rail__badge--warning {\n background: var(--warning-bg);\n color: var(--warning);\n }\n .strct-rail__badge--critical {\n background: var(--critical-bg);\n color: var(--critical);\n }\n .strct-rail__badge--dot.strct-rail__badge--accent {\n background: var(--acc);\n }\n .strct-rail__badge--dot.strct-rail__badge--success {\n background: var(--success);\n }\n .strct-rail__badge--dot.strct-rail__badge--warning {\n background: var(--warning);\n }\n .strct-rail__badge--dot.strct-rail__badge--critical {\n background: var(--critical);\n }\n /* Muted trailing indicator icon (\"restart required\" etc.). */\n .strct-rail__trailing {\n flex-shrink: 0;\n color: var(--t3);\n }\n /* Small trailing status dot (\"unsaved changes\" etc.). */\n .strct-rail__dot {\n flex-shrink: 0;\n width: 7px;\n height: 7px;\n border-radius: 50%;\n }\n .strct-rail--collapsed .strct-rail__dot {\n position: absolute;\n top: 5px;\n inset-inline-end: 7px;\n }\n .strct-rail__dot--accent {\n background: var(--acc);\n }\n .strct-rail__dot--success {\n background: var(--success);\n }\n .strct-rail__dot--warning {\n background: var(--warning);\n }\n .strct-rail__dot--critical {\n background: var(--critical);\n }\n .strct-rail__toggle {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 9px 14px;\n border: 0;\n border-top: 1px solid var(--b1);\n background: transparent;\n color: var(--t3);\n cursor: pointer;\n font-size: 12.5px;\n font-family: var(--font);\n }\n .strct-rail--collapsed .strct-rail__toggle {\n justify-content: center;\n padding: 9px;\n }\n .strct-rail__toggle:hover {\n color: var(--t1);\n background: var(--bg-3);\n }\n .strct-rail__toggle-icon {\n transition: transform 0.16s ease;\n }\n .strct-rail:not(.strct-rail--collapsed) .strct-rail__toggle-icon {\n transform: rotate(180deg);\n }\n `,\n ],\n})\nexport class StrctRail {\n /** Navigation entries. */\n readonly items = input.required<StrctRailItem[]>();\n /** Currently-active item id (two-way). */\n readonly activeId = model<string | null>(null);\n /** Collapsed (icon-only) state (two-way). */\n readonly collapsed = model(false);\n /** Show the collapse toggle at the foot of the rail. */\n readonly collapsible = input(true);\n /** Accessible label for the nav landmark. */\n readonly ariaLabel = input('Primary');\n /** Emitted when an item is chosen. */\n readonly select = output<StrctRailItem>();\n\n protected readonly topItems = computed(() =>\n this.items().filter((i) => i.placement !== 'bottom'),\n );\n protected readonly bottomItems = computed(() =>\n this.items().filter((i) => i.placement === 'bottom'),\n );\n\n /** Enabled item with a router destination → renders as `<a routerLink>`. */\n protected isRouted(item: StrctRailItem): boolean {\n return item.routerLink != null && !item.disabled;\n }\n\n /**\n * Active state of a router-link item: an explicit `activeId` is authoritative;\n * without one, the router's own active state drives it.\n */\n protected isActive(item: StrctRailItem, routerActive: boolean): boolean {\n const id = this.activeId();\n return id !== null ? item.id === id : routerActive;\n }\n\n protected pick(item: StrctRailItem, event?: MouseEvent): void {\n if (item.disabled) return;\n // A modified / non-primary click on a link is the browser's (new tab etc.) —\n // never ours: no activeId change, no (select).\n if (\n event &&\n (item.routerLink != null || item.href) &&\n (event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey)\n ) {\n return;\n }\n this.activeId.set(item.id);\n this.select.emit(item);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n input,\n} from '@angular/core';\n\n/**\n * Authentication layout. Two modes:\n * - default: a single centered column (drop a card + form inside).\n * - `split`: a two-panel card — a decorative accent aside (`[strctLoginAside]`)\n * on the left and the form (default content) on the right.\n *\n * <strct-login split>\n * <div strctLoginAside>… brand + welcome …</div>\n * <form strctLoginMain>… inputs + button …</form>\n * </strct-login>\n */\n@Component({\n selector: 'strct-login',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n @if (split()) {\n <div class=\"strct-login__card\" [style.max-width.px]=\"maxWidth()\">\n <aside class=\"strct-login__aside\">\n <div class=\"strct-login__aside-inner\">\n <ng-content select=\"[strctLoginAside]\" />\n </div>\n </aside>\n <div class=\"strct-login__main\"><ng-content select=\"[strctLoginMain]\" /></div>\n </div>\n } @else {\n <div class=\"strct-login__inner\" [style.max-width.px]=\"maxWidth()\"><ng-content /></div>\n }\n `,\n host: { class: 'strct-login' },\n styles: [\n `\n .strct-login {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n min-height: 100%;\n padding: 32px;\n }\n .strct-login__inner {\n width: 100%;\n }\n\n /* Split card */\n .strct-login__card {\n display: grid;\n grid-template-columns: 1.05fr 1fr;\n width: 100%;\n overflow: hidden;\n }\n .strct-login__main {\n padding: 40px 38px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n }\n\n /* Aside — stripped of background images/colors and borders. */\n .strct-login__aside {\n position: relative;\n overflow: hidden;\n min-height: 420px;\n color: var(--t1);\n border-inline-end: 1px solid var(--b2);\n }\n .strct-login__aside::before,\n .strct-login__aside::after {\n display: none;\n }\n .strct-login__aside-inner {\n position: relative;\n z-index: 1;\n height: 100%;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n padding: 34px 36px;\n }\n\n @media (max-width: 720px) {\n .strct-login__card {\n grid-template-columns: 1fr;\n }\n .strct-login__aside {\n min-height: 220px;\n }\n .strct-login__main {\n padding: 30px 26px;\n }\n }\n `,\n ],\n})\nexport class StrctLogin {\n /** Maximum width in pixels. */\n readonly maxWidth = input(880);\n /** Enable two-panel split layout. */\n readonly split = input(false, { transform: booleanAttribute });\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n input,\n} from '@angular/core';\n\n/** Button visual variants. */\nexport type StrctButtonVariant = 'primary' | 'critical' | 'outline' | 'flat' | 'neutral';\n/** Button size variants. */\nexport type StrctButtonSize = 'md' | 'sm' | 'mini';\n\n/**\n * Styles a native `<button>` / `<a>` so it stays fully accessible and form-aware.\n *\n * Buttons are restrained by default: outlined / ghost surfaces with color used\n * only as a subtle border + text accent. Add `solid` for a rare filled call to\n * action.\n * <button strct-button variant=\"primary\">Save</button>\n * <button strct-button variant=\"primary\" solid>Deploy</button>\n * <a strct-button variant=\"flat\" size=\"sm\" href=\"...\">Cancel</a>\n */\n@Component({\n selector: 'button[strct-button], a[strct-button]',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `<ng-content />`,\n host: {\n class: 'strct-btn',\n '[class.strct-btn--primary]': \"variant() === 'primary'\",\n '[class.strct-btn--critical]': \"variant() === 'critical'\",\n '[class.strct-btn--outline]': \"variant() === 'outline'\",\n '[class.strct-btn--flat]': \"variant() === 'flat'\",\n '[class.strct-btn--solid]': 'solid()',\n '[class.strct-btn--sm]': \"size() === 'sm'\",\n '[class.strct-btn--mini]': \"size() === 'mini'\",\n '[class.strct-btn--block]': 'block()',\n '[class.strct-btn--icon]': 'iconOnly()',\n },\n styles: [\n `\n /* Base: neutral, outlined, no fill. */\n .strct-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--space-1);\n font-family: var(--font);\n font-size: 13px;\n font-weight: 500;\n line-height: 1;\n padding: var(--space-2) var(--space-4);\n border-radius: var(--radius-md);\n cursor: pointer;\n user-select: none;\n color: var(--t1);\n background: transparent;\n border: 1px solid var(--b3);\n transition:\n background 0.14s ease,\n border-color 0.14s ease,\n color 0.14s ease,\n opacity 0.14s ease;\n text-decoration: none;\n white-space: nowrap;\n }\n .strct-btn:hover {\n background: var(--bg-3);\n text-decoration: none;\n }\n .strct-btn:active {\n background: var(--bg-a);\n }\n .strct-btn:disabled,\n .strct-btn[aria-disabled='true'] {\n opacity: 0.45;\n cursor: not-allowed;\n }\n\n /* Emphasis via accent border + text only — not a colored fill. */\n .strct-btn--primary {\n border-color: var(--acc50);\n color: var(--acc);\n }\n .strct-btn--primary:hover {\n background: var(--acc-m);\n border-color: var(--acc);\n }\n\n .strct-btn--critical {\n border-color: var(--critical);\n color: var(--critical);\n }\n .strct-btn--critical:hover {\n background: var(--critical-bg);\n }\n\n /* Neutral outline (explicit). */\n .strct-btn--outline {\n border-color: var(--b3);\n color: var(--t1);\n }\n .strct-btn--outline:hover {\n background: var(--bg-3);\n }\n\n /* Borderless text button. */\n .strct-btn--flat {\n border-color: transparent;\n color: var(--t2);\n }\n .strct-btn--flat:hover {\n background: var(--bg-3);\n color: var(--t1);\n }\n\n /* Opt-in filled call to action. */\n .strct-btn--solid {\n background: var(--bg-3);\n border-color: transparent;\n color: var(--t1);\n }\n .strct-btn--solid:hover {\n background: var(--bg-h);\n }\n .strct-btn--solid.strct-btn--primary {\n background: var(--acc);\n color: var(--inv);\n }\n .strct-btn--solid.strct-btn--primary:hover {\n background: var(--acc);\n filter: brightness(1.08);\n }\n .strct-btn--solid.strct-btn--critical {\n background: var(--critical);\n color: var(--inv);\n }\n .strct-btn--solid.strct-btn--critical:hover {\n background: var(--critical);\n filter: brightness(1.08);\n }\n\n .strct-btn--sm {\n padding: var(--space-1) var(--space-3);\n font-size: 12px;\n border-radius: var(--radius-sm);\n }\n .strct-btn--mini {\n padding: 2px var(--space-2);\n font-size: 12px;\n border-radius: var(--radius-sm);\n }\n .strct-btn--block {\n display: flex;\n width: 100%;\n }\n\n /* Square icon-only button. */\n .strct-btn--icon {\n padding: var(--space-2);\n }\n .strct-btn--icon.strct-btn--sm {\n padding: var(--space-1);\n }\n .strct-btn--icon.strct-btn--mini {\n padding: 3px;\n }\n `,\n ],\n})\nexport class StrctButton {\n /** Visual variant. */\n readonly variant = input<StrctButtonVariant>('neutral');\n /** Size variant. */\n readonly size = input<StrctButtonSize>('md');\n /** Opt in to a filled surface (use sparingly, for the primary action). */\n readonly solid = input(false, { transform: booleanAttribute });\n /** Expand to full width. */\n readonly block = input(false, { transform: booleanAttribute });\n /** Square padding for a single-icon button. */\n readonly iconOnly = input(false, { transform: booleanAttribute });\n}\n\n/** Segments adjacent buttons into a single joined control. */\n@Component({\n selector: 'strct-button-group',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `<ng-content />`,\n host: { class: 'strct-btn-group', role: 'group' },\n styles: [\n `\n .strct-btn-group {\n display: inline-flex;\n }\n .strct-btn-group > .strct-btn {\n border-radius: 0;\n }\n .strct-btn-group > .strct-btn:not(:first-child) {\n margin-inline-start: -1px;\n }\n .strct-btn-group > .strct-btn:first-child {\n border-top-left-radius: var(--radius-md);\n border-bottom-left-radius: var(--radius-md);\n }\n .strct-btn-group > .strct-btn:last-child {\n border-top-right-radius: var(--radius-md);\n border-bottom-right-radius: var(--radius-md);\n }\n .strct-btn-group > .strct-btn:hover,\n .strct-btn-group > .strct-btn:focus-visible {\n position: relative;\n z-index: 1;\n }\n `,\n ],\n})\nexport class StrctButtonGroup {}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n input,\n} from '@angular/core';\n\n/** Badge color variants. */\nexport type StrctBadgeStatus = 'neutral' | 'accent' | 'success' | 'warning' | 'critical';\n\n/** Small inline status pill: `<strct-badge status=\"success\">Active</strct-badge>`. */\n@Component({\n selector: 'strct-badge',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `<ng-content />`,\n host: {\n class: 'strct-badge',\n '[class.strct-badge--accent]': \"status() === 'accent'\",\n '[class.strct-badge--success]': \"status() === 'success'\",\n '[class.strct-badge--warning]': \"status() === 'warning'\",\n // Deprecated alias of --warning (original typo), kept so consumer CSS keeps matching.\n '[class.strct-badge--warninging]': \"status() === 'warning'\",\n '[class.strct-badge--critical]': \"status() === 'critical'\",\n '[class.strct-badge--solid]': 'solid()',\n },\n styles: [\n `\n /* Restrained: outlined on a neutral surface, color carried by text + a thin border. */\n .strct-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n font-weight: 600;\n line-height: 1;\n letter-spacing: 0.2px;\n padding: 3px 7px 3px 9px;\n border-radius: var(--radius-sm);\n white-space: nowrap;\n color: var(--t2);\n background: transparent;\n border: 1px solid var(--b3);\n /* Thicker left rail gives badges a distinct \"tag\" identity vs. buttons. */\n border-inline-start-width: 3px;\n }\n .strct-badge--accent {\n color: var(--acc);\n border-color: var(--acc30);\n }\n .strct-badge--success {\n color: var(--success);\n border-color: var(--success);\n }\n .strct-badge--warning {\n color: var(--warning);\n border-color: var(--warning);\n }\n .strct-badge--critical {\n color: var(--critical);\n border-color: var(--critical);\n }\n\n /* Opt-in filled badge — uniform edges (no left rail). */\n .strct-badge--solid {\n color: var(--t1);\n background: var(--bg-a);\n border-color: transparent;\n border-inline-start-width: 1px;\n padding-inline-start: 7px;\n }\n .strct-badge--solid.strct-badge--accent {\n background: var(--acc);\n color: var(--inv);\n }\n .strct-badge--solid.strct-badge--success {\n background: var(--success);\n color: var(--inv);\n }\n .strct-badge--solid.strct-badge--warning {\n background: var(--warning);\n color: var(--inv);\n }\n .strct-badge--solid.strct-badge--critical {\n background: var(--critical);\n color: var(--inv);\n }\n `,\n ],\n})\nexport class StrctBadge {\n /** Visual status color. */\n readonly status = input<StrctBadgeStatus>('neutral');\n /** Opt-in filled style instead of the default outlined style. */\n readonly solid = input(false, { transform: booleanAttribute });\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n input,\n output,\n} from '@angular/core';\nimport { StrctIcon } from '../icon/icon';\n\n/** Tag color variants. */\nexport type StrctTagStatus = 'neutral' | 'accent' | 'success' | 'warning' | 'critical';\n\n/**\n * Compact, optionally removable chip.\n * <strct-tag status=\"accent\" removable (removed)=\"drop()\">Frontend</strct-tag>\n */\n@Component({\n selector: 'strct-tag',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon],\n template: `\n <span class=\"strct-tag__text\"><ng-content /></span>\n @if (removable()) {\n <button type=\"button\" class=\"strct-tag__remove\" aria-label=\"Remove\" (click)=\"removed.emit()\">\n <strct-icon name=\"close\" [size]=\"11\" [strokeWidth]=\"1.6\" />\n </button>\n }\n `,\n host: {\n class: 'strct-tag',\n '[class.strct-tag--accent]': \"status() === 'accent'\",\n '[class.strct-tag--success]': \"status() === 'success'\",\n '[class.strct-tag--warning]': \"status() === 'warning'\",\n '[class.strct-tag--critical]': \"status() === 'critical'\",\n },\n styles: [\n `\n .strct-tag {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 3px 4px 3px 9px;\n border-radius: 4px;\n font-size: 12px;\n font-weight: 500;\n color: var(--t1);\n background: var(--bg-3);\n border: 1px solid var(--b2);\n }\n .strct-tag:not(:has(.strct-tag__remove)) {\n padding-inline-end: 9px;\n }\n .strct-tag--accent {\n color: var(--acc);\n border-color: var(--acc30);\n background: var(--acc-s);\n }\n .strct-tag--success {\n color: var(--success);\n border-color: var(--success);\n background: transparent;\n }\n .strct-tag--warning {\n color: var(--warning);\n border-color: var(--warning);\n background: transparent;\n }\n .strct-tag--critical {\n color: var(--critical);\n border-color: var(--critical);\n background: transparent;\n }\n .strct-tag__remove {\n display: inline-flex;\n padding: 2px;\n border: 0;\n border-radius: 3px;\n background: transparent;\n color: currentColor;\n opacity: 0.65;\n cursor: pointer;\n }\n .strct-tag__remove:hover {\n opacity: 1;\n background: var(--dn);\n }\n `,\n ],\n})\nexport class StrctTag {\n /** Visual status color. */\n readonly status = input<StrctTagStatus>('neutral');\n /** Show a remove button. */\n readonly removable = input(false, { transform: booleanAttribute });\n /** Emitted when the user clicks the remove button. */\n readonly removed = output<void>();\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n input,\n} from '@angular/core';\n\n/** Avatar size variants. */\nexport type StrctAvatarSize = 'sm' | 'md' | 'lg';\n/** Avatar presence status variants. */\nexport type StrctAvatarStatus = 'none' | 'online' | 'busy' | 'offline';\n\n/**\n * Circular avatar: an image when `src` is set, otherwise initials from `name`.\n * <strct-avatar name=\"Ada Lovelace\" status=\"online\" />\n */\n@Component({\n selector: 'strct-avatar',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n @if (src()) {\n <img class=\"strct-av__img\" [src]=\"src()\" [alt]=\"name()\" />\n } @else {\n <span class=\"strct-av__initials\">{{ initials() }}</span>\n }\n @if (status() !== 'none') {\n <span class=\"strct-av__status\"></span>\n }\n `,\n host: {\n class: 'strct-av',\n '[class.strct-av--sm]': \"size() === 'sm'\",\n '[class.strct-av--lg]': \"size() === 'lg'\",\n '[class.strct-av--online]': \"status() === 'online'\",\n '[class.strct-av--busy]': \"status() === 'busy'\",\n '[class.strct-av--offline]': \"status() === 'offline'\",\n '[attr.title]': 'name() || null',\n },\n styles: [\n `\n .strct-av {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border-radius: 50%;\n flex-shrink: 0;\n background: var(--bg-3);\n color: var(--t1);\n overflow: visible;\n font-size: 13px;\n font-weight: 600;\n user-select: none;\n border: 1px solid var(--b2);\n }\n .strct-av--sm {\n width: 26px;\n height: 26px;\n font-size: 12px;\n }\n .strct-av--lg {\n width: 48px;\n height: 48px;\n font-size: 17px;\n }\n .strct-av__img {\n width: 100%;\n height: 100%;\n border-radius: 50%;\n object-fit: cover;\n }\n .strct-av__initials {\n line-height: 1;\n }\n .strct-av__status {\n position: absolute;\n right: -1px;\n bottom: -1px;\n width: 30%;\n height: 30%;\n min-width: 8px;\n min-height: 8px;\n border-radius: 50%;\n border: 2px solid var(--bg-1);\n background: var(--t3);\n }\n .strct-av--online .strct-av__status {\n background: var(--success);\n }\n .strct-av--busy .strct-av__status {\n background: var(--critical);\n }\n .strct-av--offline .strct-av__status {\n background: var(--t3);\n }\n `,\n ],\n})\nexport class StrctAvatar {\n /** Image URL. */\n readonly src = input('');\n /** Display name (used for initials when src is absent). */\n readonly name = input('');\n /** Size variant. */\n readonly size = input<StrctAvatarSize>('md');\n /** Visual status color. */\n readonly status = input<StrctAvatarStatus>('none');\n\n protected readonly initials = computed(() => {\n const parts = this.name().trim().split(/\\s+/).filter(Boolean);\n if (!parts.length) return '?';\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n });\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n input,\n} from '@angular/core';\nimport { StrctThresholds } from '../status';\n\n/** Progress bar color variants. */\nexport type StrctProgressStatus = 'accent' | 'success' | 'warning' | 'critical';\n\n/** Horizontal value/usage bar. `<strct-progress [value]=\"72\" status=\"warning\" />`. */\n@Component({\n selector: 'strct-progress',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n <div\n class=\"strct-progress__track\"\n role=\"progressbar\"\n [attr.aria-label]=\"label() || 'Progress'\"\n [attr.aria-valuenow]=\"clamped()\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n >\n <div class=\"strct-progress__fill\" [style.width.%]=\"clamped()\"></div>\n </div>\n `,\n host: {\n class: 'strct-progress',\n '[class.strct-progress--success]': \"resolvedStatus() === 'success'\",\n '[class.strct-progress--warning]': \"resolvedStatus() === 'warning'\",\n '[class.strct-progress--critical]': \"resolvedStatus() === 'critical'\",\n },\n styles: [\n `\n .strct-progress {\n display: block;\n }\n .strct-progress__track {\n height: 6px;\n border-radius: 4px;\n background: var(--bg-3);\n overflow: hidden;\n }\n .strct-progress__fill {\n height: 100%;\n border-radius: 4px;\n background: var(--acc);\n transition: width 0.3s ease;\n }\n .strct-progress--success .strct-progress__fill {\n background: var(--success);\n }\n .strct-progress--warning .strct-progress__fill {\n background: var(--warning);\n }\n .strct-progress--critical .strct-progress__fill {\n background: var(--critical);\n }\n `,\n ],\n})\nexport class StrctProgress {\n /** Current value. */\n readonly value = input(0);\n /** Accessible name of the bar (e.g. \"CPU usage\"). Falls back to \"Progress\". */\n readonly label = input('');\n /** Visual status color. */\n readonly status = input<StrctProgressStatus>('accent');\n /**\n * Optional value-driven thresholds. When set, the component picks its own\n * status from the value instead of the caller computing it: `value >= critical`\n * → critical, `>= warning` → warning, else the healthy base. The healthy base is\n * `status` when it has been set to a semantic tone, or `'success'` when `status`\n * is left at its default `'accent'`.\n */\n readonly thresholds = input<StrctThresholds | null>(null);\n\n protected readonly clamped = computed(() => Math.max(0, Math.min(100, this.value())));\n\n /** Status after applying thresholds (falls back to `status` when none set). */\n protected readonly resolvedStatus = computed<StrctProgressStatus>(() => {\n const t = this.thresholds();\n if (!t) return this.status();\n const v = this.value();\n if (t.critical != null && v >= t.critical) return 'critical';\n if (t.warning != null && v >= t.warning) return 'warning';\n const base = this.status();\n return base === 'accent' ? 'success' : base;\n });\n}\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation, input } from '@angular/core';\n\n/** Spinner size variants. */\nexport type StrctSpinnerSize = 'sm' | 'md' | 'lg';\n\n/** Indeterminate loading ring. `<strct-spinner size=\"sm\" />`. */\n@Component({\n selector: 'strct-spinner',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: '',\n host: {\n class: 'strct-spinner',\n role: 'progressbar',\n '[attr.aria-label]': 'label()',\n '[class.strct-spinner--sm]': \"size() === 'sm'\",\n '[class.strct-spinner--lg]': \"size() === 'lg'\",\n },\n styles: [\n `\n .strct-spinner {\n display: inline-block;\n width: 22px;\n height: 22px;\n border: 2.5px solid var(--b3);\n border-top-color: var(--acc);\n border-radius: 50%;\n animation: strct-spin 0.7s linear infinite;\n }\n .strct-spinner--sm {\n width: 14px;\n height: 14px;\n border-width: 2px;\n }\n .strct-spinner--lg {\n width: 34px;\n height: 34px;\n border-width: 3px;\n }\n @keyframes strct-spin {\n to {\n transform: rotate(360deg);\n }\n }\n @media (prefers-reduced-motion: reduce) {\n .strct-spinner {\n animation-duration: 1.6s;\n }\n }\n `,\n ],\n})\nexport class StrctSpinner {\n /** Size variant. */\n readonly size = input<StrctSpinnerSize>('md');\n /** Accessible label (localizable). */\n readonly label = input('Loading');\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n input,\n} from '@angular/core';\n\n/**\n * Shimmering loading placeholder.\n * <strct-skeleton width=\"60%\" height=\"14px\" />\n * <strct-skeleton circle width=\"40px\" height=\"40px\" />\n */\n@Component({\n selector: 'strct-skeleton',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: '',\n host: {\n class: 'strct-skel',\n role: 'presentation',\n 'aria-hidden': 'true',\n '[class.strct-skel--circle]': 'circle()',\n '[style.width]': 'width()',\n '[style.height]': 'height()',\n },\n styles: [\n `\n .strct-skel {\n display: block;\n border-radius: 5px;\n background: linear-gradient(90deg, var(--bg-3) 25%, var(--bg-h) 37%, var(--bg-3) 63%);\n background-size: 400% 100%;\n animation: strct-skel-shimmer 1.4s ease infinite;\n }\n .strct-skel--circle {\n border-radius: 50%;\n }\n @keyframes strct-skel-shimmer {\n 0% {\n background-position: 100% 50%;\n }\n 100% {\n background-position: 0 50%;\n }\n }\n @media (prefers-reduced-motion: reduce) {\n .strct-skel {\n animation: none;\n }\n }\n `,\n ],\n})\nexport class StrctSkeleton {\n /** Width (CSS length). */\n readonly width = input('100%');\n /** Height in pixels. */\n readonly height = input('14px');\n /** Circle. */\n readonly circle = input(false, { transform: booleanAttribute });\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n ElementRef,\n HostListener,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { StrctIcon } from '../icon/icon';\n\n/** Direction the speed-dial actions expand. */\nexport type StrctSpeedDialDirection = 'up' | 'down' | 'left' | 'right';\n\n/**\n * Floating action button that fans out to reveal actions. Project icon buttons\n * (optionally with `strctTooltip`) as the actions.\n * <strct-speed-dial icon=\"ellipsis\" direction=\"up\">\n * <button strct-button iconOnly strctTooltip=\"Snapshot\"><strct-icon name=\"snapshot\" /></button>\n * <button strct-button iconOnly strctTooltip=\"Restart\"><strct-icon name=\"sync\" /></button>\n * </strct-speed-dial>\n */\n@Component({\n selector: 'strct-speed-dial',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon],\n template: `\n <div class=\"strct-sd\" [class]=\"'strct-sd--' + direction()\">\n @if (open()) {\n <div class=\"strct-sd__actions\"><ng-content /></div>\n }\n <button\n type=\"button\"\n class=\"strct-sd__fab\"\n [class.strct-sd__fab--open]=\"open()\"\n [attr.aria-expanded]=\"open()\"\n aria-haspopup=\"menu\"\n (click)=\"toggle()\"\n >\n <strct-icon [name]=\"icon()\" [size]=\"18\" [strokeWidth]=\"1.5\" />\n </button>\n </div>\n `,\n host: { class: 'strct-sd-host' },\n styles: [\n `\n .strct-sd-host {\n display: inline-block;\n }\n .strct-sd {\n position: relative;\n display: inline-flex;\n }\n .strct-sd__fab {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 44px;\n height: 44px;\n border-radius: 50%;\n cursor: pointer;\n color: var(--inv);\n background: var(--acc);\n border: 0;\n box-shadow: var(--shh);\n transition:\n filter 0.14s ease,\n transform 0.16s ease;\n }\n .strct-sd__fab:hover {\n filter: brightness(1.08);\n }\n .strct-sd__fab--open {\n transform: rotate(45deg);\n }\n .strct-sd__actions {\n position: absolute;\n display: flex;\n gap: 10px;\n z-index: 10;\n animation: strct-sd-in 0.14s ease;\n }\n /* The projected icon buttons get a round, raised look. */\n .strct-sd__actions .strct-btn {\n border-radius: 50%;\n box-shadow: var(--sh);\n background: var(--bg-1);\n }\n .strct-sd--up .strct-sd__actions {\n flex-direction: column;\n bottom: calc(100% + 12px);\n left: 50%;\n transform: translateX(-50%);\n }\n .strct-sd--down .strct-sd__actions {\n flex-direction: column;\n top: calc(100% + 12px);\n left: 50%;\n transform: translateX(-50%);\n }\n .strct-sd--left .strct-sd__actions {\n flex-direction: row;\n right: calc(100% + 12px);\n top: 50%;\n transform: translateY(-50%);\n }\n .strct-sd--right .strct-sd__actions {\n flex-direction: row;\n left: calc(100% + 12px);\n top: 50%;\n transform: translateY(-50%);\n }\n @keyframes strct-sd-in {\n from {\n opacity: 0;\n }\n }\n `,\n ],\n})\nexport class StrctSpeedDial {\n private readonly host = inject(ElementRef<HTMLElement>);\n /** Icon name. */\n readonly icon = input('ellipsis');\n /** Direction the actions fan out. */\n readonly direction = input<StrctSpeedDialDirection>('up');\n readonly open = signal(false);\n\n toggle(): void {\n this.open.update((v) => !v);\n }\n\n @HostListener('document:click', ['$event'])\n protected onDocClick(event: MouseEvent): void {\n if (this.open() && !this.host.nativeElement.contains(event.target as Node)) {\n this.open.set(false);\n }\n }\n\n @HostListener('document:keydown.escape')\n protected onEscape(): void {\n this.open.set(false);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n inject,\n input,\n model,\n} from '@angular/core';\nimport { StrctIcon } from '../icon/icon';\nimport { StrctStatus } from '../status';\n\n/**\n * Surface container. Compose with the header / block / footer pieces:\n *\n * <strct-card status=\"warning\" collapsible [(collapsed)]=\"hidden\">\n * <strct-card-header icon=\"host\">Host hv-02</strct-card-header>\n * <strct-card-block>…</strct-card-block>\n * <strct-card-footer><button strct-button>OK</button></strct-card-footer>\n * </strct-card>\n *\n * Rich options (all opt-in; defaults preserve the plain card):\n * - `status` — tone rail on the leading edge (same language as alert / hero).\n * - `interactive` — hover lift + accent border for clickable cards.\n * - `selected` — accent ring for picker layouts.\n * - `dense` — tighter paddings for dashboards.\n * - `loading` — indeterminate top bar + `aria-busy` (reduced-motion safe).\n * - `collapsible` + two-way `collapsed` — the header gains a chevron toggle;\n * block and footer hide while collapsed.\n */\n@Component({\n selector: 'strct-card',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `<ng-content />`,\n host: {\n class: 'strct-card',\n '[class.strct-card--accent]': \"status() === 'accent'\",\n '[class.strct-card--success]': \"status() === 'success'\",\n '[class.strct-card--warning]': \"status() === 'warning'\",\n '[class.strct-card--critical]': \"status() === 'critical'\",\n '[class.strct-card--interactive]': 'interactive()',\n '[class.strct-card--selected]': 'selected()',\n '[class.strct-card--dense]': 'dense()',\n '[class.strct-card--loading]': 'loading()',\n '[class.strct-card--collapsed]': 'collapsible() && collapsed()',\n '[attr.aria-busy]': 'loading() ? \"true\" : null',\n },\n styles: [\n `\n .strct-card {\n position: relative;\n display: block;\n background: var(--bg-1);\n border: 1px solid var(--b2);\n border-radius: var(--radius-lg);\n box-shadow: var(--sh);\n overflow: hidden;\n }\n\n /* Tone rail on the leading edge — same language as alert / hero. */\n .strct-card--accent {\n border-inline-start: 3px solid var(--acc);\n }\n .strct-card--success {\n border-inline-start: 3px solid var(--success);\n }\n .strct-card--warning {\n border-inline-start: 3px solid var(--warning);\n }\n .strct-card--critical {\n border-inline-start: 3px solid var(--critical);\n }\n\n /* Clickable affordance (style-only — wrap in <a>/<button> or handle click). */\n .strct-card--interactive {\n cursor: pointer;\n transition:\n border-color 0.14s ease,\n transform 0.14s ease,\n box-shadow 0.14s ease;\n }\n .strct-card--interactive:hover {\n border-color: var(--acc50);\n transform: translateY(-1px);\n box-shadow: var(--shh);\n }\n .strct-card--interactive:focus-within {\n border-color: var(--acc);\n }\n\n .strct-card--selected {\n border-color: var(--acc);\n box-shadow:\n 0 0 0 1px var(--acc),\n var(--sh);\n }\n\n /* Density: the pieces read these vars (fallbacks keep standalone use intact). */\n .strct-card--dense {\n --strct-card-px: var(--space-3);\n --strct-card-py: var(--space-2);\n --strct-card-pb: var(--space-3);\n }\n\n /* Loading: indeterminate accent bar along the top. */\n .strct-card--loading::before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n height: 2px;\n width: 40%;\n background: var(--acc);\n animation: strct-card-load 1.1s ease-in-out infinite;\n z-index: 1;\n }\n .strct-card--loading > strct-card-block,\n .strct-card--loading > strct-card-footer {\n opacity: 0.55;\n pointer-events: none;\n }\n @keyframes strct-card-load {\n 0% {\n transform: translateX(-100%);\n }\n 100% {\n transform: translateX(280%);\n }\n }\n\n /* Collapsed: only the header stays. */\n .strct-card--collapsed > strct-card-block,\n .strct-card--collapsed > strct-card-footer {\n display: none;\n }\n .strct-card--collapsed > strct-card-header {\n border-bottom: 0;\n }\n\n @media (prefers-reduced-motion: reduce) {\n .strct-card--interactive {\n transition: none;\n }\n .strct-card--interactive:hover {\n transform: none;\n }\n .strct-card--loading::before {\n animation: none;\n width: 100%;\n opacity: 0.4;\n }\n }\n `,\n ],\n})\nexport class StrctCard {\n /** Tone rail on the leading edge. */\n readonly status = input<StrctStatus>('neutral');\n /** Hover lift + accent border for clickable cards (style-only affordance). */\n readonly interactive = input(false, { transform: booleanAttribute });\n /** Accent ring — for picker / multi-select card layouts. */\n readonly selected = input(false, { transform: booleanAttribute });\n /** Tighter paddings for dense dashboards. */\n readonly dense = input(false, { transform: booleanAttribute });\n /** Indeterminate top bar + aria-busy; body/footer dim and ignore input. */\n readonly loading = input(false, { transform: booleanAttribute });\n /** Allow collapsing to just the header (a chevron appears in the header). */\n readonly collapsible = input(false, { transform: booleanAttribute });\n /** Collapsed state (two-way; only meaningful with `collapsible`). */\n readonly collapsed = model(false);\n\n toggle(): void {\n this.collapsed.update((v) => !v);\n }\n}\n\n/** Header section of a {@link StrctCard}. */\n@Component({\n selector: 'strct-card-header',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon],\n template: `\n @if (icon()) {\n <strct-icon class=\"strct-card__hicon\" [name]=\"icon()\" [size]=\"16\" [strokeWidth]=\"1.4\" />\n }\n <ng-content />\n @if (card?.collapsible()) {\n <button\n type=\"button\"\n class=\"strct-card__collapse\"\n [attr.aria-expanded]=\"!card!.collapsed()\"\n [attr.aria-label]=\"card!.collapsed() ? expandLabel() : collapseLabel()\"\n (click)=\"card!.toggle()\"\n >\n <strct-icon\n name=\"chevronDown\"\n [size]=\"14\"\n [strokeWidth]=\"1.6\"\n [class.strct-card__chev--collapsed]=\"card!.collapsed()\"\n />\n </button>\n }\n `,\n host: { class: 'strct-card__header' },\n styles: [\n `\n .strct-card__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-2);\n padding: var(--strct-card-py, var(--space-3)) var(--strct-card-px, var(--space-4));\n border-bottom: 1px solid var(--b1);\n font-size: 13px;\n font-weight: 600;\n color: var(--t1);\n }\n .strct-card__hicon {\n color: var(--t2);\n flex-shrink: 0;\n }\n .strct-card__collapse {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n margin: -4px;\n margin-inline-start: 0;\n padding: 0;\n border: 0;\n border-radius: var(--radius-sm);\n background: transparent;\n color: var(--t3);\n cursor: pointer;\n flex-shrink: 0;\n }\n .strct-card__collapse:hover {\n color: var(--t1);\n background: var(--bg-3);\n }\n .strct-card__collapse:focus-visible {\n outline: none;\n box-shadow: 0 0 0 2px var(--acc50);\n }\n .strct-card__collapse strct-icon {\n transition: transform 0.15s ease;\n }\n .strct-card__chev--collapsed {\n transform: rotate(-90deg);\n }\n @media (prefers-reduced-motion: reduce) {\n .strct-card__collapse strct-icon {\n transition: none;\n }\n }\n `,\n ],\n})\nexport class StrctCardHeader {\n /** Optional leading icon (StrctIcon set). */\n readonly icon = input('');\n /** Accessible labels for the collapse toggle (localizable). */\n readonly collapseLabel = input('Collapse');\n readonly expandLabel = input('Expand');\n\n protected readonly card = inject(StrctCard, { optional: true });\n}\n\n/** Body section of a {@link StrctCard}. */\n@Component({\n selector: 'strct-card-block',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `<ng-content />`,\n host: { class: 'strct-card__block' },\n styles: [\n `\n .strct-card__block {\n display: block;\n padding: var(--strct-card-pb, var(--space-4)) var(--strct-card-px, var(--space-4));\n color: var(--t2);\n font-size: 13px;\n }\n `,\n ],\n})\nexport class StrctCardBlock {}\n\n/** Footer section of a {@link StrctCard}. */\n@Component({\n selector: 'strct-card-footer',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `<ng-content />`,\n host: { class: 'strct-card__footer' },\n styles: [\n `\n .strct-card__footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--space-2);\n padding: var(--strct-card-py, var(--space-3)) var(--strct-card-px, var(--space-4));\n border-top: 1px solid var(--b1);\n background: var(--bg-2);\n }\n `,\n ],\n})\nexport class StrctCardFooter {}\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation, input, model } from '@angular/core';\nimport { StrctIcon } from '../icon/icon';\n\n/** Vertical container for `<strct-accordion-panel>` items. */\n@Component({\n selector: 'strct-accordion',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `<ng-content />`,\n host: { class: 'strct-accordion' },\n styles: [\n `\n .strct-accordion {\n display: flex;\n flex-direction: column;\n border: 1px solid var(--b2);\n border-radius: 8px;\n overflow: hidden;\n background: var(--bg-1);\n }\n `,\n ],\n})\nexport class StrctAccordion {}\n\n/** Collapsible panel with a header. `expanded` is two-way bindable. */\n@Component({\n selector: 'strct-accordion-panel',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon],\n template: `\n <button\n type=\"button\"\n class=\"strct-acc__head\"\n [attr.aria-expanded]=\"expanded()\"\n (click)=\"toggle()\"\n >\n <span class=\"strct-acc__chevron\" [class.strct-acc__chevron--open]=\"expanded()\">\n <strct-icon name=\"chevronRight\" [size]=\"13\" [strokeWidth]=\"1.7\" />\n </span>\n <span class=\"strct-acc__title\">{{ heading() }}</span>\n </button>\n @if (expanded()) {\n <div class=\"strct-acc__body\"><ng-content /></div>\n }\n `,\n host: { class: 'strct-acc' },\n styles: [\n `\n .strct-acc {\n display: block;\n }\n /* Hairline divider joins consecutive panels into one stacked surface. */\n .strct-acc + .strct-acc {\n border-top: 1px solid var(--b2);\n }\n .strct-acc__head {\n display: flex;\n align-items: center;\n gap: 9px;\n width: 100%;\n padding: 11px 14px;\n border: 0;\n background: transparent;\n cursor: pointer;\n font-family: var(--font);\n font-size: 13px;\n font-weight: 500;\n color: var(--t1);\n text-align: start;\n }\n .strct-acc__head:hover {\n background: var(--bg-3);\n }\n .strct-acc__chevron {\n display: inline-flex;\n color: var(--t3);\n transition: transform 0.16s ease;\n }\n .strct-acc__chevron--open {\n transform: rotate(90deg);\n color: var(--acc);\n }\n .strct-acc__title {\n flex: 1;\n }\n .strct-acc__body {\n padding: 4px 14px 14px 32px;\n color: var(--t2);\n font-size: 13px;\n border-top: 1px solid var(--b1);\n }\n `,\n ],\n})\nexport class StrctAccordionPanel {\n /** Panel heading. */\n readonly heading = input.required<string>();\n /** Whether the panel is open (two-way). */\n readonly expanded = model(false);\n\n toggle(): void {\n this.expanded.update((v) => !v);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n contentChildren,\n effect,\n input,\n model,\n signal,\n} from '@angular/core';\n\n/** A single tab. Place inside `<strct-tabs>`; `label` names its button. */\n@Component({\n selector: 'strct-tab',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `@if (active()) {\n <ng-content />\n }`,\n host: { class: 'strct-tab', role: 'tabpanel', '[hidden]': '!active()' },\n})\nexport class StrctTab {\n /** Label text. */\n readonly label = input.required<string>();\n /** Static disable flag. */\n readonly disabled = input(false, { transform: booleanAttribute });\n private readonly _active = signal(false);\n readonly active = this._active.asReadonly();\n\n /** @internal called by the parent tab group */\n setActive(value: boolean): void {\n this._active.set(value);\n }\n}\n\n/** Tab group. Wraps `<strct-tab>` children and renders the tab bar. */\n@Component({\n selector: 'strct-tabs',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n <div\n class=\"strct-tabs__bar\"\n role=\"tablist\"\n tabindex=\"0\"\n #bar\n (keydown)=\"onKeydown($event, bar)\"\n >\n @for (tab of tabs(); track tab; let i = $index) {\n <button\n type=\"button\"\n role=\"tab\"\n class=\"strct-tabs__btn\"\n [class.strct-tabs__btn--active]=\"i === selectedIndex()\"\n [attr.aria-selected]=\"i === selectedIndex()\"\n [attr.tabindex]=\"i === selectedIndex() ? 0 : -1\"\n [disabled]=\"tab.disabled()\"\n (click)=\"select(i)\"\n >\n {{ tab.label() }}\n </button>\n }\n </div>\n <div class=\"strct-tabs__panels\"><ng-content /></div>\n `,\n host: { class: 'strct-tabs' },\n styles: [\n `\n .strct-tabs {\n display: block;\n }\n .strct-tabs__bar {\n display: flex;\n gap: 2px;\n border-bottom: 1px solid var(--b2);\n overflow-x: auto;\n white-space: nowrap;\n scrollbar-width: none;\n }\n .strct-tabs__btn {\n appearance: none;\n background: transparent;\n border: 0;\n cursor: pointer;\n font-family: var(--font);\n font-size: 13px;\n font-weight: 500;\n color: var(--t2);\n padding: 9px 14px;\n border-bottom: 2px solid transparent;\n margin-bottom: -1px;\n transition:\n color 0.14s ease,\n border-color 0.14s ease;\n }\n .strct-tabs__btn:hover {\n color: var(--t1);\n }\n .strct-tabs__btn--active {\n color: var(--acc);\n border-bottom-color: var(--acc);\n }\n .strct-tabs__btn:disabled {\n color: var(--t4);\n cursor: not-allowed;\n }\n .strct-tabs__panels {\n padding-top: 16px;\n }\n `,\n ],\n})\nexport class StrctTabs {\n readonly tabs = contentChildren(StrctTab);\n readonly selectedIndex = model(0);\n\n constructor() {\n // Keep each child panel's visibility in sync with the selected index.\n effect(() => {\n const idx = this.selectedIndex();\n this.tabs().forEach((tab, i) => tab.setActive(i === idx));\n });\n }\n\n select(index: number): void {\n if (!this.tabs()[index]?.disabled()) this.selectedIndex.set(index);\n }\n\n onKeydown(event: KeyboardEvent, bar: HTMLElement): void {\n const key = event.key;\n if (!['ArrowRight', 'ArrowLeft', 'Home', 'End'].includes(key)) return;\n event.preventDefault();\n const count = this.tabs().length;\n if (!count) return;\n let idx = this.selectedIndex();\n if (key === 'Home') {\n idx = 0;\n while (idx < count && this.tabs()[idx].disabled()) idx++;\n } else if (key === 'End') {\n idx = count - 1;\n while (idx >= 0 && this.tabs()[idx].disabled()) idx--;\n } else {\n const step = key === 'ArrowRight' ? 1 : -1;\n for (let n = 0; n < count; n++) {\n idx = (idx + step + count) % count;\n if (!this.tabs()[idx].disabled()) break;\n }\n }\n if (idx < 0 || idx >= count || this.tabs()[idx]?.disabled()) return;\n this.selectedIndex.set(idx);\n const buttons = bar.querySelectorAll<HTMLElement>('button.strct-tabs__btn');\n buttons[idx]?.focus();\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport {\n ApplicationRef,\n ChangeDetectionStrategy,\n Component,\n ComponentRef,\n Directive,\n ElementRef,\n EnvironmentInjector,\n HostListener,\n Injectable,\n NgZone,\n ViewEncapsulation,\n afterNextRender,\n booleanAttribute,\n computed,\n createComponent,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { StrctIcon } from '../icon/icon';\n\n/** A single entry in a data-driven menu. */\nexport interface StrctMenuItem {\n /** Entry text. Optional — omit it for a `divider`, where a label is meaningless. */\n label?: string;\n icon?: string;\n /** Destructive styling. */\n critical?: boolean;\n disabled?: boolean;\n /** Render a separator instead of an entry (label is ignored). */\n divider?: boolean;\n /** Nested submenu. */\n children?: StrctMenuItem[];\n /** Invoked on selection, with the trigger's `strctContextMenuData`. */\n action?: (data?: unknown) => void;\n /** Arbitrary payload. */\n data?: unknown;\n}\n\n/**\n * Floating menu panel — portaled into `<body>` (so it escapes overflow /\n * transform clipping), positioned by its real measured size, with full keyboard\n * navigation and recursive submenus. Usually created by `[strctContextMenu]`,\n * but can be embedded directly with `submenu`.\n */\n@Component({\n selector: 'strct-menu-panel',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon],\n template: `\n <div class=\"strct-menu\" role=\"menu\" tabindex=\"-1\" (keydown)=\"onKeydown($event)\">\n @for (item of items(); track $index; let i = $index) {\n @if (item.divider) {\n <div class=\"strct-menu__sep\" role=\"separator\"></div>\n } @else {\n <div class=\"strct-menu__wrap\" (mouseenter)=\"onHover(i)\" (mouseleave)=\"onLeave(i)\">\n <button\n type=\"button\"\n class=\"strct-menu__item\"\n [attr.data-idx]=\"i\"\n [class.strct-menu__item--critical]=\"item.critical\"\n [class.strct-menu__item--active]=\"i === activeIndex()\"\n [disabled]=\"item.disabled\"\n role=\"menuitem\"\n [attr.aria-haspopup]=\"item.children?.length ? 'menu' : null\"\n [attr.aria-expanded]=\"item.children?.length ? openSubIndex() === i : null\"\n [attr.tabindex]=\"i === activeIndex() ? 0 : -1\"\n (click)=\"onItemClick(item, i, $event)\"\n >\n @if (item.icon) {\n <strct-icon\n class=\"strct-menu__icon\"\n [name]=\"item.icon\"\n [size]=\"16\"\n [strokeWidth]=\"1.3\"\n />\n } @else {\n <span class=\"strct-menu__icon-spacer\" aria-hidden=\"true\"></span>\n }\n <span class=\"strct-menu__label\">{{ item.label }}</span>\n @if (item.children?.length) {\n <strct-icon\n class=\"strct-menu__arrow\"\n name=\"chevronRight\"\n [size]=\"12\"\n [strokeWidth]=\"1.6\"\n />\n }\n </button>\n @if (openSubIndex() === i && item.children?.length) {\n <strct-menu-panel\n submenu\n class=\"strct-menu__subpanel\"\n [class.strct-menu__subpanel--flip]=\"flipLeft()\"\n [items]=\"item.children!\"\n [data]=\"data()\"\n (select)=\"select.emit($event)\"\n (close)=\"close.emit()\"\n (back)=\"closeSub(); focusItem(i)\"\n />\n }\n </div>\n }\n }\n </div>\n `,\n host: {\n class: 'strct-menu-host',\n '[style.position]': \"submenu() ? null : 'fixed'\",\n '[style.left.px]': 'submenu() ? null : posX()',\n '[style.top.px]': 'submenu() ? null : posY()',\n '[style.zIndex]': 'submenu() ? null : 1100',\n },\n styles: [\n `\n .strct-menu-host {\n display: block;\n }\n .strct-menu {\n min-width: 180px;\n padding: 4px;\n background: var(--bg-1);\n border: 1px solid var(--b2);\n border-radius: 7px;\n box-shadow: var(--shh);\n animation: strct-menu-in 0.1s ease;\n }\n .strct-menu:focus {\n outline: none;\n }\n .strct-menu__wrap {\n position: relative;\n }\n .strct-menu__item {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 7px 8px 7px 10px;\n border: 0;\n border-radius: 5px;\n cursor: pointer;\n background: transparent;\n color: var(--t1);\n font-size: 13px;\n font-family: var(--font);\n text-align: start;\n }\n .strct-menu__item:hover:not(:disabled),\n .strct-menu__item--active:not(:disabled) {\n background: var(--bg-3);\n }\n .strct-menu__item:focus-visible {\n outline: none;\n background: var(--bg-3);\n }\n .strct-menu__item--critical {\n color: var(--critical);\n }\n .strct-menu__item--critical:hover:not(:disabled),\n .strct-menu__item--critical.strct-menu__item--active:not(:disabled) {\n background: var(--critical-bg);\n }\n .strct-menu__item:disabled {\n opacity: 0.45;\n cursor: not-allowed;\n }\n .strct-menu__icon {\n color: var(--t2);\n flex-shrink: 0;\n }\n .strct-menu__item--critical .strct-menu__icon {\n color: var(--critical);\n }\n .strct-menu__icon-spacer {\n width: 14px;\n flex-shrink: 0;\n }\n .strct-menu__label {\n flex: 1;\n white-space: nowrap;\n }\n .strct-menu__arrow {\n color: var(--t3);\n flex-shrink: 0;\n }\n .strct-menu__sep {\n height: 1px;\n margin: 4px 6px;\n background: var(--b1);\n }\n\n .strct-menu__subpanel {\n position: absolute;\n top: -5px;\n left: 100%;\n margin-inline-start: 2px;\n z-index: 1;\n }\n .strct-menu__subpanel--flip {\n left: auto;\n right: 100%;\n margin-inline-start: 0;\n margin-inline-end: 2px;\n }\n @keyframes strct-menu-in {\n from {\n opacity: 0;\n transform: scale(0.97);\n }\n }\n `,\n ],\n})\nexport class StrctMenuPanel {\n private readonly host: ElementRef<HTMLElement> = inject(ElementRef);\n\n /** Menu items to display. */\n readonly items = input.required<StrctMenuItem[]>();\n /** Arbitrary payload passed to item actions. */\n readonly data = input<unknown>(undefined);\n /** Horizontal position in pixels. */\n readonly x = input(0);\n /** Vertical position in pixels. */\n readonly y = input(0);\n /** Render as a nested submenu panel. */\n readonly submenu = input(false, { transform: booleanAttribute });\n\n /** Emitted when an item is selected. */\n readonly select = output<StrctMenuItem>();\n /** Emitted when the menu requests closing. */\n readonly close = output<void>();\n /** ArrowLeft inside a submenu — asks the parent to close it. */\n readonly back = output<void>();\n\n protected readonly posX = signal(0);\n protected readonly posY = signal(0);\n protected readonly flipLeft = signal(false);\n protected readonly activeIndex = signal(0);\n protected readonly openSubIndex = signal<number | null>(null);\n\n private readonly navIndices = computed(() =>\n this.items()\n .map((it, i) => (it.divider ? -1 : i))\n .filter((i) => i >= 0),\n );\n\n constructor() {\n this.posX.set(this.x());\n this.posY.set(this.y());\n afterNextRender(() => {\n this.activeIndex.set(this.navIndices()[0] ?? 0);\n if (!this.submenu()) this.clampToViewport();\n this.focusItem(this.activeIndex());\n });\n }\n\n private clampToViewport(): void {\n const host = this.host.nativeElement;\n const w = host.offsetWidth;\n const h = host.offsetHeight;\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const m = 6;\n let nx = this.x();\n let ny = this.y();\n if (nx + w > vw - m) nx = Math.max(m, Math.min(this.x() - w, vw - w - m));\n if (ny + h > vh - m) ny = Math.max(m, vh - h - m);\n this.posX.set(nx);\n this.posY.set(ny);\n // Submenus of a panel near the right edge open to the left.\n this.flipLeft.set(nx + w > vw - 220);\n }\n\n protected focusItem(i: number): void {\n this.activeIndex.set(i);\n this.host.nativeElement\n .querySelector<HTMLElement>(`.strct-menu__item[data-idx=\"${i}\"]`)\n ?.focus();\n }\n\n private move(dir: 1 | -1): void {\n const nav = this.navIndices();\n if (!nav.length) return;\n const pos = nav.indexOf(this.activeIndex());\n const next = nav[(pos + dir + nav.length) % nav.length];\n this.openSubIndex.set(null);\n this.focusItem(next);\n }\n\n protected onHover(i: number): void {\n this.activeIndex.set(i);\n const it = this.items()[i];\n this.openSubIndex.set(it?.children?.length ? i : null);\n }\n\n protected onLeave(i: number): void {\n if (this.openSubIndex() === i) this.openSubIndex.set(null);\n }\n\n protected onItemClick(item: StrctMenuItem, i: number, event: Event): void {\n event.stopPropagation();\n if (item.disabled) return;\n if (item.children?.length) {\n this.openSubIndex.set(this.openSubIndex() === i ? null : i);\n this.focusItem(i);\n } else {\n this.select.emit(item);\n }\n }\n\n protected closeSub(): void {\n this.openSubIndex.set(null);\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n const key = event.key;\n const item = this.items()[this.activeIndex()];\n switch (key) {\n case 'ArrowDown':\n event.preventDefault();\n event.stopPropagation();\n this.move(1);\n break;\n case 'ArrowUp':\n event.preventDefault();\n event.stopPropagation();\n this.move(-1);\n break;\n case 'Home':\n event.preventDefault();\n event.stopPropagation();\n this.focusItem(this.navIndices()[0] ?? 0);\n break;\n case 'End':\n event.preventDefault();\n event.stopPropagation();\n this.focusItem(this.navIndices().at(-1) ?? 0);\n break;\n case 'ArrowRight':\n if (item?.children?.length) {\n event.preventDefault();\n event.stopPropagation();\n this.openSubIndex.set(this.activeIndex());\n }\n break;\n case 'ArrowLeft':\n event.preventDefault();\n event.stopPropagation();\n if (this.openSubIndex() != null) this.closeSub();\n else if (this.submenu()) this.back.emit();\n break;\n case 'Enter':\n case ' ':\n event.preventDefault();\n event.stopPropagation();\n if (item && !item.disabled) {\n if (item.children?.length) this.openSubIndex.set(this.activeIndex());\n else this.select.emit(item);\n }\n break;\n case 'Escape':\n event.preventDefault();\n event.stopPropagation();\n this.close.emit();\n break;\n }\n }\n}\n\n/** Options for {@link StrctMenuService.open}. */\nexport interface StrctMenuOpenOptions {\n /** Viewport x of the menu's top-left (clamped/flipped to stay on screen). */\n x: number;\n /** Viewport y of the menu's top-left. */\n y: number;\n items: StrctMenuItem[];\n /** Payload passed to each item's `action`. */\n data?: unknown;\n /** Called with the chosen item (after its `action` runs). */\n onSelect?: (item: StrctMenuItem) => void;\n}\n\n/**\n * Imperatively opens the data-driven menu panel, portaled into `<body>`. Shared\n * by the `[strctContextMenu]` directive (right-click) and any click trigger such\n * as the datagrid row-action button. Only one menu is open at a time.\n */\n@Injectable({ providedIn: 'root' })\nexport class StrctMenuService {\n private readonly appRef = inject(ApplicationRef);\n private readonly envInjector = inject(EnvironmentInjector);\n private readonly zone = inject(NgZone);\n private readonly doc = inject(DOCUMENT);\n private ref: ComponentRef<StrctMenuPanel> | null = null;\n\n open(opts: StrctMenuOpenOptions): void {\n this.close();\n if (!opts.items?.length) return;\n const ref = createComponent(StrctMenuPanel, { environmentInjector: this.envInjector });\n ref.setInput('items', opts.items);\n ref.setInput('data', opts.data);\n ref.setInput('x', opts.x);\n ref.setInput('y', opts.y);\n ref.instance.select.subscribe((item) => {\n item.action?.(opts.data);\n opts.onSelect?.(item);\n this.close();\n });\n ref.instance.close.subscribe(() => this.close());\n\n this.appRef.attachView(ref.hostView);\n this.doc.body.appendChild(ref.location.nativeElement);\n this.ref = ref;\n\n // Defer global listeners so the opening click doesn't immediately close it.\n setTimeout(() => {\n this.zone.runOutsideAngular(() => {\n this.doc.addEventListener('mousedown', this.onOutside, true);\n window.addEventListener('scroll', this.onClose, true);\n window.addEventListener('resize', this.onClose);\n });\n });\n }\n\n private readonly onClose = () => this.zone.run(() => this.close());\n private readonly onOutside = (event: Event) => {\n if (this.ref && !this.ref.location.nativeElement.contains(event.target as Node)) {\n this.onClose();\n }\n };\n\n close(): void {\n if (!this.ref) return;\n this.doc.removeEventListener('mousedown', this.onOutside, true);\n window.removeEventListener('scroll', this.onClose, true);\n window.removeEventListener('resize', this.onClose);\n this.appRef.detachView(this.ref.hostView);\n this.ref.destroy();\n this.ref = null;\n }\n}\n\n/**\n * Right-click (context) menu driven by a data array. Attach to any trigger; the\n * menu portals into `<body>` and runs each item's `action` on selection.\n * <div [strctContextMenu]=\"menuFor(host)\" [strctContextMenuData]=\"host\"\n * (menuSelect)=\"onPick($event)\">…</div>\n */\n@Directive({ selector: '[strctContextMenu]' })\nexport class StrctContextMenuTrigger {\n private readonly menu = inject(StrctMenuService);\n\n /** Menu items to display. */\n readonly items = input.required<StrctMenuItem[]>({ alias: 'strctContextMenu' });\n /** Arbitrary payload passed to item actions. */\n readonly data = input<unknown>(undefined, { alias: 'strctContextMenuData' });\n /** Emitted when a menu item is selected. */\n readonly menuSelect = output<StrctMenuItem>();\n\n @HostListener('contextmenu', ['$event'])\n protected onContextMenu(event: MouseEvent): void {\n if (!this.items()?.length) return;\n event.preventDefault();\n this.menu.open({\n x: event.clientX,\n y: event.clientY,\n items: this.items(),\n data: this.data(),\n onSelect: (item) => this.menuSelect.emit(item),\n });\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n ViewEncapsulation,\n computed,\n contentChildren,\n forwardRef,\n inject,\n input,\n model,\n output,\n signal,\n} from '@angular/core';\nimport { StrctIcon, StrctIconBadge } from '../icon/icon';\nimport { StrctContextMenuTrigger, StrctMenuItem } from '../context-menu/menu';\n\n/** A node in the data-driven tree (`<strct-tree [nodes]=\"...\">`). */\nexport interface StrctTreeNodeData {\n /**\n * Stable unique key — used for `trackBy`, controlled expansion state\n * (`expandedIds`) and a `data-node-id` DOM attribute. Falls back to `label`\n * when absent (backward-compatible).\n */\n id?: string;\n label: string;\n /** Optional leading icon name. */\n icon?: string;\n /** Status dot on the icon (running / maintenance / off …). */\n badge?: StrctIconBadge;\n /** Highlight as the selected node. */\n active?: boolean;\n /** Initial expanded state. */\n expanded?: boolean;\n children?: StrctTreeNodeData[];\n /** Arbitrary payload returned with (nodeActivated). */\n data?: unknown;\n}\n\n/** Per-node menu resolver for the data-driven tree — returns the items for one node. */\nexport type StrctTreeNodeMenuFn = (node: StrctTreeNodeData) => StrctMenuItem[];\n\n/** Payload of (nodeMenuSelect). */\nexport interface StrctTreeMenuEvent {\n node: StrctTreeNodeData;\n item: StrctMenuItem;\n}\n\n/**\n * Tree node. Two modes:\n * - **Content:** nest `<strct-tree-node>` children manually.\n * - **Data:** pass a `[node]` object that recurses over its `children` —\n * used internally by `<strct-tree [nodes]>`.\n *\n * <strct-tree-node label=\"Group\" icon=\"layers\" badge=\"success\" [(expanded)]=\"open\">\n * <strct-tree-node label=\"Leaf\" icon=\"vm\" [active]=\"true\" />\n * </strct-tree-node>\n */\n@Component({\n selector: 'strct-tree-node',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon, StrctContextMenuTrigger],\n template: `\n <div\n class=\"strct-tnode__row\"\n [class.strct-tnode__row--active]=\"displayActive()\"\n role=\"treeitem\"\n [attr.tabindex]=\"rowTabindex()\"\n [attr.aria-level]=\"level\"\n [attr.aria-selected]=\"displayActive()\"\n [attr.aria-expanded]=\"hasChildren() ? isOpen() : null\"\n [strctContextMenu]=\"menuItems()\"\n [strctContextMenuData]=\"node()\"\n (menuSelect)=\"onMenuSelect($event)\"\n (click)=\"onActivate()\"\n (focus)=\"onRowFocus()\"\n (keydown)=\"onRowKeydown($event)\"\n (keydown.enter)=\"onActivate()\"\n (keydown.space)=\"$event.preventDefault(); onActivate()\"\n >\n @if (hasChildren()) {\n <span\n class=\"strct-tnode__chevron\"\n [class.strct-tnode__chevron--open]=\"isOpen()\"\n role=\"button\"\n [attr.aria-label]=\"(isOpen() ? 'Collapse ' : 'Expand ') + displayLabel()\"\n [attr.tabindex]=\"tree ? -1 : 0\"\n (click)=\"$event.stopPropagation(); toggle()\"\n (keydown.enter)=\"$event.stopPropagation(); toggle()\"\n (keydown.space)=\"$event.stopPropagation(); toggle()\"\n >\n <strct-icon name=\"chevronRight\" [size]=\"12\" [strokeWidth]=\"1.5\" />\n </span>\n } @else {\n <span class=\"strct-tnode__spacer\"></span>\n }\n @if (displayIcon()) {\n <strct-icon\n class=\"strct-tnode__icon\"\n [name]=\"displayIcon()!\"\n [size]=\"iconSize()\"\n [strokeWidth]=\"1.3\"\n [badge]=\"displayBadge()\"\n />\n }\n <span class=\"strct-tnode__label\">{{ displayLabel() }}</span>\n <ng-content select=\"[strctTreeTrailing]\" />\n </div>\n @if (hasChildren() && isOpen()) {\n <div class=\"strct-tnode__children\" role=\"group\">\n @if (node()) {\n @for (child of node()!.children ?? []; track child.id ?? child.label) {\n <strct-tree-node\n [node]=\"child\"\n [nodeMenu]=\"nodeMenu()\"\n (nodeActivated)=\"nodeActivated.emit($event)\"\n (nodeMenuSelect)=\"nodeMenuSelect.emit($event)\"\n />\n }\n } @else {\n <ng-content />\n }\n </div>\n }\n `,\n host: {\n class: 'strct-tnode',\n '[attr.data-node-id]': 'node()?.id ?? null',\n },\n styles: [\n `\n .strct-tnode {\n display: block;\n }\n .strct-tnode__row {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 4px 9px;\n border-radius: 5px;\n cursor: pointer;\n font-size: 13px;\n color: var(--t1);\n user-select: none;\n }\n .strct-tnode__row:hover {\n background: var(--bg-3);\n }\n .strct-tnode__row:focus-visible {\n outline: none;\n box-shadow: inset 0 0 0 2px var(--acc50);\n }\n .strct-tnode__row--active {\n background: var(--acc-m);\n color: var(--acc);\n font-weight: 500;\n }\n .strct-tnode__row--active .strct-tnode__icon,\n .strct-tnode__row--active .strct-tnode__chevron {\n color: var(--acc);\n }\n .strct-tnode__chevron {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n color: var(--t3);\n transition: transform 0.15s ease;\n /* 24px hit target (WCAG 2.5.8) without changing visual density. */\n width: 24px;\n height: 24px;\n margin: -5px;\n margin-inline-end: -10px;\n flex-shrink: 0;\n }\n .strct-tnode__chevron--open {\n transform: rotate(90deg);\n }\n .strct-tnode__spacer {\n width: 14px;\n flex-shrink: 0;\n }\n @media (prefers-reduced-motion: reduce) {\n .strct-tnode__chevron {\n transition: none;\n }\n }\n .strct-tnode__icon {\n color: var(--t2);\n flex-shrink: 0;\n }\n .strct-tnode__label {\n flex: 1;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n .strct-tnode__children {\n margin-inline-start: 16px;\n }\n `,\n ],\n})\nexport class StrctTreeNode {\n /** Data-driven node; when set, label/icon/children come from it. */\n readonly node = input<StrctTreeNodeData | null>(null);\n /** Label text. */\n readonly label = input('');\n /** Icon name. */\n readonly icon = input<string | undefined>(undefined);\n /** Status dot variant. */\n readonly badge = input<StrctIconBadge>('none');\n /** Whether the item is active / selected. */\n readonly active = input(false);\n /** Whether the panel is open (two-way). */\n readonly expanded = model(false);\n /** Per-node menu resolver (data mode); bubbles down the recursion. */\n readonly nodeMenu = input<StrctTreeNodeMenuFn | null>(null);\n /** Content-mode click. */\n readonly activated = output<void>();\n /** Data-mode click — carries the activated node (bubbles to the tree). */\n readonly nodeActivated = output<StrctTreeNodeData>();\n /** Data-mode right-click menu selection (bubbles to the tree). */\n readonly nodeMenuSelect = output<StrctTreeMenuEvent>();\n\n /** Right-click menu items for this node ([] when no resolver / not data mode). */\n protected readonly menuItems = computed<StrctMenuItem[]>(() => {\n const fn = this.nodeMenu();\n const n = this.node();\n return fn && n ? fn(n) : [];\n });\n\n /** The owning `<strct-tree>` (null only for standalone nodes outside a tree). */\n protected readonly tree = inject<StrctTree | null>(\n forwardRef(() => StrctTree),\n { optional: true },\n );\n /** Node icon scales with the owning tree's density (16 native → 18 comfortable). */\n protected readonly iconSize = computed(() => (this.tree?.density() === 'comfortable' ? 18 : 16));\n /** Parent tree node (element-injector ancestor); drives aria-level + ArrowLeft. */\n readonly parent = inject(StrctTreeNode, { optional: true, skipSelf: true });\n /** 1-based depth, exposed as aria-level. */\n readonly level: number = (this.parent?.level ?? 0) + 1;\n private readonly hostEl = inject<ElementRef<HTMLElement>>(ElementRef);\n\n private readonly childNodes = contentChildren(StrctTreeNode);\n /** Data-mode expansion fallback when there is no owning tree (seeded from node.expanded). */\n private readonly dataExpanded = signal<boolean | null>(null);\n\n protected readonly displayLabel = computed(() => this.node()?.label ?? this.label());\n protected readonly displayIcon = computed(() => this.node()?.icon ?? this.icon());\n protected readonly displayBadge = computed<StrctIconBadge>(\n () => this.node()?.badge ?? this.badge(),\n );\n protected readonly displayActive = computed(() => this.node()?.active ?? this.active());\n\n constructor() {\n // Register with the owning tree for roving focus / keyboard navigation.\n // Collapsed subtrees are not rendered, so the registry always holds exactly\n // the visible nodes.\n this.tree?.registerNode(this);\n inject(DestroyRef).onDestroy(() => this.tree?.unregisterNode(this));\n }\n\n /** The focusable row element of this node. */\n rowEl(): HTMLElement | null {\n return this.hostEl.nativeElement.querySelector(':scope > .strct-tnode__row');\n }\n\n /** Roving tabindex: inside a tree only the active row is tabbable. */\n protected readonly rowTabindex = computed(() =>\n this.tree ? (this.tree.isRovingActive(this) ? 0 : -1) : 0,\n );\n\n protected onRowFocus(): void {\n this.tree?.setActive(this);\n }\n\n protected onRowKeydown(event: KeyboardEvent): void {\n if (!this.tree) return;\n if (!['ArrowDown', 'ArrowUp', 'ArrowLeft', 'ArrowRight', 'Home', 'End'].includes(event.key)) {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n this.tree.navigate(this, event.key);\n }\n\n readonly hasChildren = computed(() => {\n const n = this.node();\n return n ? (n.children?.length ?? 0) > 0 : this.childNodes().length > 0;\n });\n\n readonly isOpen = computed(() => {\n const n = this.node();\n if (n) {\n // Data mode: the owning tree is the single source of truth for expansion\n // (controlled `expandedIds` or its internal set). Only fall back to the\n // private seed when used as a standalone data node with no owning tree.\n if (this.tree) return this.tree.isNodeOpen(n);\n return this.dataExpanded() ?? n.expanded ?? false;\n }\n return this.expanded();\n });\n\n toggle(): void {\n const n = this.node();\n if (n) {\n if (this.tree) this.tree.toggleNode(n);\n else this.dataExpanded.set(!this.isOpen());\n } else {\n this.expanded.update((v) => !v);\n }\n }\n\n protected onActivate(): void {\n const n = this.node();\n if (n) this.nodeActivated.emit(n);\n else this.activated.emit();\n }\n\n protected onMenuSelect(item: StrctMenuItem): void {\n const n = this.node();\n if (n) this.nodeMenuSelect.emit({ node: n, item });\n }\n}\n\n/**\n * Root container for a tree. Either project `<strct-tree-node>` children, or\n * pass `[nodes]` for a fully data-driven, self-recursing tree:\n * <strct-tree [nodes]=\"roots\" (nodeActivated)=\"select($event)\" />\n */\n@Component({\n selector: 'strct-tree',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctTreeNode],\n template: `\n @if (nodes(); as ns) {\n @for (n of ns; track n.id ?? n.label) {\n <strct-tree-node\n [node]=\"n\"\n [nodeMenu]=\"nodeMenu()\"\n (nodeActivated)=\"nodeActivated.emit($event)\"\n (nodeMenuSelect)=\"nodeMenuSelect.emit($event)\"\n />\n }\n } @else {\n <ng-content />\n }\n `,\n host: {\n class: 'strct-tree',\n role: 'tree',\n '[class.strct-tree--comfortable]': \"density() === 'comfortable'\",\n },\n styles: [\n `\n .strct-tree {\n display: block;\n }\n\n /* Comfortable density: larger text / icons, taller rows, wider indent.\n Opt-in — the compact default stays pixel-identical. */\n .strct-tree--comfortable .strct-tnode__row {\n gap: 7px;\n padding: 6px 10px;\n border-radius: 6px;\n font-size: 14px;\n }\n .strct-tree--comfortable .strct-tnode__chevron {\n margin: -4px;\n margin-inline-end: -9px;\n }\n .strct-tree--comfortable .strct-tnode__spacer {\n width: 16px;\n }\n .strct-tree--comfortable .strct-tnode__children {\n margin-inline-start: 19px;\n }\n `,\n ],\n})\nexport class StrctTree {\n /** Data-driven node list; when set, projected content is ignored. */\n readonly nodes = input<StrctTreeNodeData[] | null>(null);\n /**\n * Row density. `compact` (default) is the dense inventory layout —\n * 13px text / 16px icons; `comfortable` relaxes to 14px text / 18px icons\n * with taller rows for touch-friendly or low-density consoles.\n */\n readonly density = input<'compact' | 'comfortable'>('compact');\n /** Per-node right-click menu resolver. */\n readonly nodeMenu = input<StrctTreeNodeMenuFn | null>(null);\n /** Emitted when any data-driven node is clicked. */\n readonly nodeActivated = output<StrctTreeNodeData>();\n /** Emitted when a data-driven node's right-click menu item is chosen. */\n readonly nodeMenuSelect = output<StrctTreeMenuEvent>();\n\n /**\n * Controlled expansion (two-way). When non-null it is the single source of\n * truth: node open state derives from it and toggles write back through it, so\n * persisting/restoring is `<strct-tree [(expandedIds)]=\"ids\" />`. When null\n * (default), expansion is uncontrolled — seeded from each node's `expanded`\n * flag and owned internally (backward-compatible).\n */\n readonly expandedIds = model<string[] | null>(null);\n /** The full set of expanded ids, emitted on every expand / collapse. */\n readonly expandedChange = output<string[]>();\n /** Emitted per toggle with the node and its new state. */\n readonly nodeToggled = output<{ node: StrctTreeNodeData; expanded: boolean }>();\n\n /** Stable key for a node: its `id`, or the `label` as a fallback. */\n private readonly keyOf = (n: StrctTreeNodeData): string => n.id ?? n.label;\n\n /** Explicit user toggles layered on top of the `node.expanded` seed (uncontrolled). */\n private readonly overrides = signal<Map<string, boolean>>(new Map());\n\n /** Keys expanded by their `node.expanded` seed (pure — no flash on first render). */\n private readonly seededSet = computed<Set<string>>(() => {\n const set = new Set<string>();\n const walk = (arr: StrctTreeNodeData[]): void => {\n for (const n of arr) {\n if (n.expanded) set.add(this.keyOf(n));\n if (n.children?.length) walk(n.children);\n }\n };\n const ns = this.nodes();\n if (ns) walk(ns);\n return set;\n });\n\n /** The active expanded-key set — controlled `expandedIds`, or seed + overrides. */\n private readonly currentSet = computed<Set<string>>(() => {\n const ids = this.expandedIds();\n if (ids != null) return new Set(ids);\n const set = new Set(this.seededSet());\n for (const [key, open] of this.overrides()) {\n if (open) set.add(key);\n else set.delete(key);\n }\n return set;\n });\n\n /** Whether a node is currently expanded (called by its `StrctTreeNode`). */\n isNodeOpen(node: StrctTreeNodeData): boolean {\n return this.currentSet().has(this.keyOf(node));\n }\n\n // ── Roving focus / keyboard navigation (ARIA tree pattern) ─────\n private readonly registeredNodes = signal<StrctTreeNode[]>([]);\n private readonly activeRoving = signal<StrctTreeNode | null>(null);\n\n registerNode(node: StrctTreeNode): void {\n this.registeredNodes.update((list) => [...list, node]);\n }\n unregisterNode(node: StrctTreeNode): void {\n this.registeredNodes.update((list) => list.filter((n) => n !== node));\n if (this.activeRoving() === node) this.activeRoving.set(null);\n }\n\n /** Visible nodes in document order (collapsed subtrees are never registered). */\n private ordered(): StrctTreeNode[] {\n return [...this.registeredNodes()].sort((a, b) => {\n const ra = a.rowEl();\n const rb = b.rowEl();\n if (!ra || !rb) return 0;\n return ra.compareDocumentPosition(rb) & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1;\n });\n }\n\n /** Whether this node currently holds the roving tabindex (0). */\n isRovingActive(node: StrctTreeNode): boolean {\n const active = this.activeRoving();\n if (active) return active === node;\n return this.ordered()[0] === node;\n }\n\n setActive(node: StrctTreeNode): void {\n this.activeRoving.set(node);\n }\n\n private focusNode(node: StrctTreeNode | undefined): void {\n if (!node) return;\n this.activeRoving.set(node);\n node.rowEl()?.focus();\n }\n\n /** Keyboard navigation between visible rows (called from the focused node). */\n navigate(node: StrctTreeNode, key: string): void {\n const list = this.ordered();\n const i = list.indexOf(node);\n if (i < 0) return;\n switch (key) {\n case 'ArrowDown':\n this.focusNode(list[Math.min(i + 1, list.length - 1)]);\n break;\n case 'ArrowUp':\n this.focusNode(list[Math.max(i - 1, 0)]);\n break;\n case 'Home':\n this.focusNode(list[0]);\n break;\n case 'End':\n this.focusNode(list[list.length - 1]);\n break;\n case 'ArrowRight':\n // Closed parent: open it. Open parent: move into the first child.\n if (node.hasChildren() && !node.isOpen()) node.toggle();\n else if (node.hasChildren() && i + 1 < list.length) this.focusNode(list[i + 1]);\n break;\n case 'ArrowLeft':\n // Open parent: close it. Otherwise: move focus to the parent node.\n if (node.hasChildren() && node.isOpen()) node.toggle();\n else if (node.parent) this.focusNode(node.parent);\n break;\n }\n }\n\n /** Toggle a node's expansion, updating state and emitting outputs. */\n toggleNode(node: StrctTreeNodeData): void {\n const key = this.keyOf(node);\n const expanded = !this.currentSet().has(key);\n if (this.expandedIds() != null) {\n const set = new Set(this.currentSet());\n if (expanded) set.add(key);\n else set.delete(key);\n this.expandedIds.set([...set]);\n } else {\n const next = new Map(this.overrides());\n next.set(key, expanded);\n this.overrides.set(next);\n }\n this.nodeToggled.emit({ node, expanded });\n this.expandedChange.emit([...this.currentSet()]);\n }\n}\n","import {\n DOCUMENT,\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n booleanAttribute,\n computed,\n effect,\n inject,\n input,\n model,\n output,\n signal,\n} from '@angular/core';\nimport { StrctIcon } from '../icon/icon';\n\n/** Fixed modal width presets: sm 480 · md 640 · lg 860 · xl 1080 (px). */\nexport type StrctModalSize = 'sm' | 'md' | 'lg' | 'xl';\n\nlet modalCounter = 0;\n\n// Body scroll-lock shared across any number of simultaneously open modals.\nlet scrollLockCount = 0;\nlet savedBodyOverflow = '';\nfunction lockBodyScroll(doc: Document): void {\n if (scrollLockCount === 0) {\n savedBodyOverflow = doc.body.style.overflow;\n doc.body.style.overflow = 'hidden';\n }\n scrollLockCount++;\n}\nfunction unlockBodyScroll(doc: Document): void {\n scrollLockCount = Math.max(0, scrollLockCount - 1);\n if (scrollLockCount === 0) doc.body.style.overflow = savedBodyOverflow;\n}\n\n/**\n * Overlay dialog with two-way `open`:\n * <strct-modal [(open)]=\"show\" title=\"Confirm\">\n * Body…\n * <ng-container strctModalFooter>\n * <button strct-button (click)=\"show = false\">Cancel</button>\n * </ng-container>\n * </strct-modal>\n */\n@Component({\n selector: 'strct-modal',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [StrctIcon],\n template: `\n @if (open()) {\n <!-- Backdrop: pointer-only dismiss target. No role/tabindex — keyboard users\n dismiss via Escape, and the focus trap makes the backdrop unreachable\n anyway (a role=\"button\" here was an unnamed phantom stop for AT). -->\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n <div\n class=\"strct-modal__overlay {{ backdropClass() }}\"\n [class.strct-modal__overlay--glass]=\"variant() === 'glass'\"\n (click)=\"onBackdrop($event)\"\n >\n <div\n #dialog\n class=\"strct-modal__dialog strct-modal__dialog--{{ size() }} {{ panelClass() }}\"\n [class.strct-modal__dialog--glass]=\"variant() === 'glass'\"\n [style.transform]=\"dragTransform()\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-labelledby]=\"title() ? titleId : null\"\n tabindex=\"-1\"\n (click)=\"$event.stopPropagation()\"\n (keydown.tab)=\"onTab($event)\"\n (keydown.shift.tab)=\"onTab($event)\"\n >\n <div\n class=\"strct-modal__head\"\n [class.strct-modal__head--drag]=\"draggable()\"\n (pointerdown)=\"onHeadPointerDown($event)\"\n (pointermove)=\"onHeadPointerMove($event)\"\n (pointerup)=\"onHeadPointerEnd()\"\n (lostpointercapture)=\"onHeadPointerEnd()\"\n >\n <span class=\"strct-modal__title\" [id]=\"titleId\">{{ title() }}</span>\n <button\n type=\"button\"\n class=\"strct-modal__close\"\n [attr.aria-label]=\"closeLabel()\"\n (click)=\"close()\"\n >\n <strct-icon name=\"close\" [size]=\"14\" />\n </button>\n </div>\n <div class=\"strct-modal__body\"><ng-content /></div>\n @if (!hideFooter()) {\n <div class=\"strct-modal__foot\"><ng-content select=\"[strctModalFooter]\" /></div>\n }\n </div>\n </div>\n }\n `,\n host: {\n '(document:keydown.escape)': 'onEscape()',\n },\n styles: [\n `\n .strct-modal__overlay {\n position: fixed;\n inset: 0;\n z-index: 1000;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--space-5);\n background: rgba(0, 0, 0, 0.5);\n backdrop-filter: blur(2px);\n animation: strct-modal-fade 0.12s ease;\n }\n @media (max-width: 768px) {\n .strct-modal__overlay {\n padding: var(--space-3);\n }\n }\n .strct-modal__dialog {\n width: 100%;\n max-height: calc(100vh - 48px);\n display: flex;\n flex-direction: column;\n background: var(--bg-1);\n border: 1px solid var(--b2);\n border-radius: var(--radius-xl);\n box-shadow: var(--shadow-elevated);\n overflow: hidden;\n animation: strct-modal-rise 0.14s ease;\n }\n /* Fixed width scale — the only widths a modal can take. */\n .strct-modal__dialog--sm {\n max-width: min(480px, calc(100vw - 32px));\n }\n .strct-modal__dialog--md {\n max-width: min(640px, calc(100vw - 32px));\n }\n .strct-modal__dialog--lg {\n max-width: min(860px, calc(100vw - 32px));\n }\n .strct-modal__dialog--xl {\n max-width: min(1080px, calc(100vw - 32px));\n }\n .strct-modal__head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-3);\n padding: var(--space-3) var(--space-4);\n border-bottom: 1px solid var(--b1);\n }\n /* Drag handle: empty header space repositions the dialog. */\n .strct-modal__head--drag {\n cursor: move;\n user-select: none;\n touch-action: none;\n }\n\n /* Frosted-glass preset — theme-aware (derives from the surface tokens). */\n .strct-modal__overlay--glass {\n background: rgba(0, 0, 0, 0.38);\n backdrop-filter: blur(10px) saturate(1.25);\n }\n .strct-modal__dialog--glass {\n background: color-mix(in srgb, var(--bg-1) 72%, transparent);\n backdrop-filter: blur(24px) saturate(1.4);\n }\n .strct-modal__dialog--glass .strct-modal__foot {\n background: color-mix(in srgb, var(--bg-2) 55%, transparent);\n }\n .strct-modal__title {\n font-size: 14px;\n font-weight: 600;\n color: var(--t1);\n }\n .strct-modal__close {\n display: inline-flex;\n padding: 4px;\n border: 0;\n border-radius: 5px;\n background: transparent;\n color: var(--t3);\n cursor: pointer;\n }\n .strct-modal__close:hover {\n color: var(--t1);\n background: var(--bg-3);\n }\n .strct-modal__body {\n padding: var(--space-4);\n overflow-y: auto;\n color: var(--t2);\n font-size: 13px;\n }\n .strct-modal__foot {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--space-2);\n padding: var(--space-3) var(--space-4);\n border-top: 1px solid var(--b1);\n background: var(--bg-2);\n }\n @keyframes strct-modal-fade {\n from {\n opacity: 0;\n }\n }\n @keyframes strct-modal-rise {\n from {\n opacity: 0;\n transform: translateY(8px) scale(0.98);\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n .strct-modal__overlay,\n .strct-modal__dialog {\n animation: none;\n }\n }\n `,\n ],\n})\nexport class StrctModal {\n private readonly elementRef = inject(ElementRef<HTMLElement>);\n private readonly doc = inject(DOCUMENT);\n\n /** Whether the panel is open (two-way). */\n readonly open = model(false);\n /** Dialog title. */\n readonly title = input('');\n /** Size variant (fixed scale; defaults to `sm` = 480px). */\n readonly size = input<StrctModalSize>('sm');\n /** Hide the footer slot. */\n readonly hideFooter = input(false, { transform: booleanAttribute });\n /** Accessible label of the X close button (localizable). */\n readonly closeLabel = input('Close');\n /**\n * Allow closing via a backdrop click / the Escape key. **Off by default** —\n * a modal closes only through its X button or an explicit action button, so a\n * stray click outside (or Escape) never discards in-progress work. Set\n * `dismissible` for lightweight, transient dialogs where quick dismissal is fine.\n */\n readonly dismissible = input(false, { transform: booleanAttribute });\n /** Allow repositioning the dialog by dragging its header (mouse + touch). */\n readonly draggable = input(false, { transform: booleanAttribute });\n /** Extra class(es) added to the dialog panel — style it from app-global CSS. */\n readonly panelClass = input('');\n /** Extra class(es) added to the backdrop / overlay. */\n readonly backdropClass = input('');\n /** Built-in look: `glass` is a theme-aware frosted preset (translucent panel + blurred backdrop). */\n readonly variant = input<'solid' | 'glass'>('solid');\n /** Emitted when the alert is dismissed. */\n readonly closed = output<void>();\n\n protected readonly titleId = `strct-modal-${++modalCounter}`;\n /** Element that had focus before the dialog opened, restored on close. */\n private previousActive: HTMLElement | null = null;\n /** Whether this instance currently holds a scroll lock. */\n private locked = false;\n\n constructor() {\n effect(() => {\n const open = this.open();\n if (open && !this.locked) {\n this.locked = true;\n // Position is per-open: every open starts centered again.\n this.dragOffset.set({ x: 0, y: 0 });\n this.dragStart = null;\n lockBodyScroll(this.doc);\n this.previousActive = this.doc.activeElement as HTMLElement | null;\n // Move focus into the dialog once it has rendered.\n setTimeout(() => this.focusInitial());\n } else if (!open && this.locked) {\n this.locked = false;\n unlockBodyScroll(this.doc);\n if (this.previousActive) {\n this.previousActive.focus?.();\n this.previousActive = null;\n }\n }\n });\n\n // Release the lock if the modal is destroyed while still open.\n inject(DestroyRef).onDestroy(() => {\n if (this.locked) {\n this.locked = false;\n unlockBodyScroll(this.doc);\n }\n });\n }\n\n close(): void {\n this.open.set(false);\n this.closed.emit();\n }\n\n protected onBackdrop(event?: Event): void {\n // Only act on interactions that originated on the overlay itself — a real\n // backdrop click, or Enter/Space while the backdrop is focused. Ignore events\n // that bubbled up from a child (e.g. a space typed in an input/textarea).\n if (event && event.target !== event.currentTarget) return;\n if (this.dismissible()) this.close();\n }\n\n protected onEscape(): void {\n if (this.open() && this.dismissible()) this.close();\n }\n\n /** Wrap Tab focus within the dialog. */\n protected onTab(event: Event): void {\n const e = event as KeyboardEvent;\n const items = this.focusable();\n if (!items.length) {\n e.preventDefault();\n return;\n }\n const first = items[0];\n const last = items[items.length - 1];\n const active = this.doc.activeElement;\n if (e.shiftKey && (active === first || !this.dialog()?.contains(active))) {\n e.preventDefault();\n last.focus();\n } else if (!e.shiftKey && active === last) {\n e.preventDefault();\n first.focus();\n }\n }\n\n // ── Drag-to-reposition (opt-in via `draggable`) ─────\n /** Dialog translation from its centered position; reset on every open. */\n private readonly dragOffset = signal({ x: 0, y: 0 });\n /** Pointer + clamp bounds captured at drag start; null while not dragging. */\n private dragStart: {\n px: number;\n py: number;\n ox: number;\n oy: number;\n minX: number;\n maxX: number;\n minY: number;\n maxY: number;\n } | null = null;\n\n protected readonly dragTransform = computed(() => {\n const { x, y } = this.dragOffset();\n return x || y ? `translate(${x}px, ${y}px)` : null;\n });\n\n protected onHeadPointerDown(event: PointerEvent): void {\n if (!this.draggable()) return;\n // Only empty header space starts a drag — never the close button or other controls.\n if ((event.target as HTMLElement).closest('button, a, input, select, textarea')) return;\n const dialog = this.dialog();\n const view = this.doc.defaultView;\n if (!dialog || !view) return;\n const rect = dialog.getBoundingClientRect();\n const o = this.dragOffset();\n const pad = 8;\n this.dragStart = {\n px: event.clientX,\n py: event.clientY,\n ox: o.x,\n oy: o.y,\n // Allowed offset range keeping the dialog inside the viewport (pad margin).\n minX: o.x + pad - rect.left,\n maxX: o.x + view.innerWidth - pad - rect.right,\n minY: o.y + pad - rect.top,\n maxY: o.y + view.innerHeight - pad - rect.bottom,\n };\n (event.currentTarget as HTMLElement).setPointerCapture?.(event.pointerId);\n event.preventDefault();\n }\n\n protected onHeadPointerMove(event: PointerEvent): void {\n const s = this.dragStart;\n if (!s) return;\n // A dialog larger than the viewport pins to the axis midpoint instead.\n const clamp = (v: number, lo: number, hi: number) =>\n lo > hi ? (lo + hi) / 2 : Math.min(hi, Math.max(lo, v));\n this.dragOffset.set({\n x: clamp(s.ox + event.clientX - s.px, s.minX, s.maxX),\n y: clamp(s.oy + event.clientY - s.py, s.minY, s.maxY),\n });\n }\n\n protected onHeadPointerEnd(): void {\n this.dragStart = null;\n }\n\n private dialog(): HTMLElement | null {\n return this.elementRef.nativeElement.querySelector('.strct-modal__dialog');\n }\n\n private focusable(): HTMLElement[] {\n const dialog = this.dialog();\n if (!dialog) return [];\n return Array.from(\n dialog.querySelectorAll<HTMLElement>(\n 'a[href],button:not([disabled]),input:not([disabled]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex=\"-1\"])',\n ),\n ).filter((el) => el.offsetParent !== null || el === this.doc.activeElement);\n }\n\n private focusInitial(): void {\n const items = this.focusable();\n (items[0] ?? this.dialog())?.focus();\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n Directive,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n contentChild,\n input,\n model,\n} from '@angular/core';\nimport { StrctIcon } from '../icon/icon';\n\n/** Marks the drawer's footer action area: `<ng-container strctDrawerFooter>…`. */\n@Directive({ selector: '[strctDrawerFooter]' })\nexport class StrctDrawerFooter {}\n\n/** Which edge the drawer slides in from. */\nexport type StrctDrawerSide = 'start' | 'end' | 'top' | 'bottom';\n/** Drawer extent along its sliding axis. */\nexport type StrctDrawerSize = 'sm' | 'md' | 'lg';\n\n/**\n * Slide-out overlay panel anchored to an edge of the viewport — for inspecting\n * or editing a record without losing the underlying table's scroll/selection.\n *\n * <strct-drawer [(open)]=\"editing\" side=\"end\" title=\"Virtual machine\">\n * … body …\n * <ng-container strctDrawerFooter>\n * <button strct-button (click)=\"editing.set(false)\">Cancel</button>\n * </ng-container>\n * </strct-drawer>\n */\n@Component({\n selector: 'strct-drawer',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon],\n template: `\n @if (open()) {\n <div\n class=\"strct-drawer__backdrop\"\n [class.strct-drawer__backdrop--bare]=\"!dismissable()\"\n (click)=\"onBackdrop()\"\n (keydown.escape)=\"onEscape()\"\n tabindex=\"-1\"\n ></div>\n <aside\n class=\"strct-drawer strct-drawer--{{ side() }} strct-drawer--{{ size() }}\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-label]=\"title() || 'Panel'\"\n >\n @if (title() || dismissable()) {\n <header class=\"strct-drawer__head\">\n <span class=\"strct-drawer__title\">{{ title() }}</span>\n @if (dismissable()) {\n <button\n type=\"button\"\n class=\"strct-drawer__close\"\n aria-label=\"Close\"\n (click)=\"close()\"\n >\n <strct-icon name=\"close\" [size]=\"15\" />\n </button>\n }\n </header>\n }\n <div class=\"strct-drawer__body\"><ng-content /></div>\n @if (hasFooter()) {\n <footer class=\"strct-drawer__foot\"><ng-content select=\"[strctDrawerFooter]\" /></footer>\n }\n </aside>\n }\n `,\n host: { class: 'strct-drawer-host' },\n styles: [\n `\n .strct-drawer__backdrop {\n position: fixed;\n inset: 0;\n z-index: 1100;\n background: rgba(0, 0, 0, 0.44);\n backdrop-filter: blur(1px);\n animation: strct-drawer-fade 0.16s ease;\n }\n .strct-drawer__backdrop--bare {\n background: transparent;\n backdrop-filter: none;\n }\n .strct-drawer {\n position: fixed;\n z-index: 1101;\n display: flex;\n flex-direction: column;\n background: var(--bg-1);\n box-shadow: var(--shh);\n }\n /* Horizontal drawers (start/end) take full height; vertical take full width. */\n .strct-drawer--start,\n .strct-drawer--end {\n top: 0;\n bottom: 0;\n border-radius: 0;\n }\n .strct-drawer--start {\n inset-inline-start: 0;\n border-inline-end: 1px solid var(--b2);\n animation: strct-drawer-in-start 0.18s ease;\n }\n .strct-drawer--end {\n inset-inline-end: 0;\n border-inline-start: 1px solid var(--b2);\n animation: strct-drawer-in-end 0.18s ease;\n }\n /* RTL: start anchors right, so the slide-in mirrors. */\n [dir='rtl'] .strct-drawer--start {\n animation-name: strct-drawer-in-end;\n }\n [dir='rtl'] .strct-drawer--end {\n animation-name: strct-drawer-in-start;\n }\n .strct-drawer--top,\n .strct-drawer--bottom {\n left: 0;\n right: 0;\n }\n .strct-drawer--top {\n top: 0;\n border-bottom: 1px solid var(--b2);\n animation: strct-drawer-in-top 0.18s ease;\n }\n .strct-drawer--bottom {\n bottom: 0;\n border-top: 1px solid var(--b2);\n animation: strct-drawer-in-bottom 0.18s ease;\n }\n /* Size along the sliding axis. */\n .strct-drawer--start.strct-drawer--sm,\n .strct-drawer--end.strct-drawer--sm {\n width: 300px;\n }\n .strct-drawer--start.strct-drawer--md,\n .strct-drawer--end.strct-drawer--md {\n width: 420px;\n }\n .strct-drawer--start.strct-drawer--lg,\n .strct-drawer--end.strct-drawer--lg {\n width: 600px;\n }\n .strct-drawer--top.strct-drawer--sm,\n .strct-drawer--bottom.strct-drawer--sm {\n height: 220px;\n }\n .strct-drawer--top.strct-drawer--md,\n .strct-drawer--bottom.strct-drawer--md {\n height: 340px;\n }\n .strct-drawer--top.strct-drawer--lg,\n .strct-drawer--bottom.strct-drawer--lg {\n height: 480px;\n }\n .strct-drawer {\n max-width: 100vw;\n max-height: 100vh;\n }\n .strct-drawer__head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 14px 18px;\n border-bottom: 1px solid var(--b1);\n flex-shrink: 0;\n }\n .strct-drawer__title {\n font-size: 15px;\n font-weight: 600;\n color: var(--t1);\n }\n .strct-drawer__close {\n display: inline-flex;\n padding: 4px;\n border: 0;\n border-radius: 5px;\n background: transparent;\n color: var(--t3);\n cursor: pointer;\n transition:\n color 0.14s ease,\n background 0.14s ease;\n }\n .strct-drawer__close:hover {\n color: var(--t1);\n background: var(--bg-3);\n }\n .strct-drawer__body {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n padding: 16px 18px;\n font-size: 13px;\n color: var(--t1);\n }\n .strct-drawer__foot {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 8px;\n padding: 12px 18px;\n border-top: 1px solid var(--b1);\n flex-shrink: 0;\n }\n @keyframes strct-drawer-fade {\n from {\n opacity: 0;\n }\n }\n @keyframes strct-drawer-in-start {\n from {\n transform: translateX(-100%);\n }\n }\n @keyframes strct-drawer-in-end {\n from {\n transform: translateX(100%);\n }\n }\n @keyframes strct-drawer-in-top {\n from {\n transform: translateY(-100%);\n }\n }\n @keyframes strct-drawer-in-bottom {\n from {\n transform: translateY(100%);\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n .strct-drawer__backdrop,\n .strct-drawer {\n animation: none;\n }\n }\n `,\n ],\n})\nexport class StrctDrawer {\n /** Open state (two-way). */\n readonly open = model(false);\n /** Edge to anchor to. Defaults to `end` (right in LTR). */\n readonly side = input<StrctDrawerSide>('end');\n /** Extent along the sliding axis. */\n readonly size = input<StrctDrawerSize>('md');\n /** Header title. */\n readonly title = input('');\n /** Show the close button and allow backdrop/Esc dismissal. */\n readonly dismissable = input(true, { transform: booleanAttribute });\n\n protected readonly footerDef = contentChild(StrctDrawerFooter);\n protected readonly hasFooter = computed(() => !!this.footerDef());\n\n protected onBackdrop(): void {\n if (this.dismissable()) this.close();\n }\n protected onEscape(): void {\n if (this.dismissable()) this.close();\n }\n close(): void {\n this.open.set(false);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n ElementRef,\n HostListener,\n booleanAttribute,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { StrctOverlay } from '../overlay/overlay';\n\n/**\n * Click-to-open menu:\n * <strct-dropdown align=\"end\">\n * <button strct-button strctDropdownTrigger>Actions</button>\n * <strct-dropdown-item>Rename</strct-dropdown-item>\n * <strct-dropdown-item critical>Delete</strct-dropdown-item>\n * </strct-dropdown>\n */\n@Component({\n selector: 'strct-dropdown',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctOverlay],\n template: `\n <div\n #trigger\n class=\"strct-dd__trigger\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"toggle()\"\n (keydown.enter)=\"toggle()\"\n (keydown.space)=\"toggle()\"\n >\n <ng-content select=\"[strctDropdownTrigger]\" />\n </div>\n @if (open()) {\n <div\n class=\"strct-dd__menu\"\n [strctOverlay]=\"trigger\"\n [strctOverlayPlacement]=\"align() === 'end' ? 'bottom-end' : 'bottom-start'\"\n role=\"menu\"\n tabindex=\"0\"\n (click)=\"close()\"\n (keydown.enter)=\"close()\"\n (keydown.space)=\"close()\"\n >\n <ng-content />\n </div>\n }\n `,\n host: { class: 'strct-dd' },\n styles: [\n `\n .strct-dd {\n position: relative;\n display: inline-block;\n }\n .strct-dd__trigger {\n display: inline-flex;\n }\n .strct-dd__menu {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n z-index: 200;\n min-width: 170px;\n max-width: calc(100vw - 24px);\n padding: 4px;\n background: var(--bg-1);\n border: 1px solid var(--b2);\n border-radius: 7px;\n box-shadow: var(--shh);\n animation: strct-dd-in 0.1s ease;\n }\n .strct-dd__menu--end {\n left: auto;\n right: 0;\n }\n @keyframes strct-dd-in {\n from {\n opacity: 0;\n transform: translateY(-4px);\n }\n }\n `,\n ],\n})\nexport class StrctDropdown {\n private readonly host = inject(ElementRef<HTMLElement>);\n /** Horizontal alignment of the menu. */\n readonly align = input<'start' | 'end'>('start');\n readonly open = signal(false);\n\n toggle(): void {\n this.open.update((v) => !v);\n }\n\n close(): void {\n this.open.set(false);\n }\n\n @HostListener('document:click', ['$event'])\n protected onDocClick(event: MouseEvent): void {\n if (this.open() && !this.host.nativeElement.contains(event.target as Node)) {\n this.close();\n }\n }\n\n @HostListener('document:keydown.escape')\n protected onEscape(): void {\n this.close();\n }\n}\n\n/** A selectable row inside a `<strct-dropdown>`. */\n@Component({\n selector: 'strct-dropdown-item',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `<ng-content />`,\n host: {\n class: 'strct-dd__item',\n role: 'menuitem',\n '[class.strct-dd__item--critical]': 'critical()',\n '[attr.aria-disabled]': 'disabled() || null',\n },\n styles: [\n `\n .strct-dd__item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 7px 10px;\n border-radius: 5px;\n cursor: pointer;\n font-size: 13px;\n color: var(--t1);\n }\n .strct-dd__item:hover {\n background: var(--bg-3);\n }\n .strct-dd__item--critical {\n color: var(--critical);\n }\n .strct-dd__item--critical:hover {\n background: var(--critical-bg);\n }\n .strct-dd__item[aria-disabled='true'] {\n color: var(--t4);\n pointer-events: none;\n }\n `,\n ],\n})\nexport class StrctDropdownItem {\n /** Danger. */\n readonly critical = input(false, { transform: booleanAttribute });\n /** Static disable flag. */\n readonly disabled = input(false, { transform: booleanAttribute });\n}\n\n/** Thin separator between groups of menu items. */\n@Component({\n selector: 'strct-dropdown-divider',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: '',\n host: { class: 'strct-dd__divider', role: 'separator' },\n styles: [\n `\n .strct-dd__divider {\n display: block;\n height: 1px;\n margin: 4px 6px;\n background: var(--b2);\n }\n `,\n ],\n})\nexport class StrctDropdownDivider {}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n HostListener,\n signal,\n} from '@angular/core';\n\n/**\n * Right-click (context) menu. Wraps a trigger area and shows a menu at the\n * cursor. Reuse `strct-dropdown-item` for the entries:\n * <strct-context-menu>\n * <div>Right-click here</div>\n * <ng-container strctContextMenuItems>\n * <strct-dropdown-item>Open</strct-dropdown-item>\n * <strct-dropdown-item critical>Delete</strct-dropdown-item>\n * </ng-container>\n * </strct-context-menu>\n */\n@Component({\n selector: 'strct-context-menu',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n <div class=\"strct-ctx__trigger\" (contextmenu)=\"onContextMenu($event)\">\n <ng-content />\n </div>\n @if (open()) {\n <div\n class=\"strct-ctx__menu\"\n role=\"menu\"\n tabindex=\"0\"\n [style.left.px]=\"x()\"\n [style.top.px]=\"y()\"\n (click)=\"close()\"\n (contextmenu)=\"$event.preventDefault(); close()\"\n (keydown.enter)=\"close()\"\n (keydown.space)=\"close()\"\n >\n <ng-content select=\"[strctContextMenuItems]\" />\n </div>\n }\n `,\n host: { class: 'strct-ctx' },\n styles: [\n `\n .strct-ctx {\n display: block;\n }\n .strct-ctx__menu {\n position: fixed;\n z-index: 1100;\n min-width: 180px;\n padding: 4px;\n background: var(--bg-1);\n border: 1px solid var(--b2);\n border-radius: 7px;\n box-shadow: var(--shh);\n animation: strct-ctx-in 0.1s ease;\n }\n @keyframes strct-ctx-in {\n from {\n opacity: 0;\n transform: scale(0.97);\n }\n }\n `,\n ],\n})\nexport class StrctContextMenu {\n readonly open = signal(false);\n readonly x = signal(0);\n readonly y = signal(0);\n\n /** Approximate menu box used to keep it inside the viewport. */\n private static readonly MENU_W = 190;\n private static readonly MENU_H = 240;\n\n onContextMenu(event: MouseEvent): void {\n event.preventDefault();\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n this.x.set(Math.min(event.clientX, vw - StrctContextMenu.MENU_W));\n this.y.set(Math.min(event.clientY, vh - StrctContextMenu.MENU_H));\n this.open.set(true);\n }\n\n close(): void {\n this.open.set(false);\n }\n\n @HostListener('document:click')\n protected onDocClick(): void {\n if (this.open()) this.close();\n }\n\n @HostListener('document:keydown.escape')\n protected onEscape(): void {\n this.close();\n }\n\n @HostListener('window:resize')\n protected onResize(): void {\n this.close();\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { StrctIcon } from '../icon/icon';\n\n/**\n * A nested fly-out inside a `strct-context-menu` or `strct-dropdown`. Opens on\n * hover, click/tap, or the keyboard (Enter / Space / →), and flips to the left\n * near the right edge of the viewport. Reuse `strct-dropdown-item` for entries.\n * <strct-submenu label=\"Power\">\n * <strct-dropdown-item>Power on</strct-dropdown-item>\n * <strct-dropdown-item>Power off</strct-dropdown-item>\n * </strct-submenu>\n */\n@Component({\n selector: 'strct-submenu',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon],\n template: `\n <div class=\"strct-submenu\" (mouseenter)=\"setOpen(true)\" (mouseleave)=\"open.set(false)\">\n <div\n class=\"strct-submenu__trigger\"\n role=\"menuitem\"\n tabindex=\"0\"\n aria-haspopup=\"menu\"\n [attr.aria-expanded]=\"open()\"\n (click)=\"$event.stopPropagation(); setOpen(!open())\"\n (keydown.enter)=\"$event.preventDefault(); $event.stopPropagation(); setOpen(true)\"\n (keydown.space)=\"$event.preventDefault(); $event.stopPropagation(); setOpen(true)\"\n (keydown.arrowright)=\"$event.preventDefault(); $event.stopPropagation(); setOpen(true)\"\n (keydown.arrowleft)=\"$event.stopPropagation(); open.set(false)\"\n (keydown.escape)=\"$event.stopPropagation(); open.set(false)\"\n >\n @if (icon()) {\n <strct-icon class=\"strct-submenu__icon\" [name]=\"icon()\" [size]=\"16\" [strokeWidth]=\"1.3\" />\n } @else {\n <span class=\"strct-submenu__icon-spacer\" aria-hidden=\"true\"></span>\n }\n <span class=\"strct-submenu__label\"\n >{{ label() }}<ng-content select=\"[strctSubmenuLabel]\"\n /></span>\n <strct-icon\n class=\"strct-submenu__arrow\"\n name=\"chevronRight\"\n [size]=\"12\"\n [strokeWidth]=\"1.6\"\n />\n </div>\n @if (open()) {\n <div class=\"strct-submenu__panel\" [class.strct-submenu__panel--flip]=\"flip()\" role=\"menu\">\n <ng-content />\n </div>\n }\n </div>\n `,\n host: { class: 'strct-submenu-host' },\n styles: [\n `\n .strct-submenu {\n position: relative;\n }\n .strct-submenu__trigger {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 7px 8px 7px 10px;\n border-radius: 5px;\n cursor: default;\n font-size: 13px;\n color: var(--t1);\n }\n .strct-submenu__trigger:hover {\n background: var(--bg-3);\n }\n .strct-submenu__trigger:focus-visible {\n outline: none;\n background: var(--bg-3);\n }\n .strct-submenu__icon {\n color: var(--t2);\n flex-shrink: 0;\n }\n .strct-submenu__icon-spacer {\n width: 14px;\n flex-shrink: 0;\n }\n .strct-submenu__label {\n flex: 1;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n }\n .strct-submenu__arrow {\n color: var(--t3);\n }\n .strct-submenu__panel {\n position: absolute;\n top: -5px;\n left: 100%;\n z-index: 1;\n min-width: 170px;\n margin-inline-start: 2px;\n padding: 4px;\n background: var(--bg-1);\n border: 1px solid var(--b2);\n border-radius: 7px;\n box-shadow: var(--shh);\n animation: strct-submenu-in 0.1s ease;\n }\n .strct-submenu__panel--flip {\n left: auto;\n right: 100%;\n margin-inline-start: 0;\n margin-inline-end: 2px;\n }\n @keyframes strct-submenu-in {\n from {\n opacity: 0;\n transform: translateX(-4px);\n }\n }\n `,\n ],\n})\nexport class StrctSubmenu {\n private readonly host: ElementRef<HTMLElement> = inject(ElementRef);\n\n /** Label text. */\n readonly label = input('');\n /** Optional leading icon; when omitted the icon column is still reserved so\n * the label stays aligned with sibling items that do have icons. */\n readonly icon = input('');\n readonly open = signal(false);\n /** Open to the left when the fly-out would overflow the right edge. */\n protected readonly flip = signal(false);\n\n protected setOpen(value: boolean): void {\n if (value) {\n const rect = this.host.nativeElement.getBoundingClientRect();\n this.flip.set(rect.right + 190 > window.innerWidth);\n }\n this.open.set(value);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n contentChildren,\n effect,\n input,\n model,\n output,\n signal,\n} from '@angular/core';\nimport { StrctButton } from '../button/button';\n\n/** A single wizard step. `label` names it in the step header. */\n@Component({\n selector: 'strct-step',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `@if (active()) {\n <ng-content />\n }`,\n host: { class: 'strct-step', '[hidden]': '!active()' },\n})\nexport class StrctStep {\n /** Label text. */\n readonly label = input.required<string>();\n /** When false, the wizard's Next / Finish is disabled on this step. */\n readonly canAdvance = input(true, { transform: booleanAttribute });\n private readonly _active = signal(false);\n readonly active = this._active.asReadonly();\n\n /** @internal */\n setActive(value: boolean): void {\n this._active.set(value);\n }\n}\n\n/** Multi-step flow with a numbered header and Back / Next / Finish controls. */\n@Component({\n selector: 'strct-wizard',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctButton],\n template: `\n <div class=\"strct-wiz__steps\">\n @for (step of steps(); track step; let i = $index; let last = $last) {\n <div\n class=\"strct-wiz__step\"\n [class.strct-wiz__step--active]=\"i === current()\"\n [class.strct-wiz__step--done]=\"i < current()\"\n >\n <span class=\"strct-wiz__dot\">{{ i + 1 }}</span>\n <span class=\"strct-wiz__label\">{{ step.label() }}</span>\n </div>\n @if (!last) {\n <span class=\"strct-wiz__sep\"></span>\n }\n }\n </div>\n\n <div class=\"strct-wiz__content\"><ng-content /></div>\n\n <div class=\"strct-wiz__foot\">\n @if (cancelable()) {\n <button strct-button variant=\"flat\" class=\"strct-wiz__cancel\" (click)=\"cancelled.emit()\">\n Cancel\n </button>\n }\n <button strct-button variant=\"flat\" [disabled]=\"current() === 0\" (click)=\"back()\">\n {{ backLabel() }}\n </button>\n @if (isLast()) {\n <button\n strct-button\n variant=\"primary\"\n [disabled]=\"submitting() || !canAdvance()\"\n (click)=\"finish()\"\n >\n {{ submitting() ? 'Submitting…' : finishLabel() }}\n </button>\n } @else {\n <button strct-button variant=\"primary\" [disabled]=\"!canAdvance()\" (click)=\"next()\">\n {{ nextLabel() }}\n </button>\n }\n </div>\n `,\n host: { class: 'strct-wiz' },\n styles: [\n `\n .strct-wiz {\n display: block;\n }\n .strct-wiz__steps {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n .strct-wiz__step {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n .strct-wiz__dot {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n border-radius: 50%;\n font-size: 12px;\n font-weight: 600;\n color: var(--t2);\n background: var(--bg-3);\n border: 1px solid var(--b2);\n }\n .strct-wiz__label {\n font-size: 12px;\n color: var(--t2);\n }\n .strct-wiz__step--active .strct-wiz__dot {\n background: var(--acc-m);\n color: var(--acc);\n border-color: var(--acc);\n }\n .strct-wiz__step--active .strct-wiz__label {\n color: var(--t1);\n font-weight: 600;\n }\n .strct-wiz__step--done .strct-wiz__dot {\n background: var(--acc-m);\n color: var(--acc);\n border-color: var(--acc30);\n }\n .strct-wiz__sep {\n flex: 1;\n height: 1px;\n background: var(--b2);\n min-width: 18px;\n }\n .strct-wiz__content {\n margin: 18px 0;\n padding: 16px;\n min-height: 80px;\n background: var(--bg-1);\n border: 1px solid var(--b2);\n border-radius: 8px;\n color: var(--t2);\n font-size: 13px;\n }\n .strct-wiz__foot {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n }\n .strct-wiz__cancel {\n margin-inline-end: auto;\n }\n `,\n ],\n})\nexport class StrctWizard {\n readonly steps = contentChildren(StrctStep);\n readonly current = model(0);\n /** Label for the final-step button (default \"Finish\"). */\n readonly finishLabel = input('Finish');\n /** Labels for the Back / Next buttons (localizable). */\n readonly backLabel = input('Back');\n readonly nextLabel = input('Next');\n /** Disable Finish and show a busy label while an async submit is in flight. */\n readonly submitting = input(false, { transform: booleanAttribute });\n /** Show a Cancel button on the left. */\n readonly cancelable = input(false, { transform: booleanAttribute });\n /** Emitted when the user clicks Finish. */\n readonly finished = output<void>();\n /** Emitted when the user clicks Cancel. */\n readonly cancelled = output<void>();\n /** Emits the new step index after a Back / Next move. */\n readonly stepChange = output<number>();\n\n protected readonly isLast = computed(() => this.current() >= this.steps().length - 1);\n /** Whether the current step permits advancing (its `canAdvance`). */\n protected readonly canAdvance = computed(\n () => this.steps()[this.current()]?.canAdvance() ?? true,\n );\n\n constructor() {\n effect(() => {\n const idx = this.current();\n this.steps().forEach((step, i) => step.setActive(i === idx));\n });\n }\n\n next(): void {\n if (!this.isLast() && this.canAdvance()) {\n this.current.update((i) => i + 1);\n this.stepChange.emit(this.current());\n }\n }\n\n back(): void {\n if (this.current() > 0) {\n this.current.update((i) => i - 1);\n this.stepChange.emit(this.current());\n }\n }\n\n finish(): void {\n if (this.canAdvance() && !this.submitting()) this.finished.emit();\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n input,\n} from '@angular/core';\n\n/**\n * Separator rule. Horizontal by default; pass `vertical` for an inline rule.\n * Projected content becomes a centered label on a horizontal divider.\n * <strct-divider>OR</strct-divider>\n * <strct-divider vertical />\n */\n@Component({\n selector: 'strct-divider',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `<span class=\"strct-divider__label\"><ng-content /></span>`,\n host: {\n class: 'strct-divider',\n role: 'separator',\n '[class.strct-divider--vertical]': 'vertical()',\n '[attr.aria-orientation]': \"vertical() ? 'vertical' : 'horizontal'\",\n },\n styles: [\n `\n .strct-divider {\n display: flex;\n align-items: center;\n gap: 12px;\n width: 100%;\n color: var(--t3);\n font-size: 12px;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n .strct-divider::before,\n .strct-divider::after {\n content: '';\n flex: 1;\n height: 1px;\n background: var(--b2);\n }\n .strct-divider__label:empty {\n display: none;\n }\n .strct-divider:has(.strct-divider__label:empty) {\n gap: 0;\n }\n\n .strct-divider--vertical {\n display: inline-block;\n width: 1px;\n min-height: 1em;\n height: auto;\n align-self: stretch;\n background: var(--b2);\n margin: 0 2px;\n }\n .strct-divider--vertical::before,\n .strct-divider--vertical::after {\n content: none;\n }\n .strct-divider--vertical .strct-divider__label {\n display: none;\n }\n `,\n ],\n})\nexport class StrctDivider {\n /** Render as a vertical rule. */\n readonly vertical = input(false, { transform: booleanAttribute });\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n input,\n} from '@angular/core';\n\n/** Breadcrumb trail container. Wraps `<strct-breadcrumb-item>` children. */\n@Component({\n selector: 'strct-breadcrumb',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `<ng-content />`,\n host: { class: 'strct-bc', role: 'navigation', 'aria-label': 'Breadcrumb' },\n styles: [\n `\n .strct-bc {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 2px;\n font-size: 13px;\n }\n .strct-bc__item:not(:last-child)::after {\n content: '/';\n margin: 0 8px;\n color: var(--t3);\n font-weight: 400;\n }\n `,\n ],\n})\nexport class StrctBreadcrumb {}\n\n/** One crumb. Mark the final one `current`. */\n@Component({\n selector: 'strct-breadcrumb-item',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `<ng-content />`,\n host: {\n class: 'strct-bc__item',\n '[class.strct-bc__item--current]': 'current()',\n '[attr.aria-current]': \"current() ? 'page' : null\",\n },\n styles: [\n `\n .strct-bc__item {\n display: inline-flex;\n align-items: center;\n color: var(--t2);\n }\n .strct-bc__item a {\n color: var(--t2);\n text-decoration: none;\n }\n .strct-bc__item a:hover {\n color: var(--acc);\n text-decoration: none;\n }\n .strct-bc__item--current {\n color: var(--t1);\n font-weight: 600;\n }\n `,\n ],\n})\nexport class StrctBreadcrumbItem {\n /** Mark as the current page. */\n readonly current = input(false, { transform: booleanAttribute });\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n input,\n model,\n} from '@angular/core';\nimport { StrctIcon } from '../icon/icon';\n\ntype PageToken = number | 'dots';\n\n/**\n * Page navigator with first/last + a windowed range and ellipsis gaps.\n * <strct-pagination [total]=\"240\" [pageSize]=\"20\" [(page)]=\"page\" />\n */\n@Component({\n selector: 'strct-pagination',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon],\n template: `\n <button\n type=\"button\"\n class=\"strct-pg__btn strct-pg__nav\"\n [disabled]=\"page() <= 1\"\n [attr.aria-label]=\"prevLabel()\"\n (click)=\"go(page() - 1)\"\n >\n <strct-icon name=\"chevronLeft\" [size]=\"13\" [strokeWidth]=\"1.7\" />\n </button>\n\n @for (token of pages(); track $index) {\n @if (token === 'dots') {\n <span class=\"strct-pg__dots\"><strct-icon name=\"ellipsis\" [size]=\"14\" /></span>\n } @else {\n <button\n type=\"button\"\n class=\"strct-pg__btn\"\n [class.strct-pg__btn--active]=\"token === page()\"\n [attr.aria-current]=\"token === page() ? 'page' : null\"\n (click)=\"go(token)\"\n >\n {{ token }}\n </button>\n }\n }\n\n <button\n type=\"button\"\n class=\"strct-pg__btn strct-pg__nav\"\n [disabled]=\"page() >= pageCount()\"\n [attr.aria-label]=\"nextLabel()\"\n (click)=\"go(page() + 1)\"\n >\n <strct-icon name=\"chevronRight\" [size]=\"13\" [strokeWidth]=\"1.7\" />\n </button>\n `,\n host: { class: 'strct-pg', role: 'navigation', '[attr.aria-label]': 'regionLabel()' },\n styles: [\n `\n .strct-pg {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n color: var(--t2);\n }\n .strct-pg__btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 30px;\n height: 30px;\n padding: 0 7px;\n border-radius: 6px;\n font-family: var(--font);\n font-size: 12px;\n cursor: pointer;\n color: var(--t2);\n background: transparent;\n border: 1px solid transparent;\n transition:\n background 0.14s ease,\n border-color 0.14s ease,\n color 0.14s ease;\n }\n .strct-pg__btn:hover {\n background: var(--bg-3);\n }\n .strct-pg__btn--active {\n color: var(--acc);\n border-color: var(--acc30);\n background: var(--acc-m);\n }\n .strct-pg__btn:disabled {\n color: var(--t4);\n cursor: not-allowed;\n background: transparent;\n }\n .strct-pg__nav {\n color: var(--t2);\n }\n .strct-pg__dots {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 24px;\n height: 30px;\n color: var(--t3);\n }\n `,\n ],\n})\nexport class StrctPagination {\n /** Accessible labels (localizable). */\n readonly prevLabel = input('Previous page');\n readonly nextLabel = input('Next page');\n readonly regionLabel = input('Pagination');\n\n /** Total number of items. */\n readonly total = input.required<number>();\n /** Rows per page (0 disables paging). */\n readonly pageSize = input(10);\n /** Current page (two-way). */\n readonly page = model(1);\n\n readonly pageCount = computed(() =>\n Math.max(1, Math.ceil(this.total() / Math.max(1, this.pageSize()))),\n );\n\n protected readonly pages = computed<PageToken[]>(() => {\n const count = this.pageCount();\n const current = this.page();\n if (count <= 7) {\n return Array.from({ length: count }, (_, i) => i + 1);\n }\n const tokens: PageToken[] = [1];\n const start = Math.max(2, current - 1);\n const end = Math.min(count - 1, current + 1);\n if (start > 2) tokens.push('dots');\n for (let p = start; p <= end; p++) tokens.push(p);\n if (end < count - 1) tokens.push('dots');\n tokens.push(count);\n return tokens;\n });\n\n go(target: number): void {\n const clamped = Math.max(1, Math.min(this.pageCount(), target));\n if (clamped !== this.page()) this.page.set(clamped);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n input,\n model,\n output,\n signal,\n} from '@angular/core';\nimport { StrctIcon } from '../icon/icon';\nimport { StrctRailStatus } from '../layout/rail';\n\n/** A leaf entry under a {@link StrctMenuSection}. */\nexport interface StrctMenuLink {\n /** Stable identity, matched against the menu's `activeId`. */\n id: string;\n label: string;\n /** Optional leading icon name. */\n icon?: string;\n disabled?: boolean;\n /** Trailing count/label chip (e.g. a deviation count). */\n badge?: string | number;\n /** Badge tone; defaults to `accent` (shared vocabulary with {@link StrctRailItem}). */\n badgeStatus?: StrctRailStatus;\n /** Small trailing status dot with no text (e.g. \"unsaved changes\"). */\n dot?: boolean;\n /** Dot tone; defaults to `accent`. */\n dotStatus?: StrctRailStatus;\n /** Muted trailing icon (e.g. \"restart required\"), before any badge / dot. */\n trailingIcon?: string;\n}\n\n/** A category (level 1) that groups {@link StrctMenuLink} items (level 2). */\nexport interface StrctMenuSection {\n label: string;\n /** Optional category icon (collapsible mode). */\n icon?: string;\n /** Initial expanded state in collapsible mode (defaults to expanded). */\n expanded?: boolean;\n items: StrctMenuLink[];\n}\n\n/**\n * A two-level navigation menu: categories (level 1) each holding a flat list of\n * items (level 2) — not a tree. Categories can be collapsible (chevrons) or\n * static section labels, and item/category icons can be hidden.\n *\n * <strct-section-menu [sections]=\"nav\" [(activeId)]=\"active\"\n * [collapsible]=\"true\" [showIcons]=\"true\"\n * (select)=\"go($event)\" />\n */\n@Component({\n selector: 'strct-section-menu',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon],\n template: `\n <nav class=\"strct-sm\" [attr.aria-label]=\"ariaLabel()\">\n @for (sec of sections(); track sec.label) {\n <div class=\"strct-sm__section\" [class.strct-sm__section--collapsible]=\"collapsible()\">\n @if (collapsible()) {\n <button\n type=\"button\"\n class=\"strct-sm__cat\"\n [attr.aria-expanded]=\"isOpen(sec)\"\n (click)=\"toggle(sec)\"\n >\n <span class=\"strct-sm__chevron\" [class.strct-sm__chevron--open]=\"isOpen(sec)\">\n <strct-icon name=\"chevronRight\" [size]=\"12\" [strokeWidth]=\"1.7\" />\n </span>\n @if (showIcons() && sec.icon) {\n <strct-icon\n class=\"strct-sm__cat-icon\"\n [name]=\"sec.icon\"\n [size]=\"16\"\n [strokeWidth]=\"1.4\"\n />\n }\n <span class=\"strct-sm__cat-label\">{{ sec.label }}</span>\n </button>\n } @else {\n <div class=\"strct-sm__cat-static\">{{ sec.label }}</div>\n }\n\n @if (isOpen(sec)) {\n <div class=\"strct-sm__items\" role=\"group\">\n @for (item of sec.items; track item.id) {\n <button\n type=\"button\"\n class=\"strct-sm__item\"\n [class.strct-sm__item--active]=\"item.id === activeId()\"\n [disabled]=\"item.disabled\"\n [attr.aria-current]=\"item.id === activeId() ? 'page' : null\"\n (click)=\"pick(item)\"\n >\n @if (showIcons() && item.icon) {\n <strct-icon\n class=\"strct-sm__item-icon\"\n [name]=\"item.icon\"\n [size]=\"16\"\n [strokeWidth]=\"1.4\"\n />\n }\n <span class=\"strct-sm__item-label\">{{ item.label }}</span>\n @if (item.trailingIcon) {\n <strct-icon\n class=\"strct-sm__trailing\"\n [name]=\"item.trailingIcon\"\n [size]=\"14\"\n [strokeWidth]=\"1.5\"\n />\n }\n @if (item.badge !== undefined && item.badge !== null && item.badge !== '') {\n <span\n class=\"strct-sm__badge strct-sm__badge--{{ item.badgeStatus ?? 'accent' }}\"\n >\n {{ item.badge }}\n </span>\n } @else if (item.dot) {\n <span\n class=\"strct-sm__dot strct-sm__dot--{{ item.dotStatus ?? 'accent' }}\"\n ></span>\n }\n </button>\n }\n </div>\n }\n </div>\n }\n </nav>\n `,\n host: { class: 'strct-sm-host' },\n styles: [\n `\n .strct-sm {\n display: flex;\n flex-direction: column;\n gap: 1px;\n }\n .strct-sm__section--collapsible + .strct-sm__section--collapsible {\n margin-top: 1px;\n }\n .strct-sm__cat {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 7px 9px;\n border: 0;\n border-radius: 6px;\n background: transparent;\n color: var(--t2);\n font-size: 13px;\n font-weight: 500;\n font-family: var(--font);\n cursor: pointer;\n text-align: start;\n transition:\n background 0.13s ease,\n color 0.13s ease;\n }\n .strct-sm__cat:hover {\n background: var(--bg-3);\n color: var(--t1);\n }\n .strct-sm__cat:focus-visible,\n .strct-sm__item:focus-visible {\n outline: 2px solid var(--acc50);\n outline-offset: -2px;\n }\n .strct-sm__chevron {\n display: inline-flex;\n color: var(--t3);\n flex-shrink: 0;\n transition: transform 0.15s ease;\n }\n .strct-sm__chevron--open {\n transform: rotate(90deg);\n }\n .strct-sm__cat-icon {\n color: var(--t3);\n flex-shrink: 0;\n }\n .strct-sm__cat-label {\n flex: 1;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n .strct-sm__cat-static {\n padding: 11px 10px 5px;\n font-size: 12px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--t3);\n }\n .strct-sm__items {\n display: flex;\n flex-direction: column;\n }\n .strct-sm__item {\n display: flex;\n align-items: center;\n gap: 9px;\n width: 100%;\n padding: 7px 10px;\n border: 0;\n border-radius: 6px;\n background: transparent;\n color: var(--t1);\n font-size: 13px;\n font-family: var(--font);\n cursor: pointer;\n text-align: start;\n transition: background 0.13s ease;\n }\n /* Indent level-2 items under a collapsible category. */\n .strct-sm__section--collapsible .strct-sm__item {\n padding-inline-start: 31px;\n }\n .strct-sm__item:hover:not(:disabled) {\n background: var(--bg-3);\n }\n .strct-sm__item--active {\n background: var(--acc-m);\n color: var(--acc);\n font-weight: 500;\n }\n .strct-sm__item--active .strct-sm__item-icon {\n color: var(--acc);\n }\n .strct-sm__item:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .strct-sm__item-icon {\n color: var(--t2);\n flex-shrink: 0;\n }\n .strct-sm__item-label {\n flex: 1;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n /* Trailing cues: muted icon, count chip, status dot — same vocabulary as\n the rail, so the two nav objects stay consistent. */\n .strct-sm__trailing {\n flex-shrink: 0;\n color: var(--t3);\n }\n .strct-sm__badge {\n flex-shrink: 0;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n font-weight: 600;\n line-height: 1;\n border-radius: 9px;\n font-variant-numeric: tabular-nums;\n }\n .strct-sm__badge--accent {\n background: var(--acc-m);\n color: var(--acc);\n }\n .strct-sm__badge--success {\n background: var(--success-bg);\n color: var(--success);\n }\n .strct-sm__badge--warning {\n background: var(--warning-bg);\n color: var(--warning);\n }\n .strct-sm__badge--critical {\n background: var(--critical-bg);\n color: var(--critical);\n }\n .strct-sm__dot {\n flex-shrink: 0;\n width: 7px;\n height: 7px;\n border-radius: 50%;\n }\n .strct-sm__dot--accent {\n background: var(--acc);\n }\n .strct-sm__dot--success {\n background: var(--success);\n }\n .strct-sm__dot--warning {\n background: var(--warning);\n }\n .strct-sm__dot--critical {\n background: var(--critical);\n }\n `,\n ],\n})\nexport class StrctSectionMenu {\n /** Categories with their items (max two levels). */\n readonly sections = input.required<StrctMenuSection[]>();\n /** Active item id (two-way). */\n readonly activeId = model<string | null>(null);\n /** Categories collapse via a chevron; `false` renders static section labels. */\n readonly collapsible = input(true, { transform: booleanAttribute });\n /** Show category / item icons. */\n readonly showIcons = input(true, { transform: booleanAttribute });\n /** Accessible label for the nav landmark. */\n readonly ariaLabel = input('Sections');\n /** Emitted when an item is chosen. */\n readonly select = output<StrctMenuLink>();\n\n /** Per-section open overrides (keyed by label); absent ⇒ use `expanded`. */\n private readonly overrides = signal<Map<string, boolean>>(new Map());\n\n protected isOpen(sec: StrctMenuSection): boolean {\n if (!this.collapsible()) return true;\n return this.overrides().get(sec.label) ?? sec.expanded !== false;\n }\n\n protected toggle(sec: StrctMenuSection): void {\n const open = this.isOpen(sec);\n const next = new Map(this.overrides());\n next.set(sec.label, !open);\n this.overrides.set(next);\n }\n\n protected pick(item: StrctMenuLink): void {\n if (item.disabled) return;\n this.activeId.set(item.id);\n this.select.emit(item);\n }\n}\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';\n\n/**\n * Inline keyboard-key chip: `<strct-kbd>⌘K</strct-kbd>`. Used for shortcut hints\n * in menus, tooltips and the command palette.\n */\n@Component({\n selector: 'strct-kbd',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `<kbd class=\"strct-kbd__key\"><ng-content /></kbd>`,\n host: { class: 'strct-kbd' },\n styles: [\n `\n .strct-kbd {\n display: inline-flex;\n }\n .strct-kbd__key {\n font-size: 12px;\n line-height: 1;\n padding: 3px 6px;\n border: 1px solid var(--b2);\n border-bottom-width: 2px;\n border-radius: 4px;\n color: var(--t3);\n background: var(--bg-2);\n font-family: var(--mono);\n white-space: nowrap;\n }\n `,\n ],\n})\nexport class StrctKbd {}\n","import {\n DOCUMENT,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n effect,\n inject,\n input,\n model,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { StrctIcon } from '../icon/icon';\nimport { StrctKbd } from '../kbd/kbd';\n\nlet paletteCounter = 0;\n\n/** One searchable command in the palette. */\nexport interface StrctCommandItem {\n /** Stable key; returned with (picked). */\n id: string;\n label: string;\n /** Right-aligned group tag (e.g. a category or section name). */\n group?: string;\n /** Leading icon name (StrctIcon set). */\n icon?: string;\n /** Right-aligned shortcut hint, rendered as a key chip. */\n hint?: string;\n /** Extra search terms beyond label/group. */\n keywords?: string[];\n /** Arbitrary payload carried back with (picked). */\n data?: unknown;\n}\n\n/**\n * ⌘/Ctrl-K command palette — a spotlight search over app commands or pages.\n * Mount once near the app root, feed it `items`, and act on `(picked)`:\n *\n * <strct-command-palette [items]=\"commands\" [(open)]=\"paletteOpen\"\n * (picked)=\"run($event)\" />\n *\n * Opens via the two-way `open` model or the built-in ⌘/Ctrl-K hotkey\n * (`hotkey` input). Implements the ARIA combobox/listbox pattern: arrow keys\n * move the active option, Enter picks, Escape closes; focus returns to the\n * previously focused element on close.\n */\n@Component({\n selector: 'strct-command-palette',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon, StrctKbd],\n host: { '(document:keydown)': 'onGlobalKey($event)' },\n template: `\n @if (open()) {\n <!-- Backdrop: pointer-only dismiss (Escape covers keyboard). -->\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n <div class=\"strct-cmdp__backdrop\" (click)=\"close()\">\n <div\n class=\"strct-cmdp\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-label]=\"placeholder()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"onKey($event)\"\n >\n <div class=\"strct-cmdp__search\">\n <strct-icon name=\"search\" [size]=\"16\" />\n <input\n #input\n class=\"strct-cmdp__input\"\n type=\"text\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-expanded=\"true\"\n [attr.aria-controls]=\"listId\"\n [attr.aria-activedescendant]=\"filtered().length ? optionId(activeIndex()) : null\"\n [placeholder]=\"placeholder()\"\n [value]=\"query()\"\n (input)=\"onType($event)\"\n />\n <strct-kbd>Esc</strct-kbd>\n </div>\n <div class=\"strct-cmdp__list\" role=\"listbox\" [id]=\"listId\">\n @for (item of filtered(); track item.id; let i = $index) {\n <button\n type=\"button\"\n class=\"strct-cmdp__item\"\n role=\"option\"\n [id]=\"optionId(i)\"\n [attr.aria-selected]=\"i === activeIndex()\"\n [class.is-active]=\"i === activeIndex()\"\n tabindex=\"-1\"\n (click)=\"pick(item)\"\n (mousemove)=\"activeIndex.set(i)\"\n >\n @if (item.icon) {\n <strct-icon\n class=\"strct-cmdp__icon\"\n [name]=\"item.icon\"\n [size]=\"16\"\n [strokeWidth]=\"1.4\"\n />\n }\n <span class=\"strct-cmdp__label\">{{ item.label }}</span>\n @if (item.hint) {\n <strct-kbd>{{ item.hint }}</strct-kbd>\n }\n @if (item.group) {\n <span class=\"strct-cmdp__group\">{{ item.group }}</span>\n }\n </button>\n } @empty {\n <div class=\"strct-cmdp__empty\">{{ emptyText() }} “{{ query() }}”</div>\n }\n </div>\n </div>\n </div>\n }\n `,\n styles: [\n `\n .strct-cmdp__backdrop {\n position: fixed;\n inset: 0;\n z-index: 1200;\n display: flex;\n justify-content: center;\n align-items: flex-start;\n padding: 14vh 16px 16px;\n background: rgba(0, 0, 0, 0.5);\n backdrop-filter: blur(2px);\n animation: strct-cmdp-fade 0.12s ease;\n }\n .strct-cmdp {\n width: 100%;\n max-width: 560px;\n max-height: 60vh;\n display: flex;\n flex-direction: column;\n background: var(--bg-1);\n border: 1px solid var(--b2);\n border-radius: var(--radius-xl);\n box-shadow: var(--shadow-floating);\n overflow: hidden;\n animation: strct-cmdp-rise 0.14s ease;\n }\n .strct-cmdp__search {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 13px 16px;\n border-bottom: 1px solid var(--b1);\n color: var(--t3);\n }\n .strct-cmdp__input {\n flex: 1;\n min-width: 0;\n border: 0;\n background: transparent;\n color: var(--t1);\n font-size: 15px;\n font-family: var(--font);\n outline: none;\n }\n .strct-cmdp__list {\n overflow-y: auto;\n padding: 6px;\n }\n .strct-cmdp__item {\n display: flex;\n align-items: center;\n gap: 11px;\n width: 100%;\n padding: 9px 11px;\n border: 0;\n border-radius: var(--radius-md);\n background: transparent;\n cursor: pointer;\n text-align: start;\n font-family: var(--font);\n }\n .strct-cmdp__item.is-active {\n background: var(--acc-m);\n }\n .strct-cmdp__icon {\n color: var(--t2);\n flex-shrink: 0;\n }\n .strct-cmdp__item.is-active .strct-cmdp__icon {\n color: var(--acc);\n }\n .strct-cmdp__label {\n flex: 1;\n min-width: 0;\n font-size: var(--text-lg);\n color: var(--t1);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n .strct-cmdp__group {\n font-size: var(--text-sm);\n color: var(--t3);\n flex-shrink: 0;\n }\n .strct-cmdp__empty {\n padding: 20px;\n text-align: center;\n font-size: var(--text-md);\n color: var(--t3);\n }\n @keyframes strct-cmdp-fade {\n from {\n opacity: 0;\n }\n }\n @keyframes strct-cmdp-rise {\n from {\n opacity: 0;\n transform: translateY(-8px);\n }\n }\n @media (prefers-reduced-motion: reduce) {\n .strct-cmdp__backdrop,\n .strct-cmdp {\n animation: none;\n }\n }\n `,\n ],\n})\nexport class StrctCommandPalette {\n private readonly doc = inject(DOCUMENT);\n private readonly inputRef = viewChild<ElementRef<HTMLInputElement>>('input');\n\n /** Searchable commands. */\n readonly items = input<StrctCommandItem[]>([]);\n /** Whether the palette is open (two-way). */\n readonly open = model(false);\n /** Enable the built-in ⌘/Ctrl-K toggle. */\n readonly hotkey = input(true, { transform: booleanAttribute });\n /** Search input placeholder / dialog name (localizable). */\n readonly placeholder = input('Type a command or search…');\n /** Empty-result message prefix (localizable). */\n readonly emptyText = input('No matches for');\n /** Maximum rendered results. */\n readonly maxResults = input(50);\n /** Emitted when a command is chosen (Enter or click); the palette closes. */\n readonly picked = output<StrctCommandItem>();\n\n protected readonly query = signal('');\n protected readonly activeIndex = signal(0);\n protected readonly listId = `strct-cmdp-list-${++paletteCounter}`;\n private previousActive: HTMLElement | null = null;\n\n protected optionId(i: number): string {\n return `${this.listId}-opt-${i}`;\n }\n\n /** Rank: label prefix > word-start > substring; group/keyword matches last. */\n protected readonly filtered = computed(() => {\n const q = this.query().trim().toLowerCase();\n const items = this.items();\n if (!q) return items.slice(0, this.maxResults());\n const scored: { item: StrctCommandItem; score: number }[] = [];\n for (const item of items) {\n const label = item.label.toLowerCase();\n const hay = [item.group ?? '', ...(item.keywords ?? [])].join(' ').toLowerCase();\n let score = -1;\n if (label.startsWith(q)) score = 0;\n else if (label.split(/\\s+/).some((w) => w.startsWith(q))) score = 1;\n else if (label.includes(q)) score = 2;\n else if (hay.includes(q)) score = 3;\n if (score >= 0) scored.push({ item, score });\n }\n return scored\n .sort((a, b) => a.score - b.score)\n .slice(0, this.maxResults())\n .map((s) => s.item);\n });\n\n constructor() {\n // Focus the input on open; restore focus on close.\n effect(() => {\n if (this.open()) {\n this.previousActive = this.doc.activeElement as HTMLElement | null;\n this.query.set('');\n this.activeIndex.set(0);\n setTimeout(() => this.inputRef()?.nativeElement.focus());\n } else if (this.previousActive) {\n this.previousActive.focus?.();\n this.previousActive = null;\n }\n });\n }\n\n /** ⌘/Ctrl-K toggle + global Escape while open. */\n protected onGlobalKey(event: KeyboardEvent): void {\n if (this.hotkey() && (event.metaKey || event.ctrlKey) && event.key.toLowerCase() === 'k') {\n event.preventDefault();\n this.open.update((v) => !v);\n } else if (event.key === 'Escape' && this.open()) {\n this.close();\n }\n }\n\n protected onType(event: Event): void {\n this.query.set((event.target as HTMLInputElement).value);\n this.activeIndex.set(0);\n }\n\n protected onKey(event: KeyboardEvent): void {\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.move(1);\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.move(-1);\n break;\n case 'Home':\n event.preventDefault();\n this.activeIndex.set(0);\n break;\n case 'End':\n event.preventDefault();\n this.activeIndex.set(Math.max(0, this.filtered().length - 1));\n break;\n case 'Enter': {\n event.preventDefault();\n const item = this.filtered()[this.activeIndex()];\n if (item) this.pick(item);\n break;\n }\n }\n }\n\n private move(delta: number): void {\n const n = this.filtered().length;\n if (!n) return;\n const next = (this.activeIndex() + delta + n) % n;\n this.activeIndex.set(next);\n this.doc.getElementById(this.optionId(next))?.scrollIntoView?.({ block: 'nearest' });\n }\n\n protected pick(item: StrctCommandItem): void {\n this.close();\n this.picked.emit(item);\n }\n\n protected close(): void {\n this.open.set(false);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n input,\n} from '@angular/core';\nimport { StrctIcon } from '../icon/icon';\nimport { StrctSpinner } from '../spinner/spinner';\n\n/** Lifecycle of an async (or deferred) validation check. */\nexport type StrctValidationStatus = 'idle' | 'checking' | 'ok' | 'warning' | 'error';\n\n/**\n * A first-class \"validating… → ok / warning / error (reason)\" model, so apps stop\n * composing a spinner + badge by hand (e.g. live reachability checks while typing).\n * Consumed by `StrctField`'s `validationState` input and the `[strctCellStatus]`\n * datagrid-cell helper.\n */\nexport interface StrctValidationState {\n status: StrctValidationStatus;\n /** Optional human-readable reason, shown beside the affordance / in the hint slot. */\n message?: string;\n}\n\n/** Tone class suffix per validation status (used by field + cell helper styles). */\nexport function strctValidationTone(status: StrctValidationStatus): string {\n return status;\n}\n\n/** Leading icon name per (non-checking) validation status; '' for idle/checking. */\nexport function strctValidationIcon(status: StrctValidationStatus): string {\n switch (status) {\n case 'ok':\n return 'success';\n case 'warning':\n return 'warning';\n case 'error':\n return 'critical';\n default:\n return '';\n }\n}\n\n/**\n * Renders the shared \"checking / ok / warning / error (reason)\" affordance from a\n * small `StrctValidationState` model — a spinner while checking, then an icon and\n * an optional message. Drop it into a `StrctDatagrid` cell template for\n * list-building flows, as an element or an attribute:\n *\n * <strct-cell-status [state]=\"probe(row)\" />\n * <span strct-cell-status [state]=\"probe(row)\"></span>\n */\n@Component({\n selector: 'strct-cell-status, [strct-cell-status]',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon, StrctSpinner],\n template: `\n @if (state().status !== 'idle') {\n <span class=\"strct-vstate strct-vstate--{{ state().status }}\">\n @if (state().status === 'checking') {\n <strct-spinner size=\"sm\" />\n } @else if (icon()) {\n <strct-icon [name]=\"icon()\" [size]=\"16\" />\n }\n @if (state().message) {\n <span class=\"strct-vstate__msg\" aria-live=\"polite\">{{ state().message }}</span>\n }\n </span>\n }\n `,\n styles: [\n `\n .strct-vstate {\n display: inline-flex;\n align-items: center;\n gap: var(--space-1);\n font-size: var(--text-sm);\n line-height: 1;\n color: var(--t3);\n }\n .strct-vstate strct-icon {\n flex-shrink: 0;\n }\n .strct-vstate--ok {\n color: var(--success);\n }\n .strct-vstate--warning {\n color: var(--warning);\n }\n .strct-vstate--error {\n color: var(--critical);\n }\n .strct-vstate__msg {\n color: var(--t2);\n }\n `,\n ],\n})\nexport class StrctCellStatus {\n /** The validation state to render. */\n readonly state = input.required<StrctValidationState>();\n protected readonly icon = computed(() => strctValidationIcon(this.state().status));\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n afterNextRender,\n booleanAttribute,\n computed,\n effect,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { StrctIcon } from '../icon/icon';\nimport { StrctSpinner } from '../spinner/spinner';\nimport { StrctValidationState, strctValidationIcon } from '../validation/validation';\n\nlet fieldCounter = 0;\n\n/**\n * Form-field wrapper: a label (with optional required marker), the projected\n * control, and a hint or error message. It auto-links the control via\n * `aria-describedby` and sets `aria-invalid` when an error is present.\n *\n * <strct-field label=\"Email\" required hint=\"We never share it.\" [error]=\"emailError()\">\n * <input strctInput type=\"email\" [(ngModel)]=\"email\" />\n * </strct-field>\n */\n@Component({\n selector: 'strct-field',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon, StrctSpinner],\n template: `\n @if (label()) {\n <label class=\"strct-field__label\" [attr.for]=\"controlId() || null\">\n {{ label() }}\n @if (required()) {\n <span class=\"strct-field__req\" aria-hidden=\"true\">*</span>\n }\n </label>\n }\n <div class=\"strct-field__control\">\n <ng-content />\n @if (stateActive()) {\n <span class=\"strct-field__adorn strct-field__adorn--{{ stateStatus() }}\" aria-hidden=\"true\">\n @if (stateStatus() === 'checking') {\n <strct-spinner size=\"sm\" />\n } @else if (stateIcon()) {\n <strct-icon [name]=\"stateIcon()\" [size]=\"16\" />\n }\n </span>\n }\n </div>\n @if (errorText()) {\n <div class=\"strct-field__msg strct-field__msg--error\" [id]=\"errorId\" role=\"alert\">\n {{ errorText() }}\n </div>\n } @else if (stateMessage()) {\n <div\n class=\"strct-field__msg strct-field__msg--{{ stateStatus() }}\"\n [id]=\"hintId\"\n [attr.role]=\"stateStatus() === 'error' ? 'alert' : null\"\n aria-live=\"polite\"\n >\n {{ stateMessage() }}\n </div>\n } @else if (hint()) {\n <div class=\"strct-field__msg strct-field__msg--hint\" [id]=\"hintId\">{{ hint() }}</div>\n }\n `,\n host: {\n class: 'strct-field',\n '[class.strct-field--invalid]': 'isInvalid()',\n '[class.strct-field--validating]': 'stateActive()',\n },\n styles: [\n `\n .strct-field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n .strct-field__label {\n font-size: 12px;\n font-weight: 600;\n color: var(--t2);\n }\n .strct-field__req {\n color: var(--critical);\n margin-inline-start: 2px;\n }\n .strct-field__control {\n position: relative;\n display: flex;\n flex-direction: column;\n }\n /* Trailing validation adornment, vertically centred on a single-line control. */\n .strct-field__adorn {\n position: absolute;\n top: 50%;\n right: 10px;\n transform: translateY(-50%);\n display: inline-flex;\n align-items: center;\n pointer-events: none;\n }\n .strct-field__adorn--ok {\n color: var(--success);\n }\n .strct-field__adorn--warning {\n color: var(--warning);\n }\n .strct-field__adorn--error {\n color: var(--critical);\n }\n /* Make room for the adornment so it never overlaps the text. */\n .strct-field--validating .strct-control {\n padding-inline-end: 32px;\n }\n .strct-field__msg {\n font-size: 12px;\n line-height: 1.4;\n }\n .strct-field__msg--hint,\n .strct-field__msg--checking {\n color: var(--t3);\n }\n .strct-field__msg--ok {\n color: var(--success);\n }\n .strct-field__msg--warning {\n color: var(--warning);\n }\n .strct-field__msg--error {\n color: var(--critical);\n }\n `,\n ],\n})\nexport class StrctField {\n /** Label text. */\n readonly label = input('');\n /** Show a required marker on the label. */\n readonly required = input(false, { transform: booleanAttribute });\n /** Helper text shown below the field. */\n readonly hint = input('');\n /** Error message (string or first-of array); falsy clears the error state. */\n readonly error = input<string | string[] | null | undefined>(null);\n /**\n * Async-validation state rendered as a trailing adornment (spinner / check /\n * warning) plus its message in the hint/error slot — so apps stop composing a\n * spinner + badge by hand for live \"checking… → ok / warning / error\" checks.\n */\n readonly validationState = input<StrctValidationState | null>(null);\n\n private readonly host: ElementRef<HTMLElement> = inject(ElementRef);\n private readonly n = ++fieldCounter;\n protected readonly hintId = `strct-field-hint-${this.n}`;\n protected readonly errorId = `strct-field-err-${this.n}`;\n protected readonly controlId = signal('');\n\n protected readonly errorText = computed(() => {\n const e = this.error();\n return (Array.isArray(e) ? e[0] : e) ?? '';\n });\n\n /** Effective validation status ('idle' when no state supplied). */\n protected readonly stateStatus = computed(() => this.validationState()?.status ?? 'idle');\n /** Whether to show the trailing adornment (an explicit error suppresses it). */\n protected readonly stateActive = computed(\n () => !this.errorText() && this.stateStatus() !== 'idle',\n );\n protected readonly stateIcon = computed(() => strctValidationIcon(this.stateStatus()));\n /** Validation message, shown only when there is no explicit error. */\n protected readonly stateMessage = computed(() =>\n this.errorText() ? '' : (this.validationState()?.message ?? ''),\n );\n /** Invalid when an explicit error is set or the validation state is 'error'. */\n protected readonly isInvalid = computed(\n () => !!this.errorText() || this.stateStatus() === 'error',\n );\n\n constructor() {\n afterNextRender(() => this.link());\n // Keep aria in sync as the error / hint / validation state change.\n effect(() => {\n this.errorText();\n this.hint();\n this.stateStatus();\n this.stateMessage();\n this.applyAria();\n });\n }\n\n private control(): HTMLElement | null {\n return this.host.nativeElement.querySelector<HTMLElement>(\n 'input, select, textarea, [strctInput], [strctField]',\n );\n }\n\n private link(): void {\n const el = this.control();\n if (!el) return;\n if (!el.id) el.id = `strct-field-ctrl-${this.n}`;\n this.controlId.set(el.id);\n this.applyAria();\n }\n\n private applyAria(): void {\n const el = this.control();\n if (!el) return;\n const describedBy = this.errorText()\n ? this.errorId\n : this.stateMessage() || this.hint()\n ? this.hintId\n : '';\n if (describedBy) el.setAttribute('aria-describedby', describedBy);\n else el.removeAttribute('aria-describedby');\n if (this.isInvalid()) el.setAttribute('aria-invalid', 'true');\n else el.removeAttribute('aria-invalid');\n }\n}\n","import { Directive } from '@angular/core';\n\n/**\n * Applies the shared `.strct-control` look to a native input / textarea / select.\n * <input strctInput placeholder=\"Name\" />\n * <select strctInput>…</select>\n * The visual definition lives in `strct/styles/_forms.scss` (shipped via the\n * theme entry point), so this directive only attaches the class.\n */\n@Directive({\n selector: 'input[strctInput], textarea[strctInput], select[strctInput]',\n host: { class: 'strct-control' },\n})\nexport class StrctInput {}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n effect,\n forwardRef,\n input,\n model,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { StrctIcon } from '../icon/icon';\n\n/** Checkbox with custom box. Works with `[(ngModel)]` / reactive forms. */\n@Component({\n selector: 'strct-checkbox',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [StrctIcon],\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => StrctCheckbox), multi: true },\n ],\n template: `\n <label class=\"strct-cb\" [class.strct-cb--disabled]=\"isDisabled()\">\n <input\n type=\"checkbox\"\n class=\"strct-cb__native\"\n [checked]=\"checked()\"\n [disabled]=\"isDisabled()\"\n [indeterminate]=\"indeterminate()\"\n [attr.aria-label]=\"ariaLabel()\"\n (change)=\"onToggle($event)\"\n (blur)=\"onTouched()\"\n />\n <span class=\"strct-cb__box\">\n <strct-icon name=\"check\" [size]=\"11\" [strokeWidth]=\"2\" />\n </span>\n <span class=\"strct-cb__label\"><ng-content /></span>\n </label>\n `,\n styles: [\n `\n .strct-cb {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n font-size: 13px;\n color: var(--t1);\n user-select: none;\n }\n .strct-cb--disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .strct-cb__native {\n position: absolute;\n opacity: 0;\n width: 0;\n height: 0;\n }\n .strct-cb__box {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 17px;\n height: 17px;\n border-radius: 4px;\n flex-shrink: 0;\n background: var(--bg-2);\n border: 1px solid var(--b3);\n color: transparent;\n transition:\n background 0.14s ease,\n border-color 0.14s ease;\n }\n .strct-cb__native:checked + .strct-cb__box {\n background: var(--acc);\n border-color: transparent;\n color: var(--inv);\n }\n .strct-cb__native:focus-visible + .strct-cb__box {\n box-shadow: 0 0 0 3px var(--acc18);\n }\n `,\n ],\n})\nexport class StrctCheckbox implements ControlValueAccessor {\n readonly checked = model(false);\n readonly isDisabled = model(false);\n /** Static disable; forms' setDisabledState also drives the disabled state. */\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Tri-state visual indicator for a parent / intermediate state. */\n readonly indeterminate = input(false, { transform: booleanAttribute });\n /** Accessible label for the checkbox (used when no text label is present). */\n readonly ariaLabel = input<string | null>(null);\n\n private onChange: (value: boolean) => void = () => {};\n protected onTouched: () => void = () => {};\n\n constructor() {\n effect(() => this.isDisabled.set(this.disabled()));\n }\n\n onToggle(event: Event): void {\n const value = (event.target as HTMLInputElement).checked;\n this.checked.set(value);\n this.onChange(value);\n }\n\n writeValue(value: boolean): void {\n this.checked.set(!!value);\n }\n registerOnChange(fn: (value: boolean) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n effect,\n forwardRef,\n input,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n/** On/off switch. Works with `[(ngModel)]` / reactive forms. */\n@Component({\n selector: 'strct-toggle',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => StrctToggle), multi: true },\n ],\n template: `\n <label class=\"strct-tg\" [class.strct-tg--disabled]=\"isDisabled()\">\n <input\n type=\"checkbox\"\n class=\"strct-tg__native\"\n role=\"switch\"\n [checked]=\"checked()\"\n [disabled]=\"isDisabled()\"\n (change)=\"onToggle($event)\"\n (blur)=\"onTouched()\"\n />\n <span class=\"strct-tg__track\"><span class=\"strct-tg__thumb\"></span></span>\n <span class=\"strct-tg__label\"><ng-content /></span>\n </label>\n `,\n styles: [\n `\n .strct-tg {\n display: inline-flex;\n align-items: center;\n gap: 9px;\n cursor: pointer;\n font-size: 13px;\n color: var(--t1);\n user-select: none;\n }\n .strct-tg--disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .strct-tg__native {\n position: absolute;\n opacity: 0;\n width: 0;\n height: 0;\n }\n .strct-tg__track {\n position: relative;\n width: 34px;\n height: 19px;\n border-radius: 11px;\n flex-shrink: 0;\n background: var(--bg-3);\n border: 1px solid var(--b3);\n transition:\n background 0.16s ease,\n border-color 0.16s ease;\n }\n .strct-tg__thumb {\n position: absolute;\n top: 2px;\n left: 2px;\n width: 13px;\n height: 13px;\n border-radius: 50%;\n background: var(--t2);\n transition:\n transform 0.16s ease,\n background 0.16s ease;\n }\n .strct-tg__native:checked + .strct-tg__track {\n background: var(--acc);\n border-color: transparent;\n }\n .strct-tg__native:checked + .strct-tg__track .strct-tg__thumb {\n transform: translateX(15px);\n background: var(--inv);\n }\n /* RTL: the thumb travels toward the inline-end, i.e. to the left.\n (:host-context because this component uses emulated encapsulation.) */\n :host-context([dir='rtl']) .strct-tg__native:checked + .strct-tg__track .strct-tg__thumb {\n transform: translateX(-15px);\n }\n .strct-tg__native:focus-visible + .strct-tg__track {\n box-shadow: 0 0 0 3px var(--acc18);\n }\n `,\n ],\n})\nexport class StrctToggle implements ControlValueAccessor {\n readonly checked = signal(false);\n readonly isDisabled = signal(false);\n /** Static disable; forms' setDisabledState also drives the disabled state. */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n private onChange: (value: boolean) => void = () => {};\n protected onTouched: () => void = () => {};\n\n constructor() {\n effect(() => this.isDisabled.set(this.disabled()));\n }\n\n onToggle(event: Event): void {\n const value = (event.target as HTMLInputElement).checked;\n this.checked.set(value);\n this.onChange(value);\n }\n\n writeValue(value: boolean): void {\n this.checked.set(!!value);\n }\n registerOnChange(fn: (value: boolean) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n forwardRef,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nlet groupCounter = 0;\n\n/**\n * Radio group (the form control). Wrap `<strct-radio>` items:\n * <strct-radio-group [(ngModel)]=\"size\">\n * <strct-radio [value]=\"'sm'\">Small</strct-radio>\n * <strct-radio [value]=\"'lg'\">Large</strct-radio>\n * </strct-radio-group>\n */\n@Component({\n selector: 'strct-radio-group',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => StrctRadioGroup), multi: true },\n ],\n template: `<ng-content />`,\n host: { class: 'strct-radio-group', role: 'radiogroup' },\n styles: [\n `\n .strct-radio-group {\n display: flex;\n flex-direction: column;\n gap: 9px;\n }\n `,\n ],\n})\nexport class StrctRadioGroup implements ControlValueAccessor {\n readonly name = `strct-radio-${++groupCounter}`;\n readonly value = signal<unknown>(null);\n readonly isDisabled = signal(false);\n\n private onChange: (value: unknown) => void = () => {};\n private onTouched: () => void = () => {};\n\n select(value: unknown): void {\n this.value.set(value);\n this.onChange(value);\n this.onTouched();\n }\n\n writeValue(value: unknown): void {\n this.value.set(value);\n }\n registerOnChange(fn: (value: unknown) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n}\n\n/** One option inside a `<strct-radio-group>`. */\n@Component({\n selector: 'strct-radio',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <label class=\"strct-rb\" [class.strct-rb--disabled]=\"disabled() || group.isDisabled()\">\n <input\n type=\"radio\"\n class=\"strct-rb__native\"\n [name]=\"group.name\"\n [checked]=\"group.value() === value()\"\n [disabled]=\"disabled() || group.isDisabled()\"\n (change)=\"group.select(value())\"\n />\n <span class=\"strct-rb__dot\"></span>\n <span class=\"strct-rb__label\"><ng-content /></span>\n </label>\n `,\n styles: [\n `\n .strct-rb {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n font-size: 13px;\n color: var(--t1);\n user-select: none;\n }\n .strct-rb--disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .strct-rb__native {\n position: absolute;\n opacity: 0;\n width: 0;\n height: 0;\n }\n .strct-rb__dot {\n position: relative;\n width: 17px;\n height: 17px;\n border-radius: 50%;\n flex-shrink: 0;\n background: var(--bg-2);\n border: 1px solid var(--b3);\n transition: border-color 0.14s ease;\n }\n .strct-rb__dot::after {\n content: '';\n position: absolute;\n inset: 0;\n margin: auto;\n width: 7px;\n height: 7px;\n border-radius: 50%;\n background: var(--acc);\n transform: scale(0);\n transition: transform 0.14s ease;\n }\n .strct-rb__native:checked + .strct-rb__dot {\n border-color: var(--acc);\n }\n .strct-rb__native:checked + .strct-rb__dot::after {\n transform: scale(1);\n }\n .strct-rb__native:focus-visible + .strct-rb__dot {\n box-shadow: 0 0 0 3px var(--acc18);\n }\n `,\n ],\n})\nexport class StrctRadio {\n /** Current value. */\n readonly value = input.required<unknown>();\n /** Static disable flag. */\n readonly disabled = input(false, { transform: booleanAttribute });\n protected readonly group = inject(StrctRadioGroup);\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n effect,\n forwardRef,\n input,\n signal,\n viewChildren,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { StrctIcon } from '../icon/icon';\n\n/** One segment of a `StrctSegmented`. */\nexport interface StrctSegmentedOption {\n value: unknown;\n label: string;\n /** Optional leading icon name (StrctIcon set). */\n icon?: string;\n /** Disable just this segment. */\n disabled?: boolean;\n}\n\n/** Segment size. */\nexport type StrctSegmentedSize = 'sm' | 'md';\n\n/**\n * One-of-N selection rendered as a joined segmented control with managed\n * selected state — distinct from `StrctTabs` (panel switching) and\n * `StrctButtonGroup` (a visual cluster only). For mode pickers and list filters.\n * CVA-compatible, so `formControlName` and `[(ngModel)]` both work.\n *\n * <strct-segmented\n * [options]=\"[{ value: 'all', label: 'All' }, { value: 'active', label: 'Active' }]\"\n * [(ngModel)]=\"filter\" size=\"sm\" />\n */\n@Component({\n selector: 'strct-segmented',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon],\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => StrctSegmented), multi: true },\n ],\n template: `\n @for (opt of options(); track opt.value; let i = $index) {\n <button\n #seg\n type=\"button\"\n role=\"radio\"\n class=\"strct-seg__opt\"\n [class.strct-seg__opt--selected]=\"isSelected(opt)\"\n [attr.aria-checked]=\"isSelected(opt)\"\n [attr.tabindex]=\"rovingIndex(opt, i)\"\n [disabled]=\"opt.disabled || isDisabled()\"\n (click)=\"select(opt)\"\n (blur)=\"onTouched()\"\n >\n @if (opt.icon) {\n <strct-icon [name]=\"opt.icon\" [size]=\"16\" />\n }\n <span>{{ opt.label }}</span>\n </button>\n }\n `,\n host: {\n class: 'strct-seg',\n role: 'radiogroup',\n '[class.strct-seg--sm]': \"size() === 'sm'\",\n '[class.strct-seg--block]': 'block()',\n '[class.strct-seg--disabled]': 'isDisabled()',\n '(keydown)': 'onKeydown($event)',\n },\n styles: [\n `\n .strct-seg {\n display: inline-flex;\n gap: 2px;\n padding: 2px;\n background: var(--bg-2);\n border: 1px solid var(--b2);\n border-radius: var(--radius-md);\n max-width: 100%;\n }\n .strct-seg--block {\n display: flex;\n width: 100%;\n }\n .strct-seg__opt {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--space-1);\n flex: 1 1 auto;\n padding: 6px 14px;\n border: 0;\n border-radius: calc(var(--radius-md) - 2px);\n background: transparent;\n color: var(--t2);\n font-family: var(--font);\n font-size: 13px;\n font-weight: 500;\n line-height: 1;\n white-space: nowrap;\n cursor: pointer;\n transition:\n background 0.14s ease,\n color 0.14s ease;\n }\n .strct-seg--sm .strct-seg__opt {\n padding: 4px 10px;\n font-size: 12px;\n }\n .strct-seg__opt:hover:not(:disabled):not(.strct-seg__opt--selected) {\n color: var(--t1);\n }\n .strct-seg__opt--selected {\n background: var(--bg-a);\n color: var(--t1);\n font-weight: 600;\n box-shadow: var(--sh);\n }\n .strct-seg__opt:focus-visible {\n outline: none;\n box-shadow: 0 0 0 2px var(--acc50);\n }\n .strct-seg__opt:disabled {\n opacity: var(--disabled-opacity);\n cursor: not-allowed;\n }\n .strct-seg--disabled {\n opacity: var(--disabled-opacity);\n }\n .strct-seg--disabled .strct-seg__opt {\n cursor: not-allowed;\n }\n `,\n ],\n})\nexport class StrctSegmented implements ControlValueAccessor {\n /** The selectable segments. */\n readonly options = input<StrctSegmentedOption[]>([]);\n /** Segment size. */\n readonly size = input<StrctSegmentedSize>('md');\n /** Stretch to the full width of the container. */\n readonly block = input(false, { transform: booleanAttribute });\n /** Static disable; forms' setDisabledState also drives the disabled state. */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n readonly value = signal<unknown>(null);\n readonly isDisabled = signal(false);\n private readonly segs = viewChildren('seg', { read: ElementRef });\n\n private onChange: (value: unknown) => void = () => {};\n protected onTouched: () => void = () => {};\n\n constructor() {\n effect(() => this.isDisabled.set(this.disabled()));\n }\n\n protected isSelected(opt: StrctSegmentedOption): boolean {\n return this.value() === opt.value;\n }\n\n /** Index of the currently selected (or first enabled) option for roving focus. */\n private readonly activeIndex = computed(() => {\n const opts = this.options();\n const selected = opts.findIndex((o) => o.value === this.value());\n if (selected >= 0) return selected;\n const firstEnabled = opts.findIndex((o) => !o.disabled);\n return firstEnabled >= 0 ? firstEnabled : 0;\n });\n\n protected rovingIndex(opt: StrctSegmentedOption, i: number): number {\n if (opt.disabled || this.isDisabled()) return -1;\n return i === this.activeIndex() ? 0 : -1;\n }\n\n protected select(opt: StrctSegmentedOption): void {\n if (opt.disabled || this.isDisabled() || opt.value === this.value()) return;\n this.value.set(opt.value);\n this.onChange(opt.value);\n this.onTouched();\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n if (this.isDisabled()) return;\n const forward = event.key === 'ArrowRight' || event.key === 'ArrowDown';\n const backward = event.key === 'ArrowLeft' || event.key === 'ArrowUp';\n const home = event.key === 'Home';\n const end = event.key === 'End';\n if (!forward && !backward && !home && !end) return;\n event.preventDefault();\n\n const opts = this.options();\n const enabled = opts.map((o, i) => ({ o, i })).filter((x) => !x.o.disabled);\n if (!enabled.length) return;\n\n const current = this.activeIndex();\n let pos = enabled.findIndex((x) => x.i === current);\n if (pos < 0) pos = 0;\n\n let next: number;\n if (home) next = 0;\n else if (end) next = enabled.length - 1;\n else if (forward) next = (pos + 1) % enabled.length;\n else next = (pos - 1 + enabled.length) % enabled.length;\n\n const target = enabled[next];\n this.select(target.o);\n this.segs()[target.i]?.nativeElement.focus();\n }\n\n writeValue(value: unknown): void {\n this.value.set(value);\n }\n registerOnChange(fn: (value: unknown) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n effect,\n forwardRef,\n input,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n/**\n * Slider built on a native range input — fully accessible, CVA-compatible.\n * <strct-range [min]=\"0\" [max]=\"100\" [(ngModel)]=\"volume\" showValue />\n */\n@Component({\n selector: 'strct-range',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => StrctRange), multi: true },\n ],\n template: `\n <input\n type=\"range\"\n class=\"strct-range__input\"\n [min]=\"min()\"\n [max]=\"max()\"\n [step]=\"step()\"\n [value]=\"value()\"\n [disabled]=\"isDisabled()\"\n [style.--strct-range-fill.%]=\"fillPercent()\"\n (input)=\"onInput($event)\"\n (blur)=\"onTouched()\"\n />\n @if (showValue()) {\n <span class=\"strct-range__value\">{{ value() }}</span>\n }\n `,\n styles: [\n `\n .strct-range {\n display: inline-flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n max-width: 280px;\n }\n .strct-range__input {\n flex: 1;\n appearance: none;\n height: 5px;\n border-radius: 3px;\n cursor: pointer;\n background: linear-gradient(\n to right,\n var(--acc) 0 var(--strct-range-fill, 0%),\n var(--bg-3) var(--strct-range-fill, 0%) 100%\n );\n }\n .strct-range__input:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .strct-range__input::-webkit-slider-thumb {\n appearance: none;\n width: 15px;\n height: 15px;\n border-radius: 50%;\n background: var(--acc);\n border: 2px solid var(--bg-1);\n box-shadow: var(--sh);\n }\n .strct-range__input::-moz-range-thumb {\n width: 15px;\n height: 15px;\n border-radius: 50%;\n background: var(--acc);\n border: 2px solid var(--bg-1);\n box-shadow: var(--sh);\n }\n .strct-range__input:focus-visible {\n outline: none;\n }\n .strct-range__input:focus-visible::-webkit-slider-thumb {\n box-shadow: 0 0 0 3px var(--acc18);\n }\n .strct-range__value {\n min-width: 30px;\n text-align: end;\n font-size: 12px;\n font-family: var(--mono);\n color: var(--t2);\n }\n `,\n ],\n})\nexport class StrctRange implements ControlValueAccessor {\n /** Minimum allowed value. */\n readonly min = input(0);\n /** Maximum allowed value or top of the value axis. */\n readonly max = input(100);\n /** Step increment. */\n readonly step = input(1);\n /** Display the current numeric value. */\n readonly showValue = input(false, { transform: booleanAttribute });\n /** Static disable flag. */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n readonly value = signal(0);\n readonly isDisabled = signal(false);\n\n protected readonly fillPercent = computed(() => {\n const span = this.max() - this.min();\n return span <= 0 ? 0 : ((this.value() - this.min()) / span) * 100;\n });\n\n private onChange: (value: number) => void = () => {};\n protected onTouched: () => void = () => {};\n\n constructor() {\n effect(() => this.isDisabled.set(this.disabled()));\n }\n\n onInput(event: Event): void {\n const value = Number((event.target as HTMLInputElement).value);\n this.value.set(value);\n this.onChange(value);\n }\n\n writeValue(value: number): void {\n this.value.set(Number(value) || 0);\n }\n registerOnChange(fn: (value: number) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n forwardRef,\n input,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { StrctIcon } from '../icon/icon';\n\nconst LEVELS = [\n { label: 'Weak', color: 'var(--critical)' },\n { label: 'Weak', color: 'var(--critical)' },\n { label: 'Fair', color: 'var(--warning)' },\n { label: 'Good', color: 'var(--acc)' },\n { label: 'Strong', color: 'var(--success)' },\n];\n\n/**\n * Password input with a reveal toggle and an optional strength meter. CVA-compatible.\n * <strct-password [(ngModel)]=\"pw\" meter />\n */\n@Component({\n selector: 'strct-password',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon],\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => StrctPassword), multi: true },\n ],\n template: `\n <div class=\"strct-pw__field\">\n <input\n class=\"strct-control strct-pw__input\"\n [type]=\"revealed() ? 'text' : 'password'\"\n [placeholder]=\"placeholder()\"\n [value]=\"value()\"\n [disabled]=\"isDisabled()\"\n autocomplete=\"off\"\n (input)=\"onInput($event)\"\n (blur)=\"onTouched()\"\n />\n <button\n type=\"button\"\n class=\"strct-pw__toggle\"\n [attr.aria-label]=\"revealed() ? 'Hide password' : 'Show password'\"\n [disabled]=\"isDisabled()\"\n (click)=\"revealed.set(!revealed())\"\n >\n <strct-icon [name]=\"revealed() ? 'eyeOff' : 'eye'\" [size]=\"16\" [strokeWidth]=\"1.3\" />\n </button>\n </div>\n @if (meter() && value()) {\n <div class=\"strct-pw__meter\">\n <div class=\"strct-pw__bars\">\n @for (i of [0, 1, 2, 3]; track i) {\n <span\n class=\"strct-pw__bar\"\n [style.background]=\"i < score() ? level().color : 'var(--bg-3)'\"\n ></span>\n }\n </div>\n <span class=\"strct-pw__label\" [style.color]=\"level().color\">{{ level().label }}</span>\n </div>\n }\n `,\n host: { class: 'strct-pw' },\n styles: [\n `\n .strct-pw {\n display: block;\n width: 100%;\n max-width: 280px;\n }\n .strct-pw__field {\n position: relative;\n }\n .strct-pw__input {\n padding-inline-end: 38px;\n }\n .strct-pw__toggle {\n position: absolute;\n right: 4px;\n top: 50%;\n transform: translateY(-50%);\n display: inline-flex;\n padding: 5px;\n border: 0;\n border-radius: 5px;\n background: transparent;\n color: var(--t2);\n cursor: pointer;\n }\n .strct-pw__toggle:hover {\n color: var(--acc);\n background: var(--bg-3);\n }\n .strct-pw__meter {\n display: flex;\n align-items: center;\n gap: 9px;\n margin-top: 7px;\n }\n .strct-pw__bars {\n display: flex;\n gap: 3px;\n flex: 1;\n }\n .strct-pw__bar {\n flex: 1;\n height: 3px;\n border-radius: 2px;\n transition: background 0.2s ease;\n }\n .strct-pw__label {\n font-size: 12px;\n font-weight: 600;\n min-width: 42px;\n text-align: end;\n }\n `,\n ],\n})\nexport class StrctPassword implements ControlValueAccessor {\n /** Placeholder text when empty. */\n readonly placeholder = input('');\n /** Show a strength meter. */\n readonly meter = input(false, { transform: booleanAttribute });\n /** Static disable flag. */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n readonly value = signal('');\n readonly revealed = signal(false);\n readonly isDisabled = signal(false);\n\n protected readonly score = computed(() => {\n const v = this.value();\n if (!v) return 0;\n let s = 0;\n if (v.length >= 8) s++;\n if (/[a-z]/.test(v) && /[A-Z]/.test(v)) s++;\n if (/\\d/.test(v)) s++;\n if (/[^A-Za-z0-9]/.test(v)) s++;\n return s;\n });\n protected readonly level = computed(() => LEVELS[this.score()]);\n\n private onChange: (value: string) => void = () => {};\n protected onTouched: () => void = () => {};\n\n onInput(event: Event): void {\n const v = (event.target as HTMLInputElement).value;\n this.value.set(v);\n this.onChange(v);\n }\n\n writeValue(value: string): void {\n this.value.set(value || '');\n }\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n forwardRef,\n input,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { StrctIcon } from '../icon/icon';\n\n/**\n * Drag-and-drop file picker. CVA value is a `File[]`.\n * <strct-file [(ngModel)]=\"files\" multiple accept=\"image/*\" />\n */\n@Component({\n selector: 'strct-file',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon],\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => StrctFile), multi: true },\n ],\n template: `\n <div\n class=\"strct-file__zone\"\n [class.strct-file__zone--drag]=\"dragging()\"\n [class.strct-file__zone--disabled]=\"isDisabled()\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"!isDisabled() && input.click()\"\n (keydown.enter)=\"!isDisabled() && input.click()\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"dragging.set(false)\"\n (drop)=\"onDrop($event)\"\n >\n <strct-icon name=\"upload\" [size]=\"20\" />\n <div class=\"strct-file__prompt\">\n <strong>Drag files here</strong> or <span class=\"strct-file__browse\">browse</span>\n </div>\n <input\n #input\n type=\"file\"\n class=\"strct-file__native\"\n [multiple]=\"multiple()\"\n [accept]=\"accept()\"\n [disabled]=\"isDisabled()\"\n (change)=\"onSelect($event)\"\n (blur)=\"onTouched()\"\n />\n </div>\n\n @if (files().length) {\n <ul class=\"strct-file__list\">\n @for (file of files(); track file.name + file.size) {\n <li class=\"strct-file__file\">\n <span class=\"strct-file__name\">{{ file.name }}</span>\n <span class=\"strct-file__size\">{{ humanSize(file.size) }}</span>\n <button\n type=\"button\"\n class=\"strct-file__remove\"\n aria-label=\"Remove\"\n (click)=\"remove(file)\"\n >\n <strct-icon name=\"close\" [size]=\"12\" />\n </button>\n </li>\n }\n </ul>\n }\n `,\n host: { class: 'strct-file' },\n styles: [\n `\n .strct-file {\n display: block;\n width: 100%;\n max-width: 360px;\n }\n .strct-file__zone {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n padding: 22px 16px;\n text-align: center;\n cursor: pointer;\n color: var(--t2);\n background: var(--bg-2);\n border: 1px dashed var(--b3);\n border-radius: 8px;\n transition:\n border-color 0.14s ease,\n background 0.14s ease,\n color 0.14s ease;\n }\n .strct-file__zone:hover {\n border-color: var(--acc30);\n color: var(--t1);\n }\n .strct-file__zone strct-icon {\n color: var(--t3);\n }\n .strct-file__zone--drag {\n border-color: var(--acc);\n background: var(--acc-m);\n color: var(--t1);\n }\n .strct-file__zone--drag strct-icon {\n color: var(--acc);\n }\n .strct-file__zone--disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .strct-file__prompt {\n font-size: 13px;\n }\n .strct-file__browse {\n color: var(--acc);\n }\n .strct-file__native {\n display: none;\n }\n .strct-file__list {\n list-style: none;\n margin: 10px 0 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n .strct-file__file {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 7px 10px;\n font-size: 13px;\n background: var(--bg-1);\n border: 1px solid var(--b2);\n border-radius: 6px;\n }\n .strct-file__name {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--t1);\n }\n .strct-file__size {\n font-size: 12px;\n color: var(--t3);\n font-family: var(--mono);\n }\n .strct-file__remove {\n display: inline-flex;\n padding: 3px;\n border: 0;\n border-radius: 4px;\n background: transparent;\n color: var(--t3);\n cursor: pointer;\n }\n .strct-file__remove:hover {\n color: var(--critical);\n background: var(--critical-bg);\n }\n `,\n ],\n})\nexport class StrctFile implements ControlValueAccessor {\n /** Multiple. */\n readonly multiple = input(false, { transform: booleanAttribute });\n /** Accept. */\n readonly accept = input('');\n /** Static disable flag. */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n readonly files = signal<File[]>([]);\n readonly dragging = signal(false);\n readonly isDisabled = signal(false);\n\n private onChange: (value: File[]) => void = () => {};\n protected onTouched: () => void = () => {};\n\n onSelect(event: Event): void {\n const list = (event.target as HTMLInputElement).files;\n if (list) this.setFiles(Array.from(list));\n }\n\n onDragOver(event: DragEvent): void {\n if (this.isDisabled()) return;\n event.preventDefault();\n this.dragging.set(true);\n }\n\n onDrop(event: DragEvent): void {\n if (this.isDisabled()) return;\n event.preventDefault();\n this.dragging.set(false);\n const dropped = event.dataTransfer?.files;\n if (dropped?.length) this.setFiles(Array.from(dropped));\n }\n\n remove(file: File): void {\n this.setFiles(this.files().filter((f) => f !== file));\n }\n\n protected humanSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / 1024 / 1024).toFixed(1)} MB`;\n }\n\n private setFiles(incoming: File[]): void {\n const next = this.multiple() ? incoming : incoming.slice(0, 1);\n this.files.set(next);\n this.onChange(next);\n this.onTouched();\n }\n\n writeValue(value: File[]): void {\n this.files.set(Array.isArray(value) ? value : []);\n }\n registerOnChange(fn: (value: File[]) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n forwardRef,\n input,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n/** Star rating input. CVA value is the selected count (0–max). */\n@Component({\n selector: 'strct-rating',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => StrctRating), multi: true },\n ],\n template: `\n <div\n class=\"strct-rating\"\n role=\"slider\"\n [attr.aria-valuemin]=\"0\"\n [attr.aria-valuemax]=\"max()\"\n [attr.aria-valuenow]=\"value()\"\n >\n @for (star of stars(); track star) {\n <button\n type=\"button\"\n class=\"strct-rating__star\"\n [class.strct-rating__star--on]=\"star <= (hover() || value())\"\n [disabled]=\"readonly() || isDisabled()\"\n [attr.aria-label]=\"star + ' of ' + max()\"\n (mouseenter)=\"hover.set(star)\"\n (mouseleave)=\"hover.set(0)\"\n (click)=\"pick(star)\"\n >\n <svg viewBox=\"0 0 16 16\" [style.width.px]=\"size()\" [style.height.px]=\"size()\">\n <path\n d=\"M8 1.5l1.9 4 4.4.5-3.3 3 .9 4.3L8 11.2 4.1 13.3l.9-4.3-3.3-3 4.4-.5z\"\n [attr.fill]=\"star <= (hover() || value()) ? 'currentColor' : 'none'\"\n stroke=\"currentColor\"\n stroke-width=\"1.1\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n }\n </div>\n `,\n styles: [\n `\n .strct-rating {\n display: inline-flex;\n gap: 3px;\n }\n .strct-rating__star {\n display: inline-flex;\n padding: 1px;\n border: 0;\n background: transparent;\n cursor: pointer;\n color: var(--t4);\n transition:\n color 0.12s ease,\n transform 0.1s ease;\n }\n .strct-rating__star:hover:not(:disabled) {\n transform: scale(1.12);\n }\n .strct-rating__star--on {\n color: var(--warning);\n }\n .strct-rating__star:disabled {\n cursor: default;\n }\n `,\n ],\n})\nexport class StrctRating implements ControlValueAccessor {\n /** Maximum allowed value or top of the value axis. */\n readonly max = input(5);\n /** Size variant. */\n readonly size = input(18);\n /** Prevent user interaction. */\n readonly readonly = input(false, { transform: booleanAttribute });\n\n readonly value = signal(0);\n readonly hover = signal(0);\n readonly isDisabled = signal(false);\n\n protected stars(): number[] {\n return Array.from({ length: this.max() }, (_, i) => i + 1);\n }\n\n private onChange: (value: number) => void = () => {};\n private onTouched: () => void = () => {};\n\n pick(star: number): void {\n if (this.readonly() || this.isDisabled()) return;\n const next = this.value() === star ? 0 : star; // click the current star to clear\n this.value.set(next);\n this.onChange(next);\n this.onTouched();\n }\n\n writeValue(value: number): void {\n this.value.set(Number(value) || 0);\n }\n registerOnChange(fn: (value: number) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n forwardRef,\n input,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { StrctTag } from '../tag/tag';\n\n/**\n * Tag input — type a word and press Enter to add a chip; Backspace on an empty\n * field removes the last. CVA value is `string[]`.\n * <strct-chips [(ngModel)]=\"labels\" placeholder=\"Add a tag…\" />\n */\n@Component({\n selector: 'strct-chips',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctTag],\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => StrctChips), multi: true },\n ],\n template: `\n <div\n class=\"strct-chips\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"input.focus()\"\n (keydown.enter)=\"input.focus()\"\n (keydown.space)=\"input.focus()\"\n >\n @for (chip of value(); track chip) {\n <strct-tag status=\"accent\" removable (removed)=\"remove(chip)\">{{ chip }}</strct-tag>\n }\n <input\n #input\n type=\"text\"\n class=\"strct-chips__input\"\n [value]=\"draft()\"\n [placeholder]=\"value().length ? '' : placeholder()\"\n [disabled]=\"isDisabled()\"\n (input)=\"draft.set($any($event.target).value)\"\n (keydown)=\"onKeydown($event)\"\n (blur)=\"commitDraft(); onTouched()\"\n />\n </div>\n `,\n styles: [\n `\n .strct-chips {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 6px;\n width: 100%;\n max-width: 360px;\n min-height: 38px;\n padding: 5px 8px;\n background: var(--bg-2);\n border: 1px solid var(--b2);\n border-radius: 6px;\n cursor: text;\n transition:\n border-color 0.14s ease,\n box-shadow 0.14s ease;\n }\n .strct-chips:focus-within {\n border-color: var(--acc50);\n box-shadow: 0 0 0 3px var(--acc18);\n background: var(--bg-1);\n }\n .strct-chips__input {\n flex: 1;\n min-width: 80px;\n border: 0;\n outline: none;\n background: transparent;\n font-family: var(--font);\n font-size: 13px;\n color: var(--t1);\n padding: 3px 2px;\n }\n .strct-chips__input::placeholder {\n color: var(--t3);\n }\n `,\n ],\n})\nexport class StrctChips implements ControlValueAccessor {\n /** Placeholder text when empty. */\n readonly placeholder = input('');\n /** Allow duplicate tags. */\n readonly allowDuplicates = input(false);\n\n readonly value = signal<string[]>([]);\n readonly draft = signal('');\n readonly isDisabled = signal(false);\n\n private onChange: (value: string[]) => void = () => {};\n protected onTouched: () => void = () => {};\n\n onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Enter' || event.key === ',') {\n event.preventDefault();\n this.commitDraft();\n } else if (event.key === 'Backspace' && !this.draft() && this.value().length) {\n this.value.update((v) => v.slice(0, -1));\n this.emit();\n }\n }\n\n protected commitDraft(): void {\n const tag = this.draft().trim();\n if (!tag) return;\n if (this.allowDuplicates() || !this.value().includes(tag)) {\n this.value.update((v) => [...v, tag]);\n this.emit();\n }\n this.draft.set('');\n }\n\n remove(chip: string): void {\n this.value.update((v) => v.filter((c) => c !== chip));\n this.emit();\n }\n\n private emit(): void {\n this.onChange(this.value());\n }\n\n writeValue(value: string[]): void {\n this.value.set(Array.isArray(value) ? [...value] : []);\n }\n registerOnChange(fn: (value: string[]) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n ElementRef,\n computed,\n forwardRef,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n/**\n * One-time-password input — a row of single-character boxes with auto-advance,\n * backspace and paste. CVA value is the concatenated string.\n * <strct-input-otp [length]=\"6\" [(ngModel)]=\"code\" />\n */\n@Component({\n selector: 'strct-input-otp',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => StrctInputOtp), multi: true },\n ],\n template: `\n <div class=\"strct-otp\">\n @for (i of indices(); track i) {\n <input\n class=\"strct-otp__box\"\n [type]=\"masked() ? 'password' : 'text'\"\n inputmode=\"numeric\"\n autocomplete=\"one-time-code\"\n maxlength=\"1\"\n [value]=\"slots()[i] || ''\"\n [disabled]=\"isDisabled()\"\n (input)=\"onInput(i, $event)\"\n (keydown)=\"onKeydown(i, $event)\"\n (paste)=\"onPaste($event)\"\n (focus)=\"$any($event.target).select()\"\n />\n }\n </div>\n `,\n styles: [\n `\n .strct-otp {\n display: inline-flex;\n gap: 8px;\n }\n .strct-otp__box {\n width: 40px;\n height: 46px;\n text-align: center;\n font-family: var(--mono);\n font-size: 18px;\n color: var(--t1);\n background: var(--bg-2);\n border: 1px solid var(--b2);\n border-radius: 8px;\n transition:\n border-color 0.14s ease,\n box-shadow 0.14s ease,\n background 0.14s ease;\n }\n .strct-otp__box:focus {\n outline: none;\n border-color: var(--acc50);\n box-shadow: 0 0 0 3px var(--acc18);\n background: var(--bg-1);\n }\n .strct-otp__box:disabled {\n opacity: 0.5;\n }\n `,\n ],\n})\nexport class StrctInputOtp implements ControlValueAccessor {\n private readonly host = inject(ElementRef<HTMLElement>);\n /** Number of OTP boxes. */\n readonly length = input(6);\n /** Mask each box as a password dot. */\n readonly masked = input(false);\n\n readonly slots = signal<string[]>([]);\n readonly isDisabled = signal(false);\n\n protected readonly indices = computed(() => Array.from({ length: this.length() }, (_, i) => i));\n\n private onChange: (value: string) => void = () => {};\n private onTouched: () => void = () => {};\n\n onInput(i: number, event: Event): void {\n const ch = (event.target as HTMLInputElement).value.slice(-1);\n this.setSlot(i, ch);\n if (ch) this.focusBox(i + 1);\n this.emit();\n }\n\n onKeydown(i: number, event: KeyboardEvent): void {\n if (event.key === 'Backspace') {\n if (!this.slots()[i]) {\n event.preventDefault();\n this.setSlot(i - 1, '');\n this.focusBox(i - 1);\n this.emit();\n }\n } else if (event.key === 'ArrowLeft') {\n this.focusBox(i - 1);\n } else if (event.key === 'ArrowRight') {\n this.focusBox(i + 1);\n }\n }\n\n onPaste(event: ClipboardEvent): void {\n event.preventDefault();\n const text = (event.clipboardData?.getData('text') ?? '').replace(/\\s/g, '');\n if (!text) return;\n const next = Array.from({ length: this.length() }, (_, i) => text[i] ?? '');\n this.slots.set(next);\n this.focusBox(Math.min(text.length, this.length() - 1));\n this.emit();\n this.onTouched();\n }\n\n private setSlot(i: number, ch: string): void {\n if (i < 0 || i >= this.length()) return;\n const next = [...this.slots()];\n while (next.length < this.length()) next.push('');\n next[i] = ch;\n this.slots.set(next);\n }\n\n private focusBox(i: number): void {\n const el = this.host.nativeElement as HTMLElement;\n const boxes = el.querySelectorAll('.strct-otp__box');\n (boxes[i] as HTMLInputElement | undefined)?.focus();\n }\n\n private emit(): void {\n this.onChange(this.slots().join(''));\n this.onTouched();\n }\n\n writeValue(value: string): void {\n const v = value ?? '';\n this.slots.set(Array.from({ length: this.length() }, (_, i) => v[i] ?? ''));\n }\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n forwardRef,\n inject,\n input,\n signal,\n ElementRef,\n HostListener,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n/** Knob accent color variants. */\nexport type StrctKnobStatus = 'accent' | 'success' | 'warning' | 'critical';\n\nconst COLOR: Record<StrctKnobStatus, string> = {\n accent: 'var(--acc)',\n success: 'var(--success)',\n warning: 'var(--warning)',\n critical: 'var(--critical)',\n};\n\n/**\n * Rotary dial input. Drag (up/down), arrow keys, Home/End or the wheel change\n * the value. CVA-compatible.\n * <strct-knob [min]=\"0\" [max]=\"100\" [(ngModel)]=\"fanSpeed\" label=\"Fan\" />\n */\n@Component({\n selector: 'strct-knob',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => StrctKnob), multi: true },\n ],\n template: `\n <div\n class=\"strct-knob\"\n [style.width.px]=\"size()\"\n [style.height.px]=\"size()\"\n role=\"slider\"\n tabindex=\"0\"\n [attr.aria-valuemin]=\"min()\"\n [attr.aria-valuemax]=\"max()\"\n [attr.aria-valuenow]=\"value()\"\n [attr.aria-disabled]=\"isDisabled() || null\"\n (pointerdown)=\"onPointerDown($event)\"\n >\n <svg [attr.viewBox]=\"'0 0 ' + size() + ' ' + size()\">\n <g [attr.transform]=\"'rotate(135 ' + half() + ' ' + half() + ')'\">\n <circle\n class=\"strct-knob__track\"\n [attr.cx]=\"half()\"\n [attr.cy]=\"half()\"\n [attr.r]=\"radius()\"\n fill=\"none\"\n [attr.stroke-width]=\"thickness()\"\n stroke-linecap=\"round\"\n [attr.stroke-dasharray]=\"trackDash()\"\n />\n <circle\n class=\"strct-knob__value\"\n [attr.cx]=\"half()\"\n [attr.cy]=\"half()\"\n [attr.r]=\"radius()\"\n fill=\"none\"\n [attr.stroke]=\"color()\"\n [attr.stroke-width]=\"thickness()\"\n stroke-linecap=\"round\"\n [attr.stroke-dasharray]=\"valueDash()\"\n />\n </g>\n <g [attr.transform]=\"'rotate(' + pointerAngle() + ' ' + half() + ' ' + half() + ')'\">\n <line\n class=\"strct-knob__pointer\"\n [attr.x1]=\"half()\"\n [attr.y1]=\"half()\"\n [attr.x2]=\"half()\"\n [attr.y2]=\"thickness() + 3\"\n [attr.stroke]=\"color()\"\n stroke-width=\"2.5\"\n stroke-linecap=\"round\"\n />\n </g>\n </svg>\n <div class=\"strct-knob__center\">\n <div class=\"strct-knob__num\">{{ value() }}</div>\n @if (label()) {\n <div class=\"strct-knob__label\">{{ label() }}</div>\n }\n </div>\n </div>\n `,\n styles: [\n `\n .strct-knob {\n position: relative;\n display: inline-flex;\n cursor: ns-resize;\n user-select: none;\n touch-action: none;\n outline: none;\n }\n .strct-knob:focus-visible {\n border-radius: 50%;\n box-shadow: 0 0 0 3px var(--acc18);\n }\n .strct-knob[aria-disabled='true'] {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .strct-knob__track {\n stroke: var(--bg-3);\n }\n .strct-knob__value {\n transition: stroke-dasharray 0.05s linear;\n }\n .strct-knob__center {\n position: absolute;\n inset: 0;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n pointer-events: none;\n }\n .strct-knob__num {\n font-size: 18px;\n font-weight: 600;\n color: var(--t1);\n line-height: 1;\n }\n .strct-knob__label {\n font-size: 12px;\n color: var(--t2);\n margin-top: 3px;\n }\n `,\n ],\n})\nexport class StrctKnob implements ControlValueAccessor {\n private readonly elementRef = inject(ElementRef<HTMLElement>);\n\n /** Minimum allowed value. */\n readonly min = input(0);\n /** Maximum allowed value or top of the value axis. */\n readonly max = input(100);\n /** Step increment. */\n readonly step = input(1);\n /** Size variant. */\n readonly size = input(96);\n /** Stroke thickness in pixels. */\n readonly thickness = input(9);\n /** Visual status color. */\n readonly status = input<StrctKnobStatus>('accent');\n /** Label text. */\n readonly label = input('');\n\n readonly value = signal(0);\n readonly isDisabled = signal(false);\n\n protected readonly half = computed(() => this.size() / 2);\n protected readonly radius = computed(() => (this.size() - this.thickness()) / 2 - 2);\n protected readonly color = computed(() => COLOR[this.status()]);\n\n private readonly fraction = computed(() => {\n const span = this.max() - this.min();\n return span <= 0 ? 0 : (this.value() - this.min()) / span;\n });\n private readonly circumference = computed(() => 2 * Math.PI * this.radius());\n\n protected readonly trackDash = computed(() => {\n const c = this.circumference();\n return `${0.75 * c} ${c}`;\n });\n protected readonly valueDash = computed(() => {\n const c = this.circumference();\n return `${this.fraction() * 0.75 * c} ${c}`;\n });\n /** Pointer rotation: -135° (start, lower-left) to +135° (end, lower-right). */\n protected readonly pointerAngle = computed(() => -135 + this.fraction() * 270);\n\n private onChange: (value: number) => void = () => {};\n private onTouched: () => void = () => {};\n\n private dragStartY = 0;\n private dragStartValue = 0;\n private readonly onMove = (e: PointerEvent) => {\n const span = this.max() - this.min();\n const delta = (this.dragStartY - e.clientY) / 150; // 150px ≈ full range\n this.setValue(this.dragStartValue + delta * span);\n };\n private readonly onUp = () => {\n window.removeEventListener('pointermove', this.onMove);\n window.removeEventListener('pointerup', this.onUp);\n this.onTouched();\n };\n\n protected onPointerDown(event: PointerEvent): void {\n if (this.isDisabled()) return;\n event.preventDefault();\n (this.elementRef.nativeElement.firstElementChild as HTMLElement)?.focus?.();\n this.dragStartY = event.clientY;\n this.dragStartValue = this.value();\n window.addEventListener('pointermove', this.onMove);\n window.addEventListener('pointerup', this.onUp);\n }\n\n @HostListener('keydown', ['$event'])\n protected onKeydown(event: KeyboardEvent): void {\n if (this.isDisabled()) return;\n const s = this.step();\n let handled = true;\n switch (event.key) {\n case 'ArrowUp':\n case 'ArrowRight':\n this.setValue(this.value() + s);\n break;\n case 'ArrowDown':\n case 'ArrowLeft':\n this.setValue(this.value() - s);\n break;\n case 'Home':\n this.setValue(this.min());\n break;\n case 'End':\n this.setValue(this.max());\n break;\n default:\n handled = false;\n }\n if (handled) {\n event.preventDefault();\n this.onTouched();\n }\n }\n\n @HostListener('wheel', ['$event'])\n protected onWheel(event: WheelEvent): void {\n if (this.isDisabled()) return;\n event.preventDefault();\n this.setValue(this.value() + (event.deltaY < 0 ? this.step() : -this.step()));\n this.onTouched();\n }\n\n private setValue(raw: number): void {\n const step = this.step();\n const snapped = Math.round(raw / step) * step;\n const clamped = Math.max(this.min(), Math.min(this.max(), snapped));\n if (clamped !== this.value()) {\n this.value.set(clamped);\n this.onChange(clamped);\n }\n }\n\n writeValue(value: number): void {\n this.value.set(Math.max(this.min(), Math.min(this.max(), Number(value) || 0)));\n }\n registerOnChange(fn: (value: number) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n forwardRef,\n input,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n/** Ready-made masks for common datacenter / form fields. */\nexport const STRCT_MASKS = {\n phoneTr: '(999) 999 99 99',\n nationalIdTr: '99999999999',\n creditCard: '9999 9999 9999 9999',\n /** MAC address — 6 hex octets, e.g. 00:1B:44:11:3A:B7 */\n mac: 'HH:HH:HH:HH:HH:HH',\n /** Fibre-channel WWPN — 8 hex octets, e.g. 20:00:00:25:B5:1A:00:0F */\n wwpn: 'HH:HH:HH:HH:HH:HH:HH:HH',\n} as const;\n\n/**\n * Masked text input. Mask tokens: `9` = digit, `A` = letter, `H` = hex digit,\n * `*` = alphanumeric; every other character is a literal. CVA value is the\n * formatted string.\n * <strct-input-mask mask=\"(999) 999 99 99\" [(ngModel)]=\"phone\" />\n * <strct-input-mask mask=\"HH:HH:HH:HH:HH:HH\" uppercase [(ngModel)]=\"mac\" />\n */\n@Component({\n selector: 'strct-input-mask',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => StrctInputMask), multi: true },\n ],\n template: `\n <input\n class=\"strct-control strct-mask__input\"\n type=\"text\"\n inputmode=\"text\"\n [placeholder]=\"placeholder() || mask()\"\n [value]=\"display()\"\n [disabled]=\"isDisabled()\"\n (input)=\"onInput($event)\"\n (blur)=\"onTouched()\"\n />\n `,\n styles: [\n `\n .strct-input-mask,\n .strct-mask__input {\n display: block;\n width: 100%;\n max-width: 280px;\n }\n `,\n ],\n})\nexport class StrctInputMask implements ControlValueAccessor {\n /** Mask pattern (9=digit, A=letter, H=hex, *=alnum). */\n readonly mask = input.required<string>();\n /** Placeholder text when empty. */\n readonly placeholder = input('');\n /** Upper-case entered letters (handy for hex MAC / WWPN). */\n readonly uppercase = input(false, { transform: booleanAttribute });\n\n readonly display = signal('');\n readonly isDisabled = signal(false);\n\n private onChange: (value: string) => void = () => {};\n protected onTouched: () => void = () => {};\n\n onInput(event: Event): void {\n const el = event.target as HTMLInputElement;\n const formatted = this.format(el.value);\n this.display.set(formatted);\n // keep the field text in sync (covers rejected characters)\n el.value = formatted;\n this.onChange(formatted);\n }\n\n private isToken(c: string): boolean {\n return c === '9' || c === 'A' || c === 'H' || c === '*';\n }\n\n private matches(ch: string, token: string): boolean {\n if (token === '9') return /[0-9]/.test(ch);\n if (token === 'A') return /[a-zA-Z]/.test(ch);\n if (token === 'H') return /[0-9a-fA-F]/.test(ch);\n return /[0-9a-zA-Z]/.test(ch); // '*'\n }\n\n private format(raw: string): string {\n const mask = this.mask();\n // Pull out only the data characters (drop literals / rejected input).\n const data: string[] = [];\n for (const ch of raw) {\n if (/[0-9a-zA-Z]/.test(ch)) data.push(ch);\n }\n let out = '';\n let di = 0;\n for (let mi = 0; mi < mask.length && di < data.length; ) {\n const m = mask[mi];\n if (this.isToken(m)) {\n if (this.matches(data[di], m)) {\n out += this.uppercase() ? data[di].toUpperCase() : data[di];\n mi++;\n di++;\n } else {\n di++; // skip a data char that doesn't fit this token\n }\n } else {\n out += m; // literal\n mi++;\n }\n }\n return out;\n }\n\n writeValue(value: string): void {\n this.display.set(this.format(value ?? ''));\n }\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n ElementRef,\n HostListener,\n booleanAttribute,\n computed,\n forwardRef,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { StrctIcon } from '../icon/icon';\nimport { StrctOverlay } from '../overlay/overlay';\n\n/** One option in a combobox or similar list. */\nexport interface StrctOption {\n value: unknown;\n label: string;\n}\n\nlet comboboxCounter = 0;\n\n/**\n * Filterable single-select (autocomplete). CVA-compatible, fully keyboard\n * driven (↑/↓ to move, Enter to pick, Esc to close).\n * <strct-combobox [options]=\"opts\" [(ngModel)]=\"selected\" placeholder=\"Pick…\" />\n */\n@Component({\n selector: 'strct-combobox',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon, StrctOverlay],\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => StrctCombobox), multi: true },\n ],\n template: `\n <div #field class=\"strct-cbx__field\">\n <input\n #input\n type=\"text\"\n class=\"strct-control strct-cbx__input\"\n role=\"combobox\"\n autocomplete=\"off\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"listId\"\n [attr.aria-activedescendant]=\"\n open() && filtered().length ? listId + '-' + activeIndex() : null\n \"\n [placeholder]=\"placeholder()\"\n [value]=\"query()\"\n [disabled]=\"isDisabled()\"\n (focus)=\"openList()\"\n (input)=\"onType($event)\"\n (keydown)=\"onKeydown($event)\"\n (blur)=\"onTouched()\"\n />\n <strct-icon class=\"strct-cbx__caret\" name=\"chevronDown\" [size]=\"14\" />\n </div>\n @if (open()) {\n <div\n class=\"strct-cbx__menu\"\n role=\"listbox\"\n [id]=\"listId\"\n [strctOverlay]=\"field\"\n strctOverlayPlacement=\"bottom-start\"\n [strctOverlayMatchWidth]=\"true\"\n >\n @if (loading()) {\n <div class=\"strct-cbx__skeleton\">\n <div class=\"strct-cbx__skeleton-block\"></div>\n </div>\n } @else {\n @for (opt of filtered(); track opt.value; let i = $index) {\n <div\n class=\"strct-cbx__opt\"\n [id]=\"listId + '-' + i\"\n [class.strct-cbx__opt--active]=\"opt.value === value()\"\n [class.strct-cbx__opt--highlight]=\"i === activeIndex()\"\n role=\"option\"\n [attr.aria-selected]=\"opt.value === value()\"\n (mousedown)=\"select(opt, $event)\"\n (mousemove)=\"activeIndex.set(i)\"\n >\n {{ opt.label }}\n </div>\n } @empty {\n <div class=\"strct-cbx__empty\">No matches</div>\n }\n }\n </div>\n }\n `,\n host: { class: 'strct-cbx' },\n styles: [\n `\n /* Full width of its container by default — no artificial cap. */\n .strct-cbx {\n position: relative;\n display: block;\n width: 100%;\n }\n .strct-cbx__field {\n position: relative;\n }\n .strct-cbx__input {\n padding-inline-end: 30px;\n }\n .strct-cbx__caret {\n position: absolute;\n right: 9px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--t3);\n pointer-events: none;\n }\n /* Positioned by StrctOverlay (position: fixed, set inline) — only the\n surface styling lives here. */\n .strct-cbx__menu {\n z-index: 200;\n max-height: 220px;\n overflow-y: auto;\n padding: 4px;\n background: var(--bg-1);\n border: 1px solid var(--b2);\n border-radius: 7px;\n box-shadow: var(--shh);\n }\n .strct-cbx__opt {\n padding: 7px 10px;\n border-radius: 5px;\n cursor: pointer;\n font-size: 13px;\n color: var(--t1);\n }\n .strct-cbx__opt--highlight {\n background: var(--bg-3);\n }\n .strct-cbx__opt--active {\n color: var(--acc);\n }\n .strct-cbx__opt--active.strct-cbx__opt--highlight {\n background: var(--acc-m);\n }\n @keyframes strct-skeleton-pulse {\n 0%,\n 100% {\n opacity: 0.4;\n }\n 50% {\n opacity: 0.7;\n }\n }\n .strct-cbx__skeleton {\n padding: 9px 10px;\n }\n .strct-cbx__skeleton-block {\n height: 12px;\n background: var(--bg-3);\n border-radius: var(--radius-sm);\n animation: strct-skeleton-pulse 1.4s ease infinite;\n }\n .strct-cbx__empty {\n padding: 9px 10px;\n font-size: 13px;\n color: var(--t3);\n }\n `,\n ],\n})\nexport class StrctCombobox implements ControlValueAccessor {\n private readonly host = inject(ElementRef<HTMLElement>);\n protected readonly listId = `strct-cbx-${++comboboxCounter}`;\n\n /** Available options. */\n readonly options = input<StrctOption[]>([]);\n /** Placeholder text when empty. */\n readonly placeholder = input('');\n /** Show a skeleton placeholder while options are loading. */\n readonly loading = input(false, { transform: booleanAttribute });\n\n readonly query = signal('');\n readonly value = signal<unknown>(null);\n readonly open = signal(false);\n readonly activeIndex = signal(0);\n readonly isDisabled = signal(false);\n /** True while the user is typing a filter that hasn't been committed yet. */\n private readonly dirty = signal(false);\n\n protected readonly filtered = computed(() => {\n const q = this.dirty() ? this.query().toLowerCase().trim() : '';\n if (!q) return this.options();\n return this.options().filter((o) => o.label.toLowerCase().includes(q));\n });\n\n private onChange: (value: unknown) => void = () => {};\n protected onTouched: () => void = () => {};\n\n openList(): void {\n if (this.isDisabled()) return;\n this.open.set(true);\n this.activeIndex.set(this.indexOfValue());\n }\n\n onType(event: Event): void {\n this.dirty.set(true);\n this.query.set((event.target as HTMLInputElement).value);\n this.open.set(true);\n this.activeIndex.set(0);\n }\n\n onKeydown(event: KeyboardEvent): void {\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n if (!this.open()) return this.openList();\n this.move(1);\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.move(-1);\n break;\n case 'Enter': {\n if (!this.open()) return;\n event.preventDefault();\n const opt = this.filtered()[this.activeIndex()];\n if (opt) this.commit(opt);\n break;\n }\n case 'Escape':\n if (this.open()) {\n event.preventDefault();\n this.close();\n }\n break;\n }\n }\n\n private move(delta: number): void {\n const len = this.filtered().length;\n if (!len) return;\n this.activeIndex.set((this.activeIndex() + delta + len) % len);\n }\n\n select(opt: StrctOption, event: Event): void {\n event.preventDefault(); // keep focus, avoid blur reordering\n this.commit(opt);\n }\n\n private commit(opt: StrctOption): void {\n this.value.set(opt.value);\n this.query.set(opt.label);\n this.dirty.set(false);\n this.open.set(false);\n this.onChange(opt.value);\n this.onTouched();\n }\n\n @HostListener('document:click', ['$event'])\n protected onDocClick(event: MouseEvent): void {\n if (this.open() && !this.host.nativeElement.contains(event.target as Node)) {\n this.close();\n }\n }\n\n private close(): void {\n this.open.set(false);\n this.dirty.set(false);\n this.syncQueryToValue();\n }\n\n private indexOfValue(): number {\n const idx = this.filtered().findIndex((o) => o.value === this.value());\n return idx < 0 ? 0 : idx;\n }\n\n private syncQueryToValue(): void {\n const match = this.options().find((o) => o.value === this.value());\n this.query.set(match?.label ?? '');\n }\n\n writeValue(value: unknown): void {\n this.value.set(value);\n this.syncQueryToValue();\n }\n registerOnChange(fn: (value: unknown) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n ElementRef,\n HostListener,\n computed,\n effect,\n forwardRef,\n inject,\n input,\n signal,\n untracked,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { StrctIcon } from '../icon/icon';\nimport { StrctOverlay } from '../overlay/overlay';\n\ninterface DayCell {\n day: number;\n iso: string;\n inMonth: boolean;\n}\n\nconst MONTHS = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n];\nconst DOW = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'];\nconst DOW_FULL = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\nconst pad = (n: number) => String(n).padStart(2, '0');\nconst toIso = (y: number, m: number, d: number) => `${y}-${pad(m + 1)}-${pad(d)}`;\n\nlet dpUid = 0;\n\n/**\n * Calendar date picker. Value is an ISO `yyyy-mm-dd` string. CVA-compatible.\n * <strct-datepicker [(ngModel)]=\"date\" />\n */\n@Component({\n selector: 'strct-datepicker',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon, StrctOverlay],\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => StrctDatepicker), multi: true },\n ],\n template: `\n <div #field class=\"strct-dp__field\">\n <input\n type=\"text\"\n class=\"strct-control strct-dp__input\"\n readonly\n [value]=\"displayLabel()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"isDisabled()\"\n (click)=\"toggle()\"\n (keydown)=\"onKeydown($event)\"\n />\n <button\n type=\"button\"\n class=\"strct-dp__icon\"\n aria-label=\"Open calendar\"\n [disabled]=\"isDisabled()\"\n (click)=\"toggle()\"\n >\n <strct-icon name=\"calendar\" [size]=\"16\" />\n </button>\n </div>\n\n @if (open()) {\n <div\n class=\"strct-dp__panel\"\n role=\"dialog\"\n [attr.aria-labelledby]=\"titleId\"\n [strctOverlay]=\"field\"\n strctOverlayPlacement=\"bottom-start\"\n >\n <div class=\"strct-dp__head\">\n <button\n type=\"button\"\n class=\"strct-dp__nav\"\n aria-label=\"Previous month\"\n (click)=\"shiftMonth(-1)\"\n >\n <strct-icon name=\"chevronLeft\" [size]=\"14\" [strokeWidth]=\"1.7\" />\n </button>\n <span class=\"strct-dp__title\" [id]=\"titleId\" aria-live=\"polite\">{{ monthLabel() }}</span>\n <button\n type=\"button\"\n class=\"strct-dp__nav\"\n aria-label=\"Next month\"\n (click)=\"shiftMonth(1)\"\n >\n <strct-icon name=\"chevronRight\" [size]=\"14\" [strokeWidth]=\"1.7\" />\n </button>\n </div>\n <!-- ARIA grid (APG date-picker dialog pattern): focus roves the day\n cells; the input regains focus on close. -->\n <div class=\"strct-dp__gridwrap\" role=\"grid\" [attr.aria-labelledby]=\"titleId\">\n <div class=\"strct-dp__dow\" role=\"row\">\n @for (d of dow; track d; let i = $index) {\n <span role=\"columnheader\" [attr.aria-label]=\"dowFull[i]\" [attr.abbr]=\"dowFull[i]\">{{\n d\n }}</span>\n }\n </div>\n @for (week of weeks(); track $index) {\n <div class=\"strct-dp__grid\" role=\"row\">\n @for (cell of week; track cell.iso) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"strct-dp__day\"\n [class.strct-dp__day--muted]=\"!cell.inMonth\"\n [class.strct-dp__day--today]=\"cell.iso === today\"\n [class.strct-dp__day--focused]=\"cell.iso === focusedIso()\"\n [class.strct-dp__day--selected]=\"cell.iso === value()\"\n [attr.data-iso]=\"cell.iso\"\n [attr.tabindex]=\"cell.iso === focusedIso() ? 0 : -1\"\n [attr.aria-selected]=\"cell.iso === value()\"\n [attr.aria-current]=\"cell.iso === today ? 'date' : null\"\n [attr.aria-label]=\"cellAria(cell)\"\n (click)=\"pick(cell.iso)\"\n (keydown)=\"onKeydown($event)\"\n >\n {{ cell.day }}\n </button>\n }\n </div>\n }\n </div>\n </div>\n }\n `,\n host: { class: 'strct-dp' },\n styles: [\n `\n .strct-dp {\n position: relative;\n display: inline-block;\n width: 100%;\n max-width: 240px;\n }\n .strct-dp__field {\n position: relative;\n }\n .strct-dp__input {\n padding-inline-end: 36px;\n cursor: pointer;\n }\n .strct-dp__icon {\n position: absolute;\n right: 4px;\n top: 50%;\n transform: translateY(-50%);\n display: inline-flex;\n padding: 5px;\n border: 0;\n border-radius: 5px;\n background: transparent;\n color: var(--t2);\n cursor: pointer;\n }\n .strct-dp__icon:hover {\n color: var(--acc);\n background: var(--bg-3);\n }\n .strct-dp__panel {\n position: absolute;\n top: calc(100% + 5px);\n left: 0;\n z-index: 250;\n width: 250px;\n padding: 10px;\n background: var(--bg-1);\n border: 1px solid var(--b2);\n border-radius: 9px;\n box-shadow: var(--shh);\n }\n .strct-dp__head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 8px;\n }\n .strct-dp__title {\n font-size: 13px;\n font-weight: 600;\n color: var(--t1);\n }\n .strct-dp__nav {\n display: inline-flex;\n padding: 5px;\n border: 0;\n border-radius: 5px;\n background: transparent;\n color: var(--t2);\n cursor: pointer;\n }\n .strct-dp__nav:hover {\n color: var(--t1);\n background: var(--bg-3);\n }\n .strct-dp__dow {\n display: grid;\n grid-template-columns: repeat(7, 1fr);\n margin-bottom: 4px;\n }\n .strct-dp__dow span {\n text-align: center;\n font-size: 12px;\n font-weight: 600;\n color: var(--t3);\n padding: 4px 0;\n }\n .strct-dp__grid {\n display: grid;\n grid-template-columns: repeat(7, 1fr);\n gap: 2px;\n }\n .strct-dp__day {\n aspect-ratio: 1;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: 0;\n border-radius: 6px;\n background: transparent;\n cursor: pointer;\n font-family: var(--font);\n font-size: 12px;\n color: var(--t1);\n }\n .strct-dp__day:hover {\n background: var(--bg-3);\n }\n .strct-dp__day--muted {\n color: var(--t3);\n }\n .strct-dp__day--today {\n box-shadow: inset 0 0 0 1px var(--acc30);\n }\n .strct-dp__day--focused {\n box-shadow: inset 0 0 0 2px var(--acc);\n }\n .strct-dp__day--selected {\n background: var(--acc);\n color: var(--inv);\n }\n .strct-dp__day--selected:hover {\n background: var(--acc);\n }\n `,\n ],\n})\nexport class StrctDatepicker implements ControlValueAccessor {\n private readonly host = inject(ElementRef<HTMLElement>);\n\n /** Placeholder text when empty. */\n readonly placeholder = input('Select a date');\n protected readonly dow = DOW;\n protected readonly dowFull = DOW_FULL;\n protected readonly titleId = `strct-dp-title-${++dpUid}`;\n\n readonly value = signal('');\n readonly open = signal(false);\n readonly isDisabled = signal(false);\n /** Keyboard cursor within the open calendar. */\n readonly focusedIso = signal('');\n private readonly view = signal(this.startOfMonth(new Date()));\n\n protected get today(): string {\n const d = new Date();\n return toIso(d.getFullYear(), d.getMonth(), d.getDate());\n }\n\n protected readonly monthLabel = computed(() => {\n const v = this.view();\n return `${MONTHS[v.m]} ${v.y}`;\n });\n\n protected readonly displayLabel = computed(() => {\n const iso = this.value();\n if (!iso) return '';\n const [y, m, d] = iso.split('-').map(Number);\n return `${MONTHS[m - 1].slice(0, 3)} ${d}, ${y}`;\n });\n\n protected readonly cells = computed<DayCell[]>(() => {\n const { y, m } = this.view();\n const firstDow = new Date(y, m, 1).getDay();\n const start = new Date(y, m, 1 - firstDow);\n return Array.from({ length: 42 }, (_, i) => {\n const d = new Date(start.getFullYear(), start.getMonth(), start.getDate() + i);\n return {\n day: d.getDate(),\n iso: toIso(d.getFullYear(), d.getMonth(), d.getDate()),\n inMonth: d.getMonth() === m,\n };\n });\n });\n\n /** The 42 cells chunked into ARIA grid rows (weeks). */\n protected readonly weeks = computed<DayCell[][]>(() => {\n const all = this.cells();\n return Array.from({ length: 6 }, (_, w) => all.slice(w * 7, w * 7 + 7));\n });\n\n /** Accessible name of one day cell: \"Tuesday, March 4, 2026\". */\n protected cellAria(cell: DayCell): string {\n const [y, m, d] = cell.iso.split('-').map(Number);\n const dow = DOW_FULL[new Date(y, m - 1, d).getDay()];\n return `${dow}, ${MONTHS[m - 1]} ${d}, ${y}`;\n }\n\n private onChange: (value: string) => void = () => {};\n private onTouched: () => void = () => {};\n\n toggle(): void {\n if (this.isDisabled()) return;\n const next = !this.open();\n this.open.set(next);\n if (next) this.syncFocus();\n }\n\n shiftMonth(delta: number): void {\n const { y, m } = this.view();\n this.view.set(this.startOfMonth(new Date(y, m + delta, 1)));\n }\n\n pick(iso: string): void {\n this.value.set(iso);\n this.focusedIso.set(iso);\n const [y, m] = iso.split('-').map(Number);\n this.view.set({ y, m: m - 1 });\n this.close();\n this.onChange(iso);\n this.onTouched();\n }\n\n constructor() {\n // Roving focus: the keyboard cursor's day cell takes real focus while the\n // calendar is open (APG date-picker dialog pattern); the input gets it back\n // on close via close().\n effect(() => {\n const open = this.open();\n const iso = this.focusedIso();\n untracked(() => {\n if (!open || !iso) return;\n setTimeout(() =>\n (this.host.nativeElement as HTMLElement)\n .querySelector<HTMLButtonElement>(`.strct-dp__day[data-iso=\"${iso}\"]`)\n ?.focus(),\n );\n });\n });\n }\n\n onKeydown(event: KeyboardEvent): void {\n if (this.isDisabled()) return;\n if (!this.open()) {\n if (event.key === 'ArrowDown' || event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.toggle();\n }\n return;\n }\n switch (event.key) {\n case 'ArrowLeft':\n event.preventDefault();\n this.shiftFocus(-1);\n break;\n case 'ArrowRight':\n event.preventDefault();\n this.shiftFocus(1);\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.shiftFocus(-7);\n break;\n case 'ArrowDown':\n event.preventDefault();\n this.shiftFocus(7);\n break;\n case 'Home': {\n // Start of the focused week (APG grid pattern).\n event.preventDefault();\n this.shiftFocus(-this.focusedDow());\n break;\n }\n case 'End': {\n event.preventDefault();\n this.shiftFocus(6 - this.focusedDow());\n break;\n }\n case 'PageUp':\n event.preventDefault();\n this.shiftFocus(0, event.shiftKey ? -12 : -1); // Shift = previous year\n break;\n case 'PageDown':\n event.preventDefault();\n this.shiftFocus(0, event.shiftKey ? 12 : 1); // Shift = next year\n break;\n case 'Enter':\n case ' ':\n event.preventDefault();\n if (this.focusedIso()) this.pick(this.focusedIso());\n break;\n case 'Escape':\n event.preventDefault();\n this.close();\n break;\n }\n }\n\n /** Day-of-week (0–6) of the keyboard cursor. */\n private focusedDow(): number {\n const [y, m, d] = (this.focusedIso() || this.today).split('-').map(Number);\n return new Date(y, m - 1, d).getDay();\n }\n\n /** Close the panel and hand focus back to the input. */\n private close(): void {\n this.open.set(false);\n (this.host.nativeElement as HTMLElement)\n .querySelector<HTMLInputElement>('.strct-dp__input')\n ?.focus();\n }\n\n private syncFocus(): void {\n const base = this.value() || this.today;\n this.focusedIso.set(base);\n const [y, m] = base.split('-').map(Number);\n this.view.set({ y, m: m - 1 });\n }\n\n private shiftFocus(days: number, months = 0): void {\n const [y, m, d] = (this.focusedIso() || this.today).split('-').map(Number);\n const next = new Date(y, m - 1 + months, d + days);\n this.focusedIso.set(toIso(next.getFullYear(), next.getMonth(), next.getDate()));\n this.view.set({ y: next.getFullYear(), m: next.getMonth() });\n }\n\n @HostListener('document:click', ['$event'])\n protected onDocClick(event: MouseEvent): void {\n if (this.open() && !this.host.nativeElement.contains(event.target as Node)) {\n this.open.set(false);\n }\n }\n\n @HostListener('document:keydown.escape')\n protected onEscape(): void {\n this.open.set(false);\n }\n\n private startOfMonth(date: Date): { y: number; m: number } {\n return { y: date.getFullYear(), m: date.getMonth() };\n }\n\n writeValue(value: string): void {\n this.value.set(value || '');\n if (value) {\n const [y, m] = value.split('-').map(Number);\n if (y && m) this.view.set({ y, m: m - 1 });\n }\n }\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n ElementRef,\n HostListener,\n forwardRef,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { StrctOverlay } from '../overlay/overlay';\n\nconst DEFAULT_SWATCHES = [\n '#7b9ec8',\n '#5a7ea3',\n '#7da87e',\n '#5e8a60',\n '#bfae6a',\n '#9a8a3e',\n '#b87872',\n '#a0635c',\n '#96724e',\n '#c49a6c',\n '#8d7bc8',\n '#5a5a64',\n];\n\nconst HEX = /^#([0-9a-f]{6})$/i;\n\n/**\n * Swatch-based color picker with a hex field. CVA value is a `#rrggbb` string.\n * <strct-color-picker [(ngModel)]=\"color\" />\n */\n@Component({\n selector: 'strct-color-picker',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctOverlay],\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => StrctColorPicker), multi: true },\n ],\n template: `\n <button\n #trigger\n type=\"button\"\n class=\"strct-cp__trigger\"\n [disabled]=\"isDisabled()\"\n [attr.aria-expanded]=\"open()\"\n (click)=\"toggle()\"\n >\n <span class=\"strct-cp__swatch\" [style.background]=\"value() || 'transparent'\"></span>\n <span class=\"strct-cp__value\">{{ value() || 'Pick a color' }}</span>\n </button>\n\n @if (open()) {\n <div\n class=\"strct-cp__panel\"\n role=\"dialog\"\n [strctOverlay]=\"trigger\"\n strctOverlayPlacement=\"bottom-start\"\n >\n <div class=\"strct-cp__grid\">\n @for (color of swatches(); track color) {\n <button\n type=\"button\"\n class=\"strct-cp__chip\"\n [class.strct-cp__chip--active]=\"eq(color)\"\n [style.background]=\"color\"\n [attr.aria-label]=\"color\"\n (click)=\"pick(color)\"\n ></button>\n }\n </div>\n <input\n class=\"strct-control strct-cp__hex\"\n spellcheck=\"false\"\n placeholder=\"#000000\"\n [value]=\"draft()\"\n (input)=\"onHex($event)\"\n />\n </div>\n }\n `,\n host: { class: 'strct-cp' },\n styles: [\n `\n .strct-cp {\n position: relative;\n display: inline-block;\n }\n .strct-cp__trigger {\n display: inline-flex;\n align-items: center;\n gap: 9px;\n padding: 6px 11px 6px 7px;\n border-radius: 6px;\n cursor: pointer;\n font-family: var(--font);\n font-size: 13px;\n color: var(--t1);\n background: var(--bg-2);\n border: 1px solid var(--b2);\n }\n .strct-cp__trigger:hover {\n border-color: var(--b3);\n }\n .strct-cp__swatch {\n width: 20px;\n height: 20px;\n border-radius: 5px;\n flex-shrink: 0;\n border: 1px solid var(--b3);\n background-clip: padding-box;\n }\n .strct-cp__value {\n font-family: var(--mono);\n font-size: 12px;\n }\n .strct-cp__panel {\n position: absolute;\n top: calc(100% + 5px);\n left: 0;\n z-index: 250;\n width: 196px;\n padding: 10px;\n background: var(--bg-1);\n border: 1px solid var(--b2);\n border-radius: 9px;\n box-shadow: var(--shh);\n }\n .strct-cp__grid {\n display: grid;\n grid-template-columns: repeat(6, 1fr);\n gap: 6px;\n margin-bottom: 9px;\n }\n .strct-cp__chip {\n aspect-ratio: 1;\n border-radius: 5px;\n cursor: pointer;\n padding: 0;\n border: 1px solid var(--b2);\n background-clip: padding-box;\n transition: transform 0.12s ease;\n }\n .strct-cp__chip:hover {\n transform: scale(1.1);\n }\n .strct-cp__chip--active {\n box-shadow:\n 0 0 0 2px var(--bg-1),\n 0 0 0 4px var(--acc);\n }\n .strct-cp__hex {\n font-family: var(--mono);\n font-size: 12px;\n text-transform: lowercase;\n }\n `,\n ],\n})\nexport class StrctColorPicker implements ControlValueAccessor {\n private readonly host = inject(ElementRef<HTMLElement>);\n /** Custom palette swatches. */\n readonly swatches = input<string[]>(DEFAULT_SWATCHES);\n\n readonly value = signal('');\n readonly draft = signal('');\n readonly open = signal(false);\n readonly isDisabled = signal(false);\n\n private onChange: (value: string) => void = () => {};\n private onTouched: () => void = () => {};\n\n toggle(): void {\n if (this.isDisabled()) return;\n this.draft.set(this.value());\n this.open.update((v) => !v);\n }\n\n protected eq(color: string): boolean {\n return color.toLowerCase() === this.value().toLowerCase();\n }\n\n pick(color: string): void {\n this.commit(color);\n this.open.set(false);\n }\n\n onHex(event: Event): void {\n const raw = (event.target as HTMLInputElement).value.trim();\n this.draft.set(raw);\n if (HEX.test(raw)) this.commit(raw.toLowerCase());\n }\n\n private commit(color: string): void {\n this.value.set(color);\n this.draft.set(color);\n this.onChange(color);\n this.onTouched();\n }\n\n @HostListener('document:click', ['$event'])\n protected onDocClick(event: MouseEvent): void {\n if (this.open() && !this.host.nativeElement.contains(event.target as Node)) {\n this.open.set(false);\n }\n }\n\n @HostListener('document:keydown.escape')\n protected onEscape(): void {\n this.open.set(false);\n }\n\n writeValue(value: string): void {\n this.value.set(value || '');\n this.draft.set(value || '');\n }\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n ElementRef,\n HostListener,\n computed,\n forwardRef,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { StrctIcon } from '../icon/icon';\nimport { StrctOverlay } from '../overlay/overlay';\n\n/** One option in a cascade select. */\nexport interface StrctCascadeOption {\n label: string;\n value?: unknown;\n children?: StrctCascadeOption[];\n}\n\n/** DI token the nodes use to talk back to the host control (avoids a circular type). */\nexport abstract class StrctCascadeHost {\n abstract pick(value: unknown): void;\n abstract isSelected(value: unknown): boolean;\n}\n\n/**\n * One row in the cascade. Leaf rows select on click; group rows reveal a\n * fly-out of their children on hover. Recurses to any depth.\n */\n@Component({\n selector: 'strct-cascade-node',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon, forwardRef(() => StrctCascadeNode)],\n template: `\n <div\n class=\"strct-csn\"\n [class.strct-csn--selected]=\"isLeafSelected()\"\n role=\"menuitem\"\n tabindex=\"0\"\n (mouseenter)=\"hasChildren() && open.set(true)\"\n (mouseleave)=\"open.set(false)\"\n (click)=\"onClick($event)\"\n (keydown.enter)=\"onClick($event)\"\n (keydown.space)=\"onClick($event)\"\n >\n <span class=\"strct-csn__label\">{{ option().label }}</span>\n @if (hasChildren()) {\n <strct-icon class=\"strct-csn__arrow\" name=\"chevronRight\" [size]=\"12\" [strokeWidth]=\"1.6\" />\n }\n @if (hasChildren() && open()) {\n <div class=\"strct-csn__flyout\" role=\"menu\">\n @for (child of option().children; track child) {\n <strct-cascade-node [option]=\"child\" />\n }\n </div>\n }\n </div>\n `,\n styles: [\n `\n .strct-csn {\n position: relative;\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 7px 8px 7px 10px;\n border-radius: 5px;\n cursor: pointer;\n font-size: 13px;\n color: var(--t1);\n }\n .strct-csn:hover {\n background: var(--bg-3);\n }\n .strct-csn--selected {\n color: var(--acc);\n background: var(--acc-m);\n }\n .strct-csn__label {\n flex: 1;\n white-space: nowrap;\n }\n .strct-csn__arrow {\n color: var(--t3);\n }\n .strct-csn__flyout {\n position: absolute;\n top: -5px;\n left: 100%;\n z-index: 1;\n min-width: 160px;\n margin-inline-start: 2px;\n padding: 4px;\n background: var(--bg-1);\n border: 1px solid var(--b2);\n border-radius: 7px;\n box-shadow: var(--shh);\n }\n `,\n ],\n})\nexport class StrctCascadeNode {\n private readonly host = inject(StrctCascadeHost);\n /** Option. */\n readonly option = input.required<StrctCascadeOption>();\n readonly open = signal(false);\n\n protected readonly hasChildren = computed(() => !!this.option().children?.length);\n protected readonly isLeafSelected = computed(\n () => !this.hasChildren() && this.host.isSelected(this.option().value),\n );\n\n protected onClick(event: Event): void {\n if (this.hasChildren()) {\n event.stopPropagation(); // group rows only expand\n } else {\n this.host.pick(this.option().value);\n }\n }\n}\n\n/**\n * Hierarchical single-select — pick a leaf from nested groups (e.g. a port\n * group under a virtual switch). CVA-compatible.\n * <strct-cascade-select [options]=\"switches\" [(ngModel)]=\"portGroup\" />\n */\n@Component({\n selector: 'strct-cascade-select',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctCascadeNode, StrctIcon, StrctOverlay],\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => StrctCascadeSelect), multi: true },\n { provide: StrctCascadeHost, useExisting: forwardRef(() => StrctCascadeSelect) },\n ],\n template: `\n <button\n #trigger\n type=\"button\"\n class=\"strct-cs__trigger\"\n [attr.aria-expanded]=\"open()\"\n [disabled]=\"isDisabled()\"\n (click)=\"toggle()\"\n >\n <span class=\"strct-cs__value\" [class.strct-cs__value--empty]=\"!selectedLabel()\">\n {{ selectedLabel() || placeholder() }}\n </span>\n <strct-icon class=\"strct-cs__caret\" name=\"chevronDown\" [size]=\"14\" />\n </button>\n @if (open()) {\n <div\n class=\"strct-cs__panel\"\n role=\"menu\"\n [strctOverlay]=\"trigger\"\n strctOverlayPlacement=\"bottom-start\"\n >\n @for (opt of options(); track opt) {\n <strct-cascade-node [option]=\"opt\" />\n }\n </div>\n }\n `,\n host: { class: 'strct-cs' },\n styles: [\n `\n .strct-cs {\n position: relative;\n display: inline-block;\n width: 100%;\n max-width: 280px;\n }\n .strct-cs__trigger {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 7px 10px;\n border-radius: 6px;\n cursor: pointer;\n font-family: var(--font);\n font-size: 13px;\n color: var(--t1);\n background: var(--bg-2);\n border: 1px solid var(--b2);\n text-align: start;\n }\n .strct-cs__trigger:hover {\n border-color: var(--b3);\n }\n .strct-cs__value {\n flex: 1;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n .strct-cs__value--empty {\n color: var(--t3);\n }\n .strct-cs__caret {\n color: var(--t3);\n }\n .strct-cs__panel {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n z-index: 200;\n min-width: 180px;\n padding: 4px;\n background: var(--bg-1);\n border: 1px solid var(--b2);\n border-radius: 7px;\n box-shadow: var(--shh);\n }\n `,\n ],\n})\nexport class StrctCascadeSelect extends StrctCascadeHost implements ControlValueAccessor {\n private readonly elementRef = inject(ElementRef<HTMLElement>);\n\n /** Available options. */\n readonly options = input<StrctCascadeOption[]>([]);\n /** Placeholder text when empty. */\n readonly placeholder = input('Select…');\n\n readonly value = signal<unknown>(null);\n readonly open = signal(false);\n readonly isDisabled = signal(false);\n\n protected readonly selectedLabel = computed(() => this.findLabel(this.options(), this.value()));\n\n private onChange: (value: unknown) => void = () => {};\n private onTouched: () => void = () => {};\n\n toggle(): void {\n if (!this.isDisabled()) this.open.update((v) => !v);\n }\n\n override pick(value: unknown): void {\n this.value.set(value);\n this.open.set(false);\n this.onChange(value);\n this.onTouched();\n }\n\n override isSelected(value: unknown): boolean {\n return value !== undefined && value === this.value();\n }\n\n private findLabel(opts: StrctCascadeOption[], value: unknown): string {\n for (const o of opts) {\n if (o.value !== undefined && o.value === value) return o.label;\n if (o.children) {\n const found = this.findLabel(o.children, value);\n if (found) return found;\n }\n }\n return '';\n }\n\n @HostListener('document:click', ['$event'])\n protected onDocClick(event: MouseEvent): void {\n if (this.open() && !this.elementRef.nativeElement.contains(event.target as Node)) {\n this.open.set(false);\n }\n }\n\n @HostListener('document:keydown.escape')\n protected onEscape(): void {\n this.open.set(false);\n }\n\n writeValue(value: unknown): void {\n this.value.set(value);\n }\n registerOnChange(fn: (value: unknown) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n input,\n} from '@angular/core';\n\n/** One row in a `StrctDescriptionList` when driven by the `items` input. */\nexport interface StrctDescItem {\n label: string;\n value?: string | number;\n /** Render the value in the monospace face. */\n mono?: boolean;\n /** Dim the value (secondary information). */\n muted?: boolean;\n}\n\n/** Value alignment for the stacked (non-inline) layout. */\nexport type StrctDescAlign = 'between' | 'start';\n\n/**\n * Compact definition list: aligned `label : value` rows with an optional trailing\n * slot. The `inline` variant is the horizontal \"stat strip\" (label-value pairs in\n * a row). Replaces the hand-rolled `<dl>` + flex.\n *\n * Drive it with the `items` input, or project `<strct-desc>` rows so a value can\n * host a badge, icon or any rich content:\n *\n * <strct-description-list>\n * <strct-desc label=\"IPv4\" mono>172.16.75.100/24</strct-desc>\n * <strct-desc label=\"IPv6\"><strct-badge status=\"success\">Enabled</strct-badge></strct-desc>\n * </strct-description-list>\n *\n * <strct-description-list [items]=\"[{ label: 'Gateway', value: '172.16.75.2', mono: true }]\" />\n */\n@Component({\n selector: 'strct-description-list',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n @for (item of items(); track $index) {\n <div\n class=\"strct-desc\"\n [class.strct-desc--mono]=\"item.mono\"\n [class.strct-desc--muted]=\"item.muted\"\n >\n <span class=\"strct-desc__label\">{{ item.label }}</span>\n <span class=\"strct-desc__value\">{{ item.value }}</span>\n </div>\n }\n <ng-content />\n `,\n host: {\n class: 'strct-dl',\n '[class.strct-dl--inline]': 'inline()',\n '[class.strct-dl--start]': \"align() === 'start'\",\n },\n styles: [\n `\n .strct-dl {\n display: flex;\n flex-direction: column;\n min-width: 0;\n }\n .strct-dl--inline {\n flex-direction: row;\n flex-wrap: wrap;\n gap: var(--space-3) var(--space-5);\n align-items: flex-start;\n }\n\n /* ── A single row / pair ──────────────────────────────────── */\n .strct-desc {\n display: flex;\n align-items: baseline;\n gap: var(--space-3);\n padding: 6px 0;\n font-size: var(--text-md);\n min-width: 0;\n }\n /* Stacked default: label left, value right. */\n .strct-dl:not(.strct-dl--inline) .strct-desc {\n justify-content: space-between;\n }\n .strct-dl:not(.strct-dl--inline) .strct-desc + .strct-desc {\n border-top: 1px solid var(--b1);\n }\n .strct-dl--start .strct-desc {\n justify-content: flex-start;\n }\n\n /* Inline stat strip: small label caption above the value. */\n .strct-dl--inline .strct-desc {\n flex-direction: column;\n align-items: flex-start;\n gap: 3px;\n padding: 0;\n }\n\n .strct-desc__label {\n color: var(--t3);\n font-size: var(--text-sm);\n font-weight: 500;\n flex-shrink: 0;\n white-space: nowrap;\n }\n .strct-desc__value {\n color: var(--t1);\n min-width: 0;\n text-align: end;\n }\n .strct-dl--inline .strct-desc__value,\n .strct-dl--start .strct-desc__value {\n text-align: start;\n }\n .strct-desc--mono .strct-desc__value {\n font-family: var(--mono);\n font-size: var(--text-sm);\n }\n .strct-desc--muted .strct-desc__value {\n color: var(--t3);\n }\n /* Collapse an empty value wrapper (e.g. items with no value). */\n .strct-desc__value:empty {\n display: none;\n }\n `,\n ],\n})\nexport class StrctDescriptionList {\n /** Rows, as an alternative to projecting `<strct-desc>` children. */\n readonly items = input<StrctDescItem[]>([]);\n /** Horizontal stat-strip layout instead of stacked rows. */\n readonly inline = input(false, { transform: booleanAttribute });\n /** Value alignment in stacked mode. */\n readonly align = input<StrctDescAlign>('between');\n}\n\n/**\n * One projected `label → value` row inside a `<strct-description-list>`. The\n * value is whatever you project, so it can host a badge, icon or formatted text.\n */\n@Component({\n selector: 'strct-desc',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n <span class=\"strct-desc__label\">{{ label() }}</span>\n <span class=\"strct-desc__value\"><ng-content /></span>\n `,\n host: {\n class: 'strct-desc',\n '[class.strct-desc--mono]': 'mono()',\n '[class.strct-desc--muted]': 'muted()',\n },\n})\nexport class StrctDesc {\n /** The row's label. */\n readonly label = input.required<string>();\n /** Render the projected value in the monospace face. */\n readonly mono = input(false, { transform: booleanAttribute });\n /** Dim the projected value. */\n readonly muted = input(false, { transform: booleanAttribute });\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n Directive,\n TemplateRef,\n booleanAttribute,\n computed,\n contentChildren,\n inject,\n input,\n} from '@angular/core';\n\n/** Column definition for the table. */\nexport interface StrctColumn {\n key: string;\n label: string;\n align?: 'start' | 'center' | 'end';\n width?: string;\n}\n\n/** Shorthand for a record-shaped table/datagrid row. */\nexport type StrctRow = Record<string, unknown>;\n\n/** Context passed to a per-column cell template. */\nexport interface StrctCellContext {\n /** The row object. */\n $implicit: StrctRow;\n /** The raw value for this column (`row[column.key]`). */\n value: unknown;\n /** The column definition. */\n column: StrctColumn;\n}\n\n/**\n * Per-column cell template for `strct-table` / `strct-datagrid`. The column key\n * is the directive value; the row, value and column are the template context:\n *\n * <ng-template strctCell=\"status\" let-row let-value=\"value\">\n * <strct-badge [status]=\"row['success'] ? 'success' : 'critical'\">{{ value }}</strct-badge>\n * </ng-template>\n */\n@Directive({ selector: '[strctCell]' })\nexport class StrctCellDef {\n /** Key. */\n readonly key = input.required<string>({ alias: 'strctCell' });\n readonly template = inject<TemplateRef<StrctCellContext>>(TemplateRef);\n}\n\n/**\n * Declarative data table. Cells render `row[col.key]` as text by default; supply\n * a `*strctCell` template per column for custom content.\n * <strct-table [columns]=\"cols\" [rows]=\"data\" hover />\n */\n@Component({\n selector: 'strct-table',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet],\n template: `\n <table class=\"strct-table\">\n <thead>\n <tr>\n @for (col of columns(); track col.key) {\n <th [style.text-align]=\"col.align ?? 'start'\" [style.width]=\"col.width\">\n {{ col.label }}\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @if (loading()) {\n @for (_ of [1, 2, 3]; track $index) {\n <tr class=\"strct-table__skeleton-row\">\n @for (col of columns(); track col.key) {\n <td [style.text-align]=\"col.align ?? 'start'\">\n <div class=\"strct-table__skeleton-block\"></div>\n </td>\n }\n </tr>\n }\n } @else {\n @for (row of rows(); track $index) {\n <tr>\n @for (col of columns(); track col.key) {\n <td [style.text-align]=\"col.align ?? 'start'\">\n @if (cellTemplate(col.key); as tpl) {\n <ng-container\n [ngTemplateOutlet]=\"tpl\"\n [ngTemplateOutletContext]=\"{\n $implicit: row,\n value: row[col.key],\n column: col,\n }\"\n />\n } @else {\n {{ row[col.key] }}\n }\n </td>\n }\n </tr>\n } @empty {\n <tr>\n <td class=\"strct-table__empty\" [attr.colspan]=\"columns().length\">\n {{ emptyText() }}\n </td>\n </tr>\n }\n }\n </tbody>\n </table>\n `,\n host: {\n class: 'strct-table-host',\n tabindex: '0',\n role: 'region',\n 'aria-label': 'Table',\n '[class.strct-table-host--striped]': 'striped()',\n '[class.strct-table-host--hover]': 'hover()',\n },\n styles: [\n `\n .strct-table-host {\n display: block;\n overflow-x: auto;\n }\n .strct-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n border: 1px solid var(--b2);\n border-radius: 8px;\n overflow: hidden;\n }\n .strct-table th,\n .strct-table td {\n padding: 9px 13px;\n text-align: start;\n border-bottom: 1px solid var(--b1);\n }\n .strct-table th {\n font-size: 12px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.4px;\n color: var(--t2);\n background: var(--bg-2);\n }\n .strct-table td {\n color: var(--t1);\n }\n .strct-table tbody tr:last-child td {\n border-bottom: 0;\n }\n .strct-table-host--striped tbody tr:nth-child(even) td {\n background: var(--bg-2);\n }\n .strct-table-host--hover tbody tr:hover td {\n background: var(--acc-s);\n }\n @keyframes strct-skeleton-pulse {\n 0%,\n 100% {\n opacity: 0.4;\n }\n 50% {\n opacity: 0.7;\n }\n }\n .strct-table__skeleton-block {\n height: 12px;\n background: var(--bg-3);\n border-radius: var(--radius-sm);\n animation: strct-skeleton-pulse 1.4s ease infinite;\n }\n .strct-table__skeleton-row td {\n border-bottom: 1px solid var(--b1);\n }\n .strct-table__empty {\n text-align: center;\n color: var(--t3);\n padding: 22px;\n }\n `,\n ],\n})\nexport class StrctTable {\n /** Column definitions. */\n readonly columns = input.required<StrctColumn[]>();\n /** Data rows. */\n readonly rows = input.required<StrctRow[]>();\n /** Enable zebra-striping. */\n readonly striped = input(false, { transform: booleanAttribute });\n /** Highlight rows on hover. */\n readonly hover = input(false, { transform: booleanAttribute });\n /** Message shown when there are no rows. */\n readonly emptyText = input('No data');\n /** Show skeleton rows while data is loading. */\n readonly loading = input(false, { transform: booleanAttribute });\n\n private readonly cellDefs = contentChildren(StrctCellDef);\n private readonly cellMap = computed(() => {\n const m = new Map<string, TemplateRef<StrctCellContext>>();\n for (const d of this.cellDefs()) m.set(d.key(), d.template);\n return m;\n });\n\n protected cellTemplate(key: string): TemplateRef<StrctCellContext> | null {\n return this.cellMap().get(key) ?? null;\n }\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n Directive,\n TemplateRef,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n contentChild,\n contentChildren,\n effect,\n inject,\n input,\n model,\n output,\n signal,\n untracked,\n} from '@angular/core';\nimport { StrctIcon } from '../icon/icon';\nimport { StrctPagination } from '../pagination/pagination';\n\n/** Every user-visible / assistive string in the grid, overridable for i18n. */\nexport interface StrctDatagridLabels {\n row: string;\n rows: string;\n selected: string;\n selectAll: string;\n selectRow: string;\n openDetail: string;\n toggleDetail: string;\n closeDetail: string;\n rowActions: string;\n chooseColumns: string;\n refresh: string;\n actions: string;\n}\n\nconst DG_LABELS: StrctDatagridLabels = {\n row: 'row',\n rows: 'rows',\n selected: 'selected',\n selectAll: 'Select all rows on this page',\n selectRow: 'Select row',\n openDetail: 'Open detail',\n toggleDetail: 'Toggle detail',\n closeDetail: 'Close detail',\n rowActions: 'Row actions',\n chooseColumns: 'Choose columns',\n refresh: 'Refresh data',\n actions: 'Actions',\n};\nimport { StrctCheckbox } from '../forms/checkbox';\nimport { StrctButton, StrctButtonGroup } from '../button/button';\nimport { StrctCellContext, StrctCellDef, StrctRow } from '../table/table';\nimport { StrctMenuItem, StrctMenuService } from '../context-menu/menu';\n\n/** Resolves a stable identity for a row: a property key, or a function. */\nexport type StrctRowId = string | ((row: StrctRow) => unknown);\n\n/** Column definition for the datagrid. */\nexport interface StrctDatagridColumn {\n key: string;\n label: string;\n sortable?: boolean;\n align?: 'start' | 'center' | 'end';\n width?: string;\n /** Allow the user to resize this column by dragging its right edge.\n * Defaults to the global {@link StrctDatagrid#resizable} setting. */\n resizable?: boolean;\n /**\n * Freeze this column against horizontal scroll. Mark **leading** columns\n * (utility columns freeze automatically alongside). Give every sticky column\n * except the last an explicit px `width` so offsets stay exact.\n */\n sticky?: boolean;\n}\n\ntype SortDir = 'asc' | 'desc';\n\n/** What the grid wants loaded in server-side (`lazy`) mode. */\nexport interface StrctDatagridLazyState {\n /** 1-based page. */\n page: number;\n pageSize: number;\n sortKey: string | null;\n sortDir: SortDir;\n}\n\n/** Persistable user column preferences (widths from resize, hidden from the chooser). */\nexport interface StrctDatagridColumnState {\n widths?: Record<string, number>;\n hidden?: string[];\n}\n\n/** Utility-column widths used when sticky columns are active (px). */\nconst UTIL_W = { detail: 36, expand: 36, sel: 40 } as const;\n/** Fallback width for a sticky column without an explicit px width. */\nconst STICKY_FALLBACK_W = 120;\n\n/**\n * Marks the expandable-row detail template. The row is the template's implicit\n * context: `<ng-template strctRowDetail let-row> … {{ row['name'] }} … </ng-template>`.\n */\n@Directive({ selector: '[strctRowDetail]' })\nexport class StrctRowDetailDef {\n readonly template = inject(TemplateRef);\n}\n\n/** Marks the persistent action-bar (toolbar) content shown above the grid. */\n@Directive({ selector: '[strctDatagridActionBar]' })\nexport class StrctDatagridActionBar {}\n\n/**\n * Interactive data table: sortable columns, row selection, expandable detail\n * rows, a batch action bar and built-in paging.\n * <strct-datagrid [columns]=\"cols\" [rows]=\"data\" selectable expandable [pageSize]=\"10\">\n * <button strct-button strctDatagridActions size=\"sm\">Migrate</button>\n * <ng-template strctRowDetail let-row> … </ng-template>\n * </strct-datagrid>\n */\n@Component({\n selector: 'strct-datagrid',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n StrctIcon,\n StrctPagination,\n NgTemplateOutlet,\n StrctCheckbox,\n StrctButton,\n StrctButtonGroup,\n ],\n template: `\n @if (actionBarDef()) {\n <div class=\"strct-dg__toolbar\"><ng-content select=\"[strctDatagridActionBar]\" /></div>\n }\n\n <div class=\"strct-dg__layout\" [class.strct-dg__layout--paned]=\"paneOpen()\">\n <div\n class=\"strct-dg__scroll\"\n tabindex=\"0\"\n role=\"region\"\n [attr.aria-label]=\"L().rows\"\n [style.max-height.px]=\"virtual() ? viewportHeight() : null\"\n (scroll)=\"virtual() && onScroll($event)\"\n >\n <table class=\"strct-dg\">\n <thead>\n <tr>\n @if (canDetail()) {\n <th\n class=\"strct-dg__expandcol\"\n [class.strct-dg__cell--sticky]=\"stickyActive()\"\n [style.insetInlineStart.px]=\"utilLeft('detail')\"\n ></th>\n }\n @if (canExpand()) {\n <th\n class=\"strct-dg__expandcol\"\n [class.strct-dg__cell--sticky]=\"stickyActive()\"\n [style.insetInlineStart.px]=\"utilLeft('expand')\"\n ></th>\n }\n @if (selectable()) {\n <th\n class=\"strct-dg__sel\"\n [class.strct-dg__cell--sticky]=\"stickyActive()\"\n [style.insetInlineStart.px]=\"utilLeft('sel')\"\n >\n <strct-checkbox\n [ariaLabel]=\"L().selectAll\"\n [checked]=\"allPageSelected()\"\n [indeterminate]=\"somePageSelected()\"\n (checkedChange)=\"toggleAll()\"\n />\n </th>\n }\n @for (col of visibleColumns(); track col.key) {\n <th\n [style.text-align]=\"col.align ?? 'start'\"\n [style.width]=\"colWidth(col.key) ?? col.width ?? null\"\n [class.strct-dg__th--sortable]=\"col.sortable\"\n [class.strct-dg__cell--sticky]=\"isSticky(col)\"\n [class.strct-dg__cell--sticky-last]=\"col.key === lastStickyKey()\"\n [style.insetInlineStart.px]=\"stickyLeft(col.key)\"\n [attr.tabindex]=\"col.sortable ? 0 : null\"\n [attr.aria-sort]=\"col.sortable ? ariaSort(col.key) : null\"\n (click)=\"col.sortable && sortBy(col.key)\"\n (keydown.enter)=\"col.sortable && sortBy(col.key)\"\n (keydown.space)=\"col.sortable && onHeaderSpace($event, col.key)\"\n >\n <span class=\"strct-dg__hd\">\n {{ col.label }}\n @if (col.sortable) {\n <strct-icon\n class=\"strct-dg__sorticon\"\n [name]=\"sortIcon(col.key)\"\n [size]=\"13\"\n />\n }\n </span>\n @if (resizable() && col.resizable !== false) {\n <div\n class=\"strct-dg__resize\"\n (mousedown)=\"onResizeStart($event, col.key)\"\n ></div>\n }\n </th>\n }\n @if (canActions()) {\n <th class=\"strct-dg__actioncol\" [attr.aria-label]=\"L().actions\"></th>\n }\n </tr>\n </thead>\n <tbody>\n @if (loading()) {\n @for (_ of [1, 2, 3, 4, 5]; track $index) {\n <tr class=\"strct-dg__skeleton-row\">\n @if (canDetail()) {\n <td class=\"strct-dg__expandcell\"></td>\n }\n @if (canExpand()) {\n <td class=\"strct-dg__expandcell\"></td>\n }\n @if (selectable()) {\n <td class=\"strct-dg__sel\"></td>\n }\n @for (col of visibleColumns(); track col.key) {\n <td [style.text-align]=\"col.align ?? 'start'\">\n <div class=\"strct-dg__skeleton-block\"></div>\n </td>\n }\n @if (canActions()) {\n <td class=\"strct-dg__actioncell\"></td>\n }\n </tr>\n }\n } @else {\n @if (virtual() && topPad() > 0) {\n <tr class=\"strct-dg__vspacer\" aria-hidden=\"true\">\n <td [attr.colspan]=\"colspan()\" [style.height.px]=\"topPad()\"></td>\n </tr>\n }\n @for (row of renderRows(); track rowKey(row)) {\n <tr\n [class.strct-dg__row--selected]=\"isSelected(row)\"\n [class.strct-dg__row--active]=\"paneOpen() && row === activeRow()\"\n >\n @if (canDetail()) {\n <td\n class=\"strct-dg__expandcell\"\n [class.strct-dg__cell--sticky]=\"stickyActive()\"\n [style.insetInlineStart.px]=\"utilLeft('detail')\"\n >\n <button\n type=\"button\"\n class=\"strct-dg__detailbtn\"\n [class.strct-dg__detailbtn--active]=\"row === activeRow()\"\n [attr.aria-expanded]=\"row === activeRow()\"\n [attr.aria-label]=\"L().openDetail\"\n (click)=\"openDetail(row)\"\n >\n <strct-icon name=\"chevronDoubleRight\" [size]=\"13\" [strokeWidth]=\"1.6\" />\n </button>\n </td>\n }\n @if (canExpand()) {\n <td\n class=\"strct-dg__expandcell\"\n [class.strct-dg__cell--sticky]=\"stickyActive()\"\n [style.insetInlineStart.px]=\"utilLeft('expand')\"\n >\n <button\n type=\"button\"\n class=\"strct-dg__expandbtn\"\n [class.strct-dg__expandbtn--open]=\"isExpanded(row)\"\n [attr.aria-expanded]=\"isExpanded(row)\"\n [attr.aria-label]=\"L().toggleDetail\"\n (click)=\"toggleExpand(row)\"\n >\n <strct-icon name=\"chevronRight\" [size]=\"12\" [strokeWidth]=\"1.7\" />\n </button>\n </td>\n }\n @if (selectable()) {\n <td\n class=\"strct-dg__sel\"\n [class.strct-dg__cell--sticky]=\"stickyActive()\"\n [style.insetInlineStart.px]=\"utilLeft('sel')\"\n >\n <strct-checkbox\n [ariaLabel]=\"L().selectRow\"\n [checked]=\"isSelected(row)\"\n (checkedChange)=\"toggleRow(row)\"\n />\n </td>\n }\n @for (col of visibleColumns(); track col.key) {\n <td\n [style.text-align]=\"col.align ?? 'start'\"\n [class.strct-dg__cell--sticky]=\"isSticky(col)\"\n [class.strct-dg__cell--sticky-last]=\"col.key === lastStickyKey()\"\n [style.insetInlineStart.px]=\"stickyLeft(col.key)\"\n >\n @if (cellTemplate(col.key); as tpl) {\n <ng-container\n [ngTemplateOutlet]=\"tpl\"\n [ngTemplateOutletContext]=\"{\n $implicit: row,\n value: row[col.key],\n column: col,\n }\"\n />\n } @else {\n {{ row[col.key] }}\n }\n </td>\n }\n @if (canActions()) {\n <td class=\"strct-dg__actioncell\">\n <button\n type=\"button\"\n class=\"strct-dg__kebab\"\n [attr.aria-label]=\"L().rowActions\"\n (click)=\"openRowMenu(row, $event)\"\n >\n <strct-icon name=\"dots\" [size]=\"16\" />\n </button>\n </td>\n }\n </tr>\n @if (canExpand() && isExpanded(row)) {\n <tr class=\"strct-dg__detailrow\">\n <td [attr.colspan]=\"colspan()\">\n <div class=\"strct-dg__detail\">\n <ng-container\n [ngTemplateOutlet]=\"detailDef()!.template\"\n [ngTemplateOutletContext]=\"{ $implicit: row }\"\n />\n </div>\n </td>\n </tr>\n }\n } @empty {\n <tr>\n <td class=\"strct-dg__empty\" [attr.colspan]=\"colspan()\">{{ emptyText() }}</td>\n </tr>\n }\n @if (virtual() && bottomPad() > 0) {\n <tr class=\"strct-dg__vspacer\" aria-hidden=\"true\">\n <td [attr.colspan]=\"colspan()\" [style.height.px]=\"bottomPad()\"></td>\n </tr>\n }\n }\n </tbody>\n </table>\n </div>\n\n @if (paneOpen()) {\n <aside class=\"strct-dg__pane\">\n <div class=\"strct-dg__pane-head\">\n <span class=\"strct-dg__pane-title\">{{ activeRow()![columns()[0].key] }}</span>\n <button\n type=\"button\"\n class=\"strct-dg__pane-close\"\n [attr.aria-label]=\"L().closeDetail\"\n (click)=\"closePane()\"\n >\n <strct-icon name=\"close\" [size]=\"13\" />\n </button>\n </div>\n <div class=\"strct-dg__pane-body\">\n <ng-container\n [ngTemplateOutlet]=\"detailDef()!.template\"\n [ngTemplateOutletContext]=\"{ $implicit: activeRow() }\"\n />\n </div>\n </aside>\n }\n </div>\n\n @if ((pageSize() > 0 || virtual()) && !loading()) {\n <div class=\"strct-dg__foot\">\n <div class=\"strct-dg__foot-left\">\n @if (columnChooser() || sync()) {\n <div class=\"strct-dg__actions\">\n <strct-button-group>\n @if (columnChooser()) {\n <button\n strct-button\n size=\"sm\"\n [class.is-open]=\"chooserOpen()\"\n [disabled]=\"footerActionsDisabled()\"\n [attr.aria-label]=\"L().chooseColumns\"\n (click)=\"chooserOpen.set(!chooserOpen())\"\n >\n <strct-icon name=\"settings\" [size]=\"16\" />\n </button>\n }\n @if (sync()) {\n <button\n strct-button\n size=\"sm\"\n [disabled]=\"footerActionsDisabled()\"\n [attr.aria-label]=\"L().refresh\"\n (click)=\"syncChange.emit()\"\n >\n <strct-icon name=\"refresh\" [size]=\"16\" />\n </button>\n }\n </strct-button-group>\n @if (columnChooser() && chooserOpen()) {\n <div class=\"strct-dg__chooser-menu\">\n @for (col of columns(); track col.key) {\n <div class=\"strct-dg__chooser-item\">\n <strct-checkbox\n [checked]=\"!hiddenColumns().has(col.key)\"\n (checkedChange)=\"toggleColumn(col.key, $event)\"\n />\n <span>{{ col.label }}</span>\n </div>\n }\n </div>\n }\n </div>\n }\n <span class=\"strct-dg__count\">\n {{ totalCount() }} {{ totalCount() === 1 ? L().row : L().rows }}\n @if (selectedCount()) {\n <span class=\"strct-dg__count-sep\">|</span>\n <span class=\"strct-dg__count-sel\">{{ selectedCount() }} {{ L().selected }}</span>\n }\n </span>\n </div>\n <div class=\"strct-dg__foot-right\">\n @if (pageSize() > 0) {\n <strct-pagination [total]=\"totalCount()\" [pageSize]=\"pageSize()\" [(page)]=\"page\" />\n }\n </div>\n </div>\n }\n `,\n host: {\n class: 'strct-dg-host',\n '[class.strct-dg-host--compact]': 'compact()',\n '[class.strct-dg-host--singleline]': 'singleLine()',\n '[class.strct-dg-host--virtual]': 'virtual()',\n '[class.strct-dg-host--sticky]': 'stickyActive()',\n },\n styles: [\n `\n /* Enclosed chrome: the action bar, grid and footer share one frame so the\n * whole component reads as a single object on the page. */\n .strct-dg-host {\n display: block;\n border: 1px solid var(--b2);\n border-radius: 10px;\n background: var(--bg-2);\n box-shadow: var(--shadow-rest);\n }\n .strct-dg__scroll {\n flex: 1 1 auto;\n min-width: 0;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n /* Virtual mode: a fixed-height y-scroll viewport with a sticky header. */\n .strct-dg-host--virtual .strct-dg__scroll {\n overflow-y: auto;\n }\n .strct-dg-host--virtual .strct-dg thead th {\n position: sticky;\n top: 0;\n z-index: 5;\n }\n .strct-dg__vspacer td {\n padding: 0;\n border: 0;\n background: transparent;\n }\n /* Sticky cells require border-collapse: separate (collapse breaks\n position: sticky on table cells in Chromium); per-cell bottom borders\n keep the visuals identical. width: max-content lets declared column\n widths win so frozen offsets stay exact. */\n .strct-dg-host--sticky .strct-dg,\n .strct-dg-host--virtual .strct-dg {\n border-collapse: separate;\n border-spacing: 0;\n /* overflow: hidden on the table (corner rounding) would become the\n sticky containing block and defeat position: sticky entirely. */\n overflow: visible;\n border-radius: 0;\n }\n .strct-dg-host--sticky .strct-dg {\n width: max-content;\n min-width: 100%;\n }\n /* Frozen columns: pinned against horizontal scroll, opaque over content. */\n .strct-dg .strct-dg__cell--sticky {\n position: sticky;\n z-index: 3;\n }\n /* th.….--sticky (0-2-2) must beat the virtual-mode \"thead th\" rule of the\n same specificity by source order, so corner cells paint above both the\n scrolled header cells and the frozen body cells. */\n .strct-dg thead th.strct-dg__cell--sticky {\n z-index: 6;\n }\n .strct-dg .strct-dg__cell--sticky-last::after {\n content: '';\n position: absolute;\n top: 0;\n bottom: 0;\n inset-inline-end: -1px;\n width: 7px;\n pointer-events: none;\n background: linear-gradient(to right, rgba(0, 0, 0, 0.14), transparent);\n }\n [dir='rtl'] .strct-dg .strct-dg__cell--sticky-last::after {\n background: linear-gradient(to left, rgba(0, 0, 0, 0.14), transparent);\n }\n /* Fixed utility-column widths so frozen offsets stay exact. */\n .strct-dg-host--sticky .strct-dg__expandcol,\n .strct-dg-host--sticky .strct-dg__expandcell {\n width: 36px;\n min-width: 36px;\n max-width: 36px;\n box-sizing: border-box;\n }\n .strct-dg-host--sticky .strct-dg__sel {\n width: 40px;\n min-width: 40px;\n max-width: 40px;\n box-sizing: border-box;\n }\n /* Sticky header cells need an opaque ground (thead th already has bg-2;\n utility body cells inherit the row background rules below). */\n .strct-dg-host--sticky tbody .strct-dg__cell--sticky {\n background: var(--bg-1);\n }\n [data-theme='dark'] .strct-dg-host--sticky tbody .strct-dg__cell--sticky {\n background: var(--bg-3);\n }\n /* Hover / selected tints can be translucent — composite them over the\n opaque base so scrolled content never shows through a frozen cell. */\n .strct-dg-host--sticky tbody tr:hover .strct-dg__cell--sticky {\n background: linear-gradient(var(--acc-s), var(--acc-s)) var(--bg-1);\n }\n [data-theme='dark'] .strct-dg-host--sticky tbody tr:hover .strct-dg__cell--sticky {\n background: linear-gradient(var(--acc-s), var(--acc-s)) var(--bg-3);\n }\n .strct-dg-host--sticky tbody .strct-dg__row--selected .strct-dg__cell--sticky {\n background: linear-gradient(var(--acc-m), var(--acc-m)) var(--bg-1);\n }\n [data-theme='dark']\n .strct-dg-host--sticky\n tbody\n .strct-dg__row--selected\n .strct-dg__cell--sticky {\n background: linear-gradient(var(--acc-m), var(--acc-m)) var(--bg-3);\n }\n .strct-dg {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n overflow: hidden;\n background: var(--bg-2);\n }\n /* The table rounds only the frame corners it actually touches (no\n * toolbar above / no footer below); interior edges stay square. */\n .strct-dg-host:not(:has(.strct-dg__toolbar)) .strct-dg {\n border-start-start-radius: 9px;\n border-start-end-radius: 9px;\n }\n .strct-dg-host:not(:has(.strct-dg__foot)) .strct-dg {\n border-end-start-radius: 9px;\n border-end-end-radius: 9px;\n }\n .strct-dg th,\n .strct-dg td {\n padding: 9px 13px;\n text-align: start;\n border-bottom: 1px solid var(--b1);\n }\n .strct-dg tbody td {\n background: var(--bg-1);\n }\n /* In dark mode, body cells should read slightly lighter than the header\n * so the grid feels like a raised surface rather than a recessed pit. */\n [data-theme='dark'] .strct-dg tbody td {\n background: var(--bg-3);\n }\n .strct-dg-host--compact .strct-dg th,\n .strct-dg-host--compact .strct-dg td {\n padding: 5px 11px;\n }\n /* Single-line rows: cells never wrap; long values truncate with an\n * ellipsis (capped per cell) so row height stays uniform. */\n .strct-dg-host--singleline .strct-dg tbody tr:not(.strct-dg__detailrow) > td {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 360px;\n }\n .strct-dg th {\n position: relative;\n font-size: 12px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.4px;\n color: var(--t2);\n background: var(--bg-2);\n white-space: nowrap;\n user-select: none;\n }\n .strct-dg__th--sortable {\n cursor: pointer;\n }\n .strct-dg__th--sortable:hover {\n color: var(--t1);\n }\n .strct-dg__th--sortable:focus-visible {\n outline: 2px solid var(--acc50);\n outline-offset: -2px;\n }\n .strct-dg__hd {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n }\n .strct-dg__sorticon {\n color: var(--t3);\n }\n .strct-dg__th--sortable:hover .strct-dg__sorticon {\n color: var(--acc);\n }\n .strct-dg__resize {\n position: absolute;\n inset-inline-end: 0;\n top: 0;\n bottom: 0;\n width: 4px;\n cursor: col-resize;\n background: transparent;\n z-index: 2;\n }\n .strct-dg__resize:hover {\n background: var(--acc);\n }\n .strct-dg td {\n color: var(--t1);\n }\n .strct-dg tbody tr:last-child td {\n border-bottom: 0;\n }\n .strct-dg tbody tr:not(.strct-dg__detailrow):hover td {\n background: var(--acc-s);\n }\n .strct-dg__row--selected td {\n background: var(--acc-m);\n }\n .strct-dg__sel {\n width: 1%;\n white-space: nowrap;\n }\n .strct-dg__sel input {\n accent-color: var(--acc);\n width: 15px;\n height: 15px;\n cursor: pointer;\n }\n\n .strct-dg__expandcol,\n .strct-dg__expandcell {\n width: 1%;\n white-space: nowrap;\n }\n .strct-dg__actioncol,\n .strct-dg__actioncell {\n width: 1%;\n white-space: nowrap;\n text-align: end;\n }\n .strct-dg__kebab {\n display: inline-flex;\n padding: 4px;\n border: 0;\n border-radius: 5px;\n background: transparent;\n color: var(--t3);\n cursor: pointer;\n transition:\n color 0.14s ease,\n background 0.14s ease;\n }\n .strct-dg__kebab:hover {\n color: var(--t1);\n background: var(--bg-3);\n }\n .strct-dg__expandbtn {\n display: inline-flex;\n padding: 3px;\n border: 0;\n border-radius: 4px;\n background: transparent;\n color: var(--t3);\n cursor: pointer;\n transition:\n transform 0.15s ease,\n color 0.15s ease;\n }\n .strct-dg__expandbtn:hover {\n color: var(--t1);\n background: var(--bg-3);\n }\n .strct-dg__expandbtn--open {\n transform: rotate(90deg);\n color: var(--acc);\n }\n .strct-dg__detailbtn {\n display: inline-flex;\n padding: 3px;\n border: 0;\n border-radius: 4px;\n background: transparent;\n color: var(--t3);\n cursor: pointer;\n transition:\n color 0.14s ease,\n background 0.14s ease;\n }\n .strct-dg__detailbtn:hover {\n color: var(--acc);\n background: var(--bg-3);\n }\n .strct-dg__detailbtn--active {\n color: var(--acc);\n background: var(--acc-m);\n }\n .strct-dg__detailrow td {\n background: var(--bg-2);\n padding: 0;\n }\n .strct-dg__detail {\n padding: 14px 16px;\n font-size: 13px;\n color: var(--t2);\n }\n\n /* Detail pane: grid collapses to one column, content opens beside it. */\n .strct-dg__layout {\n display: flex;\n align-items: flex-start;\n min-width: 0;\n }\n .strct-dg__layout--paned {\n gap: 0;\n }\n .strct-dg__layout--paned .strct-dg__scroll {\n flex: 0 0 auto;\n width: 260px;\n min-width: 260px;\n max-width: 260px;\n }\n .strct-dg__layout--paned .strct-dg {\n width: 260px;\n min-width: 260px;\n max-width: 260px;\n flex-shrink: 0;\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n .strct-dg__row--clickable {\n cursor: pointer;\n }\n .strct-dg__row--active td {\n background: var(--acc-m);\n }\n /* Caret on the active row that points toward the open detail pane. */\n .strct-dg__layout--paned .strct-dg__row--active td:last-child {\n position: relative;\n padding-inline-end: 26px;\n }\n .strct-dg__layout--paned .strct-dg__row--active td:last-child::after {\n content: '';\n position: absolute;\n right: 11px;\n top: 50%;\n width: 6px;\n height: 6px;\n border-top: 1.6px solid var(--acc);\n border-inline-end: 1.6px solid var(--acc);\n transform: translateY(-50%) rotate(45deg);\n }\n .strct-dg__pane {\n flex: 1;\n min-width: 0;\n align-self: stretch;\n background: var(--bg-1);\n border: 1px solid var(--b2);\n border-inline-start: 2px solid var(--acc);\n border-radius: 8px;\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n overflow: hidden;\n animation: strct-dg-pane-in 0.14s ease;\n }\n .strct-dg__pane-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n padding: 11px 14px;\n border-bottom: 1px solid var(--b1);\n font-size: 13px;\n font-weight: 600;\n color: var(--t1);\n }\n .strct-dg__pane-close {\n display: inline-flex;\n padding: 3px;\n border: 0;\n border-radius: 4px;\n background: transparent;\n color: var(--t3);\n cursor: pointer;\n }\n .strct-dg__pane-close:hover {\n color: var(--t1);\n background: var(--bg-3);\n }\n .strct-dg__pane-body {\n padding: 14px 16px;\n font-size: 13px;\n color: var(--t2);\n }\n @keyframes strct-dg-pane-in {\n from {\n opacity: 0;\n transform: translateX(8px);\n }\n }\n\n @keyframes strct-skeleton-pulse {\n 0%,\n 100% {\n opacity: 0.4;\n }\n 50% {\n opacity: 0.7;\n }\n }\n .strct-dg__skeleton-block {\n height: 12px;\n background: var(--bg-3);\n border-radius: var(--radius-sm);\n animation: strct-skeleton-pulse 1.4s ease infinite;\n }\n .strct-dg__skeleton-row td {\n border-bottom: 1px solid var(--b1);\n }\n .strct-dg__empty {\n text-align: center;\n color: var(--t3);\n padding: 22px;\n }\n /* Persistent action bar (toolbar) above the grid — always visible. */\n .strct-dg__toolbar {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n padding: 9px 14px;\n border-bottom: 1px solid var(--b2);\n }\n\n .strct-dg__foot {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 9px 14px;\n border-top: 1px solid var(--b2);\n flex-wrap: wrap;\n }\n .strct-dg__foot-left {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n .strct-dg__foot-right {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n .strct-dg__actions {\n position: relative;\n }\n .strct-dg__chooser-menu {\n position: absolute;\n bottom: calc(100% + 6px);\n left: 0;\n z-index: 10;\n min-width: 180px;\n background: var(--bg-1);\n border: 1px solid var(--b2);\n border-radius: 8px;\n box-shadow: var(--shadow-pop);\n padding: 6px;\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n .strct-dg__chooser-menu--right {\n inset-inline-start: auto;\n inset-inline-end: 0;\n }\n .strct-dg__chooser-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 5px 8px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 12px;\n color: var(--t1);\n transition: background 0.1s ease;\n user-select: none;\n }\n .strct-dg__chooser-item:hover {\n background: var(--bg-3);\n }\n .strct-dg__count {\n font-size: 12px;\n color: var(--t2);\n }\n .strct-dg__count-sep {\n margin: 0 8px;\n color: var(--b2);\n }\n .strct-dg__count-sel {\n color: var(--acc);\n }\n `,\n ],\n})\nexport class StrctDatagrid {\n /** Column definitions. */\n readonly columns = input.required<StrctDatagridColumn[]>();\n /** Data rows. */\n readonly rows = input.required<StrctRow[]>();\n /** Rows per page (0 disables paging). */\n readonly pageSize = input(0);\n /** Enable row selection. */\n readonly selectable = input(false, { transform: booleanAttribute });\n /** Expand a row in place to reveal its detail template below it. */\n readonly expandable = input(false, { transform: booleanAttribute });\n /** Collapse the grid to a single column and open a side detail pane for the\n * clicked row (distinct from {@link expandable}). */\n readonly detailPane = input(false, { transform: booleanAttribute });\n /** Compact density mode. */\n readonly compact = input(false, { transform: booleanAttribute });\n /**\n * Keep every row exactly one line tall: cell content never wraps — long values\n * truncate with an ellipsis instead — so tall content can't distort the grid.\n */\n readonly singleLine = input(false, { transform: booleanAttribute });\n /** Message shown when there are no rows. */\n readonly emptyText = input('No data');\n /** Show skeleton rows while data is loading. */\n readonly loading = input(false, { transform: booleanAttribute });\n /** Enable column resizing by dragging column headers. */\n readonly resizable = input(false, { transform: booleanAttribute });\n /** Show a column-chooser dropdown in the footer. */\n readonly columnChooser = input(false, { transform: booleanAttribute });\n /** Show a refresh button in the footer. */\n readonly sync = input(false, { transform: booleanAttribute });\n /** Disable all footer action buttons (sync, column chooser, etc.). */\n readonly footerActionsDisabled = input(false, { transform: booleanAttribute });\n /**\n * Stable row identity (property key or function). Set this for live-refreshing\n * data so selection, expansion and the active detail row survive re-fetches\n * that replace the row objects. Defaults to object identity.\n */\n readonly rowId = input<StrctRowId | null>(null);\n /**\n * Per-row action menu resolver. When set, each row gets a trailing actions\n * column with a vertical-dots (kebab) button that opens this row's menu.\n * [rowActions]=\"(row) => [{ label: 'Open', action: () => open(row) }, …]\"\n */\n readonly rowActions = input<((row: StrctRow) => StrctMenuItem[]) | null>(null);\n /**\n * Seed the row selection. Each value is a row id (matching {@link rowId}); the\n * grid checks those rows when this input is set or changes. Requires\n * `selectable`. Assigning a new array (e.g. when opening a dialog) re-seeds the\n * selection; the user's subsequent toggles are preserved until the next change.\n */\n readonly initialSelection = input<readonly unknown[] | null>(null);\n /** Override any user-visible / assistive string (partial; merged over defaults). */\n readonly labels = input<Partial<StrctDatagridLabels>>({});\n /** Effective labels (defaults + overrides). */\n protected readonly L = computed(() => ({ ...DG_LABELS, ...this.labels() }));\n /**\n * Virtual scrolling for large data sets: only the rows inside the viewport\n * (plus a small overscan) are in the DOM — 20k+ rows stay smooth. The scroll\n * area gets `viewportHeight` and a sticky header. Assumes uniform\n * `rowHeight`; combine with `expandable` is unsupported.\n */\n readonly virtual = input(false, { transform: booleanAttribute });\n /** Scroll viewport height in px (virtual mode). */\n readonly viewportHeight = input(360);\n /** Uniform row height in px (virtual mode; tune when `compact`). */\n readonly rowHeight = input(38);\n /**\n * Server-side mode: the grid never sorts or slices `rows` itself — it shows\n * them as given and emits `(lazyLoad)` with `{ page, pageSize, sortKey,\n * sortDir }` whenever the user pages or sorts (and once on init). Provide\n * `total` so the pager and count reflect the full server-side set.\n */\n readonly lazy = input(false, { transform: booleanAttribute });\n /** Total row count on the server (lazy mode). */\n readonly total = input<number | null>(null);\n /**\n * Persist the user's column widths + hidden columns under this key in\n * localStorage (`strct-dg:<key>`), restoring them on init. For full control\n * use the two-way `columnState` instead (both may be combined).\n */\n readonly stateKey = input<string | null>(null);\n /** User column preferences (two-way): widths from resize, hidden from the chooser. */\n readonly columnState = model<StrctDatagridColumnState | null>(null);\n /** Emitted when the selection changes. */\n readonly selectionChange = output<StrctRow[]>();\n /** Emitted when the refresh button is clicked. */\n readonly syncChange = output<void>();\n /** Emitted when a row's action-menu item is chosen. */\n readonly rowAction = output<{ row: StrctRow; item: StrctMenuItem }>();\n /** Server-side data request (lazy mode): load this page / sort and set `rows`. */\n readonly lazyLoad = output<StrctDatagridLazyState>();\n\n private readonly menu = inject(StrctMenuService);\n\n protected readonly detailDef = contentChild(StrctRowDetailDef);\n protected readonly actionBarDef = contentChild(StrctDatagridActionBar);\n private readonly cellDefs = contentChildren(StrctCellDef);\n private readonly cellMap = computed(() => {\n const m = new Map<string, TemplateRef<StrctCellContext>>();\n for (const d of this.cellDefs()) m.set(d.key(), d.template);\n return m;\n });\n\n readonly page = signal(1);\n private readonly sort = signal<{ key: string | null; dir: SortDir }>({ key: null, dir: 'asc' });\n /** Selection / expansion are tracked by row id (see {@link rowId}). */\n private readonly selected = signal<Set<unknown>>(new Set());\n protected readonly selectedCount = computed(() => this.selected().size);\n private readonly expandedRows = signal<Set<unknown>>(new Set());\n private readonly columnWidths = signal<Map<string, number>>(new Map());\n protected readonly hiddenColumns = signal<Set<string>>(new Set());\n protected readonly chooserOpen = signal(false);\n private resizeState: { key: string; startX: number; startWidth: number } | null = null;\n private readonly onMove = (e: MouseEvent) => this.onResizeMove(e);\n private readonly onUp = () => this.onResizeEnd();\n\n colWidth(key: string): string | null {\n const px = this.columnWidths().get(key);\n return px != null ? `${px}px` : null;\n }\n\n onResizeStart(e: MouseEvent, key: string) {\n e.preventDefault();\n const th = (e.target as HTMLElement).closest('th');\n if (!th) return;\n this.resizeState = { key, startX: e.clientX, startWidth: th.offsetWidth };\n document.addEventListener('mousemove', this.onMove);\n document.addEventListener('mouseup', this.onUp);\n }\n\n private onResizeMove(e: MouseEvent) {\n if (!this.resizeState) return;\n const diff = e.clientX - this.resizeState.startX;\n const newWidth = Math.max(40, this.resizeState.startWidth + diff);\n this.columnWidths.update((m) => {\n const next = new Map(m);\n next.set(this.resizeState!.key, newWidth);\n return next;\n });\n }\n\n private onResizeEnd() {\n this.resizeState = null;\n document.removeEventListener('mousemove', this.onMove);\n document.removeEventListener('mouseup', this.onUp);\n }\n\n private readonly activeId = signal<unknown>(null);\n protected readonly activeRow = computed(() => {\n const id = this.activeId();\n if (id == null) return null;\n return this.rows().find((r) => this.idOf(r) === id) ?? null;\n });\n\n protected readonly canExpand = computed(\n () => this.expandable() && !this.detailPane() && !!this.detailDef(),\n );\n protected readonly canDetail = computed(() => this.detailPane() && !!this.detailDef());\n protected readonly paneOpen = computed(\n () => this.detailPane() && !!this.detailDef() && !!this.activeRow(),\n );\n /** Whether to render the trailing row-actions (kebab) column. */\n protected readonly canActions = computed(() => !!this.rowActions() && !this.paneOpen());\n /** Only the first column is shown while the detail pane is open. */\n protected readonly visibleColumns = computed(() => {\n if (this.paneOpen()) return this.columns().slice(0, 1);\n const hidden = this.hiddenColumns();\n return this.columns().filter((c) => !hidden.has(c.key));\n });\n\n protected readonly sorted = computed(() => {\n // Server-side mode: rows arrive already ordered / sliced — never touch them.\n if (this.lazy()) return this.rows();\n const { key, dir } = this.sort();\n const data = [...this.rows()];\n if (!key) return data;\n const sign = dir === 'asc' ? 1 : -1;\n return data.sort((a, b) => sign * this.compare(a[key], b[key]));\n });\n\n protected readonly paged = computed(() => {\n const size = this.pageSize();\n if (this.lazy() || size <= 0) return this.sorted();\n const start = (this.page() - 1) * size;\n return this.sorted().slice(start, start + size);\n });\n\n /** Full count for the pager / footer (server total in lazy mode). */\n protected readonly totalCount = computed(() =>\n this.lazy() ? (this.total() ?? this.rows().length) : this.sorted().length,\n );\n\n // ── Virtual scrolling ──────────────────────────────────────────\n private readonly scrollTop = signal(0);\n protected onScroll(event: Event): void {\n this.scrollTop.set((event.target as HTMLElement).scrollTop);\n }\n /** Visible index window incl. overscan (virtual mode). */\n private readonly vRange = computed(() => {\n const rh = Math.max(1, this.rowHeight());\n const n = this.sorted().length;\n const start = Math.max(0, Math.floor(this.scrollTop() / rh) - 6);\n const count = Math.ceil(this.viewportHeight() / rh) + 12;\n return { start, end: Math.min(n, start + count) };\n });\n /** The rows actually rendered: the virtual window, or the current page. */\n protected readonly renderRows = computed(() =>\n this.virtual() ? this.sorted().slice(this.vRange().start, this.vRange().end) : this.paged(),\n );\n protected readonly topPad = computed(() =>\n this.virtual() ? this.vRange().start * this.rowHeight() : 0,\n );\n protected readonly bottomPad = computed(() =>\n this.virtual() ? Math.max(0, (this.sorted().length - this.vRange().end) * this.rowHeight()) : 0,\n );\n\n // ── Sticky (frozen) columns ────────────────────────────────────\n protected readonly stickyActive = computed(\n () => !this.paneOpen() && this.visibleColumns().some((c) => c.sticky),\n );\n /** Total width of the frozen utility columns (detail / expand / select). */\n private readonly utilityWidth = computed(\n () =>\n (this.canDetail() ? UTIL_W.detail : 0) +\n (this.canExpand() ? UTIL_W.expand : 0) +\n (this.selectable() ? UTIL_W.sel : 0),\n );\n /** Left offset of a frozen utility column, or null when sticky is off. */\n protected utilLeft(which: 'detail' | 'expand' | 'sel'): number | null {\n if (!this.stickyActive()) return null;\n let x = 0;\n if (which === 'detail') return x;\n if (this.canDetail()) x += UTIL_W.detail;\n if (which === 'expand') return x;\n if (this.canExpand()) x += UTIL_W.expand;\n return x;\n }\n /** Effective px width of a column (resize override → declared px → fallback). */\n private colPx(col: StrctDatagridColumn): number {\n const resized = this.columnWidths().get(col.key);\n if (resized != null) return resized;\n const m = /^(\\d+(?:\\.\\d+)?)px$/.exec(col.width ?? '');\n return m ? parseFloat(m[1]) : STICKY_FALLBACK_W;\n }\n /** key → left px for sticky data columns. */\n private readonly stickyOffsets = computed(() => {\n const map = new Map<string, number>();\n if (!this.stickyActive()) return map;\n let x = this.utilityWidth();\n for (const col of this.visibleColumns()) {\n if (!col.sticky) continue;\n map.set(col.key, x);\n x += this.colPx(col);\n }\n return map;\n });\n protected stickyLeft(key: string): number | null {\n return this.stickyOffsets().get(key) ?? null;\n }\n protected isSticky(col: StrctDatagridColumn): boolean {\n return !!col.sticky && this.stickyActive();\n }\n /** The last frozen column carries the edge shadow. */\n protected readonly lastStickyKey = computed(() => {\n let last: string | null = null;\n for (const col of this.visibleColumns()) if (col.sticky) last = col.key;\n return this.stickyActive() ? last : null;\n });\n\n protected readonly allPageSelected = computed(() => {\n const rows = this.paged();\n return rows.length > 0 && rows.every((r) => this.selected().has(this.idOf(r)));\n });\n protected readonly somePageSelected = computed(\n () => !this.allPageSelected() && this.paged().some((r) => this.selected().has(this.idOf(r))),\n );\n\n /** Resolve a row's stable identity (defaults to the row object itself). */\n private idOf(row: StrctRow): unknown {\n const id = this.rowId();\n if (id == null) return row;\n return typeof id === 'function' ? id(row) : row[id];\n }\n\n protected rowKey(row: StrctRow): unknown {\n return this.idOf(row);\n }\n\n protected cellTemplate(key: string): TemplateRef<StrctCellContext> | null {\n return this.cellMap().get(key) ?? null;\n }\n\n /** Last emitted lazy request (dedupe key). */\n private lastLazyKey = '';\n /** Last serialized column state pushed outward (loop guard). */\n private lastStateKey = '';\n\n constructor() {\n // Keep the page in range when the data set shrinks (server total in lazy mode).\n effect(() => {\n const size = this.pageSize();\n if (size <= 0) return;\n const count = this.totalCount();\n const pageCount = Math.max(1, Math.ceil(count / size));\n if (this.page() > pageCount) this.page.set(pageCount);\n });\n // Seed the selection from initialSelection (re-runs only when the input changes,\n // so a user's own toggles afterward are untouched).\n effect(() => {\n const init = this.initialSelection();\n if (init == null) return;\n untracked(() => this.selected.set(new Set(init)));\n });\n // Server-side mode: announce what to load whenever page / sort / pageSize\n // change (and once on init, so the consumer fetches the first page).\n effect(() => {\n if (!this.lazy()) return;\n const state: StrctDatagridLazyState = {\n page: this.page(),\n pageSize: this.pageSize(),\n sortKey: this.sort().key,\n sortDir: this.sort().dir,\n };\n const key = JSON.stringify(state);\n untracked(() => {\n if (key === this.lastLazyKey) return;\n this.lastLazyKey = key;\n this.lazyLoad.emit(state);\n });\n });\n // Restore persisted column preferences once, before the first render.\n const persisted = this.readPersistedState();\n if (persisted) this.applyColumnState(persisted);\n // Apply externally-driven columnState.\n effect(() => {\n const st = this.columnState();\n untracked(() => {\n if (!st || JSON.stringify(st) === this.lastStateKey) return;\n this.lastStateKey = JSON.stringify(st);\n this.applyColumnState(st);\n });\n });\n // Push user changes (resize / chooser) outward + persist under stateKey.\n effect(() => {\n const widths = Object.fromEntries(this.columnWidths());\n const hidden = [...this.hiddenColumns()];\n const st: StrctDatagridColumnState = { widths, hidden };\n const key = JSON.stringify(st);\n untracked(() => {\n if (key === this.lastStateKey) return;\n this.lastStateKey = key;\n this.columnState.set(st);\n const sk = this.stateKey();\n if (sk && typeof localStorage !== 'undefined') {\n try {\n localStorage.setItem(`strct-dg:${sk}`, key);\n } catch {\n /* storage full / denied — persistence is best-effort */\n }\n }\n });\n });\n }\n\n private readPersistedState(): StrctDatagridColumnState | null {\n const sk = this.stateKey();\n if (!sk || typeof localStorage === 'undefined') return null;\n try {\n const raw = localStorage.getItem(`strct-dg:${sk}`);\n return raw ? (JSON.parse(raw) as StrctDatagridColumnState) : null;\n } catch {\n return null;\n }\n }\n\n private applyColumnState(st: StrctDatagridColumnState): void {\n this.columnWidths.set(new Map(Object.entries(st.widths ?? {}).map(([k, v]) => [k, Number(v)])));\n this.hiddenColumns.set(new Set(st.hidden ?? []));\n }\n\n /**\n * The grid as CSV: header labels + every non-hidden column, all rows in the\n * current order (client mode: the full sorted set, not just the page).\n */\n toCSV(): string {\n const hidden = this.hiddenColumns();\n const cols = this.columns().filter((c) => !hidden.has(c.key));\n const esc = (v: unknown): string => {\n const s = v == null ? '' : String(v);\n return /[\",\\n;]/.test(s) ? `\"${s.replace(/\"/g, '\"\"')}\"` : s;\n };\n const data = this.lazy() ? this.rows() : this.sorted();\n return [\n cols.map((c) => esc(c.label)).join(','),\n ...data.map((r) => cols.map((c) => esc(r[c.key])).join(',')),\n ].join('\\n');\n }\n\n /** Download the grid as a CSV file. */\n downloadCSV(filename = 'datagrid.csv'): void {\n if (typeof document === 'undefined') return;\n const blob = new Blob(['\\uFEFF' + this.toCSV()], { type: 'text/csv;charset=utf-8' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n URL.revokeObjectURL(url);\n }\n\n protected colspan(): number {\n return (\n this.visibleColumns().length +\n (this.selectable() ? 1 : 0) +\n (this.canExpand() ? 1 : 0) +\n (this.canDetail() ? 1 : 0) +\n (this.canActions() ? 1 : 0)\n );\n }\n\n /** Toggle the detail pane for a row (triggered by its » button, not the row,\n * so row cells remain selectable for copy). */\n openDetail(row: StrctRow): void {\n const id = this.idOf(row);\n this.activeId.set(this.activeId() === id ? null : id);\n }\n\n closePane(): void {\n this.activeId.set(null);\n }\n\n /** Open the row-action menu next to the clicked kebab button. */\n protected openRowMenu(row: StrctRow, event: MouseEvent): void {\n event.stopPropagation();\n const fn = this.rowActions();\n if (!fn) return;\n const items = fn(row);\n if (!items.length) return;\n const rect = (event.currentTarget as HTMLElement).getBoundingClientRect();\n this.menu.open({\n x: rect.right,\n y: rect.bottom + 4,\n items,\n data: row,\n onSelect: (item) => this.rowAction.emit({ row, item }),\n });\n }\n\n sortBy(key: string): void {\n const current = this.sort();\n if (current.key !== key) {\n this.sort.set({ key, dir: 'asc' });\n } else if (current.dir === 'asc') {\n this.sort.set({ key, dir: 'desc' });\n } else {\n this.sort.set({ key: null, dir: 'asc' });\n }\n }\n\n protected sortIcon(key: string): string {\n const { key: k, dir } = this.sort();\n if (k !== key) return 'sortNone';\n return dir === 'asc' ? 'sortAsc' : 'sortDesc';\n }\n\n protected ariaSort(key: string): 'ascending' | 'descending' | 'none' {\n const { key: k, dir } = this.sort();\n if (k !== key) return 'none';\n return dir === 'asc' ? 'ascending' : 'descending';\n }\n\n protected onHeaderSpace(event: Event, key: string): void {\n event.preventDefault(); // stop page scroll\n this.sortBy(key);\n }\n\n toggleColumn(key: string, visible: boolean): void {\n this.hiddenColumns.update((set) => {\n const next = new Set(set);\n if (visible) next.delete(key);\n else next.add(key);\n return next;\n });\n }\n\n protected isSelected(row: StrctRow): boolean {\n return this.selected().has(this.idOf(row));\n }\n\n protected isExpanded(row: StrctRow): boolean {\n return this.expandedRows().has(this.idOf(row));\n }\n\n toggleExpand(row: StrctRow): void {\n const id = this.idOf(row);\n const next = new Set(this.expandedRows());\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n this.expandedRows.set(next);\n }\n\n toggleRow(row: StrctRow): void {\n const id = this.idOf(row);\n const next = new Set(this.selected());\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n this.commitSelection(next);\n }\n\n toggleAll(): void {\n const next = new Set(this.selected());\n const rows = this.paged();\n if (this.allPageSelected()) {\n rows.forEach((r) => next.delete(this.idOf(r)));\n } else {\n rows.forEach((r) => next.add(this.idOf(r)));\n }\n this.commitSelection(next);\n }\n\n clearSelection(): void {\n this.commitSelection(new Set());\n }\n\n /** Emit the current row objects whose id is selected (resolved against the\n * latest data, so consumers always get fresh references). */\n private commitSelection(next: Set<unknown>): void {\n this.selected.set(next);\n this.selectionChange.emit(this.rows().filter((r) => next.has(this.idOf(r))));\n }\n\n private compare(a: unknown, b: unknown): number {\n if (typeof a === 'number' && typeof b === 'number') return a - b;\n return String(a ?? '').localeCompare(String(b ?? ''), undefined, { numeric: true });\n }\n}\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation, input } from '@angular/core';\n\n/** Timeline node state colors. */\nexport type StrctTimelineState = 'default' | 'current' | 'success' | 'warning' | 'critical';\n\n/** Vertical timeline container. Wraps `<strct-timeline-item>` children. */\n@Component({\n selector: 'strct-timeline',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `<ng-content />`,\n host: { class: 'strct-tl' },\n styles: [\n `\n .strct-tl {\n display: flex;\n flex-direction: column;\n }\n `,\n ],\n})\nexport class StrctTimeline {}\n\n/** A timeline entry: a node on the rail plus a title and projected body. */\n@Component({\n selector: 'strct-timeline-item',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n <div class=\"strct-tli__rail\">\n <span class=\"strct-tli__node\"></span>\n <span class=\"strct-tli__line\"></span>\n </div>\n <div class=\"strct-tli__content\">\n <div class=\"strct-tli__title\">{{ title() }}</div>\n <div class=\"strct-tli__body\"><ng-content /></div>\n </div>\n `,\n host: {\n class: 'strct-tli',\n '[class.strct-tli--current]': \"state() === 'current'\",\n '[class.strct-tli--success]': \"state() === 'success'\",\n '[class.strct-tli--warning]': \"state() === 'warning'\",\n '[class.strct-tli--critical]': \"state() === 'critical'\",\n },\n styles: [\n `\n .strct-tli {\n display: flex;\n gap: 12px;\n }\n .strct-tli__rail {\n display: flex;\n flex-direction: column;\n align-items: center;\n }\n .strct-tli__node {\n width: 11px;\n height: 11px;\n border-radius: 50%;\n margin-top: 3px;\n flex-shrink: 0;\n background: var(--bg-1);\n border: 2px solid var(--b3);\n }\n .strct-tli__line {\n flex: 1;\n width: 2px;\n background: var(--b2);\n margin: 4px 0;\n }\n .strct-tli:last-child .strct-tli__line {\n display: none;\n }\n .strct-tli__content {\n padding-bottom: 18px;\n }\n .strct-tli__title {\n font-size: 13px;\n font-weight: 600;\n color: var(--t1);\n }\n .strct-tli__body {\n margin-top: 3px;\n font-size: 13px;\n color: var(--t2);\n }\n\n .strct-tli--current .strct-tli__node {\n border-color: var(--acc);\n background: var(--acc-m);\n box-shadow: 0 0 0 3px var(--acc18);\n }\n .strct-tli--success .strct-tli__node {\n border-color: var(--success);\n background: var(--success);\n }\n .strct-tli--warning .strct-tli__node {\n border-color: var(--warning);\n background: var(--warning);\n }\n .strct-tli--critical .strct-tli__node {\n border-color: var(--critical);\n background: var(--critical);\n }\n `,\n ],\n})\nexport class StrctTimelineItem {\n /** Dialog title. */\n readonly title = input.required<string>();\n /** State. */\n readonly state = input<StrctTimelineState>('default');\n}\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation, input } from '@angular/core';\n\n/** Key/value definition list. Wraps `<strct-stack-item>` rows. */\n@Component({\n selector: 'strct-stack',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `<ng-content />`,\n host: { class: 'strct-stack' },\n styles: [\n `\n .strct-stack {\n display: block;\n border: 1px solid var(--b2);\n border-radius: 8px;\n overflow: hidden;\n }\n `,\n ],\n})\nexport class StrctStack {}\n\n/** A label + value row. The value is projected content. */\n@Component({\n selector: 'strct-stack-item',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n <span class=\"strct-stack__label\">{{ label() }}</span>\n <span class=\"strct-stack__value\"><ng-content /></span>\n `,\n host: { class: 'strct-stack__item' },\n styles: [\n `\n .strct-stack__item {\n display: grid;\n grid-template-columns: minmax(120px, 34%) 1fr;\n gap: 12px;\n padding: 10px 14px;\n border-bottom: 1px solid var(--b1);\n font-size: 13px;\n }\n .strct-stack__item:last-child {\n border-bottom: 0;\n }\n .strct-stack__item:nth-child(even) {\n background: var(--bg-2);\n }\n .strct-stack__label {\n color: var(--t2);\n }\n .strct-stack__value {\n color: var(--t1);\n }\n `,\n ],\n})\nexport class StrctStackItem {\n /** Label text. */\n readonly label = input.required<string>();\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n input,\n} from '@angular/core';\n\n/** Chart / gauge / sparkline status colors. */\nexport type StrctChartStatus = 'accent' | 'success' | 'warning' | 'critical';\n\nconst STROKE: Record<StrctChartStatus, string> = {\n accent: 'var(--acc)',\n success: 'var(--success)',\n warning: 'var(--warning)',\n critical: 'var(--critical)',\n};\n\n/**\n * Tiny inline trend line. `<strct-sparkline [data]=\"[3,5,4,8,6,9]\" area />`.\n */\n@Component({\n selector: 'strct-sparkline',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n <svg\n class=\"strct-spark__svg\"\n viewBox=\"0 0 100 30\"\n preserveAspectRatio=\"none\"\n [style.width.px]=\"width()\"\n [style.height.px]=\"height()\"\n >\n @if (area()) {\n <polygon class=\"strct-spark__area\" [attr.points]=\"areaPoints()\" [attr.fill]=\"color()\" />\n }\n <polyline\n class=\"strct-spark__line\"\n fill=\"none\"\n [attr.points]=\"linePoints()\"\n [attr.stroke]=\"color()\"\n />\n </svg>\n `,\n host: { class: 'strct-spark' },\n styles: [\n `\n .strct-spark {\n display: inline-block;\n line-height: 0;\n }\n .strct-spark__line {\n stroke-width: 1.6;\n vector-effect: non-scaling-stroke;\n stroke-linejoin: round;\n stroke-linecap: round;\n }\n .strct-spark__area {\n opacity: 0.14;\n }\n `,\n ],\n})\nexport class StrctSparkline {\n /** Data array. */\n readonly data = input.required<number[]>();\n /** Visual status color. */\n readonly status = input<StrctChartStatus>('accent');\n /** Fill the area under the line. */\n readonly area = input(false, { transform: booleanAttribute });\n /** Width (CSS length). */\n readonly width = input(100);\n /** Height in pixels. */\n readonly height = input(30);\n\n protected readonly color = computed(() => STROKE[this.status()]);\n\n private readonly points = computed(() => {\n const d = this.data();\n if (!d.length) return [] as { x: number; y: number }[];\n const min = Math.min(...d);\n const max = Math.max(...d);\n const span = max - min || 1;\n const stepX = d.length > 1 ? 100 / (d.length - 1) : 0;\n return d.map((v, i) => ({ x: i * stepX, y: 29 - ((v - min) / span) * 28 }));\n });\n\n protected readonly linePoints = computed(() =>\n this.points()\n .map((p) => `${p.x},${p.y}`)\n .join(' '),\n );\n\n protected readonly areaPoints = computed(() => {\n const pts = this.points();\n if (!pts.length) return '';\n return `0,30 ${pts.map((p) => `${p.x},${p.y}`).join(' ')} 100,30`;\n });\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n ViewEncapsulation,\n afterNextRender,\n booleanAttribute,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { StrctChartStatus } from './sparkline';\n\n/** Chart rendering types (line, area, bar). */\nexport type StrctChartType = 'line' | 'area' | 'bar';\n/** Line interpolation between points. */\nexport type StrctChartCurve = 'smooth' | 'linear' | 'step';\n\n/** One series in a multi-series chart. */\nexport interface StrctChartSeries {\n /** Values; `null` (or `NaN`) marks a data gap — the line breaks, no interpolation. */\n data: (number | null)[];\n /** Legend + tooltip name. */\n label?: string;\n /** Per-series color; falls back to the chart's `status`. */\n status?: StrctChartStatus;\n /** Per-series area fill. */\n area?: boolean;\n /** Per-series interpolation; falls back to the chart's `curve`. */\n curve?: StrctChartCurve;\n /**\n * Dashed line — a second visual channel besides color, so two series stay\n * distinguishable under color-vision deficiency. `true` uses `'5 4'`; pass a\n * custom SVG dasharray string to tune it.\n */\n dash?: boolean | string;\n /**\n * Optional per-point lower/upper bound (e.g. min/max per downsampled bucket).\n * When both are set a soft band is filled between them behind the line, so\n * within-bucket spikes stay visible; the tooltip shows `avg (min–max)`.\n */\n lower?: (number | null)[];\n upper?: (number | null)[];\n}\n\n/** A vertical event / annotation marker anchored to a data index. */\nexport interface StrctChartAnnotation {\n /** X position as a data index. */\n index: number;\n /** Shown near the top of the line and in the tooltip at that index. */\n label?: string;\n /** Line color; default 'accent'. */\n status?: StrctChartStatus;\n /** Dashed line; default true. */\n dashed?: boolean;\n}\n\n/** A horizontal reference / threshold line. */\nexport interface StrctChartThreshold {\n value: number;\n label?: string;\n /** Line color; default 'warning'. */\n status?: StrctChartStatus;\n /** Dashed line; default true. */\n dashed?: boolean;\n}\n\ninterface Pt {\n x: number;\n y: number;\n}\n\nconst COLOR: Record<StrctChartStatus, string> = {\n accent: 'var(--acc)',\n success: 'var(--success)',\n warning: 'var(--warning)',\n critical: 'var(--critical)',\n};\n\n/** Fallback width (px) before the element is measured. */\nconst W0 = 600;\nconst PAD = { l: 8, r: 8, t: 14, b: 12 };\n/** Left gutter when the y-axis scale labels are shown. */\nconst Y_AXIS_GUTTER = 42;\n\nlet chartUid = 0;\n\nconst round = (n: number): number => Math.round(n * 100) / 100;\n\n/** Linear path: straight segments between points. */\nfunction linearPath(p: Pt[]): string {\n if (!p.length) return '';\n return (\n `M${round(p[0].x)},${round(p[0].y)}` +\n p\n .slice(1)\n .map((q) => `L${round(q.x)},${round(q.y)}`)\n .join('')\n );\n}\n\n/** Step-after path: hold, then jump. */\nfunction stepPath(p: Pt[]): string {\n if (!p.length) return '';\n let d = `M${round(p[0].x)},${round(p[0].y)}`;\n for (let i = 1; i < p.length; i++) {\n d += `L${round(p[i].x)},${round(p[i - 1].y)}L${round(p[i].x)},${round(p[i].y)}`;\n }\n return d;\n}\n\n/**\n * Monotone cubic (Fritsch–Carlson) interpolation — smooth curves that never\n * overshoot the data, so a metric line stays within its own min/max.\n */\nfunction smoothPath(p: Pt[]): string {\n const n = p.length;\n if (n < 3) return linearPath(p);\n\n const dx: number[] = [];\n const delta: number[] = [];\n for (let i = 0; i < n - 1; i++) {\n dx[i] = p[i + 1].x - p[i].x;\n delta[i] = dx[i] === 0 ? 0 : (p[i + 1].y - p[i].y) / dx[i];\n }\n\n const tan: number[] = new Array(n);\n tan[0] = delta[0];\n tan[n - 1] = delta[n - 2];\n for (let i = 1; i < n - 1; i++) {\n tan[i] = delta[i - 1] * delta[i] <= 0 ? 0 : (delta[i - 1] + delta[i]) / 2;\n }\n for (let i = 0; i < n - 1; i++) {\n if (delta[i] === 0) {\n tan[i] = 0;\n tan[i + 1] = 0;\n continue;\n }\n const a = tan[i] / delta[i];\n const b = tan[i + 1] / delta[i];\n const s = a * a + b * b;\n if (s > 9) {\n const t = 3 / Math.sqrt(s);\n tan[i] = t * a * delta[i];\n tan[i + 1] = t * b * delta[i];\n }\n }\n\n let d = `M${round(p[0].x)},${round(p[0].y)}`;\n for (let i = 0; i < n - 1; i++) {\n const h = dx[i] / 3;\n const c1x = p[i].x + h;\n const c1y = p[i].y + h * tan[i];\n const c2x = p[i + 1].x - h;\n const c2y = p[i + 1].y - h * tan[i + 1];\n d += `C${round(c1x)},${round(c1y)} ${round(c2x)},${round(c2y)} ${round(p[i + 1].x)},${round(p[i + 1].y)}`;\n }\n return d;\n}\n\nfunction pathFor(pts: Pt[], curve: StrctChartCurve): string {\n return curve === 'linear' ? linearPath(pts) : curve === 'step' ? stepPath(pts) : smoothPath(pts);\n}\n\n/** A real value — `null` and `NaN` both mark a data gap. */\nfunction isVal(v: number | null | undefined): v is number {\n return v != null && !Number.isNaN(v);\n}\n\n/** Split a nullable point array into contiguous non-gap segments. */\nfunction segs(pts: (Pt | null)[]): Pt[][] {\n const out: Pt[][] = [];\n let cur: Pt[] = [];\n for (const p of pts) {\n if (p) cur.push(p);\n else if (cur.length) {\n out.push(cur);\n cur = [];\n }\n }\n if (cur.length) out.push(cur);\n return out;\n}\n\n/** Line path that breaks at gaps (one sub-path per segment). */\nfunction pathForSegs(pts: (Pt | null)[], curve: StrctChartCurve): string {\n return segs(pts)\n .map((s) => pathFor(s, curve))\n .join('');\n}\n\n/** Area path per segment — the fill drops to the baseline at gap edges, never across. */\nfunction areaForSegs(pts: (Pt | null)[], curve: StrctChartCurve, base: number): string {\n return segs(pts)\n .map(\n (s) =>\n `${pathFor(s, curve)}L${round(s[s.length - 1].x)},${round(base)}L${round(s[0].x)},${round(base)}Z`,\n )\n .join('');\n}\n\n/** Closed band between per-point upper and lower bounds (gap-aware). */\nfunction bandPath(upper: (Pt | null)[], lower: (Pt | null)[], curve: StrctChartCurve): string {\n let out = '';\n let u: Pt[] = [];\n let l: Pt[] = [];\n const flush = () => {\n if (u.length > 1) {\n const back = pathFor([...l].reverse(), curve).replace(/^M/, 'L');\n out += pathFor(u, curve) + back + 'Z';\n }\n u = [];\n l = [];\n };\n for (let i = 0; i < upper.length; i++) {\n const up = upper[i];\n const lo = lower[i];\n if (up && lo) {\n u.push(up);\n l.push(lo);\n } else flush();\n }\n flush();\n return out;\n}\n\ninterface SeriesRender {\n color: string;\n label: string;\n area: boolean;\n dash: string | null;\n pts: (Pt | null)[];\n path: string;\n areaPath: string;\n bandPath: string;\n /** Global x-offset (right-aligned) so shorter series line up on the right. */\n offset: number;\n data: (number | null)[];\n lower?: (number | null)[];\n upper?: (number | null)[];\n}\n\n/**\n * Single- or multi-series chart (line / area / bar). Dependency-free SVG,\n * token-coloured.\n *\n * Lines are smooth by default (monotone cubic, no overshoot); set `curve` to\n * `linear` or `step`. Toggle the gradient fill with `area`, the ambient glow with\n * `glow`, and turn on `live` for streaming metrics. Pass `series` for multiple\n * lines with a `legend`; add persistent scale labels with `yAxis`, reference lines\n * with `thresholds`, a floor with `min`, and thin x labels with `xTicks`. Hover\n * anywhere for a crosshair + tooltip. The SVG is measured (1:1 coordinates) so\n * dots and the glow stay crisp at any width. Reduced-motion safe.\n *\n * <strct-chart [data]=\"cpu\" area glow [labels]=\"hours\" status=\"warning\" />\n * <strct-chart [series]=\"[{data:inArr,label:'In'},{data:outArr,label:'Out'}]\" legend />\n */\n@Component({\n selector: 'strct-chart',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n @if (isEmpty()) {\n <div class=\"strct-chart__empty\" [style.height.px]=\"height()\">{{ emptyText() }}</div>\n } @else {\n @if (legend() && legendItems().length) {\n <div class=\"strct-chart__legend\">\n @for (it of legendItems(); track it.label) {\n <span class=\"strct-chart__leg\">\n <span\n class=\"strct-chart__leg-sw\"\n [style.background]=\"\n it.dash\n ? 'repeating-linear-gradient(90deg, ' +\n it.color +\n ' 0 4px, transparent 4px 7px)'\n : it.color\n \"\n ></span\n >{{ it.label }}\n </span>\n }\n </div>\n }\n\n <div class=\"strct-chart__plot\">\n <svg\n #svg\n class=\"strct-chart__svg\"\n role=\"img\"\n [attr.aria-label]=\"chartAria()\"\n [attr.tabindex]=\"interactive() && type() !== 'bar' ? 0 : null\"\n [attr.viewBox]=\"'0 0 ' + width() + ' ' + height()\"\n [attr.width]=\"width()\"\n [attr.height]=\"height()\"\n [style.height.px]=\"height()\"\n (pointerdown)=\"onDown($event)\"\n (pointermove)=\"onMove($event)\"\n (pointerup)=\"onUp()\"\n (lostpointercapture)=\"onUp()\"\n (pointerleave)=\"onLeave()\"\n (dblclick)=\"onDblClick()\"\n (keydown)=\"onKey($event)\"\n (blur)=\"onLeave()\"\n >\n <defs>\n <linearGradient [attr.id]=\"gradId\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0\" [attr.stop-color]=\"color()\" stop-opacity=\"0.22\" />\n <stop offset=\"0.9\" [attr.stop-color]=\"color()\" stop-opacity=\"0\" />\n </linearGradient>\n <clipPath [attr.id]=\"clipId\">\n <rect [attr.x]=\"0\" [attr.y]=\"0\" [attr.width]=\"width()\" [attr.height]=\"height()\" />\n </clipPath>\n </defs>\n\n @if (grid()) {\n @for (g of gridY(); track g) {\n <line\n class=\"strct-chart__grid\"\n [attr.x1]=\"pl()\"\n [attr.x2]=\"width() - pad.r\"\n [attr.y1]=\"g\"\n [attr.y2]=\"g\"\n />\n }\n }\n\n <!-- Event / annotation markers: behind the data, above the grid. -->\n @for (a of annotationLines(); track $index) {\n <line\n class=\"strct-chart__ann\"\n [class.strct-chart__ann--dashed]=\"a.dashed\"\n [attr.x1]=\"a.x\"\n [attr.x2]=\"a.x\"\n [attr.y1]=\"pad.t\"\n [attr.y2]=\"height() - pad.b\"\n [attr.stroke]=\"a.color\"\n />\n }\n\n @if (type() === 'bar' && !isMulti()) {\n @for (b of bars(); track $index) {\n <rect\n class=\"strct-chart__bar\"\n [attr.x]=\"b.x\"\n [attr.y]=\"b.y\"\n [attr.width]=\"b.w\"\n [attr.height]=\"b.h\"\n [attr.fill]=\"color()\"\n />\n }\n } @else {\n <g [attr.clip-path]=\"'url(#' + clipId + ')'\">\n <g\n class=\"strct-chart__flow\"\n [style.transform]=\"'translateX(' + slidePx() + 'px)'\"\n [style.transition]=\"sliding() ? 'transform ' + interval() + 'ms linear' : 'none'\"\n >\n @if (isMulti()) {\n @for (s of multiSeries(); track $index) {\n @if (s.bandPath) {\n <path class=\"strct-chart__band\" [attr.d]=\"s.bandPath\" [attr.fill]=\"s.color\" />\n }\n @if (s.area && s.areaPath) {\n <path\n class=\"strct-chart__area strct-chart__area--flat\"\n [attr.d]=\"s.areaPath\"\n [attr.fill]=\"s.color\"\n />\n }\n <path\n class=\"strct-chart__line\"\n fill=\"none\"\n [attr.stroke-width]=\"strokeWidth()\"\n [attr.stroke-dasharray]=\"s.dash\"\n [attr.d]=\"s.path\"\n [attr.stroke]=\"s.color\"\n />\n }\n } @else {\n @if (showArea()) {\n <path\n class=\"strct-chart__area\"\n [attr.d]=\"areaPath()\"\n [attr.fill]=\"'url(#' + gradId + ')'\"\n />\n }\n <path\n class=\"strct-chart__line\"\n [class.strct-chart__line--draw]=\"drawOn()\"\n fill=\"none\"\n pathLength=\"1\"\n [attr.stroke-width]=\"strokeWidth()\"\n [attr.d]=\"linePath()\"\n [attr.stroke]=\"color()\"\n />\n @if (dots()) {\n @for (p of dotPts(); track $index) {\n <circle\n class=\"strct-chart__dot\"\n [attr.cx]=\"p.x\"\n [attr.cy]=\"p.y\"\n r=\"2.5\"\n [attr.fill]=\"color()\"\n />\n }\n }\n }\n </g>\n </g>\n\n @for (t of thresholdLines(); track $index) {\n <line\n class=\"strct-chart__threshold\"\n [class.strct-chart__threshold--dashed]=\"t.dashed\"\n [attr.x1]=\"pl()\"\n [attr.x2]=\"width() - pad.r\"\n [attr.y1]=\"t.y\"\n [attr.y2]=\"t.y\"\n [attr.stroke]=\"t.color\"\n />\n }\n\n @if (brushRect(); as br) {\n <rect\n class=\"strct-chart__brush\"\n [attr.x]=\"br.x\"\n [attr.y]=\"pad.t\"\n [attr.width]=\"br.w\"\n [attr.height]=\"height() - pad.t - pad.b\"\n />\n }\n\n @if (interactive() && hoverX() !== null) {\n <line\n class=\"strct-chart__cross\"\n [attr.x1]=\"hoverX()\"\n [attr.x2]=\"hoverX()\"\n [attr.y1]=\"pad.t\"\n [attr.y2]=\"height() - pad.b\"\n />\n @if (!isMulti() && hoverPt(); as hp) {\n <line\n class=\"strct-chart__cross\"\n [attr.x1]=\"pl()\"\n [attr.x2]=\"width() - pad.r\"\n [attr.y1]=\"hp.y\"\n [attr.y2]=\"hp.y\"\n />\n <circle\n class=\"strct-chart__hoverdot\"\n [attr.cx]=\"hp.x\"\n [attr.cy]=\"hp.y\"\n r=\"3.5\"\n [attr.fill]=\"color()\"\n />\n }\n @if (isMulti()) {\n @for (d of hoverDots(); track $index) {\n <circle\n class=\"strct-chart__hoverdot\"\n [attr.cx]=\"d.x\"\n [attr.cy]=\"d.y\"\n r=\"3.5\"\n [attr.fill]=\"d.color\"\n />\n }\n }\n }\n\n @if (!isMulti() && live() && head(); as h) {\n <g class=\"strct-chart__head\" [attr.transform]=\"'translate(' + h.x + ',' + h.y + ')'\">\n <circle class=\"strct-chart__pulse\" r=\"3\" [attr.fill]=\"color()\" />\n <circle class=\"strct-chart__head-dot\" r=\"3\" [attr.fill]=\"color()\" />\n </g>\n }\n }\n </svg>\n\n @if (yAxis()) {\n @for (t of yAxisTicks(); track t.value) {\n <div class=\"strct-chart__ytick\" [style.top.px]=\"t.y\">{{ t.text }}</div>\n }\n }\n\n @for (t of thresholdLines(); track $index) {\n @if (t.label) {\n <div class=\"strct-chart__thr\" [style.top.px]=\"t.y\" [style.color]=\"t.color\">\n {{ t.label }}\n </div>\n }\n }\n\n @for (a of annotationLines(); track $index) {\n @if (a.label) {\n <div class=\"strct-chart__ann-label\" [style.left.px]=\"a.x\" [style.color]=\"a.color\">\n {{ a.label }}\n </div>\n }\n }\n\n @if (zoomed()) {\n <button type=\"button\" class=\"strct-chart__reset\" (click)=\"resetZoom()\">\n ⟲ {{ resetLabel() }}\n </button>\n }\n\n @if (interactive() && hoverX() !== null) {\n @if (isMulti()) {\n <div class=\"strct-chart__tip strct-chart__tip--multi\" [style.left.px]=\"hoverX()\">\n @if (hoverMeta()) {\n <span class=\"strct-chart__tip-l\">{{ hoverMeta() }}</span>\n }\n @if (annAt(); as ann) {\n <span class=\"strct-chart__tip-ann\" [style.color]=\"ann.color\">{{ ann.label }}</span>\n }\n @for (r of hoverRows(); track r.label) {\n <span class=\"strct-chart__tip-row\">\n <span class=\"strct-chart__tip-sw\" [style.background]=\"r.color\"></span>\n @if (r.label) {\n <span class=\"strct-chart__tip-rl\">{{ r.label }}</span>\n }\n <span class=\"strct-chart__tip-rv\">{{ r.text }}</span>\n </span>\n }\n </div>\n } @else if (hoverPt(); as hp) {\n <div class=\"strct-chart__axis-y\" [style.top.px]=\"hp.y\">{{ hoverValueText() }}</div>\n <div class=\"strct-chart__tip\" [style.left.px]=\"hp.x\" [style.top.px]=\"hp.y\">\n <span class=\"strct-chart__tip-v\">{{ hoverValueText() }}</span>\n @if (hoverDelta() !== null || hoverMeta()) {\n <span class=\"strct-chart__tip-meta\">\n @if (hoverDelta() !== null) {\n <span\n class=\"strct-chart__tip-delta\"\n [class.strct-chart__tip-delta--up]=\"hoverDelta()! > 0\"\n [class.strct-chart__tip-delta--down]=\"hoverDelta()! < 0\"\n >\n {{ hoverDelta()! > 0 ? '▲' : hoverDelta()! < 0 ? '▼' : '·'\n }}{{ absDeltaText() }}\n </span>\n }\n @if (hoverMeta()) {\n <span class=\"strct-chart__tip-l\">{{ hoverMeta() }}</span>\n }\n </span>\n }\n @if (annAt(); as ann) {\n <span class=\"strct-chart__tip-ann\" [style.color]=\"ann.color\">{{ ann.label }}</span>\n }\n </div>\n } @else if (hoverGap()) {\n <!-- A gap point: keep the time slot, say \"no data\" instead of a value. -->\n <div class=\"strct-chart__tip strct-chart__tip--gap\" [style.left.px]=\"hoverX()\">\n <span class=\"strct-chart__tip-v\">{{ gapText() }}</span>\n @if (hoverMeta()) {\n <span class=\"strct-chart__tip-l\">{{ hoverMeta() }}</span>\n }\n </div>\n }\n }\n\n @if (interactive() && type() !== 'bar') {\n <span class=\"strct-chart__sr\" aria-live=\"polite\">{{ srText() }}</span>\n }\n </div>\n\n @if (displayLabels().length) {\n <!-- Labels sit at their datapoint's real x, so a subsampled axis never lies. -->\n <div class=\"strct-chart__labels\">\n @for (l of displayLabels(); track $index) {\n <span\n [class.strct-chart__label--active]=\"interactive() && dispIdx() === l.i\"\n [style.left.px]=\"xOf(l.i)\"\n >{{ l.text }}</span\n >\n }\n </div>\n }\n }\n `,\n host: {\n class: 'strct-chart',\n '[class.strct-chart--glow]': 'glow()',\n '[class.strct-chart--brush]': 'brush() || zoom()',\n '[style.--strct-chart-c]': 'color()',\n },\n styles: [\n `\n .strct-chart {\n display: block;\n position: relative;\n }\n /* Overlays (ticks, tooltip, threshold tags) anchor to the plot, so a legend\n above the svg can never shift them. */\n .strct-chart__plot {\n position: relative;\n }\n .strct-chart__svg {\n width: 100%;\n display: block;\n touch-action: none;\n }\n .strct-chart__svg:focus-visible {\n outline: 2px solid var(--acc50);\n outline-offset: 2px;\n border-radius: var(--radius-sm);\n }\n .strct-chart__sr {\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n }\n .strct-chart__empty {\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n color: var(--t3);\n }\n .strct-chart__grid {\n stroke: var(--b1);\n stroke-width: 1;\n vector-effect: non-scaling-stroke;\n }\n .strct-chart__line {\n vector-effect: non-scaling-stroke;\n stroke-linejoin: round;\n stroke-linecap: round;\n }\n .strct-chart__area {\n stroke: none;\n }\n .strct-chart__area--flat {\n opacity: 0.14;\n }\n .strct-chart__dot,\n .strct-chart__hoverdot,\n .strct-chart__head-dot {\n stroke: var(--bg-1);\n stroke-width: 1.5;\n }\n .strct-chart__cross {\n stroke: var(--strct-chart-c);\n stroke-width: 1;\n opacity: 0.4;\n stroke-dasharray: 3 3;\n vector-effect: non-scaling-stroke;\n }\n .strct-chart__threshold {\n stroke-width: 1;\n opacity: 0.85;\n vector-effect: non-scaling-stroke;\n }\n .strct-chart__threshold--dashed {\n stroke-dasharray: 4 3;\n }\n .strct-chart__bar {\n rx: 1.5;\n }\n\n /* Min–max envelope behind the series line. */\n .strct-chart__band {\n opacity: 0.13;\n stroke: none;\n }\n\n /* Vertical event / annotation markers. */\n .strct-chart__ann {\n stroke-width: 1;\n opacity: 0.8;\n vector-effect: non-scaling-stroke;\n }\n .strct-chart__ann--dashed {\n stroke-dasharray: 4 3;\n }\n .strct-chart__ann-label {\n position: absolute;\n top: 0;\n transform: translateX(-50%);\n pointer-events: none;\n font-size: 12px;\n font-weight: 600;\n background: var(--bg-1);\n padding: 0 3px;\n border-radius: 3px;\n white-space: nowrap;\n }\n\n /* Brush selection + zoom-out chip. */\n .strct-chart--brush .strct-chart__svg {\n cursor: crosshair;\n }\n .strct-chart__brush {\n fill: var(--acc);\n opacity: 0.16;\n stroke: var(--acc50);\n stroke-width: 1;\n vector-effect: non-scaling-stroke;\n }\n .strct-chart__reset {\n position: absolute;\n top: 6px;\n right: 8px;\n z-index: 3;\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 2px 9px;\n border: 1px solid var(--b2);\n border-radius: 99px;\n background: var(--bg-a);\n color: var(--t2);\n font-family: var(--font);\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n }\n .strct-chart__reset:hover {\n color: var(--t1);\n border-color: var(--acc50);\n }\n .strct-chart__reset:focus-visible {\n outline: 2px solid var(--acc50);\n outline-offset: 1px;\n }\n\n .strct-chart__tip--gap {\n top: 6px;\n transform: translate(-50%, 0);\n }\n .strct-chart__tip-ann {\n font-size: 12px;\n font-weight: 600;\n }\n\n /* Ambient neon glow — layered shadows for depth without thickening the line. */\n .strct-chart--glow .strct-chart__line {\n filter: drop-shadow(0 0 1.5px var(--strct-chart-c))\n drop-shadow(0 0 5px var(--strct-chart-c));\n }\n .strct-chart--glow .strct-chart__head-dot {\n filter: drop-shadow(0 0 2px var(--strct-chart-c)) drop-shadow(0 0 6px var(--strct-chart-c));\n }\n .strct-chart--glow .strct-chart__hoverdot {\n filter: drop-shadow(0 0 4px var(--strct-chart-c));\n }\n\n /* Persistent y-axis scale labels + crosshair value chip on the y-axis edge. */\n .strct-chart__ytick {\n position: absolute;\n left: 0;\n width: ${Y_AXIS_GUTTER - 8}px;\n text-align: end;\n transform: translateY(-50%);\n pointer-events: none;\n font-family: var(--mono);\n font-size: 12px;\n color: var(--t3);\n font-variant-numeric: tabular-nums;\n }\n .strct-chart__thr {\n position: absolute;\n right: 2px;\n transform: translateY(-50%);\n pointer-events: none;\n font-size: 12px;\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n background: var(--bg-1);\n padding: 0 3px;\n border-radius: 3px;\n }\n .strct-chart__axis-y {\n position: absolute;\n left: 0;\n transform: translateY(-50%);\n pointer-events: none;\n padding: 1px 5px;\n border-radius: var(--radius-sm);\n background: var(--bg-a);\n border: 1px solid var(--b2);\n font-family: var(--mono);\n font-size: 12px;\n font-weight: 600;\n color: var(--t2);\n font-variant-numeric: tabular-nums;\n z-index: 2;\n }\n .strct-chart__label--active {\n color: var(--t1);\n font-weight: 700;\n }\n\n /* Legend */\n .strct-chart__legend {\n display: flex;\n flex-wrap: wrap;\n gap: 6px 14px;\n margin-bottom: 8px;\n font-size: 12px;\n color: var(--t2);\n }\n .strct-chart__leg {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n }\n .strct-chart__leg-sw {\n width: 9px;\n height: 3px;\n border-radius: 2px;\n flex-shrink: 0;\n }\n\n /* Hover tooltip. */\n .strct-chart__tip {\n position: absolute;\n transform: translate(-50%, calc(-100% - 10px));\n pointer-events: none;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 1px;\n padding: 4px 8px;\n border-radius: var(--radius-sm);\n background: var(--bg-a);\n border: 1px solid var(--b2);\n box-shadow: var(--shadow-elevated);\n white-space: nowrap;\n z-index: 2;\n }\n .strct-chart__tip--multi {\n top: 6px;\n transform: translate(-50%, 0);\n align-items: stretch;\n gap: 3px;\n }\n .strct-chart__tip-v {\n font-size: 12px;\n font-weight: 700;\n color: var(--t1);\n font-variant-numeric: tabular-nums;\n }\n .strct-chart__tip-meta {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n }\n .strct-chart__tip-delta {\n font-size: 12px;\n font-weight: 600;\n color: var(--t3);\n font-variant-numeric: tabular-nums;\n }\n .strct-chart__tip-delta--up {\n color: var(--success);\n }\n .strct-chart__tip-delta--down {\n color: var(--critical);\n }\n .strct-chart__tip-l {\n font-size: 12px;\n color: var(--t3);\n }\n .strct-chart__tip-row {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n }\n .strct-chart__tip-sw {\n width: 8px;\n height: 3px;\n border-radius: 2px;\n flex-shrink: 0;\n }\n .strct-chart__tip-rl {\n color: var(--t3);\n margin-inline-end: auto;\n }\n .strct-chart__tip-rv {\n color: var(--t1);\n font-weight: 700;\n font-variant-numeric: tabular-nums;\n }\n\n .strct-chart__labels {\n position: relative;\n height: 15px;\n margin-top: 6px;\n font-size: 12px;\n color: var(--t3);\n }\n .strct-chart__labels span {\n position: absolute;\n transform: translateX(-50%);\n white-space: nowrap;\n }\n\n @media (prefers-reduced-motion: no-preference) {\n .strct-chart__line--draw {\n stroke-dasharray: 1;\n stroke-dashoffset: 1;\n animation: strct-chart-draw 0.9s ease forwards;\n }\n .strct-chart__pulse {\n transform-box: fill-box;\n transform-origin: center;\n animation: strct-chart-pulse 2.4s ease-out infinite;\n }\n }\n @keyframes strct-chart-draw {\n to {\n stroke-dashoffset: 0;\n }\n }\n @keyframes strct-chart-pulse {\n 0% {\n transform: scale(1);\n opacity: 0.45;\n }\n 70% {\n opacity: 0;\n }\n 100% {\n transform: scale(2.5);\n opacity: 0;\n }\n }\n `,\n ],\n})\nexport class StrctChart {\n /** Single-series data (or use `series`). `null` / `NaN` marks a gap — the line breaks. */\n readonly data = input<(number | null)[]>([]);\n /** Multiple series; when set it takes precedence over `data`. */\n readonly series = input<StrctChartSeries[] | null>(null);\n /** Visual type / variant. */\n readonly type = input<StrctChartType>('line');\n /** Line interpolation. */\n readonly curve = input<StrctChartCurve>('smooth');\n /** Fill the area under the line with a soft gradient. */\n readonly area = input(false, { transform: booleanAttribute });\n /** Soft ambient glow on the line and the leading-edge dot. */\n readonly glow = input(false, { transform: booleanAttribute });\n /** Live streaming: the window scrolls left as new points arrive. */\n readonly live = input(false, { transform: booleanAttribute });\n /** Expected ms between updates in live mode (drives the scroll duration). */\n readonly interval = input(1000);\n /** Hover crosshair + value tooltip. */\n readonly interactive = input(true, { transform: booleanAttribute });\n /** Line thickness in pixels. */\n readonly strokeWidth = input(1.75);\n /** Show the horizontal gridlines. */\n readonly grid = input(true, { transform: booleanAttribute });\n /** Show a dot at each data point (single-series). */\n readonly dots = input(false, { transform: booleanAttribute });\n /** Show a legend (with `series`). */\n readonly legend = input(false, { transform: booleanAttribute });\n /** X-axis labels. */\n readonly labels = input<string[]>([]);\n /** Target number of x labels; null renders every label. */\n readonly xTicks = input<number | null>(null);\n /** Formatter for x labels. */\n readonly xFormat = input<((label: string, index: number) => string) | null>(null);\n /** Visual status color. */\n readonly status = input<StrctChartStatus>('accent');\n /** Height in pixels. */\n readonly height = input(160);\n /** Override the top of the value axis (defaults to the data max + headroom). */\n readonly max = input<number | null>(null);\n /** Override the floor of the value axis (defaults to 0). */\n readonly min = input<number | null>(null);\n /** Persistent y-axis scale labels. */\n readonly yAxis = input(false, { transform: booleanAttribute });\n /** Approx number of y ticks. */\n readonly yTicks = input(3);\n /** Formatter for y-axis labels; falls back to `valueFormat`. */\n readonly axisFormat = input<((v: number) => string) | null>(null);\n /** Horizontal reference / threshold lines. */\n readonly thresholds = input<StrctChartThreshold[]>([]);\n /** Text shown when there is no data. */\n readonly emptyText = input<string>('No data');\n /** Formatter for the live-mode \"Xs ago\" tooltip line (receives seconds). */\n readonly agoFormat = input<((seconds: number) => string) | null>(null);\n /**\n * Optional formatter for the values shown in the hover tooltip + y-axis flag\n * (and the delta magnitude). Lets callers add units / fixed precision, e.g.\n * `[valueFormat]=\"v => v.toFixed(3) + ' %'\"`. When null, the raw value is shown.\n */\n readonly valueFormat = input<((v: number) => string) | null>(null);\n /** Vertical event / annotation markers (\"alarm raised\", \"deploy\", …). */\n readonly annotations = input<StrctChartAnnotation[]>([]);\n /**\n * Drive the crosshair externally (e.g. mirror a sibling chart's hover for a\n * vCenter-style synced dashboard). A local pointer wins while over this chart.\n */\n readonly activeIndex = input<number | null>(null);\n /** Drag-select a range; the selection is emitted through `brushChange`. */\n readonly brush = input(false, { transform: booleanAttribute });\n /**\n * Drag-select **zooms into** the selected range (implies `brush`).\n * Double-click, Escape or the reset chip zooms back out.\n */\n readonly zoom = input(false, { transform: booleanAttribute });\n /** Tooltip text for a gap (null) point. */\n readonly gapText = input('no data');\n /** Accessible label of the reset-zoom chip (localizable). */\n readonly resetLabel = input('Reset zoom');\n\n /** Emits the hovered point index (or null on leave) — wire cross-chart sync with it. */\n readonly hoverIndex = output<number | null>();\n /** Emits the brushed [startIndex, endIndex] (inclusive), or null when cleared. */\n readonly brushChange = output<[number, number] | null>();\n\n protected readonly pad = PAD;\n protected readonly color = computed(() => COLOR[this.status()]);\n protected readonly showArea = computed(() => this.area() || this.type() === 'area');\n\n private readonly uid = ++chartUid;\n protected readonly gradId = `strct-chart-grad-${this.uid}`;\n protected readonly clipId = `strct-chart-clip-${this.uid}`;\n\n /** Measured pixel width → 1:1 viewBox so dots / glow stay crisp at any size. */\n protected readonly width = signal(W0);\n private readonly svgRef = viewChild<ElementRef<SVGSVGElement>>('svg');\n\n // Live-scroll state.\n protected readonly slidePx = signal(0);\n protected readonly sliding = signal(false);\n protected readonly drawOn = signal(true);\n private firstData = true;\n /** Reactive OS motion preference (tracks live changes, not just first load). */\n private readonly reduceMotion = signal(\n typeof matchMedia !== 'undefined' && matchMedia('(prefers-reduced-motion: reduce)').matches,\n );\n\n // Hover state. `hoverIdx` is the local pointer/keyboard index; `dispIdx` is\n // what actually renders — local wins, else the externally driven activeIndex.\n protected readonly hoverIdx = signal<number | null>(null);\n protected readonly dispIdx = computed<number | null>(() => {\n const local = this.hoverIdx();\n const i = local ?? this.activeIndex();\n if (i == null) return null;\n const [s, e] = this.domain();\n return i >= s && i <= e ? i : null;\n });\n\n // Zoom / brush state (indices are always in the full-data domain).\n private readonly viewRange = signal<[number, number] | null>(null);\n protected readonly brushDrag = signal<{ a: number; b: number } | null>(null);\n private readonly brushEnabled = computed(() => this.brush() || this.zoom());\n protected readonly zoomed = computed(() => this.viewRange() !== null);\n\n constructor() {\n const destroyRef = inject(DestroyRef);\n\n if (typeof matchMedia !== 'undefined') {\n const mq = matchMedia('(prefers-reduced-motion: reduce)');\n const onChange = (e: MediaQueryListEvent) => this.reduceMotion.set(e.matches);\n mq.addEventListener?.('change', onChange);\n destroyRef.onDestroy(() => mq.removeEventListener?.('change', onChange));\n }\n\n afterNextRender(() => {\n const el = this.svgRef()?.nativeElement;\n if (!el) return;\n const measure = () => this.width.set(el.clientWidth || W0);\n measure();\n if (typeof ResizeObserver !== 'undefined') {\n const ro = new ResizeObserver(measure);\n ro.observe(el);\n destroyRef.onDestroy(() => ro.disconnect());\n }\n });\n\n // On each new data frame in live mode, jump one step right then ease back to\n // 0 — a continuous left scroll (the classic realtime \"conveyor\").\n effect(() => {\n const d = this.data();\n if (\n this.isMulti() ||\n !this.live() ||\n this.reduceMotion() ||\n typeof requestAnimationFrame === 'undefined'\n )\n return;\n untracked(() => {\n if (this.firstData) {\n this.firstData = false;\n return;\n }\n if (d.length < 2) return;\n this.sliding.set(false);\n this.slidePx.set(this.stepX());\n requestAnimationFrame(() => {\n this.sliding.set(true);\n this.slidePx.set(0);\n });\n });\n });\n }\n\n // ── Series / domain ────────────────────────────────────────────\n private readonly seriesResolved = computed<StrctChartSeries[] | null>(() => {\n const s = this.series();\n return s && s.length ? s : null;\n });\n protected readonly isMulti = computed(() => this.seriesResolved() !== null);\n\n /** All data arrays (multi or single). */\n private readonly allData = computed<(number | null)[][]>(() => {\n const s = this.seriesResolved();\n return s ? s.map((x) => x.data ?? []) : [this.data()];\n });\n protected readonly isEmpty = computed(() => this.allData().every((d) => d.length === 0));\n\n /** Number of x slots. */\n private readonly nx = computed(() => Math.max(1, ...this.allData().map((d) => d.length)));\n\n /** Visible index window: the brush-zoom range, or the full data. */\n private readonly domain = computed<[number, number]>(() => {\n const n = this.nx();\n const vr = this.viewRange();\n if (!vr) return [0, n - 1];\n const s = Math.max(0, Math.min(vr[0], n - 1));\n const e = Math.max(s, Math.min(vr[1], n - 1));\n return e > s ? [s, e] : [0, n - 1];\n });\n\n /** Left padding: wider when the y-axis labels are shown. */\n protected readonly pl = computed(() => (this.yAxis() ? Y_AXIS_GUTTER : PAD.l));\n private chartW(): number {\n return this.width() - this.pl() - PAD.r;\n }\n private chartH(): number {\n return this.height() - PAD.t - PAD.b;\n }\n\n /** Horizontal gap between two data points, in px (of the visible window). */\n private stepX(): number {\n const [s, e] = this.domain();\n return e > s ? this.chartW() / (e - s) : 0;\n }\n\n /** Real values inside the visible window (multi-aware; bands included). */\n private readonly visibleValues = computed<number[]>(() => {\n const [s, e] = this.domain();\n const out: number[] = [];\n const push = (v: number | null | undefined) => {\n if (isVal(v)) out.push(v);\n };\n const ser = this.seriesResolved();\n if (ser) {\n const N = this.nx();\n for (const x of ser) {\n const data = x.data ?? [];\n const offset = N - data.length;\n for (let gi = Math.max(s, offset); gi <= e; gi++) {\n const li = gi - offset;\n if (li < 0 || li >= data.length) continue;\n push(data[li]);\n push(x.upper?.[li]);\n }\n }\n } else {\n const d = this.data();\n for (let i = s; i <= Math.min(e, d.length - 1); i++) push(d[i]);\n }\n return out;\n });\n\n private readonly yMax = computed(() => {\n const explicit = this.max();\n if (explicit != null) return explicit || 1;\n const m = Math.max(0, ...this.visibleValues());\n return m === 0 ? 1 : m * 1.1;\n });\n private readonly yMin = computed(() => this.min() ?? 0);\n\n private yOf(v: number): number {\n const lo = this.yMin();\n const hi = this.yMax();\n const range = hi - lo || 1;\n const c = Math.max(lo, Math.min(hi, v));\n return PAD.t + (1 - (c - lo) / range) * this.chartH();\n }\n\n // ── Single-series geometry (gap-aware; null keeps its x-slot) ──\n protected readonly points = computed<(Pt | null)[]>(() => {\n const d = this.data();\n return d.map((v, i) => (isVal(v) ? { x: this.xOf(i), y: this.yOf(v) } : null));\n });\n\n /** Non-gap points only (dot rendering). */\n protected readonly dotPts = computed<Pt[]>(() =>\n this.points().filter((p): p is Pt => p !== null),\n );\n\n protected readonly head = computed<Pt | null>(() => {\n const p = this.points();\n for (let i = p.length - 1; i >= 0; i--) if (p[i]) return p[i];\n return null;\n });\n\n private readonly plotPoints = computed<(Pt | null)[]>(() => {\n const p = this.points();\n if (!this.live() || p.length < 2 || !p[0]) return p;\n return [{ x: p[0].x - this.stepX(), y: p[0].y }, ...p];\n });\n\n protected readonly linePath = computed(() => pathForSegs(this.plotPoints(), this.curve()));\n\n protected readonly areaPath = computed(() =>\n areaForSegs(this.plotPoints(), this.curve(), this.height() - PAD.b),\n );\n\n // ── Multi-series geometry ─────────────────────────────────────\n protected readonly multiSeries = computed<SeriesRender[]>(() => {\n const s = this.seriesResolved();\n if (!s) return [];\n const N = this.nx();\n const base = this.height() - PAD.b;\n return s.map((x) => {\n const data = x.data ?? [];\n const offset = N - data.length; // right-align shorter series\n const ptOf = (v: number | null | undefined, i: number): Pt | null =>\n isVal(v) ? { x: this.xOf(offset + i), y: this.yOf(v) } : null;\n const pts = data.map((v, i) => ptOf(v, i));\n const curve = x.curve ?? this.curve();\n const path = pathForSegs(pts, curve);\n const area = x.area ?? false;\n const areaPath = area ? areaForSegs(pts, curve, base) : '';\n const band =\n x.lower && x.upper\n ? bandPath(\n x.upper.map((v, i) => ptOf(v, i)),\n x.lower.map((v, i) => ptOf(v, i)),\n curve,\n )\n : '';\n return {\n color: COLOR[x.status ?? this.status()],\n label: x.label ?? '',\n area,\n dash: x.dash ? (typeof x.dash === 'string' ? x.dash : '5 4') : null,\n pts,\n path,\n areaPath,\n bandPath: band,\n offset,\n data,\n lower: x.lower,\n upper: x.upper,\n };\n });\n });\n\n protected readonly legendItems = computed(() =>\n this.multiSeries()\n .filter((s) => s.label)\n .map((s) => ({ label: s.label, color: s.color, dash: s.dash })),\n );\n\n // ── Bars (single-series only; gaps render no bar, keep their slot) ──\n protected readonly bars = computed(() => {\n const d = this.data();\n const [s, e] = this.domain();\n const chartW = this.chartW();\n const base = this.height() - PAD.b;\n const last = Math.min(e, d.length - 1);\n const count = Math.max(1, last - s + 1);\n const slot = chartW / count;\n const w = slot * 0.6;\n const pl = this.pl();\n const out: { x: number; y: number; w: number; h: number }[] = [];\n for (let i = s; i <= last; i++) {\n const v = d[i];\n if (!isVal(v)) continue;\n const h = ((Math.max(0, v) - this.yMin()) / (this.yMax() - this.yMin() || 1)) * this.chartH();\n out.push({\n x: pl + (i - s) * slot + (slot - w) / 2,\n y: base - Math.max(0, h),\n w,\n h: Math.max(0, h),\n });\n }\n return out;\n });\n\n // ── Axes ───────────────────────────────────────────────────────\n protected readonly gridY = computed(() => {\n const top = PAD.t;\n const bottom = this.height() - PAD.b;\n return [top, (top + bottom) / 2, bottom];\n });\n\n private fmtAxis(v: number): string {\n const f = this.axisFormat() ?? this.valueFormat();\n return f ? f(v) : String(Math.round(v * 100) / 100);\n }\n\n protected readonly yAxisTicks = computed(() => {\n if (!this.yAxis()) return [];\n const n = Math.max(2, this.yTicks());\n const lo = this.yMin();\n const hi = this.yMax();\n const out: { value: number; y: number; text: string }[] = [];\n for (let i = 0; i < n; i++) {\n const v = lo + (hi - lo) * (i / (n - 1));\n out.push({ value: v, y: this.yOf(v), text: this.fmtAxis(v) });\n }\n return out;\n });\n\n protected readonly thresholdLines = computed(() =>\n this.thresholds().map((t) => ({\n y: this.yOf(t.value),\n color: COLOR[t.status ?? 'warning'],\n dashed: t.dashed ?? true,\n label: t.label ?? '',\n })),\n );\n\n protected readonly displayLabels = computed(() => {\n const ls = this.labels();\n const fmt = this.xFormat();\n const xt = this.xTicks();\n const [s, e] = this.domain();\n const last = Math.min(e, ls.length - 1);\n let idxs: number[];\n if (xt && xt > 1 && last - s + 1 > xt) {\n const stepI = (last - s) / (xt - 1);\n idxs = Array.from(new Set(Array.from({ length: xt }, (_, k) => s + Math.round(k * stepI))));\n } else {\n idxs = Array.from({ length: Math.max(0, last - s + 1) }, (_, k) => s + k);\n }\n return idxs\n .filter((i) => i >= 0 && i < ls.length)\n .map((i) => ({\n text: fmt ? fmt(ls[i], i) : ls[i],\n i,\n }));\n });\n\n // ── Hover (driven by dispIdx: local pointer, else external activeIndex) ──\n protected readonly hoverX = computed<number | null>(() => {\n const i = this.dispIdx();\n if (i == null) return null;\n return this.xOf(i);\n });\n protected readonly hoverPt = computed<Pt | null>(() => {\n const i = this.dispIdx();\n const p = this.points();\n return i != null && i >= 0 && i < p.length ? p[i] : null;\n });\n protected readonly hoverValue = computed(() => {\n const i = this.dispIdx();\n const d = this.data();\n const v = i != null && i >= 0 && i < d.length ? d[i] : null;\n return isVal(v) ? v : '';\n });\n /** The hovered slot exists but holds a gap (single-series). */\n protected readonly hoverGap = computed(() => {\n const i = this.dispIdx();\n if (i == null || this.isMulti()) return false;\n const d = this.data();\n return i >= 0 && i < d.length && !isVal(d[i]);\n });\n /** hoverValue run through valueFormat (unit / precision), else the raw value. */\n protected readonly hoverValueText = computed(() => {\n const v = this.hoverValue();\n if (v === '' || v == null) return '';\n const f = this.valueFormat();\n return f ? f(v as number) : String(v);\n });\n /** Delta magnitude, formatted the same way so its unit matches the value. */\n protected readonly absDeltaText = computed(() => {\n const f = this.valueFormat();\n return f ? f(this.absDelta()) : String(this.absDelta());\n });\n protected readonly hoverLabel = computed(() => {\n const i = this.dispIdx();\n const l = this.labels();\n return i != null && i >= 0 && i < l.length ? l[i] : '';\n });\n /** Change from the previous point (single-series; null at the first point or across a gap). */\n protected readonly hoverDelta = computed<number | null>(() => {\n const i = this.dispIdx();\n const d = this.data();\n if (i == null || i <= 0 || i >= d.length) return null;\n const cur = d[i];\n const prev = d[i - 1];\n return isVal(cur) && isVal(prev) ? cur - prev : null;\n });\n protected readonly absDelta = computed(() => Math.abs(this.hoverDelta() ?? 0));\n /** Second tooltip line: \"Xs ago\" while live, else the x label. */\n protected readonly hoverMeta = computed(() => {\n const i = this.dispIdx();\n if (i == null) return '';\n if (this.live()) {\n const ago = Math.round(((this.nx() - 1 - i) * this.interval()) / 1000);\n const fmt = this.agoFormat();\n if (fmt) return fmt(ago);\n return ago <= 0 ? 'now' : `${ago}s ago`;\n }\n const l = this.labels();\n return i >= 0 && i < l.length ? l[i] : '';\n });\n\n /** Per-series value at the hovered index (multi-series tooltip; bands as `avg (min–max)`). */\n protected readonly hoverRows = computed(() => {\n const i = this.dispIdx();\n const s = this.multiSeries();\n if (i == null || !s.length) return [];\n const f = this.valueFormat();\n const fmt = (v: number) => (f ? f(v) : String(v));\n return s\n .map((x) => {\n const li = i - x.offset;\n const raw = li >= 0 && li < x.data.length ? x.data[li] : null;\n const v = isVal(raw) ? raw : null;\n const lo = x.lower?.[li];\n const hi = x.upper?.[li];\n const band = isVal(lo) && isVal(hi) ? ` (${fmt(lo)}–${fmt(hi)})` : '';\n return {\n label: x.label,\n color: x.color,\n value: v,\n text: v == null ? '' : fmt(v) + band,\n };\n })\n .filter((r) => r.value !== null);\n });\n\n /** Per-series hover dots (multi-series). */\n protected readonly hoverDots = computed(() => {\n const i = this.dispIdx();\n const s = this.multiSeries();\n if (i == null || !s.length) return [];\n return s\n .map((x) => {\n const li = i - x.offset;\n const p = li >= 0 && li < x.pts.length ? x.pts[li] : null;\n return p ? { x: p.x, y: p.y, color: x.color } : null;\n })\n .filter((d): d is { x: number; y: number; color: string } => d !== null);\n });\n\n // ── Annotations ────────────────────────────────────────────────\n protected readonly annotationLines = computed(() => {\n const [s, e] = this.domain();\n return this.annotations()\n .filter((a) => a.index >= s && a.index <= e)\n .map((a) => ({\n x: this.xOf(a.index),\n color: COLOR[a.status ?? 'accent'],\n dashed: a.dashed ?? true,\n label: a.label ?? '',\n index: a.index,\n }));\n });\n /** The annotation sitting exactly under the crosshair, if any. */\n protected readonly annAt = computed(() => {\n const i = this.dispIdx();\n if (i == null) return null;\n return this.annotationLines().find((a) => a.index === i && a.label) ?? null;\n });\n\n // ── Brush / zoom ───────────────────────────────────────────────\n protected readonly brushRect = computed(() => {\n const d = this.brushDrag();\n if (!d) return null;\n const x1 = this.xOf(Math.min(d.a, d.b));\n const x2 = this.xOf(Math.max(d.a, d.b));\n return { x: round(x1), w: round(Math.max(1, x2 - x1)) };\n });\n\n /** Zoom back out to the full data window (also emits `brushChange` null). */\n resetZoom(): void {\n this.brushDrag.set(null);\n if (this.viewRange() !== null) {\n this.viewRange.set(null);\n this.brushChange.emit(null);\n }\n }\n\n /** Screen-reader summary of the whole chart (role=\"img\" name). */\n protected readonly chartAria = computed(() => {\n const f = this.valueFormat() ?? ((v: number) => String(Math.round(v * 100) / 100));\n if (this.isMulti()) {\n const parts = this.multiSeries().map((s) => {\n const reals = s.data.filter(isVal);\n const last = reals.length ? f(reals[reals.length - 1]) : '';\n return `${s.label || 'series'} latest ${last}`;\n });\n return `Chart, ${this.multiSeries().length} series: ${parts.join('; ')}`;\n }\n const d = this.data();\n const reals = d.filter(isVal);\n if (!reals.length) return this.emptyText();\n return `Chart, ${d.length} points. Min ${f(Math.min(...reals))}, max ${f(Math.max(...reals))}, latest ${f(reals[reals.length - 1])}`;\n });\n\n /** aria-live text announcing the hovered / keyboard-selected point. */\n protected readonly srText = computed(() => {\n const i = this.dispIdx();\n if (i == null) return '';\n if (this.isMulti()) {\n const rows = this.hoverRows()\n .map((r) => `${r.label || 'series'} ${r.text}`)\n .join(', ');\n return `${this.hoverMeta() || 'point ' + (i + 1)}: ${rows}`;\n }\n const meta = this.hoverMeta();\n const value = this.hoverGap() ? this.gapText() : this.hoverValueText();\n return `${meta ? meta + ': ' : ''}${value}`;\n });\n\n /** Pixel x of a data index (shared by the plot, labels and annotations). */\n protected xOf(i: number): number {\n const [s] = this.domain();\n return this.pl() + (i - s) * this.stepX();\n }\n\n /** Set the local hover index, emitting `hoverIndex` on change. */\n private setHover(i: number | null): void {\n if (i === this.hoverIdx()) return;\n this.hoverIdx.set(i);\n this.hoverIndex.emit(i);\n }\n\n protected onLeave(): void {\n this.setHover(null);\n }\n\n /** Keyboard access: arrows walk the points; Escape unwinds brush → zoom → crosshair. */\n protected onKey(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n if (this.brushDrag()) {\n this.brushDrag.set(null);\n } else if (this.zoomed()) {\n this.resetZoom();\n } else {\n this.setHover(null);\n }\n return;\n }\n if (!this.interactive() || this.type() === 'bar') return;\n const [s, e] = this.domain();\n const cur = this.hoverIdx();\n let next: number | null = null;\n switch (event.key) {\n case 'ArrowRight':\n next = cur == null ? s : Math.min(e, cur + 1);\n break;\n case 'ArrowLeft':\n next = cur == null ? e : Math.max(s, cur - 1);\n break;\n case 'Home':\n next = s;\n break;\n case 'End':\n next = e;\n break;\n default:\n return;\n }\n event.preventDefault();\n this.setHover(next);\n }\n\n /** Data index under the pointer, clamped to the visible window. */\n private idxAt(event: PointerEvent): number | null {\n const el = this.svgRef()?.nativeElement;\n if (!el || this.isEmpty()) return null;\n const rect = el.getBoundingClientRect();\n if (!rect.width) return null;\n const plFrac = this.pl() / this.width();\n const rFrac = PAD.r / this.width();\n const fx = ((event.clientX - rect.left) / rect.width - plFrac) / (1 - plFrac - rFrac);\n const [s, e] = this.domain();\n return Math.max(s, Math.min(e, s + Math.round(fx * (e - s))));\n }\n\n protected onDown(event: PointerEvent): void {\n if (!this.brushEnabled() || this.isEmpty()) return;\n const i = this.idxAt(event);\n if (i == null) return;\n (event.currentTarget as Element | null)?.setPointerCapture?.(event.pointerId);\n this.brushDrag.set({ a: i, b: i });\n this.setHover(null);\n event.preventDefault();\n }\n\n protected onMove(event: PointerEvent): void {\n const drag = this.brushDrag();\n if (drag) {\n const i = this.idxAt(event);\n if (i != null && i !== drag.b) this.brushDrag.set({ a: drag.a, b: i });\n return;\n }\n if (!this.interactive() || (this.type() === 'bar' && !this.isMulti())) return;\n const i = this.idxAt(event);\n if (i != null) this.setHover(i);\n }\n\n protected onUp(): void {\n const d = this.brushDrag();\n if (!d) return;\n this.brushDrag.set(null);\n const lo = Math.min(d.a, d.b);\n const hi = Math.max(d.a, d.b);\n if (hi - lo < 1) return; // a click, not a selection\n if (this.zoom()) this.viewRange.set([lo, hi]);\n this.brushChange.emit([lo, hi]);\n }\n\n protected onDblClick(): void {\n if (this.brushEnabled()) this.resetZoom();\n }\n\n // ── Export (FR-CHART-13) ───────────────────────────────────────\n /**\n * The rendered chart as a standalone SVG string — theme colors resolved to\n * literals, background baked in, y-tick / x-label text included.\n */\n toSVG(): string {\n const svg = this.svgRef()?.nativeElement;\n if (!svg || typeof getComputedStyle === 'undefined') return '';\n const doc = svg.ownerDocument;\n const NS = 'http://www.w3.org/2000/svg';\n const clone = svg.cloneNode(true) as SVGSVGElement;\n clone.setAttribute('xmlns', NS);\n clone.removeAttribute('class');\n clone.removeAttribute('style');\n clone.removeAttribute('tabindex');\n const PROPS = [\n 'stroke',\n 'fill',\n 'stroke-width',\n 'stroke-dasharray',\n 'stroke-linecap',\n 'stroke-linejoin',\n 'opacity',\n 'fill-opacity',\n 'stroke-opacity',\n ];\n const src = Array.from(svg.querySelectorAll<SVGElement>('*'));\n const dst = Array.from(clone.querySelectorAll<SVGElement>('*'));\n src.forEach((el, i) => {\n const cs = getComputedStyle(el);\n for (const p of PROPS) {\n const v = cs.getPropertyValue(p);\n if (v) dst[i].setAttribute(p, v);\n }\n dst[i].removeAttribute('class');\n });\n const rootCs = getComputedStyle(svg);\n const bg = rootCs.getPropertyValue('--bg-1').trim();\n const fg = rootCs.getPropertyValue('--t3').trim() || '#888';\n const hasLabels = this.displayLabels().length > 0;\n const w = this.width();\n const h = this.height() + (hasLabels ? 18 : 0);\n clone.setAttribute('viewBox', `0 0 ${w} ${h}`);\n clone.setAttribute('width', String(w));\n clone.setAttribute('height', String(h));\n if (bg) {\n const rect = doc.createElementNS(NS, 'rect');\n rect.setAttribute('width', String(w));\n rect.setAttribute('height', String(h));\n rect.setAttribute('fill', bg);\n clone.insertBefore(rect, clone.firstChild);\n }\n const text = (x: number, y: number, content: string, anchor: string) => {\n const t = doc.createElementNS(NS, 'text');\n t.setAttribute('x', String(round(x)));\n t.setAttribute('y', String(round(y)));\n t.setAttribute('fill', fg);\n t.setAttribute('font-size', '10');\n t.setAttribute('font-family', 'monospace');\n t.setAttribute('text-anchor', anchor);\n t.textContent = content;\n clone.appendChild(t);\n };\n for (const tick of this.yAxisTicks()) text(this.pl() - 6, tick.y + 3.5, tick.text, 'end');\n if (hasLabels) {\n for (const l of this.displayLabels())\n text(this.xOf(l.i), this.height() + 12, l.text, 'middle');\n }\n return new XMLSerializer().serializeToString(clone);\n }\n\n /** The chart as a PNG data URL at the given scale (default 2×). */\n toPNG(scale = 2): Promise<string> {\n const s = this.toSVG();\n const w = this.width();\n const h = this.height() + (this.displayLabels().length ? 18 : 0);\n return new Promise((resolve, reject) => {\n if (!s) {\n reject(new Error('chart is not rendered'));\n return;\n }\n const img = new Image();\n img.onload = () => {\n const canvas = document.createElement('canvas');\n canvas.width = Math.round(w * scale);\n canvas.height = Math.round(h * scale);\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n reject(new Error('no 2d canvas context'));\n return;\n }\n ctx.scale(scale, scale);\n ctx.drawImage(img, 0, 0);\n resolve(canvas.toDataURL('image/png'));\n };\n img.onerror = () => reject(new Error('SVG rasterization failed'));\n img.src = 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(s);\n });\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n input,\n signal,\n} from '@angular/core';\n\n/** A single weighted slice of a donut chart. */\nexport interface StrctDonutSegment {\n value: number;\n label?: string;\n color?: string;\n}\n\nconst PALETTE = [\n 'var(--acc)',\n 'var(--success)',\n 'var(--warning)',\n 'var(--critical)',\n 'color-mix(in srgb, var(--acc) 55%, var(--bg-1))',\n 'var(--t3)',\n];\n\nconst round = (n: number): number => Math.round(n * 100) / 100;\n\n/**\n * Donut / ring chart from weighted segments. Rounded, gapped slices with a\n * sweep-in animation; hover a slice (or its legend row) to highlight it and read\n * its value + share in the center. Dependency-free SVG, token-coloured.\n *\n * <strct-donut\n * [segments]=\"[{ value: 36, label: 'Running' }, { value: 8, label: 'Stopped' }]\"\n * centerValue=\"44\" centerLabel=\"VMs\" legend />\n */\n@Component({\n selector: 'strct-donut',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n <div class=\"strct-donut__layout\">\n <div class=\"strct-donut__wrap\" [style.width.px]=\"size()\" [style.height.px]=\"size()\">\n <svg\n class=\"strct-donut__svg\"\n role=\"img\"\n [attr.aria-label]=\"ariaSummary()\"\n [attr.viewBox]=\"'0 0 ' + size() + ' ' + size()\"\n [style.width.px]=\"size()\"\n [style.height.px]=\"size()\"\n >\n <g [attr.transform]=\"'rotate(-90 ' + half() + ' ' + half() + ')'\">\n <circle\n class=\"strct-donut__track\"\n [attr.cx]=\"half()\"\n [attr.cy]=\"half()\"\n [attr.r]=\"radius()\"\n fill=\"none\"\n [attr.stroke-width]=\"thickness()\"\n />\n @for (arc of arcs(); track $index) {\n <circle\n class=\"strct-donut__arc\"\n [class.is-dim]=\"hovered() !== null && hovered() !== $index\"\n [attr.cx]=\"half()\"\n [attr.cy]=\"half()\"\n [attr.r]=\"radius()\"\n fill=\"none\"\n stroke-linecap=\"round\"\n [attr.stroke]=\"arc.color\"\n [attr.stroke-width]=\"hovered() === $index ? thickness() + 5 : thickness()\"\n [attr.stroke-dasharray]=\"arc.dash\"\n [attr.stroke-dashoffset]=\"arc.offset\"\n (pointerenter)=\"enter($index)\"\n (pointerleave)=\"leave()\"\n />\n }\n </g>\n </svg>\n @if (centerMain() || centerSub()) {\n <div class=\"strct-donut__center\">\n <div class=\"strct-donut__value\" [style.color]=\"centerColor()\">{{ centerMain() }}</div>\n <div class=\"strct-donut__label\">{{ centerSub() }}</div>\n </div>\n }\n </div>\n\n @if (legend()) {\n <ul class=\"strct-donut__legend\">\n @for (arc of arcs(); track $index) {\n <li\n class=\"strct-donut__leg\"\n tabindex=\"0\"\n [class.is-active]=\"hovered() === $index\"\n [class.is-dim]=\"hovered() !== null && hovered() !== $index\"\n (pointerenter)=\"enter($index)\"\n (pointerleave)=\"leave()\"\n (focus)=\"enter($index)\"\n (blur)=\"leave()\"\n >\n <span class=\"strct-donut__swatch\" [style.background]=\"arc.color\"></span>\n <span class=\"strct-donut__leg-label\">{{ arc.label }}</span>\n <span class=\"strct-donut__leg-val\">{{ arc.value }}</span>\n <span class=\"strct-donut__leg-pct\">{{ arc.pct }}%</span>\n </li>\n }\n </ul>\n }\n </div>\n `,\n host: { class: 'strct-donut' },\n styles: [\n `\n .strct-donut {\n display: inline-block;\n }\n .strct-donut__layout {\n display: inline-flex;\n align-items: center;\n gap: 20px;\n }\n .strct-donut__wrap {\n position: relative;\n flex-shrink: 0;\n }\n .strct-donut__track {\n stroke: var(--bg-3);\n }\n .strct-donut__arc {\n cursor: pointer;\n transition:\n stroke-width 0.16s ease,\n opacity 0.16s ease;\n }\n .strct-donut__arc.is-dim {\n opacity: 0.32;\n }\n .strct-donut__center {\n position: absolute;\n inset: 0;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n pointer-events: none;\n }\n .strct-donut__value {\n font-size: var(--text-2xl);\n font-weight: 650;\n color: var(--t1);\n line-height: 1;\n font-variant-numeric: tabular-nums;\n transition: color 0.16s ease;\n }\n .strct-donut__label {\n font-size: 12px;\n color: var(--t2);\n margin-top: 3px;\n }\n\n /* Legend */\n .strct-donut__legend {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n }\n .strct-donut__leg {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 3px 6px;\n border-radius: var(--radius-sm);\n font-size: 12px;\n color: var(--t2);\n cursor: pointer;\n transition:\n background 0.14s ease,\n opacity 0.14s ease;\n }\n .strct-donut__leg.is-active {\n background: var(--bg-2);\n color: var(--t1);\n }\n .strct-donut__leg.is-dim {\n opacity: 0.45;\n }\n .strct-donut__leg:focus-visible {\n outline: none;\n box-shadow: inset 0 0 0 2px var(--acc50);\n }\n .strct-donut__swatch {\n width: 9px;\n height: 9px;\n border-radius: 2px;\n flex-shrink: 0;\n }\n .strct-donut__leg-label {\n flex: 1;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n .strct-donut__leg-val {\n font-variant-numeric: tabular-nums;\n font-weight: 600;\n color: var(--t1);\n }\n .strct-donut__leg-pct {\n font-variant-numeric: tabular-nums;\n color: var(--t3);\n min-width: 34px;\n text-align: end;\n }\n\n @media (prefers-reduced-motion: no-preference) {\n .strct-donut__svg {\n transform-origin: center;\n animation: strct-donut-in 0.6s cubic-bezier(0.22, 1, 0.36, 1) both;\n }\n }\n @keyframes strct-donut-in {\n from {\n opacity: 0;\n transform: rotate(-16deg) scale(0.94);\n }\n to {\n opacity: 1;\n transform: none;\n }\n }\n `,\n ],\n})\nexport class StrctDonut {\n /** Weighted segments. */\n readonly segments = input.required<StrctDonutSegment[]>();\n /** Size variant. */\n readonly size = input(120);\n /** Stroke thickness in pixels. */\n readonly thickness = input(14);\n /** Value shown in the donut center (when no slice is hovered). */\n readonly centerValue = input<string | number>('');\n /** Label shown in the donut center (when no slice is hovered). */\n readonly centerLabel = input('');\n /** Show a legend (color · label · value · %) beside the ring. */\n readonly legend = input(false, { transform: booleanAttribute });\n /** Gap between slices, in degrees. */\n readonly gap = input(3);\n /** Hover highlight + center readout. */\n readonly interactive = input(true, { transform: booleanAttribute });\n\n protected readonly hovered = signal<number | null>(null);\n\n protected readonly half = computed(() => this.size() / 2);\n protected readonly radius = computed(() => (this.size() - this.thickness()) / 2);\n protected readonly circumference = computed(() => 2 * Math.PI * this.radius());\n\n private readonly total = computed(\n () => this.segments().reduce((s, x) => s + Math.max(0, x.value), 0) || 1,\n );\n\n protected readonly arcs = computed(() => {\n const segs = this.segments();\n const total = this.total();\n const c = this.circumference();\n // Gap (in px along the circumference) only when there is more than one slice.\n const gapPx = segs.length > 1 ? (this.gap() / 360) * c : 0;\n let cursor = 0;\n return segs.map((seg, i) => {\n const full = (Math.max(0, seg.value) / total) * c;\n const vis = Math.max(0, full - gapPx);\n const arc = {\n color: seg.color ?? PALETTE[i % PALETTE.length],\n label: seg.label ?? `Slice ${i + 1}`,\n value: seg.value,\n pct: Math.round((Math.max(0, seg.value) / total) * 100),\n dash: `${round(vis)} ${round(c - vis)}`,\n offset: round(-(cursor + gapPx / 2)),\n };\n cursor += full;\n return arc;\n });\n });\n\n protected readonly centerMain = computed(() => {\n const h = this.hovered();\n if (h !== null) return this.arcs()[h]?.value ?? '';\n return this.centerValue();\n });\n protected readonly centerSub = computed(() => {\n const h = this.hovered();\n if (h !== null) {\n const a = this.arcs()[h];\n return a ? `${a.label} · ${a.pct}%` : '';\n }\n return this.centerLabel();\n });\n protected readonly centerColor = computed(() => {\n const h = this.hovered();\n return h !== null ? (this.arcs()[h]?.color ?? 'var(--t1)') : 'var(--t1)';\n });\n\n /** Screen-reader summary (role=\"img\" name): every slice with value + share. */\n protected readonly ariaSummary = computed(() => {\n const parts = this.arcs().map((a) => `${a.label} ${a.value} (${a.pct}%)`);\n return `Donut chart: ${parts.join(', ')}`;\n });\n\n protected enter(i: number): void {\n if (this.interactive()) this.hovered.set(i);\n }\n protected leave(): void {\n this.hovered.set(null);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n input,\n} from '@angular/core';\nimport { StrctChartStatus } from './sparkline';\nimport { StrctThresholds } from '../status';\n\nconst COLOR: Record<StrctChartStatus, string> = {\n accent: 'var(--acc)',\n success: 'var(--success)',\n warning: 'var(--warning)',\n critical: 'var(--critical)',\n};\n\n/**\n * 270° radial gauge for a 0–100 value (CPU, memory, capacity …).\n * <strct-gauge [value]=\"72\" status=\"warning\" label=\"CPU\" />\n */\n@Component({\n selector: 'strct-gauge',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n <div class=\"strct-gauge__wrap\" [style.width.px]=\"size()\" [style.height.px]=\"size()\">\n <svg\n [attr.viewBox]=\"'0 0 ' + size() + ' ' + size()\"\n [style.width.px]=\"size()\"\n [style.height.px]=\"size()\"\n >\n <g [attr.transform]=\"'rotate(135 ' + half() + ' ' + half() + ')'\">\n <circle\n class=\"strct-gauge__track\"\n [attr.cx]=\"half()\"\n [attr.cy]=\"half()\"\n [attr.r]=\"radius()\"\n fill=\"none\"\n [attr.stroke-width]=\"thickness()\"\n stroke-linecap=\"round\"\n [attr.stroke-dasharray]=\"trackDash()\"\n />\n <circle\n class=\"strct-gauge__value\"\n [attr.cx]=\"half()\"\n [attr.cy]=\"half()\"\n [attr.r]=\"radius()\"\n fill=\"none\"\n [attr.stroke]=\"color()\"\n [attr.stroke-width]=\"thickness()\"\n stroke-linecap=\"round\"\n [attr.stroke-dasharray]=\"valueDash()\"\n />\n </g>\n </svg>\n <div class=\"strct-gauge__center\">\n <div class=\"strct-gauge__num\">{{ clamped() }}<span class=\"strct-gauge__pct\">%</span></div>\n @if (label()) {\n <div class=\"strct-gauge__label\">{{ label() }}</div>\n }\n </div>\n </div>\n `,\n host: { class: 'strct-gauge' },\n styles: [\n `\n .strct-gauge {\n display: inline-block;\n }\n .strct-gauge__wrap {\n position: relative;\n }\n .strct-gauge__track {\n stroke: var(--bg-3);\n }\n .strct-gauge__value {\n transition: stroke-dasharray 0.4s ease;\n }\n .strct-gauge__center {\n position: absolute;\n inset: 0;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n pointer-events: none;\n }\n .strct-gauge__num {\n font-size: var(--text-2xl);\n font-weight: 600;\n color: var(--t1);\n line-height: 1;\n }\n .strct-gauge__pct {\n font-size: 12px;\n color: var(--t2);\n margin-inline-start: 1px;\n }\n .strct-gauge__label {\n font-size: 12px;\n color: var(--t2);\n margin-top: 3px;\n }\n `,\n ],\n})\nexport class StrctGauge {\n /** Current value. */\n readonly value = input(0);\n /** Visual status color. */\n readonly status = input<StrctChartStatus>('accent');\n /**\n * Optional value-driven thresholds. When set, the gauge picks its own status\n * from the value: `value >= critical` → critical, `>= warning` → warning, else\n * the healthy base (`status`, or `'success'` when `status` is left at its\n * default `'accent'`).\n */\n readonly thresholds = input<StrctThresholds | null>(null);\n /** Label text. */\n readonly label = input('');\n /** Size variant. */\n readonly size = input(120);\n /** Stroke thickness in pixels. */\n readonly thickness = input(12);\n\n protected readonly clamped = computed(() => Math.round(Math.max(0, Math.min(100, this.value()))));\n protected readonly half = computed(() => this.size() / 2);\n protected readonly radius = computed(() => (this.size() - this.thickness()) / 2);\n\n /** Status after applying thresholds (falls back to `status` when none set). */\n protected readonly resolvedStatus = computed<StrctChartStatus>(() => {\n const t = this.thresholds();\n if (!t) return this.status();\n const v = this.value();\n if (t.critical != null && v >= t.critical) return 'critical';\n if (t.warning != null && v >= t.warning) return 'warning';\n const base = this.status();\n return base === 'accent' ? 'success' : base;\n });\n\n protected readonly color = computed(() => COLOR[this.resolvedStatus()]);\n\n private readonly circumference = computed(() => 2 * Math.PI * this.radius());\n\n protected readonly trackDash = computed(() => {\n const c = this.circumference();\n return `${0.75 * c} ${c}`;\n });\n\n protected readonly valueDash = computed(() => {\n const c = this.circumference();\n return `${(this.clamped() / 100) * 0.75 * c} ${c}`;\n });\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n input,\n} from '@angular/core';\nimport { StrctStatus } from '../status';\n\n/** One endpoint in a `StrctFlow`. */\nexport interface StrctFlowNode {\n /** Stable identity (used as the @for track key). */\n id: string;\n /** Primary terminal label. */\n label: string;\n /** Optional secondary line under the label. */\n sublabel?: string;\n /** Optional role tag (e.g. \"ACTIVE\", \"STANDBY\"). */\n role?: string;\n /** Optional status dot tone for this terminal. */\n status?: StrctStatus;\n}\n\n/** Direction of travel for the animated flow. */\nexport type StrctFlowDirection = 'forward' | 'reverse' | 'both';\n/** Axis the terminals are laid out along. */\nexport type StrctFlowOrientation = 'horizontal' | 'vertical';\n\n/**\n * Shows a connection between two (or N) endpoints with an optional animated\n * \"flow\" — moving dots travelling along the connector — to represent live data\n * movement (replication, sync, a pipeline).\n *\n * <strct-flow\n * [nodes]=\"[\n * { id: 'a', label: 'node01', role: 'ACTIVE', status: 'success' },\n * { id: 'b', label: 'node02', role: 'STANDBY', status: 'accent' }\n * ]\"\n * [live]=\"true\" label=\"live replication · 0 lag\" status=\"success\" />\n *\n * When `live` is off (or the user prefers reduced motion) the connector is a\n * static gradient with a direction arrow instead of moving dots.\n */\n@Component({\n selector: 'strct-flow',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n <div class=\"strct-flow__row\">\n @for (node of nodes(); track node.id; let last = $last) {\n <div class=\"strct-flow__node strct-flow__node--{{ node.status ?? 'neutral' }}\">\n <span class=\"strct-flow__dot\" aria-hidden=\"true\"></span>\n <span class=\"strct-flow__node-text\">\n <span class=\"strct-flow__label\">{{ node.label }}</span>\n @if (node.role) {\n <span class=\"strct-flow__role\">{{ node.role }}</span>\n }\n @if (node.sublabel) {\n <span class=\"strct-flow__sub\">{{ node.sublabel }}</span>\n }\n </span>\n </div>\n\n @if (!last) {\n <div class=\"strct-flow__conn\" aria-hidden=\"true\">\n <span class=\"strct-flow__line\"></span>\n @if (showArrow('forward')) {\n <span class=\"strct-flow__arrow strct-flow__arrow--fwd\"></span>\n }\n @if (showArrow('reverse')) {\n <span class=\"strct-flow__arrow strct-flow__arrow--rev\"></span>\n }\n @if (animated()) {\n @if (showArrow('forward')) {\n <span class=\"strct-flow__pkt strct-flow__pkt--fwd strct-flow__pkt--1\"></span>\n <span class=\"strct-flow__pkt strct-flow__pkt--fwd strct-flow__pkt--2\"></span>\n <span class=\"strct-flow__pkt strct-flow__pkt--fwd strct-flow__pkt--3\"></span>\n }\n @if (showArrow('reverse')) {\n <span class=\"strct-flow__pkt strct-flow__pkt--rev strct-flow__pkt--1\"></span>\n <span class=\"strct-flow__pkt strct-flow__pkt--rev strct-flow__pkt--2\"></span>\n <span class=\"strct-flow__pkt strct-flow__pkt--rev strct-flow__pkt--3\"></span>\n }\n }\n </div>\n }\n }\n </div>\n\n @if (caption()) {\n <div class=\"strct-flow__caption\">{{ caption() }}</div>\n }\n `,\n host: {\n class: 'strct-flow',\n role: 'img',\n '[class.strct-flow--vertical]': \"orientation() === 'vertical'\",\n '[class.strct-flow--neutral]': \"status() === 'neutral'\",\n '[class.strct-flow--accent]': \"status() === 'accent'\",\n '[class.strct-flow--success]': \"status() === 'success'\",\n '[class.strct-flow--warning]': \"status() === 'warning'\",\n '[class.strct-flow--critical]': \"status() === 'critical'\",\n '[class.strct-flow--live]': 'animated()',\n '[attr.aria-label]': 'ariaLabel()',\n },\n styles: [\n `\n .strct-flow {\n --strct-flow-color: var(--acc);\n display: block;\n }\n .strct-flow--neutral {\n --strct-flow-color: var(--t3);\n }\n .strct-flow--accent {\n --strct-flow-color: var(--acc);\n }\n .strct-flow--success {\n --strct-flow-color: var(--success);\n }\n .strct-flow--warning {\n --strct-flow-color: var(--warning);\n }\n .strct-flow--critical {\n --strct-flow-color: var(--critical);\n }\n\n .strct-flow__row {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n }\n .strct-flow--vertical .strct-flow__row {\n flex-direction: column;\n align-items: stretch;\n }\n\n /* ── Terminal ─────────────────────────────────────────────── */\n .strct-flow__node {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n padding: var(--space-2) var(--space-3);\n border: 1px solid var(--b2);\n border-radius: var(--radius-md);\n background: var(--bg-1);\n flex-shrink: 0;\n }\n .strct-flow__dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n flex-shrink: 0;\n background: var(--t3);\n }\n .strct-flow__node--accent .strct-flow__dot {\n background: var(--acc);\n }\n .strct-flow__node--success .strct-flow__dot {\n background: var(--success);\n }\n .strct-flow__node--warning .strct-flow__dot {\n background: var(--warning);\n }\n .strct-flow__node--critical .strct-flow__dot {\n background: var(--critical);\n }\n .strct-flow__node-text {\n display: flex;\n flex-direction: column;\n gap: 1px;\n min-width: 0;\n }\n .strct-flow__label {\n font-size: var(--text-md);\n font-weight: 600;\n color: var(--t1);\n line-height: 1.2;\n }\n .strct-flow__role {\n font-size: 12px;\n font-weight: 700;\n letter-spacing: 0.4px;\n color: var(--t3);\n }\n .strct-flow__sub {\n font-size: var(--text-sm);\n color: var(--t3);\n }\n\n /* ── Connector ────────────────────────────────────────────── */\n .strct-flow__conn {\n position: relative;\n flex: 1 1 auto;\n min-width: 40px;\n height: 2px;\n align-self: center;\n }\n .strct-flow--vertical .strct-flow__conn {\n width: 2px;\n min-width: 0;\n height: 28px;\n flex: 0 0 28px;\n align-self: center;\n }\n .strct-flow__line {\n position: absolute;\n inset: 0;\n border-radius: 2px;\n background: linear-gradient(\n to right,\n var(--b3),\n color-mix(in srgb, var(--strct-flow-color) 55%, transparent),\n var(--b3)\n );\n }\n .strct-flow--vertical .strct-flow__line {\n background: linear-gradient(\n to bottom,\n var(--b3),\n color-mix(in srgb, var(--strct-flow-color) 55%, transparent),\n var(--b3)\n );\n }\n\n /* Direction arrowheads (always shown, even when not live). */\n .strct-flow__arrow {\n position: absolute;\n top: 50%;\n width: 0;\n height: 0;\n border-top: 4px solid transparent;\n border-bottom: 4px solid transparent;\n }\n .strct-flow__arrow--fwd {\n right: -1px;\n transform: translateY(-50%);\n border-inline-start: 6px solid var(--strct-flow-color);\n }\n .strct-flow__arrow--rev {\n left: -1px;\n transform: translateY(-50%);\n border-inline-end: 6px solid var(--strct-flow-color);\n }\n .strct-flow--vertical .strct-flow__arrow {\n top: auto;\n left: 50%;\n }\n .strct-flow--vertical .strct-flow__arrow--fwd {\n right: auto;\n bottom: -1px;\n transform: translateX(-50%);\n border-inline-start: 4px solid transparent;\n border-inline-end: 4px solid transparent;\n border-top: 6px solid var(--strct-flow-color);\n border-bottom: 0;\n }\n .strct-flow--vertical .strct-flow__arrow--rev {\n left: 50%;\n top: -1px;\n transform: translateX(-50%);\n border-inline-start: 4px solid transparent;\n border-inline-end: 4px solid transparent;\n border-bottom: 6px solid var(--strct-flow-color);\n border-top: 0;\n }\n\n /* Travelling packets. */\n .strct-flow__pkt {\n position: absolute;\n top: 50%;\n width: 5px;\n height: 5px;\n margin: -2.5px 0 0 -2.5px;\n border-radius: 50%;\n background: var(--strct-flow-color);\n box-shadow: 0 0 5px var(--strct-flow-color);\n }\n .strct-flow--vertical .strct-flow__pkt {\n top: 0;\n left: 50%;\n }\n .strct-flow__pkt--fwd {\n animation: strct-flow-fwd 1.8s linear infinite;\n }\n .strct-flow__pkt--rev {\n animation: strct-flow-rev 1.8s linear infinite;\n }\n .strct-flow--vertical .strct-flow__pkt--fwd {\n animation-name: strct-flow-fwd-v;\n }\n .strct-flow--vertical .strct-flow__pkt--rev {\n animation-name: strct-flow-rev-v;\n }\n .strct-flow__pkt--2 {\n animation-delay: 0.6s;\n }\n .strct-flow__pkt--3 {\n animation-delay: 1.2s;\n }\n\n @keyframes strct-flow-fwd {\n from {\n left: 0;\n opacity: 0;\n }\n 15%,\n 85% {\n opacity: 1;\n }\n to {\n left: 100%;\n opacity: 0;\n }\n }\n @keyframes strct-flow-rev {\n from {\n left: 100%;\n opacity: 0;\n }\n 15%,\n 85% {\n opacity: 1;\n }\n to {\n left: 0;\n opacity: 0;\n }\n }\n @keyframes strct-flow-fwd-v {\n from {\n top: 0;\n opacity: 0;\n }\n 15%,\n 85% {\n opacity: 1;\n }\n to {\n top: 100%;\n opacity: 0;\n }\n }\n @keyframes strct-flow-rev-v {\n from {\n top: 100%;\n opacity: 0;\n }\n 15%,\n 85% {\n opacity: 1;\n }\n to {\n top: 0;\n opacity: 0;\n }\n }\n\n .strct-flow__caption {\n margin-top: var(--space-2);\n text-align: center;\n font-size: var(--text-sm);\n color: var(--t3);\n }\n .strct-flow--vertical .strct-flow__caption {\n text-align: start;\n }\n\n /* Reduced motion: keep the static gradient + arrows, drop the packets. */\n @media (prefers-reduced-motion: reduce) {\n .strct-flow__pkt {\n display: none;\n }\n }\n `,\n ],\n})\nexport class StrctFlow {\n /** Ordered endpoints. */\n readonly nodes = input<StrctFlowNode[]>([]);\n /** Animate the flow (packets travel along the connector). */\n readonly live = input(false, { transform: booleanAttribute });\n /** Direction of travel. */\n readonly direction = input<StrctFlowDirection>('forward');\n /** Caption under the connector (e.g. \"live replication\", \"0 lag\"). */\n readonly label = input('');\n /** Connector + packet color. */\n readonly status = input<StrctStatus>('accent');\n /** Layout axis. */\n readonly orientation = input<StrctFlowOrientation>('horizontal');\n\n /** A flow needs at least two terminals to animate. */\n protected readonly connected = computed(() => this.nodes().length > 1);\n protected readonly animated = computed(() => this.live() && this.connected());\n\n /** Whether to show packets / arrow in the given travel direction. */\n protected showArrow(dir: 'forward' | 'reverse'): boolean {\n const d = this.direction();\n return d === 'both' || d === dir;\n }\n\n /** Caption text, falling back to a \"no connection\" hint for a lone terminal. */\n protected readonly caption = computed(() => {\n if (!this.connected()) return this.label() || 'No connection';\n return this.label();\n });\n\n /** Human-readable summary for assistive tech. */\n protected readonly ariaLabel = computed(() => {\n const labels = this.nodes().map((n) => n.label);\n if (labels.length === 0) return this.label() || 'Flow';\n if (labels.length === 1) return `${labels[0]}, no connection`;\n const sep =\n this.direction() === 'both' ? ' ↔ ' : this.direction() === 'reverse' ? ' ← ' : ' → ';\n const live = this.live() ? ', live' : '';\n const cap = this.label() ? ` (${this.label()})` : '';\n return `Flow ${labels.join(sep)}${live}${cap}`;\n });\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n input,\n} from '@angular/core';\nimport { StrctIcon } from '../icon/icon';\nimport { StrctChartStatus, StrctSparkline } from '../charts/sparkline';\n\n/** Accent colour for a metric tile. */\nexport type StrctMetricStatus = 'neutral' | 'accent' | 'success' | 'warning' | 'critical';\n\n/**\n * Dense KPI tile: a label, a large value (+ unit), an optional change indicator\n * and an optional inline sparkline. Built for at-a-glance dashboards.\n *\n * <strct-metric-tile label=\"CPU\" [value]=\"62\" unit=\"%\" icon=\"cpu\"\n * status=\"warning\" [delta]=\"8\" [data]=\"cpuTrend\" />\n */\n@Component({\n selector: 'strct-metric-tile',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon, StrctSparkline],\n template: `\n <div class=\"strct-mt__top\">\n @if (icon()) {\n <span class=\"strct-mt__icon\"><strct-icon [name]=\"icon()\" [size]=\"16\" /></span>\n }\n <span class=\"strct-mt__label\">{{ label() }}</span>\n @if (hasDelta()) {\n <span class=\"strct-mt__delta strct-mt__delta--{{ deltaTone() }}\">\n <strct-icon\n [name]=\"delta()! >= 0 ? 'arrowUp' : 'arrowDown'\"\n [size]=\"11\"\n [strokeWidth]=\"2\"\n />\n {{ absDelta() }}{{ deltaSuffix() }}\n </span>\n }\n </div>\n\n <div class=\"strct-mt__value strct-mt__value--{{ status() }}\">\n {{ value() }}\n @if (unit()) {\n <span class=\"strct-mt__unit\">{{ unit() }}</span>\n }\n </div>\n\n @if (caption()) {\n <div class=\"strct-mt__caption\">{{ caption() }}</div>\n }\n\n @if (data().length) {\n <div class=\"strct-mt__spark\">\n <strct-sparkline [data]=\"data()\" [status]=\"sparkStatus()\" area [height]=\"28\" />\n </div>\n }\n `,\n host: { class: 'strct-mt' },\n styles: [\n `\n .strct-mt {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 13px 15px;\n border: 1px solid var(--b2);\n border-radius: 10px;\n background: var(--bg-1);\n min-width: 0;\n }\n .strct-mt__top {\n display: flex;\n align-items: center;\n gap: 7px;\n }\n .strct-mt__icon {\n display: inline-flex;\n color: var(--t3);\n flex-shrink: 0;\n }\n .strct-mt__label {\n font-size: 12px;\n font-weight: 500;\n color: var(--t3);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n .strct-mt__delta {\n display: inline-flex;\n align-items: center;\n gap: 2px;\n margin-inline-start: auto;\n font-size: 12px;\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n flex-shrink: 0;\n }\n .strct-mt__delta--up {\n color: var(--success);\n }\n .strct-mt__delta--down {\n color: var(--critical);\n }\n .strct-mt__delta--flat {\n color: var(--t3);\n }\n .strct-mt__value {\n display: flex;\n align-items: baseline;\n gap: 4px;\n font-size: var(--text-3xl);\n font-weight: 650;\n letter-spacing: -0.01em;\n color: var(--t1);\n line-height: 1.1;\n }\n .strct-mt__value--accent {\n color: var(--acc);\n }\n .strct-mt__value--success {\n color: var(--success);\n }\n .strct-mt__value--warning {\n color: var(--warning);\n }\n .strct-mt__value--critical {\n color: var(--critical);\n }\n .strct-mt__unit {\n font-size: 14px;\n font-weight: 500;\n color: var(--t3);\n letter-spacing: 0;\n }\n .strct-mt__caption {\n font-size: 12px;\n color: var(--t3);\n }\n .strct-mt__spark {\n margin-top: 2px;\n line-height: 0;\n }\n .strct-mt__spark strct-sparkline,\n .strct-mt__spark .strct-spark__svg {\n width: 100%;\n }\n `,\n ],\n})\nexport class StrctMetricTile {\n /** Small caption above the value. */\n readonly label = input.required<string>();\n /** The headline value. */\n readonly value = input.required<string | number>();\n /** Unit shown after the value (e.g. `%`, `GB`). */\n readonly unit = input('');\n /** Optional leading icon name. */\n readonly icon = input('');\n /** Tints the value (defaults to neutral primary text). */\n readonly status = input<StrctMetricStatus>('neutral');\n /** Change indicator; sign drives the arrow + colour. Null hides it. */\n readonly delta = input<number | null>(null);\n /** Suffix for the delta number. */\n readonly deltaSuffix = input('%');\n /** Treat a positive delta as bad (e.g. error rate, latency). */\n readonly invertDelta = input(false, { transform: booleanAttribute });\n /** Small sub-text under the value (e.g. \"of 256 GB\"). */\n readonly caption = input('');\n /** Sparkline series; empty hides the chart. */\n readonly data = input<number[]>([]);\n\n protected readonly hasDelta = computed(() => this.delta() !== null);\n protected readonly absDelta = computed(() => Math.abs(this.delta() ?? 0));\n protected readonly deltaTone = computed<'up' | 'down' | 'flat'>(() => {\n const d = this.delta() ?? 0;\n if (d === 0) return 'flat';\n const good = this.invertDelta() ? d < 0 : d > 0;\n return good ? 'up' : 'down';\n });\n\n protected readonly sparkStatus = computed<StrctChartStatus>(() => {\n const s = this.status();\n return s === 'neutral' ? 'accent' : s;\n });\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n input,\n} from '@angular/core';\nimport { StrctIcon } from '../icon/icon';\nimport { StrctStatus } from '../status';\n\nlet heroCounter = 0;\n\n/** Default leading icon per status, when `icon` is not supplied. */\nconst DEFAULT_ICON: Record<StrctStatus, string> = {\n success: 'success',\n warning: 'warning',\n critical: 'critical',\n accent: 'info',\n neutral: 'info',\n};\n\n/**\n * Page-level status summary banner: a tone-colored surface with a leading icon\n * chip, a heading, a description, and optional right-aligned metadata / actions.\n *\n * Distinct from `StrctAlert` (a dismissible inline notification) and\n * `StrctSignpost` (a popover). Use it for the prominent \"Protected\", \"All systems\n * healthy\", \"Clock synchronized\" summaries apps otherwise hand-roll.\n *\n * <strct-hero status=\"success\" icon=\"shield\" heading=\"High availability is on\">\n * The standby node can take over if this one fails.\n * <div strctHeroMeta><strct-badge status=\"success\">HA ON</strct-badge></div>\n * <div strctHeroActions>\n * <button strct-button size=\"sm\">Switch over</button>\n * </div>\n * </strct-hero>\n */\n@Component({\n selector: 'strct-hero',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon],\n template: `\n <span class=\"strct-hero__chip\" aria-hidden=\"true\">\n <strct-icon [name]=\"resolvedIcon()\" [size]=\"dense() ? 16 : 18\" />\n </span>\n\n <div class=\"strct-hero__text\">\n <div class=\"strct-hero__heading\" [id]=\"headingId\">{{ heading() }}</div>\n <div class=\"strct-hero__desc\"><ng-content /></div>\n </div>\n\n <div class=\"strct-hero__aside\">\n <div class=\"strct-hero__meta\"><ng-content select=\"[strctHeroMeta]\" /></div>\n <div class=\"strct-hero__actions\"><ng-content select=\"[strctHeroActions]\" /></div>\n </div>\n `,\n host: {\n class: 'strct-hero',\n '[class.strct-hero--accent]': \"status() === 'accent'\",\n '[class.strct-hero--success]': \"status() === 'success'\",\n '[class.strct-hero--warning]': \"status() === 'warning'\",\n '[class.strct-hero--critical]': \"status() === 'critical'\",\n '[class.strct-hero--dense]': 'dense()',\n '[attr.role]': \"status() === 'critical' ? 'alert' : 'status'\",\n '[attr.aria-labelledby]': 'headingId',\n },\n styles: [\n `\n /* Restrained: neutral raised surface with a colored left rail + a filled,\n status-colored icon chip — the tint carries the tone without a loud fill. */\n .strct-hero {\n display: flex;\n align-items: flex-start;\n flex-wrap: wrap;\n gap: var(--space-3);\n padding: var(--space-4) var(--space-5);\n border-radius: var(--radius-lg);\n background: var(--bg-1);\n border: 1px solid var(--b2);\n border-inline-start: 3px solid var(--b3);\n }\n .strct-hero--dense {\n padding: var(--space-3) var(--space-4);\n gap: var(--space-2);\n }\n\n .strct-hero__chip {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 34px;\n height: 34px;\n border-radius: 50%;\n flex-shrink: 0;\n background: var(--bg-a);\n color: var(--t2);\n }\n .strct-hero--dense .strct-hero__chip {\n width: 28px;\n height: 28px;\n }\n\n .strct-hero__text {\n flex: 1 1 280px;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 3px;\n }\n .strct-hero__heading {\n font-size: var(--text-xl);\n font-weight: 650;\n letter-spacing: -0.01em;\n color: var(--t1);\n line-height: var(--leading-tight);\n }\n .strct-hero--dense .strct-hero__heading {\n font-size: var(--text-lg);\n }\n .strct-hero__desc {\n font-size: var(--text-md);\n color: var(--t2);\n line-height: var(--leading-normal);\n }\n /* Collapse the description wrapper when nothing is projected into it. */\n .strct-hero__desc:empty {\n display: none;\n }\n\n /* Right-aligned cluster: metadata above, actions below; wraps under the text\n on narrow widths. */\n .strct-hero__aside {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: var(--space-2);\n margin-inline-start: auto;\n }\n .strct-hero__meta,\n .strct-hero__actions {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: var(--space-2);\n justify-content: flex-end;\n }\n .strct-hero__meta:empty,\n .strct-hero__actions:empty {\n display: none;\n }\n .strct-hero__aside:not(:has(*:not(:empty))) {\n display: none;\n }\n\n /* Status tints: colored left rail + filled icon chip. */\n .strct-hero--accent {\n border-inline-start-color: var(--acc);\n }\n .strct-hero--accent .strct-hero__chip {\n background: var(--acc);\n color: var(--inv);\n }\n .strct-hero--success {\n border-inline-start-color: var(--success);\n }\n .strct-hero--success .strct-hero__chip {\n background: var(--success);\n color: var(--inv);\n }\n .strct-hero--warning {\n border-inline-start-color: var(--warning);\n }\n .strct-hero--warning .strct-hero__chip {\n background: var(--warning);\n color: var(--inv);\n }\n .strct-hero--critical {\n border-inline-start-color: var(--critical);\n }\n .strct-hero--critical .strct-hero__chip {\n background: var(--critical);\n color: var(--inv);\n }\n\n @media (max-width: 560px) {\n .strct-hero__aside {\n margin-inline-start: 0;\n align-items: stretch;\n width: 100%;\n }\n .strct-hero__meta,\n .strct-hero__actions {\n justify-content: flex-start;\n }\n }\n `,\n ],\n})\nexport class StrctHero {\n /** Tone: drives the left rail + icon chip color. */\n readonly status = input<StrctStatus>('neutral');\n /** Leading icon name (StrctIcon set). Falls back to a per-status default. */\n readonly icon = input('');\n /** The headline; exposed as the banner's accessible name. */\n readonly heading = input.required<string>();\n /** Tighter padding for secondary placements. */\n readonly dense = input(false, { transform: booleanAttribute });\n\n protected readonly headingId = `strct-hero-${++heroCounter}`;\n protected readonly resolvedIcon = computed(() => this.icon() || DEFAULT_ICON[this.status()]);\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n input,\n output,\n} from '@angular/core';\nimport { StrctIcon } from '../icon/icon';\n\n/** Alert visual types. */\nexport type StrctAlertType = 'info' | 'success' | 'warning' | 'critical';\n\n/** Inline contextual banner. `<strct-alert type=\"warning\">…</strct-alert>`. */\n@Component({\n selector: 'strct-alert',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon],\n template: `\n <strct-icon [name]=\"icon()\" [size]=\"16\" />\n <div class=\"strct-alert__body\"><ng-content /></div>\n @if (closable()) {\n <button\n type=\"button\"\n class=\"strct-alert__close\"\n [attr.aria-label]=\"dismissLabel()\"\n (click)=\"closed.emit()\"\n >\n <strct-icon name=\"close\" [size]=\"13\" />\n </button>\n }\n `,\n host: {\n class: 'strct-alert',\n role: 'status',\n '[class.strct-alert--success]': \"type() === 'success'\",\n '[class.strct-alert--warning]': \"type() === 'warning'\",\n '[class.strct-alert--critical]': \"type() === 'critical'\",\n },\n styles: [\n `\n /* Restrained: neutral surface with a colored left rail + colored icon,\n instead of a fully tinted background. */\n .strct-alert {\n display: flex;\n align-items: flex-start;\n gap: var(--space-2);\n padding: var(--space-2) var(--space-3);\n border-radius: var(--radius-lg);\n font-size: 13px;\n color: var(--t1);\n background: var(--bg-1);\n border: 1px solid var(--b2);\n border-inline-start: 3px solid var(--acc);\n }\n .strct-alert strct-icon {\n color: var(--acc);\n margin-top: 1px;\n flex-shrink: 0;\n }\n .strct-alert__body {\n flex: 1;\n color: var(--t1);\n }\n .strct-alert__close {\n flex-shrink: 0;\n display: inline-flex;\n padding: 2px;\n margin: -2px -2px 0 0;\n border: 0;\n background: transparent;\n color: var(--t3);\n cursor: pointer;\n border-radius: 4px;\n }\n .strct-alert__close:hover {\n color: var(--t1);\n background: var(--bg-3);\n }\n\n .strct-alert--success {\n border-inline-start-color: var(--success);\n }\n .strct-alert--success strct-icon {\n color: var(--success);\n }\n .strct-alert--warning {\n border-inline-start-color: var(--warning);\n }\n .strct-alert--warning strct-icon {\n color: var(--warning);\n }\n .strct-alert--critical {\n border-inline-start-color: var(--critical);\n }\n .strct-alert--critical strct-icon {\n color: var(--critical);\n }\n `,\n ],\n})\nexport class StrctAlert {\n /** Visual type / variant. */\n readonly type = input<StrctAlertType>('info');\n /** Show a dismiss button. */\n readonly closable = input(false, { transform: booleanAttribute });\n /** Accessible label of the dismiss button (localizable). */\n readonly dismissLabel = input('Dismiss');\n /** Emitted when the alert is dismissed. */\n readonly closed = output<void>();\n\n protected readonly icon = computed(() => {\n switch (this.type()) {\n case 'success':\n return 'success';\n case 'warning':\n return 'warning';\n case 'critical':\n return 'critical';\n default:\n return 'info';\n }\n });\n}\n","import {\n DOCUMENT,\n Directive,\n ElementRef,\n HostListener,\n Renderer2,\n inject,\n input,\n} from '@angular/core';\n\n/** Tooltip placement relative to the host element. */\nexport type StrctTooltipPosition = 'top' | 'bottom' | 'left' | 'right';\n\n/**\n * Lightweight hover/focus tooltip. Renders a fixed-positioned bubble so it is\n * never clipped by an ancestor's `overflow`.\n * <button strct-button strctTooltip=\"More info\">?</button>\n */\n@Directive({ selector: '[strctTooltip]' })\nexport class StrctTooltip {\n private readonly host = inject(ElementRef<HTMLElement>);\n private readonly renderer = inject(Renderer2);\n private readonly doc = inject(DOCUMENT);\n private bubble: HTMLElement | null = null;\n\n /** Tooltip text. */\n readonly strctTooltip = input.required<string>();\n /** Tooltip placement relative to the host. */\n readonly tooltipPosition = input<StrctTooltipPosition>('top');\n\n @HostListener('mouseenter')\n @HostListener('focus')\n protected show(): void {\n const text = this.strctTooltip();\n if (!text || this.bubble) return;\n\n const el = this.renderer.createElement('span') as HTMLElement;\n this.renderer.appendChild(el, this.renderer.createText(text));\n const s = el.style;\n s.position = 'fixed';\n s.zIndex = '1300';\n s.pointerEvents = 'none';\n s.whiteSpace = 'nowrap';\n s.padding = '5px 8px';\n s.fontSize = '11px';\n s.fontWeight = '500';\n s.lineHeight = '1';\n s.color = 'var(--t1)';\n s.background = 'var(--bg-0)';\n s.border = '1px solid var(--b3)';\n s.borderRadius = '5px';\n s.boxShadow = 'var(--shh)';\n s.top = '0';\n s.left = '0';\n s.visibility = 'hidden';\n\n // Append to <body> so the fixed bubble can't be trapped by a transformed\n // ancestor's containing block (e.g. a translated speed-dial / animation).\n this.renderer.appendChild(this.doc.body, el);\n this.bubble = el;\n this.place(el);\n }\n\n @HostListener('mouseleave')\n @HostListener('blur')\n protected hide(): void {\n if (this.bubble) {\n this.renderer.removeChild(this.doc.body, this.bubble);\n this.bubble = null;\n }\n }\n\n private place(el: HTMLElement): void {\n const a = this.host.nativeElement.getBoundingClientRect();\n const w = el.offsetWidth;\n const h = el.offsetHeight;\n const gap = 7;\n let top: number;\n let left: number;\n\n switch (this.tooltipPosition()) {\n case 'bottom':\n top = a.bottom + gap;\n left = a.left + a.width / 2 - w / 2;\n break;\n case 'left':\n left = a.left - gap - w;\n top = a.top + a.height / 2 - h / 2;\n break;\n case 'right':\n left = a.right + gap;\n top = a.top + a.height / 2 - h / 2;\n break;\n default:\n top = a.top - gap - h;\n left = a.left + a.width / 2 - w / 2;\n }\n\n const m = 4;\n left = Math.max(m, Math.min(left, window.innerWidth - w - m));\n top = Math.max(m, Math.min(top, window.innerHeight - h - m));\n el.style.left = `${Math.round(left)}px`;\n el.style.top = `${Math.round(top)}px`;\n el.style.visibility = 'visible';\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n ElementRef,\n HostListener,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { StrctOverlay, StrctOverlayPlacement } from '../overlay/overlay';\n\n/** Signpost popover placement. */\nexport type StrctSignpostPosition = 'top' | 'bottom' | 'left' | 'right';\n\n/**\n * A click-triggered popover with an arrow, for contextual help / detail.\n * <strct-signpost position=\"right\">\n * <button strct-button size=\"sm\" strctSignpostTrigger>?</button>\n * <h4>Title</h4>\n * <p>Any projected content…</p>\n * </strct-signpost>\n */\n@Component({\n selector: 'strct-signpost',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctOverlay],\n template: `\n <div\n #trigger\n class=\"strct-sp__trigger\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"toggle()\"\n (keydown.enter)=\"toggle()\"\n (keydown.space)=\"toggle()\"\n >\n <ng-content select=\"[strctSignpostTrigger]\" />\n </div>\n @if (open()) {\n <div\n class=\"strct-sp__panel\"\n [class]=\"'strct-sp__panel--' + position()\"\n role=\"dialog\"\n [strctOverlay]=\"trigger\"\n [strctOverlayPlacement]=\"overlayPlacement()\"\n >\n <ng-content />\n </div>\n }\n `,\n host: { class: 'strct-sp' },\n styles: [\n `\n .strct-sp {\n position: relative;\n display: inline-block;\n }\n .strct-sp__trigger {\n display: inline-flex;\n }\n .strct-sp__panel {\n position: absolute;\n z-index: 300;\n width: max-content;\n max-width: 280px;\n padding: 12px 14px;\n font-size: 13px;\n color: var(--t1);\n background: var(--bg-1);\n border: 1px solid var(--b2);\n border-radius: 8px;\n box-shadow: var(--shh);\n animation: strct-sp-in 0.11s ease;\n }\n .strct-sp__panel h4 {\n margin: 0 0 6px;\n font-size: 13px;\n font-weight: 600;\n }\n .strct-sp__panel p {\n margin: 0;\n color: var(--t2);\n }\n .strct-sp__panel::before {\n content: '';\n position: absolute;\n width: 9px;\n height: 9px;\n background: var(--bg-1);\n border: 1px solid var(--b2);\n border-inline-end: 0;\n border-bottom: 0;\n }\n .strct-sp__panel--bottom {\n top: calc(100% + 9px);\n left: 0;\n }\n .strct-sp__panel--bottom::before {\n top: -5px;\n left: 16px;\n transform: rotate(45deg);\n }\n .strct-sp__panel--top {\n bottom: calc(100% + 9px);\n left: 0;\n }\n .strct-sp__panel--top::before {\n bottom: -5px;\n left: 16px;\n transform: rotate(225deg);\n }\n .strct-sp__panel--right {\n left: calc(100% + 9px);\n top: 0;\n }\n .strct-sp__panel--right::before {\n left: -5px;\n top: 14px;\n transform: rotate(-45deg);\n }\n .strct-sp__panel--left {\n right: calc(100% + 9px);\n top: 0;\n }\n .strct-sp__panel--left::before {\n right: -5px;\n top: 14px;\n transform: rotate(135deg);\n }\n @keyframes strct-sp-in {\n from {\n opacity: 0;\n transform: scale(0.97);\n }\n }\n `,\n ],\n})\nexport class StrctSignpost {\n private readonly host = inject(ElementRef<HTMLElement>);\n /** Popover placement relative to the trigger. */\n readonly position = input<StrctSignpostPosition>('bottom');\n readonly open = signal(false);\n\n toggle(): void {\n this.open.update((v) => !v);\n }\n close(): void {\n this.open.set(false);\n }\n\n protected overlayPlacement(): StrctOverlayPlacement {\n switch (this.position()) {\n case 'top':\n return 'top-start';\n case 'right':\n return 'right';\n case 'left':\n return 'left';\n default:\n return 'bottom-start';\n }\n }\n\n @HostListener('document:click', ['$event'])\n protected onDocClick(event: MouseEvent): void {\n if (this.open() && !this.host.nativeElement.contains(event.target as Node)) {\n this.close();\n }\n }\n\n @HostListener('document:keydown.escape')\n protected onEscape(): void {\n this.close();\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n Injectable,\n ViewEncapsulation,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { StrctIcon } from '../icon/icon';\n\n/** Toast visual types. */\nexport type StrctToastType = 'info' | 'success' | 'warning' | 'critical';\n\n/** A single toast notification. */\nexport interface StrctToast {\n id: number;\n type: StrctToastType;\n message: string;\n /** Auto-dismiss after this many ms; 0 keeps it until dismissed. */\n duration: number;\n}\n\n/** Options passed when creating a toast. */\nexport interface StrctToastOptions {\n type?: StrctToastType;\n duration?: number;\n}\n\n/**\n * Queues transient notifications. Render `<strct-toast-outlet />` once near the\n * app root, then call from anywhere:\n * inject(StrctToastService).success('Saved');\n */\n@Injectable({ providedIn: 'root' })\nexport class StrctToastService {\n private counter = 0;\n private readonly _toasts = signal<StrctToast[]>([]);\n readonly toasts = this._toasts.asReadonly();\n\n show(message: string, options: StrctToastOptions = {}): number {\n const id = ++this.counter;\n const duration = options.duration ?? 4000;\n this._toasts.update((list) => [\n ...list,\n { id, type: options.type ?? 'info', message, duration },\n ]);\n if (duration > 0) {\n setTimeout(() => this.dismiss(id), duration);\n }\n return id;\n }\n\n info(message: string, duration?: number) {\n return this.show(message, { type: 'info', duration });\n }\n success(message: string, duration?: number) {\n return this.show(message, { type: 'success', duration });\n }\n warning(message: string, duration?: number) {\n return this.show(message, { type: 'warning', duration });\n }\n critical(message: string, duration?: number) {\n return this.show(message, { type: 'critical', duration });\n }\n\n dismiss(id: number): void {\n this._toasts.update((list) => list.filter((t) => t.id !== id));\n }\n\n clear(): void {\n this._toasts.set([]);\n }\n}\n\nconst TOAST_ICON: Record<StrctToastType, string> = {\n info: 'info',\n success: 'success',\n warning: 'warning',\n critical: 'critical',\n};\n\n/** Renders the toast stack. Place once, typically just inside the app shell. */\n@Component({\n selector: 'strct-toast-outlet',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon],\n template: `\n <div class=\"strct-toasts\" role=\"region\" [attr.aria-label]=\"regionLabel()\" aria-live=\"polite\">\n @for (toast of service.toasts(); track toast.id) {\n <div\n class=\"strct-toast\"\n [class.strct-toast--success]=\"toast.type === 'success'\"\n [class.strct-toast--warning]=\"toast.type === 'warning'\"\n [class.strct-toast--critical]=\"toast.type === 'critical'\"\n >\n <strct-icon [name]=\"icon(toast.type)\" [size]=\"16\" />\n <span class=\"strct-toast__msg\">{{ toast.message }}</span>\n <button\n type=\"button\"\n class=\"strct-toast__close\"\n aria-label=\"Dismiss\"\n (click)=\"service.dismiss(toast.id)\"\n >\n <strct-icon name=\"close\" [size]=\"13\" />\n </button>\n </div>\n }\n </div>\n `,\n styles: [\n `\n .strct-toasts {\n position: fixed;\n top: var(--space-4);\n right: var(--space-4);\n z-index: 1200;\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n max-width: 360px;\n pointer-events: none;\n }\n .strct-toast {\n pointer-events: auto;\n display: flex;\n align-items: flex-start;\n gap: var(--space-2);\n padding: var(--space-3);\n font-size: 13px;\n color: var(--t1);\n background: var(--bg-1);\n border: 1px solid var(--b2);\n border-inline-start: 3px solid var(--acc);\n border-radius: var(--radius-lg);\n box-shadow: var(--shadow-floating);\n animation: strct-toast-in 0.16s ease;\n }\n .strct-toast strct-icon {\n color: var(--acc);\n margin-top: 1px;\n flex-shrink: 0;\n }\n .strct-toast__msg {\n flex: 1;\n }\n .strct-toast__close {\n flex-shrink: 0;\n display: inline-flex;\n padding: 2px;\n margin: -2px -2px 0 0;\n border: 0;\n background: transparent;\n color: var(--t3);\n cursor: pointer;\n border-radius: 4px;\n }\n .strct-toast__close:hover {\n color: var(--t1);\n background: var(--bg-3);\n }\n .strct-toast--success {\n border-inline-start-color: var(--success);\n }\n .strct-toast--success strct-icon {\n color: var(--success);\n }\n .strct-toast--warning {\n border-inline-start-color: var(--warning);\n }\n .strct-toast--warning strct-icon {\n color: var(--warning);\n }\n .strct-toast--critical {\n border-inline-start-color: var(--critical);\n }\n .strct-toast--critical strct-icon {\n color: var(--critical);\n }\n @keyframes strct-toast-in {\n from {\n opacity: 0;\n transform: translateX(16px);\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n .strct-toast {\n animation: none;\n }\n }\n `,\n ],\n})\nexport class StrctToastOutlet {\n /** Accessible name of the notifications region (localizable). */\n readonly regionLabel = input('Notifications');\n protected readonly service = inject(StrctToastService);\n protected icon(type: StrctToastType): string {\n return TOAST_ICON[type];\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n input,\n} from '@angular/core';\nimport { StrctIcon } from '../icon/icon';\n\n/** Preset zero/permission/error states with a sensible icon + tone. */\nexport type StrctEmptyVariant = 'empty' | 'denied' | 'error' | 'notfound';\n\nconst VARIANTS: Record<StrctEmptyVariant, { icon: string; tone: string }> = {\n empty: { icon: 'folder', tone: 'neutral' },\n denied: { icon: 'lock', tone: 'warning' },\n error: { icon: 'warning', tone: 'critical' },\n notfound: { icon: 'search', tone: 'neutral' },\n};\n\n/**\n * A centered empty / permission / error state — an icon, a title, an optional\n * description and a slot for call-to-action buttons. Project actions as children.\n *\n * <strct-empty-state variant=\"denied\" title=\"Insufficient privileges\"\n * description=\"You don't have access to this cluster.\">\n * <button strct-button variant=\"primary\">Request access</button>\n * </strct-empty-state>\n */\n@Component({\n selector: 'strct-empty-state',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon],\n template: `\n <span class=\"strct-empty__icon strct-empty__icon--{{ toneClass() }}\">\n <strct-icon [name]=\"resolvedIcon()\" [size]=\"26\" [strokeWidth]=\"1.4\" />\n </span>\n <h3 class=\"strct-empty__title\">{{ title() }}</h3>\n @if (description()) {\n <p class=\"strct-empty__desc\">{{ description() }}</p>\n }\n <div class=\"strct-empty__actions\"><ng-content /></div>\n `,\n host: { class: 'strct-empty' },\n styles: [\n `\n .strct-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n text-align: center;\n gap: 10px;\n padding: 40px 24px;\n }\n .strct-empty__icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 56px;\n height: 56px;\n border-radius: 14px;\n margin-bottom: 2px;\n }\n .strct-empty__icon--neutral {\n background: var(--bg-3);\n color: var(--t2);\n }\n .strct-empty__icon--warning {\n background: var(--warning-bg);\n color: var(--warning);\n }\n .strct-empty__icon--critical {\n background: var(--critical-bg);\n color: var(--critical);\n }\n .strct-empty__icon--accent {\n background: var(--acc-m);\n color: var(--acc);\n }\n .strct-empty__title {\n margin: 0;\n font-size: 15px;\n font-weight: 600;\n color: var(--t1);\n }\n .strct-empty__desc {\n margin: 0;\n max-width: 360px;\n font-size: 13px;\n line-height: 1.5;\n color: var(--t3);\n }\n .strct-empty__actions {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-top: 6px;\n }\n .strct-empty__actions:empty {\n display: none;\n }\n `,\n ],\n})\nexport class StrctEmptyState {\n /** Preset that supplies a default icon + tone. */\n readonly variant = input<StrctEmptyVariant>('empty');\n /** Override the preset icon. */\n readonly icon = input('');\n /** Override the preset tone (neutral / warning / critical / accent). */\n readonly tone = input<string>('');\n readonly title = input.required<string>();\n readonly description = input('');\n\n protected readonly resolvedIcon = computed(() => this.icon() || VARIANTS[this.variant()].icon);\n protected readonly toneClass = computed(() => this.tone() || VARIANTS[this.variant()].tone);\n}\n","/**\n * Public API surface of the strct UI library.\n */\n\n// Theme\nexport * from './lib/theme/theme.service';\nexport * from './lib/theme/theme-switcher';\n\n// Foundations\nexport * from './lib/status';\nexport * from './lib/icon/icon';\nexport * from './lib/overlay/overlay';\n\n// Layout\nexport * from './lib/layout/layout';\nexport * from './lib/layout/nav';\nexport * from './lib/layout/rail';\nexport * from './lib/layout/login';\n\n// Buttons & indicators\nexport * from './lib/button/button';\nexport * from './lib/badge/badge';\nexport * from './lib/tag/tag';\nexport * from './lib/avatar/avatar';\nexport * from './lib/progress/progress';\nexport * from './lib/spinner/spinner';\nexport * from './lib/skeleton/skeleton';\nexport * from './lib/speed-dial/speed-dial';\n\n// Surfaces & disclosure\nexport * from './lib/card/card';\nexport * from './lib/accordion/accordion';\nexport * from './lib/tabs/tabs';\nexport * from './lib/tree/tree';\nexport * from './lib/modal/modal';\nexport * from './lib/drawer/drawer';\nexport * from './lib/dropdown/dropdown';\nexport * from './lib/context-menu/context-menu';\nexport * from './lib/context-menu/submenu';\nexport * from './lib/context-menu/menu';\nexport * from './lib/wizard/wizard';\nexport * from './lib/divider/divider';\n\n// Navigation\nexport * from './lib/breadcrumb/breadcrumb';\nexport * from './lib/pagination/pagination';\nexport * from './lib/section-menu/section-menu';\nexport * from './lib/command-palette/command-palette';\nexport * from './lib/kbd/kbd';\n\n// Forms\nexport * from './lib/forms/field';\nexport * from './lib/forms/input';\nexport * from './lib/validation/validation';\nexport * from './lib/forms/checkbox';\nexport * from './lib/forms/toggle';\nexport * from './lib/forms/radio';\nexport * from './lib/segmented/segmented';\nexport * from './lib/forms/range';\nexport * from './lib/forms/password';\nexport * from './lib/forms/file';\nexport * from './lib/rating/rating';\nexport * from './lib/chips/chips';\nexport * from './lib/input-otp/input-otp';\nexport * from './lib/knob/knob';\nexport * from './lib/input-mask/input-mask';\nexport * from './lib/combobox/combobox';\nexport * from './lib/datepicker/datepicker';\nexport * from './lib/color-picker/color-picker';\nexport * from './lib/cascade-select/cascade-select';\n\n// Data\nexport * from './lib/description-list/description-list';\nexport * from './lib/table/table';\nexport * from './lib/datagrid/datagrid';\nexport * from './lib/timeline/timeline';\nexport * from './lib/stack/stack';\n\n// Charts\nexport * from './lib/charts/sparkline';\nexport * from './lib/charts/chart';\nexport * from './lib/charts/donut';\nexport * from './lib/charts/gauge';\nexport * from './lib/flow/flow';\nexport * from './lib/metric-tile/metric-tile';\n\n// Feedback\nexport * from './lib/hero/hero';\nexport * from './lib/alert/alert';\nexport * from './lib/tooltip/tooltip';\nexport * from './lib/signpost/signpost';\nexport * from './lib/toast/toast';\nexport * from './lib/empty-state/empty-state';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["DOCUMENT","COLOR","round"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"akcelik-strct.mjs","sources":["../../../projects/strct/src/lib/theme/theme.service.ts","../../../projects/strct/src/lib/icon/icon.ts","../../../projects/strct/src/lib/theme/theme-switcher.ts","../../../projects/strct/src/lib/overlay/overlay.ts","../../../projects/strct/src/lib/layout/layout.ts","../../../projects/strct/src/lib/layout/nav.ts","../../../projects/strct/src/lib/layout/rail.ts","../../../projects/strct/src/lib/layout/login.ts","../../../projects/strct/src/lib/button/button.ts","../../../projects/strct/src/lib/badge/badge.ts","../../../projects/strct/src/lib/tag/tag.ts","../../../projects/strct/src/lib/avatar/avatar.ts","../../../projects/strct/src/lib/progress/progress.ts","../../../projects/strct/src/lib/spinner/spinner.ts","../../../projects/strct/src/lib/skeleton/skeleton.ts","../../../projects/strct/src/lib/speed-dial/speed-dial.ts","../../../projects/strct/src/lib/card/card.ts","../../../projects/strct/src/lib/accordion/accordion.ts","../../../projects/strct/src/lib/tabs/tabs.ts","../../../projects/strct/src/lib/context-menu/menu.ts","../../../projects/strct/src/lib/tree/tree.ts","../../../projects/strct/src/lib/modal/modal.ts","../../../projects/strct/src/lib/drawer/drawer.ts","../../../projects/strct/src/lib/dropdown/dropdown.ts","../../../projects/strct/src/lib/context-menu/context-menu.ts","../../../projects/strct/src/lib/context-menu/submenu.ts","../../../projects/strct/src/lib/wizard/wizard.ts","../../../projects/strct/src/lib/divider/divider.ts","../../../projects/strct/src/lib/breadcrumb/breadcrumb.ts","../../../projects/strct/src/lib/pagination/pagination.ts","../../../projects/strct/src/lib/section-menu/section-menu.ts","../../../projects/strct/src/lib/kbd/kbd.ts","../../../projects/strct/src/lib/command-palette/command-palette.ts","../../../projects/strct/src/lib/validation/validation.ts","../../../projects/strct/src/lib/forms/field.ts","../../../projects/strct/src/lib/forms/input.ts","../../../projects/strct/src/lib/forms/checkbox.ts","../../../projects/strct/src/lib/forms/toggle.ts","../../../projects/strct/src/lib/forms/radio.ts","../../../projects/strct/src/lib/segmented/segmented.ts","../../../projects/strct/src/lib/forms/range.ts","../../../projects/strct/src/lib/forms/password.ts","../../../projects/strct/src/lib/forms/file.ts","../../../projects/strct/src/lib/rating/rating.ts","../../../projects/strct/src/lib/chips/chips.ts","../../../projects/strct/src/lib/input-otp/input-otp.ts","../../../projects/strct/src/lib/knob/knob.ts","../../../projects/strct/src/lib/input-mask/input-mask.ts","../../../projects/strct/src/lib/combobox/combobox.ts","../../../projects/strct/src/lib/datepicker/datepicker.ts","../../../projects/strct/src/lib/color-picker/color-picker.ts","../../../projects/strct/src/lib/cascade-select/cascade-select.ts","../../../projects/strct/src/lib/description-list/description-list.ts","../../../projects/strct/src/lib/table/table.ts","../../../projects/strct/src/lib/datagrid/xlsx.ts","../../../projects/strct/src/lib/datagrid/datagrid.ts","../../../projects/strct/src/lib/timeline/timeline.ts","../../../projects/strct/src/lib/stack/stack.ts","../../../projects/strct/src/lib/charts/sparkline.ts","../../../projects/strct/src/lib/charts/chart.ts","../../../projects/strct/src/lib/charts/donut.ts","../../../projects/strct/src/lib/charts/gauge.ts","../../../projects/strct/src/lib/flow/flow.ts","../../../projects/strct/src/lib/metric-tile/metric-tile.ts","../../../projects/strct/src/lib/hero/hero.ts","../../../projects/strct/src/lib/alert/alert.ts","../../../projects/strct/src/lib/tooltip/tooltip.ts","../../../projects/strct/src/lib/signpost/signpost.ts","../../../projects/strct/src/lib/toast/toast.ts","../../../projects/strct/src/lib/empty-state/empty-state.ts","../../../projects/strct/src/public-api.ts","../../../projects/strct/src/akcelik-strct.ts"],"sourcesContent":["import { DOCUMENT, Injectable, computed, inject, signal } from '@angular/core';\n\n/** Available color palettes. */\nexport type StrctPalette = 'arctic' | 'ember' | 'sage';\n/** Light or dark mode. */\nexport type StrctMode = 'dark' | 'light';\n\n/** Metadata for a color palette. */\nexport interface StrctPaletteInfo {\n id: StrctPalette;\n /** Human label, shown in switchers. */\n label: string;\n /** Swatch color used by the palette dot. */\n swatch: string;\n}\n\n/** All palettes the token system ships with, in display order. */\nexport const STRCT_PALETTES: readonly StrctPaletteInfo[] = [\n { id: 'arctic', label: 'Arctic Steel', swatch: '#5a7ea3' },\n { id: 'ember', label: 'Warm Ember', swatch: '#96724e' },\n { id: 'sage', label: 'Forest Sage', swatch: '#4e8a68' },\n];\n\nconst PALETTE_KEY = 'strct-palette';\nconst MODE_KEY = 'strct-theme';\n\n/**\n * Owns the active palette + light/dark mode. Writes `data-palette` and\n * `data-theme` onto the document root (which the token layer keys off) and\n * persists the choice to localStorage. Inject it anywhere and read the signals\n * or call the setters.\n */\n@Injectable({ providedIn: 'root' })\nexport class StrctThemeService {\n private readonly doc = inject(DOCUMENT);\n\n private readonly _palette = signal<StrctPalette>('arctic');\n private readonly _mode = signal<StrctMode>('dark');\n\n readonly palette = this._palette.asReadonly();\n readonly mode = this._mode.asReadonly();\n readonly palettes = STRCT_PALETTES;\n readonly isDark = computed(() => this._mode() === 'dark');\n\n constructor() {\n const root = this.doc.documentElement;\n const storedPalette = this.read(PALETTE_KEY) as StrctPalette | null;\n const storedMode = this.read(MODE_KEY) as StrctMode | null;\n\n // Palette: stored choice, else whatever the host declared, else default.\n this.applyPalette(\n storedPalette ?? (root.getAttribute('data-palette') as StrctPalette | null) ?? 'arctic',\n );\n\n // Mode: an explicit stored choice always wins. Otherwise follow the operating\n // system's light/dark preference — and keep following it live — so a user\n // working at night / in a dim room is never forced onto a bright screen. The\n // initial resolution is NOT persisted, so it stays OS-driven until the user\n // makes a deliberate choice via setMode/toggleMode.\n if (storedMode) {\n this.applyMode(storedMode);\n } else {\n // OS preference wins over a host-declared default; the attribute is only a\n // fallback for environments without matchMedia (SSR).\n this.applyMode(\n this.systemMode() ?? (root.getAttribute('data-theme') as StrctMode | null) ?? 'dark',\n );\n this.watchSystemMode();\n }\n }\n\n setPalette(palette: StrctPalette): void {\n this.applyPalette(palette);\n this.write(PALETTE_KEY, palette);\n }\n\n setMode(mode: StrctMode): void {\n this.applyMode(mode);\n this.write(MODE_KEY, mode);\n }\n\n private applyPalette(palette: StrctPalette): void {\n this._palette.set(palette);\n this.doc.documentElement.setAttribute('data-palette', palette);\n }\n\n private applyMode(mode: StrctMode): void {\n this._mode.set(mode);\n this.doc.documentElement.setAttribute('data-theme', mode);\n }\n\n /** The OS-level light/dark preference, or null when matchMedia is unavailable. */\n private systemMode(): StrctMode | null {\n try {\n const view = this.doc.defaultView;\n if (!view?.matchMedia) return null;\n return view.matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark';\n } catch {\n return null;\n }\n }\n\n /** Track OS theme changes until the user makes an explicit choice. */\n private watchSystemMode(): void {\n try {\n const mq = this.doc.defaultView?.matchMedia('(prefers-color-scheme: dark)');\n mq?.addEventListener('change', (e: MediaQueryListEvent) => {\n if (this.read(MODE_KEY)) return; // user has since chosen — stop following\n this.applyMode(e.matches ? 'dark' : 'light');\n });\n } catch {\n // matchMedia unavailable (SSR) — stay on the resolved default.\n }\n }\n\n toggleMode(): void {\n this.setMode(this._mode() === 'dark' ? 'light' : 'dark');\n }\n\n private read(key: string): string | null {\n try {\n return this.doc.defaultView?.localStorage.getItem(key) ?? null;\n } catch {\n return null;\n }\n }\n\n private write(key: string, value: string): void {\n try {\n this.doc.defaultView?.localStorage.setItem(key, value);\n } catch {\n // Storage unavailable (private mode / SSR) — choice is session-only.\n }\n }\n}\n","import {\n Component,\n ChangeDetectionStrategy,\n ViewEncapsulation,\n computed,\n input,\n} from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { inject } from '@angular/core';\n\n/**\n * Inner markup (path/shape contents) for each icon, drawn on a 0 0 16 16\n * viewBox with `currentColor` stroke. Keep strokes at 1.3–1.5 for crispness.\n *\n * RENDER SIZES (\"16 Native\" policy): object / semantic glyphs must render at the\n * grid's native 16px or larger — never downscaled (fractional scaling blurs\n * hairlines). Simple single-stroke glyphs (chevrons, close, check, dots) may\n * render at 11–14px; their wide details survive scaling.\n *\n * DETAIL BUDGET (small-size legibility): icons render as small as 14px, so keep\n * gaps between parallel details ≥ 1.5px on the 16-grid (≈ max 3 parallel lines),\n * prefer one large distinguishing feature over many small ones, and cap a glyph\n * at ~6 drawing elements. Filled dots should be r ≥ 0.55.\n *\n * The set is intentionally datacenter-flavoured (hosts, clusters, switches,\n * storage, VMs …). Object state — running / stopped / maintenance — is layered\n * on with the `badge` input rather than a separate icon per state.\n */\nexport const STRCT_ICONS: Record<string, string> = {\n // ── General UI ───────────────────────────────────────────────\n hexagon: '<path d=\"M8 1.6l5.5 3.2v6.4L8 14.4 2.5 11.2V4.8L8 1.6z\"/>',\n chevronRight: '<path d=\"M6 3.5L10.5 8 6 12.5\"/>',\n chevronLeft: '<path d=\"M10 3.5L5.5 8 10 12.5\"/>',\n chevronDoubleRight: '<path d=\"M3.5 3.5L8 8l-4.5 4.5M8.5 3.5L13 8l-4.5 4.5\"/>',\n chevronDown: '<path d=\"M3.5 6L8 10.5 12.5 6\"/>',\n compass: '<circle cx=\"8\" cy=\"8\" r=\"6\"/><path d=\"M10.6 5.4l-1.5 3.7-3.7 1.5 1.5-3.7 3.7-1.5z\"/>',\n close: '<path d=\"M4 4l8 8M12 4l-8 8\"/>',\n check: '<path d=\"M3.5 8.5l3 3 6-7\"/>',\n menu: '<path d=\"M3 4.5h10M3 8h10M3 11.5h10\"/>',\n dots: '<circle cx=\"8\" cy=\"3.5\" r=\"1.1\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"8\" cy=\"8\" r=\"1.1\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"8\" cy=\"12.5\" r=\"1.1\" fill=\"currentColor\" stroke=\"none\"/>',\n ellipsis:\n '<circle cx=\"3.5\" cy=\"8\" r=\"1.1\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"8\" cy=\"8\" r=\"1.1\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"12.5\" cy=\"8\" r=\"1.1\" fill=\"currentColor\" stroke=\"none\"/>',\n search: '<circle cx=\"7\" cy=\"7\" r=\"4\"/><path d=\"M10 10l3.5 3.5\"/>',\n calendar:\n '<rect x=\"2.5\" y=\"3.5\" width=\"11\" height=\"10\" rx=\"1.5\"/><path d=\"M2.5 6.5h11M5.5 2v3M10.5 2v3\"/>',\n eye: '<path d=\"M1.5 8S4 3.5 8 3.5 14.5 8 14.5 8 12 12.5 8 12.5 1.5 8 1.5 8z\"/><circle cx=\"8\" cy=\"8\" r=\"2\"/>',\n upload: '<path d=\"M8 10.5V3M5 5.8L8 2.8l3 3M3 12.8h10\"/>',\n download: '<path d=\"M8 2.5V10M5 7.2L8 10.2l3-3M3 12.8h10\"/>',\n droplet: '<path d=\"M8 2.4S12 6.6 12 9.4a4 4 0 01-8 0c0-2.8 4-7 4-7z\"/>',\n sortAsc: '<path d=\"M8 3.5v9M5 6.5L8 3.5l3 3\"/>',\n sortDesc: '<path d=\"M8 12.5v-9M5 9.5l3 3 3-3\"/>',\n sortNone: '<path d=\"M5.5 6.5L8 4l2.5 2.5M5.5 9.5L8 12l2.5-2.5\"/>',\n sun: '<circle cx=\"8\" cy=\"8\" r=\"3.2\"/><path d=\"M8 1.5v1.5M8 13v1.5M1.5 8H3M13 8h1.5M3.8 3.8l1 1M11.2 11.2l1 1M3.8 12.2l1-1M11.2 4.8l1-1\"/>',\n moon: '<path d=\"M13 9a5 5 0 01-6-6 5.5 5.5 0 106 6z\"/>',\n info: '<circle cx=\"8\" cy=\"8\" r=\"6\"/><path d=\"M8 7.2v3.6M8 5.2v.2\"/>',\n warning: '<path d=\"M8 2.5l6 11H2l6-11z\"/><path d=\"M8 6.8v3M8 11.6v.2\"/>',\n critical: '<circle cx=\"8\" cy=\"8\" r=\"6\"/><path d=\"M8 5v3.6M8 10.8v.2\"/>',\n success: '<circle cx=\"8\" cy=\"8\" r=\"6\"/><path d=\"M5.2 8.2l2 2 3.6-4\"/>',\n bell: '<path d=\"M8 2.6a3.4 3.4 0 00-3.4 3.4c0 2.9-1.1 3.9-1.1 3.9h9s-1.1-1-1.1-3.9A3.4 3.4 0 008 2.6z\"/><path d=\"M6.8 12.8a1.3 1.3 0 002.4 0\"/>',\n heart:\n '<path d=\"M8 13.3S2.7 10 2.7 6.3A2.6 2.6 0 018 4.9a2.6 2.6 0 015.3 1.4C13.3 10 8 13.3 8 13.3z\"/>',\n layers:\n '<path d=\"M8 2l5.5 3-5.5 3-5.5-3L8 2z\"/><path d=\"M2.5 8L8 11l5.5-3\"/><path d=\"M2.5 11L8 14l5.5-3\"/>',\n grid: '<rect x=\"2\" y=\"2.5\" width=\"5\" height=\"5\" rx=\"1\"/><rect x=\"9\" y=\"2.5\" width=\"5\" height=\"5\" rx=\"1\"/><rect x=\"2\" y=\"9\" width=\"5\" height=\"5\" rx=\"1\"/><rect x=\"9\" y=\"9\" width=\"5\" height=\"5\" rx=\"1\"/>',\n form: '<rect x=\"2.5\" y=\"2.5\" width=\"11\" height=\"11\" rx=\"1.5\"/><path d=\"M5 6h6M5 8.5h6M5 11h3.5\"/>',\n chart: '<path d=\"M2.5 13V3M2.5 13H13\"/><path d=\"M5 10l2.3-2.3 2 1.4L12.5 5.5\"/>',\n bars: '<path d=\"M2.5 13V3M2.5 13H13\"/><rect x=\"4.3\" y=\"8.5\" width=\"1.8\" height=\"2.5\"/><rect x=\"7.4\" y=\"6.5\" width=\"1.8\" height=\"4.5\"/><rect x=\"10.5\" y=\"4.5\" width=\"1.8\" height=\"6.5\"/>',\n sidebar:\n '<rect x=\"2\" y=\"3\" width=\"12\" height=\"10\" rx=\"1.5\"/><line x1=\"6.2\" y1=\"3\" x2=\"6.2\" y2=\"13\"/>',\n palette:\n '<path d=\"M8 2.2a5.8 5.8 0 100 11.6c.9 0 1.4-.7 1.4-1.4 0-.9-.8-1.2-.8-1.9 0-.5.4-.9 1-.9h1A3.2 3.2 0 0013.8 6 5.9 5.9 0 008 2.2z\"/><circle cx=\"5.4\" cy=\"6.6\" r=\".7\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"8\" cy=\"5.2\" r=\".7\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"10.4\" cy=\"6.6\" r=\".7\" fill=\"currentColor\" stroke=\"none\"/>',\n gauge:\n '<path d=\"M2.6 11.5a6 6 0 1110.8 0\"/><path d=\"M8 8.5l2.6-2.2\"/><circle cx=\"8\" cy=\"8.6\" r=\".7\" fill=\"currentColor\" stroke=\"none\"/>',\n copy: '<rect x=\"5\" y=\"5\" width=\"8\" height=\"8\" rx=\"1.4\"/><path d=\"M11 5V3.9A1.4 1.4 0 0 0 9.6 2.5H3.9A1.4 1.4 0 0 0 2.5 3.9v5.7A1.4 1.4 0 0 0 3.9 11H5\"/>',\n code: '<path d=\"M5.5 5L2.5 8l3 3M10.5 5l3 3-3 3M9 3.5l-2 9\"/>',\n book: '<path d=\"M3 3.2h6a1.5 1.5 0 0 1 1.5 1.5v8.1H4.5A1.5 1.5 0 0 1 3 11.3z\"/><path d=\"M13 3.2H9.5A1.5 1.5 0 0 0 8 4.7v8.1h5z\"/>',\n terminal:\n '<rect x=\"2\" y=\"3\" width=\"12\" height=\"10\" rx=\"1.5\"/><path d=\"M4.8 6.5L7 8.2 4.8 9.9M8.2 10.2h3\"/>',\n folder:\n '<path d=\"M2 4.6a1 1 0 0 1 1-1h3.1l1.3 1.6H13a1 1 0 0 1 1 1V12a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1z\"/>',\n template:\n '<path d=\"M4.3 2.5h4.6l3.1 3.1V13a.5.5 0 0 1-.5.5H4.3a.5.5 0 0 1-.5-.5V3a.5.5 0 0 1 .5-.5z\"/><path d=\"M8.7 2.6v3.1h3.1\"/><path d=\"M5.8 9h4.2M5.8 11h2.6\"/>',\n // Plain document — a file with a dog-ear fold, no field/text lines (vs `template` / `form`).\n file: '<path d=\"M4 2.5h4.9l3.1 3.1v7.9a.5.5 0 0 1-.5.5H4a.5.5 0 0 1-.5-.5V3a.5.5 0 0 1 .5-.5z\"/><path d=\"M8.8 2.6v3.1h3.1\"/>',\n // Clipboard with a checklist — task list (vs `logs`, which reads as a stream).\n clipboard:\n '<rect x=\"3.3\" y=\"3.2\" width=\"9.4\" height=\"10.4\" rx=\"1.3\"/><rect x=\"5.8\" y=\"1.9\" width=\"4.4\" height=\"2.2\" rx=\".8\"/><path d=\"M6 8.2l1 1 2.2-2.4M6 11h4\"/>',\n tag: '<path d=\"M2.6 7.7V3.2a.6.6 0 0 1 .6-.6h4.5l5.6 5.6a1 1 0 0 1 0 1.4l-3.5 3.5a1 1 0 0 1-1.4 0z\"/><circle cx=\"5.4\" cy=\"5.4\" r=\".9\" fill=\"currentColor\" stroke=\"none\"/>',\n\n // ── Actions ──────────────────────────────────────────────────\n plus: '<path d=\"M8 3v10M3 8h10\"/>',\n minus: '<path d=\"M3 8h10\"/>',\n pencil: '<path d=\"M11.5 2.5l2 2-8.5 8.5-3 .5.5-3z\"/>',\n trash:\n '<path d=\"M3 4.5h10\"/><path d=\"M6.3 4.5v-1a1 1 0 0 1 1-1h1.4a1 1 0 0 1 1 1v1\"/><path d=\"M4.2 4.5L5 13.3a1 1 0 0 0 1 .9h4a1 1 0 0 0 1-.9L11.8 4.5\"/><path d=\"M6.6 6.9v4.6M8 6.9v4.6M9.4 6.9v4.6\"/>',\n refresh: '<path d=\"M13.5 7.5a5.5 5.5 0 11-2-5.2\"/><path d=\"M13.5 2.5v3.5H10\"/>',\n filter: '<path d=\"M2 3.5h12l-4.5 5.5v4.5h-3V9z\"/>',\n settings:\n '<path d=\"M8 5.5a2.5 2.5 0 100 5 2.5 2.5 0 000-5z\"/><path d=\"M7.2 1.5h1.6l.3 1.8c.4.1.8.3 1.2.5l1.5-1.1 1.1 1.1-1.1 1.5c.2.4.4.8.5 1.2l1.8.3v1.6l-1.8.3c-.1.4-.3.8-.5 1.2l1.1 1.5-1.1 1.1-1.5-1.1c-.4.2-.8.4-1.2.5l-.3 1.8H7.2l-.3-1.8a5.4 5.4 0 01-1.2-.5l-1.5 1.1-1.1-1.1 1.1-1.5a5.4 5.4 0 01-.5-1.2l-1.8-.3V7.2l1.8-.3c.1-.4.3-.8.5-1.2L2.7 4.2l1.1-1.1 1.5 1.1c.4-.2.8-.4 1.2-.5z\"/>',\n user: '<path d=\"M8 8a2.5 2.5 0 100-5A2.5 2.5 0 008 8z\"/><path d=\"M3 14.5c0-2.8 2.2-5 5-5s5 2.2 5 5\"/>',\n logout: '<path d=\"M10 3.5h2a1 1 0 011 1v7a1 1 0 01-1 1h-2M6.5 5.5L3.5 8l3 3M3.5 8h6.5\"/>',\n undo: '<path d=\"M4.5 5.5L2 8l2.5 2.5M2.5 8h7a3 3 0 013 3v.5\"/>',\n redo: '<path d=\"M11.5 5.5L14 8l-2.5 2.5M13.5 8h-7a3 3 0 00-3 3v.5\"/>',\n arrowUp: '<path d=\"M8 13V3M3.5 6.5L8 2l4.5 4.5\"/>',\n arrowDown: '<path d=\"M8 3v10M3.5 9.5L8 14l4.5-4.5\"/>',\n arrowLeft: '<path d=\"M13 8H3M6.5 3.5L2 8l4.5 4.5\"/>',\n arrowRight: '<path d=\"M3 8h10M9.5 3.5L14 8l-4.5 4.5\"/>',\n externalLink:\n '<path d=\"M9 2.5h4.5V7M13.5 2.5L8.5 7.5M11.5 9v3.5a1 1 0 01-1 1h-7a1 1 0 01-1-1v-7a1 1 0 011-1H7\"/>',\n\n // ── Datacenter / infrastructure ─────────────────────────────\n datacenter:\n '<rect x=\"2.5\" y=\"2.5\" width=\"11\" height=\"11\" rx=\"1\"/><path d=\"M5 5h6M5 7.3h6M5 9.6h3.5\"/><circle cx=\"11\" cy=\"9.7\" r=\".5\" fill=\"currentColor\" stroke=\"none\"/>',\n rack: '<rect x=\"3.5\" y=\"2\" width=\"9\" height=\"12\" rx=\"1\"/><path d=\"M3.5 5.2h9M3.5 8.4h9M3.5 11.6h9\"/><circle cx=\"5.4\" cy=\"3.6\" r=\".4\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"5.4\" cy=\"6.8\" r=\".4\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"5.4\" cy=\"10\" r=\".4\" fill=\"currentColor\" stroke=\"none\"/>',\n cluster:\n '<rect x=\"3\" y=\"3.5\" width=\"3\" height=\"9\" rx=\"1\"/><rect x=\"6.5\" y=\"2.5\" width=\"3\" height=\"11\" rx=\"1\"/><rect x=\"10\" y=\"3.5\" width=\"3\" height=\"9\" rx=\"1\"/><circle cx=\"4.5\" cy=\"6\" r=\".5\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"4.5\" cy=\"8\" r=\".5\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"4.5\" cy=\"10\" r=\".5\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"8\" cy=\"5\" r=\".5\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"8\" cy=\"7\" r=\".5\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"8\" cy=\"9\" r=\".5\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"8\" cy=\"11\" r=\".5\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"11.5\" cy=\"6\" r=\".5\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"11.5\" cy=\"8\" r=\".5\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"11.5\" cy=\"10\" r=\".5\" fill=\"currentColor\" stroke=\"none\"/>',\n host: '<rect x=\"2.5\" y=\"3\" width=\"11\" height=\"4.2\" rx=\"1\"/><rect x=\"2.5\" y=\"8.8\" width=\"11\" height=\"4.2\" rx=\"1\"/><circle cx=\"4.7\" cy=\"5.1\" r=\".55\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"4.7\" cy=\"10.9\" r=\".55\" fill=\"currentColor\" stroke=\"none\"/><path d=\"M7 5.1h4M7 10.9h4\"/>',\n vm: '<rect x=\"2\" y=\"3\" width=\"12\" height=\"8\" rx=\"1\"/><path d=\"M6 14h4M8 11v3\"/>',\n // Network switch — front-panel view: chassis + status LEDs + a row of RJ45 ports.\n switch:\n '<rect x=\"2.2\" y=\"4.8\" width=\"11.6\" height=\"6.4\" rx=\"1\"/><circle cx=\"4.4\" cy=\"7\" r=\".55\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"6.2\" cy=\"7\" r=\".55\" fill=\"currentColor\" stroke=\"none\"/><path d=\"M4 9.4h1.8M7.1 9.4h1.8M10.2 9.4h1.8\"/>',\n storage:\n '<ellipse cx=\"8\" cy=\"3.6\" rx=\"5\" ry=\"2\"/><path d=\"M3 3.6v8.8c0 1.1 2.2 2 5 2s5-.9 5-2V3.6\"/><path d=\"M3 8c0 1.1 2.2 2 5 2s5-.9 5-2\"/>',\n network:\n '<circle cx=\"8\" cy=\"3.4\" r=\"1.7\"/><circle cx=\"3.6\" cy=\"12.4\" r=\"1.7\"/><circle cx=\"12.4\" cy=\"12.4\" r=\"1.7\"/><path d=\"M8 5.1v2.6M7 8.8l-2.4 2M9 8.8l2.4 2\"/>',\n cpu: '<rect x=\"4.5\" y=\"4.5\" width=\"7\" height=\"7\" rx=\"1\"/><rect x=\"6.6\" y=\"6.6\" width=\"2.8\" height=\"2.8\" rx=\".5\"/><path d=\"M6.5 2.6v1.9M9.5 2.6v1.9M6.5 11.5v1.9M9.5 11.5v1.9M2.6 6.5h1.9M2.6 9.5h1.9M11.5 6.5h1.9M11.5 9.5h1.9\"/>',\n memory:\n '<rect x=\"2.4\" y=\"4.4\" width=\"11.2\" height=\"5.6\" rx=\"1\"/><path d=\"M4.6 10v2M8 10v2M11.4 10v2\"/><path d=\"M5 7.2h2.2M8.8 7.2H11\"/>',\n disk: '<circle cx=\"8\" cy=\"8\" r=\"5.6\"/><circle cx=\"8\" cy=\"8\" r=\"1.3\"/><path d=\"M8 2.4v2.3\"/>',\n port: '<rect x=\"3\" y=\"5\" width=\"10\" height=\"6\" rx=\"1\"/><path d=\"M6.5 5V3.6h3V5M5 11v1.6M11 11v1.6\"/>',\n power: '<path d=\"M8 2.4v5\"/><path d=\"M5.2 4.6a5 5 0 105.6 0\"/>',\n // Network Adapter Card (NIC) — PCIe card with an RJ45 (square) port.\n nic: '<rect x=\"2.3\" y=\"3.6\" width=\"11.4\" height=\"6.2\" rx=\"1\"/><rect x=\"4.1\" y=\"5.3\" width=\"3.6\" height=\"2.8\" rx=\".4\"/><path d=\"M9.6 6.7h2.4\"/><path d=\"M5 9.8v2.4M11 9.8v2.4\"/>',\n // Host Bus Adapter (HBA) — PCIe card with optical/SFP (round) ports.\n hba: '<rect x=\"2.3\" y=\"3.6\" width=\"11.4\" height=\"6.2\" rx=\"1\"/><circle cx=\"5.4\" cy=\"6.7\" r=\"1.5\"/><circle cx=\"9.2\" cy=\"6.7\" r=\"1.5\"/><path d=\"M5 9.8v2.4M11 9.8v2.4\"/>',\n // RJ45 ethernet port (switch / server) — keyed jack with contact pins.\n ethernet:\n '<rect x=\"3\" y=\"4.8\" width=\"10\" height=\"6.6\" rx=\"1\"/><path d=\"M6 4.8V3.2h4v1.6\"/><path d=\"M5.6 8.4v1.8M8 8.4v1.8M10.4 8.4v1.8\"/>',\n // Resource pool — a proportional allocation (pie with two radii).\n resourcePool: '<circle cx=\"8\" cy=\"8\" r=\"5.6\"/><path d=\"M8 8V2.4M8 8l4.9 2.7\"/>',\n // Port group — a grouped set of switch ports under a shared rail.\n portGroup:\n '<path d=\"M2.5 5h11\"/><rect x=\"3\" y=\"6.8\" width=\"2.7\" height=\"3.6\" rx=\".4\"/><rect x=\"6.65\" y=\"6.8\" width=\"2.7\" height=\"3.6\" rx=\".4\"/><rect x=\"10.3\" y=\"6.8\" width=\"2.7\" height=\"3.6\" rx=\".4\"/>',\n\n // ── Modern infrastructure ────────────────────────────────────\n pod: '<path d=\"M3 4.5c0-1.1 2.2-2 5-2s5 .9 5 2v7c0 1.1-2.2 2-5 2s-5-.9-5-2z\"/><path d=\"M3 4.5c0 1.1 2.2 2 5 2s5-.9 5-2\"/>',\n deployment:\n '<rect x=\"2.5\" y=\"2.5\" width=\"11\" height=\"4.5\" rx=\"1\"/><rect x=\"2.5\" y=\"9\" width=\"11\" height=\"4.5\" rx=\"1\"/><path d=\"M11.5 5.5l2.5-1.5v4l-2.5-1.5\"/>',\n service:\n '<circle cx=\"4.5\" cy=\"8\" r=\"2\"/><circle cx=\"11.5\" cy=\"4.5\" r=\"2\"/><circle cx=\"11.5\" cy=\"11.5\" r=\"2\"/><path d=\"M6.2 6.8l3.3-1.3M6.2 9.2l3.3 1.3\"/>',\n node: '<rect x=\"2.5\" y=\"4\" width=\"11\" height=\"8\" rx=\"1\"/><path d=\"M5 7h6M5 10h3\"/><circle cx=\"11\" cy=\"10\" r=\".7\" fill=\"currentColor\" stroke=\"none\"/>',\n ingress: '<path d=\"M1.5 4.5h10M1.5 8h8M1.5 11.5h10\"/><path d=\"M10.5 6.5l3 1.5-3 1.5\"/>',\n cloud: '<path d=\"M11.5 10.5a2.5 2.5 0 00-1.5-4.5 2.8 2.8 0 00-5.2.3A2.5 2.5 0 004 10.5z\"/>',\n container:\n '<rect x=\"2.5\" y=\"2.5\" width=\"11\" height=\"11\" rx=\"1.5\"/><path d=\"M2.5 5.5h11M5.5 5.5V3M8 5.5V3M10.5 5.5V3\"/>',\n firewall: '<path d=\"M1.5 4h13v8h-13z\"/><path d=\"M1.5 6.5h13M5 6.5V12M8 4V12M11 6.5V12\"/>',\n shield: '<path d=\"M8 2.3l5.2 1.9v3.3c0 3.1-2.3 5.1-5.2 6.4C5.1 12.6 2.8 10.6 2.8 7.5V4.2z\"/>',\n certificate:\n '<path d=\"M3 2.5h10v9H3z\"/><path d=\"M3 5.5h10M6 8h4\"/><circle cx=\"8\" cy=\"11\" r=\".6\" fill=\"currentColor\" stroke=\"none\"/><path d=\"M12 3.5l2 1.5-2 1.5V3.5z\"/>',\n key: '<circle cx=\"5\" cy=\"9\" r=\"2.8\"/><path d=\"M6.9 7.1l5.6-5.6M11 4.5h2.5V7\"/>',\n metrics: '<path d=\"M2.5 13V3M2.5 13H13\"/><path d=\"M4.5 10l2.5-4 2 2 3-5\"/>',\n logs: '<path d=\"M3 4.5h10M3 7h10M3 9.5h7M3 12h4\"/>',\n trace:\n '<circle cx=\"3.5\" cy=\"5.5\" r=\"1.2\"/><circle cx=\"8\" cy=\"11\" r=\"1.2\"/><circle cx=\"12.5\" cy=\"5.5\" r=\"1.2\"/><path d=\"M4.5 6.3l2.5 3.4M9 9.2l2.5-3.4\"/>',\n\n // ── Accessibility (original glyphs for generic concepts) ─────\n universalAccess:\n '<circle cx=\"8\" cy=\"8\" r=\"6\"/><circle cx=\"8\" cy=\"4.9\" r=\".9\" fill=\"currentColor\" stroke=\"none\"/><path d=\"M4.9 6.3c2 .8 4.2 .8 6.2 0M8 6.4v3.1M6.3 11.9 8 9.4l1.7 2.5\"/>',\n wheelchair:\n '<circle cx=\"6.5\" cy=\"3.1\" r=\"1.3\"/><path d=\"M6.5 4.5v3.3h3.1l1.7 3.4\"/><circle cx=\"6.7\" cy=\"11.3\" r=\"2.6\"/><path d=\"M9.3 11.3h2.1l-.5 1.6\"/>',\n hearing:\n '<path d=\"M5 6.2a3 3 0 0 1 6 0c0 2.2-2.2 2.6-2.2 4.7A1.8 1.8 0 0 1 5 10.8\"/><path d=\"M8.6 13.1a2.2 2.2 0 0 0 2.1-2.2\"/>',\n lowVision:\n '<path d=\"M1.8 8S4.2 4 8 4s6.2 4 6.2 4\"/><circle cx=\"8\" cy=\"8.3\" r=\"2.1\"/><path d=\"M2.6 10.8 4 9.4M13.4 10.8 12 9.4\"/>',\n braille:\n '<circle cx=\"5\" cy=\"4.5\" r=\"1.05\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"5\" cy=\"8\" r=\"1.05\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"5\" cy=\"11.5\" r=\"1.05\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"9\" cy=\"4.5\" r=\"1.05\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"9\" cy=\"8\" r=\"1.05\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"11.2\" cy=\"6\" r=\"1.05\" fill=\"currentColor\" stroke=\"none\"/>',\n signLanguage:\n '<path d=\"M5.6 9.4V5a1 1 0 0 1 2 0M7.6 8V4.3a1 1 0 0 1 2 0V8M9.6 8V5.3a1 1 0 0 1 2 0v4.2c0 2.1-1.7 3.7-3.8 3.7-1.2 0-2.3-.5-3.1-1.5L4.1 11.5a1 1 0 0 1 1.5-1.3z\"/>',\n\n // ── Alert (original glyphs) ─────────────────────────────────\n siren: '<path d=\"M3.5 13h9M5 13V8a3 3 0 0 1 6 0v5M8 2.4V4M3.6 4.6l1 .9M12.4 4.6l-1 .9\"/>',\n alarm:\n '<circle cx=\"8\" cy=\"9\" r=\"4.4\"/><path d=\"M8 6.6V9l1.7 1M5 2.6 3.1 4.3M11 2.6l1.9 1.7M8 4.6V3\"/>',\n megaphone: '<path d=\"M3 7.3v1.6l7 3V4.3zM10 5.7 12.5 4.2v7.6L10 10.3M4 9.6l.9 3.1h1.6l-.7-2.9\"/>',\n flag: '<path d=\"M4 13.5V3M4 3.6h7.4L9.8 6.2l1.6 2.6H4\"/>',\n shieldAlert:\n '<path d=\"M8 2.3l5.2 1.9v3.3c0 3.1-2.3 5.1-5.2 6.4C5.1 12.6 2.8 10.6 2.8 7.5V4.2z\"/><path d=\"M8 5.5v3.1M8 10.6v.2\"/>',\n\n // ── State / action (also usable as badges via the icon `badge` input) ─\n running: '<path d=\"M5.5 4l6 4-6 4z\"/>',\n stopped: '<rect x=\"4.5\" y=\"4.5\" width=\"7\" height=\"7\" rx=\"1\"/>',\n paused:\n '<rect x=\"5.2\" y=\"4\" width=\"2\" height=\"8\" rx=\".5\"/><rect x=\"8.8\" y=\"4\" width=\"2\" height=\"8\" rx=\".5\"/>',\n maintenance:\n '<path d=\"M10.8 3.2a2.7 2.7 0 00-3.5 3.4l-4.2 4.2L4.6 12.7l4.2-4.2a2.7 2.7 0 003.4-3.5L10.5 6.7 9.3 6.4 9 5.2z\"/>',\n sync: '<path d=\"M12.5 7a4.5 4.5 0 00-8-2.5M3.5 9a4.5 4.5 0 008 2.5\"/><path d=\"M12.5 3v2.5H10M3.5 13v-2.5H6\"/>',\n snapshot:\n '<rect x=\"2.5\" y=\"4.5\" width=\"11\" height=\"8\" rx=\"1.5\"/><circle cx=\"8\" cy=\"8.5\" r=\"2.3\"/><path d=\"M6 4.5l1-1.5h2l1 1.5\"/>',\n lock: '<rect x=\"3.5\" y=\"7\" width=\"9\" height=\"6\" rx=\"1.5\"/><path d=\"M5.5 7V5.4a2.5 2.5 0 015 0V7\"/>',\n\n // ── Time & scheduling ────────────────────────────────────────\n clock: '<circle cx=\"8\" cy=\"8\" r=\"5.8\"/><path d=\"M8 4.6V8l2.4 1.7\"/>',\n history: '<path d=\"M3.2 5.4A5.8 5.8 0 112.4 9\"/><path d=\"M3 2.6v3h3\"/><path d=\"M8 5.4V8l2 1.4\"/>',\n timer: '<circle cx=\"8\" cy=\"9.2\" r=\"4.6\"/><path d=\"M6.4 2.2h3.2M8 2.2v2.4M8 9.2l1.9-1.9\"/>',\n hourglass:\n '<path d=\"M4.4 2.5h7.2M4.4 13.5h7.2M5.2 2.5v2L8 8l2.8-3.5v-2M5.2 13.5v-2L8 8l2.8 3.5v2\"/>',\n\n // ── Communication ────────────────────────────────────────────\n mail: '<rect x=\"2.2\" y=\"3.6\" width=\"11.6\" height=\"8.8\" rx=\"1.2\"/><path d=\"M2.8 4.6L8 8.8l5.2-4.2\"/>',\n chat: '<path d=\"M3.7 3h8.6a1.2 1.2 0 011.2 1.2v5a1.2 1.2 0 01-1.2 1.2H7l-3.3 2.8v-2.8h0a1.2 1.2 0 01-1.2-1.2v-5A1.2 1.2 0 013.7 3z\"/><path d=\"M5.4 6h5.2M5.4 8h3.4\"/>',\n\n // ── General additions ────────────────────────────────────────\n help: '<circle cx=\"8\" cy=\"8\" r=\"6\"/><path d=\"M6.2 6.3a1.8 1.8 0 113 1.3c-.7.6-1.2 1-1.2 1.8\"/><path d=\"M8 11.6v.2\"/>',\n home: '<path d=\"M2.8 7.4L8 3l5.2 4.4\"/><path d=\"M4.2 6.6V13h7.6V6.6\"/><path d=\"M6.6 13V9.4h2.8V13\"/>',\n link: '<path d=\"M6.4 9.6l3.2-3.2\"/><path d=\"M7.4 4.7l1.3-1.3a2.6 2.6 0 013.7 3.7l-1.3 1.3\"/><path d=\"M8.6 11.3l-1.3 1.3a2.6 2.6 0 01-3.7-3.7l1.3-1.3\"/>',\n globe:\n '<circle cx=\"8\" cy=\"8\" r=\"5.8\"/><ellipse cx=\"8\" cy=\"8\" rx=\"2.6\" ry=\"5.8\"/><path d=\"M2.2 8h11.6\"/>',\n star: '<path d=\"M8 2.6l1.7 3.5 3.9.6-2.8 2.7.7 3.9L8 11.4l-3.5 1.9.7-3.9-2.8-2.7 3.9-.6z\"/>',\n pin: '<path d=\"M9.6 2.4l4 4-1.7.5-2.3 2.3-.3 2.7L4.6 7.2l2.7-.3L9.6 4.6z\"/><path d=\"M5.6 10.4l-2.8 2.8\"/>',\n share:\n '<circle cx=\"11.6\" cy=\"3.8\" r=\"1.6\"/><circle cx=\"4.2\" cy=\"8\" r=\"1.6\"/><circle cx=\"11.6\" cy=\"12.2\" r=\"1.6\"/><path d=\"M5.7 7.2l4.4-2.6M5.7 8.8l4.4 2.6\"/>',\n archive:\n '<rect x=\"2.4\" y=\"3\" width=\"11.2\" height=\"3.2\" rx=\".8\"/><path d=\"M3.4 6.2V12a1 1 0 001 1h7.2a1 1 0 001-1V6.2\"/><path d=\"M6.6 8.6h2.8\"/>',\n\n // ── View / layout controls ───────────────────────────────────\n zoomIn: '<circle cx=\"7\" cy=\"7\" r=\"4\"/><path d=\"M10 10l3.5 3.5M5.4 7h3.2M7 5.4v3.2\"/>',\n zoomOut: '<circle cx=\"7\" cy=\"7\" r=\"4\"/><path d=\"M10 10l3.5 3.5M5.4 7h3.2\"/>',\n fullscreen: '<path d=\"M2.5 5.5v-3h3M13.5 5.5v-3h-3M2.5 10.5v3h3M13.5 10.5v3h-3\"/>',\n exitFullscreen: '<path d=\"M5.5 2.5v3h-3M10.5 2.5v3h3M5.5 13.5v-3h-3M10.5 13.5v-3h3\"/>',\n listView:\n '<path d=\"M5.6 4h7.9M5.6 8h7.9M5.6 12h7.9\"/><circle cx=\"2.9\" cy=\"4\" r=\".9\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"2.9\" cy=\"8\" r=\".9\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"2.9\" cy=\"12\" r=\".9\" fill=\"currentColor\" stroke=\"none\"/>',\n dragHandle:\n '<circle cx=\"5.6\" cy=\"3.6\" r=\"1.05\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"10.4\" cy=\"3.6\" r=\"1.05\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"5.6\" cy=\"8\" r=\"1.05\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"10.4\" cy=\"8\" r=\"1.05\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"5.6\" cy=\"12.4\" r=\"1.05\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"10.4\" cy=\"12.4\" r=\"1.05\" fill=\"currentColor\" stroke=\"none\"/>',\n chevronUp: '<path d=\"M3.5 10L8 5.5 12.5 10\"/>',\n chevronDoubleLeft: '<path d=\"M12.5 3.5L8 8l4.5 4.5M7.5 3.5L3 8l4.5 4.5\"/>',\n chevronDoubleUp: '<path d=\"M3.5 12.5L8 8l4.5 4.5M3.5 8L8 3.5 12.5 8\"/>',\n chevronDoubleDown: '<path d=\"M3.5 3.5L8 8l4.5-4.5M3.5 8L8 12.5 12.5 8\"/>',\n\n // ── Infrastructure & identity ────────────────────────────────\n dns: '<circle cx=\"8\" cy=\"3.4\" r=\"1.5\"/><circle cx=\"4\" cy=\"12.4\" r=\"1.5\"/><circle cx=\"12\" cy=\"12.4\" r=\"1.5\"/><path d=\"M8 4.9v2.7M8 7.6l-3.2 3.5M8 7.6l3.2 3.5\"/>',\n vpn: '<path d=\"M8 2.3l5.2 1.9v3.3c0 3.1-2.3 5.1-5.2 6.4C5.1 12.6 2.8 10.6 2.8 7.5V4.2z\"/><circle cx=\"8\" cy=\"6.8\" r=\"1.2\"/><path d=\"M8 8v2.2\"/>',\n api: '<path d=\"M5 3.5L2.5 8 5 12.5M11 3.5L13.5 8 11 12.5\"/><circle cx=\"8\" cy=\"8\" r=\".9\" fill=\"currentColor\" stroke=\"none\"/>',\n bolt: '<path d=\"M8.8 2.2L4.6 8.8h2.8L7.2 13.8l4.2-6.8H8.6z\"/>',\n queue: '<path d=\"M3 4.6h10M3 8h10M3 11.4h5.6\"/><path d=\"M11 10l2 1.4-2 1.4\"/>',\n users:\n '<circle cx=\"6\" cy=\"5.6\" r=\"2.2\"/><path d=\"M2.2 13.4c0-2.3 1.7-3.9 3.8-3.9s3.8 1.6 3.8 3.9\"/><path d=\"M10.4 3.8a2.2 2.2 0 010 3.8M11.6 9.8c1.5.6 2.4 1.9 2.4 3.5\"/>',\n login: '<path d=\"M9.5 3.5h2.5a1 1 0 011 1v7a1 1 0 01-1 1H9.5M6.5 5.5L9.5 8l-3 3M9.5 8H3\"/>',\n unlock:\n '<rect x=\"3.5\" y=\"7\" width=\"9\" height=\"6\" rx=\"1.5\"/><path d=\"M5.5 7V5.2A2.5 2.5 0 0110.4 4.4\"/>',\n ban: '<circle cx=\"8\" cy=\"8\" r=\"5.8\"/><path d=\"M3.9 3.9l8.2 8.2\"/>',\n\n // ── Generic vendor marks (abstract glyphs, NOT real trademarked logos) ─\n vendorVmware:\n '<rect x=\"2.5\" y=\"6.5\" width=\"3\" height=\"3.4\" rx=\".5\"/><rect x=\"6.5\" y=\"6.5\" width=\"3\" height=\"3.4\" rx=\".5\"/><rect x=\"10.5\" y=\"6.5\" width=\"3\" height=\"3.4\" rx=\".5\"/>',\n vendorCisco: '<path d=\"M2.5 10.5V7.5M5.5 10.5V5M8 10.5V3.5M10.5 10.5V5M13.5 10.5V7.5\"/>',\n vendorHpe: '<rect x=\"2.5\" y=\"5\" width=\"11\" height=\"6\" rx=\"1\"/><path d=\"M5.5 5v6\"/>',\n vendorDell: '<circle cx=\"8\" cy=\"8\" r=\"5.6\"/><path d=\"M5.4 8h3.4M5.4 6.6h2.6M5.4 9.4h2.6\"/>',\n vendorKaytus: '<path d=\"M5 3v10M5 8l4.5-4.5M5 8l4.5 5\"/>',\n\n // ── Storage & removable media ────────────────────────────────\n // Optical disc (CD / DVD) — platter with a wide hub and a reflective sheen arc.\n opticalDisc:\n '<circle cx=\"8\" cy=\"8\" r=\"5.8\"/><circle cx=\"8\" cy=\"8\" r=\"1.9\"/><path d=\"M10.9 4.7a4.6 4.6 0 011.1 2.4\"/>',\n // SSD — board with two memory chips and an edge connector.\n ssd: '<rect x=\"2.4\" y=\"4.2\" width=\"11.2\" height=\"7.6\" rx=\"1\"/><rect x=\"4\" y=\"6\" width=\"2.6\" height=\"4\" rx=\".4\"/><rect x=\"7.2\" y=\"6\" width=\"2.6\" height=\"4\" rx=\".4\"/><path d=\"M11.2 6.6h1.2M11.2 9.4h1.2\"/>',\n // USB flash drive — body with a metal connector (two contacts) and a label line.\n usb: '<rect x=\"6.2\" y=\"4.3\" width=\"7.3\" height=\"7.4\" rx=\"1.3\"/><rect x=\"2.5\" y=\"6\" width=\"3.7\" height=\"4\" rx=\".4\"/><path d=\"M8.6 6.8h2.7M8.6 9.2h2.7\"/>',\n // SD card — keyed (clipped corner) body with gold contact lines.\n sdCard:\n '<path d=\"M5 2.8h4.6l1.9 1.9v8.2a.5.5 0 01-.5.5H5a.5.5 0 01-.5-.5V3.3a.5.5 0 01.5-.5z\"/><path d=\"M6.8 4.2v2M9.2 4.2v2\"/>',\n // Backup tape (LTO cartridge) — shell with a label strip and two reels.\n tape: '<rect x=\"2.4\" y=\"3.6\" width=\"11.2\" height=\"8.8\" rx=\"1\"/><path d=\"M2.4 5.7h11.2\"/><circle cx=\"6.1\" cy=\"9\" r=\"1.6\"/><circle cx=\"9.9\" cy=\"9\" r=\"1.6\"/>',\n\n // ── Hardware components ──────────────────────────────────────\n // GPU — expansion card with a cooling fan, heatsink fins and a PCIe edge.\n gpu: '<rect x=\"2.3\" y=\"4.4\" width=\"10.4\" height=\"6.6\" rx=\"1\"/><circle cx=\"6.2\" cy=\"7.7\" r=\"2\"/><path d=\"M6.2 5.7v4M4.2 7.7h4\"/><path d=\"M10.3 6.5h1.7M10.3 9h1.7\"/><path d=\"M4.3 11v1.6M9 11v1.6\"/>',\n // PSU — enclosure with a fan and an IEC power socket.\n psu: '<rect x=\"2.4\" y=\"3.6\" width=\"11.2\" height=\"8.8\" rx=\"1\"/><circle cx=\"6.8\" cy=\"8\" r=\"2.5\"/><path d=\"M6.8 5.5v5M4.3 8h5\"/><path d=\"M11.8 6.6v2.8\"/>',\n // Cooling fan — hub with four swept blades.\n fan: '<circle cx=\"8\" cy=\"8\" r=\"5.8\"/><circle cx=\"8\" cy=\"8\" r=\"1.2\"/><path d=\"M8 6.8c2.1-1.6 4-1.2 4.7.5M8 9.2c-2.1 1.6-4 1.2-4.7-.5M9.2 8c1.6 2.1 1.2 4-.5 4.7M6.8 8c-1.6-2.1-1.2-4 .5-4.7\"/>',\n // Battery — cell with terminal nub and charge bars.\n battery:\n '<rect x=\"2.4\" y=\"4.8\" width=\"10\" height=\"6.4\" rx=\"1.2\"/><path d=\"M13 6.8v2.4\"/><path d=\"M4.3 6.8v2.4M6 6.8v2.4M7.7 6.8v2.4\"/>',\n // UPS — tower unit with a lightning bolt and a base line.\n ups: '<rect x=\"3.4\" y=\"2.4\" width=\"9.2\" height=\"11.2\" rx=\"1\"/><path d=\"M8.5 4.6L6.3 8h1.9l-1.7 3.4\"/><path d=\"M5.4 12.4h5.2\"/>',\n // Motherboard — board with a CPU socket, RAM slots and traces.\n motherboard:\n '<rect x=\"2.4\" y=\"2.4\" width=\"11.2\" height=\"11.2\" rx=\"1\"/><rect x=\"4.4\" y=\"4.4\" width=\"4\" height=\"4\" rx=\".5\"/><path d=\"M10.8 4.6v3.8\"/><path d=\"M4.4 11.2h4.6\"/><circle cx=\"11.2\" cy=\"11.2\" r=\".6\" fill=\"currentColor\" stroke=\"none\"/>',\n // Sensor — central node with symmetric detection arcs.\n sensor:\n '<circle cx=\"8\" cy=\"8\" r=\"1.4\" fill=\"currentColor\" stroke=\"none\"/><path d=\"M5.3 5.3a4 4 0 000 5.4M10.7 5.3a4 4 0 010 5.4M3.5 3.5a6.5 6.5 0 000 9M12.5 3.5a6.5 6.5 0 010 9\"/>',\n // Thermometer — stem, bulb and a fill line.\n thermometer:\n '<path d=\"M9.6 8.7V4.6a1.6 1.6 0 10-3.2 0v4.1a2.7 2.7 0 103.2 0z\"/><path d=\"M8 5.6v3.3\"/>',\n\n // ── AI / machine learning ────────────────────────────────────\n // Sparkles — the four-point \"generate / AI\" star plus a small twinkle.\n sparkles:\n '<path d=\"M7.5 2.6l1 2.9 2.9 1-2.9 1-1 2.9-1-2.9-2.9-1 2.9-1z\"/><path d=\"M12 9.8l.45 1.3 1.3.45-1.3.45L12 13.3l-.45-1.3-1.3-.45 1.3-.45z\"/>',\n // Brain — two lobed hemispheres with folds around a central fissure.\n brain:\n '<path d=\"M8 3.3a2.3 2.3 0 00-2.2 1.7 2 2 0 00-1.2 3 2 2 0 001 3 2.2 2.2 0 002.4 1.2\"/><path d=\"M8 3.3a2.3 2.3 0 012.2 1.7 2 2 0 011.2 3 2 2 0 01-1 3 2.2 2.2 0 01-2.4 1.2\"/><path d=\"M8 3.3v9.5\"/><path d=\"M5.8 6.2c.9.2 1.4.9 1.4 1.8M10.2 6.2c-.9.2-1.4.9-1.4 1.8M6 9.6c.8-.1 1.3-.7 1.3-1.5M10 9.6c-.8-.1-1.3-.7-1.3-1.5\"/>',\n // Robot — head with eyes, an antenna and a mouth.\n robot:\n '<rect x=\"3.6\" y=\"5.2\" width=\"8.8\" height=\"7.4\" rx=\"2\"/><circle cx=\"6.4\" cy=\"8.6\" r=\"1\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"9.6\" cy=\"8.6\" r=\"1\" fill=\"currentColor\" stroke=\"none\"/><path d=\"M6.6 10.9h2.8\"/><path d=\"M8 3.1v2\"/><circle cx=\"8\" cy=\"2.6\" r=\".75\"/>',\n // Neural network — four nodes, fully connected.\n neuralNetwork:\n '<circle cx=\"4.5\" cy=\"4.6\" r=\"1.3\"/><circle cx=\"4.5\" cy=\"11.4\" r=\"1.3\"/><circle cx=\"11.5\" cy=\"4.6\" r=\"1.3\"/><circle cx=\"11.5\" cy=\"11.4\" r=\"1.3\"/><path d=\"M5.8 4.6h4.4M5.8 11.4h4.4M5.6 5.6l4.8 4.8M5.6 10.4l4.8-4.8\"/>',\n // AI chip — a CPU frame with a sparkle inside instead of a plain core.\n aiChip:\n '<rect x=\"4.3\" y=\"4.3\" width=\"7.4\" height=\"7.4\" rx=\"1\"/><path d=\"M8 5.9l.55 1.55L10.1 8l-1.55.55L8 10.1l-.55-1.55L5.9 8l1.55-.45z\"/><path d=\"M6.5 2.6v1.7M9.5 2.6v1.7M6.5 11.7v1.7M9.5 11.7v1.7M2.6 6.5h1.7M2.6 9.5h1.7M11.7 6.5h1.7M11.7 9.5h1.7\"/>',\n // Wand — magic wand with a sparkle at the tip.\n wand: '<path d=\"M3.8 12.2l6.4-6.4\"/><path d=\"M10.4 3.1l.5 1.4 1.4.5-1.4.5-.5 1.4-.5-1.4-1.4-.5 1.4-.5z\"/><path d=\"M4.7 4.4l.32.9.9.32-.9.32-.32.9-.32-.9-.9-.32.9-.32z\"/>',\n // Model — a packaged 3D artifact (solid box).\n model:\n '<path d=\"M8 2.4l4.9 2.7v5.8L8 13.6l-4.9-2.7V5.1z\"/><path d=\"M3.2 5.2L8 7.9l4.8-2.7M8 7.9v5.7\"/>',\n\n // ── Peripherals & networking ─────────────────────────────────\n // Router — chassis with status LEDs and two antennas.\n router:\n '<rect x=\"2.4\" y=\"7\" width=\"11.2\" height=\"5.2\" rx=\"1\"/><circle cx=\"5\" cy=\"9.6\" r=\".55\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"7\" cy=\"9.6\" r=\".55\" fill=\"currentColor\" stroke=\"none\"/><path d=\"M10.6 9.6h1.4\"/><path d=\"M6 7V4.4M10 7V4.4\"/><path d=\"M6 4.4l-1-1.2M10 4.4l1-1.2\"/>',\n // Load balancer — one source distributing to three targets.\n loadBalancer:\n '<circle cx=\"3.8\" cy=\"8\" r=\"1.4\"/><circle cx=\"12.2\" cy=\"4.4\" r=\"1.3\"/><circle cx=\"12.2\" cy=\"8\" r=\"1.3\"/><circle cx=\"12.2\" cy=\"11.6\" r=\"1.3\"/><path d=\"M5.2 8h1.2M6.4 8l4.5-3.4M6.4 8h4.5M6.4 8l4.5 3.4\"/>',\n // Wi-Fi — three broadcast arcs over a node.\n wifi: '<path d=\"M2.6 6.6a8 8 0 0110.8 0\"/><path d=\"M4.8 9a5 5 0 016.4 0\"/><path d=\"M6.9 11.3a2 2 0 012.2 0\"/><circle cx=\"8\" cy=\"12.6\" r=\".6\" fill=\"currentColor\" stroke=\"none\"/>',\n // Bluetooth — the rune.\n bluetooth: '<path d=\"M6 5.6l5 5-3 2.4V3.1l3 2.4-5 5\"/>',\n // Monitor — screen on a stand.\n monitor:\n '<rect x=\"2.4\" y=\"3\" width=\"11.2\" height=\"7.6\" rx=\"1\"/><path d=\"M6.4 13.2h3.2M8 10.6v2.6\"/>',\n // Keyboard — keys and a spacebar.\n keyboard:\n '<rect x=\"2\" y=\"4.4\" width=\"12\" height=\"7.2\" rx=\"1\"/><path d=\"M4.4 7h1.4M7.3 7h1.4M10.2 7h1.4M5.2 9.6h5.6\"/>',\n // Printer — paper feed, body, output sheet and an LED.\n printer:\n '<path d=\"M5 6.4V3.2h6v3.2\"/><rect x=\"2.8\" y=\"6.4\" width=\"10.4\" height=\"4.8\" rx=\"1\"/><path d=\"M5 9.2h6v3.6H5z\"/><circle cx=\"11\" cy=\"8.4\" r=\".5\" fill=\"currentColor\" stroke=\"none\"/>',\n};\n\n// Composite \"off\" variants — re-use base glyph + diagonal slash.\nSTRCT_ICONS['eyeOff'] = `${STRCT_ICONS['eye']}<path d=\"M2.5 2.5l11 11\"/>`;\nSTRCT_ICONS['bellOff'] = `${STRCT_ICONS['bell']}<path d=\"M2.6 2.6l10.8 10.8\"/>`;\nSTRCT_ICONS['wifiOff'] = `${STRCT_ICONS['wifi']}<path d=\"M2.5 2.5l11 11\"/>`;\nSTRCT_ICONS['cloudOff'] = `${STRCT_ICONS['cloud']}<path d=\"M2.5 2.5l11 11\"/>`;\nSTRCT_ICONS['linkOff'] = `${STRCT_ICONS['link']}<path d=\"M2.5 2.5l11 11\"/>`;\n// Semantic aliases.\nSTRCT_ICONS['unlink'] = STRCT_ICONS['linkOff'];\nSTRCT_ICONS['webhook'] = STRCT_ICONS['bolt'];\n\n/** Icon names grouped for galleries / documentation. */\nexport const STRCT_ICON_GROUPS: { label: string; names: string[] }[] = [\n {\n label: 'General',\n names: [\n 'hexagon',\n 'search',\n 'menu',\n 'dots',\n 'ellipsis',\n 'close',\n 'check',\n 'calendar',\n 'eye',\n 'eyeOff',\n 'upload',\n 'download',\n 'sun',\n 'moon',\n 'bell',\n 'heart',\n 'layers',\n 'grid',\n 'form',\n 'chart',\n 'bars',\n 'gauge',\n 'palette',\n 'sidebar',\n 'compass',\n 'copy',\n 'code',\n 'book',\n 'terminal',\n 'folder',\n 'file',\n 'template',\n 'clipboard',\n 'tag',\n 'clock',\n 'history',\n 'timer',\n 'hourglass',\n 'help',\n 'home',\n 'link',\n 'linkOff',\n 'star',\n 'pin',\n 'share',\n 'archive',\n 'mail',\n 'chat',\n 'globe',\n 'listView',\n 'dragHandle',\n 'zoomIn',\n 'zoomOut',\n 'fullscreen',\n 'exitFullscreen',\n 'chevronUp',\n 'chevronDown',\n 'chevronDoubleLeft',\n 'chevronDoubleRight',\n 'chevronDoubleUp',\n 'chevronDoubleDown',\n ],\n },\n {\n label: 'Actions',\n names: [\n 'plus',\n 'minus',\n 'pencil',\n 'trash',\n 'refresh',\n 'filter',\n 'settings',\n 'user',\n 'logout',\n 'login',\n 'users',\n 'unlock',\n 'ban',\n 'undo',\n 'redo',\n 'arrowUp',\n 'arrowDown',\n 'arrowLeft',\n 'arrowRight',\n 'externalLink',\n ],\n },\n {\n label: 'Status',\n names: ['info', 'success', 'warning', 'critical', 'sync', 'lock', 'snapshot'],\n },\n {\n label: 'Alert',\n names: ['bell', 'bellOff', 'siren', 'alarm', 'megaphone', 'flag', 'shieldAlert', 'warning'],\n },\n {\n label: 'Accessibility',\n names: ['universalAccess', 'wheelchair', 'hearing', 'lowVision', 'braille', 'signLanguage'],\n },\n {\n label: 'Datacenter',\n names: [\n 'datacenter',\n 'rack',\n 'cluster',\n 'host',\n 'vm',\n 'switch',\n 'storage',\n 'network',\n 'cpu',\n 'memory',\n 'disk',\n 'port',\n 'nic',\n 'hba',\n 'ethernet',\n 'power',\n 'resourcePool',\n 'portGroup',\n ],\n },\n {\n label: 'Infrastructure',\n names: [\n 'pod',\n 'deployment',\n 'service',\n 'node',\n 'ingress',\n 'cloud',\n 'container',\n 'firewall',\n 'shield',\n 'certificate',\n 'key',\n 'metrics',\n 'logs',\n 'trace',\n 'dns',\n 'vpn',\n 'api',\n 'bolt',\n 'queue',\n ],\n },\n {\n label: 'Storage & media',\n names: ['disk', 'ssd', 'opticalDisc', 'usb', 'sdCard', 'tape', 'snapshot'],\n },\n {\n label: 'Hardware',\n names: ['gpu', 'psu', 'fan', 'battery', 'ups', 'motherboard', 'sensor', 'thermometer'],\n },\n {\n label: 'AI',\n names: ['sparkles', 'brain', 'robot', 'neuralNetwork', 'aiChip', 'wand', 'model'],\n },\n {\n label: 'Peripherals & network',\n names: [\n 'router',\n 'loadBalancer',\n 'wifi',\n 'wifiOff',\n 'cloudOff',\n 'bluetooth',\n 'monitor',\n 'keyboard',\n 'printer',\n ],\n },\n {\n label: 'Object state',\n names: ['running', 'stopped', 'paused', 'maintenance'],\n },\n {\n label: 'Vendor (generic)',\n names: ['vendorVmware', 'vendorCisco', 'vendorHpe', 'vendorDell', 'vendorKaytus'],\n },\n];\n\n/**\n * Full-SVG icons that keep their own viewBox and colors (no stroke wrapper).\n * Use this for brand / vendor logos you have the rights to ship — register the\n * official asset's markup yourself; the library does not bundle any logos.\n */\nexport const STRCT_RAW_ICONS: Record<string, string> = {};\n\n/**\n * Register an icon at runtime.\n * registerStrctIcon('mything', '<path d=\"…\"/>'); // stroke glyph\n * registerStrctIcon('vendorDell', '<svg viewBox=\"…\">…</svg>', { raw: true });\n */\nexport function registerStrctIcon(\n name: string,\n content: string,\n options: { raw?: boolean } = {},\n): void {\n if (options.raw) {\n STRCT_RAW_ICONS[name] = content;\n } else {\n STRCT_ICONS[name] = content;\n }\n}\n\n/**\n * Icon status badge variants — two families, both color-blind safe:\n *\n * **Health** (silhouette-coded): circle ✓ success · triangle ! warning ·\n * diamond × critical · circle i info · circle wrench maintenance.\n *\n * **Lifecycle** (vCenter media language — glyphs in a badge disc):\n * green disc ▶ running · amber disc ⏸ paused · grey disc ■ off.\n */\nexport type StrctIconBadge =\n | 'none'\n | 'success'\n | 'warning'\n | 'critical'\n | 'running'\n | 'paused'\n | 'off'\n | 'info'\n | 'maintenance';\n\n/**\n * Inline stroke icon. `<strct-icon name=\"host\" badge=\"success\" />` renders the host\n * glyph with a green status dot (a \"running host\"). Unknown names render\n * nothing rather than throwing.\n */\n@Component({\n selector: 'strct-icon',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `@if (isRaw()) {\n <span\n class=\"strct-icon__raw\"\n [style.width.px]=\"size()\"\n [style.height.px]=\"size()\"\n [innerHTML]=\"rawSvg()\"\n ></span>\n } @else {\n <svg\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n [attr.stroke-width]=\"strokeWidth()\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n [style.width.px]=\"size()\"\n [style.height.px]=\"size()\"\n [innerHTML]=\"svg()\"\n role=\"img\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-hidden]=\"ariaLabel() ? null : 'true'\"\n ></svg>\n }\n @if (badge() !== 'none') {\n <span class=\"strct-icon__badge strct-icon__badge--{{ badge() }}\">\n @if (badge() === 'maintenance') {\n <svg\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path\n d=\"M3.5 2.5c-1.5 0-2.5 1.5-1.5 3l3.5 3.5c-.5 1.5 0 3 1.5 3.5s3 0 3.5-1.5M6.5 5.5l6 6M7.5 10.5c1 1.5 2.5 2.5 4 1.5s1.5-2.5.5-4\"\n />\n </svg>\n }\n </span>\n }`,\n host: { class: 'strct-icon' },\n styles: [\n `\n .strct-icon {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n line-height: 0;\n }\n .strct-icon__raw {\n display: inline-flex;\n }\n .strct-icon__raw > svg {\n width: 100%;\n height: 100%;\n display: block;\n }\n .strct-icon__badge {\n position: absolute;\n inset-inline-end: -3px;\n bottom: -3px;\n width: 50%;\n height: 50%;\n min-width: 8px;\n min-height: 8px;\n max-width: 12px;\n max-height: 12px;\n border-radius: 50%;\n box-shadow: 0 0 0 1.5px var(--bg-1);\n }\n /* Health states are silhouette-coded (circle ✓ · triangle ! · diamond ×\n · circle i); lifecycle states speak vCenter's media language inside a\n badge disc (▶ running · ⏸ paused · ■ off). Both read without color. */\n .strct-icon__badge--success,\n .strct-icon__badge--critical,\n .strct-icon__badge--info,\n .strct-icon__badge--off,\n .strct-icon__badge--paused,\n .strct-icon__badge--running {\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: clamp(6px, 68%, 10px);\n font-weight: 800;\n line-height: 1;\n color: var(--inv);\n }\n .strct-icon__badge--success {\n background: var(--success);\n }\n .strct-icon__badge--success::before {\n content: '✓';\n }\n .strct-icon__badge--warning {\n background: var(--warning);\n border-radius: 1px;\n clip-path: polygon(50% 10%, 92% 90%, 8% 90%);\n box-shadow: none;\n filter: drop-shadow(0 0 1.5px var(--bg-1));\n inset-inline-end: -2px;\n bottom: -2px;\n width: 60%;\n height: 60%;\n min-width: 11px;\n min-height: 11px;\n max-width: 18px;\n max-height: 18px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: clamp(6px, 70%, 10px);\n font-weight: 800;\n color: var(--inv);\n line-height: 1;\n }\n .strct-icon__badge--warning::before {\n content: '!';\n }\n /* Critical: diamond silhouette (vSphere-style alarm language). */\n .strct-icon__badge--critical {\n background: var(--critical);\n border-radius: 1px;\n clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%);\n box-shadow: none;\n filter: drop-shadow(0 0 1.5px var(--bg-1));\n width: 58%;\n height: 58%;\n min-width: 10px;\n min-height: 10px;\n max-width: 15px;\n max-height: 15px;\n font-size: clamp(6px, 56%, 9px);\n }\n .strct-icon__badge--critical::before {\n content: '×';\n }\n /* Running: green disc with a play triangle. */\n .strct-icon__badge--running {\n background: var(--success);\n }\n .strct-icon__badge--running::before {\n content: '';\n width: 46%;\n height: 46%;\n min-width: 4px;\n min-height: 4px;\n background: var(--inv);\n clip-path: polygon(15% 2%, 100% 50%, 15% 98%);\n transform: translateX(9%);\n }\n /* Paused: amber disc with two pause bars. */\n .strct-icon__badge--paused {\n background: var(--warning);\n }\n .strct-icon__badge--paused::before {\n content: '';\n width: 1.6px;\n height: 42%;\n min-height: 4px;\n background: var(--inv);\n box-shadow: 2.6px 0 0 var(--inv);\n transform: translateX(-1.3px);\n }\n /* Off / stopped: neutral grey disc with a stop square. */\n .strct-icon__badge--off {\n background: var(--t3);\n }\n .strct-icon__badge--off::before {\n content: '';\n width: 40%;\n height: 40%;\n min-width: 3.5px;\n min-height: 3.5px;\n background: var(--inv);\n border-radius: 1px;\n }\n .strct-icon__badge--info {\n background: var(--acc);\n }\n .strct-icon__badge--info::before {\n content: 'i';\n }\n .strct-icon__badge--maintenance {\n background: var(--warning);\n inset-inline-end: -2px;\n bottom: -2px;\n width: 58%;\n height: 58%;\n min-width: 10px;\n min-height: 10px;\n max-width: 16px;\n max-height: 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 1px;\n box-shadow: 0 0 0 1.5px var(--bg-1);\n }\n .strct-icon__badge--maintenance svg {\n width: 84%;\n height: 84%;\n color: var(--inv);\n }\n `,\n ],\n})\nexport class StrctIcon {\n private readonly sanitizer = inject(DomSanitizer);\n\n /** Icon name from the STRCT_ICONS registry. */\n readonly name = input.required<string>();\n /** Icon size in pixels. */\n readonly size = input(16);\n /** Stroke width for outline icons. */\n readonly strokeWidth = input(1.4);\n /** Optional status dot overlaid on the glyph (object state). */\n readonly badge = input<StrctIconBadge>('none');\n /** Accessible label for the icon. When empty the icon is hidden from assistive tech. */\n readonly ariaLabel = input<string>('');\n\n /** True when the named icon is a full-SVG (raw) icon registered by the app. */\n protected readonly isRaw = computed(() =>\n Object.prototype.hasOwnProperty.call(STRCT_RAW_ICONS, this.name()),\n );\n\n protected readonly svg = computed<SafeHtml>(() =>\n this.sanitizer.bypassSecurityTrustHtml(STRCT_ICONS[this.name()] ?? ''),\n );\n protected readonly rawSvg = computed<SafeHtml>(() =>\n this.sanitizer.bypassSecurityTrustHtml(STRCT_RAW_ICONS[this.name()] ?? ''),\n );\n}\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation, inject } from '@angular/core';\nimport { StrctIcon } from '../icon/icon';\nimport { StrctThemeService } from './theme.service';\n\n/** Palette dots + light/dark pill, wired to {@link StrctThemeService}. */\n@Component({\n selector: 'strct-theme-switcher',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon],\n template: `\n <div class=\"strct-ts__pal\">\n @for (p of theme.palettes; track p.id) {\n <button\n type=\"button\"\n class=\"strct-ts__dot\"\n [class.strct-ts__dot--on]=\"theme.palette() === p.id\"\n [title]=\"p.label\"\n [attr.aria-label]=\"p.label\"\n [attr.aria-pressed]=\"theme.palette() === p.id\"\n (click)=\"theme.setPalette(p.id)\"\n >\n <span class=\"strct-ts__inner\" [style.background]=\"p.swatch\"></span>\n </button>\n }\n </div>\n <div class=\"strct-ts__pill\">\n <button\n type=\"button\"\n class=\"strct-ts__pbtn\"\n [class.strct-ts__pbtn--on]=\"!theme.isDark()\"\n title=\"Light\"\n aria-label=\"Light theme\"\n (click)=\"theme.setMode('light')\"\n >\n <strct-icon name=\"sun\" [size]=\"16\" [strokeWidth]=\"1.5\" />\n </button>\n <button\n type=\"button\"\n class=\"strct-ts__pbtn\"\n [class.strct-ts__pbtn--on]=\"theme.isDark()\"\n title=\"Dark\"\n aria-label=\"Dark theme\"\n (click)=\"theme.setMode('dark')\"\n >\n <strct-icon name=\"moon\" [size]=\"16\" [strokeWidth]=\"1.5\" />\n </button>\n </div>\n `,\n host: { class: 'strct-ts' },\n styles: [\n `\n .strct-ts {\n display: inline-flex;\n align-items: center;\n gap: 14px;\n }\n .strct-ts__pal {\n display: inline-flex;\n gap: 7px;\n }\n .strct-ts__dot {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 18px;\n border-radius: 50%;\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 1.5px solid rgba(255, 255, 255, 0.35);\n transition:\n transform 0.15s ease,\n border-color 0.15s ease;\n }\n .strct-ts__dot:hover {\n transform: scale(1.12);\n }\n .strct-ts__inner {\n width: 11px;\n height: 11px;\n border-radius: 50%;\n display: block;\n }\n .strct-ts__dot--on {\n border-color: var(--hdr-fg);\n box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.25);\n }\n\n .strct-ts__pill {\n display: inline-flex;\n padding: 2px;\n gap: 2px;\n border-radius: 7px;\n background: rgba(255, 255, 255, 0.1);\n }\n .strct-ts__pbtn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 22px;\n border: 0;\n border-radius: 5px;\n cursor: pointer;\n background: transparent;\n color: rgba(255, 255, 255, 0.6);\n transition:\n background 0.14s ease,\n color 0.14s ease;\n }\n .strct-ts__pbtn--on {\n background: rgba(255, 255, 255, 0.18);\n color: var(--hdr-fg);\n }\n `,\n ],\n})\nexport class StrctThemeSwitcher {\n protected readonly theme = inject(StrctThemeService);\n}\n","import {\n Directive,\n ElementRef,\n NgZone,\n OnDestroy,\n afterNextRender,\n inject,\n input,\n} from '@angular/core';\n\n/** Overlay positioning strategies. */\nexport type StrctOverlayPlacement =\n | 'bottom-start'\n | 'bottom-end'\n | 'top-start'\n | 'top-end'\n | 'right'\n | 'left';\n\n/**\n * Positions an overlay panel with `position: fixed` relative to an anchor\n * element, so it escapes ancestor `overflow: hidden/scroll` clipping.\n * Repositions on scroll/resize and flips vertically near the viewport edge.\n *\n * <button #trigger>…</button>\n * <div class=\"menu\" [strctOverlay]=\"trigger\" strctOverlayPlacement=\"bottom-end\">…</div>\n *\n * Note: like any fixed-positioned element, the panel is positioned relative to\n * a transformed/filtered ancestor if one exists (a CSS containing-block rule).\n * Avoid wrapping a trigger in `transform`/`filter` if you need viewport-anchored\n * overlays. (The tooltip sidesteps this by rendering into `<body>`.)\n */\n@Directive({ selector: '[strctOverlay]' })\nexport class StrctOverlay implements OnDestroy {\n private readonly el = inject(ElementRef<HTMLElement>).nativeElement as HTMLElement;\n private readonly zone = inject(NgZone);\n\n /** Anchor element for positioning. */\n readonly anchor = input.required<HTMLElement>({ alias: 'strctOverlay' });\n /** Preferred placement relative to the anchor. */\n readonly placement = input<StrctOverlayPlacement>('bottom-start', {\n alias: 'strctOverlayPlacement',\n });\n /** Match the panel width to the anchor (combobox / date / cascade fields). */\n readonly matchWidth = input(false, { alias: 'strctOverlayMatchWidth' });\n /** Gap between anchor and panel in pixels. */\n readonly gap = input(5, { alias: 'strctOverlayGap' });\n\n private readonly onScrollResize = () => this.position();\n private bound = false;\n\n constructor() {\n const s = this.el.style;\n s.position = 'fixed';\n s.top = '0';\n s.left = '0';\n s.right = 'auto';\n s.bottom = 'auto';\n s.margin = '0';\n afterNextRender(() => {\n this.position();\n this.zone.runOutsideAngular(() => {\n window.addEventListener('scroll', this.onScrollResize, true);\n window.addEventListener('resize', this.onScrollResize);\n this.bound = true;\n });\n });\n }\n\n /** Recompute and apply the fixed coordinates. */\n position(): void {\n const anchor = this.anchor();\n if (!anchor) return;\n const a = anchor.getBoundingClientRect();\n const el = this.el;\n if (this.matchWidth()) el.style.width = `${a.width}px`;\n\n const w = el.offsetWidth;\n const h = el.offsetHeight;\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const gap = this.gap();\n const p = this.placement();\n const margin = 4;\n\n let top: number;\n let left: number;\n\n if (p === 'right') {\n left = a.right + gap;\n // Flip to the left of the anchor if it would overflow the right edge.\n if (left + w > vw - margin && a.left - gap - w > margin) left = a.left - gap - w;\n top = a.top;\n } else if (p === 'left') {\n left = a.left - gap - w;\n // Flip to the right of the anchor if it would overflow the left edge.\n if (left < margin && a.right + gap + w < vw - margin) left = a.right + gap;\n top = a.top;\n } else {\n const below = p.startsWith('bottom');\n top = below ? a.bottom + gap : a.top - gap - h;\n if (below && top + h > vh - margin && a.top - gap - h > margin) {\n top = a.top - gap - h;\n } else if (!below && top < margin && a.bottom + gap + h < vh - margin) {\n top = a.bottom + gap;\n }\n left = p.endsWith('end') ? a.right - w : a.left;\n }\n\n left = Math.max(margin, Math.min(left, vw - w - margin));\n top = Math.max(margin, Math.min(top, vh - h - margin));\n\n el.style.left = `${Math.round(left)}px`;\n el.style.top = `${Math.round(top)}px`;\n }\n\n ngOnDestroy(): void {\n if (this.bound) {\n window.removeEventListener('scroll', this.onScrollResize, true);\n window.removeEventListener('resize', this.onScrollResize);\n }\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n inject,\n signal,\n} from '@angular/core';\nimport { StrctIcon } from '../icon/icon';\n\n/** Shared layout state between shell parts. */\nexport class StrctShellService {\n readonly mobileNavOpen = signal(false);\n}\n\n/**\n * Application frame: a full-viewport grid of header / body / footer rows.\n * <strct-shell>\n * <strct-header>…</strct-header>\n * <div strctShellMain>… sidebar + content …</div>\n * <strct-footer>…</strct-footer>\n * </strct-shell>\n */\n@Component({\n selector: 'strct-shell',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n providers: [StrctShellService],\n template: `\n <ng-content select=\"strct-header\" />\n <div class=\"strct-shell__main\"><ng-content /></div>\n <ng-content select=\"strct-footer\" />\n `,\n host: { class: 'strct-shell' },\n styles: [\n `\n .strct-shell {\n display: grid;\n grid-template-rows: auto 1fr auto;\n height: 100vh;\n overflow: hidden;\n background: var(--bg-2);\n }\n .strct-shell__main {\n display: flex;\n min-height: 0;\n overflow: hidden;\n }\n `,\n ],\n})\nexport class StrctShell {}\n\n/** Top application bar. Holds brand on the left and actions on the right. */\n@Component({\n selector: 'strct-header',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon],\n template: `\n <button\n type=\"button\"\n class=\"strct-header__drawer-toggle\"\n aria-label=\"Toggle navigation\"\n (click)=\"shell.mobileNavOpen.update((v) => !v)\"\n >\n <strct-icon name=\"menu\" [size]=\"18\" />\n </button>\n <ng-content />\n `,\n host: { class: 'strct-header' },\n styles: [\n `\n .strct-header {\n display: flex;\n align-items: center;\n gap: 14px;\n height: 56px;\n padding: 0 18px;\n background: var(--hdr);\n border-bottom: 1px solid var(--b2);\n color: rgba(255, 255, 255, 0.92);\n }\n .strct-header__drawer-toggle {\n display: none;\n align-items: center;\n justify-content: center;\n padding: 4px;\n border: 0;\n border-radius: 5px;\n background: transparent;\n color: rgba(255, 255, 255, 0.85);\n cursor: pointer;\n }\n .strct-header__drawer-toggle:hover {\n background: rgba(255, 255, 255, 0.12);\n color: var(--hdr-fg);\n }\n @media (max-width: 768px) {\n .strct-header__drawer-toggle {\n display: inline-flex;\n }\n }\n `,\n ],\n})\nexport class StrctHeader {\n protected readonly shell = inject(StrctShellService);\n}\n\n/** Bottom status bar. */\n@Component({\n selector: 'strct-footer',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `<ng-content />`,\n host: { class: 'strct-footer' },\n styles: [\n `\n .strct-footer {\n display: flex;\n align-items: center;\n gap: 12px;\n height: 32px;\n padding: 0 16px;\n background: var(--bg-1);\n border-top: 1px solid var(--b2);\n font-size: 12px;\n color: var(--t2);\n }\n `,\n ],\n})\nexport class StrctFooter {}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n input,\n inject,\n} from '@angular/core';\nimport { StrctShellService } from './layout';\n\n/** Scrollable left sidebar surface. Holds the icon nav and/or a tree. */\n@Component({\n selector: 'strct-vertical-nav',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n @if (shell.mobileNavOpen()) {\n <div\n class=\"strct-vnav__backdrop\"\n tabindex=\"0\"\n role=\"button\"\n aria-label=\"Close navigation\"\n (click)=\"shell.mobileNavOpen.set(false)\"\n (keydown.enter)=\"shell.mobileNavOpen.set(false)\"\n (keydown.space)=\"shell.mobileNavOpen.set(false)\"\n ></div>\n }\n <ng-content />\n `,\n host: {\n class: 'strct-vnav',\n '[class.strct-vnav--open]': 'shell.mobileNavOpen()',\n },\n styles: [\n `\n .strct-vnav {\n display: flex;\n flex-direction: column;\n width: 264px;\n flex-shrink: 0;\n background: var(--bg-1);\n border-inline-end: 1px solid var(--b2);\n overflow: hidden;\n }\n @media (max-width: 768px) {\n .strct-vnav {\n position: fixed;\n top: 0;\n inset-inline-start: 0;\n bottom: 0;\n z-index: 300;\n transform: translateX(-100%);\n transition: transform 0.2s ease;\n }\n [dir='rtl'] .strct-vnav {\n transform: translateX(100%);\n }\n .strct-vnav--open,\n [dir='rtl'] .strct-vnav--open {\n transform: translateX(0);\n }\n .strct-vnav__backdrop {\n position: fixed;\n inset: 0;\n z-index: 299;\n background: rgba(0, 0, 0, 0.5);\n animation: strct-vnav-backdrop-in 0.2s ease;\n }\n }\n @media (min-width: 769px) {\n .strct-vnav__backdrop {\n display: none;\n }\n }\n @keyframes strct-vnav-backdrop-in {\n from {\n opacity: 0;\n }\n }\n `,\n ],\n})\nexport class StrctVerticalNav {\n protected readonly shell = inject(StrctShellService);\n}\n\n/** Horizontal strip of icon tabs (e.g. section switcher at the top of a sidebar). */\n@Component({\n selector: 'strct-nav',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `<ng-content />`,\n host: { class: 'strct-nav' },\n styles: [\n `\n .strct-nav {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 8px 10px;\n border-bottom: 1px solid var(--b1);\n }\n `,\n ],\n})\nexport class StrctNav {}\n\n/** A single icon tab inside `<strct-nav>`. */\n@Component({\n selector: 'strct-nav-item',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `<ng-content />`,\n host: {\n class: 'strct-nav-item',\n role: 'button',\n tabindex: '0',\n '[class.strct-nav-item--active]': 'active()',\n '[attr.title]': 'label() || null',\n '[attr.aria-label]': 'label() || null',\n '[attr.aria-pressed]': 'active()',\n },\n styles: [\n `\n .strct-nav-item {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 34px;\n height: 34px;\n border-radius: 7px;\n cursor: pointer;\n color: var(--t2);\n transition:\n background 0.14s ease,\n color 0.14s ease;\n }\n .strct-nav-item:hover {\n background: var(--bg-3);\n color: var(--t1);\n }\n .strct-nav-item--active {\n background: var(--acc-m);\n color: var(--acc);\n }\n .strct-nav-item:focus-visible {\n outline: 2px solid var(--acc50);\n outline-offset: 1px;\n }\n `,\n ],\n})\nexport class StrctNavItem {\n /** Whether the item is active / selected. */\n readonly active = input(false);\n /** Label text. */\n readonly label = input('');\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n input,\n model,\n output,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { RouterLink, RouterLinkActive } from '@angular/router';\nimport { StrctIcon } from '../icon/icon';\n\n/** Semantic colour for a rail item's count badge. */\nexport type StrctRailStatus = 'accent' | 'success' | 'warning' | 'critical';\n\n/** A single entry in a {@link StrctRail}. */\nexport interface StrctRailItem {\n /** Stable identity, matched against the rail's `activeId`. */\n id: string;\n label: string;\n /** Icon name (see the icon set). */\n icon: string;\n /** Optional count/indicator — e.g. number of active alerts. */\n badge?: string | number;\n /** Badge colour (defaults to `accent`). When collapsed it renders as a dot. */\n badgeStatus?: StrctRailStatus;\n disabled?: boolean;\n /** `'bottom'` pins the item to the foot of the rail (e.g. Administration). */\n placement?: 'top' | 'bottom';\n /**\n * Render as a real router link (`<a routerLink>`): middle-click, ⌘/Ctrl-click\n * and \"open in new tab\" work; `(select)` still fires on plain activation.\n * When neither `routerLink` nor `href` is set the item stays a `<button>`.\n */\n routerLink?: string | unknown[];\n /** Render as a plain `<a href>` (external or non-router destinations). */\n href?: string;\n /** Small trailing status dot with no text (e.g. \"unsaved changes\"). */\n dot?: boolean;\n /** Dot tone; defaults to `accent`. */\n dotStatus?: StrctRailStatus;\n /** Muted trailing icon (e.g. \"restart required\"), before any badge / dot. */\n trailingIcon?: string;\n}\n\n/**\n * Collapsible, data-driven primary navigation rail for an application shell.\n * Each item is an icon + label + optional status badge; collapsing shrinks it to\n * an icon-only rail (badges become dots, labels become tooltips).\n *\n * <strct-rail [items]=\"navItems\" [(activeId)]=\"section\" [(collapsed)]=\"railOff\"\n * (select)=\"go($event)\" />\n */\n@Component({\n selector: 'strct-rail',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [NgTemplateOutlet, RouterLink, RouterLinkActive, StrctIcon],\n template: `\n <!-- Shared row content: icon, label, trailing indicator, badge / dot. -->\n <ng-template #rowContent let-item>\n <strct-icon class=\"strct-rail__icon\" [name]=\"item.icon\" [size]=\"18\" [strokeWidth]=\"1.6\" />\n @if (!collapsed()) {\n <span class=\"strct-rail__label\">{{ item.label }}</span>\n @if (item.trailingIcon) {\n <strct-icon\n class=\"strct-rail__trailing\"\n [name]=\"item.trailingIcon\"\n [size]=\"14\"\n [strokeWidth]=\"1.5\"\n />\n }\n }\n @if (item.badge !== undefined && item.badge !== null && item.badge !== '') {\n <span\n class=\"strct-rail__badge strct-rail__badge--{{ item.badgeStatus ?? 'accent' }}\"\n [class.strct-rail__badge--dot]=\"collapsed()\"\n >\n @if (!collapsed()) {\n {{ item.badge }}\n }\n </span>\n } @else if (item.dot) {\n <span class=\"strct-rail__dot strct-rail__dot--{{ item.dotStatus ?? 'accent' }}\"></span>\n }\n </ng-template>\n\n <!-- One rail row: a router link, a plain link, or a button (today's default). -->\n <ng-template #row let-item>\n @if (isRouted(item)) {\n <a\n class=\"strct-rail__item\"\n [routerLink]=\"item.routerLink\"\n routerLinkActive\n #rla=\"routerLinkActive\"\n [class.strct-rail__item--active]=\"isActive(item, rla.isActive)\"\n [attr.aria-current]=\"isActive(item, rla.isActive) ? 'page' : null\"\n [attr.title]=\"collapsed() ? item.label : null\"\n (click)=\"pick(item, $event)\"\n >\n <ng-container *ngTemplateOutlet=\"rowContent; context: { $implicit: item }\" />\n </a>\n } @else if (item.href && !item.disabled) {\n <a\n class=\"strct-rail__item\"\n [href]=\"item.href\"\n [class.strct-rail__item--active]=\"item.id === activeId()\"\n [attr.aria-current]=\"item.id === activeId() ? 'page' : null\"\n [attr.title]=\"collapsed() ? item.label : null\"\n (click)=\"pick(item, $event)\"\n >\n <ng-container *ngTemplateOutlet=\"rowContent; context: { $implicit: item }\" />\n </a>\n } @else {\n <button\n type=\"button\"\n class=\"strct-rail__item\"\n [class.strct-rail__item--active]=\"item.id === activeId()\"\n [disabled]=\"item.disabled\"\n [attr.aria-current]=\"item.id === activeId() ? 'page' : null\"\n [attr.title]=\"collapsed() ? item.label : null\"\n (click)=\"pick(item, $event)\"\n >\n <ng-container *ngTemplateOutlet=\"rowContent; context: { $implicit: item }\" />\n </button>\n }\n </ng-template>\n\n <nav class=\"strct-rail__nav\" [attr.aria-label]=\"ariaLabel()\">\n <div class=\"strct-rail__group strct-rail__group--top\">\n @for (item of topItems(); track item.id) {\n <ng-container *ngTemplateOutlet=\"row; context: { $implicit: item }\" />\n }\n </div>\n @if (bottomItems().length) {\n <div class=\"strct-rail__group strct-rail__group--bottom\">\n @for (item of bottomItems(); track item.id) {\n <ng-container *ngTemplateOutlet=\"row; context: { $implicit: item }\" />\n }\n </div>\n }\n </nav>\n\n @if (collapsible()) {\n <button\n type=\"button\"\n class=\"strct-rail__toggle\"\n [attr.aria-label]=\"collapsed() ? 'Expand navigation' : 'Collapse navigation'\"\n [attr.aria-expanded]=\"!collapsed()\"\n (click)=\"collapsed.set(!collapsed())\"\n >\n <strct-icon class=\"strct-rail__toggle-icon\" name=\"chevronRight\" [size]=\"16\" />\n @if (!collapsed()) {\n <span class=\"strct-rail__toggle-label\">Collapse</span>\n }\n </button>\n }\n `,\n host: {\n class: 'strct-rail',\n '[class.strct-rail--collapsed]': 'collapsed()',\n },\n styles: [\n `\n .strct-rail {\n display: flex;\n flex-direction: column;\n width: 232px;\n flex-shrink: 0;\n background: var(--bg-1);\n border-inline-end: 1px solid var(--b2);\n overflow: hidden;\n transition: width 0.16s ease;\n }\n .strct-rail--collapsed {\n width: 60px;\n }\n .strct-rail__nav {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n padding: 8px;\n }\n .strct-rail__group {\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n /* Top group scrolls; the bottom group stays pinned under a divider. */\n .strct-rail__group--top {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n }\n .strct-rail__group--bottom {\n margin-top: 8px;\n padding-top: 8px;\n border-top: 1px solid var(--b1);\n }\n .strct-rail__item {\n position: relative;\n display: flex;\n align-items: center;\n gap: 11px;\n width: 100%;\n box-sizing: border-box;\n padding: 8px 10px;\n border: 0;\n border-radius: 8px;\n background: transparent;\n color: var(--t2);\n cursor: pointer;\n font-size: 13.5px;\n font-family: var(--font);\n text-align: start;\n text-decoration: none;\n white-space: nowrap;\n transition:\n background 0.14s ease,\n color 0.14s ease;\n }\n .strct-rail--collapsed .strct-rail__item {\n justify-content: center;\n padding: 8px;\n }\n .strct-rail__item:hover:not(:disabled) {\n background: var(--bg-3);\n color: var(--t1);\n }\n .strct-rail__item--active {\n background: var(--acc-m);\n color: var(--acc);\n }\n .strct-rail__item--active .strct-rail__icon {\n color: var(--acc);\n }\n .strct-rail__item:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .strct-rail__item:focus-visible {\n outline: 2px solid var(--acc50);\n outline-offset: -2px;\n }\n .strct-rail__icon {\n flex-shrink: 0;\n }\n .strct-rail__label {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n .strct-rail__badge {\n flex-shrink: 0;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n font-weight: 600;\n line-height: 1;\n border-radius: 9px;\n font-variant-numeric: tabular-nums;\n }\n .strct-rail__badge--dot {\n position: absolute;\n top: 5px;\n inset-inline-end: 7px;\n min-width: 8px;\n width: 8px;\n height: 8px;\n padding: 0;\n border-radius: 50%;\n }\n .strct-rail__badge--accent {\n background: var(--acc-m);\n color: var(--acc);\n }\n .strct-rail__badge--success {\n background: var(--success-bg);\n color: var(--success);\n }\n .strct-rail__badge--warning {\n background: var(--warning-bg);\n color: var(--warning);\n }\n .strct-rail__badge--critical {\n background: var(--critical-bg);\n color: var(--critical);\n }\n .strct-rail__badge--dot.strct-rail__badge--accent {\n background: var(--acc);\n }\n .strct-rail__badge--dot.strct-rail__badge--success {\n background: var(--success);\n }\n .strct-rail__badge--dot.strct-rail__badge--warning {\n background: var(--warning);\n }\n .strct-rail__badge--dot.strct-rail__badge--critical {\n background: var(--critical);\n }\n /* Muted trailing indicator icon (\"restart required\" etc.). */\n .strct-rail__trailing {\n flex-shrink: 0;\n color: var(--t3);\n }\n /* Small trailing status dot (\"unsaved changes\" etc.). */\n .strct-rail__dot {\n flex-shrink: 0;\n width: 7px;\n height: 7px;\n border-radius: 50%;\n }\n .strct-rail--collapsed .strct-rail__dot {\n position: absolute;\n top: 5px;\n inset-inline-end: 7px;\n }\n .strct-rail__dot--accent {\n background: var(--acc);\n }\n .strct-rail__dot--success {\n background: var(--success);\n }\n .strct-rail__dot--warning {\n background: var(--warning);\n }\n .strct-rail__dot--critical {\n background: var(--critical);\n }\n .strct-rail__toggle {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 9px 14px;\n border: 0;\n border-top: 1px solid var(--b1);\n background: transparent;\n color: var(--t3);\n cursor: pointer;\n font-size: 12.5px;\n font-family: var(--font);\n }\n .strct-rail--collapsed .strct-rail__toggle {\n justify-content: center;\n padding: 9px;\n }\n .strct-rail__toggle:hover {\n color: var(--t1);\n background: var(--bg-3);\n }\n .strct-rail__toggle-icon {\n transition: transform 0.16s ease;\n }\n .strct-rail:not(.strct-rail--collapsed) .strct-rail__toggle-icon {\n transform: rotate(180deg);\n }\n `,\n ],\n})\nexport class StrctRail {\n /** Navigation entries. */\n readonly items = input.required<StrctRailItem[]>();\n /** Currently-active item id (two-way). */\n readonly activeId = model<string | null>(null);\n /** Collapsed (icon-only) state (two-way). */\n readonly collapsed = model(false);\n /** Show the collapse toggle at the foot of the rail. */\n readonly collapsible = input(true);\n /** Accessible label for the nav landmark. */\n readonly ariaLabel = input('Primary');\n /** Emitted when an item is chosen. */\n readonly select = output<StrctRailItem>();\n\n protected readonly topItems = computed(() =>\n this.items().filter((i) => i.placement !== 'bottom'),\n );\n protected readonly bottomItems = computed(() =>\n this.items().filter((i) => i.placement === 'bottom'),\n );\n\n /** Enabled item with a router destination → renders as `<a routerLink>`. */\n protected isRouted(item: StrctRailItem): boolean {\n return item.routerLink != null && !item.disabled;\n }\n\n /**\n * Active state of a router-link item: an explicit `activeId` is authoritative;\n * without one, the router's own active state drives it.\n */\n protected isActive(item: StrctRailItem, routerActive: boolean): boolean {\n const id = this.activeId();\n return id !== null ? item.id === id : routerActive;\n }\n\n protected pick(item: StrctRailItem, event?: MouseEvent): void {\n if (item.disabled) return;\n // A modified / non-primary click on a link is the browser's (new tab etc.) —\n // never ours: no activeId change, no (select).\n if (\n event &&\n (item.routerLink != null || item.href) &&\n (event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey)\n ) {\n return;\n }\n this.activeId.set(item.id);\n this.select.emit(item);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n input,\n} from '@angular/core';\n\n/**\n * Authentication layout. Two modes:\n * - default: a single centered column (drop a card + form inside).\n * - `split`: a two-panel card — a decorative accent aside (`[strctLoginAside]`)\n * on the left and the form (default content) on the right.\n *\n * <strct-login split>\n * <div strctLoginAside>… brand + welcome …</div>\n * <form strctLoginMain>… inputs + button …</form>\n * </strct-login>\n */\n@Component({\n selector: 'strct-login',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n @if (split()) {\n <div class=\"strct-login__card\" [style.max-width.px]=\"maxWidth()\">\n <aside class=\"strct-login__aside\">\n <div class=\"strct-login__aside-inner\">\n <ng-content select=\"[strctLoginAside]\" />\n </div>\n </aside>\n <div class=\"strct-login__main\"><ng-content select=\"[strctLoginMain]\" /></div>\n </div>\n } @else {\n <div class=\"strct-login__inner\" [style.max-width.px]=\"maxWidth()\"><ng-content /></div>\n }\n `,\n host: { class: 'strct-login' },\n styles: [\n `\n .strct-login {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n min-height: 100%;\n padding: 32px;\n }\n .strct-login__inner {\n width: 100%;\n }\n\n /* Split card */\n .strct-login__card {\n display: grid;\n grid-template-columns: 1.05fr 1fr;\n width: 100%;\n overflow: hidden;\n }\n .strct-login__main {\n padding: 40px 38px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n }\n\n /* Aside — stripped of background images/colors and borders. */\n .strct-login__aside {\n position: relative;\n overflow: hidden;\n min-height: 420px;\n color: var(--t1);\n border-inline-end: 1px solid var(--b2);\n }\n .strct-login__aside::before,\n .strct-login__aside::after {\n display: none;\n }\n .strct-login__aside-inner {\n position: relative;\n z-index: 1;\n height: 100%;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n padding: 34px 36px;\n }\n\n @media (max-width: 720px) {\n .strct-login__card {\n grid-template-columns: 1fr;\n }\n .strct-login__aside {\n min-height: 220px;\n }\n .strct-login__main {\n padding: 30px 26px;\n }\n }\n `,\n ],\n})\nexport class StrctLogin {\n /** Maximum width in pixels. */\n readonly maxWidth = input(880);\n /** Enable two-panel split layout. */\n readonly split = input(false, { transform: booleanAttribute });\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n input,\n} from '@angular/core';\n\n/** Button visual variants. */\nexport type StrctButtonVariant = 'primary' | 'critical' | 'outline' | 'flat' | 'neutral';\n/** Button size variants. */\nexport type StrctButtonSize = 'md' | 'sm' | 'mini';\n\n/**\n * Styles a native `<button>` / `<a>` so it stays fully accessible and form-aware.\n *\n * Buttons are restrained by default: outlined / ghost surfaces with color used\n * only as a subtle border + text accent. Add `solid` for a rare filled call to\n * action.\n * <button strct-button variant=\"primary\">Save</button>\n * <button strct-button variant=\"primary\" solid>Deploy</button>\n * <a strct-button variant=\"flat\" size=\"sm\" href=\"...\">Cancel</a>\n */\n@Component({\n selector: 'button[strct-button], a[strct-button]',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `<ng-content />`,\n host: {\n class: 'strct-btn',\n '[class.strct-btn--primary]': \"variant() === 'primary'\",\n '[class.strct-btn--critical]': \"variant() === 'critical'\",\n '[class.strct-btn--outline]': \"variant() === 'outline'\",\n '[class.strct-btn--flat]': \"variant() === 'flat'\",\n '[class.strct-btn--solid]': 'solid()',\n '[class.strct-btn--sm]': \"size() === 'sm'\",\n '[class.strct-btn--mini]': \"size() === 'mini'\",\n '[class.strct-btn--block]': 'block()',\n '[class.strct-btn--icon]': 'iconOnly()',\n },\n styles: [\n `\n /* Base: neutral, outlined, no fill. */\n .strct-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--space-1);\n font-family: var(--font);\n font-size: 13px;\n font-weight: 500;\n line-height: 1;\n padding: var(--space-2) var(--space-4);\n border-radius: var(--radius-md);\n cursor: pointer;\n user-select: none;\n color: var(--t1);\n background: transparent;\n border: 1px solid var(--b3);\n transition:\n background 0.14s ease,\n border-color 0.14s ease,\n color 0.14s ease,\n opacity 0.14s ease;\n text-decoration: none;\n white-space: nowrap;\n }\n .strct-btn:hover {\n background: var(--bg-3);\n text-decoration: none;\n }\n .strct-btn:active {\n background: var(--bg-a);\n }\n .strct-btn:disabled,\n .strct-btn[aria-disabled='true'] {\n opacity: 0.45;\n cursor: not-allowed;\n }\n\n /* Emphasis via accent border + text only — not a colored fill. */\n .strct-btn--primary {\n border-color: var(--acc50);\n color: var(--acc);\n }\n .strct-btn--primary:hover {\n background: var(--acc-m);\n border-color: var(--acc);\n }\n\n .strct-btn--critical {\n border-color: var(--critical);\n color: var(--critical);\n }\n .strct-btn--critical:hover {\n background: var(--critical-bg);\n }\n\n /* Neutral outline (explicit). */\n .strct-btn--outline {\n border-color: var(--b3);\n color: var(--t1);\n }\n .strct-btn--outline:hover {\n background: var(--bg-3);\n }\n\n /* Borderless text button. */\n .strct-btn--flat {\n border-color: transparent;\n color: var(--t2);\n }\n .strct-btn--flat:hover {\n background: var(--bg-3);\n color: var(--t1);\n }\n\n /* Opt-in filled call to action. */\n .strct-btn--solid {\n background: var(--bg-3);\n border-color: transparent;\n color: var(--t1);\n }\n .strct-btn--solid:hover {\n background: var(--bg-h);\n }\n .strct-btn--solid.strct-btn--primary {\n background: var(--acc);\n color: var(--inv);\n }\n .strct-btn--solid.strct-btn--primary:hover {\n background: var(--acc);\n filter: brightness(1.08);\n }\n .strct-btn--solid.strct-btn--critical {\n background: var(--critical);\n color: var(--inv);\n }\n .strct-btn--solid.strct-btn--critical:hover {\n background: var(--critical);\n filter: brightness(1.08);\n }\n\n .strct-btn--sm {\n padding: var(--space-1) var(--space-3);\n font-size: 12px;\n border-radius: var(--radius-sm);\n }\n .strct-btn--mini {\n padding: 2px var(--space-2);\n font-size: 12px;\n border-radius: var(--radius-sm);\n }\n .strct-btn--block {\n display: flex;\n width: 100%;\n }\n\n /* Square icon-only button. */\n .strct-btn--icon {\n padding: var(--space-2);\n }\n .strct-btn--icon.strct-btn--sm {\n padding: var(--space-1);\n }\n .strct-btn--icon.strct-btn--mini {\n padding: 3px;\n }\n `,\n ],\n})\nexport class StrctButton {\n /** Visual variant. */\n readonly variant = input<StrctButtonVariant>('neutral');\n /** Size variant. */\n readonly size = input<StrctButtonSize>('md');\n /** Opt in to a filled surface (use sparingly, for the primary action). */\n readonly solid = input(false, { transform: booleanAttribute });\n /** Expand to full width. */\n readonly block = input(false, { transform: booleanAttribute });\n /** Square padding for a single-icon button. */\n readonly iconOnly = input(false, { transform: booleanAttribute });\n}\n\n/** Segments adjacent buttons into a single joined control. */\n@Component({\n selector: 'strct-button-group',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `<ng-content />`,\n host: { class: 'strct-btn-group', role: 'group' },\n styles: [\n `\n .strct-btn-group {\n display: inline-flex;\n }\n .strct-btn-group > .strct-btn {\n border-radius: 0;\n }\n .strct-btn-group > .strct-btn:not(:first-child) {\n margin-inline-start: -1px;\n }\n .strct-btn-group > .strct-btn:first-child {\n border-top-left-radius: var(--radius-md);\n border-bottom-left-radius: var(--radius-md);\n }\n .strct-btn-group > .strct-btn:last-child {\n border-top-right-radius: var(--radius-md);\n border-bottom-right-radius: var(--radius-md);\n }\n .strct-btn-group > .strct-btn:hover,\n .strct-btn-group > .strct-btn:focus-visible {\n position: relative;\n z-index: 1;\n }\n `,\n ],\n})\nexport class StrctButtonGroup {}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n input,\n} from '@angular/core';\n\n/** Badge color variants. */\nexport type StrctBadgeStatus = 'neutral' | 'accent' | 'success' | 'warning' | 'critical';\n\n/** Small inline status pill: `<strct-badge status=\"success\">Active</strct-badge>`. */\n@Component({\n selector: 'strct-badge',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `<ng-content />`,\n host: {\n class: 'strct-badge',\n '[class.strct-badge--accent]': \"status() === 'accent'\",\n '[class.strct-badge--success]': \"status() === 'success'\",\n '[class.strct-badge--warning]': \"status() === 'warning'\",\n // Deprecated alias of --warning (original typo), kept so consumer CSS keeps matching.\n '[class.strct-badge--warninging]': \"status() === 'warning'\",\n '[class.strct-badge--critical]': \"status() === 'critical'\",\n '[class.strct-badge--solid]': 'solid()',\n },\n styles: [\n `\n /* Restrained: outlined on a neutral surface, color carried by text + a thin border. */\n .strct-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n font-weight: 600;\n line-height: 1;\n letter-spacing: 0.2px;\n padding: 3px 7px 3px 9px;\n border-radius: var(--radius-sm);\n white-space: nowrap;\n color: var(--t2);\n background: transparent;\n border: 1px solid var(--b3);\n /* Thicker left rail gives badges a distinct \"tag\" identity vs. buttons. */\n border-inline-start-width: 3px;\n }\n .strct-badge--accent {\n color: var(--acc);\n border-color: var(--acc30);\n }\n .strct-badge--success {\n color: var(--success);\n border-color: var(--success);\n }\n .strct-badge--warning {\n color: var(--warning);\n border-color: var(--warning);\n }\n .strct-badge--critical {\n color: var(--critical);\n border-color: var(--critical);\n }\n\n /* Opt-in filled badge — uniform edges (no left rail). */\n .strct-badge--solid {\n color: var(--t1);\n background: var(--bg-a);\n border-color: transparent;\n border-inline-start-width: 1px;\n padding-inline-start: 7px;\n }\n .strct-badge--solid.strct-badge--accent {\n background: var(--acc);\n color: var(--inv);\n }\n .strct-badge--solid.strct-badge--success {\n background: var(--success);\n color: var(--inv);\n }\n .strct-badge--solid.strct-badge--warning {\n background: var(--warning);\n color: var(--inv);\n }\n .strct-badge--solid.strct-badge--critical {\n background: var(--critical);\n color: var(--inv);\n }\n `,\n ],\n})\nexport class StrctBadge {\n /** Visual status color. */\n readonly status = input<StrctBadgeStatus>('neutral');\n /** Opt-in filled style instead of the default outlined style. */\n readonly solid = input(false, { transform: booleanAttribute });\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n input,\n output,\n} from '@angular/core';\nimport { StrctIcon } from '../icon/icon';\n\n/** Tag color variants. */\nexport type StrctTagStatus = 'neutral' | 'accent' | 'success' | 'warning' | 'critical';\n\n/**\n * Compact, optionally removable chip.\n * <strct-tag status=\"accent\" removable (removed)=\"drop()\">Frontend</strct-tag>\n */\n@Component({\n selector: 'strct-tag',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon],\n template: `\n <span class=\"strct-tag__text\"><ng-content /></span>\n @if (removable()) {\n <button type=\"button\" class=\"strct-tag__remove\" aria-label=\"Remove\" (click)=\"removed.emit()\">\n <strct-icon name=\"close\" [size]=\"11\" [strokeWidth]=\"1.6\" />\n </button>\n }\n `,\n host: {\n class: 'strct-tag',\n '[class.strct-tag--accent]': \"status() === 'accent'\",\n '[class.strct-tag--success]': \"status() === 'success'\",\n '[class.strct-tag--warning]': \"status() === 'warning'\",\n '[class.strct-tag--critical]': \"status() === 'critical'\",\n },\n styles: [\n `\n .strct-tag {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 3px 4px 3px 9px;\n border-radius: 4px;\n font-size: 12px;\n font-weight: 500;\n color: var(--t1);\n background: var(--bg-3);\n border: 1px solid var(--b2);\n }\n .strct-tag:not(:has(.strct-tag__remove)) {\n padding-inline-end: 9px;\n }\n .strct-tag--accent {\n color: var(--acc);\n border-color: var(--acc30);\n background: var(--acc-s);\n }\n .strct-tag--success {\n color: var(--success);\n border-color: var(--success);\n background: transparent;\n }\n .strct-tag--warning {\n color: var(--warning);\n border-color: var(--warning);\n background: transparent;\n }\n .strct-tag--critical {\n color: var(--critical);\n border-color: var(--critical);\n background: transparent;\n }\n .strct-tag__remove {\n display: inline-flex;\n padding: 2px;\n border: 0;\n border-radius: 3px;\n background: transparent;\n color: currentColor;\n opacity: 0.65;\n cursor: pointer;\n }\n .strct-tag__remove:hover {\n opacity: 1;\n background: var(--dn);\n }\n `,\n ],\n})\nexport class StrctTag {\n /** Visual status color. */\n readonly status = input<StrctTagStatus>('neutral');\n /** Show a remove button. */\n readonly removable = input(false, { transform: booleanAttribute });\n /** Emitted when the user clicks the remove button. */\n readonly removed = output<void>();\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n input,\n} from '@angular/core';\n\n/** Avatar size variants. */\nexport type StrctAvatarSize = 'sm' | 'md' | 'lg';\n/** Avatar presence status variants. */\nexport type StrctAvatarStatus = 'none' | 'online' | 'busy' | 'offline';\n\n/**\n * Circular avatar: an image when `src` is set, otherwise initials from `name`.\n * <strct-avatar name=\"Ada Lovelace\" status=\"online\" />\n */\n@Component({\n selector: 'strct-avatar',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n @if (src()) {\n <img class=\"strct-av__img\" [src]=\"src()\" [alt]=\"name()\" />\n } @else {\n <span class=\"strct-av__initials\">{{ initials() }}</span>\n }\n @if (status() !== 'none') {\n <span class=\"strct-av__status\"></span>\n }\n `,\n host: {\n class: 'strct-av',\n '[class.strct-av--sm]': \"size() === 'sm'\",\n '[class.strct-av--lg]': \"size() === 'lg'\",\n '[class.strct-av--online]': \"status() === 'online'\",\n '[class.strct-av--busy]': \"status() === 'busy'\",\n '[class.strct-av--offline]': \"status() === 'offline'\",\n '[attr.title]': 'name() || null',\n },\n styles: [\n `\n .strct-av {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border-radius: 50%;\n flex-shrink: 0;\n background: var(--bg-3);\n color: var(--t1);\n overflow: visible;\n font-size: 13px;\n font-weight: 600;\n user-select: none;\n border: 1px solid var(--b2);\n }\n .strct-av--sm {\n width: 26px;\n height: 26px;\n font-size: 12px;\n }\n .strct-av--lg {\n width: 48px;\n height: 48px;\n font-size: 17px;\n }\n .strct-av__img {\n width: 100%;\n height: 100%;\n border-radius: 50%;\n object-fit: cover;\n }\n .strct-av__initials {\n line-height: 1;\n }\n .strct-av__status {\n position: absolute;\n right: -1px;\n bottom: -1px;\n width: 30%;\n height: 30%;\n min-width: 8px;\n min-height: 8px;\n border-radius: 50%;\n border: 2px solid var(--bg-1);\n background: var(--t3);\n }\n .strct-av--online .strct-av__status {\n background: var(--success);\n }\n .strct-av--busy .strct-av__status {\n background: var(--critical);\n }\n .strct-av--offline .strct-av__status {\n background: var(--t3);\n }\n `,\n ],\n})\nexport class StrctAvatar {\n /** Image URL. */\n readonly src = input('');\n /** Display name (used for initials when src is absent). */\n readonly name = input('');\n /** Size variant. */\n readonly size = input<StrctAvatarSize>('md');\n /** Visual status color. */\n readonly status = input<StrctAvatarStatus>('none');\n\n protected readonly initials = computed(() => {\n const parts = this.name().trim().split(/\\s+/).filter(Boolean);\n if (!parts.length) return '?';\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n });\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n input,\n} from '@angular/core';\nimport { StrctThresholds } from '../status';\n\n/** Progress bar color variants. */\nexport type StrctProgressStatus = 'accent' | 'success' | 'warning' | 'critical';\n\n/** Horizontal value/usage bar. `<strct-progress [value]=\"72\" status=\"warning\" />`. */\n@Component({\n selector: 'strct-progress',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n <div\n class=\"strct-progress__track\"\n role=\"progressbar\"\n [attr.aria-label]=\"label() || 'Progress'\"\n [attr.aria-valuenow]=\"clamped()\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n >\n <div class=\"strct-progress__fill\" [style.width.%]=\"clamped()\"></div>\n </div>\n `,\n host: {\n class: 'strct-progress',\n '[class.strct-progress--success]': \"resolvedStatus() === 'success'\",\n '[class.strct-progress--warning]': \"resolvedStatus() === 'warning'\",\n '[class.strct-progress--critical]': \"resolvedStatus() === 'critical'\",\n },\n styles: [\n `\n .strct-progress {\n display: block;\n }\n .strct-progress__track {\n height: 6px;\n border-radius: 4px;\n background: var(--bg-3);\n overflow: hidden;\n }\n .strct-progress__fill {\n height: 100%;\n border-radius: 4px;\n background: var(--acc);\n transition: width 0.3s ease;\n }\n .strct-progress--success .strct-progress__fill {\n background: var(--success);\n }\n .strct-progress--warning .strct-progress__fill {\n background: var(--warning);\n }\n .strct-progress--critical .strct-progress__fill {\n background: var(--critical);\n }\n `,\n ],\n})\nexport class StrctProgress {\n /** Current value. */\n readonly value = input(0);\n /** Accessible name of the bar (e.g. \"CPU usage\"). Falls back to \"Progress\". */\n readonly label = input('');\n /** Visual status color. */\n readonly status = input<StrctProgressStatus>('accent');\n /**\n * Optional value-driven thresholds. When set, the component picks its own\n * status from the value instead of the caller computing it: `value >= critical`\n * → critical, `>= warning` → warning, else the healthy base. The healthy base is\n * `status` when it has been set to a semantic tone, or `'success'` when `status`\n * is left at its default `'accent'`.\n */\n readonly thresholds = input<StrctThresholds | null>(null);\n\n protected readonly clamped = computed(() => Math.max(0, Math.min(100, this.value())));\n\n /** Status after applying thresholds (falls back to `status` when none set). */\n protected readonly resolvedStatus = computed<StrctProgressStatus>(() => {\n const t = this.thresholds();\n if (!t) return this.status();\n const v = this.value();\n if (t.critical != null && v >= t.critical) return 'critical';\n if (t.warning != null && v >= t.warning) return 'warning';\n const base = this.status();\n return base === 'accent' ? 'success' : base;\n });\n}\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation, input } from '@angular/core';\n\n/** Spinner size variants. */\nexport type StrctSpinnerSize = 'sm' | 'md' | 'lg';\n\n/** Indeterminate loading ring. `<strct-spinner size=\"sm\" />`. */\n@Component({\n selector: 'strct-spinner',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: '',\n host: {\n class: 'strct-spinner',\n role: 'progressbar',\n '[attr.aria-label]': 'label()',\n '[class.strct-spinner--sm]': \"size() === 'sm'\",\n '[class.strct-spinner--lg]': \"size() === 'lg'\",\n },\n styles: [\n `\n .strct-spinner {\n display: inline-block;\n width: 22px;\n height: 22px;\n border: 2.5px solid var(--b3);\n border-top-color: var(--acc);\n border-radius: 50%;\n animation: strct-spin 0.7s linear infinite;\n }\n .strct-spinner--sm {\n width: 14px;\n height: 14px;\n border-width: 2px;\n }\n .strct-spinner--lg {\n width: 34px;\n height: 34px;\n border-width: 3px;\n }\n @keyframes strct-spin {\n to {\n transform: rotate(360deg);\n }\n }\n @media (prefers-reduced-motion: reduce) {\n .strct-spinner {\n animation-duration: 1.6s;\n }\n }\n `,\n ],\n})\nexport class StrctSpinner {\n /** Size variant. */\n readonly size = input<StrctSpinnerSize>('md');\n /** Accessible label (localizable). */\n readonly label = input('Loading');\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n input,\n} from '@angular/core';\n\n/**\n * Shimmering loading placeholder.\n * <strct-skeleton width=\"60%\" height=\"14px\" />\n * <strct-skeleton circle width=\"40px\" height=\"40px\" />\n */\n@Component({\n selector: 'strct-skeleton',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: '',\n host: {\n class: 'strct-skel',\n role: 'presentation',\n 'aria-hidden': 'true',\n '[class.strct-skel--circle]': 'circle()',\n '[style.width]': 'width()',\n '[style.height]': 'height()',\n },\n styles: [\n `\n .strct-skel {\n display: block;\n border-radius: 5px;\n background: linear-gradient(90deg, var(--bg-3) 25%, var(--bg-h) 37%, var(--bg-3) 63%);\n background-size: 400% 100%;\n animation: strct-skel-shimmer 1.4s ease infinite;\n }\n .strct-skel--circle {\n border-radius: 50%;\n }\n @keyframes strct-skel-shimmer {\n 0% {\n background-position: 100% 50%;\n }\n 100% {\n background-position: 0 50%;\n }\n }\n @media (prefers-reduced-motion: reduce) {\n .strct-skel {\n animation: none;\n }\n }\n `,\n ],\n})\nexport class StrctSkeleton {\n /** Width (CSS length). */\n readonly width = input('100%');\n /** Height in pixels. */\n readonly height = input('14px');\n /** Circle. */\n readonly circle = input(false, { transform: booleanAttribute });\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n ElementRef,\n HostListener,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { StrctIcon } from '../icon/icon';\n\n/** Direction the speed-dial actions expand. */\nexport type StrctSpeedDialDirection = 'up' | 'down' | 'left' | 'right';\n\n/**\n * Floating action button that fans out to reveal actions. Project icon buttons\n * (optionally with `strctTooltip`) as the actions.\n * <strct-speed-dial icon=\"ellipsis\" direction=\"up\">\n * <button strct-button iconOnly strctTooltip=\"Snapshot\"><strct-icon name=\"snapshot\" /></button>\n * <button strct-button iconOnly strctTooltip=\"Restart\"><strct-icon name=\"sync\" /></button>\n * </strct-speed-dial>\n */\n@Component({\n selector: 'strct-speed-dial',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon],\n template: `\n <div class=\"strct-sd\" [class]=\"'strct-sd--' + direction()\">\n @if (open()) {\n <div class=\"strct-sd__actions\"><ng-content /></div>\n }\n <button\n type=\"button\"\n class=\"strct-sd__fab\"\n [class.strct-sd__fab--open]=\"open()\"\n [attr.aria-expanded]=\"open()\"\n aria-haspopup=\"menu\"\n (click)=\"toggle()\"\n >\n <strct-icon [name]=\"icon()\" [size]=\"18\" [strokeWidth]=\"1.5\" />\n </button>\n </div>\n `,\n host: { class: 'strct-sd-host' },\n styles: [\n `\n .strct-sd-host {\n display: inline-block;\n }\n .strct-sd {\n position: relative;\n display: inline-flex;\n }\n .strct-sd__fab {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 44px;\n height: 44px;\n border-radius: 50%;\n cursor: pointer;\n color: var(--inv);\n background: var(--acc);\n border: 0;\n box-shadow: var(--shh);\n transition:\n filter 0.14s ease,\n transform 0.16s ease;\n }\n .strct-sd__fab:hover {\n filter: brightness(1.08);\n }\n .strct-sd__fab--open {\n transform: rotate(45deg);\n }\n .strct-sd__actions {\n position: absolute;\n display: flex;\n gap: 10px;\n z-index: 10;\n animation: strct-sd-in 0.14s ease;\n }\n /* The projected icon buttons get a round, raised look. */\n .strct-sd__actions .strct-btn {\n border-radius: 50%;\n box-shadow: var(--sh);\n background: var(--bg-1);\n }\n .strct-sd--up .strct-sd__actions {\n flex-direction: column;\n bottom: calc(100% + 12px);\n left: 50%;\n transform: translateX(-50%);\n }\n .strct-sd--down .strct-sd__actions {\n flex-direction: column;\n top: calc(100% + 12px);\n left: 50%;\n transform: translateX(-50%);\n }\n .strct-sd--left .strct-sd__actions {\n flex-direction: row;\n right: calc(100% + 12px);\n top: 50%;\n transform: translateY(-50%);\n }\n .strct-sd--right .strct-sd__actions {\n flex-direction: row;\n left: calc(100% + 12px);\n top: 50%;\n transform: translateY(-50%);\n }\n @keyframes strct-sd-in {\n from {\n opacity: 0;\n }\n }\n `,\n ],\n})\nexport class StrctSpeedDial {\n private readonly host = inject(ElementRef<HTMLElement>);\n /** Icon name. */\n readonly icon = input('ellipsis');\n /** Direction the actions fan out. */\n readonly direction = input<StrctSpeedDialDirection>('up');\n readonly open = signal(false);\n\n toggle(): void {\n this.open.update((v) => !v);\n }\n\n @HostListener('document:click', ['$event'])\n protected onDocClick(event: MouseEvent): void {\n if (this.open() && !this.host.nativeElement.contains(event.target as Node)) {\n this.open.set(false);\n }\n }\n\n @HostListener('document:keydown.escape')\n protected onEscape(): void {\n this.open.set(false);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n inject,\n input,\n model,\n} from '@angular/core';\nimport { StrctIcon } from '../icon/icon';\nimport { StrctStatus } from '../status';\n\n/**\n * Surface container. Compose with the header / block / footer pieces:\n *\n * <strct-card status=\"warning\" collapsible [(collapsed)]=\"hidden\">\n * <strct-card-header icon=\"host\">Host hv-02</strct-card-header>\n * <strct-card-block>…</strct-card-block>\n * <strct-card-footer><button strct-button>OK</button></strct-card-footer>\n * </strct-card>\n *\n * Rich options (all opt-in; defaults preserve the plain card):\n * - `status` — tone rail on the leading edge (same language as alert / hero).\n * - `interactive` — hover lift + accent border for clickable cards.\n * - `selected` — accent ring for picker layouts.\n * - `dense` — tighter paddings for dashboards.\n * - `loading` — indeterminate top bar + `aria-busy` (reduced-motion safe).\n * - `collapsible` + two-way `collapsed` — the header gains a chevron toggle;\n * block and footer hide while collapsed.\n */\n@Component({\n selector: 'strct-card',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `<ng-content />`,\n host: {\n class: 'strct-card',\n '[class.strct-card--accent]': \"status() === 'accent'\",\n '[class.strct-card--success]': \"status() === 'success'\",\n '[class.strct-card--warning]': \"status() === 'warning'\",\n '[class.strct-card--critical]': \"status() === 'critical'\",\n '[class.strct-card--interactive]': 'interactive()',\n '[class.strct-card--selected]': 'selected()',\n '[class.strct-card--dense]': 'dense()',\n '[class.strct-card--loading]': 'loading()',\n '[class.strct-card--collapsed]': 'collapsible() && collapsed()',\n '[attr.aria-busy]': 'loading() ? \"true\" : null',\n },\n styles: [\n `\n .strct-card {\n position: relative;\n display: block;\n background: var(--bg-1);\n border: 1px solid var(--b2);\n border-radius: var(--radius-lg);\n box-shadow: var(--sh);\n overflow: hidden;\n }\n\n /* Tone rail on the leading edge — same language as alert / hero. */\n .strct-card--accent {\n border-inline-start: 3px solid var(--acc);\n }\n .strct-card--success {\n border-inline-start: 3px solid var(--success);\n }\n .strct-card--warning {\n border-inline-start: 3px solid var(--warning);\n }\n .strct-card--critical {\n border-inline-start: 3px solid var(--critical);\n }\n\n /* Clickable affordance (style-only — wrap in <a>/<button> or handle click). */\n .strct-card--interactive {\n cursor: pointer;\n transition:\n border-color 0.14s ease,\n transform 0.14s ease,\n box-shadow 0.14s ease;\n }\n .strct-card--interactive:hover {\n border-color: var(--acc50);\n transform: translateY(-1px);\n box-shadow: var(--shh);\n }\n .strct-card--interactive:focus-within {\n border-color: var(--acc);\n }\n\n .strct-card--selected {\n border-color: var(--acc);\n box-shadow:\n 0 0 0 1px var(--acc),\n var(--sh);\n }\n\n /* Density: the pieces read these vars (fallbacks keep standalone use intact). */\n .strct-card--dense {\n --strct-card-px: var(--space-3);\n --strct-card-py: var(--space-2);\n --strct-card-pb: var(--space-3);\n }\n\n /* Loading: indeterminate accent bar along the top. */\n .strct-card--loading::before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n height: 2px;\n width: 40%;\n background: var(--acc);\n animation: strct-card-load 1.1s ease-in-out infinite;\n z-index: 1;\n }\n .strct-card--loading > strct-card-block,\n .strct-card--loading > strct-card-footer {\n opacity: 0.55;\n pointer-events: none;\n }\n @keyframes strct-card-load {\n 0% {\n transform: translateX(-100%);\n }\n 100% {\n transform: translateX(280%);\n }\n }\n\n /* Collapsed: only the header stays. */\n .strct-card--collapsed > strct-card-block,\n .strct-card--collapsed > strct-card-footer {\n display: none;\n }\n .strct-card--collapsed > strct-card-header {\n border-bottom: 0;\n }\n\n @media (prefers-reduced-motion: reduce) {\n .strct-card--interactive {\n transition: none;\n }\n .strct-card--interactive:hover {\n transform: none;\n }\n .strct-card--loading::before {\n animation: none;\n width: 100%;\n opacity: 0.4;\n }\n }\n `,\n ],\n})\nexport class StrctCard {\n /** Tone rail on the leading edge. */\n readonly status = input<StrctStatus>('neutral');\n /** Hover lift + accent border for clickable cards (style-only affordance). */\n readonly interactive = input(false, { transform: booleanAttribute });\n /** Accent ring — for picker / multi-select card layouts. */\n readonly selected = input(false, { transform: booleanAttribute });\n /** Tighter paddings for dense dashboards. */\n readonly dense = input(false, { transform: booleanAttribute });\n /** Indeterminate top bar + aria-busy; body/footer dim and ignore input. */\n readonly loading = input(false, { transform: booleanAttribute });\n /** Allow collapsing to just the header (a chevron appears in the header). */\n readonly collapsible = input(false, { transform: booleanAttribute });\n /** Collapsed state (two-way; only meaningful with `collapsible`). */\n readonly collapsed = model(false);\n\n toggle(): void {\n this.collapsed.update((v) => !v);\n }\n}\n\n/** Header section of a {@link StrctCard}. */\n@Component({\n selector: 'strct-card-header',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon],\n template: `\n @if (icon()) {\n <strct-icon class=\"strct-card__hicon\" [name]=\"icon()\" [size]=\"16\" [strokeWidth]=\"1.4\" />\n }\n <ng-content />\n @if (card?.collapsible()) {\n <button\n type=\"button\"\n class=\"strct-card__collapse\"\n [attr.aria-expanded]=\"!card!.collapsed()\"\n [attr.aria-label]=\"card!.collapsed() ? expandLabel() : collapseLabel()\"\n (click)=\"card!.toggle()\"\n >\n <strct-icon\n name=\"chevronDown\"\n [size]=\"14\"\n [strokeWidth]=\"1.6\"\n [class.strct-card__chev--collapsed]=\"card!.collapsed()\"\n />\n </button>\n }\n `,\n host: { class: 'strct-card__header' },\n styles: [\n `\n .strct-card__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-2);\n padding: var(--strct-card-py, var(--space-3)) var(--strct-card-px, var(--space-4));\n border-bottom: 1px solid var(--b1);\n font-size: 13px;\n font-weight: 600;\n color: var(--t1);\n }\n .strct-card__hicon {\n color: var(--t2);\n flex-shrink: 0;\n }\n .strct-card__collapse {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n margin: -4px;\n margin-inline-start: 0;\n padding: 0;\n border: 0;\n border-radius: var(--radius-sm);\n background: transparent;\n color: var(--t3);\n cursor: pointer;\n flex-shrink: 0;\n }\n .strct-card__collapse:hover {\n color: var(--t1);\n background: var(--bg-3);\n }\n .strct-card__collapse:focus-visible {\n outline: none;\n box-shadow: 0 0 0 2px var(--acc50);\n }\n .strct-card__collapse strct-icon {\n transition: transform 0.15s ease;\n }\n .strct-card__chev--collapsed {\n transform: rotate(-90deg);\n }\n @media (prefers-reduced-motion: reduce) {\n .strct-card__collapse strct-icon {\n transition: none;\n }\n }\n `,\n ],\n})\nexport class StrctCardHeader {\n /** Optional leading icon (StrctIcon set). */\n readonly icon = input('');\n /** Accessible labels for the collapse toggle (localizable). */\n readonly collapseLabel = input('Collapse');\n readonly expandLabel = input('Expand');\n\n protected readonly card = inject(StrctCard, { optional: true });\n}\n\n/** Body section of a {@link StrctCard}. */\n@Component({\n selector: 'strct-card-block',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `<ng-content />`,\n host: { class: 'strct-card__block' },\n styles: [\n `\n .strct-card__block {\n display: block;\n padding: var(--strct-card-pb, var(--space-4)) var(--strct-card-px, var(--space-4));\n color: var(--t2);\n font-size: 13px;\n }\n `,\n ],\n})\nexport class StrctCardBlock {}\n\n/** Footer section of a {@link StrctCard}. */\n@Component({\n selector: 'strct-card-footer',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `<ng-content />`,\n host: { class: 'strct-card__footer' },\n styles: [\n `\n .strct-card__footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--space-2);\n padding: var(--strct-card-py, var(--space-3)) var(--strct-card-px, var(--space-4));\n border-top: 1px solid var(--b1);\n background: var(--bg-2);\n }\n `,\n ],\n})\nexport class StrctCardFooter {}\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation, input, model } from '@angular/core';\nimport { StrctIcon } from '../icon/icon';\n\n/** Vertical container for `<strct-accordion-panel>` items. */\n@Component({\n selector: 'strct-accordion',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `<ng-content />`,\n host: { class: 'strct-accordion' },\n styles: [\n `\n .strct-accordion {\n display: flex;\n flex-direction: column;\n border: 1px solid var(--b2);\n border-radius: 8px;\n overflow: hidden;\n background: var(--bg-1);\n }\n `,\n ],\n})\nexport class StrctAccordion {}\n\n/** Collapsible panel with a header. `expanded` is two-way bindable. */\n@Component({\n selector: 'strct-accordion-panel',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon],\n template: `\n <button\n type=\"button\"\n class=\"strct-acc__head\"\n [attr.aria-expanded]=\"expanded()\"\n (click)=\"toggle()\"\n >\n <span class=\"strct-acc__chevron\" [class.strct-acc__chevron--open]=\"expanded()\">\n <strct-icon name=\"chevronRight\" [size]=\"13\" [strokeWidth]=\"1.7\" />\n </span>\n <span class=\"strct-acc__title\">{{ heading() }}</span>\n </button>\n @if (expanded()) {\n <div class=\"strct-acc__body\"><ng-content /></div>\n }\n `,\n host: { class: 'strct-acc' },\n styles: [\n `\n .strct-acc {\n display: block;\n }\n /* Hairline divider joins consecutive panels into one stacked surface. */\n .strct-acc + .strct-acc {\n border-top: 1px solid var(--b2);\n }\n .strct-acc__head {\n display: flex;\n align-items: center;\n gap: 9px;\n width: 100%;\n padding: 11px 14px;\n border: 0;\n background: transparent;\n cursor: pointer;\n font-family: var(--font);\n font-size: 13px;\n font-weight: 500;\n color: var(--t1);\n text-align: start;\n }\n .strct-acc__head:hover {\n background: var(--bg-3);\n }\n .strct-acc__chevron {\n display: inline-flex;\n color: var(--t3);\n transition: transform 0.16s ease;\n }\n .strct-acc__chevron--open {\n transform: rotate(90deg);\n color: var(--acc);\n }\n .strct-acc__title {\n flex: 1;\n }\n .strct-acc__body {\n padding: 4px 14px 14px 32px;\n color: var(--t2);\n font-size: 13px;\n border-top: 1px solid var(--b1);\n }\n `,\n ],\n})\nexport class StrctAccordionPanel {\n /** Panel heading. */\n readonly heading = input.required<string>();\n /** Whether the panel is open (two-way). */\n readonly expanded = model(false);\n\n toggle(): void {\n this.expanded.update((v) => !v);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n contentChildren,\n effect,\n input,\n model,\n signal,\n} from '@angular/core';\n\n/** A single tab. Place inside `<strct-tabs>`; `label` names its button. */\n@Component({\n selector: 'strct-tab',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `@if (active()) {\n <ng-content />\n }`,\n host: { class: 'strct-tab', role: 'tabpanel', '[hidden]': '!active()' },\n})\nexport class StrctTab {\n /** Label text. */\n readonly label = input.required<string>();\n /** Static disable flag. */\n readonly disabled = input(false, { transform: booleanAttribute });\n private readonly _active = signal(false);\n readonly active = this._active.asReadonly();\n\n /** @internal called by the parent tab group */\n setActive(value: boolean): void {\n this._active.set(value);\n }\n}\n\n/** Tab group. Wraps `<strct-tab>` children and renders the tab bar. */\n@Component({\n selector: 'strct-tabs',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n <div\n class=\"strct-tabs__bar\"\n role=\"tablist\"\n tabindex=\"0\"\n #bar\n (keydown)=\"onKeydown($event, bar)\"\n >\n @for (tab of tabs(); track tab; let i = $index) {\n <button\n type=\"button\"\n role=\"tab\"\n class=\"strct-tabs__btn\"\n [class.strct-tabs__btn--active]=\"i === selectedIndex()\"\n [attr.aria-selected]=\"i === selectedIndex()\"\n [attr.tabindex]=\"i === selectedIndex() ? 0 : -1\"\n [disabled]=\"tab.disabled()\"\n (click)=\"select(i)\"\n >\n {{ tab.label() }}\n </button>\n }\n </div>\n <div class=\"strct-tabs__panels\"><ng-content /></div>\n `,\n host: { class: 'strct-tabs' },\n styles: [\n `\n .strct-tabs {\n display: block;\n }\n .strct-tabs__bar {\n display: flex;\n gap: 2px;\n border-bottom: 1px solid var(--b2);\n overflow-x: auto;\n white-space: nowrap;\n scrollbar-width: none;\n }\n .strct-tabs__btn {\n appearance: none;\n background: transparent;\n border: 0;\n cursor: pointer;\n font-family: var(--font);\n font-size: 13px;\n font-weight: 500;\n color: var(--t2);\n padding: 9px 14px;\n border-bottom: 2px solid transparent;\n margin-bottom: -1px;\n transition:\n color 0.14s ease,\n border-color 0.14s ease;\n }\n .strct-tabs__btn:hover {\n color: var(--t1);\n }\n .strct-tabs__btn--active {\n color: var(--acc);\n border-bottom-color: var(--acc);\n }\n .strct-tabs__btn:disabled {\n color: var(--t4);\n cursor: not-allowed;\n }\n .strct-tabs__panels {\n padding-top: 16px;\n }\n `,\n ],\n})\nexport class StrctTabs {\n readonly tabs = contentChildren(StrctTab);\n readonly selectedIndex = model(0);\n\n constructor() {\n // Keep each child panel's visibility in sync with the selected index.\n effect(() => {\n const idx = this.selectedIndex();\n this.tabs().forEach((tab, i) => tab.setActive(i === idx));\n });\n }\n\n select(index: number): void {\n if (!this.tabs()[index]?.disabled()) this.selectedIndex.set(index);\n }\n\n onKeydown(event: KeyboardEvent, bar: HTMLElement): void {\n const key = event.key;\n if (!['ArrowRight', 'ArrowLeft', 'Home', 'End'].includes(key)) return;\n event.preventDefault();\n const count = this.tabs().length;\n if (!count) return;\n let idx = this.selectedIndex();\n if (key === 'Home') {\n idx = 0;\n while (idx < count && this.tabs()[idx].disabled()) idx++;\n } else if (key === 'End') {\n idx = count - 1;\n while (idx >= 0 && this.tabs()[idx].disabled()) idx--;\n } else {\n const step = key === 'ArrowRight' ? 1 : -1;\n for (let n = 0; n < count; n++) {\n idx = (idx + step + count) % count;\n if (!this.tabs()[idx].disabled()) break;\n }\n }\n if (idx < 0 || idx >= count || this.tabs()[idx]?.disabled()) return;\n this.selectedIndex.set(idx);\n const buttons = bar.querySelectorAll<HTMLElement>('button.strct-tabs__btn');\n buttons[idx]?.focus();\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport {\n ApplicationRef,\n ChangeDetectionStrategy,\n Component,\n ComponentRef,\n Directive,\n ElementRef,\n EnvironmentInjector,\n HostListener,\n Injectable,\n NgZone,\n ViewEncapsulation,\n afterNextRender,\n booleanAttribute,\n computed,\n createComponent,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { StrctIcon } from '../icon/icon';\n\n/** A single entry in a data-driven menu. */\nexport interface StrctMenuItem {\n /** Entry text. Optional — omit it for a `divider`, where a label is meaningless. */\n label?: string;\n icon?: string;\n /** Destructive styling. */\n critical?: boolean;\n disabled?: boolean;\n /** Render a separator instead of an entry (label is ignored). */\n divider?: boolean;\n /** Nested submenu. */\n children?: StrctMenuItem[];\n /** Invoked on selection, with the trigger's `strctContextMenuData`. */\n action?: (data?: unknown) => void;\n /** Arbitrary payload. */\n data?: unknown;\n}\n\n/**\n * Floating menu panel — portaled into `<body>` (so it escapes overflow /\n * transform clipping), positioned by its real measured size, with full keyboard\n * navigation and recursive submenus. Usually created by `[strctContextMenu]`,\n * but can be embedded directly with `submenu`.\n */\n@Component({\n selector: 'strct-menu-panel',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon],\n template: `\n <div class=\"strct-menu\" role=\"menu\" tabindex=\"-1\" (keydown)=\"onKeydown($event)\">\n @for (item of items(); track $index; let i = $index) {\n @if (item.divider) {\n <div class=\"strct-menu__sep\" role=\"separator\"></div>\n } @else {\n <div class=\"strct-menu__wrap\" (mouseenter)=\"onHover(i)\" (mouseleave)=\"onLeave(i)\">\n <button\n type=\"button\"\n class=\"strct-menu__item\"\n [attr.data-idx]=\"i\"\n [class.strct-menu__item--critical]=\"item.critical\"\n [class.strct-menu__item--active]=\"i === activeIndex()\"\n [disabled]=\"item.disabled\"\n role=\"menuitem\"\n [attr.aria-haspopup]=\"item.children?.length ? 'menu' : null\"\n [attr.aria-expanded]=\"item.children?.length ? openSubIndex() === i : null\"\n [attr.tabindex]=\"i === activeIndex() ? 0 : -1\"\n (click)=\"onItemClick(item, i, $event)\"\n >\n @if (item.icon) {\n <strct-icon\n class=\"strct-menu__icon\"\n [name]=\"item.icon\"\n [size]=\"16\"\n [strokeWidth]=\"1.3\"\n />\n } @else {\n <span class=\"strct-menu__icon-spacer\" aria-hidden=\"true\"></span>\n }\n <span class=\"strct-menu__label\">{{ item.label }}</span>\n @if (item.children?.length) {\n <strct-icon\n class=\"strct-menu__arrow\"\n name=\"chevronRight\"\n [size]=\"12\"\n [strokeWidth]=\"1.6\"\n />\n }\n </button>\n @if (openSubIndex() === i && item.children?.length) {\n <strct-menu-panel\n submenu\n class=\"strct-menu__subpanel\"\n [class.strct-menu__subpanel--flip]=\"flipLeft()\"\n [items]=\"item.children!\"\n [data]=\"data()\"\n (select)=\"select.emit($event)\"\n (close)=\"close.emit()\"\n (back)=\"closeSub(); focusItem(i)\"\n />\n }\n </div>\n }\n }\n </div>\n `,\n host: {\n class: 'strct-menu-host',\n '[style.position]': \"submenu() ? null : 'fixed'\",\n '[style.left.px]': 'submenu() ? null : posX()',\n '[style.top.px]': 'submenu() ? null : posY()',\n '[style.zIndex]': 'submenu() ? null : 1100',\n },\n styles: [\n `\n .strct-menu-host {\n display: block;\n }\n .strct-menu {\n min-width: 180px;\n padding: 4px;\n background: var(--bg-1);\n border: 1px solid var(--b2);\n border-radius: 7px;\n box-shadow: var(--shh);\n animation: strct-menu-in 0.1s ease;\n }\n .strct-menu:focus {\n outline: none;\n }\n .strct-menu__wrap {\n position: relative;\n }\n .strct-menu__item {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 7px 8px 7px 10px;\n border: 0;\n border-radius: 5px;\n cursor: pointer;\n background: transparent;\n color: var(--t1);\n font-size: 13px;\n font-family: var(--font);\n text-align: start;\n }\n .strct-menu__item:hover:not(:disabled),\n .strct-menu__item--active:not(:disabled) {\n background: var(--bg-3);\n }\n .strct-menu__item:focus-visible {\n outline: none;\n background: var(--bg-3);\n }\n .strct-menu__item--critical {\n color: var(--critical);\n }\n .strct-menu__item--critical:hover:not(:disabled),\n .strct-menu__item--critical.strct-menu__item--active:not(:disabled) {\n background: var(--critical-bg);\n }\n .strct-menu__item:disabled {\n opacity: 0.45;\n cursor: not-allowed;\n }\n .strct-menu__icon {\n color: var(--t2);\n flex-shrink: 0;\n }\n .strct-menu__item--critical .strct-menu__icon {\n color: var(--critical);\n }\n .strct-menu__icon-spacer {\n width: 14px;\n flex-shrink: 0;\n }\n .strct-menu__label {\n flex: 1;\n white-space: nowrap;\n }\n .strct-menu__arrow {\n color: var(--t3);\n flex-shrink: 0;\n }\n .strct-menu__sep {\n height: 1px;\n margin: 4px 6px;\n background: var(--b1);\n }\n\n .strct-menu__subpanel {\n position: absolute;\n top: -5px;\n left: 100%;\n margin-inline-start: 2px;\n z-index: 1;\n }\n .strct-menu__subpanel--flip {\n left: auto;\n right: 100%;\n margin-inline-start: 0;\n margin-inline-end: 2px;\n }\n @keyframes strct-menu-in {\n from {\n opacity: 0;\n transform: scale(0.97);\n }\n }\n `,\n ],\n})\nexport class StrctMenuPanel {\n private readonly host: ElementRef<HTMLElement> = inject(ElementRef);\n\n /** Menu items to display. */\n readonly items = input.required<StrctMenuItem[]>();\n /** Arbitrary payload passed to item actions. */\n readonly data = input<unknown>(undefined);\n /** Horizontal position in pixels. */\n readonly x = input(0);\n /** Vertical position in pixels. */\n readonly y = input(0);\n /** Render as a nested submenu panel. */\n readonly submenu = input(false, { transform: booleanAttribute });\n\n /** Emitted when an item is selected. */\n readonly select = output<StrctMenuItem>();\n /** Emitted when the menu requests closing. */\n readonly close = output<void>();\n /** ArrowLeft inside a submenu — asks the parent to close it. */\n readonly back = output<void>();\n\n protected readonly posX = signal(0);\n protected readonly posY = signal(0);\n protected readonly flipLeft = signal(false);\n protected readonly activeIndex = signal(0);\n protected readonly openSubIndex = signal<number | null>(null);\n\n private readonly navIndices = computed(() =>\n this.items()\n .map((it, i) => (it.divider ? -1 : i))\n .filter((i) => i >= 0),\n );\n\n constructor() {\n this.posX.set(this.x());\n this.posY.set(this.y());\n afterNextRender(() => {\n this.activeIndex.set(this.navIndices()[0] ?? 0);\n if (!this.submenu()) this.clampToViewport();\n this.focusItem(this.activeIndex());\n });\n }\n\n private clampToViewport(): void {\n const host = this.host.nativeElement;\n const w = host.offsetWidth;\n const h = host.offsetHeight;\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const m = 6;\n let nx = this.x();\n let ny = this.y();\n if (nx + w > vw - m) nx = Math.max(m, Math.min(this.x() - w, vw - w - m));\n if (ny + h > vh - m) ny = Math.max(m, vh - h - m);\n this.posX.set(nx);\n this.posY.set(ny);\n // Submenus of a panel near the right edge open to the left.\n this.flipLeft.set(nx + w > vw - 220);\n }\n\n protected focusItem(i: number): void {\n this.activeIndex.set(i);\n this.host.nativeElement\n .querySelector<HTMLElement>(`.strct-menu__item[data-idx=\"${i}\"]`)\n ?.focus();\n }\n\n private move(dir: 1 | -1): void {\n const nav = this.navIndices();\n if (!nav.length) return;\n const pos = nav.indexOf(this.activeIndex());\n const next = nav[(pos + dir + nav.length) % nav.length];\n this.openSubIndex.set(null);\n this.focusItem(next);\n }\n\n protected onHover(i: number): void {\n this.activeIndex.set(i);\n const it = this.items()[i];\n this.openSubIndex.set(it?.children?.length ? i : null);\n }\n\n protected onLeave(i: number): void {\n if (this.openSubIndex() === i) this.openSubIndex.set(null);\n }\n\n protected onItemClick(item: StrctMenuItem, i: number, event: Event): void {\n event.stopPropagation();\n if (item.disabled) return;\n if (item.children?.length) {\n this.openSubIndex.set(this.openSubIndex() === i ? null : i);\n this.focusItem(i);\n } else {\n this.select.emit(item);\n }\n }\n\n protected closeSub(): void {\n this.openSubIndex.set(null);\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n const key = event.key;\n const item = this.items()[this.activeIndex()];\n switch (key) {\n case 'ArrowDown':\n event.preventDefault();\n event.stopPropagation();\n this.move(1);\n break;\n case 'ArrowUp':\n event.preventDefault();\n event.stopPropagation();\n this.move(-1);\n break;\n case 'Home':\n event.preventDefault();\n event.stopPropagation();\n this.focusItem(this.navIndices()[0] ?? 0);\n break;\n case 'End':\n event.preventDefault();\n event.stopPropagation();\n this.focusItem(this.navIndices().at(-1) ?? 0);\n break;\n case 'ArrowRight':\n if (item?.children?.length) {\n event.preventDefault();\n event.stopPropagation();\n this.openSubIndex.set(this.activeIndex());\n }\n break;\n case 'ArrowLeft':\n event.preventDefault();\n event.stopPropagation();\n if (this.openSubIndex() != null) this.closeSub();\n else if (this.submenu()) this.back.emit();\n break;\n case 'Enter':\n case ' ':\n event.preventDefault();\n event.stopPropagation();\n if (item && !item.disabled) {\n if (item.children?.length) this.openSubIndex.set(this.activeIndex());\n else this.select.emit(item);\n }\n break;\n case 'Escape':\n event.preventDefault();\n event.stopPropagation();\n this.close.emit();\n break;\n }\n }\n}\n\n/** Options for {@link StrctMenuService.open}. */\nexport interface StrctMenuOpenOptions {\n /** Viewport x of the menu's top-left (clamped/flipped to stay on screen). */\n x: number;\n /** Viewport y of the menu's top-left. */\n y: number;\n items: StrctMenuItem[];\n /** Payload passed to each item's `action`. */\n data?: unknown;\n /** Called with the chosen item (after its `action` runs). */\n onSelect?: (item: StrctMenuItem) => void;\n}\n\n/**\n * Imperatively opens the data-driven menu panel, portaled into `<body>`. Shared\n * by the `[strctContextMenu]` directive (right-click) and any click trigger such\n * as the datagrid row-action button. Only one menu is open at a time.\n */\n@Injectable({ providedIn: 'root' })\nexport class StrctMenuService {\n private readonly appRef = inject(ApplicationRef);\n private readonly envInjector = inject(EnvironmentInjector);\n private readonly zone = inject(NgZone);\n private readonly doc = inject(DOCUMENT);\n private ref: ComponentRef<StrctMenuPanel> | null = null;\n\n open(opts: StrctMenuOpenOptions): void {\n this.close();\n if (!opts.items?.length) return;\n const ref = createComponent(StrctMenuPanel, { environmentInjector: this.envInjector });\n ref.setInput('items', opts.items);\n ref.setInput('data', opts.data);\n ref.setInput('x', opts.x);\n ref.setInput('y', opts.y);\n ref.instance.select.subscribe((item) => {\n item.action?.(opts.data);\n opts.onSelect?.(item);\n this.close();\n });\n ref.instance.close.subscribe(() => this.close());\n\n this.appRef.attachView(ref.hostView);\n this.doc.body.appendChild(ref.location.nativeElement);\n this.ref = ref;\n\n // Defer global listeners so the opening click doesn't immediately close it.\n setTimeout(() => {\n this.zone.runOutsideAngular(() => {\n this.doc.addEventListener('mousedown', this.onOutside, true);\n window.addEventListener('scroll', this.onClose, true);\n window.addEventListener('resize', this.onClose);\n });\n });\n }\n\n private readonly onClose = () => this.zone.run(() => this.close());\n private readonly onOutside = (event: Event) => {\n if (this.ref && !this.ref.location.nativeElement.contains(event.target as Node)) {\n this.onClose();\n }\n };\n\n close(): void {\n if (!this.ref) return;\n this.doc.removeEventListener('mousedown', this.onOutside, true);\n window.removeEventListener('scroll', this.onClose, true);\n window.removeEventListener('resize', this.onClose);\n this.appRef.detachView(this.ref.hostView);\n this.ref.destroy();\n this.ref = null;\n }\n}\n\n/**\n * Right-click (context) menu driven by a data array. Attach to any trigger; the\n * menu portals into `<body>` and runs each item's `action` on selection.\n * <div [strctContextMenu]=\"menuFor(host)\" [strctContextMenuData]=\"host\"\n * (menuSelect)=\"onPick($event)\">…</div>\n */\n@Directive({ selector: '[strctContextMenu]' })\nexport class StrctContextMenuTrigger {\n private readonly menu = inject(StrctMenuService);\n\n /** Menu items to display. */\n readonly items = input.required<StrctMenuItem[]>({ alias: 'strctContextMenu' });\n /** Arbitrary payload passed to item actions. */\n readonly data = input<unknown>(undefined, { alias: 'strctContextMenuData' });\n /** Emitted when a menu item is selected. */\n readonly menuSelect = output<StrctMenuItem>();\n\n @HostListener('contextmenu', ['$event'])\n protected onContextMenu(event: MouseEvent): void {\n if (!this.items()?.length) return;\n event.preventDefault();\n this.menu.open({\n x: event.clientX,\n y: event.clientY,\n items: this.items(),\n data: this.data(),\n onSelect: (item) => this.menuSelect.emit(item),\n });\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n ViewEncapsulation,\n computed,\n contentChildren,\n forwardRef,\n inject,\n input,\n model,\n output,\n signal,\n} from '@angular/core';\nimport { StrctIcon, StrctIconBadge } from '../icon/icon';\nimport { StrctContextMenuTrigger, StrctMenuItem } from '../context-menu/menu';\n\n/** A node in the data-driven tree (`<strct-tree [nodes]=\"...\">`). */\nexport interface StrctTreeNodeData {\n /**\n * Stable unique key — used for `trackBy`, controlled expansion state\n * (`expandedIds`) and a `data-node-id` DOM attribute. Falls back to `label`\n * when absent (backward-compatible).\n */\n id?: string;\n label: string;\n /** Optional leading icon name. */\n icon?: string;\n /** Status dot on the icon (running / maintenance / off …). */\n badge?: StrctIconBadge;\n /** Highlight as the selected node. */\n active?: boolean;\n /** Initial expanded state. */\n expanded?: boolean;\n children?: StrctTreeNodeData[];\n /** Arbitrary payload returned with (nodeActivated). */\n data?: unknown;\n}\n\n/** Per-node menu resolver for the data-driven tree — returns the items for one node. */\nexport type StrctTreeNodeMenuFn = (node: StrctTreeNodeData) => StrctMenuItem[];\n\n/** Payload of (nodeMenuSelect). */\nexport interface StrctTreeMenuEvent {\n node: StrctTreeNodeData;\n item: StrctMenuItem;\n}\n\n/**\n * Tree node. Two modes:\n * - **Content:** nest `<strct-tree-node>` children manually.\n * - **Data:** pass a `[node]` object that recurses over its `children` —\n * used internally by `<strct-tree [nodes]>`.\n *\n * <strct-tree-node label=\"Group\" icon=\"layers\" badge=\"success\" [(expanded)]=\"open\">\n * <strct-tree-node label=\"Leaf\" icon=\"vm\" [active]=\"true\" />\n * </strct-tree-node>\n */\n@Component({\n selector: 'strct-tree-node',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon, StrctContextMenuTrigger],\n template: `\n <div\n class=\"strct-tnode__row\"\n [class.strct-tnode__row--active]=\"displayActive()\"\n role=\"treeitem\"\n [attr.tabindex]=\"rowTabindex()\"\n [attr.aria-level]=\"level\"\n [attr.aria-selected]=\"displayActive()\"\n [attr.aria-expanded]=\"hasChildren() ? isOpen() : null\"\n [strctContextMenu]=\"menuItems()\"\n [strctContextMenuData]=\"node()\"\n (menuSelect)=\"onMenuSelect($event)\"\n (click)=\"onActivate()\"\n (focus)=\"onRowFocus()\"\n (keydown)=\"onRowKeydown($event)\"\n (keydown.enter)=\"onActivate()\"\n (keydown.space)=\"$event.preventDefault(); onActivate()\"\n >\n @if (hasChildren()) {\n <span\n class=\"strct-tnode__chevron\"\n [class.strct-tnode__chevron--open]=\"isOpen()\"\n role=\"button\"\n [attr.aria-label]=\"(isOpen() ? 'Collapse ' : 'Expand ') + displayLabel()\"\n [attr.tabindex]=\"tree ? -1 : 0\"\n (click)=\"$event.stopPropagation(); toggle()\"\n (keydown.enter)=\"$event.stopPropagation(); toggle()\"\n (keydown.space)=\"$event.stopPropagation(); toggle()\"\n >\n <strct-icon name=\"chevronRight\" [size]=\"12\" [strokeWidth]=\"1.5\" />\n </span>\n } @else {\n <span class=\"strct-tnode__spacer\"></span>\n }\n @if (displayIcon()) {\n <strct-icon\n class=\"strct-tnode__icon\"\n [name]=\"displayIcon()!\"\n [size]=\"iconSize()\"\n [strokeWidth]=\"1.3\"\n [badge]=\"displayBadge()\"\n />\n }\n <span class=\"strct-tnode__label\">{{ displayLabel() }}</span>\n <ng-content select=\"[strctTreeTrailing]\" />\n </div>\n @if (hasChildren() && isOpen()) {\n <div class=\"strct-tnode__children\" role=\"group\">\n @if (node()) {\n @for (child of node()!.children ?? []; track child.id ?? child.label) {\n <strct-tree-node\n [node]=\"child\"\n [nodeMenu]=\"nodeMenu()\"\n (nodeActivated)=\"nodeActivated.emit($event)\"\n (nodeMenuSelect)=\"nodeMenuSelect.emit($event)\"\n />\n }\n } @else {\n <ng-content />\n }\n </div>\n }\n `,\n host: {\n class: 'strct-tnode',\n '[attr.data-node-id]': 'node()?.id ?? null',\n },\n styles: [\n `\n .strct-tnode {\n display: block;\n }\n .strct-tnode__row {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 4px 9px;\n border-radius: 5px;\n cursor: pointer;\n font-size: 13px;\n color: var(--t1);\n user-select: none;\n }\n .strct-tnode__row:hover {\n background: var(--bg-3);\n }\n .strct-tnode__row:focus-visible {\n outline: none;\n box-shadow: inset 0 0 0 2px var(--acc50);\n }\n .strct-tnode__row--active {\n background: var(--acc-m);\n color: var(--acc);\n font-weight: 500;\n }\n .strct-tnode__row--active .strct-tnode__icon,\n .strct-tnode__row--active .strct-tnode__chevron {\n color: var(--acc);\n }\n .strct-tnode__chevron {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n color: var(--t3);\n transition: transform 0.15s ease;\n /* 24px hit target (WCAG 2.5.8) without changing visual density. */\n width: 24px;\n height: 24px;\n margin: -5px;\n margin-inline-end: -10px;\n flex-shrink: 0;\n }\n .strct-tnode__chevron--open {\n transform: rotate(90deg);\n }\n .strct-tnode__spacer {\n width: 14px;\n flex-shrink: 0;\n }\n @media (prefers-reduced-motion: reduce) {\n .strct-tnode__chevron {\n transition: none;\n }\n }\n .strct-tnode__icon {\n color: var(--t2);\n flex-shrink: 0;\n }\n .strct-tnode__label {\n flex: 1;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n .strct-tnode__children {\n margin-inline-start: 16px;\n }\n `,\n ],\n})\nexport class StrctTreeNode {\n /** Data-driven node; when set, label/icon/children come from it. */\n readonly node = input<StrctTreeNodeData | null>(null);\n /** Label text. */\n readonly label = input('');\n /** Icon name. */\n readonly icon = input<string | undefined>(undefined);\n /** Status dot variant. */\n readonly badge = input<StrctIconBadge>('none');\n /** Whether the item is active / selected. */\n readonly active = input(false);\n /** Whether the panel is open (two-way). */\n readonly expanded = model(false);\n /** Per-node menu resolver (data mode); bubbles down the recursion. */\n readonly nodeMenu = input<StrctTreeNodeMenuFn | null>(null);\n /** Content-mode click. */\n readonly activated = output<void>();\n /** Data-mode click — carries the activated node (bubbles to the tree). */\n readonly nodeActivated = output<StrctTreeNodeData>();\n /** Data-mode right-click menu selection (bubbles to the tree). */\n readonly nodeMenuSelect = output<StrctTreeMenuEvent>();\n\n /** Right-click menu items for this node ([] when no resolver / not data mode). */\n protected readonly menuItems = computed<StrctMenuItem[]>(() => {\n const fn = this.nodeMenu();\n const n = this.node();\n return fn && n ? fn(n) : [];\n });\n\n /** The owning `<strct-tree>` (null only for standalone nodes outside a tree). */\n protected readonly tree = inject<StrctTree | null>(\n forwardRef(() => StrctTree),\n { optional: true },\n );\n /** Node icon scales with the owning tree's density (16 native → 18 comfortable). */\n protected readonly iconSize = computed(() => (this.tree?.density() === 'comfortable' ? 18 : 16));\n /** Parent tree node (element-injector ancestor); drives aria-level + ArrowLeft. */\n readonly parent = inject(StrctTreeNode, { optional: true, skipSelf: true });\n /** 1-based depth, exposed as aria-level. */\n readonly level: number = (this.parent?.level ?? 0) + 1;\n private readonly hostEl = inject<ElementRef<HTMLElement>>(ElementRef);\n\n private readonly childNodes = contentChildren(StrctTreeNode);\n /** Data-mode expansion fallback when there is no owning tree (seeded from node.expanded). */\n private readonly dataExpanded = signal<boolean | null>(null);\n\n protected readonly displayLabel = computed(() => this.node()?.label ?? this.label());\n protected readonly displayIcon = computed(() => this.node()?.icon ?? this.icon());\n protected readonly displayBadge = computed<StrctIconBadge>(\n () => this.node()?.badge ?? this.badge(),\n );\n protected readonly displayActive = computed(() => this.node()?.active ?? this.active());\n\n constructor() {\n // Register with the owning tree for roving focus / keyboard navigation.\n // Collapsed subtrees are not rendered, so the registry always holds exactly\n // the visible nodes.\n this.tree?.registerNode(this);\n inject(DestroyRef).onDestroy(() => this.tree?.unregisterNode(this));\n }\n\n /** The focusable row element of this node. */\n rowEl(): HTMLElement | null {\n return this.hostEl.nativeElement.querySelector(':scope > .strct-tnode__row');\n }\n\n /** Roving tabindex: inside a tree only the active row is tabbable. */\n protected readonly rowTabindex = computed(() =>\n this.tree ? (this.tree.isRovingActive(this) ? 0 : -1) : 0,\n );\n\n protected onRowFocus(): void {\n this.tree?.setActive(this);\n }\n\n protected onRowKeydown(event: KeyboardEvent): void {\n if (!this.tree) return;\n if (!['ArrowDown', 'ArrowUp', 'ArrowLeft', 'ArrowRight', 'Home', 'End'].includes(event.key)) {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n this.tree.navigate(this, event.key);\n }\n\n readonly hasChildren = computed(() => {\n const n = this.node();\n return n ? (n.children?.length ?? 0) > 0 : this.childNodes().length > 0;\n });\n\n readonly isOpen = computed(() => {\n const n = this.node();\n if (n) {\n // Data mode: the owning tree is the single source of truth for expansion\n // (controlled `expandedIds` or its internal set). Only fall back to the\n // private seed when used as a standalone data node with no owning tree.\n if (this.tree) return this.tree.isNodeOpen(n);\n return this.dataExpanded() ?? n.expanded ?? false;\n }\n return this.expanded();\n });\n\n toggle(): void {\n const n = this.node();\n if (n) {\n if (this.tree) this.tree.toggleNode(n);\n else this.dataExpanded.set(!this.isOpen());\n } else {\n this.expanded.update((v) => !v);\n }\n }\n\n protected onActivate(): void {\n const n = this.node();\n if (n) this.nodeActivated.emit(n);\n else this.activated.emit();\n }\n\n protected onMenuSelect(item: StrctMenuItem): void {\n const n = this.node();\n if (n) this.nodeMenuSelect.emit({ node: n, item });\n }\n}\n\n/**\n * Root container for a tree. Either project `<strct-tree-node>` children, or\n * pass `[nodes]` for a fully data-driven, self-recursing tree:\n * <strct-tree [nodes]=\"roots\" (nodeActivated)=\"select($event)\" />\n */\n@Component({\n selector: 'strct-tree',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctTreeNode],\n template: `\n @if (nodes(); as ns) {\n @for (n of ns; track n.id ?? n.label) {\n <strct-tree-node\n [node]=\"n\"\n [nodeMenu]=\"nodeMenu()\"\n (nodeActivated)=\"nodeActivated.emit($event)\"\n (nodeMenuSelect)=\"nodeMenuSelect.emit($event)\"\n />\n }\n } @else {\n <ng-content />\n }\n `,\n host: {\n class: 'strct-tree',\n role: 'tree',\n '[class.strct-tree--comfortable]': \"density() === 'comfortable'\",\n },\n styles: [\n `\n .strct-tree {\n display: block;\n }\n\n /* Comfortable density: larger text / icons, taller rows, wider indent.\n Opt-in — the compact default stays pixel-identical. */\n .strct-tree--comfortable .strct-tnode__row {\n gap: 7px;\n padding: 6px 10px;\n border-radius: 6px;\n font-size: 14px;\n }\n .strct-tree--comfortable .strct-tnode__chevron {\n margin: -4px;\n margin-inline-end: -9px;\n }\n .strct-tree--comfortable .strct-tnode__spacer {\n width: 16px;\n }\n .strct-tree--comfortable .strct-tnode__children {\n margin-inline-start: 19px;\n }\n `,\n ],\n})\nexport class StrctTree {\n /** Data-driven node list; when set, projected content is ignored. */\n readonly nodes = input<StrctTreeNodeData[] | null>(null);\n /**\n * Row density. `compact` (default) is the dense inventory layout —\n * 13px text / 16px icons; `comfortable` relaxes to 14px text / 18px icons\n * with taller rows for touch-friendly or low-density consoles.\n */\n readonly density = input<'compact' | 'comfortable'>('compact');\n /** Per-node right-click menu resolver. */\n readonly nodeMenu = input<StrctTreeNodeMenuFn | null>(null);\n /** Emitted when any data-driven node is clicked. */\n readonly nodeActivated = output<StrctTreeNodeData>();\n /** Emitted when a data-driven node's right-click menu item is chosen. */\n readonly nodeMenuSelect = output<StrctTreeMenuEvent>();\n\n /**\n * Controlled expansion (two-way). When non-null it is the single source of\n * truth: node open state derives from it and toggles write back through it, so\n * persisting/restoring is `<strct-tree [(expandedIds)]=\"ids\" />`. When null\n * (default), expansion is uncontrolled — seeded from each node's `expanded`\n * flag and owned internally (backward-compatible).\n */\n readonly expandedIds = model<string[] | null>(null);\n /** The full set of expanded ids, emitted on every expand / collapse. */\n readonly expandedChange = output<string[]>();\n /** Emitted per toggle with the node and its new state. */\n readonly nodeToggled = output<{ node: StrctTreeNodeData; expanded: boolean }>();\n\n /** Stable key for a node: its `id`, or the `label` as a fallback. */\n private readonly keyOf = (n: StrctTreeNodeData): string => n.id ?? n.label;\n\n /** Explicit user toggles layered on top of the `node.expanded` seed (uncontrolled). */\n private readonly overrides = signal<Map<string, boolean>>(new Map());\n\n /** Keys expanded by their `node.expanded` seed (pure — no flash on first render). */\n private readonly seededSet = computed<Set<string>>(() => {\n const set = new Set<string>();\n const walk = (arr: StrctTreeNodeData[]): void => {\n for (const n of arr) {\n if (n.expanded) set.add(this.keyOf(n));\n if (n.children?.length) walk(n.children);\n }\n };\n const ns = this.nodes();\n if (ns) walk(ns);\n return set;\n });\n\n /** The active expanded-key set — controlled `expandedIds`, or seed + overrides. */\n private readonly currentSet = computed<Set<string>>(() => {\n const ids = this.expandedIds();\n if (ids != null) return new Set(ids);\n const set = new Set(this.seededSet());\n for (const [key, open] of this.overrides()) {\n if (open) set.add(key);\n else set.delete(key);\n }\n return set;\n });\n\n /** Whether a node is currently expanded (called by its `StrctTreeNode`). */\n isNodeOpen(node: StrctTreeNodeData): boolean {\n return this.currentSet().has(this.keyOf(node));\n }\n\n // ── Roving focus / keyboard navigation (ARIA tree pattern) ─────\n private readonly registeredNodes = signal<StrctTreeNode[]>([]);\n private readonly activeRoving = signal<StrctTreeNode | null>(null);\n\n registerNode(node: StrctTreeNode): void {\n this.registeredNodes.update((list) => [...list, node]);\n }\n unregisterNode(node: StrctTreeNode): void {\n this.registeredNodes.update((list) => list.filter((n) => n !== node));\n if (this.activeRoving() === node) this.activeRoving.set(null);\n }\n\n /** Visible nodes in document order (collapsed subtrees are never registered). */\n private ordered(): StrctTreeNode[] {\n return [...this.registeredNodes()].sort((a, b) => {\n const ra = a.rowEl();\n const rb = b.rowEl();\n if (!ra || !rb) return 0;\n return ra.compareDocumentPosition(rb) & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1;\n });\n }\n\n /** Whether this node currently holds the roving tabindex (0). */\n isRovingActive(node: StrctTreeNode): boolean {\n const active = this.activeRoving();\n if (active) return active === node;\n return this.ordered()[0] === node;\n }\n\n setActive(node: StrctTreeNode): void {\n this.activeRoving.set(node);\n }\n\n private focusNode(node: StrctTreeNode | undefined): void {\n if (!node) return;\n this.activeRoving.set(node);\n node.rowEl()?.focus();\n }\n\n /** Keyboard navigation between visible rows (called from the focused node). */\n navigate(node: StrctTreeNode, key: string): void {\n const list = this.ordered();\n const i = list.indexOf(node);\n if (i < 0) return;\n switch (key) {\n case 'ArrowDown':\n this.focusNode(list[Math.min(i + 1, list.length - 1)]);\n break;\n case 'ArrowUp':\n this.focusNode(list[Math.max(i - 1, 0)]);\n break;\n case 'Home':\n this.focusNode(list[0]);\n break;\n case 'End':\n this.focusNode(list[list.length - 1]);\n break;\n case 'ArrowRight':\n // Closed parent: open it. Open parent: move into the first child.\n if (node.hasChildren() && !node.isOpen()) node.toggle();\n else if (node.hasChildren() && i + 1 < list.length) this.focusNode(list[i + 1]);\n break;\n case 'ArrowLeft':\n // Open parent: close it. Otherwise: move focus to the parent node.\n if (node.hasChildren() && node.isOpen()) node.toggle();\n else if (node.parent) this.focusNode(node.parent);\n break;\n }\n }\n\n /** Toggle a node's expansion, updating state and emitting outputs. */\n toggleNode(node: StrctTreeNodeData): void {\n const key = this.keyOf(node);\n const expanded = !this.currentSet().has(key);\n if (this.expandedIds() != null) {\n const set = new Set(this.currentSet());\n if (expanded) set.add(key);\n else set.delete(key);\n this.expandedIds.set([...set]);\n } else {\n const next = new Map(this.overrides());\n next.set(key, expanded);\n this.overrides.set(next);\n }\n this.nodeToggled.emit({ node, expanded });\n this.expandedChange.emit([...this.currentSet()]);\n }\n}\n","import {\n DOCUMENT,\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n booleanAttribute,\n computed,\n effect,\n inject,\n input,\n model,\n output,\n signal,\n} from '@angular/core';\nimport { StrctIcon } from '../icon/icon';\n\n/** Fixed modal width presets: sm 480 · md 640 · lg 860 · xl 1080 (px). */\nexport type StrctModalSize = 'sm' | 'md' | 'lg' | 'xl';\n\nlet modalCounter = 0;\n\n// Body scroll-lock shared across any number of simultaneously open modals.\nlet scrollLockCount = 0;\nlet savedBodyOverflow = '';\nfunction lockBodyScroll(doc: Document): void {\n if (scrollLockCount === 0) {\n savedBodyOverflow = doc.body.style.overflow;\n doc.body.style.overflow = 'hidden';\n }\n scrollLockCount++;\n}\nfunction unlockBodyScroll(doc: Document): void {\n scrollLockCount = Math.max(0, scrollLockCount - 1);\n if (scrollLockCount === 0) doc.body.style.overflow = savedBodyOverflow;\n}\n\n/**\n * Overlay dialog with two-way `open`:\n * <strct-modal [(open)]=\"show\" title=\"Confirm\">\n * Body…\n * <ng-container strctModalFooter>\n * <button strct-button (click)=\"show = false\">Cancel</button>\n * </ng-container>\n * </strct-modal>\n */\n@Component({\n selector: 'strct-modal',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [StrctIcon],\n template: `\n @if (open()) {\n <!-- Backdrop: pointer-only dismiss target. No role/tabindex — keyboard users\n dismiss via Escape, and the focus trap makes the backdrop unreachable\n anyway (a role=\"button\" here was an unnamed phantom stop for AT). -->\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n <div\n class=\"strct-modal__overlay {{ backdropClass() }}\"\n [class.strct-modal__overlay--glass]=\"variant() === 'glass'\"\n (click)=\"onBackdrop($event)\"\n >\n <div\n #dialog\n class=\"strct-modal__dialog strct-modal__dialog--{{ size() }} {{ panelClass() }}\"\n [class.strct-modal__dialog--glass]=\"variant() === 'glass'\"\n [style.transform]=\"dragTransform()\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-labelledby]=\"title() ? titleId : null\"\n tabindex=\"-1\"\n (click)=\"$event.stopPropagation()\"\n (keydown.tab)=\"onTab($event)\"\n (keydown.shift.tab)=\"onTab($event)\"\n >\n <div\n class=\"strct-modal__head\"\n [class.strct-modal__head--drag]=\"draggable()\"\n (pointerdown)=\"onHeadPointerDown($event)\"\n (pointermove)=\"onHeadPointerMove($event)\"\n (pointerup)=\"onHeadPointerEnd()\"\n (lostpointercapture)=\"onHeadPointerEnd()\"\n >\n <span class=\"strct-modal__title\" [id]=\"titleId\">{{ title() }}</span>\n <button\n type=\"button\"\n class=\"strct-modal__close\"\n [attr.aria-label]=\"closeLabel()\"\n (click)=\"close()\"\n >\n <strct-icon name=\"close\" [size]=\"14\" />\n </button>\n </div>\n <div class=\"strct-modal__body\"><ng-content /></div>\n @if (!hideFooter()) {\n <div class=\"strct-modal__foot\"><ng-content select=\"[strctModalFooter]\" /></div>\n }\n </div>\n </div>\n }\n `,\n host: {\n '(document:keydown.escape)': 'onEscape()',\n },\n styles: [\n `\n .strct-modal__overlay {\n position: fixed;\n inset: 0;\n z-index: 1000;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--space-5);\n background: rgba(0, 0, 0, 0.5);\n backdrop-filter: blur(2px);\n animation: strct-modal-fade 0.12s ease;\n }\n @media (max-width: 768px) {\n .strct-modal__overlay {\n padding: var(--space-3);\n }\n }\n .strct-modal__dialog {\n width: 100%;\n max-height: calc(100vh - 48px);\n display: flex;\n flex-direction: column;\n background: var(--bg-1);\n border: 1px solid var(--b2);\n border-radius: var(--radius-xl);\n box-shadow: var(--shadow-elevated);\n overflow: hidden;\n animation: strct-modal-rise 0.14s ease;\n }\n /* Fixed width scale — the only widths a modal can take. */\n .strct-modal__dialog--sm {\n max-width: min(480px, calc(100vw - 32px));\n }\n .strct-modal__dialog--md {\n max-width: min(640px, calc(100vw - 32px));\n }\n .strct-modal__dialog--lg {\n max-width: min(860px, calc(100vw - 32px));\n }\n .strct-modal__dialog--xl {\n max-width: min(1080px, calc(100vw - 32px));\n }\n .strct-modal__head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-3);\n padding: var(--space-3) var(--space-4);\n border-bottom: 1px solid var(--b1);\n }\n /* Drag handle: empty header space repositions the dialog. */\n .strct-modal__head--drag {\n cursor: move;\n user-select: none;\n touch-action: none;\n }\n\n /* Frosted-glass preset — theme-aware (derives from the surface tokens). */\n .strct-modal__overlay--glass {\n background: rgba(0, 0, 0, 0.38);\n backdrop-filter: blur(10px) saturate(1.25);\n }\n .strct-modal__dialog--glass {\n background: color-mix(in srgb, var(--bg-1) 72%, transparent);\n backdrop-filter: blur(24px) saturate(1.4);\n }\n .strct-modal__dialog--glass .strct-modal__foot {\n background: color-mix(in srgb, var(--bg-2) 55%, transparent);\n }\n .strct-modal__title {\n font-size: 14px;\n font-weight: 600;\n color: var(--t1);\n }\n .strct-modal__close {\n display: inline-flex;\n padding: 4px;\n border: 0;\n border-radius: 5px;\n background: transparent;\n color: var(--t3);\n cursor: pointer;\n }\n .strct-modal__close:hover {\n color: var(--t1);\n background: var(--bg-3);\n }\n .strct-modal__body {\n padding: var(--space-4);\n overflow-y: auto;\n color: var(--t2);\n font-size: 13px;\n }\n .strct-modal__foot {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--space-2);\n padding: var(--space-3) var(--space-4);\n border-top: 1px solid var(--b1);\n background: var(--bg-2);\n }\n @keyframes strct-modal-fade {\n from {\n opacity: 0;\n }\n }\n @keyframes strct-modal-rise {\n from {\n opacity: 0;\n transform: translateY(8px) scale(0.98);\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n .strct-modal__overlay,\n .strct-modal__dialog {\n animation: none;\n }\n }\n `,\n ],\n})\nexport class StrctModal {\n private readonly elementRef = inject(ElementRef<HTMLElement>);\n private readonly doc = inject(DOCUMENT);\n\n /** Whether the panel is open (two-way). */\n readonly open = model(false);\n /** Dialog title. */\n readonly title = input('');\n /** Size variant (fixed scale; defaults to `sm` = 480px). */\n readonly size = input<StrctModalSize>('sm');\n /** Hide the footer slot. */\n readonly hideFooter = input(false, { transform: booleanAttribute });\n /** Accessible label of the X close button (localizable). */\n readonly closeLabel = input('Close');\n /**\n * Allow closing via a backdrop click / the Escape key. **Off by default** —\n * a modal closes only through its X button or an explicit action button, so a\n * stray click outside (or Escape) never discards in-progress work. Set\n * `dismissible` for lightweight, transient dialogs where quick dismissal is fine.\n */\n readonly dismissible = input(false, { transform: booleanAttribute });\n /** Allow repositioning the dialog by dragging its header (mouse + touch). */\n readonly draggable = input(false, { transform: booleanAttribute });\n /** Extra class(es) added to the dialog panel — style it from app-global CSS. */\n readonly panelClass = input('');\n /** Extra class(es) added to the backdrop / overlay. */\n readonly backdropClass = input('');\n /** Built-in look: `glass` is a theme-aware frosted preset (translucent panel + blurred backdrop). */\n readonly variant = input<'solid' | 'glass'>('solid');\n /** Emitted when the alert is dismissed. */\n readonly closed = output<void>();\n\n protected readonly titleId = `strct-modal-${++modalCounter}`;\n /** Element that had focus before the dialog opened, restored on close. */\n private previousActive: HTMLElement | null = null;\n /** Whether this instance currently holds a scroll lock. */\n private locked = false;\n\n constructor() {\n effect(() => {\n const open = this.open();\n if (open && !this.locked) {\n this.locked = true;\n // Position is per-open: every open starts centered again.\n this.dragOffset.set({ x: 0, y: 0 });\n this.dragStart = null;\n lockBodyScroll(this.doc);\n this.previousActive = this.doc.activeElement as HTMLElement | null;\n // Move focus into the dialog once it has rendered.\n setTimeout(() => this.focusInitial());\n } else if (!open && this.locked) {\n this.locked = false;\n unlockBodyScroll(this.doc);\n if (this.previousActive) {\n this.previousActive.focus?.();\n this.previousActive = null;\n }\n }\n });\n\n // Release the lock if the modal is destroyed while still open.\n inject(DestroyRef).onDestroy(() => {\n if (this.locked) {\n this.locked = false;\n unlockBodyScroll(this.doc);\n }\n });\n }\n\n close(): void {\n this.open.set(false);\n this.closed.emit();\n }\n\n protected onBackdrop(event?: Event): void {\n // Only act on interactions that originated on the overlay itself — a real\n // backdrop click, or Enter/Space while the backdrop is focused. Ignore events\n // that bubbled up from a child (e.g. a space typed in an input/textarea).\n if (event && event.target !== event.currentTarget) return;\n if (this.dismissible()) this.close();\n }\n\n protected onEscape(): void {\n if (this.open() && this.dismissible()) this.close();\n }\n\n /** Wrap Tab focus within the dialog. */\n protected onTab(event: Event): void {\n const e = event as KeyboardEvent;\n const items = this.focusable();\n if (!items.length) {\n e.preventDefault();\n return;\n }\n const first = items[0];\n const last = items[items.length - 1];\n const active = this.doc.activeElement;\n if (e.shiftKey && (active === first || !this.dialog()?.contains(active))) {\n e.preventDefault();\n last.focus();\n } else if (!e.shiftKey && active === last) {\n e.preventDefault();\n first.focus();\n }\n }\n\n // ── Drag-to-reposition (opt-in via `draggable`) ─────\n /** Dialog translation from its centered position; reset on every open. */\n private readonly dragOffset = signal({ x: 0, y: 0 });\n /** Pointer + clamp bounds captured at drag start; null while not dragging. */\n private dragStart: {\n px: number;\n py: number;\n ox: number;\n oy: number;\n minX: number;\n maxX: number;\n minY: number;\n maxY: number;\n } | null = null;\n\n protected readonly dragTransform = computed(() => {\n const { x, y } = this.dragOffset();\n return x || y ? `translate(${x}px, ${y}px)` : null;\n });\n\n protected onHeadPointerDown(event: PointerEvent): void {\n if (!this.draggable()) return;\n // Only empty header space starts a drag — never the close button or other controls.\n if ((event.target as HTMLElement).closest('button, a, input, select, textarea')) return;\n const dialog = this.dialog();\n const view = this.doc.defaultView;\n if (!dialog || !view) return;\n const rect = dialog.getBoundingClientRect();\n const o = this.dragOffset();\n const pad = 8;\n this.dragStart = {\n px: event.clientX,\n py: event.clientY,\n ox: o.x,\n oy: o.y,\n // Allowed offset range keeping the dialog inside the viewport (pad margin).\n minX: o.x + pad - rect.left,\n maxX: o.x + view.innerWidth - pad - rect.right,\n minY: o.y + pad - rect.top,\n maxY: o.y + view.innerHeight - pad - rect.bottom,\n };\n (event.currentTarget as HTMLElement).setPointerCapture?.(event.pointerId);\n event.preventDefault();\n }\n\n protected onHeadPointerMove(event: PointerEvent): void {\n const s = this.dragStart;\n if (!s) return;\n // A dialog larger than the viewport pins to the axis midpoint instead.\n const clamp = (v: number, lo: number, hi: number) =>\n lo > hi ? (lo + hi) / 2 : Math.min(hi, Math.max(lo, v));\n this.dragOffset.set({\n x: clamp(s.ox + event.clientX - s.px, s.minX, s.maxX),\n y: clamp(s.oy + event.clientY - s.py, s.minY, s.maxY),\n });\n }\n\n protected onHeadPointerEnd(): void {\n this.dragStart = null;\n }\n\n private dialog(): HTMLElement | null {\n return this.elementRef.nativeElement.querySelector('.strct-modal__dialog');\n }\n\n private focusable(): HTMLElement[] {\n const dialog = this.dialog();\n if (!dialog) return [];\n return Array.from(\n dialog.querySelectorAll<HTMLElement>(\n 'a[href],button:not([disabled]),input:not([disabled]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex=\"-1\"])',\n ),\n ).filter((el) => el.offsetParent !== null || el === this.doc.activeElement);\n }\n\n private focusInitial(): void {\n const items = this.focusable();\n (items[0] ?? this.dialog())?.focus();\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n Directive,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n contentChild,\n input,\n model,\n} from '@angular/core';\nimport { StrctIcon } from '../icon/icon';\n\n/** Marks the drawer's footer action area: `<ng-container strctDrawerFooter>…`. */\n@Directive({ selector: '[strctDrawerFooter]' })\nexport class StrctDrawerFooter {}\n\n/** Which edge the drawer slides in from. */\nexport type StrctDrawerSide = 'start' | 'end' | 'top' | 'bottom';\n/** Drawer extent along its sliding axis. */\nexport type StrctDrawerSize = 'sm' | 'md' | 'lg';\n\n/**\n * Slide-out overlay panel anchored to an edge of the viewport — for inspecting\n * or editing a record without losing the underlying table's scroll/selection.\n *\n * <strct-drawer [(open)]=\"editing\" side=\"end\" title=\"Virtual machine\">\n * … body …\n * <ng-container strctDrawerFooter>\n * <button strct-button (click)=\"editing.set(false)\">Cancel</button>\n * </ng-container>\n * </strct-drawer>\n */\n@Component({\n selector: 'strct-drawer',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon],\n template: `\n @if (open()) {\n <div\n class=\"strct-drawer__backdrop\"\n [class.strct-drawer__backdrop--bare]=\"!dismissable()\"\n (click)=\"onBackdrop()\"\n (keydown.escape)=\"onEscape()\"\n tabindex=\"-1\"\n ></div>\n <aside\n class=\"strct-drawer strct-drawer--{{ side() }} strct-drawer--{{ size() }}\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-label]=\"title() || 'Panel'\"\n >\n @if (title() || dismissable()) {\n <header class=\"strct-drawer__head\">\n <span class=\"strct-drawer__title\">{{ title() }}</span>\n @if (dismissable()) {\n <button\n type=\"button\"\n class=\"strct-drawer__close\"\n aria-label=\"Close\"\n (click)=\"close()\"\n >\n <strct-icon name=\"close\" [size]=\"15\" />\n </button>\n }\n </header>\n }\n <div class=\"strct-drawer__body\"><ng-content /></div>\n @if (hasFooter()) {\n <footer class=\"strct-drawer__foot\"><ng-content select=\"[strctDrawerFooter]\" /></footer>\n }\n </aside>\n }\n `,\n host: { class: 'strct-drawer-host' },\n styles: [\n `\n .strct-drawer__backdrop {\n position: fixed;\n inset: 0;\n z-index: 1100;\n background: rgba(0, 0, 0, 0.44);\n backdrop-filter: blur(1px);\n animation: strct-drawer-fade 0.16s ease;\n }\n .strct-drawer__backdrop--bare {\n background: transparent;\n backdrop-filter: none;\n }\n .strct-drawer {\n position: fixed;\n z-index: 1101;\n display: flex;\n flex-direction: column;\n background: var(--bg-1);\n box-shadow: var(--shh);\n }\n /* Horizontal drawers (start/end) take full height; vertical take full width. */\n .strct-drawer--start,\n .strct-drawer--end {\n top: 0;\n bottom: 0;\n border-radius: 0;\n }\n .strct-drawer--start {\n inset-inline-start: 0;\n border-inline-end: 1px solid var(--b2);\n animation: strct-drawer-in-start 0.18s ease;\n }\n .strct-drawer--end {\n inset-inline-end: 0;\n border-inline-start: 1px solid var(--b2);\n animation: strct-drawer-in-end 0.18s ease;\n }\n /* RTL: start anchors right, so the slide-in mirrors. */\n [dir='rtl'] .strct-drawer--start {\n animation-name: strct-drawer-in-end;\n }\n [dir='rtl'] .strct-drawer--end {\n animation-name: strct-drawer-in-start;\n }\n .strct-drawer--top,\n .strct-drawer--bottom {\n left: 0;\n right: 0;\n }\n .strct-drawer--top {\n top: 0;\n border-bottom: 1px solid var(--b2);\n animation: strct-drawer-in-top 0.18s ease;\n }\n .strct-drawer--bottom {\n bottom: 0;\n border-top: 1px solid var(--b2);\n animation: strct-drawer-in-bottom 0.18s ease;\n }\n /* Size along the sliding axis. */\n .strct-drawer--start.strct-drawer--sm,\n .strct-drawer--end.strct-drawer--sm {\n width: 300px;\n }\n .strct-drawer--start.strct-drawer--md,\n .strct-drawer--end.strct-drawer--md {\n width: 420px;\n }\n .strct-drawer--start.strct-drawer--lg,\n .strct-drawer--end.strct-drawer--lg {\n width: 600px;\n }\n .strct-drawer--top.strct-drawer--sm,\n .strct-drawer--bottom.strct-drawer--sm {\n height: 220px;\n }\n .strct-drawer--top.strct-drawer--md,\n .strct-drawer--bottom.strct-drawer--md {\n height: 340px;\n }\n .strct-drawer--top.strct-drawer--lg,\n .strct-drawer--bottom.strct-drawer--lg {\n height: 480px;\n }\n .strct-drawer {\n max-width: 100vw;\n max-height: 100vh;\n }\n .strct-drawer__head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 14px 18px;\n border-bottom: 1px solid var(--b1);\n flex-shrink: 0;\n }\n .strct-drawer__title {\n font-size: 15px;\n font-weight: 600;\n color: var(--t1);\n }\n .strct-drawer__close {\n display: inline-flex;\n padding: 4px;\n border: 0;\n border-radius: 5px;\n background: transparent;\n color: var(--t3);\n cursor: pointer;\n transition:\n color 0.14s ease,\n background 0.14s ease;\n }\n .strct-drawer__close:hover {\n color: var(--t1);\n background: var(--bg-3);\n }\n .strct-drawer__body {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n padding: 16px 18px;\n font-size: 13px;\n color: var(--t1);\n }\n .strct-drawer__foot {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 8px;\n padding: 12px 18px;\n border-top: 1px solid var(--b1);\n flex-shrink: 0;\n }\n @keyframes strct-drawer-fade {\n from {\n opacity: 0;\n }\n }\n @keyframes strct-drawer-in-start {\n from {\n transform: translateX(-100%);\n }\n }\n @keyframes strct-drawer-in-end {\n from {\n transform: translateX(100%);\n }\n }\n @keyframes strct-drawer-in-top {\n from {\n transform: translateY(-100%);\n }\n }\n @keyframes strct-drawer-in-bottom {\n from {\n transform: translateY(100%);\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n .strct-drawer__backdrop,\n .strct-drawer {\n animation: none;\n }\n }\n `,\n ],\n})\nexport class StrctDrawer {\n /** Open state (two-way). */\n readonly open = model(false);\n /** Edge to anchor to. Defaults to `end` (right in LTR). */\n readonly side = input<StrctDrawerSide>('end');\n /** Extent along the sliding axis. */\n readonly size = input<StrctDrawerSize>('md');\n /** Header title. */\n readonly title = input('');\n /** Show the close button and allow backdrop/Esc dismissal. */\n readonly dismissable = input(true, { transform: booleanAttribute });\n\n protected readonly footerDef = contentChild(StrctDrawerFooter);\n protected readonly hasFooter = computed(() => !!this.footerDef());\n\n protected onBackdrop(): void {\n if (this.dismissable()) this.close();\n }\n protected onEscape(): void {\n if (this.dismissable()) this.close();\n }\n close(): void {\n this.open.set(false);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n ElementRef,\n HostListener,\n booleanAttribute,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { StrctOverlay } from '../overlay/overlay';\n\n/**\n * Click-to-open menu:\n * <strct-dropdown align=\"end\">\n * <button strct-button strctDropdownTrigger>Actions</button>\n * <strct-dropdown-item>Rename</strct-dropdown-item>\n * <strct-dropdown-item critical>Delete</strct-dropdown-item>\n * </strct-dropdown>\n */\n@Component({\n selector: 'strct-dropdown',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctOverlay],\n template: `\n <div\n #trigger\n class=\"strct-dd__trigger\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"toggle()\"\n (keydown.enter)=\"toggle()\"\n (keydown.space)=\"toggle()\"\n >\n <ng-content select=\"[strctDropdownTrigger]\" />\n </div>\n @if (open()) {\n <div\n class=\"strct-dd__menu\"\n [strctOverlay]=\"trigger\"\n [strctOverlayPlacement]=\"align() === 'end' ? 'bottom-end' : 'bottom-start'\"\n role=\"menu\"\n tabindex=\"0\"\n (click)=\"close()\"\n (keydown.enter)=\"close()\"\n (keydown.space)=\"close()\"\n >\n <ng-content />\n </div>\n }\n `,\n host: { class: 'strct-dd' },\n styles: [\n `\n .strct-dd {\n position: relative;\n display: inline-block;\n }\n .strct-dd__trigger {\n display: inline-flex;\n }\n .strct-dd__menu {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n z-index: 200;\n min-width: 170px;\n max-width: calc(100vw - 24px);\n padding: 4px;\n background: var(--bg-1);\n border: 1px solid var(--b2);\n border-radius: 7px;\n box-shadow: var(--shh);\n animation: strct-dd-in 0.1s ease;\n }\n .strct-dd__menu--end {\n left: auto;\n right: 0;\n }\n @keyframes strct-dd-in {\n from {\n opacity: 0;\n transform: translateY(-4px);\n }\n }\n `,\n ],\n})\nexport class StrctDropdown {\n private readonly host = inject(ElementRef<HTMLElement>);\n /** Horizontal alignment of the menu. */\n readonly align = input<'start' | 'end'>('start');\n readonly open = signal(false);\n\n toggle(): void {\n this.open.update((v) => !v);\n }\n\n close(): void {\n this.open.set(false);\n }\n\n @HostListener('document:click', ['$event'])\n protected onDocClick(event: MouseEvent): void {\n if (this.open() && !this.host.nativeElement.contains(event.target as Node)) {\n this.close();\n }\n }\n\n @HostListener('document:keydown.escape')\n protected onEscape(): void {\n this.close();\n }\n}\n\n/** A selectable row inside a `<strct-dropdown>`. */\n@Component({\n selector: 'strct-dropdown-item',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `<ng-content />`,\n host: {\n class: 'strct-dd__item',\n role: 'menuitem',\n '[class.strct-dd__item--critical]': 'critical()',\n '[attr.aria-disabled]': 'disabled() || null',\n },\n styles: [\n `\n .strct-dd__item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 7px 10px;\n border-radius: 5px;\n cursor: pointer;\n font-size: 13px;\n color: var(--t1);\n }\n .strct-dd__item:hover {\n background: var(--bg-3);\n }\n .strct-dd__item--critical {\n color: var(--critical);\n }\n .strct-dd__item--critical:hover {\n background: var(--critical-bg);\n }\n .strct-dd__item[aria-disabled='true'] {\n color: var(--t4);\n pointer-events: none;\n }\n `,\n ],\n})\nexport class StrctDropdownItem {\n /** Danger. */\n readonly critical = input(false, { transform: booleanAttribute });\n /** Static disable flag. */\n readonly disabled = input(false, { transform: booleanAttribute });\n}\n\n/** Thin separator between groups of menu items. */\n@Component({\n selector: 'strct-dropdown-divider',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: '',\n host: { class: 'strct-dd__divider', role: 'separator' },\n styles: [\n `\n .strct-dd__divider {\n display: block;\n height: 1px;\n margin: 4px 6px;\n background: var(--b2);\n }\n `,\n ],\n})\nexport class StrctDropdownDivider {}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n HostListener,\n signal,\n} from '@angular/core';\n\n/**\n * Right-click (context) menu. Wraps a trigger area and shows a menu at the\n * cursor. Reuse `strct-dropdown-item` for the entries:\n * <strct-context-menu>\n * <div>Right-click here</div>\n * <ng-container strctContextMenuItems>\n * <strct-dropdown-item>Open</strct-dropdown-item>\n * <strct-dropdown-item critical>Delete</strct-dropdown-item>\n * </ng-container>\n * </strct-context-menu>\n */\n@Component({\n selector: 'strct-context-menu',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n <div class=\"strct-ctx__trigger\" (contextmenu)=\"onContextMenu($event)\">\n <ng-content />\n </div>\n @if (open()) {\n <div\n class=\"strct-ctx__menu\"\n role=\"menu\"\n tabindex=\"0\"\n [style.left.px]=\"x()\"\n [style.top.px]=\"y()\"\n (click)=\"close()\"\n (contextmenu)=\"$event.preventDefault(); close()\"\n (keydown.enter)=\"close()\"\n (keydown.space)=\"close()\"\n >\n <ng-content select=\"[strctContextMenuItems]\" />\n </div>\n }\n `,\n host: { class: 'strct-ctx' },\n styles: [\n `\n .strct-ctx {\n display: block;\n }\n .strct-ctx__menu {\n position: fixed;\n z-index: 1100;\n min-width: 180px;\n padding: 4px;\n background: var(--bg-1);\n border: 1px solid var(--b2);\n border-radius: 7px;\n box-shadow: var(--shh);\n animation: strct-ctx-in 0.1s ease;\n }\n @keyframes strct-ctx-in {\n from {\n opacity: 0;\n transform: scale(0.97);\n }\n }\n `,\n ],\n})\nexport class StrctContextMenu {\n readonly open = signal(false);\n readonly x = signal(0);\n readonly y = signal(0);\n\n /** Approximate menu box used to keep it inside the viewport. */\n private static readonly MENU_W = 190;\n private static readonly MENU_H = 240;\n\n onContextMenu(event: MouseEvent): void {\n event.preventDefault();\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n this.x.set(Math.min(event.clientX, vw - StrctContextMenu.MENU_W));\n this.y.set(Math.min(event.clientY, vh - StrctContextMenu.MENU_H));\n this.open.set(true);\n }\n\n close(): void {\n this.open.set(false);\n }\n\n @HostListener('document:click')\n protected onDocClick(): void {\n if (this.open()) this.close();\n }\n\n @HostListener('document:keydown.escape')\n protected onEscape(): void {\n this.close();\n }\n\n @HostListener('window:resize')\n protected onResize(): void {\n this.close();\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { StrctIcon } from '../icon/icon';\n\n/**\n * A nested fly-out inside a `strct-context-menu` or `strct-dropdown`. Opens on\n * hover, click/tap, or the keyboard (Enter / Space / →), and flips to the left\n * near the right edge of the viewport. Reuse `strct-dropdown-item` for entries.\n * <strct-submenu label=\"Power\">\n * <strct-dropdown-item>Power on</strct-dropdown-item>\n * <strct-dropdown-item>Power off</strct-dropdown-item>\n * </strct-submenu>\n */\n@Component({\n selector: 'strct-submenu',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon],\n template: `\n <div class=\"strct-submenu\" (mouseenter)=\"setOpen(true)\" (mouseleave)=\"open.set(false)\">\n <div\n class=\"strct-submenu__trigger\"\n role=\"menuitem\"\n tabindex=\"0\"\n aria-haspopup=\"menu\"\n [attr.aria-expanded]=\"open()\"\n (click)=\"$event.stopPropagation(); setOpen(!open())\"\n (keydown.enter)=\"$event.preventDefault(); $event.stopPropagation(); setOpen(true)\"\n (keydown.space)=\"$event.preventDefault(); $event.stopPropagation(); setOpen(true)\"\n (keydown.arrowright)=\"$event.preventDefault(); $event.stopPropagation(); setOpen(true)\"\n (keydown.arrowleft)=\"$event.stopPropagation(); open.set(false)\"\n (keydown.escape)=\"$event.stopPropagation(); open.set(false)\"\n >\n @if (icon()) {\n <strct-icon class=\"strct-submenu__icon\" [name]=\"icon()\" [size]=\"16\" [strokeWidth]=\"1.3\" />\n } @else {\n <span class=\"strct-submenu__icon-spacer\" aria-hidden=\"true\"></span>\n }\n <span class=\"strct-submenu__label\"\n >{{ label() }}<ng-content select=\"[strctSubmenuLabel]\"\n /></span>\n <strct-icon\n class=\"strct-submenu__arrow\"\n name=\"chevronRight\"\n [size]=\"12\"\n [strokeWidth]=\"1.6\"\n />\n </div>\n @if (open()) {\n <div class=\"strct-submenu__panel\" [class.strct-submenu__panel--flip]=\"flip()\" role=\"menu\">\n <ng-content />\n </div>\n }\n </div>\n `,\n host: { class: 'strct-submenu-host' },\n styles: [\n `\n .strct-submenu {\n position: relative;\n }\n .strct-submenu__trigger {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 7px 8px 7px 10px;\n border-radius: 5px;\n cursor: default;\n font-size: 13px;\n color: var(--t1);\n }\n .strct-submenu__trigger:hover {\n background: var(--bg-3);\n }\n .strct-submenu__trigger:focus-visible {\n outline: none;\n background: var(--bg-3);\n }\n .strct-submenu__icon {\n color: var(--t2);\n flex-shrink: 0;\n }\n .strct-submenu__icon-spacer {\n width: 14px;\n flex-shrink: 0;\n }\n .strct-submenu__label {\n flex: 1;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n }\n .strct-submenu__arrow {\n color: var(--t3);\n }\n .strct-submenu__panel {\n position: absolute;\n top: -5px;\n left: 100%;\n z-index: 1;\n min-width: 170px;\n margin-inline-start: 2px;\n padding: 4px;\n background: var(--bg-1);\n border: 1px solid var(--b2);\n border-radius: 7px;\n box-shadow: var(--shh);\n animation: strct-submenu-in 0.1s ease;\n }\n .strct-submenu__panel--flip {\n left: auto;\n right: 100%;\n margin-inline-start: 0;\n margin-inline-end: 2px;\n }\n @keyframes strct-submenu-in {\n from {\n opacity: 0;\n transform: translateX(-4px);\n }\n }\n `,\n ],\n})\nexport class StrctSubmenu {\n private readonly host: ElementRef<HTMLElement> = inject(ElementRef);\n\n /** Label text. */\n readonly label = input('');\n /** Optional leading icon; when omitted the icon column is still reserved so\n * the label stays aligned with sibling items that do have icons. */\n readonly icon = input('');\n readonly open = signal(false);\n /** Open to the left when the fly-out would overflow the right edge. */\n protected readonly flip = signal(false);\n\n protected setOpen(value: boolean): void {\n if (value) {\n const rect = this.host.nativeElement.getBoundingClientRect();\n this.flip.set(rect.right + 190 > window.innerWidth);\n }\n this.open.set(value);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n contentChildren,\n effect,\n input,\n model,\n output,\n signal,\n} from '@angular/core';\nimport { StrctButton } from '../button/button';\n\n/** A single wizard step. `label` names it in the step header. */\n@Component({\n selector: 'strct-step',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `@if (active()) {\n <ng-content />\n }`,\n host: { class: 'strct-step', '[hidden]': '!active()' },\n})\nexport class StrctStep {\n /** Label text. */\n readonly label = input.required<string>();\n /** When false, the wizard's Next / Finish is disabled on this step. */\n readonly canAdvance = input(true, { transform: booleanAttribute });\n private readonly _active = signal(false);\n readonly active = this._active.asReadonly();\n\n /** @internal */\n setActive(value: boolean): void {\n this._active.set(value);\n }\n}\n\n/** Multi-step flow with a numbered header and Back / Next / Finish controls. */\n@Component({\n selector: 'strct-wizard',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctButton],\n template: `\n <div class=\"strct-wiz__steps\">\n @for (step of steps(); track step; let i = $index; let last = $last) {\n <div\n class=\"strct-wiz__step\"\n [class.strct-wiz__step--active]=\"i === current()\"\n [class.strct-wiz__step--done]=\"i < current()\"\n >\n <span class=\"strct-wiz__dot\">{{ i + 1 }}</span>\n <span class=\"strct-wiz__label\">{{ step.label() }}</span>\n </div>\n @if (!last) {\n <span class=\"strct-wiz__sep\"></span>\n }\n }\n </div>\n\n <div class=\"strct-wiz__content\"><ng-content /></div>\n\n <div class=\"strct-wiz__foot\">\n @if (cancelable()) {\n <button strct-button variant=\"flat\" class=\"strct-wiz__cancel\" (click)=\"cancelled.emit()\">\n Cancel\n </button>\n }\n <button strct-button variant=\"flat\" [disabled]=\"current() === 0\" (click)=\"back()\">\n {{ backLabel() }}\n </button>\n @if (isLast()) {\n <button\n strct-button\n variant=\"primary\"\n [disabled]=\"submitting() || !canAdvance()\"\n (click)=\"finish()\"\n >\n {{ submitting() ? 'Submitting…' : finishLabel() }}\n </button>\n } @else {\n <button strct-button variant=\"primary\" [disabled]=\"!canAdvance()\" (click)=\"next()\">\n {{ nextLabel() }}\n </button>\n }\n </div>\n `,\n host: { class: 'strct-wiz' },\n styles: [\n `\n .strct-wiz {\n display: block;\n }\n .strct-wiz__steps {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n .strct-wiz__step {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n .strct-wiz__dot {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n border-radius: 50%;\n font-size: 12px;\n font-weight: 600;\n color: var(--t2);\n background: var(--bg-3);\n border: 1px solid var(--b2);\n }\n .strct-wiz__label {\n font-size: 12px;\n color: var(--t2);\n }\n .strct-wiz__step--active .strct-wiz__dot {\n background: var(--acc-m);\n color: var(--acc);\n border-color: var(--acc);\n }\n .strct-wiz__step--active .strct-wiz__label {\n color: var(--t1);\n font-weight: 600;\n }\n .strct-wiz__step--done .strct-wiz__dot {\n background: var(--acc-m);\n color: var(--acc);\n border-color: var(--acc30);\n }\n .strct-wiz__sep {\n flex: 1;\n height: 1px;\n background: var(--b2);\n min-width: 18px;\n }\n .strct-wiz__content {\n margin: 18px 0;\n padding: 16px;\n min-height: 80px;\n background: var(--bg-1);\n border: 1px solid var(--b2);\n border-radius: 8px;\n color: var(--t2);\n font-size: 13px;\n }\n .strct-wiz__foot {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n }\n .strct-wiz__cancel {\n margin-inline-end: auto;\n }\n `,\n ],\n})\nexport class StrctWizard {\n readonly steps = contentChildren(StrctStep);\n readonly current = model(0);\n /** Label for the final-step button (default \"Finish\"). */\n readonly finishLabel = input('Finish');\n /** Labels for the Back / Next buttons (localizable). */\n readonly backLabel = input('Back');\n readonly nextLabel = input('Next');\n /** Disable Finish and show a busy label while an async submit is in flight. */\n readonly submitting = input(false, { transform: booleanAttribute });\n /** Show a Cancel button on the left. */\n readonly cancelable = input(false, { transform: booleanAttribute });\n /** Emitted when the user clicks Finish. */\n readonly finished = output<void>();\n /** Emitted when the user clicks Cancel. */\n readonly cancelled = output<void>();\n /** Emits the new step index after a Back / Next move. */\n readonly stepChange = output<number>();\n\n protected readonly isLast = computed(() => this.current() >= this.steps().length - 1);\n /** Whether the current step permits advancing (its `canAdvance`). */\n protected readonly canAdvance = computed(\n () => this.steps()[this.current()]?.canAdvance() ?? true,\n );\n\n constructor() {\n effect(() => {\n const idx = this.current();\n this.steps().forEach((step, i) => step.setActive(i === idx));\n });\n }\n\n next(): void {\n if (!this.isLast() && this.canAdvance()) {\n this.current.update((i) => i + 1);\n this.stepChange.emit(this.current());\n }\n }\n\n back(): void {\n if (this.current() > 0) {\n this.current.update((i) => i - 1);\n this.stepChange.emit(this.current());\n }\n }\n\n finish(): void {\n if (this.canAdvance() && !this.submitting()) this.finished.emit();\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n input,\n} from '@angular/core';\n\n/**\n * Separator rule. Horizontal by default; pass `vertical` for an inline rule.\n * Projected content becomes a centered label on a horizontal divider.\n * <strct-divider>OR</strct-divider>\n * <strct-divider vertical />\n */\n@Component({\n selector: 'strct-divider',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `<span class=\"strct-divider__label\"><ng-content /></span>`,\n host: {\n class: 'strct-divider',\n role: 'separator',\n '[class.strct-divider--vertical]': 'vertical()',\n '[attr.aria-orientation]': \"vertical() ? 'vertical' : 'horizontal'\",\n },\n styles: [\n `\n .strct-divider {\n display: flex;\n align-items: center;\n gap: 12px;\n width: 100%;\n color: var(--t3);\n font-size: 12px;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n .strct-divider::before,\n .strct-divider::after {\n content: '';\n flex: 1;\n height: 1px;\n background: var(--b2);\n }\n .strct-divider__label:empty {\n display: none;\n }\n .strct-divider:has(.strct-divider__label:empty) {\n gap: 0;\n }\n\n .strct-divider--vertical {\n display: inline-block;\n width: 1px;\n min-height: 1em;\n height: auto;\n align-self: stretch;\n background: var(--b2);\n margin: 0 2px;\n }\n .strct-divider--vertical::before,\n .strct-divider--vertical::after {\n content: none;\n }\n .strct-divider--vertical .strct-divider__label {\n display: none;\n }\n `,\n ],\n})\nexport class StrctDivider {\n /** Render as a vertical rule. */\n readonly vertical = input(false, { transform: booleanAttribute });\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n input,\n} from '@angular/core';\n\n/** Breadcrumb trail container. Wraps `<strct-breadcrumb-item>` children. */\n@Component({\n selector: 'strct-breadcrumb',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `<ng-content />`,\n host: { class: 'strct-bc', role: 'navigation', 'aria-label': 'Breadcrumb' },\n styles: [\n `\n .strct-bc {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 2px;\n font-size: 13px;\n }\n .strct-bc__item:not(:last-child)::after {\n content: '/';\n margin: 0 8px;\n color: var(--t3);\n font-weight: 400;\n }\n `,\n ],\n})\nexport class StrctBreadcrumb {}\n\n/** One crumb. Mark the final one `current`. */\n@Component({\n selector: 'strct-breadcrumb-item',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `<ng-content />`,\n host: {\n class: 'strct-bc__item',\n '[class.strct-bc__item--current]': 'current()',\n '[attr.aria-current]': \"current() ? 'page' : null\",\n },\n styles: [\n `\n .strct-bc__item {\n display: inline-flex;\n align-items: center;\n color: var(--t2);\n }\n .strct-bc__item a {\n color: var(--t2);\n text-decoration: none;\n }\n .strct-bc__item a:hover {\n color: var(--acc);\n text-decoration: none;\n }\n .strct-bc__item--current {\n color: var(--t1);\n font-weight: 600;\n }\n `,\n ],\n})\nexport class StrctBreadcrumbItem {\n /** Mark as the current page. */\n readonly current = input(false, { transform: booleanAttribute });\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n input,\n model,\n} from '@angular/core';\nimport { StrctIcon } from '../icon/icon';\n\ntype PageToken = number | 'dots';\n\n/**\n * Page navigator with first/last + a windowed range and ellipsis gaps.\n * <strct-pagination [total]=\"240\" [pageSize]=\"20\" [(page)]=\"page\" />\n */\n@Component({\n selector: 'strct-pagination',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon],\n template: `\n <button\n type=\"button\"\n class=\"strct-pg__btn strct-pg__nav\"\n [disabled]=\"page() <= 1\"\n [attr.aria-label]=\"prevLabel()\"\n (click)=\"go(page() - 1)\"\n >\n <strct-icon name=\"chevronLeft\" [size]=\"13\" [strokeWidth]=\"1.7\" />\n </button>\n\n @for (token of pages(); track $index) {\n @if (token === 'dots') {\n <span class=\"strct-pg__dots\"><strct-icon name=\"ellipsis\" [size]=\"14\" /></span>\n } @else {\n <button\n type=\"button\"\n class=\"strct-pg__btn\"\n [class.strct-pg__btn--active]=\"token === page()\"\n [attr.aria-current]=\"token === page() ? 'page' : null\"\n (click)=\"go(token)\"\n >\n {{ token }}\n </button>\n }\n }\n\n <button\n type=\"button\"\n class=\"strct-pg__btn strct-pg__nav\"\n [disabled]=\"page() >= pageCount()\"\n [attr.aria-label]=\"nextLabel()\"\n (click)=\"go(page() + 1)\"\n >\n <strct-icon name=\"chevronRight\" [size]=\"13\" [strokeWidth]=\"1.7\" />\n </button>\n `,\n host: { class: 'strct-pg', role: 'navigation', '[attr.aria-label]': 'regionLabel()' },\n styles: [\n `\n .strct-pg {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n color: var(--t2);\n }\n .strct-pg__btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 30px;\n height: 30px;\n padding: 0 7px;\n border-radius: 6px;\n font-family: var(--font);\n font-size: 12px;\n cursor: pointer;\n color: var(--t2);\n background: transparent;\n border: 1px solid transparent;\n transition:\n background 0.14s ease,\n border-color 0.14s ease,\n color 0.14s ease;\n }\n .strct-pg__btn:hover {\n background: var(--bg-3);\n }\n .strct-pg__btn--active {\n color: var(--acc);\n border-color: var(--acc30);\n background: var(--acc-m);\n }\n .strct-pg__btn:disabled {\n color: var(--t4);\n cursor: not-allowed;\n background: transparent;\n }\n .strct-pg__nav {\n color: var(--t2);\n }\n .strct-pg__dots {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 24px;\n height: 30px;\n color: var(--t3);\n }\n `,\n ],\n})\nexport class StrctPagination {\n /** Accessible labels (localizable). */\n readonly prevLabel = input('Previous page');\n readonly nextLabel = input('Next page');\n readonly regionLabel = input('Pagination');\n\n /** Total number of items. */\n readonly total = input.required<number>();\n /** Rows per page (0 disables paging). */\n readonly pageSize = input(10);\n /** Current page (two-way). */\n readonly page = model(1);\n\n readonly pageCount = computed(() =>\n Math.max(1, Math.ceil(this.total() / Math.max(1, this.pageSize()))),\n );\n\n protected readonly pages = computed<PageToken[]>(() => {\n const count = this.pageCount();\n const current = this.page();\n if (count <= 7) {\n return Array.from({ length: count }, (_, i) => i + 1);\n }\n const tokens: PageToken[] = [1];\n const start = Math.max(2, current - 1);\n const end = Math.min(count - 1, current + 1);\n if (start > 2) tokens.push('dots');\n for (let p = start; p <= end; p++) tokens.push(p);\n if (end < count - 1) tokens.push('dots');\n tokens.push(count);\n return tokens;\n });\n\n go(target: number): void {\n const clamped = Math.max(1, Math.min(this.pageCount(), target));\n if (clamped !== this.page()) this.page.set(clamped);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n input,\n model,\n output,\n signal,\n} from '@angular/core';\nimport { StrctIcon } from '../icon/icon';\nimport { StrctRailStatus } from '../layout/rail';\n\n/** A leaf entry under a {@link StrctMenuSection}. */\nexport interface StrctMenuLink {\n /** Stable identity, matched against the menu's `activeId`. */\n id: string;\n label: string;\n /** Optional leading icon name. */\n icon?: string;\n disabled?: boolean;\n /** Trailing count/label chip (e.g. a deviation count). */\n badge?: string | number;\n /** Badge tone; defaults to `accent` (shared vocabulary with {@link StrctRailItem}). */\n badgeStatus?: StrctRailStatus;\n /** Small trailing status dot with no text (e.g. \"unsaved changes\"). */\n dot?: boolean;\n /** Dot tone; defaults to `accent`. */\n dotStatus?: StrctRailStatus;\n /** Muted trailing icon (e.g. \"restart required\"), before any badge / dot. */\n trailingIcon?: string;\n}\n\n/** A category (level 1) that groups {@link StrctMenuLink} items (level 2). */\nexport interface StrctMenuSection {\n label: string;\n /** Optional category icon (collapsible mode). */\n icon?: string;\n /** Initial expanded state in collapsible mode (defaults to expanded). */\n expanded?: boolean;\n items: StrctMenuLink[];\n}\n\n/**\n * A two-level navigation menu: categories (level 1) each holding a flat list of\n * items (level 2) — not a tree. Categories can be collapsible (chevrons) or\n * static section labels, and item/category icons can be hidden.\n *\n * <strct-section-menu [sections]=\"nav\" [(activeId)]=\"active\"\n * [collapsible]=\"true\" [showIcons]=\"true\"\n * (select)=\"go($event)\" />\n */\n@Component({\n selector: 'strct-section-menu',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon],\n template: `\n <nav class=\"strct-sm\" [attr.aria-label]=\"ariaLabel()\">\n @for (sec of sections(); track sec.label) {\n <div class=\"strct-sm__section\" [class.strct-sm__section--collapsible]=\"collapsible()\">\n @if (collapsible()) {\n <button\n type=\"button\"\n class=\"strct-sm__cat\"\n [attr.aria-expanded]=\"isOpen(sec)\"\n (click)=\"toggle(sec)\"\n >\n <span class=\"strct-sm__chevron\" [class.strct-sm__chevron--open]=\"isOpen(sec)\">\n <strct-icon name=\"chevronRight\" [size]=\"12\" [strokeWidth]=\"1.7\" />\n </span>\n @if (showIcons() && sec.icon) {\n <strct-icon\n class=\"strct-sm__cat-icon\"\n [name]=\"sec.icon\"\n [size]=\"16\"\n [strokeWidth]=\"1.4\"\n />\n }\n <span class=\"strct-sm__cat-label\">{{ sec.label }}</span>\n </button>\n } @else {\n <div class=\"strct-sm__cat-static\">{{ sec.label }}</div>\n }\n\n @if (isOpen(sec)) {\n <div class=\"strct-sm__items\" role=\"group\">\n @for (item of sec.items; track item.id) {\n <button\n type=\"button\"\n class=\"strct-sm__item\"\n [class.strct-sm__item--active]=\"item.id === activeId()\"\n [disabled]=\"item.disabled\"\n [attr.aria-current]=\"item.id === activeId() ? 'page' : null\"\n (click)=\"pick(item)\"\n >\n @if (showIcons() && item.icon) {\n <strct-icon\n class=\"strct-sm__item-icon\"\n [name]=\"item.icon\"\n [size]=\"16\"\n [strokeWidth]=\"1.4\"\n />\n }\n <span class=\"strct-sm__item-label\">{{ item.label }}</span>\n @if (item.trailingIcon) {\n <strct-icon\n class=\"strct-sm__trailing\"\n [name]=\"item.trailingIcon\"\n [size]=\"14\"\n [strokeWidth]=\"1.5\"\n />\n }\n @if (item.badge !== undefined && item.badge !== null && item.badge !== '') {\n <span\n class=\"strct-sm__badge strct-sm__badge--{{ item.badgeStatus ?? 'accent' }}\"\n >\n {{ item.badge }}\n </span>\n } @else if (item.dot) {\n <span\n class=\"strct-sm__dot strct-sm__dot--{{ item.dotStatus ?? 'accent' }}\"\n ></span>\n }\n </button>\n }\n </div>\n }\n </div>\n }\n </nav>\n `,\n host: { class: 'strct-sm-host' },\n styles: [\n `\n .strct-sm {\n display: flex;\n flex-direction: column;\n gap: 1px;\n }\n .strct-sm__section--collapsible + .strct-sm__section--collapsible {\n margin-top: 1px;\n }\n .strct-sm__cat {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 7px 9px;\n border: 0;\n border-radius: 6px;\n background: transparent;\n color: var(--t2);\n font-size: 13px;\n font-weight: 500;\n font-family: var(--font);\n cursor: pointer;\n text-align: start;\n transition:\n background 0.13s ease,\n color 0.13s ease;\n }\n .strct-sm__cat:hover {\n background: var(--bg-3);\n color: var(--t1);\n }\n .strct-sm__cat:focus-visible,\n .strct-sm__item:focus-visible {\n outline: 2px solid var(--acc50);\n outline-offset: -2px;\n }\n .strct-sm__chevron {\n display: inline-flex;\n color: var(--t3);\n flex-shrink: 0;\n transition: transform 0.15s ease;\n }\n .strct-sm__chevron--open {\n transform: rotate(90deg);\n }\n .strct-sm__cat-icon {\n color: var(--t3);\n flex-shrink: 0;\n }\n .strct-sm__cat-label {\n flex: 1;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n .strct-sm__cat-static {\n padding: 11px 10px 5px;\n font-size: 12px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--t3);\n }\n .strct-sm__items {\n display: flex;\n flex-direction: column;\n }\n .strct-sm__item {\n display: flex;\n align-items: center;\n gap: 9px;\n width: 100%;\n padding: 7px 10px;\n border: 0;\n border-radius: 6px;\n background: transparent;\n color: var(--t1);\n font-size: 13px;\n font-family: var(--font);\n cursor: pointer;\n text-align: start;\n transition: background 0.13s ease;\n }\n /* Indent level-2 items under a collapsible category. */\n .strct-sm__section--collapsible .strct-sm__item {\n padding-inline-start: 31px;\n }\n .strct-sm__item:hover:not(:disabled) {\n background: var(--bg-3);\n }\n .strct-sm__item--active {\n background: var(--acc-m);\n color: var(--acc);\n font-weight: 500;\n }\n .strct-sm__item--active .strct-sm__item-icon {\n color: var(--acc);\n }\n .strct-sm__item:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .strct-sm__item-icon {\n color: var(--t2);\n flex-shrink: 0;\n }\n .strct-sm__item-label {\n flex: 1;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n /* Trailing cues: muted icon, count chip, status dot — same vocabulary as\n the rail, so the two nav objects stay consistent. */\n .strct-sm__trailing {\n flex-shrink: 0;\n color: var(--t3);\n }\n .strct-sm__badge {\n flex-shrink: 0;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n font-weight: 600;\n line-height: 1;\n border-radius: 9px;\n font-variant-numeric: tabular-nums;\n }\n .strct-sm__badge--accent {\n background: var(--acc-m);\n color: var(--acc);\n }\n .strct-sm__badge--success {\n background: var(--success-bg);\n color: var(--success);\n }\n .strct-sm__badge--warning {\n background: var(--warning-bg);\n color: var(--warning);\n }\n .strct-sm__badge--critical {\n background: var(--critical-bg);\n color: var(--critical);\n }\n .strct-sm__dot {\n flex-shrink: 0;\n width: 7px;\n height: 7px;\n border-radius: 50%;\n }\n .strct-sm__dot--accent {\n background: var(--acc);\n }\n .strct-sm__dot--success {\n background: var(--success);\n }\n .strct-sm__dot--warning {\n background: var(--warning);\n }\n .strct-sm__dot--critical {\n background: var(--critical);\n }\n `,\n ],\n})\nexport class StrctSectionMenu {\n /** Categories with their items (max two levels). */\n readonly sections = input.required<StrctMenuSection[]>();\n /** Active item id (two-way). */\n readonly activeId = model<string | null>(null);\n /** Categories collapse via a chevron; `false` renders static section labels. */\n readonly collapsible = input(true, { transform: booleanAttribute });\n /** Show category / item icons. */\n readonly showIcons = input(true, { transform: booleanAttribute });\n /** Accessible label for the nav landmark. */\n readonly ariaLabel = input('Sections');\n /** Emitted when an item is chosen. */\n readonly select = output<StrctMenuLink>();\n\n /** Per-section open overrides (keyed by label); absent ⇒ use `expanded`. */\n private readonly overrides = signal<Map<string, boolean>>(new Map());\n\n protected isOpen(sec: StrctMenuSection): boolean {\n if (!this.collapsible()) return true;\n return this.overrides().get(sec.label) ?? sec.expanded !== false;\n }\n\n protected toggle(sec: StrctMenuSection): void {\n const open = this.isOpen(sec);\n const next = new Map(this.overrides());\n next.set(sec.label, !open);\n this.overrides.set(next);\n }\n\n protected pick(item: StrctMenuLink): void {\n if (item.disabled) return;\n this.activeId.set(item.id);\n this.select.emit(item);\n }\n}\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';\n\n/**\n * Inline keyboard-key chip: `<strct-kbd>⌘K</strct-kbd>`. Used for shortcut hints\n * in menus, tooltips and the command palette.\n */\n@Component({\n selector: 'strct-kbd',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `<kbd class=\"strct-kbd__key\"><ng-content /></kbd>`,\n host: { class: 'strct-kbd' },\n styles: [\n `\n .strct-kbd {\n display: inline-flex;\n }\n .strct-kbd__key {\n font-size: 12px;\n line-height: 1;\n padding: 3px 6px;\n border: 1px solid var(--b2);\n border-bottom-width: 2px;\n border-radius: 4px;\n color: var(--t3);\n background: var(--bg-2);\n font-family: var(--mono);\n white-space: nowrap;\n }\n `,\n ],\n})\nexport class StrctKbd {}\n","import {\n DOCUMENT,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n effect,\n inject,\n input,\n model,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { StrctIcon } from '../icon/icon';\nimport { StrctKbd } from '../kbd/kbd';\n\nlet paletteCounter = 0;\n\n/** One searchable command in the palette. */\nexport interface StrctCommandItem {\n /** Stable key; returned with (picked). */\n id: string;\n label: string;\n /** Right-aligned group tag (e.g. a category or section name). */\n group?: string;\n /** Leading icon name (StrctIcon set). */\n icon?: string;\n /** Right-aligned shortcut hint, rendered as a key chip. */\n hint?: string;\n /** Extra search terms beyond label/group. */\n keywords?: string[];\n /** Arbitrary payload carried back with (picked). */\n data?: unknown;\n}\n\n/**\n * ⌘/Ctrl-K command palette — a spotlight search over app commands or pages.\n * Mount once near the app root, feed it `items`, and act on `(picked)`:\n *\n * <strct-command-palette [items]=\"commands\" [(open)]=\"paletteOpen\"\n * (picked)=\"run($event)\" />\n *\n * Opens via the two-way `open` model or the built-in ⌘/Ctrl-K hotkey\n * (`hotkey` input). Implements the ARIA combobox/listbox pattern: arrow keys\n * move the active option, Enter picks, Escape closes; focus returns to the\n * previously focused element on close.\n */\n@Component({\n selector: 'strct-command-palette',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon, StrctKbd],\n host: { '(document:keydown)': 'onGlobalKey($event)' },\n template: `\n @if (open()) {\n <!-- Backdrop: pointer-only dismiss (Escape covers keyboard). -->\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n <div class=\"strct-cmdp__backdrop\" (click)=\"close()\">\n <div\n class=\"strct-cmdp\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-label]=\"placeholder()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"onKey($event)\"\n >\n <div class=\"strct-cmdp__search\">\n <strct-icon name=\"search\" [size]=\"16\" />\n <input\n #input\n class=\"strct-cmdp__input\"\n type=\"text\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-expanded=\"true\"\n [attr.aria-controls]=\"listId\"\n [attr.aria-activedescendant]=\"filtered().length ? optionId(activeIndex()) : null\"\n [placeholder]=\"placeholder()\"\n [value]=\"query()\"\n (input)=\"onType($event)\"\n />\n <strct-kbd>Esc</strct-kbd>\n </div>\n <div class=\"strct-cmdp__list\" role=\"listbox\" [id]=\"listId\">\n @for (item of filtered(); track item.id; let i = $index) {\n <button\n type=\"button\"\n class=\"strct-cmdp__item\"\n role=\"option\"\n [id]=\"optionId(i)\"\n [attr.aria-selected]=\"i === activeIndex()\"\n [class.is-active]=\"i === activeIndex()\"\n tabindex=\"-1\"\n (click)=\"pick(item)\"\n (mousemove)=\"activeIndex.set(i)\"\n >\n @if (item.icon) {\n <strct-icon\n class=\"strct-cmdp__icon\"\n [name]=\"item.icon\"\n [size]=\"16\"\n [strokeWidth]=\"1.4\"\n />\n }\n <span class=\"strct-cmdp__label\">{{ item.label }}</span>\n @if (item.hint) {\n <strct-kbd>{{ item.hint }}</strct-kbd>\n }\n @if (item.group) {\n <span class=\"strct-cmdp__group\">{{ item.group }}</span>\n }\n </button>\n } @empty {\n <div class=\"strct-cmdp__empty\">{{ emptyText() }} “{{ query() }}”</div>\n }\n </div>\n </div>\n </div>\n }\n `,\n styles: [\n `\n .strct-cmdp__backdrop {\n position: fixed;\n inset: 0;\n z-index: 1200;\n display: flex;\n justify-content: center;\n align-items: flex-start;\n padding: 14vh 16px 16px;\n background: rgba(0, 0, 0, 0.5);\n backdrop-filter: blur(2px);\n animation: strct-cmdp-fade 0.12s ease;\n }\n .strct-cmdp {\n width: 100%;\n max-width: 560px;\n max-height: 60vh;\n display: flex;\n flex-direction: column;\n background: var(--bg-1);\n border: 1px solid var(--b2);\n border-radius: var(--radius-xl);\n box-shadow: var(--shadow-floating);\n overflow: hidden;\n animation: strct-cmdp-rise 0.14s ease;\n }\n .strct-cmdp__search {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 13px 16px;\n border-bottom: 1px solid var(--b1);\n color: var(--t3);\n }\n .strct-cmdp__input {\n flex: 1;\n min-width: 0;\n border: 0;\n background: transparent;\n color: var(--t1);\n font-size: 15px;\n font-family: var(--font);\n outline: none;\n }\n .strct-cmdp__list {\n overflow-y: auto;\n padding: 6px;\n }\n .strct-cmdp__item {\n display: flex;\n align-items: center;\n gap: 11px;\n width: 100%;\n padding: 9px 11px;\n border: 0;\n border-radius: var(--radius-md);\n background: transparent;\n cursor: pointer;\n text-align: start;\n font-family: var(--font);\n }\n .strct-cmdp__item.is-active {\n background: var(--acc-m);\n }\n .strct-cmdp__icon {\n color: var(--t2);\n flex-shrink: 0;\n }\n .strct-cmdp__item.is-active .strct-cmdp__icon {\n color: var(--acc);\n }\n .strct-cmdp__label {\n flex: 1;\n min-width: 0;\n font-size: var(--text-lg);\n color: var(--t1);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n .strct-cmdp__group {\n font-size: var(--text-sm);\n color: var(--t3);\n flex-shrink: 0;\n }\n .strct-cmdp__empty {\n padding: 20px;\n text-align: center;\n font-size: var(--text-md);\n color: var(--t3);\n }\n @keyframes strct-cmdp-fade {\n from {\n opacity: 0;\n }\n }\n @keyframes strct-cmdp-rise {\n from {\n opacity: 0;\n transform: translateY(-8px);\n }\n }\n @media (prefers-reduced-motion: reduce) {\n .strct-cmdp__backdrop,\n .strct-cmdp {\n animation: none;\n }\n }\n `,\n ],\n})\nexport class StrctCommandPalette {\n private readonly doc = inject(DOCUMENT);\n private readonly inputRef = viewChild<ElementRef<HTMLInputElement>>('input');\n\n /** Searchable commands. */\n readonly items = input<StrctCommandItem[]>([]);\n /** Whether the palette is open (two-way). */\n readonly open = model(false);\n /** Enable the built-in ⌘/Ctrl-K toggle. */\n readonly hotkey = input(true, { transform: booleanAttribute });\n /** Search input placeholder / dialog name (localizable). */\n readonly placeholder = input('Type a command or search…');\n /** Empty-result message prefix (localizable). */\n readonly emptyText = input('No matches for');\n /** Maximum rendered results. */\n readonly maxResults = input(50);\n /** Emitted when a command is chosen (Enter or click); the palette closes. */\n readonly picked = output<StrctCommandItem>();\n\n protected readonly query = signal('');\n protected readonly activeIndex = signal(0);\n protected readonly listId = `strct-cmdp-list-${++paletteCounter}`;\n private previousActive: HTMLElement | null = null;\n\n protected optionId(i: number): string {\n return `${this.listId}-opt-${i}`;\n }\n\n /** Rank: label prefix > word-start > substring; group/keyword matches last. */\n protected readonly filtered = computed(() => {\n const q = this.query().trim().toLowerCase();\n const items = this.items();\n if (!q) return items.slice(0, this.maxResults());\n const scored: { item: StrctCommandItem; score: number }[] = [];\n for (const item of items) {\n const label = item.label.toLowerCase();\n const hay = [item.group ?? '', ...(item.keywords ?? [])].join(' ').toLowerCase();\n let score = -1;\n if (label.startsWith(q)) score = 0;\n else if (label.split(/\\s+/).some((w) => w.startsWith(q))) score = 1;\n else if (label.includes(q)) score = 2;\n else if (hay.includes(q)) score = 3;\n if (score >= 0) scored.push({ item, score });\n }\n return scored\n .sort((a, b) => a.score - b.score)\n .slice(0, this.maxResults())\n .map((s) => s.item);\n });\n\n constructor() {\n // Focus the input on open; restore focus on close.\n effect(() => {\n if (this.open()) {\n this.previousActive = this.doc.activeElement as HTMLElement | null;\n this.query.set('');\n this.activeIndex.set(0);\n setTimeout(() => this.inputRef()?.nativeElement.focus());\n } else if (this.previousActive) {\n this.previousActive.focus?.();\n this.previousActive = null;\n }\n });\n }\n\n /** ⌘/Ctrl-K toggle + global Escape while open. */\n protected onGlobalKey(event: KeyboardEvent): void {\n if (this.hotkey() && (event.metaKey || event.ctrlKey) && event.key.toLowerCase() === 'k') {\n event.preventDefault();\n this.open.update((v) => !v);\n } else if (event.key === 'Escape' && this.open()) {\n this.close();\n }\n }\n\n protected onType(event: Event): void {\n this.query.set((event.target as HTMLInputElement).value);\n this.activeIndex.set(0);\n }\n\n protected onKey(event: KeyboardEvent): void {\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.move(1);\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.move(-1);\n break;\n case 'Home':\n event.preventDefault();\n this.activeIndex.set(0);\n break;\n case 'End':\n event.preventDefault();\n this.activeIndex.set(Math.max(0, this.filtered().length - 1));\n break;\n case 'Enter': {\n event.preventDefault();\n const item = this.filtered()[this.activeIndex()];\n if (item) this.pick(item);\n break;\n }\n }\n }\n\n private move(delta: number): void {\n const n = this.filtered().length;\n if (!n) return;\n const next = (this.activeIndex() + delta + n) % n;\n this.activeIndex.set(next);\n this.doc.getElementById(this.optionId(next))?.scrollIntoView?.({ block: 'nearest' });\n }\n\n protected pick(item: StrctCommandItem): void {\n this.close();\n this.picked.emit(item);\n }\n\n protected close(): void {\n this.open.set(false);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n input,\n} from '@angular/core';\nimport { StrctIcon } from '../icon/icon';\nimport { StrctSpinner } from '../spinner/spinner';\n\n/** Lifecycle of an async (or deferred) validation check. */\nexport type StrctValidationStatus = 'idle' | 'checking' | 'ok' | 'warning' | 'error';\n\n/**\n * A first-class \"validating… → ok / warning / error (reason)\" model, so apps stop\n * composing a spinner + badge by hand (e.g. live reachability checks while typing).\n * Consumed by `StrctField`'s `validationState` input and the `[strctCellStatus]`\n * datagrid-cell helper.\n */\nexport interface StrctValidationState {\n status: StrctValidationStatus;\n /** Optional human-readable reason, shown beside the affordance / in the hint slot. */\n message?: string;\n}\n\n/** Tone class suffix per validation status (used by field + cell helper styles). */\nexport function strctValidationTone(status: StrctValidationStatus): string {\n return status;\n}\n\n/** Leading icon name per (non-checking) validation status; '' for idle/checking. */\nexport function strctValidationIcon(status: StrctValidationStatus): string {\n switch (status) {\n case 'ok':\n return 'success';\n case 'warning':\n return 'warning';\n case 'error':\n return 'critical';\n default:\n return '';\n }\n}\n\n/**\n * Renders the shared \"checking / ok / warning / error (reason)\" affordance from a\n * small `StrctValidationState` model — a spinner while checking, then an icon and\n * an optional message. Drop it into a `StrctDatagrid` cell template for\n * list-building flows, as an element or an attribute:\n *\n * <strct-cell-status [state]=\"probe(row)\" />\n * <span strct-cell-status [state]=\"probe(row)\"></span>\n */\n@Component({\n selector: 'strct-cell-status, [strct-cell-status]',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon, StrctSpinner],\n template: `\n @if (state().status !== 'idle') {\n <span class=\"strct-vstate strct-vstate--{{ state().status }}\">\n @if (state().status === 'checking') {\n <strct-spinner size=\"sm\" />\n } @else if (icon()) {\n <strct-icon [name]=\"icon()\" [size]=\"16\" />\n }\n @if (state().message) {\n <span class=\"strct-vstate__msg\" aria-live=\"polite\">{{ state().message }}</span>\n }\n </span>\n }\n `,\n styles: [\n `\n .strct-vstate {\n display: inline-flex;\n align-items: center;\n gap: var(--space-1);\n font-size: var(--text-sm);\n line-height: 1;\n color: var(--t3);\n }\n .strct-vstate strct-icon {\n flex-shrink: 0;\n }\n .strct-vstate--ok {\n color: var(--success);\n }\n .strct-vstate--warning {\n color: var(--warning);\n }\n .strct-vstate--error {\n color: var(--critical);\n }\n .strct-vstate__msg {\n color: var(--t2);\n }\n `,\n ],\n})\nexport class StrctCellStatus {\n /** The validation state to render. */\n readonly state = input.required<StrctValidationState>();\n protected readonly icon = computed(() => strctValidationIcon(this.state().status));\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n afterNextRender,\n booleanAttribute,\n computed,\n effect,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { StrctIcon } from '../icon/icon';\nimport { StrctSpinner } from '../spinner/spinner';\nimport { StrctValidationState, strctValidationIcon } from '../validation/validation';\n\nlet fieldCounter = 0;\n\n/**\n * Form-field wrapper: a label (with optional required marker), the projected\n * control, and a hint or error message. It auto-links the control via\n * `aria-describedby` and sets `aria-invalid` when an error is present.\n *\n * <strct-field label=\"Email\" required hint=\"We never share it.\" [error]=\"emailError()\">\n * <input strctInput type=\"email\" [(ngModel)]=\"email\" />\n * </strct-field>\n */\n@Component({\n selector: 'strct-field',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon, StrctSpinner],\n template: `\n @if (label()) {\n <label class=\"strct-field__label\" [attr.for]=\"controlId() || null\">\n {{ label() }}\n @if (required()) {\n <span class=\"strct-field__req\" aria-hidden=\"true\">*</span>\n }\n </label>\n }\n <div class=\"strct-field__control\">\n <ng-content />\n @if (stateActive()) {\n <span class=\"strct-field__adorn strct-field__adorn--{{ stateStatus() }}\" aria-hidden=\"true\">\n @if (stateStatus() === 'checking') {\n <strct-spinner size=\"sm\" />\n } @else if (stateIcon()) {\n <strct-icon [name]=\"stateIcon()\" [size]=\"16\" />\n }\n </span>\n }\n </div>\n @if (errorText()) {\n <div class=\"strct-field__msg strct-field__msg--error\" [id]=\"errorId\" role=\"alert\">\n {{ errorText() }}\n </div>\n } @else if (stateMessage()) {\n <div\n class=\"strct-field__msg strct-field__msg--{{ stateStatus() }}\"\n [id]=\"hintId\"\n [attr.role]=\"stateStatus() === 'error' ? 'alert' : null\"\n aria-live=\"polite\"\n >\n {{ stateMessage() }}\n </div>\n } @else if (hint()) {\n <div class=\"strct-field__msg strct-field__msg--hint\" [id]=\"hintId\">{{ hint() }}</div>\n }\n `,\n host: {\n class: 'strct-field',\n '[class.strct-field--invalid]': 'isInvalid()',\n '[class.strct-field--validating]': 'stateActive()',\n },\n styles: [\n `\n .strct-field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n .strct-field__label {\n font-size: 12px;\n font-weight: 600;\n color: var(--t2);\n }\n .strct-field__req {\n color: var(--critical);\n margin-inline-start: 2px;\n }\n .strct-field__control {\n position: relative;\n display: flex;\n flex-direction: column;\n }\n /* Trailing validation adornment, vertically centred on a single-line control. */\n .strct-field__adorn {\n position: absolute;\n top: 50%;\n right: 10px;\n transform: translateY(-50%);\n display: inline-flex;\n align-items: center;\n pointer-events: none;\n }\n .strct-field__adorn--ok {\n color: var(--success);\n }\n .strct-field__adorn--warning {\n color: var(--warning);\n }\n .strct-field__adorn--error {\n color: var(--critical);\n }\n /* Make room for the adornment so it never overlaps the text. */\n .strct-field--validating .strct-control {\n padding-inline-end: 32px;\n }\n .strct-field__msg {\n font-size: 12px;\n line-height: 1.4;\n }\n .strct-field__msg--hint,\n .strct-field__msg--checking {\n color: var(--t3);\n }\n .strct-field__msg--ok {\n color: var(--success);\n }\n .strct-field__msg--warning {\n color: var(--warning);\n }\n .strct-field__msg--error {\n color: var(--critical);\n }\n `,\n ],\n})\nexport class StrctField {\n /** Label text. */\n readonly label = input('');\n /** Show a required marker on the label. */\n readonly required = input(false, { transform: booleanAttribute });\n /** Helper text shown below the field. */\n readonly hint = input('');\n /** Error message (string or first-of array); falsy clears the error state. */\n readonly error = input<string | string[] | null | undefined>(null);\n /**\n * Async-validation state rendered as a trailing adornment (spinner / check /\n * warning) plus its message in the hint/error slot — so apps stop composing a\n * spinner + badge by hand for live \"checking… → ok / warning / error\" checks.\n */\n readonly validationState = input<StrctValidationState | null>(null);\n\n private readonly host: ElementRef<HTMLElement> = inject(ElementRef);\n private readonly n = ++fieldCounter;\n protected readonly hintId = `strct-field-hint-${this.n}`;\n protected readonly errorId = `strct-field-err-${this.n}`;\n protected readonly controlId = signal('');\n\n protected readonly errorText = computed(() => {\n const e = this.error();\n return (Array.isArray(e) ? e[0] : e) ?? '';\n });\n\n /** Effective validation status ('idle' when no state supplied). */\n protected readonly stateStatus = computed(() => this.validationState()?.status ?? 'idle');\n /** Whether to show the trailing adornment (an explicit error suppresses it). */\n protected readonly stateActive = computed(\n () => !this.errorText() && this.stateStatus() !== 'idle',\n );\n protected readonly stateIcon = computed(() => strctValidationIcon(this.stateStatus()));\n /** Validation message, shown only when there is no explicit error. */\n protected readonly stateMessage = computed(() =>\n this.errorText() ? '' : (this.validationState()?.message ?? ''),\n );\n /** Invalid when an explicit error is set or the validation state is 'error'. */\n protected readonly isInvalid = computed(\n () => !!this.errorText() || this.stateStatus() === 'error',\n );\n\n constructor() {\n afterNextRender(() => this.link());\n // Keep aria in sync as the error / hint / validation state change.\n effect(() => {\n this.errorText();\n this.hint();\n this.stateStatus();\n this.stateMessage();\n this.applyAria();\n });\n }\n\n private control(): HTMLElement | null {\n return this.host.nativeElement.querySelector<HTMLElement>(\n 'input, select, textarea, [strctInput], [strctField]',\n );\n }\n\n private link(): void {\n const el = this.control();\n if (!el) return;\n if (!el.id) el.id = `strct-field-ctrl-${this.n}`;\n this.controlId.set(el.id);\n this.applyAria();\n }\n\n private applyAria(): void {\n const el = this.control();\n if (!el) return;\n const describedBy = this.errorText()\n ? this.errorId\n : this.stateMessage() || this.hint()\n ? this.hintId\n : '';\n if (describedBy) el.setAttribute('aria-describedby', describedBy);\n else el.removeAttribute('aria-describedby');\n if (this.isInvalid()) el.setAttribute('aria-invalid', 'true');\n else el.removeAttribute('aria-invalid');\n }\n}\n","import { Directive } from '@angular/core';\n\n/**\n * Applies the shared `.strct-control` look to a native input / textarea / select.\n * <input strctInput placeholder=\"Name\" />\n * <select strctInput>…</select>\n * The visual definition lives in `strct/styles/_forms.scss` (shipped via the\n * theme entry point), so this directive only attaches the class.\n */\n@Directive({\n selector: 'input[strctInput], textarea[strctInput], select[strctInput]',\n host: { class: 'strct-control' },\n})\nexport class StrctInput {}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n effect,\n forwardRef,\n input,\n model,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { StrctIcon } from '../icon/icon';\n\n/** Checkbox with custom box. Works with `[(ngModel)]` / reactive forms. */\n@Component({\n selector: 'strct-checkbox',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [StrctIcon],\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => StrctCheckbox), multi: true },\n ],\n template: `\n <label class=\"strct-cb\" [class.strct-cb--disabled]=\"isDisabled()\">\n <input\n type=\"checkbox\"\n class=\"strct-cb__native\"\n [checked]=\"checked()\"\n [disabled]=\"isDisabled()\"\n [indeterminate]=\"indeterminate()\"\n [attr.aria-label]=\"ariaLabel()\"\n (change)=\"onToggle($event)\"\n (blur)=\"onTouched()\"\n />\n <span class=\"strct-cb__box\">\n <strct-icon name=\"check\" [size]=\"11\" [strokeWidth]=\"2\" />\n </span>\n <span class=\"strct-cb__label\"><ng-content /></span>\n </label>\n `,\n styles: [\n `\n .strct-cb {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n font-size: 13px;\n color: var(--t1);\n user-select: none;\n }\n .strct-cb--disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .strct-cb__native {\n position: absolute;\n opacity: 0;\n width: 0;\n height: 0;\n }\n .strct-cb__box {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 17px;\n height: 17px;\n border-radius: 4px;\n flex-shrink: 0;\n background: var(--bg-2);\n border: 1px solid var(--b3);\n color: transparent;\n transition:\n background 0.14s ease,\n border-color 0.14s ease;\n }\n .strct-cb__native:checked + .strct-cb__box {\n background: var(--acc);\n border-color: transparent;\n color: var(--inv);\n }\n .strct-cb__native:focus-visible + .strct-cb__box {\n box-shadow: 0 0 0 3px var(--acc18);\n }\n `,\n ],\n})\nexport class StrctCheckbox implements ControlValueAccessor {\n readonly checked = model(false);\n readonly isDisabled = model(false);\n /** Static disable; forms' setDisabledState also drives the disabled state. */\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Tri-state visual indicator for a parent / intermediate state. */\n readonly indeterminate = input(false, { transform: booleanAttribute });\n /** Accessible label for the checkbox (used when no text label is present). */\n readonly ariaLabel = input<string | null>(null);\n\n private onChange: (value: boolean) => void = () => {};\n protected onTouched: () => void = () => {};\n\n constructor() {\n effect(() => this.isDisabled.set(this.disabled()));\n }\n\n onToggle(event: Event): void {\n const value = (event.target as HTMLInputElement).checked;\n this.checked.set(value);\n this.onChange(value);\n }\n\n writeValue(value: boolean): void {\n this.checked.set(!!value);\n }\n registerOnChange(fn: (value: boolean) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n effect,\n forwardRef,\n input,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n/** On/off switch. Works with `[(ngModel)]` / reactive forms. */\n@Component({\n selector: 'strct-toggle',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => StrctToggle), multi: true },\n ],\n template: `\n <label class=\"strct-tg\" [class.strct-tg--disabled]=\"isDisabled()\">\n <input\n type=\"checkbox\"\n class=\"strct-tg__native\"\n role=\"switch\"\n [checked]=\"checked()\"\n [disabled]=\"isDisabled()\"\n (change)=\"onToggle($event)\"\n (blur)=\"onTouched()\"\n />\n <span class=\"strct-tg__track\"><span class=\"strct-tg__thumb\"></span></span>\n <span class=\"strct-tg__label\"><ng-content /></span>\n </label>\n `,\n styles: [\n `\n .strct-tg {\n display: inline-flex;\n align-items: center;\n gap: 9px;\n cursor: pointer;\n font-size: 13px;\n color: var(--t1);\n user-select: none;\n }\n .strct-tg--disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .strct-tg__native {\n position: absolute;\n opacity: 0;\n width: 0;\n height: 0;\n }\n .strct-tg__track {\n position: relative;\n width: 34px;\n height: 19px;\n border-radius: 11px;\n flex-shrink: 0;\n background: var(--bg-3);\n border: 1px solid var(--b3);\n transition:\n background 0.16s ease,\n border-color 0.16s ease;\n }\n .strct-tg__thumb {\n position: absolute;\n top: 2px;\n left: 2px;\n width: 13px;\n height: 13px;\n border-radius: 50%;\n background: var(--t2);\n transition:\n transform 0.16s ease,\n background 0.16s ease;\n }\n .strct-tg__native:checked + .strct-tg__track {\n background: var(--acc);\n border-color: transparent;\n }\n .strct-tg__native:checked + .strct-tg__track .strct-tg__thumb {\n transform: translateX(15px);\n background: var(--inv);\n }\n /* RTL: the thumb travels toward the inline-end, i.e. to the left.\n (:host-context because this component uses emulated encapsulation.) */\n :host-context([dir='rtl']) .strct-tg__native:checked + .strct-tg__track .strct-tg__thumb {\n transform: translateX(-15px);\n }\n .strct-tg__native:focus-visible + .strct-tg__track {\n box-shadow: 0 0 0 3px var(--acc18);\n }\n `,\n ],\n})\nexport class StrctToggle implements ControlValueAccessor {\n readonly checked = signal(false);\n readonly isDisabled = signal(false);\n /** Static disable; forms' setDisabledState also drives the disabled state. */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n private onChange: (value: boolean) => void = () => {};\n protected onTouched: () => void = () => {};\n\n constructor() {\n effect(() => this.isDisabled.set(this.disabled()));\n }\n\n onToggle(event: Event): void {\n const value = (event.target as HTMLInputElement).checked;\n this.checked.set(value);\n this.onChange(value);\n }\n\n writeValue(value: boolean): void {\n this.checked.set(!!value);\n }\n registerOnChange(fn: (value: boolean) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n forwardRef,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nlet groupCounter = 0;\n\n/**\n * Radio group (the form control). Wrap `<strct-radio>` items:\n * <strct-radio-group [(ngModel)]=\"size\">\n * <strct-radio [value]=\"'sm'\">Small</strct-radio>\n * <strct-radio [value]=\"'lg'\">Large</strct-radio>\n * </strct-radio-group>\n */\n@Component({\n selector: 'strct-radio-group',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => StrctRadioGroup), multi: true },\n ],\n template: `<ng-content />`,\n host: { class: 'strct-radio-group', role: 'radiogroup' },\n styles: [\n `\n .strct-radio-group {\n display: flex;\n flex-direction: column;\n gap: 9px;\n }\n `,\n ],\n})\nexport class StrctRadioGroup implements ControlValueAccessor {\n readonly name = `strct-radio-${++groupCounter}`;\n readonly value = signal<unknown>(null);\n readonly isDisabled = signal(false);\n\n private onChange: (value: unknown) => void = () => {};\n private onTouched: () => void = () => {};\n\n select(value: unknown): void {\n this.value.set(value);\n this.onChange(value);\n this.onTouched();\n }\n\n writeValue(value: unknown): void {\n this.value.set(value);\n }\n registerOnChange(fn: (value: unknown) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n}\n\n/** One option inside a `<strct-radio-group>`. */\n@Component({\n selector: 'strct-radio',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <label class=\"strct-rb\" [class.strct-rb--disabled]=\"disabled() || group.isDisabled()\">\n <input\n type=\"radio\"\n class=\"strct-rb__native\"\n [name]=\"group.name\"\n [checked]=\"group.value() === value()\"\n [disabled]=\"disabled() || group.isDisabled()\"\n (change)=\"group.select(value())\"\n />\n <span class=\"strct-rb__dot\"></span>\n <span class=\"strct-rb__label\"><ng-content /></span>\n </label>\n `,\n styles: [\n `\n .strct-rb {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n font-size: 13px;\n color: var(--t1);\n user-select: none;\n }\n .strct-rb--disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .strct-rb__native {\n position: absolute;\n opacity: 0;\n width: 0;\n height: 0;\n }\n .strct-rb__dot {\n position: relative;\n width: 17px;\n height: 17px;\n border-radius: 50%;\n flex-shrink: 0;\n background: var(--bg-2);\n border: 1px solid var(--b3);\n transition: border-color 0.14s ease;\n }\n .strct-rb__dot::after {\n content: '';\n position: absolute;\n inset: 0;\n margin: auto;\n width: 7px;\n height: 7px;\n border-radius: 50%;\n background: var(--acc);\n transform: scale(0);\n transition: transform 0.14s ease;\n }\n .strct-rb__native:checked + .strct-rb__dot {\n border-color: var(--acc);\n }\n .strct-rb__native:checked + .strct-rb__dot::after {\n transform: scale(1);\n }\n .strct-rb__native:focus-visible + .strct-rb__dot {\n box-shadow: 0 0 0 3px var(--acc18);\n }\n `,\n ],\n})\nexport class StrctRadio {\n /** Current value. */\n readonly value = input.required<unknown>();\n /** Static disable flag. */\n readonly disabled = input(false, { transform: booleanAttribute });\n protected readonly group = inject(StrctRadioGroup);\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n effect,\n forwardRef,\n input,\n signal,\n viewChildren,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { StrctIcon } from '../icon/icon';\n\n/** One segment of a `StrctSegmented`. */\nexport interface StrctSegmentedOption {\n value: unknown;\n label: string;\n /** Optional leading icon name (StrctIcon set). */\n icon?: string;\n /** Disable just this segment. */\n disabled?: boolean;\n}\n\n/** Segment size. */\nexport type StrctSegmentedSize = 'sm' | 'md';\n\n/**\n * One-of-N selection rendered as a joined segmented control with managed\n * selected state — distinct from `StrctTabs` (panel switching) and\n * `StrctButtonGroup` (a visual cluster only). For mode pickers and list filters.\n * CVA-compatible, so `formControlName` and `[(ngModel)]` both work.\n *\n * <strct-segmented\n * [options]=\"[{ value: 'all', label: 'All' }, { value: 'active', label: 'Active' }]\"\n * [(ngModel)]=\"filter\" size=\"sm\" />\n */\n@Component({\n selector: 'strct-segmented',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon],\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => StrctSegmented), multi: true },\n ],\n template: `\n @for (opt of options(); track opt.value; let i = $index) {\n <button\n #seg\n type=\"button\"\n role=\"radio\"\n class=\"strct-seg__opt\"\n [class.strct-seg__opt--selected]=\"isSelected(opt)\"\n [attr.aria-checked]=\"isSelected(opt)\"\n [attr.tabindex]=\"rovingIndex(opt, i)\"\n [disabled]=\"opt.disabled || isDisabled()\"\n (click)=\"select(opt)\"\n (blur)=\"onTouched()\"\n >\n @if (opt.icon) {\n <strct-icon [name]=\"opt.icon\" [size]=\"16\" />\n }\n <span>{{ opt.label }}</span>\n </button>\n }\n `,\n host: {\n class: 'strct-seg',\n role: 'radiogroup',\n '[class.strct-seg--sm]': \"size() === 'sm'\",\n '[class.strct-seg--block]': 'block()',\n '[class.strct-seg--disabled]': 'isDisabled()',\n '(keydown)': 'onKeydown($event)',\n },\n styles: [\n `\n .strct-seg {\n display: inline-flex;\n gap: 2px;\n padding: 2px;\n background: var(--bg-2);\n border: 1px solid var(--b2);\n border-radius: var(--radius-md);\n max-width: 100%;\n }\n .strct-seg--block {\n display: flex;\n width: 100%;\n }\n .strct-seg__opt {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--space-1);\n flex: 1 1 auto;\n padding: 6px 14px;\n border: 0;\n border-radius: calc(var(--radius-md) - 2px);\n background: transparent;\n color: var(--t2);\n font-family: var(--font);\n font-size: 13px;\n font-weight: 500;\n line-height: 1;\n white-space: nowrap;\n cursor: pointer;\n transition:\n background 0.14s ease,\n color 0.14s ease;\n }\n .strct-seg--sm .strct-seg__opt {\n padding: 4px 10px;\n font-size: 12px;\n }\n .strct-seg__opt:hover:not(:disabled):not(.strct-seg__opt--selected) {\n color: var(--t1);\n }\n .strct-seg__opt--selected {\n background: var(--bg-a);\n color: var(--t1);\n font-weight: 600;\n box-shadow: var(--sh);\n }\n .strct-seg__opt:focus-visible {\n outline: none;\n box-shadow: 0 0 0 2px var(--acc50);\n }\n .strct-seg__opt:disabled {\n opacity: var(--disabled-opacity);\n cursor: not-allowed;\n }\n .strct-seg--disabled {\n opacity: var(--disabled-opacity);\n }\n .strct-seg--disabled .strct-seg__opt {\n cursor: not-allowed;\n }\n `,\n ],\n})\nexport class StrctSegmented implements ControlValueAccessor {\n /** The selectable segments. */\n readonly options = input<StrctSegmentedOption[]>([]);\n /** Segment size. */\n readonly size = input<StrctSegmentedSize>('md');\n /** Stretch to the full width of the container. */\n readonly block = input(false, { transform: booleanAttribute });\n /** Static disable; forms' setDisabledState also drives the disabled state. */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n readonly value = signal<unknown>(null);\n readonly isDisabled = signal(false);\n private readonly segs = viewChildren('seg', { read: ElementRef });\n\n private onChange: (value: unknown) => void = () => {};\n protected onTouched: () => void = () => {};\n\n constructor() {\n effect(() => this.isDisabled.set(this.disabled()));\n }\n\n protected isSelected(opt: StrctSegmentedOption): boolean {\n return this.value() === opt.value;\n }\n\n /** Index of the currently selected (or first enabled) option for roving focus. */\n private readonly activeIndex = computed(() => {\n const opts = this.options();\n const selected = opts.findIndex((o) => o.value === this.value());\n if (selected >= 0) return selected;\n const firstEnabled = opts.findIndex((o) => !o.disabled);\n return firstEnabled >= 0 ? firstEnabled : 0;\n });\n\n protected rovingIndex(opt: StrctSegmentedOption, i: number): number {\n if (opt.disabled || this.isDisabled()) return -1;\n return i === this.activeIndex() ? 0 : -1;\n }\n\n protected select(opt: StrctSegmentedOption): void {\n if (opt.disabled || this.isDisabled() || opt.value === this.value()) return;\n this.value.set(opt.value);\n this.onChange(opt.value);\n this.onTouched();\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n if (this.isDisabled()) return;\n const forward = event.key === 'ArrowRight' || event.key === 'ArrowDown';\n const backward = event.key === 'ArrowLeft' || event.key === 'ArrowUp';\n const home = event.key === 'Home';\n const end = event.key === 'End';\n if (!forward && !backward && !home && !end) return;\n event.preventDefault();\n\n const opts = this.options();\n const enabled = opts.map((o, i) => ({ o, i })).filter((x) => !x.o.disabled);\n if (!enabled.length) return;\n\n const current = this.activeIndex();\n let pos = enabled.findIndex((x) => x.i === current);\n if (pos < 0) pos = 0;\n\n let next: number;\n if (home) next = 0;\n else if (end) next = enabled.length - 1;\n else if (forward) next = (pos + 1) % enabled.length;\n else next = (pos - 1 + enabled.length) % enabled.length;\n\n const target = enabled[next];\n this.select(target.o);\n this.segs()[target.i]?.nativeElement.focus();\n }\n\n writeValue(value: unknown): void {\n this.value.set(value);\n }\n registerOnChange(fn: (value: unknown) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n effect,\n forwardRef,\n input,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n/**\n * Slider built on a native range input — fully accessible, CVA-compatible.\n * <strct-range [min]=\"0\" [max]=\"100\" [(ngModel)]=\"volume\" showValue />\n */\n@Component({\n selector: 'strct-range',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => StrctRange), multi: true },\n ],\n template: `\n <input\n type=\"range\"\n class=\"strct-range__input\"\n [min]=\"min()\"\n [max]=\"max()\"\n [step]=\"step()\"\n [value]=\"value()\"\n [disabled]=\"isDisabled()\"\n [style.--strct-range-fill.%]=\"fillPercent()\"\n (input)=\"onInput($event)\"\n (blur)=\"onTouched()\"\n />\n @if (showValue()) {\n <span class=\"strct-range__value\">{{ value() }}</span>\n }\n `,\n styles: [\n `\n .strct-range {\n display: inline-flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n max-width: 280px;\n }\n .strct-range__input {\n flex: 1;\n appearance: none;\n height: 5px;\n border-radius: 3px;\n cursor: pointer;\n background: linear-gradient(\n to right,\n var(--acc) 0 var(--strct-range-fill, 0%),\n var(--bg-3) var(--strct-range-fill, 0%) 100%\n );\n }\n .strct-range__input:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .strct-range__input::-webkit-slider-thumb {\n appearance: none;\n width: 15px;\n height: 15px;\n border-radius: 50%;\n background: var(--acc);\n border: 2px solid var(--bg-1);\n box-shadow: var(--sh);\n }\n .strct-range__input::-moz-range-thumb {\n width: 15px;\n height: 15px;\n border-radius: 50%;\n background: var(--acc);\n border: 2px solid var(--bg-1);\n box-shadow: var(--sh);\n }\n .strct-range__input:focus-visible {\n outline: none;\n }\n .strct-range__input:focus-visible::-webkit-slider-thumb {\n box-shadow: 0 0 0 3px var(--acc18);\n }\n .strct-range__value {\n min-width: 30px;\n text-align: end;\n font-size: 12px;\n font-family: var(--mono);\n color: var(--t2);\n }\n `,\n ],\n})\nexport class StrctRange implements ControlValueAccessor {\n /** Minimum allowed value. */\n readonly min = input(0);\n /** Maximum allowed value or top of the value axis. */\n readonly max = input(100);\n /** Step increment. */\n readonly step = input(1);\n /** Display the current numeric value. */\n readonly showValue = input(false, { transform: booleanAttribute });\n /** Static disable flag. */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n readonly value = signal(0);\n readonly isDisabled = signal(false);\n\n protected readonly fillPercent = computed(() => {\n const span = this.max() - this.min();\n return span <= 0 ? 0 : ((this.value() - this.min()) / span) * 100;\n });\n\n private onChange: (value: number) => void = () => {};\n protected onTouched: () => void = () => {};\n\n constructor() {\n effect(() => this.isDisabled.set(this.disabled()));\n }\n\n onInput(event: Event): void {\n const value = Number((event.target as HTMLInputElement).value);\n this.value.set(value);\n this.onChange(value);\n }\n\n writeValue(value: number): void {\n this.value.set(Number(value) || 0);\n }\n registerOnChange(fn: (value: number) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n forwardRef,\n input,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { StrctIcon } from '../icon/icon';\n\nconst LEVELS = [\n { label: 'Weak', color: 'var(--critical)' },\n { label: 'Weak', color: 'var(--critical)' },\n { label: 'Fair', color: 'var(--warning)' },\n { label: 'Good', color: 'var(--acc)' },\n { label: 'Strong', color: 'var(--success)' },\n];\n\n/**\n * Password input with a reveal toggle and an optional strength meter. CVA-compatible.\n * <strct-password [(ngModel)]=\"pw\" meter />\n */\n@Component({\n selector: 'strct-password',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon],\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => StrctPassword), multi: true },\n ],\n template: `\n <div class=\"strct-pw__field\">\n <input\n class=\"strct-control strct-pw__input\"\n [type]=\"revealed() ? 'text' : 'password'\"\n [placeholder]=\"placeholder()\"\n [value]=\"value()\"\n [disabled]=\"isDisabled()\"\n autocomplete=\"off\"\n (input)=\"onInput($event)\"\n (blur)=\"onTouched()\"\n />\n <button\n type=\"button\"\n class=\"strct-pw__toggle\"\n [attr.aria-label]=\"revealed() ? 'Hide password' : 'Show password'\"\n [disabled]=\"isDisabled()\"\n (click)=\"revealed.set(!revealed())\"\n >\n <strct-icon [name]=\"revealed() ? 'eyeOff' : 'eye'\" [size]=\"16\" [strokeWidth]=\"1.3\" />\n </button>\n </div>\n @if (meter() && value()) {\n <div class=\"strct-pw__meter\">\n <div class=\"strct-pw__bars\">\n @for (i of [0, 1, 2, 3]; track i) {\n <span\n class=\"strct-pw__bar\"\n [style.background]=\"i < score() ? level().color : 'var(--bg-3)'\"\n ></span>\n }\n </div>\n <span class=\"strct-pw__label\" [style.color]=\"level().color\">{{ level().label }}</span>\n </div>\n }\n `,\n host: { class: 'strct-pw' },\n styles: [\n `\n .strct-pw {\n display: block;\n width: 100%;\n max-width: 280px;\n }\n .strct-pw__field {\n position: relative;\n }\n .strct-pw__input {\n padding-inline-end: 38px;\n }\n .strct-pw__toggle {\n position: absolute;\n right: 4px;\n top: 50%;\n transform: translateY(-50%);\n display: inline-flex;\n padding: 5px;\n border: 0;\n border-radius: 5px;\n background: transparent;\n color: var(--t2);\n cursor: pointer;\n }\n .strct-pw__toggle:hover {\n color: var(--acc);\n background: var(--bg-3);\n }\n .strct-pw__meter {\n display: flex;\n align-items: center;\n gap: 9px;\n margin-top: 7px;\n }\n .strct-pw__bars {\n display: flex;\n gap: 3px;\n flex: 1;\n }\n .strct-pw__bar {\n flex: 1;\n height: 3px;\n border-radius: 2px;\n transition: background 0.2s ease;\n }\n .strct-pw__label {\n font-size: 12px;\n font-weight: 600;\n min-width: 42px;\n text-align: end;\n }\n `,\n ],\n})\nexport class StrctPassword implements ControlValueAccessor {\n /** Placeholder text when empty. */\n readonly placeholder = input('');\n /** Show a strength meter. */\n readonly meter = input(false, { transform: booleanAttribute });\n /** Static disable flag. */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n readonly value = signal('');\n readonly revealed = signal(false);\n readonly isDisabled = signal(false);\n\n protected readonly score = computed(() => {\n const v = this.value();\n if (!v) return 0;\n let s = 0;\n if (v.length >= 8) s++;\n if (/[a-z]/.test(v) && /[A-Z]/.test(v)) s++;\n if (/\\d/.test(v)) s++;\n if (/[^A-Za-z0-9]/.test(v)) s++;\n return s;\n });\n protected readonly level = computed(() => LEVELS[this.score()]);\n\n private onChange: (value: string) => void = () => {};\n protected onTouched: () => void = () => {};\n\n onInput(event: Event): void {\n const v = (event.target as HTMLInputElement).value;\n this.value.set(v);\n this.onChange(v);\n }\n\n writeValue(value: string): void {\n this.value.set(value || '');\n }\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n forwardRef,\n input,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { StrctIcon } from '../icon/icon';\n\n/**\n * Drag-and-drop file picker. CVA value is a `File[]`.\n * <strct-file [(ngModel)]=\"files\" multiple accept=\"image/*\" />\n */\n@Component({\n selector: 'strct-file',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon],\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => StrctFile), multi: true },\n ],\n template: `\n <div\n class=\"strct-file__zone\"\n [class.strct-file__zone--drag]=\"dragging()\"\n [class.strct-file__zone--disabled]=\"isDisabled()\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"!isDisabled() && input.click()\"\n (keydown.enter)=\"!isDisabled() && input.click()\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"dragging.set(false)\"\n (drop)=\"onDrop($event)\"\n >\n <strct-icon name=\"upload\" [size]=\"20\" />\n <div class=\"strct-file__prompt\">\n <strong>Drag files here</strong> or <span class=\"strct-file__browse\">browse</span>\n </div>\n <input\n #input\n type=\"file\"\n class=\"strct-file__native\"\n [multiple]=\"multiple()\"\n [accept]=\"accept()\"\n [disabled]=\"isDisabled()\"\n (change)=\"onSelect($event)\"\n (blur)=\"onTouched()\"\n />\n </div>\n\n @if (files().length) {\n <ul class=\"strct-file__list\">\n @for (file of files(); track file.name + file.size) {\n <li class=\"strct-file__file\">\n <span class=\"strct-file__name\">{{ file.name }}</span>\n <span class=\"strct-file__size\">{{ humanSize(file.size) }}</span>\n <button\n type=\"button\"\n class=\"strct-file__remove\"\n aria-label=\"Remove\"\n (click)=\"remove(file)\"\n >\n <strct-icon name=\"close\" [size]=\"12\" />\n </button>\n </li>\n }\n </ul>\n }\n `,\n host: { class: 'strct-file' },\n styles: [\n `\n .strct-file {\n display: block;\n width: 100%;\n max-width: 360px;\n }\n .strct-file__zone {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n padding: 22px 16px;\n text-align: center;\n cursor: pointer;\n color: var(--t2);\n background: var(--bg-2);\n border: 1px dashed var(--b3);\n border-radius: 8px;\n transition:\n border-color 0.14s ease,\n background 0.14s ease,\n color 0.14s ease;\n }\n .strct-file__zone:hover {\n border-color: var(--acc30);\n color: var(--t1);\n }\n .strct-file__zone strct-icon {\n color: var(--t3);\n }\n .strct-file__zone--drag {\n border-color: var(--acc);\n background: var(--acc-m);\n color: var(--t1);\n }\n .strct-file__zone--drag strct-icon {\n color: var(--acc);\n }\n .strct-file__zone--disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .strct-file__prompt {\n font-size: 13px;\n }\n .strct-file__browse {\n color: var(--acc);\n }\n .strct-file__native {\n display: none;\n }\n .strct-file__list {\n list-style: none;\n margin: 10px 0 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n .strct-file__file {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 7px 10px;\n font-size: 13px;\n background: var(--bg-1);\n border: 1px solid var(--b2);\n border-radius: 6px;\n }\n .strct-file__name {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--t1);\n }\n .strct-file__size {\n font-size: 12px;\n color: var(--t3);\n font-family: var(--mono);\n }\n .strct-file__remove {\n display: inline-flex;\n padding: 3px;\n border: 0;\n border-radius: 4px;\n background: transparent;\n color: var(--t3);\n cursor: pointer;\n }\n .strct-file__remove:hover {\n color: var(--critical);\n background: var(--critical-bg);\n }\n `,\n ],\n})\nexport class StrctFile implements ControlValueAccessor {\n /** Multiple. */\n readonly multiple = input(false, { transform: booleanAttribute });\n /** Accept. */\n readonly accept = input('');\n /** Static disable flag. */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n readonly files = signal<File[]>([]);\n readonly dragging = signal(false);\n readonly isDisabled = signal(false);\n\n private onChange: (value: File[]) => void = () => {};\n protected onTouched: () => void = () => {};\n\n onSelect(event: Event): void {\n const list = (event.target as HTMLInputElement).files;\n if (list) this.setFiles(Array.from(list));\n }\n\n onDragOver(event: DragEvent): void {\n if (this.isDisabled()) return;\n event.preventDefault();\n this.dragging.set(true);\n }\n\n onDrop(event: DragEvent): void {\n if (this.isDisabled()) return;\n event.preventDefault();\n this.dragging.set(false);\n const dropped = event.dataTransfer?.files;\n if (dropped?.length) this.setFiles(Array.from(dropped));\n }\n\n remove(file: File): void {\n this.setFiles(this.files().filter((f) => f !== file));\n }\n\n protected humanSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / 1024 / 1024).toFixed(1)} MB`;\n }\n\n private setFiles(incoming: File[]): void {\n const next = this.multiple() ? incoming : incoming.slice(0, 1);\n this.files.set(next);\n this.onChange(next);\n this.onTouched();\n }\n\n writeValue(value: File[]): void {\n this.files.set(Array.isArray(value) ? value : []);\n }\n registerOnChange(fn: (value: File[]) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n forwardRef,\n input,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n/** Star rating input. CVA value is the selected count (0–max). */\n@Component({\n selector: 'strct-rating',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => StrctRating), multi: true },\n ],\n template: `\n <div\n class=\"strct-rating\"\n role=\"slider\"\n [attr.aria-valuemin]=\"0\"\n [attr.aria-valuemax]=\"max()\"\n [attr.aria-valuenow]=\"value()\"\n >\n @for (star of stars(); track star) {\n <button\n type=\"button\"\n class=\"strct-rating__star\"\n [class.strct-rating__star--on]=\"star <= (hover() || value())\"\n [disabled]=\"readonly() || isDisabled()\"\n [attr.aria-label]=\"star + ' of ' + max()\"\n (mouseenter)=\"hover.set(star)\"\n (mouseleave)=\"hover.set(0)\"\n (click)=\"pick(star)\"\n >\n <svg viewBox=\"0 0 16 16\" [style.width.px]=\"size()\" [style.height.px]=\"size()\">\n <path\n d=\"M8 1.5l1.9 4 4.4.5-3.3 3 .9 4.3L8 11.2 4.1 13.3l.9-4.3-3.3-3 4.4-.5z\"\n [attr.fill]=\"star <= (hover() || value()) ? 'currentColor' : 'none'\"\n stroke=\"currentColor\"\n stroke-width=\"1.1\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n }\n </div>\n `,\n styles: [\n `\n .strct-rating {\n display: inline-flex;\n gap: 3px;\n }\n .strct-rating__star {\n display: inline-flex;\n padding: 1px;\n border: 0;\n background: transparent;\n cursor: pointer;\n color: var(--t4);\n transition:\n color 0.12s ease,\n transform 0.1s ease;\n }\n .strct-rating__star:hover:not(:disabled) {\n transform: scale(1.12);\n }\n .strct-rating__star--on {\n color: var(--warning);\n }\n .strct-rating__star:disabled {\n cursor: default;\n }\n `,\n ],\n})\nexport class StrctRating implements ControlValueAccessor {\n /** Maximum allowed value or top of the value axis. */\n readonly max = input(5);\n /** Size variant. */\n readonly size = input(18);\n /** Prevent user interaction. */\n readonly readonly = input(false, { transform: booleanAttribute });\n\n readonly value = signal(0);\n readonly hover = signal(0);\n readonly isDisabled = signal(false);\n\n protected stars(): number[] {\n return Array.from({ length: this.max() }, (_, i) => i + 1);\n }\n\n private onChange: (value: number) => void = () => {};\n private onTouched: () => void = () => {};\n\n pick(star: number): void {\n if (this.readonly() || this.isDisabled()) return;\n const next = this.value() === star ? 0 : star; // click the current star to clear\n this.value.set(next);\n this.onChange(next);\n this.onTouched();\n }\n\n writeValue(value: number): void {\n this.value.set(Number(value) || 0);\n }\n registerOnChange(fn: (value: number) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n forwardRef,\n input,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { StrctTag } from '../tag/tag';\n\n/**\n * Tag input — type a word and press Enter to add a chip; Backspace on an empty\n * field removes the last. CVA value is `string[]`.\n * <strct-chips [(ngModel)]=\"labels\" placeholder=\"Add a tag…\" />\n */\n@Component({\n selector: 'strct-chips',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctTag],\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => StrctChips), multi: true },\n ],\n template: `\n <div\n class=\"strct-chips\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"input.focus()\"\n (keydown.enter)=\"input.focus()\"\n (keydown.space)=\"input.focus()\"\n >\n @for (chip of value(); track chip) {\n <strct-tag status=\"accent\" removable (removed)=\"remove(chip)\">{{ chip }}</strct-tag>\n }\n <input\n #input\n type=\"text\"\n class=\"strct-chips__input\"\n [value]=\"draft()\"\n [placeholder]=\"value().length ? '' : placeholder()\"\n [disabled]=\"isDisabled()\"\n (input)=\"draft.set($any($event.target).value)\"\n (keydown)=\"onKeydown($event)\"\n (blur)=\"commitDraft(); onTouched()\"\n />\n </div>\n `,\n styles: [\n `\n .strct-chips {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 6px;\n width: 100%;\n max-width: 360px;\n min-height: 38px;\n padding: 5px 8px;\n background: var(--bg-2);\n border: 1px solid var(--b2);\n border-radius: 6px;\n cursor: text;\n transition:\n border-color 0.14s ease,\n box-shadow 0.14s ease;\n }\n .strct-chips:focus-within {\n border-color: var(--acc50);\n box-shadow: 0 0 0 3px var(--acc18);\n background: var(--bg-1);\n }\n .strct-chips__input {\n flex: 1;\n min-width: 80px;\n border: 0;\n outline: none;\n background: transparent;\n font-family: var(--font);\n font-size: 13px;\n color: var(--t1);\n padding: 3px 2px;\n }\n .strct-chips__input::placeholder {\n color: var(--t3);\n }\n `,\n ],\n})\nexport class StrctChips implements ControlValueAccessor {\n /** Placeholder text when empty. */\n readonly placeholder = input('');\n /** Allow duplicate tags. */\n readonly allowDuplicates = input(false);\n\n readonly value = signal<string[]>([]);\n readonly draft = signal('');\n readonly isDisabled = signal(false);\n\n private onChange: (value: string[]) => void = () => {};\n protected onTouched: () => void = () => {};\n\n onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Enter' || event.key === ',') {\n event.preventDefault();\n this.commitDraft();\n } else if (event.key === 'Backspace' && !this.draft() && this.value().length) {\n this.value.update((v) => v.slice(0, -1));\n this.emit();\n }\n }\n\n protected commitDraft(): void {\n const tag = this.draft().trim();\n if (!tag) return;\n if (this.allowDuplicates() || !this.value().includes(tag)) {\n this.value.update((v) => [...v, tag]);\n this.emit();\n }\n this.draft.set('');\n }\n\n remove(chip: string): void {\n this.value.update((v) => v.filter((c) => c !== chip));\n this.emit();\n }\n\n private emit(): void {\n this.onChange(this.value());\n }\n\n writeValue(value: string[]): void {\n this.value.set(Array.isArray(value) ? [...value] : []);\n }\n registerOnChange(fn: (value: string[]) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n ElementRef,\n computed,\n forwardRef,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n/**\n * One-time-password input — a row of single-character boxes with auto-advance,\n * backspace and paste. CVA value is the concatenated string.\n * <strct-input-otp [length]=\"6\" [(ngModel)]=\"code\" />\n */\n@Component({\n selector: 'strct-input-otp',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => StrctInputOtp), multi: true },\n ],\n template: `\n <div class=\"strct-otp\">\n @for (i of indices(); track i) {\n <input\n class=\"strct-otp__box\"\n [type]=\"masked() ? 'password' : 'text'\"\n inputmode=\"numeric\"\n autocomplete=\"one-time-code\"\n maxlength=\"1\"\n [value]=\"slots()[i] || ''\"\n [disabled]=\"isDisabled()\"\n (input)=\"onInput(i, $event)\"\n (keydown)=\"onKeydown(i, $event)\"\n (paste)=\"onPaste($event)\"\n (focus)=\"$any($event.target).select()\"\n />\n }\n </div>\n `,\n styles: [\n `\n .strct-otp {\n display: inline-flex;\n gap: 8px;\n }\n .strct-otp__box {\n width: 40px;\n height: 46px;\n text-align: center;\n font-family: var(--mono);\n font-size: 18px;\n color: var(--t1);\n background: var(--bg-2);\n border: 1px solid var(--b2);\n border-radius: 8px;\n transition:\n border-color 0.14s ease,\n box-shadow 0.14s ease,\n background 0.14s ease;\n }\n .strct-otp__box:focus {\n outline: none;\n border-color: var(--acc50);\n box-shadow: 0 0 0 3px var(--acc18);\n background: var(--bg-1);\n }\n .strct-otp__box:disabled {\n opacity: 0.5;\n }\n `,\n ],\n})\nexport class StrctInputOtp implements ControlValueAccessor {\n private readonly host = inject(ElementRef<HTMLElement>);\n /** Number of OTP boxes. */\n readonly length = input(6);\n /** Mask each box as a password dot. */\n readonly masked = input(false);\n\n readonly slots = signal<string[]>([]);\n readonly isDisabled = signal(false);\n\n protected readonly indices = computed(() => Array.from({ length: this.length() }, (_, i) => i));\n\n private onChange: (value: string) => void = () => {};\n private onTouched: () => void = () => {};\n\n onInput(i: number, event: Event): void {\n const ch = (event.target as HTMLInputElement).value.slice(-1);\n this.setSlot(i, ch);\n if (ch) this.focusBox(i + 1);\n this.emit();\n }\n\n onKeydown(i: number, event: KeyboardEvent): void {\n if (event.key === 'Backspace') {\n if (!this.slots()[i]) {\n event.preventDefault();\n this.setSlot(i - 1, '');\n this.focusBox(i - 1);\n this.emit();\n }\n } else if (event.key === 'ArrowLeft') {\n this.focusBox(i - 1);\n } else if (event.key === 'ArrowRight') {\n this.focusBox(i + 1);\n }\n }\n\n onPaste(event: ClipboardEvent): void {\n event.preventDefault();\n const text = (event.clipboardData?.getData('text') ?? '').replace(/\\s/g, '');\n if (!text) return;\n const next = Array.from({ length: this.length() }, (_, i) => text[i] ?? '');\n this.slots.set(next);\n this.focusBox(Math.min(text.length, this.length() - 1));\n this.emit();\n this.onTouched();\n }\n\n private setSlot(i: number, ch: string): void {\n if (i < 0 || i >= this.length()) return;\n const next = [...this.slots()];\n while (next.length < this.length()) next.push('');\n next[i] = ch;\n this.slots.set(next);\n }\n\n private focusBox(i: number): void {\n const el = this.host.nativeElement as HTMLElement;\n const boxes = el.querySelectorAll('.strct-otp__box');\n (boxes[i] as HTMLInputElement | undefined)?.focus();\n }\n\n private emit(): void {\n this.onChange(this.slots().join(''));\n this.onTouched();\n }\n\n writeValue(value: string): void {\n const v = value ?? '';\n this.slots.set(Array.from({ length: this.length() }, (_, i) => v[i] ?? ''));\n }\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n forwardRef,\n inject,\n input,\n signal,\n ElementRef,\n HostListener,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n/** Knob accent color variants. */\nexport type StrctKnobStatus = 'accent' | 'success' | 'warning' | 'critical';\n\nconst COLOR: Record<StrctKnobStatus, string> = {\n accent: 'var(--acc)',\n success: 'var(--success)',\n warning: 'var(--warning)',\n critical: 'var(--critical)',\n};\n\n/**\n * Rotary dial input. Drag (up/down), arrow keys, Home/End or the wheel change\n * the value. CVA-compatible.\n * <strct-knob [min]=\"0\" [max]=\"100\" [(ngModel)]=\"fanSpeed\" label=\"Fan\" />\n */\n@Component({\n selector: 'strct-knob',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => StrctKnob), multi: true },\n ],\n template: `\n <div\n class=\"strct-knob\"\n [style.width.px]=\"size()\"\n [style.height.px]=\"size()\"\n role=\"slider\"\n tabindex=\"0\"\n [attr.aria-valuemin]=\"min()\"\n [attr.aria-valuemax]=\"max()\"\n [attr.aria-valuenow]=\"value()\"\n [attr.aria-disabled]=\"isDisabled() || null\"\n (pointerdown)=\"onPointerDown($event)\"\n >\n <svg [attr.viewBox]=\"'0 0 ' + size() + ' ' + size()\">\n <g [attr.transform]=\"'rotate(135 ' + half() + ' ' + half() + ')'\">\n <circle\n class=\"strct-knob__track\"\n [attr.cx]=\"half()\"\n [attr.cy]=\"half()\"\n [attr.r]=\"radius()\"\n fill=\"none\"\n [attr.stroke-width]=\"thickness()\"\n stroke-linecap=\"round\"\n [attr.stroke-dasharray]=\"trackDash()\"\n />\n <circle\n class=\"strct-knob__value\"\n [attr.cx]=\"half()\"\n [attr.cy]=\"half()\"\n [attr.r]=\"radius()\"\n fill=\"none\"\n [attr.stroke]=\"color()\"\n [attr.stroke-width]=\"thickness()\"\n stroke-linecap=\"round\"\n [attr.stroke-dasharray]=\"valueDash()\"\n />\n </g>\n <g [attr.transform]=\"'rotate(' + pointerAngle() + ' ' + half() + ' ' + half() + ')'\">\n <line\n class=\"strct-knob__pointer\"\n [attr.x1]=\"half()\"\n [attr.y1]=\"half()\"\n [attr.x2]=\"half()\"\n [attr.y2]=\"thickness() + 3\"\n [attr.stroke]=\"color()\"\n stroke-width=\"2.5\"\n stroke-linecap=\"round\"\n />\n </g>\n </svg>\n <div class=\"strct-knob__center\">\n <div class=\"strct-knob__num\">{{ value() }}</div>\n @if (label()) {\n <div class=\"strct-knob__label\">{{ label() }}</div>\n }\n </div>\n </div>\n `,\n styles: [\n `\n .strct-knob {\n position: relative;\n display: inline-flex;\n cursor: ns-resize;\n user-select: none;\n touch-action: none;\n outline: none;\n }\n .strct-knob:focus-visible {\n border-radius: 50%;\n box-shadow: 0 0 0 3px var(--acc18);\n }\n .strct-knob[aria-disabled='true'] {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .strct-knob__track {\n stroke: var(--bg-3);\n }\n .strct-knob__value {\n transition: stroke-dasharray 0.05s linear;\n }\n .strct-knob__center {\n position: absolute;\n inset: 0;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n pointer-events: none;\n }\n .strct-knob__num {\n font-size: 18px;\n font-weight: 600;\n color: var(--t1);\n line-height: 1;\n }\n .strct-knob__label {\n font-size: 12px;\n color: var(--t2);\n margin-top: 3px;\n }\n `,\n ],\n})\nexport class StrctKnob implements ControlValueAccessor {\n private readonly elementRef = inject(ElementRef<HTMLElement>);\n\n /** Minimum allowed value. */\n readonly min = input(0);\n /** Maximum allowed value or top of the value axis. */\n readonly max = input(100);\n /** Step increment. */\n readonly step = input(1);\n /** Size variant. */\n readonly size = input(96);\n /** Stroke thickness in pixels. */\n readonly thickness = input(9);\n /** Visual status color. */\n readonly status = input<StrctKnobStatus>('accent');\n /** Label text. */\n readonly label = input('');\n\n readonly value = signal(0);\n readonly isDisabled = signal(false);\n\n protected readonly half = computed(() => this.size() / 2);\n protected readonly radius = computed(() => (this.size() - this.thickness()) / 2 - 2);\n protected readonly color = computed(() => COLOR[this.status()]);\n\n private readonly fraction = computed(() => {\n const span = this.max() - this.min();\n return span <= 0 ? 0 : (this.value() - this.min()) / span;\n });\n private readonly circumference = computed(() => 2 * Math.PI * this.radius());\n\n protected readonly trackDash = computed(() => {\n const c = this.circumference();\n return `${0.75 * c} ${c}`;\n });\n protected readonly valueDash = computed(() => {\n const c = this.circumference();\n return `${this.fraction() * 0.75 * c} ${c}`;\n });\n /** Pointer rotation: -135° (start, lower-left) to +135° (end, lower-right). */\n protected readonly pointerAngle = computed(() => -135 + this.fraction() * 270);\n\n private onChange: (value: number) => void = () => {};\n private onTouched: () => void = () => {};\n\n private dragStartY = 0;\n private dragStartValue = 0;\n private readonly onMove = (e: PointerEvent) => {\n const span = this.max() - this.min();\n const delta = (this.dragStartY - e.clientY) / 150; // 150px ≈ full range\n this.setValue(this.dragStartValue + delta * span);\n };\n private readonly onUp = () => {\n window.removeEventListener('pointermove', this.onMove);\n window.removeEventListener('pointerup', this.onUp);\n this.onTouched();\n };\n\n protected onPointerDown(event: PointerEvent): void {\n if (this.isDisabled()) return;\n event.preventDefault();\n (this.elementRef.nativeElement.firstElementChild as HTMLElement)?.focus?.();\n this.dragStartY = event.clientY;\n this.dragStartValue = this.value();\n window.addEventListener('pointermove', this.onMove);\n window.addEventListener('pointerup', this.onUp);\n }\n\n @HostListener('keydown', ['$event'])\n protected onKeydown(event: KeyboardEvent): void {\n if (this.isDisabled()) return;\n const s = this.step();\n let handled = true;\n switch (event.key) {\n case 'ArrowUp':\n case 'ArrowRight':\n this.setValue(this.value() + s);\n break;\n case 'ArrowDown':\n case 'ArrowLeft':\n this.setValue(this.value() - s);\n break;\n case 'Home':\n this.setValue(this.min());\n break;\n case 'End':\n this.setValue(this.max());\n break;\n default:\n handled = false;\n }\n if (handled) {\n event.preventDefault();\n this.onTouched();\n }\n }\n\n @HostListener('wheel', ['$event'])\n protected onWheel(event: WheelEvent): void {\n if (this.isDisabled()) return;\n event.preventDefault();\n this.setValue(this.value() + (event.deltaY < 0 ? this.step() : -this.step()));\n this.onTouched();\n }\n\n private setValue(raw: number): void {\n const step = this.step();\n const snapped = Math.round(raw / step) * step;\n const clamped = Math.max(this.min(), Math.min(this.max(), snapped));\n if (clamped !== this.value()) {\n this.value.set(clamped);\n this.onChange(clamped);\n }\n }\n\n writeValue(value: number): void {\n this.value.set(Math.max(this.min(), Math.min(this.max(), Number(value) || 0)));\n }\n registerOnChange(fn: (value: number) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n forwardRef,\n input,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n/** Ready-made masks for common datacenter / form fields. */\nexport const STRCT_MASKS = {\n phoneTr: '(999) 999 99 99',\n nationalIdTr: '99999999999',\n creditCard: '9999 9999 9999 9999',\n /** MAC address — 6 hex octets, e.g. 00:1B:44:11:3A:B7 */\n mac: 'HH:HH:HH:HH:HH:HH',\n /** Fibre-channel WWPN — 8 hex octets, e.g. 20:00:00:25:B5:1A:00:0F */\n wwpn: 'HH:HH:HH:HH:HH:HH:HH:HH',\n} as const;\n\n/**\n * Masked text input. Mask tokens: `9` = digit, `A` = letter, `H` = hex digit,\n * `*` = alphanumeric; every other character is a literal. CVA value is the\n * formatted string.\n * <strct-input-mask mask=\"(999) 999 99 99\" [(ngModel)]=\"phone\" />\n * <strct-input-mask mask=\"HH:HH:HH:HH:HH:HH\" uppercase [(ngModel)]=\"mac\" />\n */\n@Component({\n selector: 'strct-input-mask',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => StrctInputMask), multi: true },\n ],\n template: `\n <input\n class=\"strct-control strct-mask__input\"\n type=\"text\"\n inputmode=\"text\"\n [placeholder]=\"placeholder() || mask()\"\n [value]=\"display()\"\n [disabled]=\"isDisabled()\"\n (input)=\"onInput($event)\"\n (blur)=\"onTouched()\"\n />\n `,\n styles: [\n `\n .strct-input-mask,\n .strct-mask__input {\n display: block;\n width: 100%;\n max-width: 280px;\n }\n `,\n ],\n})\nexport class StrctInputMask implements ControlValueAccessor {\n /** Mask pattern (9=digit, A=letter, H=hex, *=alnum). */\n readonly mask = input.required<string>();\n /** Placeholder text when empty. */\n readonly placeholder = input('');\n /** Upper-case entered letters (handy for hex MAC / WWPN). */\n readonly uppercase = input(false, { transform: booleanAttribute });\n\n readonly display = signal('');\n readonly isDisabled = signal(false);\n\n private onChange: (value: string) => void = () => {};\n protected onTouched: () => void = () => {};\n\n onInput(event: Event): void {\n const el = event.target as HTMLInputElement;\n const formatted = this.format(el.value);\n this.display.set(formatted);\n // keep the field text in sync (covers rejected characters)\n el.value = formatted;\n this.onChange(formatted);\n }\n\n private isToken(c: string): boolean {\n return c === '9' || c === 'A' || c === 'H' || c === '*';\n }\n\n private matches(ch: string, token: string): boolean {\n if (token === '9') return /[0-9]/.test(ch);\n if (token === 'A') return /[a-zA-Z]/.test(ch);\n if (token === 'H') return /[0-9a-fA-F]/.test(ch);\n return /[0-9a-zA-Z]/.test(ch); // '*'\n }\n\n private format(raw: string): string {\n const mask = this.mask();\n // Pull out only the data characters (drop literals / rejected input).\n const data: string[] = [];\n for (const ch of raw) {\n if (/[0-9a-zA-Z]/.test(ch)) data.push(ch);\n }\n let out = '';\n let di = 0;\n for (let mi = 0; mi < mask.length && di < data.length; ) {\n const m = mask[mi];\n if (this.isToken(m)) {\n if (this.matches(data[di], m)) {\n out += this.uppercase() ? data[di].toUpperCase() : data[di];\n mi++;\n di++;\n } else {\n di++; // skip a data char that doesn't fit this token\n }\n } else {\n out += m; // literal\n mi++;\n }\n }\n return out;\n }\n\n writeValue(value: string): void {\n this.display.set(this.format(value ?? ''));\n }\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n ElementRef,\n HostListener,\n booleanAttribute,\n computed,\n forwardRef,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { StrctIcon } from '../icon/icon';\nimport { StrctOverlay } from '../overlay/overlay';\n\n/** One option in a combobox or similar list. */\nexport interface StrctOption {\n value: unknown;\n label: string;\n}\n\nlet comboboxCounter = 0;\n\n/**\n * Filterable single-select (autocomplete). CVA-compatible, fully keyboard\n * driven (↑/↓ to move, Enter to pick, Esc to close).\n * <strct-combobox [options]=\"opts\" [(ngModel)]=\"selected\" placeholder=\"Pick…\" />\n */\n@Component({\n selector: 'strct-combobox',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon, StrctOverlay],\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => StrctCombobox), multi: true },\n ],\n template: `\n <div #field class=\"strct-cbx__field\">\n <input\n #input\n type=\"text\"\n class=\"strct-control strct-cbx__input\"\n role=\"combobox\"\n autocomplete=\"off\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"listId\"\n [attr.aria-activedescendant]=\"\n open() && filtered().length ? listId + '-' + activeIndex() : null\n \"\n [placeholder]=\"placeholder()\"\n [value]=\"query()\"\n [disabled]=\"isDisabled()\"\n (focus)=\"openList()\"\n (input)=\"onType($event)\"\n (keydown)=\"onKeydown($event)\"\n (blur)=\"onTouched()\"\n />\n <strct-icon class=\"strct-cbx__caret\" name=\"chevronDown\" [size]=\"14\" />\n </div>\n @if (open()) {\n <div\n class=\"strct-cbx__menu\"\n role=\"listbox\"\n [id]=\"listId\"\n [strctOverlay]=\"field\"\n strctOverlayPlacement=\"bottom-start\"\n [strctOverlayMatchWidth]=\"true\"\n >\n @if (loading()) {\n <div class=\"strct-cbx__skeleton\">\n <div class=\"strct-cbx__skeleton-block\"></div>\n </div>\n } @else {\n @for (opt of filtered(); track opt.value; let i = $index) {\n <div\n class=\"strct-cbx__opt\"\n [id]=\"listId + '-' + i\"\n [class.strct-cbx__opt--active]=\"opt.value === value()\"\n [class.strct-cbx__opt--highlight]=\"i === activeIndex()\"\n role=\"option\"\n [attr.aria-selected]=\"opt.value === value()\"\n (mousedown)=\"select(opt, $event)\"\n (mousemove)=\"activeIndex.set(i)\"\n >\n {{ opt.label }}\n </div>\n } @empty {\n <div class=\"strct-cbx__empty\">No matches</div>\n }\n }\n </div>\n }\n `,\n host: { class: 'strct-cbx' },\n styles: [\n `\n /* Full width of its container by default — no artificial cap. */\n .strct-cbx {\n position: relative;\n display: block;\n width: 100%;\n }\n .strct-cbx__field {\n position: relative;\n }\n .strct-cbx__input {\n padding-inline-end: 30px;\n }\n .strct-cbx__caret {\n position: absolute;\n right: 9px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--t3);\n pointer-events: none;\n }\n /* Positioned by StrctOverlay (position: fixed, set inline) — only the\n surface styling lives here. */\n .strct-cbx__menu {\n z-index: 200;\n max-height: 220px;\n overflow-y: auto;\n padding: 4px;\n background: var(--bg-1);\n border: 1px solid var(--b2);\n border-radius: 7px;\n box-shadow: var(--shh);\n }\n .strct-cbx__opt {\n padding: 7px 10px;\n border-radius: 5px;\n cursor: pointer;\n font-size: 13px;\n color: var(--t1);\n }\n .strct-cbx__opt--highlight {\n background: var(--bg-3);\n }\n .strct-cbx__opt--active {\n color: var(--acc);\n }\n .strct-cbx__opt--active.strct-cbx__opt--highlight {\n background: var(--acc-m);\n }\n @keyframes strct-skeleton-pulse {\n 0%,\n 100% {\n opacity: 0.4;\n }\n 50% {\n opacity: 0.7;\n }\n }\n .strct-cbx__skeleton {\n padding: 9px 10px;\n }\n .strct-cbx__skeleton-block {\n height: 12px;\n background: var(--bg-3);\n border-radius: var(--radius-sm);\n animation: strct-skeleton-pulse 1.4s ease infinite;\n }\n .strct-cbx__empty {\n padding: 9px 10px;\n font-size: 13px;\n color: var(--t3);\n }\n `,\n ],\n})\nexport class StrctCombobox implements ControlValueAccessor {\n private readonly host = inject(ElementRef<HTMLElement>);\n protected readonly listId = `strct-cbx-${++comboboxCounter}`;\n\n /** Available options. */\n readonly options = input<StrctOption[]>([]);\n /** Placeholder text when empty. */\n readonly placeholder = input('');\n /** Show a skeleton placeholder while options are loading. */\n readonly loading = input(false, { transform: booleanAttribute });\n\n readonly query = signal('');\n readonly value = signal<unknown>(null);\n readonly open = signal(false);\n readonly activeIndex = signal(0);\n readonly isDisabled = signal(false);\n /** True while the user is typing a filter that hasn't been committed yet. */\n private readonly dirty = signal(false);\n\n protected readonly filtered = computed(() => {\n const q = this.dirty() ? this.query().toLowerCase().trim() : '';\n if (!q) return this.options();\n return this.options().filter((o) => o.label.toLowerCase().includes(q));\n });\n\n private onChange: (value: unknown) => void = () => {};\n protected onTouched: () => void = () => {};\n\n openList(): void {\n if (this.isDisabled()) return;\n this.open.set(true);\n this.activeIndex.set(this.indexOfValue());\n }\n\n onType(event: Event): void {\n this.dirty.set(true);\n this.query.set((event.target as HTMLInputElement).value);\n this.open.set(true);\n this.activeIndex.set(0);\n }\n\n onKeydown(event: KeyboardEvent): void {\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n if (!this.open()) return this.openList();\n this.move(1);\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.move(-1);\n break;\n case 'Enter': {\n if (!this.open()) return;\n event.preventDefault();\n const opt = this.filtered()[this.activeIndex()];\n if (opt) this.commit(opt);\n break;\n }\n case 'Escape':\n if (this.open()) {\n event.preventDefault();\n this.close();\n }\n break;\n }\n }\n\n private move(delta: number): void {\n const len = this.filtered().length;\n if (!len) return;\n this.activeIndex.set((this.activeIndex() + delta + len) % len);\n }\n\n select(opt: StrctOption, event: Event): void {\n event.preventDefault(); // keep focus, avoid blur reordering\n this.commit(opt);\n }\n\n private commit(opt: StrctOption): void {\n this.value.set(opt.value);\n this.query.set(opt.label);\n this.dirty.set(false);\n this.open.set(false);\n this.onChange(opt.value);\n this.onTouched();\n }\n\n @HostListener('document:click', ['$event'])\n protected onDocClick(event: MouseEvent): void {\n if (this.open() && !this.host.nativeElement.contains(event.target as Node)) {\n this.close();\n }\n }\n\n private close(): void {\n this.open.set(false);\n this.dirty.set(false);\n this.syncQueryToValue();\n }\n\n private indexOfValue(): number {\n const idx = this.filtered().findIndex((o) => o.value === this.value());\n return idx < 0 ? 0 : idx;\n }\n\n private syncQueryToValue(): void {\n const match = this.options().find((o) => o.value === this.value());\n this.query.set(match?.label ?? '');\n }\n\n writeValue(value: unknown): void {\n this.value.set(value);\n this.syncQueryToValue();\n }\n registerOnChange(fn: (value: unknown) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n ElementRef,\n HostListener,\n computed,\n effect,\n forwardRef,\n inject,\n input,\n signal,\n untracked,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { StrctIcon } from '../icon/icon';\nimport { StrctOverlay } from '../overlay/overlay';\n\ninterface DayCell {\n day: number;\n iso: string;\n inMonth: boolean;\n}\n\nconst MONTHS = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n];\nconst DOW = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'];\nconst DOW_FULL = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\nconst pad = (n: number) => String(n).padStart(2, '0');\nconst toIso = (y: number, m: number, d: number) => `${y}-${pad(m + 1)}-${pad(d)}`;\n\nlet dpUid = 0;\n\n/**\n * Calendar date picker. Value is an ISO `yyyy-mm-dd` string. CVA-compatible.\n * <strct-datepicker [(ngModel)]=\"date\" />\n */\n@Component({\n selector: 'strct-datepicker',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon, StrctOverlay],\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => StrctDatepicker), multi: true },\n ],\n template: `\n <div #field class=\"strct-dp__field\">\n <input\n type=\"text\"\n class=\"strct-control strct-dp__input\"\n readonly\n [value]=\"displayLabel()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"isDisabled()\"\n (click)=\"toggle()\"\n (keydown)=\"onKeydown($event)\"\n />\n <button\n type=\"button\"\n class=\"strct-dp__icon\"\n aria-label=\"Open calendar\"\n [disabled]=\"isDisabled()\"\n (click)=\"toggle()\"\n >\n <strct-icon name=\"calendar\" [size]=\"16\" />\n </button>\n </div>\n\n @if (open()) {\n <div\n class=\"strct-dp__panel\"\n role=\"dialog\"\n [attr.aria-labelledby]=\"titleId\"\n [strctOverlay]=\"field\"\n strctOverlayPlacement=\"bottom-start\"\n >\n <div class=\"strct-dp__head\">\n <button\n type=\"button\"\n class=\"strct-dp__nav\"\n aria-label=\"Previous month\"\n (click)=\"shiftMonth(-1)\"\n >\n <strct-icon name=\"chevronLeft\" [size]=\"14\" [strokeWidth]=\"1.7\" />\n </button>\n <span class=\"strct-dp__title\" [id]=\"titleId\" aria-live=\"polite\">{{ monthLabel() }}</span>\n <button\n type=\"button\"\n class=\"strct-dp__nav\"\n aria-label=\"Next month\"\n (click)=\"shiftMonth(1)\"\n >\n <strct-icon name=\"chevronRight\" [size]=\"14\" [strokeWidth]=\"1.7\" />\n </button>\n </div>\n <!-- ARIA grid (APG date-picker dialog pattern): focus roves the day\n cells; the input regains focus on close. -->\n <div class=\"strct-dp__gridwrap\" role=\"grid\" [attr.aria-labelledby]=\"titleId\">\n <div class=\"strct-dp__dow\" role=\"row\">\n @for (d of dow; track d; let i = $index) {\n <span role=\"columnheader\" [attr.aria-label]=\"dowFull[i]\" [attr.abbr]=\"dowFull[i]\">{{\n d\n }}</span>\n }\n </div>\n @for (week of weeks(); track $index) {\n <div class=\"strct-dp__grid\" role=\"row\">\n @for (cell of week; track cell.iso) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"strct-dp__day\"\n [class.strct-dp__day--muted]=\"!cell.inMonth\"\n [class.strct-dp__day--today]=\"cell.iso === today\"\n [class.strct-dp__day--focused]=\"cell.iso === focusedIso()\"\n [class.strct-dp__day--selected]=\"cell.iso === value()\"\n [attr.data-iso]=\"cell.iso\"\n [attr.tabindex]=\"cell.iso === focusedIso() ? 0 : -1\"\n [attr.aria-selected]=\"cell.iso === value()\"\n [attr.aria-current]=\"cell.iso === today ? 'date' : null\"\n [attr.aria-label]=\"cellAria(cell)\"\n (click)=\"pick(cell.iso)\"\n (keydown)=\"onKeydown($event)\"\n >\n {{ cell.day }}\n </button>\n }\n </div>\n }\n </div>\n </div>\n }\n `,\n host: { class: 'strct-dp' },\n styles: [\n `\n .strct-dp {\n position: relative;\n display: inline-block;\n width: 100%;\n max-width: 240px;\n }\n .strct-dp__field {\n position: relative;\n }\n .strct-dp__input {\n padding-inline-end: 36px;\n cursor: pointer;\n }\n .strct-dp__icon {\n position: absolute;\n right: 4px;\n top: 50%;\n transform: translateY(-50%);\n display: inline-flex;\n padding: 5px;\n border: 0;\n border-radius: 5px;\n background: transparent;\n color: var(--t2);\n cursor: pointer;\n }\n .strct-dp__icon:hover {\n color: var(--acc);\n background: var(--bg-3);\n }\n .strct-dp__panel {\n position: absolute;\n top: calc(100% + 5px);\n left: 0;\n z-index: 250;\n width: 250px;\n padding: 10px;\n background: var(--bg-1);\n border: 1px solid var(--b2);\n border-radius: 9px;\n box-shadow: var(--shh);\n }\n .strct-dp__head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 8px;\n }\n .strct-dp__title {\n font-size: 13px;\n font-weight: 600;\n color: var(--t1);\n }\n .strct-dp__nav {\n display: inline-flex;\n padding: 5px;\n border: 0;\n border-radius: 5px;\n background: transparent;\n color: var(--t2);\n cursor: pointer;\n }\n .strct-dp__nav:hover {\n color: var(--t1);\n background: var(--bg-3);\n }\n .strct-dp__dow {\n display: grid;\n grid-template-columns: repeat(7, 1fr);\n margin-bottom: 4px;\n }\n .strct-dp__dow span {\n text-align: center;\n font-size: 12px;\n font-weight: 600;\n color: var(--t3);\n padding: 4px 0;\n }\n .strct-dp__grid {\n display: grid;\n grid-template-columns: repeat(7, 1fr);\n gap: 2px;\n }\n .strct-dp__day {\n aspect-ratio: 1;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: 0;\n border-radius: 6px;\n background: transparent;\n cursor: pointer;\n font-family: var(--font);\n font-size: 12px;\n color: var(--t1);\n }\n .strct-dp__day:hover {\n background: var(--bg-3);\n }\n .strct-dp__day--muted {\n color: var(--t3);\n }\n .strct-dp__day--today {\n box-shadow: inset 0 0 0 1px var(--acc30);\n }\n .strct-dp__day--focused {\n box-shadow: inset 0 0 0 2px var(--acc);\n }\n .strct-dp__day--selected {\n background: var(--acc);\n color: var(--inv);\n }\n .strct-dp__day--selected:hover {\n background: var(--acc);\n }\n `,\n ],\n})\nexport class StrctDatepicker implements ControlValueAccessor {\n private readonly host = inject(ElementRef<HTMLElement>);\n\n /** Placeholder text when empty. */\n readonly placeholder = input('Select a date');\n protected readonly dow = DOW;\n protected readonly dowFull = DOW_FULL;\n protected readonly titleId = `strct-dp-title-${++dpUid}`;\n\n readonly value = signal('');\n readonly open = signal(false);\n readonly isDisabled = signal(false);\n /** Keyboard cursor within the open calendar. */\n readonly focusedIso = signal('');\n private readonly view = signal(this.startOfMonth(new Date()));\n\n protected get today(): string {\n const d = new Date();\n return toIso(d.getFullYear(), d.getMonth(), d.getDate());\n }\n\n protected readonly monthLabel = computed(() => {\n const v = this.view();\n return `${MONTHS[v.m]} ${v.y}`;\n });\n\n protected readonly displayLabel = computed(() => {\n const iso = this.value();\n if (!iso) return '';\n const [y, m, d] = iso.split('-').map(Number);\n return `${MONTHS[m - 1].slice(0, 3)} ${d}, ${y}`;\n });\n\n protected readonly cells = computed<DayCell[]>(() => {\n const { y, m } = this.view();\n const firstDow = new Date(y, m, 1).getDay();\n const start = new Date(y, m, 1 - firstDow);\n return Array.from({ length: 42 }, (_, i) => {\n const d = new Date(start.getFullYear(), start.getMonth(), start.getDate() + i);\n return {\n day: d.getDate(),\n iso: toIso(d.getFullYear(), d.getMonth(), d.getDate()),\n inMonth: d.getMonth() === m,\n };\n });\n });\n\n /** The 42 cells chunked into ARIA grid rows (weeks). */\n protected readonly weeks = computed<DayCell[][]>(() => {\n const all = this.cells();\n return Array.from({ length: 6 }, (_, w) => all.slice(w * 7, w * 7 + 7));\n });\n\n /** Accessible name of one day cell: \"Tuesday, March 4, 2026\". */\n protected cellAria(cell: DayCell): string {\n const [y, m, d] = cell.iso.split('-').map(Number);\n const dow = DOW_FULL[new Date(y, m - 1, d).getDay()];\n return `${dow}, ${MONTHS[m - 1]} ${d}, ${y}`;\n }\n\n private onChange: (value: string) => void = () => {};\n private onTouched: () => void = () => {};\n\n toggle(): void {\n if (this.isDisabled()) return;\n const next = !this.open();\n this.open.set(next);\n if (next) this.syncFocus();\n }\n\n shiftMonth(delta: number): void {\n const { y, m } = this.view();\n this.view.set(this.startOfMonth(new Date(y, m + delta, 1)));\n }\n\n pick(iso: string): void {\n this.value.set(iso);\n this.focusedIso.set(iso);\n const [y, m] = iso.split('-').map(Number);\n this.view.set({ y, m: m - 1 });\n this.close();\n this.onChange(iso);\n this.onTouched();\n }\n\n constructor() {\n // Roving focus: the keyboard cursor's day cell takes real focus while the\n // calendar is open (APG date-picker dialog pattern); the input gets it back\n // on close via close().\n effect(() => {\n const open = this.open();\n const iso = this.focusedIso();\n untracked(() => {\n if (!open || !iso) return;\n setTimeout(() =>\n (this.host.nativeElement as HTMLElement)\n .querySelector<HTMLButtonElement>(`.strct-dp__day[data-iso=\"${iso}\"]`)\n ?.focus(),\n );\n });\n });\n }\n\n onKeydown(event: KeyboardEvent): void {\n if (this.isDisabled()) return;\n if (!this.open()) {\n if (event.key === 'ArrowDown' || event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.toggle();\n }\n return;\n }\n switch (event.key) {\n case 'ArrowLeft':\n event.preventDefault();\n this.shiftFocus(-1);\n break;\n case 'ArrowRight':\n event.preventDefault();\n this.shiftFocus(1);\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.shiftFocus(-7);\n break;\n case 'ArrowDown':\n event.preventDefault();\n this.shiftFocus(7);\n break;\n case 'Home': {\n // Start of the focused week (APG grid pattern).\n event.preventDefault();\n this.shiftFocus(-this.focusedDow());\n break;\n }\n case 'End': {\n event.preventDefault();\n this.shiftFocus(6 - this.focusedDow());\n break;\n }\n case 'PageUp':\n event.preventDefault();\n this.shiftFocus(0, event.shiftKey ? -12 : -1); // Shift = previous year\n break;\n case 'PageDown':\n event.preventDefault();\n this.shiftFocus(0, event.shiftKey ? 12 : 1); // Shift = next year\n break;\n case 'Enter':\n case ' ':\n event.preventDefault();\n if (this.focusedIso()) this.pick(this.focusedIso());\n break;\n case 'Escape':\n event.preventDefault();\n this.close();\n break;\n }\n }\n\n /** Day-of-week (0–6) of the keyboard cursor. */\n private focusedDow(): number {\n const [y, m, d] = (this.focusedIso() || this.today).split('-').map(Number);\n return new Date(y, m - 1, d).getDay();\n }\n\n /** Close the panel and hand focus back to the input. */\n private close(): void {\n this.open.set(false);\n (this.host.nativeElement as HTMLElement)\n .querySelector<HTMLInputElement>('.strct-dp__input')\n ?.focus();\n }\n\n private syncFocus(): void {\n const base = this.value() || this.today;\n this.focusedIso.set(base);\n const [y, m] = base.split('-').map(Number);\n this.view.set({ y, m: m - 1 });\n }\n\n private shiftFocus(days: number, months = 0): void {\n const [y, m, d] = (this.focusedIso() || this.today).split('-').map(Number);\n const next = new Date(y, m - 1 + months, d + days);\n this.focusedIso.set(toIso(next.getFullYear(), next.getMonth(), next.getDate()));\n this.view.set({ y: next.getFullYear(), m: next.getMonth() });\n }\n\n @HostListener('document:click', ['$event'])\n protected onDocClick(event: MouseEvent): void {\n if (this.open() && !this.host.nativeElement.contains(event.target as Node)) {\n this.open.set(false);\n }\n }\n\n @HostListener('document:keydown.escape')\n protected onEscape(): void {\n this.open.set(false);\n }\n\n private startOfMonth(date: Date): { y: number; m: number } {\n return { y: date.getFullYear(), m: date.getMonth() };\n }\n\n writeValue(value: string): void {\n this.value.set(value || '');\n if (value) {\n const [y, m] = value.split('-').map(Number);\n if (y && m) this.view.set({ y, m: m - 1 });\n }\n }\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n ElementRef,\n HostListener,\n forwardRef,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { StrctOverlay } from '../overlay/overlay';\n\nconst DEFAULT_SWATCHES = [\n '#7b9ec8',\n '#5a7ea3',\n '#7da87e',\n '#5e8a60',\n '#bfae6a',\n '#9a8a3e',\n '#b87872',\n '#a0635c',\n '#96724e',\n '#c49a6c',\n '#8d7bc8',\n '#5a5a64',\n];\n\nconst HEX = /^#([0-9a-f]{6})$/i;\n\n/**\n * Swatch-based color picker with a hex field. CVA value is a `#rrggbb` string.\n * <strct-color-picker [(ngModel)]=\"color\" />\n */\n@Component({\n selector: 'strct-color-picker',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctOverlay],\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => StrctColorPicker), multi: true },\n ],\n template: `\n <button\n #trigger\n type=\"button\"\n class=\"strct-cp__trigger\"\n [disabled]=\"isDisabled()\"\n [attr.aria-expanded]=\"open()\"\n (click)=\"toggle()\"\n >\n <span class=\"strct-cp__swatch\" [style.background]=\"value() || 'transparent'\"></span>\n <span class=\"strct-cp__value\">{{ value() || 'Pick a color' }}</span>\n </button>\n\n @if (open()) {\n <div\n class=\"strct-cp__panel\"\n role=\"dialog\"\n [strctOverlay]=\"trigger\"\n strctOverlayPlacement=\"bottom-start\"\n >\n <div class=\"strct-cp__grid\">\n @for (color of swatches(); track color) {\n <button\n type=\"button\"\n class=\"strct-cp__chip\"\n [class.strct-cp__chip--active]=\"eq(color)\"\n [style.background]=\"color\"\n [attr.aria-label]=\"color\"\n (click)=\"pick(color)\"\n ></button>\n }\n </div>\n <input\n class=\"strct-control strct-cp__hex\"\n spellcheck=\"false\"\n placeholder=\"#000000\"\n [value]=\"draft()\"\n (input)=\"onHex($event)\"\n />\n </div>\n }\n `,\n host: { class: 'strct-cp' },\n styles: [\n `\n .strct-cp {\n position: relative;\n display: inline-block;\n }\n .strct-cp__trigger {\n display: inline-flex;\n align-items: center;\n gap: 9px;\n padding: 6px 11px 6px 7px;\n border-radius: 6px;\n cursor: pointer;\n font-family: var(--font);\n font-size: 13px;\n color: var(--t1);\n background: var(--bg-2);\n border: 1px solid var(--b2);\n }\n .strct-cp__trigger:hover {\n border-color: var(--b3);\n }\n .strct-cp__swatch {\n width: 20px;\n height: 20px;\n border-radius: 5px;\n flex-shrink: 0;\n border: 1px solid var(--b3);\n background-clip: padding-box;\n }\n .strct-cp__value {\n font-family: var(--mono);\n font-size: 12px;\n }\n .strct-cp__panel {\n position: absolute;\n top: calc(100% + 5px);\n left: 0;\n z-index: 250;\n width: 196px;\n padding: 10px;\n background: var(--bg-1);\n border: 1px solid var(--b2);\n border-radius: 9px;\n box-shadow: var(--shh);\n }\n .strct-cp__grid {\n display: grid;\n grid-template-columns: repeat(6, 1fr);\n gap: 6px;\n margin-bottom: 9px;\n }\n .strct-cp__chip {\n aspect-ratio: 1;\n border-radius: 5px;\n cursor: pointer;\n padding: 0;\n border: 1px solid var(--b2);\n background-clip: padding-box;\n transition: transform 0.12s ease;\n }\n .strct-cp__chip:hover {\n transform: scale(1.1);\n }\n .strct-cp__chip--active {\n box-shadow:\n 0 0 0 2px var(--bg-1),\n 0 0 0 4px var(--acc);\n }\n .strct-cp__hex {\n font-family: var(--mono);\n font-size: 12px;\n text-transform: lowercase;\n }\n `,\n ],\n})\nexport class StrctColorPicker implements ControlValueAccessor {\n private readonly host = inject(ElementRef<HTMLElement>);\n /** Custom palette swatches. */\n readonly swatches = input<string[]>(DEFAULT_SWATCHES);\n\n readonly value = signal('');\n readonly draft = signal('');\n readonly open = signal(false);\n readonly isDisabled = signal(false);\n\n private onChange: (value: string) => void = () => {};\n private onTouched: () => void = () => {};\n\n toggle(): void {\n if (this.isDisabled()) return;\n this.draft.set(this.value());\n this.open.update((v) => !v);\n }\n\n protected eq(color: string): boolean {\n return color.toLowerCase() === this.value().toLowerCase();\n }\n\n pick(color: string): void {\n this.commit(color);\n this.open.set(false);\n }\n\n onHex(event: Event): void {\n const raw = (event.target as HTMLInputElement).value.trim();\n this.draft.set(raw);\n if (HEX.test(raw)) this.commit(raw.toLowerCase());\n }\n\n private commit(color: string): void {\n this.value.set(color);\n this.draft.set(color);\n this.onChange(color);\n this.onTouched();\n }\n\n @HostListener('document:click', ['$event'])\n protected onDocClick(event: MouseEvent): void {\n if (this.open() && !this.host.nativeElement.contains(event.target as Node)) {\n this.open.set(false);\n }\n }\n\n @HostListener('document:keydown.escape')\n protected onEscape(): void {\n this.open.set(false);\n }\n\n writeValue(value: string): void {\n this.value.set(value || '');\n this.draft.set(value || '');\n }\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n ElementRef,\n HostListener,\n computed,\n forwardRef,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { StrctIcon } from '../icon/icon';\nimport { StrctOverlay } from '../overlay/overlay';\n\n/** One option in a cascade select. */\nexport interface StrctCascadeOption {\n label: string;\n value?: unknown;\n children?: StrctCascadeOption[];\n}\n\n/** DI token the nodes use to talk back to the host control (avoids a circular type). */\nexport abstract class StrctCascadeHost {\n abstract pick(value: unknown): void;\n abstract isSelected(value: unknown): boolean;\n}\n\n/**\n * One row in the cascade. Leaf rows select on click; group rows reveal a\n * fly-out of their children on hover. Recurses to any depth.\n */\n@Component({\n selector: 'strct-cascade-node',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon, forwardRef(() => StrctCascadeNode)],\n template: `\n <div\n class=\"strct-csn\"\n [class.strct-csn--selected]=\"isLeafSelected()\"\n role=\"menuitem\"\n tabindex=\"0\"\n (mouseenter)=\"hasChildren() && open.set(true)\"\n (mouseleave)=\"open.set(false)\"\n (click)=\"onClick($event)\"\n (keydown.enter)=\"onClick($event)\"\n (keydown.space)=\"onClick($event)\"\n >\n <span class=\"strct-csn__label\">{{ option().label }}</span>\n @if (hasChildren()) {\n <strct-icon class=\"strct-csn__arrow\" name=\"chevronRight\" [size]=\"12\" [strokeWidth]=\"1.6\" />\n }\n @if (hasChildren() && open()) {\n <div class=\"strct-csn__flyout\" role=\"menu\">\n @for (child of option().children; track child) {\n <strct-cascade-node [option]=\"child\" />\n }\n </div>\n }\n </div>\n `,\n styles: [\n `\n .strct-csn {\n position: relative;\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 7px 8px 7px 10px;\n border-radius: 5px;\n cursor: pointer;\n font-size: 13px;\n color: var(--t1);\n }\n .strct-csn:hover {\n background: var(--bg-3);\n }\n .strct-csn--selected {\n color: var(--acc);\n background: var(--acc-m);\n }\n .strct-csn__label {\n flex: 1;\n white-space: nowrap;\n }\n .strct-csn__arrow {\n color: var(--t3);\n }\n .strct-csn__flyout {\n position: absolute;\n top: -5px;\n left: 100%;\n z-index: 1;\n min-width: 160px;\n margin-inline-start: 2px;\n padding: 4px;\n background: var(--bg-1);\n border: 1px solid var(--b2);\n border-radius: 7px;\n box-shadow: var(--shh);\n }\n `,\n ],\n})\nexport class StrctCascadeNode {\n private readonly host = inject(StrctCascadeHost);\n /** Option. */\n readonly option = input.required<StrctCascadeOption>();\n readonly open = signal(false);\n\n protected readonly hasChildren = computed(() => !!this.option().children?.length);\n protected readonly isLeafSelected = computed(\n () => !this.hasChildren() && this.host.isSelected(this.option().value),\n );\n\n protected onClick(event: Event): void {\n if (this.hasChildren()) {\n event.stopPropagation(); // group rows only expand\n } else {\n this.host.pick(this.option().value);\n }\n }\n}\n\n/**\n * Hierarchical single-select — pick a leaf from nested groups (e.g. a port\n * group under a virtual switch). CVA-compatible.\n * <strct-cascade-select [options]=\"switches\" [(ngModel)]=\"portGroup\" />\n */\n@Component({\n selector: 'strct-cascade-select',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctCascadeNode, StrctIcon, StrctOverlay],\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => StrctCascadeSelect), multi: true },\n { provide: StrctCascadeHost, useExisting: forwardRef(() => StrctCascadeSelect) },\n ],\n template: `\n <button\n #trigger\n type=\"button\"\n class=\"strct-cs__trigger\"\n [attr.aria-expanded]=\"open()\"\n [disabled]=\"isDisabled()\"\n (click)=\"toggle()\"\n >\n <span class=\"strct-cs__value\" [class.strct-cs__value--empty]=\"!selectedLabel()\">\n {{ selectedLabel() || placeholder() }}\n </span>\n <strct-icon class=\"strct-cs__caret\" name=\"chevronDown\" [size]=\"14\" />\n </button>\n @if (open()) {\n <div\n class=\"strct-cs__panel\"\n role=\"menu\"\n [strctOverlay]=\"trigger\"\n strctOverlayPlacement=\"bottom-start\"\n >\n @for (opt of options(); track opt) {\n <strct-cascade-node [option]=\"opt\" />\n }\n </div>\n }\n `,\n host: { class: 'strct-cs' },\n styles: [\n `\n .strct-cs {\n position: relative;\n display: inline-block;\n width: 100%;\n max-width: 280px;\n }\n .strct-cs__trigger {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 7px 10px;\n border-radius: 6px;\n cursor: pointer;\n font-family: var(--font);\n font-size: 13px;\n color: var(--t1);\n background: var(--bg-2);\n border: 1px solid var(--b2);\n text-align: start;\n }\n .strct-cs__trigger:hover {\n border-color: var(--b3);\n }\n .strct-cs__value {\n flex: 1;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n .strct-cs__value--empty {\n color: var(--t3);\n }\n .strct-cs__caret {\n color: var(--t3);\n }\n .strct-cs__panel {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n z-index: 200;\n min-width: 180px;\n padding: 4px;\n background: var(--bg-1);\n border: 1px solid var(--b2);\n border-radius: 7px;\n box-shadow: var(--shh);\n }\n `,\n ],\n})\nexport class StrctCascadeSelect extends StrctCascadeHost implements ControlValueAccessor {\n private readonly elementRef = inject(ElementRef<HTMLElement>);\n\n /** Available options. */\n readonly options = input<StrctCascadeOption[]>([]);\n /** Placeholder text when empty. */\n readonly placeholder = input('Select…');\n\n readonly value = signal<unknown>(null);\n readonly open = signal(false);\n readonly isDisabled = signal(false);\n\n protected readonly selectedLabel = computed(() => this.findLabel(this.options(), this.value()));\n\n private onChange: (value: unknown) => void = () => {};\n private onTouched: () => void = () => {};\n\n toggle(): void {\n if (!this.isDisabled()) this.open.update((v) => !v);\n }\n\n override pick(value: unknown): void {\n this.value.set(value);\n this.open.set(false);\n this.onChange(value);\n this.onTouched();\n }\n\n override isSelected(value: unknown): boolean {\n return value !== undefined && value === this.value();\n }\n\n private findLabel(opts: StrctCascadeOption[], value: unknown): string {\n for (const o of opts) {\n if (o.value !== undefined && o.value === value) return o.label;\n if (o.children) {\n const found = this.findLabel(o.children, value);\n if (found) return found;\n }\n }\n return '';\n }\n\n @HostListener('document:click', ['$event'])\n protected onDocClick(event: MouseEvent): void {\n if (this.open() && !this.elementRef.nativeElement.contains(event.target as Node)) {\n this.open.set(false);\n }\n }\n\n @HostListener('document:keydown.escape')\n protected onEscape(): void {\n this.open.set(false);\n }\n\n writeValue(value: unknown): void {\n this.value.set(value);\n }\n registerOnChange(fn: (value: unknown) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n input,\n} from '@angular/core';\n\n/** One row in a `StrctDescriptionList` when driven by the `items` input. */\nexport interface StrctDescItem {\n label: string;\n value?: string | number;\n /** Render the value in the monospace face. */\n mono?: boolean;\n /** Dim the value (secondary information). */\n muted?: boolean;\n}\n\n/** Value alignment for the stacked (non-inline) layout. */\nexport type StrctDescAlign = 'between' | 'start';\n\n/**\n * Compact definition list: aligned `label : value` rows with an optional trailing\n * slot. The `inline` variant is the horizontal \"stat strip\" (label-value pairs in\n * a row). Replaces the hand-rolled `<dl>` + flex.\n *\n * Drive it with the `items` input, or project `<strct-desc>` rows so a value can\n * host a badge, icon or any rich content:\n *\n * <strct-description-list>\n * <strct-desc label=\"IPv4\" mono>172.16.75.100/24</strct-desc>\n * <strct-desc label=\"IPv6\"><strct-badge status=\"success\">Enabled</strct-badge></strct-desc>\n * </strct-description-list>\n *\n * <strct-description-list [items]=\"[{ label: 'Gateway', value: '172.16.75.2', mono: true }]\" />\n */\n@Component({\n selector: 'strct-description-list',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n @for (item of items(); track $index) {\n <div\n class=\"strct-desc\"\n [class.strct-desc--mono]=\"item.mono\"\n [class.strct-desc--muted]=\"item.muted\"\n >\n <span class=\"strct-desc__label\">{{ item.label }}</span>\n <span class=\"strct-desc__value\">{{ item.value }}</span>\n </div>\n }\n <ng-content />\n `,\n host: {\n class: 'strct-dl',\n '[class.strct-dl--inline]': 'inline()',\n '[class.strct-dl--start]': \"align() === 'start'\",\n },\n styles: [\n `\n .strct-dl {\n display: flex;\n flex-direction: column;\n min-width: 0;\n }\n .strct-dl--inline {\n flex-direction: row;\n flex-wrap: wrap;\n gap: var(--space-3) var(--space-5);\n align-items: flex-start;\n }\n\n /* ── A single row / pair ──────────────────────────────────── */\n .strct-desc {\n display: flex;\n align-items: baseline;\n gap: var(--space-3);\n padding: 6px 0;\n font-size: var(--text-md);\n min-width: 0;\n }\n /* Stacked default: label left, value right. */\n .strct-dl:not(.strct-dl--inline) .strct-desc {\n justify-content: space-between;\n }\n .strct-dl:not(.strct-dl--inline) .strct-desc + .strct-desc {\n border-top: 1px solid var(--b1);\n }\n .strct-dl--start .strct-desc {\n justify-content: flex-start;\n }\n\n /* Inline stat strip: small label caption above the value. */\n .strct-dl--inline .strct-desc {\n flex-direction: column;\n align-items: flex-start;\n gap: 3px;\n padding: 0;\n }\n\n .strct-desc__label {\n color: var(--t3);\n font-size: var(--text-sm);\n font-weight: 500;\n flex-shrink: 0;\n white-space: nowrap;\n }\n .strct-desc__value {\n color: var(--t1);\n min-width: 0;\n text-align: end;\n }\n .strct-dl--inline .strct-desc__value,\n .strct-dl--start .strct-desc__value {\n text-align: start;\n }\n .strct-desc--mono .strct-desc__value {\n font-family: var(--mono);\n font-size: var(--text-sm);\n }\n .strct-desc--muted .strct-desc__value {\n color: var(--t3);\n }\n /* Collapse an empty value wrapper (e.g. items with no value). */\n .strct-desc__value:empty {\n display: none;\n }\n `,\n ],\n})\nexport class StrctDescriptionList {\n /** Rows, as an alternative to projecting `<strct-desc>` children. */\n readonly items = input<StrctDescItem[]>([]);\n /** Horizontal stat-strip layout instead of stacked rows. */\n readonly inline = input(false, { transform: booleanAttribute });\n /** Value alignment in stacked mode. */\n readonly align = input<StrctDescAlign>('between');\n}\n\n/**\n * One projected `label → value` row inside a `<strct-description-list>`. The\n * value is whatever you project, so it can host a badge, icon or formatted text.\n */\n@Component({\n selector: 'strct-desc',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n <span class=\"strct-desc__label\">{{ label() }}</span>\n <span class=\"strct-desc__value\"><ng-content /></span>\n `,\n host: {\n class: 'strct-desc',\n '[class.strct-desc--mono]': 'mono()',\n '[class.strct-desc--muted]': 'muted()',\n },\n})\nexport class StrctDesc {\n /** The row's label. */\n readonly label = input.required<string>();\n /** Render the projected value in the monospace face. */\n readonly mono = input(false, { transform: booleanAttribute });\n /** Dim the projected value. */\n readonly muted = input(false, { transform: booleanAttribute });\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n Directive,\n TemplateRef,\n booleanAttribute,\n computed,\n contentChildren,\n inject,\n input,\n} from '@angular/core';\n\n/** Column definition for the table. */\nexport interface StrctColumn {\n key: string;\n label: string;\n align?: 'start' | 'center' | 'end';\n width?: string;\n}\n\n/** Shorthand for a record-shaped table/datagrid row. */\nexport type StrctRow = Record<string, unknown>;\n\n/** Context passed to a per-column cell template. */\nexport interface StrctCellContext {\n /** The row object. */\n $implicit: StrctRow;\n /** The raw value for this column (`row[column.key]`). */\n value: unknown;\n /** The column definition. */\n column: StrctColumn;\n}\n\n/**\n * Per-column cell template for `strct-table` / `strct-datagrid`. The column key\n * is the directive value; the row, value and column are the template context:\n *\n * <ng-template strctCell=\"status\" let-row let-value=\"value\">\n * <strct-badge [status]=\"row['success'] ? 'success' : 'critical'\">{{ value }}</strct-badge>\n * </ng-template>\n */\n@Directive({ selector: '[strctCell]' })\nexport class StrctCellDef {\n /** Key. */\n readonly key = input.required<string>({ alias: 'strctCell' });\n readonly template = inject<TemplateRef<StrctCellContext>>(TemplateRef);\n}\n\n/**\n * Declarative data table. Cells render `row[col.key]` as text by default; supply\n * a `*strctCell` template per column for custom content.\n * <strct-table [columns]=\"cols\" [rows]=\"data\" hover />\n */\n@Component({\n selector: 'strct-table',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet],\n template: `\n <table class=\"strct-table\">\n <thead>\n <tr>\n @for (col of columns(); track col.key) {\n <th [style.text-align]=\"col.align ?? 'start'\" [style.width]=\"col.width\">\n {{ col.label }}\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @if (loading()) {\n @for (_ of [1, 2, 3]; track $index) {\n <tr class=\"strct-table__skeleton-row\">\n @for (col of columns(); track col.key) {\n <td [style.text-align]=\"col.align ?? 'start'\">\n <div class=\"strct-table__skeleton-block\"></div>\n </td>\n }\n </tr>\n }\n } @else {\n @for (row of rows(); track $index) {\n <tr>\n @for (col of columns(); track col.key) {\n <td [style.text-align]=\"col.align ?? 'start'\">\n @if (cellTemplate(col.key); as tpl) {\n <ng-container\n [ngTemplateOutlet]=\"tpl\"\n [ngTemplateOutletContext]=\"{\n $implicit: row,\n value: row[col.key],\n column: col,\n }\"\n />\n } @else {\n {{ row[col.key] }}\n }\n </td>\n }\n </tr>\n } @empty {\n <tr>\n <td class=\"strct-table__empty\" [attr.colspan]=\"columns().length\">\n {{ emptyText() }}\n </td>\n </tr>\n }\n }\n </tbody>\n </table>\n `,\n host: {\n class: 'strct-table-host',\n tabindex: '0',\n role: 'region',\n 'aria-label': 'Table',\n '[class.strct-table-host--striped]': 'striped()',\n '[class.strct-table-host--hover]': 'hover()',\n },\n styles: [\n `\n .strct-table-host {\n display: block;\n overflow-x: auto;\n }\n .strct-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n border: 1px solid var(--b2);\n border-radius: 8px;\n overflow: hidden;\n }\n .strct-table th,\n .strct-table td {\n padding: 9px 13px;\n text-align: start;\n border-bottom: 1px solid var(--b1);\n }\n .strct-table th {\n font-size: 12px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.4px;\n color: var(--t2);\n background: var(--bg-2);\n }\n .strct-table td {\n color: var(--t1);\n }\n .strct-table tbody tr:last-child td {\n border-bottom: 0;\n }\n .strct-table-host--striped tbody tr:nth-child(even) td {\n background: var(--bg-2);\n }\n .strct-table-host--hover tbody tr:hover td {\n background: var(--acc-s);\n }\n @keyframes strct-skeleton-pulse {\n 0%,\n 100% {\n opacity: 0.4;\n }\n 50% {\n opacity: 0.7;\n }\n }\n .strct-table__skeleton-block {\n height: 12px;\n background: var(--bg-3);\n border-radius: var(--radius-sm);\n animation: strct-skeleton-pulse 1.4s ease infinite;\n }\n .strct-table__skeleton-row td {\n border-bottom: 1px solid var(--b1);\n }\n .strct-table__empty {\n text-align: center;\n color: var(--t3);\n padding: 22px;\n }\n `,\n ],\n})\nexport class StrctTable {\n /** Column definitions. */\n readonly columns = input.required<StrctColumn[]>();\n /** Data rows. */\n readonly rows = input.required<StrctRow[]>();\n /** Enable zebra-striping. */\n readonly striped = input(false, { transform: booleanAttribute });\n /** Highlight rows on hover. */\n readonly hover = input(false, { transform: booleanAttribute });\n /** Message shown when there are no rows. */\n readonly emptyText = input('No data');\n /** Show skeleton rows while data is loading. */\n readonly loading = input(false, { transform: booleanAttribute });\n\n private readonly cellDefs = contentChildren(StrctCellDef);\n private readonly cellMap = computed(() => {\n const m = new Map<string, TemplateRef<StrctCellContext>>();\n for (const d of this.cellDefs()) m.set(d.key(), d.template);\n return m;\n });\n\n protected cellTemplate(key: string): TemplateRef<StrctCellContext> | null {\n return this.cellMap().get(key) ?? null;\n }\n}\n","/**\n * Minimal, dependency-free XLSX writer for the datagrid's Excel export.\n *\n * An .xlsx file is a ZIP of SpreadsheetML parts. This builds the five\n * required parts with inline strings and zips them with STORED (uncompressed)\n * entries — no runtime dependency, byte-accurate CRC32, opens in Excel,\n * LibreOffice and Google Sheets.\n */\n\n/** One worksheet cell value. */\nexport type XlsxValue = string | number | boolean | null | undefined;\n\nconst CRC_TABLE = (() => {\n const t = new Uint32Array(256);\n for (let n = 0; n < 256; n++) {\n let c = n;\n for (let k = 0; k < 8; k++) c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;\n t[n] = c >>> 0;\n }\n return t;\n})();\n\nfunction crc32(data: Uint8Array): number {\n let c = 0xffffffff;\n for (const byte of data) c = CRC_TABLE[(c ^ byte) & 0xff] ^ (c >>> 8);\n return (c ^ 0xffffffff) >>> 0;\n}\n\nconst enc = new TextEncoder();\n\ninterface ZipEntry {\n name: string;\n data: Uint8Array;\n}\n\n/** ZIP with STORED entries (no compression — spreadsheets are small). */\nfunction zip(entries: ZipEntry[]): Uint8Array {\n const chunks: Uint8Array[] = [];\n const central: Uint8Array[] = [];\n let offset = 0;\n const u16 = (n: number) => new Uint8Array([n & 0xff, (n >> 8) & 0xff]);\n const u32 = (n: number) =>\n new Uint8Array([n & 0xff, (n >> 8) & 0xff, (n >> 16) & 0xff, (n >> 24) & 0xff]);\n const cat = (...parts: Uint8Array[]) => {\n const total = parts.reduce((s, p) => s + p.length, 0);\n const out = new Uint8Array(total);\n let o = 0;\n for (const p of parts) {\n out.set(p, o);\n o += p.length;\n }\n return out;\n };\n for (const { name, data } of entries) {\n const nameBytes = enc.encode(name);\n const crc = crc32(data);\n const local = cat(\n u32(0x04034b50),\n u16(20), // version needed\n u16(0), // flags\n u16(0), // method: stored\n u16(0),\n u16(0), // mod time/date\n u32(crc),\n u32(data.length),\n u32(data.length),\n u16(nameBytes.length),\n u16(0),\n nameBytes,\n data,\n );\n central.push(\n cat(\n u32(0x02014b50),\n u16(20),\n u16(20),\n u16(0),\n u16(0),\n u16(0),\n u16(0),\n u32(crc),\n u32(data.length),\n u32(data.length),\n u16(nameBytes.length),\n u16(0),\n u16(0),\n u16(0),\n u16(0),\n u32(0),\n u32(offset),\n nameBytes,\n ),\n );\n chunks.push(local);\n offset += local.length;\n }\n const centralStart = offset;\n const centralBytes = cat(...central);\n const end = cat(\n u32(0x06054b50),\n u16(0),\n u16(0),\n u16(entries.length),\n u16(entries.length),\n u32(centralBytes.length),\n u32(centralStart),\n u16(0),\n );\n return cat(...chunks, centralBytes, end);\n}\n\nconst xml = (s: XlsxValue): string =>\n String(s ?? '')\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"');\n\n/** A1-style column ref: 0 → A, 26 → AA … */\nfunction colRef(i: number): string {\n let s = '';\n for (let n = i; n >= 0; n = Math.floor(n / 26) - 1) s = String.fromCharCode(65 + (n % 26)) + s;\n return s;\n}\n\n/**\n * Build a single-sheet workbook: `header` as a bold-free first row, then\n * `rows`. Numbers stay numeric; everything else exports as inline strings.\n */\nexport function buildXlsx(header: string[], rows: XlsxValue[][], sheetName = 'Data'): Uint8Array {\n const rowXml = (cells: XlsxValue[], r: number) =>\n `<row r=\"${r}\">` +\n cells\n .map((v, c) => {\n const ref = `${colRef(c)}${r}`;\n if (typeof v === 'number' && Number.isFinite(v)) {\n return `<c r=\"${ref}\"><v>${v}</v></c>`;\n }\n return `<c r=\"${ref}\" t=\"inlineStr\"><is><t xml:space=\"preserve\">${xml(v)}</t></is></c>`;\n })\n .join('') +\n '</row>';\n\n const sheet =\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>` +\n `<worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"><sheetData>` +\n rowXml(header, 1) +\n rows.map((cells, i) => rowXml(cells, i + 2)).join('') +\n `</sheetData></worksheet>`;\n\n const workbook =\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>` +\n `<workbook xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" ` +\n `xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">` +\n `<sheets><sheet name=\"${xml(sheetName)}\" sheetId=\"1\" r:id=\"rId1\"/></sheets></workbook>`;\n\n const workbookRels =\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>` +\n `<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">` +\n `<Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\" Target=\"worksheets/sheet1.xml\"/>` +\n `</Relationships>`;\n\n const rootRels =\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>` +\n `<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">` +\n `<Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\" Target=\"xl/workbook.xml\"/>` +\n `</Relationships>`;\n\n const contentTypes =\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>` +\n `<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">` +\n `<Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/>` +\n `<Default Extension=\"xml\" ContentType=\"application/xml\"/>` +\n `<Override PartName=\"/xl/workbook.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\"/>` +\n `<Override PartName=\"/xl/worksheets/sheet1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\"/>` +\n `</Types>`;\n\n return zip([\n { name: '[Content_Types].xml', data: enc.encode(contentTypes) },\n { name: '_rels/.rels', data: enc.encode(rootRels) },\n { name: 'xl/workbook.xml', data: enc.encode(workbook) },\n { name: 'xl/_rels/workbook.xml.rels', data: enc.encode(workbookRels) },\n { name: 'xl/worksheets/sheet1.xml', data: enc.encode(sheet) },\n ]);\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n Directive,\n TemplateRef,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n contentChild,\n contentChildren,\n effect,\n inject,\n input,\n model,\n output,\n signal,\n untracked,\n} from '@angular/core';\nimport { StrctIcon } from '../icon/icon';\nimport { StrctPagination } from '../pagination/pagination';\n\n/** Every user-visible / assistive string in the grid, overridable for i18n. */\nexport interface StrctDatagridLabels {\n row: string;\n rows: string;\n selected: string;\n selectAll: string;\n selectRow: string;\n openDetail: string;\n toggleDetail: string;\n closeDetail: string;\n rowActions: string;\n chooseColumns: string;\n refresh: string;\n actions: string;\n}\n\nconst DG_LABELS: StrctDatagridLabels = {\n row: 'row',\n rows: 'rows',\n selected: 'selected',\n selectAll: 'Select all rows on this page',\n selectRow: 'Select row',\n openDetail: 'Open detail',\n toggleDetail: 'Toggle detail',\n closeDetail: 'Close detail',\n rowActions: 'Row actions',\n chooseColumns: 'Choose columns',\n refresh: 'Refresh data',\n actions: 'Actions',\n};\nimport { StrctCheckbox } from '../forms/checkbox';\nimport { StrctButton, StrctButtonGroup } from '../button/button';\nimport { StrctCellContext, StrctCellDef, StrctRow } from '../table/table';\nimport { StrctMenuItem, StrctMenuService } from '../context-menu/menu';\nimport { XlsxValue, buildXlsx } from './xlsx';\n\n/** Resolves a stable identity for a row: a property key, or a function. */\nexport type StrctRowId = string | ((row: StrctRow) => unknown);\n\n/** Column definition for the datagrid. */\nexport interface StrctDatagridColumn {\n key: string;\n label: string;\n sortable?: boolean;\n align?: 'start' | 'center' | 'end';\n width?: string;\n /** Allow the user to resize this column by dragging its right edge.\n * Defaults to the global {@link StrctDatagrid#resizable} setting. */\n resizable?: boolean;\n /**\n * Freeze this column against horizontal scroll. Mark **leading** columns\n * (utility columns freeze automatically alongside). Give every sticky column\n * except the last an explicit px `width` so offsets stay exact.\n */\n sticky?: boolean;\n}\n\ntype SortDir = 'asc' | 'desc';\n\n/** What the grid wants loaded in server-side (`lazy`) mode. */\nexport interface StrctDatagridLazyState {\n /** 1-based page. */\n page: number;\n pageSize: number;\n sortKey: string | null;\n sortDir: SortDir;\n}\n\n/** Persistable user column preferences (widths from resize, hidden from the\n * chooser, order from drag-reorder). */\nexport interface StrctDatagridColumnState {\n widths?: Record<string, number>;\n hidden?: string[];\n order?: string[];\n}\n\n/** One rendered tbody item: a data row, or a group header. */\ninterface DgItem {\n row?: StrctRow;\n group?: { key: unknown; label: string; count: number; collapsed: boolean };\n}\n\n/** Utility-column widths used when sticky columns are active (px). */\nconst UTIL_W = { detail: 36, expand: 36, sel: 40 } as const;\n/** Fallback width for a sticky column without an explicit px width. */\nconst STICKY_FALLBACK_W = 120;\n\n/**\n * Marks the expandable-row detail template. The row is the template's implicit\n * context: `<ng-template strctRowDetail let-row> … {{ row['name'] }} … </ng-template>`.\n */\n@Directive({ selector: '[strctRowDetail]' })\nexport class StrctRowDetailDef {\n readonly template = inject(TemplateRef);\n}\n\n/** Marks the persistent action-bar (toolbar) content shown above the grid. */\n@Directive({ selector: '[strctDatagridActionBar]' })\nexport class StrctDatagridActionBar {}\n\n/**\n * Interactive data table: sortable columns, row selection, expandable detail\n * rows, a batch action bar and built-in paging.\n * <strct-datagrid [columns]=\"cols\" [rows]=\"data\" selectable expandable [pageSize]=\"10\">\n * <button strct-button strctDatagridActions size=\"sm\">Migrate</button>\n * <ng-template strctRowDetail let-row> … </ng-template>\n * </strct-datagrid>\n */\n@Component({\n selector: 'strct-datagrid',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n StrctIcon,\n StrctPagination,\n NgTemplateOutlet,\n StrctCheckbox,\n StrctButton,\n StrctButtonGroup,\n ],\n template: `\n @if (actionBarDef()) {\n <div class=\"strct-dg__toolbar\"><ng-content select=\"[strctDatagridActionBar]\" /></div>\n }\n\n <div class=\"strct-dg__layout\" [class.strct-dg__layout--paned]=\"paneOpen()\">\n <div\n class=\"strct-dg__scroll\"\n tabindex=\"0\"\n role=\"region\"\n [attr.aria-label]=\"L().rows\"\n [style.max-height.px]=\"virtual() ? viewportHeight() : null\"\n (scroll)=\"virtual() && onScroll($event)\"\n >\n <table class=\"strct-dg\">\n <thead>\n <tr>\n @if (canDetail()) {\n <th\n class=\"strct-dg__expandcol\"\n [class.strct-dg__cell--sticky]=\"stickyActive()\"\n [style.insetInlineStart.px]=\"utilLeft('detail')\"\n ></th>\n }\n @if (canExpand()) {\n <th\n class=\"strct-dg__expandcol\"\n [class.strct-dg__cell--sticky]=\"stickyActive()\"\n [style.insetInlineStart.px]=\"utilLeft('expand')\"\n ></th>\n }\n @if (selectable()) {\n <th\n class=\"strct-dg__sel\"\n [class.strct-dg__cell--sticky]=\"stickyActive()\"\n [style.insetInlineStart.px]=\"utilLeft('sel')\"\n >\n <strct-checkbox\n [ariaLabel]=\"L().selectAll\"\n [checked]=\"allPageSelected()\"\n [indeterminate]=\"somePageSelected()\"\n (checkedChange)=\"toggleAll()\"\n />\n </th>\n }\n @for (col of visibleColumns(); track col.key) {\n <th\n [style.text-align]=\"col.align ?? 'start'\"\n [style.width]=\"colWidth(col.key) ?? col.width ?? null\"\n [class.strct-dg__th--sortable]=\"col.sortable\"\n [class.strct-dg__th--drop]=\"col.key === dropKey()\"\n [class.strct-dg__cell--sticky]=\"isSticky(col)\"\n [class.strct-dg__cell--sticky-last]=\"col.key === lastStickyKey()\"\n [style.insetInlineStart.px]=\"stickyLeft(col.key)\"\n [attr.tabindex]=\"col.sortable ? 0 : null\"\n [attr.aria-sort]=\"col.sortable ? ariaSort(col.key) : null\"\n [attr.draggable]=\"reorderable() ? true : null\"\n (dragstart)=\"onColDragStart(col.key, $event)\"\n (dragover)=\"onColDragOver(col.key, $event)\"\n (drop)=\"onColDrop(col.key)\"\n (dragend)=\"onColDragEnd()\"\n (click)=\"col.sortable && sortBy(col.key)\"\n (keydown.enter)=\"col.sortable && sortBy(col.key)\"\n (keydown.space)=\"col.sortable && onHeaderSpace($event, col.key)\"\n >\n <span class=\"strct-dg__hd\">\n {{ col.label }}\n @if (col.sortable) {\n <strct-icon\n class=\"strct-dg__sorticon\"\n [name]=\"sortIcon(col.key)\"\n [size]=\"13\"\n />\n }\n </span>\n @if (resizable() && col.resizable !== false) {\n <div\n class=\"strct-dg__resize\"\n (mousedown)=\"onResizeStart($event, col.key)\"\n ></div>\n }\n </th>\n }\n @if (canActions()) {\n <th class=\"strct-dg__actioncol\" [attr.aria-label]=\"L().actions\"></th>\n }\n </tr>\n </thead>\n <tbody>\n @if (loading()) {\n @for (_ of [1, 2, 3, 4, 5]; track $index) {\n <tr class=\"strct-dg__skeleton-row\">\n @if (canDetail()) {\n <td class=\"strct-dg__expandcell\"></td>\n }\n @if (canExpand()) {\n <td class=\"strct-dg__expandcell\"></td>\n }\n @if (selectable()) {\n <td class=\"strct-dg__sel\"></td>\n }\n @for (col of visibleColumns(); track col.key) {\n <td [style.text-align]=\"col.align ?? 'start'\">\n <div class=\"strct-dg__skeleton-block\"></div>\n </td>\n }\n @if (canActions()) {\n <td class=\"strct-dg__actioncell\"></td>\n }\n </tr>\n }\n } @else {\n @if (virtual() && topPad() > 0) {\n <tr class=\"strct-dg__vspacer\" aria-hidden=\"true\">\n <td [attr.colspan]=\"colspan()\" [style.height.px]=\"topPad()\"></td>\n </tr>\n }\n @for (it of displayItems(); track itemKey(it)) {\n @if (it.group; as grp) {\n <!-- Group header: distinct value + count, collapsible. -->\n <tr class=\"strct-dg__grouprow\">\n <td [attr.colspan]=\"colspan()\">\n <button\n type=\"button\"\n class=\"strct-dg__groupbtn\"\n [attr.aria-expanded]=\"!grp.collapsed\"\n (click)=\"toggleGroup(grp.key)\"\n >\n <span\n class=\"strct-dg__groupchev\"\n [class.strct-dg__groupchev--open]=\"!grp.collapsed\"\n >\n <strct-icon name=\"chevronRight\" [size]=\"12\" [strokeWidth]=\"1.7\" />\n </span>\n <span class=\"strct-dg__grouplabel\">{{ grp.label }}</span>\n <span class=\"strct-dg__groupcount\">{{ grp.count }}</span>\n </button>\n </td>\n </tr>\n } @else {\n @let row = it.row!;\n <tr\n [class.strct-dg__row--selected]=\"isSelected(row)\"\n [class.strct-dg__row--active]=\"paneOpen() && row === activeRow()\"\n >\n @if (canDetail()) {\n <td\n class=\"strct-dg__expandcell\"\n [class.strct-dg__cell--sticky]=\"stickyActive()\"\n [style.insetInlineStart.px]=\"utilLeft('detail')\"\n >\n <button\n type=\"button\"\n class=\"strct-dg__detailbtn\"\n [class.strct-dg__detailbtn--active]=\"row === activeRow()\"\n [attr.aria-expanded]=\"row === activeRow()\"\n [attr.aria-label]=\"L().openDetail\"\n (click)=\"openDetail(row)\"\n >\n <strct-icon name=\"chevronDoubleRight\" [size]=\"13\" [strokeWidth]=\"1.6\" />\n </button>\n </td>\n }\n @if (canExpand()) {\n <td\n class=\"strct-dg__expandcell\"\n [class.strct-dg__cell--sticky]=\"stickyActive()\"\n [style.insetInlineStart.px]=\"utilLeft('expand')\"\n >\n <button\n type=\"button\"\n class=\"strct-dg__expandbtn\"\n [class.strct-dg__expandbtn--open]=\"isExpanded(row)\"\n [attr.aria-expanded]=\"isExpanded(row)\"\n [attr.aria-label]=\"L().toggleDetail\"\n (click)=\"toggleExpand(row)\"\n >\n <strct-icon name=\"chevronRight\" [size]=\"12\" [strokeWidth]=\"1.7\" />\n </button>\n </td>\n }\n @if (selectable()) {\n <td\n class=\"strct-dg__sel\"\n [class.strct-dg__cell--sticky]=\"stickyActive()\"\n [style.insetInlineStart.px]=\"utilLeft('sel')\"\n >\n <strct-checkbox\n [ariaLabel]=\"L().selectRow\"\n [checked]=\"isSelected(row)\"\n (checkedChange)=\"toggleRow(row)\"\n />\n </td>\n }\n @for (col of visibleColumns(); track col.key) {\n <td\n [style.text-align]=\"col.align ?? 'start'\"\n [class.strct-dg__cell--sticky]=\"isSticky(col)\"\n [class.strct-dg__cell--sticky-last]=\"col.key === lastStickyKey()\"\n [style.insetInlineStart.px]=\"stickyLeft(col.key)\"\n >\n @if (cellTemplate(col.key); as tpl) {\n <ng-container\n [ngTemplateOutlet]=\"tpl\"\n [ngTemplateOutletContext]=\"{\n $implicit: row,\n value: row[col.key],\n column: col,\n }\"\n />\n } @else {\n {{ row[col.key] }}\n }\n </td>\n }\n @if (canActions()) {\n <td class=\"strct-dg__actioncell\">\n <button\n type=\"button\"\n class=\"strct-dg__kebab\"\n [attr.aria-label]=\"L().rowActions\"\n (click)=\"openRowMenu(row, $event)\"\n >\n <strct-icon name=\"dots\" [size]=\"16\" />\n </button>\n </td>\n }\n </tr>\n @if (canExpand() && isExpanded(row)) {\n <tr class=\"strct-dg__detailrow\">\n <td [attr.colspan]=\"colspan()\">\n <div class=\"strct-dg__detail\">\n <ng-container\n [ngTemplateOutlet]=\"detailDef()!.template\"\n [ngTemplateOutletContext]=\"{ $implicit: row }\"\n />\n </div>\n </td>\n </tr>\n }\n }\n } @empty {\n <tr>\n <td class=\"strct-dg__empty\" [attr.colspan]=\"colspan()\">{{ emptyText() }}</td>\n </tr>\n }\n @if (virtual() && bottomPad() > 0) {\n <tr class=\"strct-dg__vspacer\" aria-hidden=\"true\">\n <td [attr.colspan]=\"colspan()\" [style.height.px]=\"bottomPad()\"></td>\n </tr>\n }\n }\n </tbody>\n </table>\n </div>\n\n @if (paneOpen()) {\n <aside class=\"strct-dg__pane\">\n <div class=\"strct-dg__pane-head\">\n <span class=\"strct-dg__pane-title\">{{ activeRow()![columns()[0].key] }}</span>\n <button\n type=\"button\"\n class=\"strct-dg__pane-close\"\n [attr.aria-label]=\"L().closeDetail\"\n (click)=\"closePane()\"\n >\n <strct-icon name=\"close\" [size]=\"13\" />\n </button>\n </div>\n <div class=\"strct-dg__pane-body\">\n <ng-container\n [ngTemplateOutlet]=\"detailDef()!.template\"\n [ngTemplateOutletContext]=\"{ $implicit: activeRow() }\"\n />\n </div>\n </aside>\n }\n </div>\n\n @if ((pageSize() > 0 || virtual()) && !loading()) {\n <div class=\"strct-dg__foot\">\n <div class=\"strct-dg__foot-left\">\n @if (columnChooser() || sync()) {\n <div class=\"strct-dg__actions\">\n <strct-button-group>\n @if (columnChooser()) {\n <button\n strct-button\n size=\"sm\"\n [class.is-open]=\"chooserOpen()\"\n [disabled]=\"footerActionsDisabled()\"\n [attr.aria-label]=\"L().chooseColumns\"\n (click)=\"chooserOpen.set(!chooserOpen())\"\n >\n <strct-icon name=\"settings\" [size]=\"16\" />\n </button>\n }\n @if (sync()) {\n <button\n strct-button\n size=\"sm\"\n [disabled]=\"footerActionsDisabled()\"\n [attr.aria-label]=\"L().refresh\"\n (click)=\"syncChange.emit()\"\n >\n <strct-icon name=\"refresh\" [size]=\"16\" />\n </button>\n }\n </strct-button-group>\n @if (columnChooser() && chooserOpen()) {\n <div class=\"strct-dg__chooser-menu\">\n @for (col of columns(); track col.key) {\n <div class=\"strct-dg__chooser-item\">\n <strct-checkbox\n [checked]=\"!hiddenColumns().has(col.key)\"\n (checkedChange)=\"toggleColumn(col.key, $event)\"\n />\n <span>{{ col.label }}</span>\n </div>\n }\n </div>\n }\n </div>\n }\n <span class=\"strct-dg__count\">\n {{ totalCount() }} {{ totalCount() === 1 ? L().row : L().rows }}\n @if (selectedCount()) {\n <span class=\"strct-dg__count-sep\">|</span>\n <span class=\"strct-dg__count-sel\">{{ selectedCount() }} {{ L().selected }}</span>\n }\n </span>\n </div>\n <div class=\"strct-dg__foot-right\">\n @if (pageSize() > 0 && !groupBy()) {\n <strct-pagination [total]=\"totalCount()\" [pageSize]=\"pageSize()\" [(page)]=\"page\" />\n }\n </div>\n </div>\n }\n `,\n host: {\n class: 'strct-dg-host',\n '[class.strct-dg-host--compact]': 'compact()',\n '[class.strct-dg-host--singleline]': 'singleLine()',\n '[class.strct-dg-host--virtual]': 'virtual()',\n '[class.strct-dg-host--sticky]': 'stickyActive()',\n },\n styles: [\n `\n /* Enclosed chrome: the action bar, grid and footer share one frame so the\n * whole component reads as a single object on the page. */\n .strct-dg-host {\n display: block;\n border: 1px solid var(--b2);\n border-radius: 10px;\n background: var(--bg-2);\n box-shadow: var(--shadow-rest);\n }\n .strct-dg__scroll {\n flex: 1 1 auto;\n min-width: 0;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n /* Virtual mode: a fixed-height y-scroll viewport with a sticky header. */\n .strct-dg-host--virtual .strct-dg__scroll {\n overflow-y: auto;\n }\n .strct-dg-host--virtual .strct-dg thead th {\n position: sticky;\n top: 0;\n z-index: 5;\n }\n .strct-dg__vspacer td {\n padding: 0;\n border: 0;\n background: transparent;\n }\n /* Column drag-reorder affordances. */\n .strct-dg th[draggable] {\n cursor: grab;\n }\n .strct-dg__th--drop {\n box-shadow: inset 3px 0 0 var(--acc);\n }\n /* Row-group header rows. */\n .strct-dg__grouprow td {\n background: var(--bg-2) !important;\n padding: 0;\n }\n .strct-dg__groupbtn {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 7px 13px;\n border: 0;\n background: transparent;\n color: var(--t1);\n font-family: var(--font);\n font-size: 12.5px;\n font-weight: 600;\n cursor: pointer;\n text-align: start;\n }\n .strct-dg__groupbtn:hover {\n background: var(--bg-3);\n }\n .strct-dg__groupbtn:focus-visible {\n outline: 2px solid var(--acc50);\n outline-offset: -2px;\n }\n .strct-dg__groupchev {\n display: inline-flex;\n color: var(--t3);\n transition: transform 0.15s ease;\n }\n .strct-dg__groupchev--open {\n transform: rotate(90deg);\n }\n @media (prefers-reduced-motion: reduce) {\n .strct-dg__groupchev {\n transition: none;\n }\n }\n .strct-dg__groupcount {\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n border-radius: 9px;\n background: var(--acc-m);\n color: var(--acc);\n font-variant-numeric: tabular-nums;\n }\n /* Sticky cells require border-collapse: separate (collapse breaks\n position: sticky on table cells in Chromium); per-cell bottom borders\n keep the visuals identical. width: max-content lets declared column\n widths win so frozen offsets stay exact. */\n .strct-dg-host--sticky .strct-dg,\n .strct-dg-host--virtual .strct-dg {\n border-collapse: separate;\n border-spacing: 0;\n /* overflow: hidden on the table (corner rounding) would become the\n sticky containing block and defeat position: sticky entirely. */\n overflow: visible;\n border-radius: 0;\n }\n .strct-dg-host--sticky .strct-dg {\n width: max-content;\n min-width: 100%;\n }\n /* Frozen columns: pinned against horizontal scroll, opaque over content. */\n .strct-dg .strct-dg__cell--sticky {\n position: sticky;\n z-index: 3;\n }\n /* th.….--sticky (0-2-2) must beat the virtual-mode \"thead th\" rule of the\n same specificity by source order, so corner cells paint above both the\n scrolled header cells and the frozen body cells. */\n .strct-dg thead th.strct-dg__cell--sticky {\n z-index: 6;\n }\n .strct-dg .strct-dg__cell--sticky-last::after {\n content: '';\n position: absolute;\n top: 0;\n bottom: 0;\n inset-inline-end: -1px;\n width: 7px;\n pointer-events: none;\n background: linear-gradient(to right, rgba(0, 0, 0, 0.14), transparent);\n }\n [dir='rtl'] .strct-dg .strct-dg__cell--sticky-last::after {\n background: linear-gradient(to left, rgba(0, 0, 0, 0.14), transparent);\n }\n /* Fixed utility-column widths so frozen offsets stay exact. */\n .strct-dg-host--sticky .strct-dg__expandcol,\n .strct-dg-host--sticky .strct-dg__expandcell {\n width: 36px;\n min-width: 36px;\n max-width: 36px;\n box-sizing: border-box;\n }\n .strct-dg-host--sticky .strct-dg__sel {\n width: 40px;\n min-width: 40px;\n max-width: 40px;\n box-sizing: border-box;\n }\n /* Sticky header cells need an opaque ground (thead th already has bg-2;\n utility body cells inherit the row background rules below). */\n .strct-dg-host--sticky tbody .strct-dg__cell--sticky {\n background: var(--bg-1);\n }\n [data-theme='dark'] .strct-dg-host--sticky tbody .strct-dg__cell--sticky {\n background: var(--bg-3);\n }\n /* Hover / selected tints can be translucent — composite them over the\n opaque base so scrolled content never shows through a frozen cell. */\n .strct-dg-host--sticky tbody tr:hover .strct-dg__cell--sticky {\n background: linear-gradient(var(--acc-s), var(--acc-s)) var(--bg-1);\n }\n [data-theme='dark'] .strct-dg-host--sticky tbody tr:hover .strct-dg__cell--sticky {\n background: linear-gradient(var(--acc-s), var(--acc-s)) var(--bg-3);\n }\n .strct-dg-host--sticky tbody .strct-dg__row--selected .strct-dg__cell--sticky {\n background: linear-gradient(var(--acc-m), var(--acc-m)) var(--bg-1);\n }\n [data-theme='dark']\n .strct-dg-host--sticky\n tbody\n .strct-dg__row--selected\n .strct-dg__cell--sticky {\n background: linear-gradient(var(--acc-m), var(--acc-m)) var(--bg-3);\n }\n .strct-dg {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n overflow: hidden;\n background: var(--bg-2);\n }\n /* The table rounds only the frame corners it actually touches (no\n * toolbar above / no footer below); interior edges stay square. */\n .strct-dg-host:not(:has(.strct-dg__toolbar)) .strct-dg {\n border-start-start-radius: 9px;\n border-start-end-radius: 9px;\n }\n .strct-dg-host:not(:has(.strct-dg__foot)) .strct-dg {\n border-end-start-radius: 9px;\n border-end-end-radius: 9px;\n }\n .strct-dg th,\n .strct-dg td {\n padding: 9px 13px;\n text-align: start;\n border-bottom: 1px solid var(--b1);\n }\n .strct-dg tbody td {\n background: var(--bg-1);\n }\n /* In dark mode, body cells should read slightly lighter than the header\n * so the grid feels like a raised surface rather than a recessed pit. */\n [data-theme='dark'] .strct-dg tbody td {\n background: var(--bg-3);\n }\n .strct-dg-host--compact .strct-dg th,\n .strct-dg-host--compact .strct-dg td {\n padding: 5px 11px;\n }\n /* Single-line rows: cells never wrap; long values truncate with an\n * ellipsis (capped per cell) so row height stays uniform. */\n .strct-dg-host--singleline .strct-dg tbody tr:not(.strct-dg__detailrow) > td {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 360px;\n }\n .strct-dg th {\n position: relative;\n font-size: 12px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.4px;\n color: var(--t2);\n background: var(--bg-2);\n white-space: nowrap;\n user-select: none;\n }\n .strct-dg__th--sortable {\n cursor: pointer;\n }\n .strct-dg__th--sortable:hover {\n color: var(--t1);\n }\n .strct-dg__th--sortable:focus-visible {\n outline: 2px solid var(--acc50);\n outline-offset: -2px;\n }\n .strct-dg__hd {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n }\n .strct-dg__sorticon {\n color: var(--t3);\n }\n .strct-dg__th--sortable:hover .strct-dg__sorticon {\n color: var(--acc);\n }\n .strct-dg__resize {\n position: absolute;\n inset-inline-end: 0;\n top: 0;\n bottom: 0;\n width: 4px;\n cursor: col-resize;\n background: transparent;\n z-index: 2;\n }\n .strct-dg__resize:hover {\n background: var(--acc);\n }\n .strct-dg td {\n color: var(--t1);\n }\n .strct-dg tbody tr:last-child td {\n border-bottom: 0;\n }\n .strct-dg tbody tr:not(.strct-dg__detailrow):hover td {\n background: var(--acc-s);\n }\n .strct-dg__row--selected td {\n background: var(--acc-m);\n }\n .strct-dg__sel {\n width: 1%;\n white-space: nowrap;\n }\n .strct-dg__sel input {\n accent-color: var(--acc);\n width: 15px;\n height: 15px;\n cursor: pointer;\n }\n\n .strct-dg__expandcol,\n .strct-dg__expandcell {\n width: 1%;\n white-space: nowrap;\n }\n .strct-dg__actioncol,\n .strct-dg__actioncell {\n width: 1%;\n white-space: nowrap;\n text-align: end;\n }\n .strct-dg__kebab {\n display: inline-flex;\n padding: 4px;\n border: 0;\n border-radius: 5px;\n background: transparent;\n color: var(--t3);\n cursor: pointer;\n transition:\n color 0.14s ease,\n background 0.14s ease;\n }\n .strct-dg__kebab:hover {\n color: var(--t1);\n background: var(--bg-3);\n }\n .strct-dg__expandbtn {\n display: inline-flex;\n padding: 3px;\n border: 0;\n border-radius: 4px;\n background: transparent;\n color: var(--t3);\n cursor: pointer;\n transition:\n transform 0.15s ease,\n color 0.15s ease;\n }\n .strct-dg__expandbtn:hover {\n color: var(--t1);\n background: var(--bg-3);\n }\n .strct-dg__expandbtn--open {\n transform: rotate(90deg);\n color: var(--acc);\n }\n .strct-dg__detailbtn {\n display: inline-flex;\n padding: 3px;\n border: 0;\n border-radius: 4px;\n background: transparent;\n color: var(--t3);\n cursor: pointer;\n transition:\n color 0.14s ease,\n background 0.14s ease;\n }\n .strct-dg__detailbtn:hover {\n color: var(--acc);\n background: var(--bg-3);\n }\n .strct-dg__detailbtn--active {\n color: var(--acc);\n background: var(--acc-m);\n }\n .strct-dg__detailrow td {\n background: var(--bg-2);\n padding: 0;\n }\n .strct-dg__detail {\n padding: 14px 16px;\n font-size: 13px;\n color: var(--t2);\n }\n\n /* Detail pane: grid collapses to one column, content opens beside it. */\n .strct-dg__layout {\n display: flex;\n align-items: flex-start;\n min-width: 0;\n }\n .strct-dg__layout--paned {\n gap: 0;\n }\n .strct-dg__layout--paned .strct-dg__scroll {\n flex: 0 0 auto;\n width: 260px;\n min-width: 260px;\n max-width: 260px;\n }\n .strct-dg__layout--paned .strct-dg {\n width: 260px;\n min-width: 260px;\n max-width: 260px;\n flex-shrink: 0;\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n .strct-dg__row--clickable {\n cursor: pointer;\n }\n .strct-dg__row--active td {\n background: var(--acc-m);\n }\n /* Caret on the active row that points toward the open detail pane. */\n .strct-dg__layout--paned .strct-dg__row--active td:last-child {\n position: relative;\n padding-inline-end: 26px;\n }\n .strct-dg__layout--paned .strct-dg__row--active td:last-child::after {\n content: '';\n position: absolute;\n right: 11px;\n top: 50%;\n width: 6px;\n height: 6px;\n border-top: 1.6px solid var(--acc);\n border-inline-end: 1.6px solid var(--acc);\n transform: translateY(-50%) rotate(45deg);\n }\n .strct-dg__pane {\n flex: 1;\n min-width: 0;\n align-self: stretch;\n background: var(--bg-1);\n border: 1px solid var(--b2);\n border-inline-start: 2px solid var(--acc);\n border-radius: 8px;\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n overflow: hidden;\n animation: strct-dg-pane-in 0.14s ease;\n }\n .strct-dg__pane-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n padding: 11px 14px;\n border-bottom: 1px solid var(--b1);\n font-size: 13px;\n font-weight: 600;\n color: var(--t1);\n }\n .strct-dg__pane-close {\n display: inline-flex;\n padding: 3px;\n border: 0;\n border-radius: 4px;\n background: transparent;\n color: var(--t3);\n cursor: pointer;\n }\n .strct-dg__pane-close:hover {\n color: var(--t1);\n background: var(--bg-3);\n }\n .strct-dg__pane-body {\n padding: 14px 16px;\n font-size: 13px;\n color: var(--t2);\n }\n @keyframes strct-dg-pane-in {\n from {\n opacity: 0;\n transform: translateX(8px);\n }\n }\n\n @keyframes strct-skeleton-pulse {\n 0%,\n 100% {\n opacity: 0.4;\n }\n 50% {\n opacity: 0.7;\n }\n }\n .strct-dg__skeleton-block {\n height: 12px;\n background: var(--bg-3);\n border-radius: var(--radius-sm);\n animation: strct-skeleton-pulse 1.4s ease infinite;\n }\n .strct-dg__skeleton-row td {\n border-bottom: 1px solid var(--b1);\n }\n .strct-dg__empty {\n text-align: center;\n color: var(--t3);\n padding: 22px;\n }\n /* Persistent action bar (toolbar) above the grid — always visible. */\n .strct-dg__toolbar {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n padding: 9px 14px;\n border-bottom: 1px solid var(--b2);\n }\n\n .strct-dg__foot {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 9px 14px;\n border-top: 1px solid var(--b2);\n flex-wrap: wrap;\n }\n .strct-dg__foot-left {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n .strct-dg__foot-right {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n .strct-dg__actions {\n position: relative;\n }\n .strct-dg__chooser-menu {\n position: absolute;\n bottom: calc(100% + 6px);\n left: 0;\n z-index: 10;\n min-width: 180px;\n background: var(--bg-1);\n border: 1px solid var(--b2);\n border-radius: 8px;\n box-shadow: var(--shadow-pop);\n padding: 6px;\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n .strct-dg__chooser-menu--right {\n inset-inline-start: auto;\n inset-inline-end: 0;\n }\n .strct-dg__chooser-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 5px 8px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 12px;\n color: var(--t1);\n transition: background 0.1s ease;\n user-select: none;\n }\n .strct-dg__chooser-item:hover {\n background: var(--bg-3);\n }\n .strct-dg__count {\n font-size: 12px;\n color: var(--t2);\n }\n .strct-dg__count-sep {\n margin: 0 8px;\n color: var(--b2);\n }\n .strct-dg__count-sel {\n color: var(--acc);\n }\n `,\n ],\n})\nexport class StrctDatagrid {\n /** Column definitions. */\n readonly columns = input.required<StrctDatagridColumn[]>();\n /** Data rows. */\n readonly rows = input.required<StrctRow[]>();\n /** Rows per page (0 disables paging). */\n readonly pageSize = input(0);\n /** Enable row selection. */\n readonly selectable = input(false, { transform: booleanAttribute });\n /** Expand a row in place to reveal its detail template below it. */\n readonly expandable = input(false, { transform: booleanAttribute });\n /** Collapse the grid to a single column and open a side detail pane for the\n * clicked row (distinct from {@link expandable}). */\n readonly detailPane = input(false, { transform: booleanAttribute });\n /** Compact density mode. */\n readonly compact = input(false, { transform: booleanAttribute });\n /**\n * Keep every row exactly one line tall: cell content never wraps — long values\n * truncate with an ellipsis instead — so tall content can't distort the grid.\n */\n readonly singleLine = input(false, { transform: booleanAttribute });\n /** Message shown when there are no rows. */\n readonly emptyText = input('No data');\n /** Show skeleton rows while data is loading. */\n readonly loading = input(false, { transform: booleanAttribute });\n /** Enable column resizing by dragging column headers. */\n readonly resizable = input(false, { transform: booleanAttribute });\n /** Show a column-chooser dropdown in the footer. */\n readonly columnChooser = input(false, { transform: booleanAttribute });\n /** Show a refresh button in the footer. */\n readonly sync = input(false, { transform: booleanAttribute });\n /** Disable all footer action buttons (sync, column chooser, etc.). */\n readonly footerActionsDisabled = input(false, { transform: booleanAttribute });\n /**\n * Stable row identity (property key or function). Set this for live-refreshing\n * data so selection, expansion and the active detail row survive re-fetches\n * that replace the row objects. Defaults to object identity.\n */\n readonly rowId = input<StrctRowId | null>(null);\n /**\n * Per-row action menu resolver. When set, each row gets a trailing actions\n * column with a vertical-dots (kebab) button that opens this row's menu.\n * [rowActions]=\"(row) => [{ label: 'Open', action: () => open(row) }, …]\"\n */\n readonly rowActions = input<((row: StrctRow) => StrctMenuItem[]) | null>(null);\n /**\n * Seed the row selection. Each value is a row id (matching {@link rowId}); the\n * grid checks those rows when this input is set or changes. Requires\n * `selectable`. Assigning a new array (e.g. when opening a dialog) re-seeds the\n * selection; the user's subsequent toggles are preserved until the next change.\n */\n readonly initialSelection = input<readonly unknown[] | null>(null);\n /** Override any user-visible / assistive string (partial; merged over defaults). */\n readonly labels = input<Partial<StrctDatagridLabels>>({});\n /** Effective labels (defaults + overrides). */\n protected readonly L = computed(() => ({ ...DG_LABELS, ...this.labels() }));\n /**\n * Virtual scrolling for large data sets: only the rows inside the viewport\n * (plus a small overscan) are in the DOM — 20k+ rows stay smooth. The scroll\n * area gets `viewportHeight` and a sticky header. Assumes uniform\n * `rowHeight`; combine with `expandable` is unsupported.\n */\n readonly virtual = input(false, { transform: booleanAttribute });\n /** Scroll viewport height in px (virtual mode). */\n readonly viewportHeight = input(360);\n /** Uniform row height in px (virtual mode; tune when `compact`). */\n readonly rowHeight = input(38);\n /**\n * Server-side mode: the grid never sorts or slices `rows` itself — it shows\n * them as given and emits `(lazyLoad)` with `{ page, pageSize, sortKey,\n * sortDir }` whenever the user pages or sorts (and once on init). Provide\n * `total` so the pager and count reflect the full server-side set.\n */\n readonly lazy = input(false, { transform: booleanAttribute });\n /** Total row count on the server (lazy mode). */\n readonly total = input<number | null>(null);\n /**\n * Persist the user's column widths + hidden columns under this key in\n * localStorage (`strct-dg:<key>`), restoring them on init. For full control\n * use the two-way `columnState` instead (both may be combined).\n */\n readonly stateKey = input<string | null>(null);\n /** User column preferences (two-way): widths from resize, hidden from the chooser. */\n readonly columnState = model<StrctDatagridColumnState | null>(null);\n /** Let the user reorder data columns by dragging their headers. */\n readonly reorderable = input(false, { transform: booleanAttribute });\n /**\n * Group rows by this column key: the grid renders a collapsible header row\n * per distinct value (with a count), respecting the current sort within\n * groups. Paging is bypassed while grouped; not combinable with `virtual`.\n */\n readonly groupBy = input<string | null>(null);\n /** Emitted when the selection changes. */\n readonly selectionChange = output<StrctRow[]>();\n /** Emitted when the refresh button is clicked. */\n readonly syncChange = output<void>();\n /** Emitted when a row's action-menu item is chosen. */\n readonly rowAction = output<{ row: StrctRow; item: StrctMenuItem }>();\n /** Server-side data request (lazy mode): load this page / sort and set `rows`. */\n readonly lazyLoad = output<StrctDatagridLazyState>();\n\n private readonly menu = inject(StrctMenuService);\n\n protected readonly detailDef = contentChild(StrctRowDetailDef);\n protected readonly actionBarDef = contentChild(StrctDatagridActionBar);\n private readonly cellDefs = contentChildren(StrctCellDef);\n private readonly cellMap = computed(() => {\n const m = new Map<string, TemplateRef<StrctCellContext>>();\n for (const d of this.cellDefs()) m.set(d.key(), d.template);\n return m;\n });\n\n readonly page = signal(1);\n private readonly sort = signal<{ key: string | null; dir: SortDir }>({ key: null, dir: 'asc' });\n /** Selection / expansion are tracked by row id (see {@link rowId}). */\n private readonly selected = signal<Set<unknown>>(new Set());\n protected readonly selectedCount = computed(() => this.selected().size);\n private readonly expandedRows = signal<Set<unknown>>(new Set());\n private readonly columnWidths = signal<Map<string, number>>(new Map());\n protected readonly hiddenColumns = signal<Set<string>>(new Set());\n protected readonly chooserOpen = signal(false);\n private resizeState: { key: string; startX: number; startWidth: number } | null = null;\n private readonly onMove = (e: MouseEvent) => this.onResizeMove(e);\n private readonly onUp = () => this.onResizeEnd();\n\n colWidth(key: string): string | null {\n const px = this.columnWidths().get(key);\n return px != null ? `${px}px` : null;\n }\n\n onResizeStart(e: MouseEvent, key: string) {\n e.preventDefault();\n const th = (e.target as HTMLElement).closest('th');\n if (!th) return;\n this.resizeState = { key, startX: e.clientX, startWidth: th.offsetWidth };\n document.addEventListener('mousemove', this.onMove);\n document.addEventListener('mouseup', this.onUp);\n }\n\n private onResizeMove(e: MouseEvent) {\n if (!this.resizeState) return;\n const diff = e.clientX - this.resizeState.startX;\n const newWidth = Math.max(40, this.resizeState.startWidth + diff);\n this.columnWidths.update((m) => {\n const next = new Map(m);\n next.set(this.resizeState!.key, newWidth);\n return next;\n });\n }\n\n private onResizeEnd() {\n this.resizeState = null;\n document.removeEventListener('mousemove', this.onMove);\n document.removeEventListener('mouseup', this.onUp);\n }\n\n private readonly activeId = signal<unknown>(null);\n protected readonly activeRow = computed(() => {\n const id = this.activeId();\n if (id == null) return null;\n return this.rows().find((r) => this.idOf(r) === id) ?? null;\n });\n\n protected readonly canExpand = computed(\n () => this.expandable() && !this.detailPane() && !!this.detailDef(),\n );\n protected readonly canDetail = computed(() => this.detailPane() && !!this.detailDef());\n protected readonly paneOpen = computed(\n () => this.detailPane() && !!this.detailDef() && !!this.activeRow(),\n );\n /** Whether to render the trailing row-actions (kebab) column. */\n protected readonly canActions = computed(() => !!this.rowActions() && !this.paneOpen());\n /** User-chosen column order (keys); unknown keys keep declared positions. */\n private readonly columnOrder = signal<string[] | null>(null);\n /** Declared columns re-arranged by the user's drag order. */\n private readonly orderedColumns = computed(() => {\n const cols = this.columns();\n const order = this.columnOrder();\n if (!order?.length) return cols;\n const byKey = new Map(cols.map((c) => [c.key, c]));\n const out: StrctDatagridColumn[] = [];\n for (const key of order) {\n const c = byKey.get(key);\n if (c) {\n out.push(c);\n byKey.delete(key);\n }\n }\n for (const c of cols) if (byKey.has(c.key)) out.push(c);\n return out;\n });\n /** Only the first column is shown while the detail pane is open. */\n protected readonly visibleColumns = computed(() => {\n if (this.paneOpen()) return this.orderedColumns().slice(0, 1);\n const hidden = this.hiddenColumns();\n return this.orderedColumns().filter((c) => !hidden.has(c.key));\n });\n\n // ── Column drag-reorder ────────────────────────────────────────\n protected readonly dragKey = signal<string | null>(null);\n protected readonly dropKey = signal<string | null>(null);\n protected onColDragStart(key: string, event: DragEvent): void {\n if (!this.reorderable()) return;\n this.dragKey.set(key);\n event.dataTransfer?.setData('text/plain', key);\n if (event.dataTransfer) event.dataTransfer.effectAllowed = 'move';\n }\n protected onColDragOver(key: string, event: DragEvent): void {\n if (!this.reorderable() || !this.dragKey() || key === this.dragKey()) return;\n event.preventDefault();\n this.dropKey.set(key);\n }\n protected onColDrop(key: string): void {\n const from = this.dragKey();\n this.dragKey.set(null);\n this.dropKey.set(null);\n if (!from || from === key) return;\n const keys = this.orderedColumns().map((c) => c.key);\n const fromIdx = keys.indexOf(from);\n const toIdx = keys.indexOf(key);\n if (fromIdx < 0 || toIdx < 0) return;\n keys.splice(toIdx, 0, ...keys.splice(fromIdx, 1));\n this.columnOrder.set(keys);\n }\n protected onColDragEnd(): void {\n this.dragKey.set(null);\n this.dropKey.set(null);\n }\n\n // ── Row grouping ───────────────────────────────────────────────\n private readonly collapsedGroups = signal<Set<unknown>>(new Set());\n /** Collapse / expand one group header. */\n toggleGroup(key: unknown): void {\n const next = new Set(this.collapsedGroups());\n if (next.has(key)) next.delete(key);\n else next.add(key);\n this.collapsedGroups.set(next);\n }\n /** What tbody renders: plain (virtual/paged) rows, or groups + their rows. */\n protected readonly displayItems = computed<DgItem[]>(() => {\n const g = this.groupBy();\n if (!g || this.virtual()) return this.renderRows().map((row) => ({ row }));\n const map = new Map<unknown, StrctRow[]>();\n for (const row of this.sorted()) {\n const key = row[g];\n const bucket = map.get(key);\n if (bucket) bucket.push(row);\n else map.set(key, [row]);\n }\n const out: DgItem[] = [];\n for (const [key, rows] of map) {\n const collapsed = this.collapsedGroups().has(key);\n out.push({ group: { key, label: String(key ?? '—'), count: rows.length, collapsed } });\n if (!collapsed) for (const row of rows) out.push({ row });\n }\n return out;\n });\n protected itemKey(it: DgItem): unknown {\n return it.group ? `strct-group:${String(it.group.key)}` : this.rowKey(it.row!);\n }\n\n protected readonly sorted = computed(() => {\n // Server-side mode: rows arrive already ordered / sliced — never touch them.\n if (this.lazy()) return this.rows();\n const { key, dir } = this.sort();\n const data = [...this.rows()];\n if (!key) return data;\n const sign = dir === 'asc' ? 1 : -1;\n return data.sort((a, b) => sign * this.compare(a[key], b[key]));\n });\n\n protected readonly paged = computed(() => {\n const size = this.pageSize();\n if (this.lazy() || size <= 0) return this.sorted();\n const start = (this.page() - 1) * size;\n return this.sorted().slice(start, start + size);\n });\n\n /** Full count for the pager / footer (server total in lazy mode). */\n protected readonly totalCount = computed(() =>\n this.lazy() ? (this.total() ?? this.rows().length) : this.sorted().length,\n );\n\n // ── Virtual scrolling ──────────────────────────────────────────\n private readonly scrollTop = signal(0);\n protected onScroll(event: Event): void {\n this.scrollTop.set((event.target as HTMLElement).scrollTop);\n }\n /** Visible index window incl. overscan (virtual mode). */\n private readonly vRange = computed(() => {\n const rh = Math.max(1, this.rowHeight());\n const n = this.sorted().length;\n const start = Math.max(0, Math.floor(this.scrollTop() / rh) - 6);\n const count = Math.ceil(this.viewportHeight() / rh) + 12;\n return { start, end: Math.min(n, start + count) };\n });\n /** The rows actually rendered: the virtual window, or the current page. */\n protected readonly renderRows = computed(() =>\n this.virtual() ? this.sorted().slice(this.vRange().start, this.vRange().end) : this.paged(),\n );\n protected readonly topPad = computed(() =>\n this.virtual() ? this.vRange().start * this.rowHeight() : 0,\n );\n protected readonly bottomPad = computed(() =>\n this.virtual() ? Math.max(0, (this.sorted().length - this.vRange().end) * this.rowHeight()) : 0,\n );\n\n // ── Sticky (frozen) columns ────────────────────────────────────\n protected readonly stickyActive = computed(\n () => !this.paneOpen() && this.visibleColumns().some((c) => c.sticky),\n );\n /** Total width of the frozen utility columns (detail / expand / select). */\n private readonly utilityWidth = computed(\n () =>\n (this.canDetail() ? UTIL_W.detail : 0) +\n (this.canExpand() ? UTIL_W.expand : 0) +\n (this.selectable() ? UTIL_W.sel : 0),\n );\n /** Left offset of a frozen utility column, or null when sticky is off. */\n protected utilLeft(which: 'detail' | 'expand' | 'sel'): number | null {\n if (!this.stickyActive()) return null;\n let x = 0;\n if (which === 'detail') return x;\n if (this.canDetail()) x += UTIL_W.detail;\n if (which === 'expand') return x;\n if (this.canExpand()) x += UTIL_W.expand;\n return x;\n }\n /** Effective px width of a column (resize override → declared px → fallback). */\n private colPx(col: StrctDatagridColumn): number {\n const resized = this.columnWidths().get(col.key);\n if (resized != null) return resized;\n const m = /^(\\d+(?:\\.\\d+)?)px$/.exec(col.width ?? '');\n return m ? parseFloat(m[1]) : STICKY_FALLBACK_W;\n }\n /** key → left px for sticky data columns. */\n private readonly stickyOffsets = computed(() => {\n const map = new Map<string, number>();\n if (!this.stickyActive()) return map;\n let x = this.utilityWidth();\n for (const col of this.visibleColumns()) {\n if (!col.sticky) continue;\n map.set(col.key, x);\n x += this.colPx(col);\n }\n return map;\n });\n protected stickyLeft(key: string): number | null {\n return this.stickyOffsets().get(key) ?? null;\n }\n protected isSticky(col: StrctDatagridColumn): boolean {\n return !!col.sticky && this.stickyActive();\n }\n /** The last frozen column carries the edge shadow. */\n protected readonly lastStickyKey = computed(() => {\n let last: string | null = null;\n for (const col of this.visibleColumns()) if (col.sticky) last = col.key;\n return this.stickyActive() ? last : null;\n });\n\n protected readonly allPageSelected = computed(() => {\n const rows = this.paged();\n return rows.length > 0 && rows.every((r) => this.selected().has(this.idOf(r)));\n });\n protected readonly somePageSelected = computed(\n () => !this.allPageSelected() && this.paged().some((r) => this.selected().has(this.idOf(r))),\n );\n\n /** Resolve a row's stable identity (defaults to the row object itself). */\n private idOf(row: StrctRow): unknown {\n const id = this.rowId();\n if (id == null) return row;\n return typeof id === 'function' ? id(row) : row[id];\n }\n\n protected rowKey(row: StrctRow): unknown {\n return this.idOf(row);\n }\n\n protected cellTemplate(key: string): TemplateRef<StrctCellContext> | null {\n return this.cellMap().get(key) ?? null;\n }\n\n /** Last emitted lazy request (dedupe key). */\n private lastLazyKey = '';\n /** Last serialized column state pushed outward (loop guard). */\n private lastStateKey = '';\n\n constructor() {\n // Keep the page in range when the data set shrinks (server total in lazy mode).\n effect(() => {\n const size = this.pageSize();\n if (size <= 0) return;\n const count = this.totalCount();\n const pageCount = Math.max(1, Math.ceil(count / size));\n if (this.page() > pageCount) this.page.set(pageCount);\n });\n // Seed the selection from initialSelection (re-runs only when the input changes,\n // so a user's own toggles afterward are untouched).\n effect(() => {\n const init = this.initialSelection();\n if (init == null) return;\n untracked(() => this.selected.set(new Set(init)));\n });\n // Server-side mode: announce what to load whenever page / sort / pageSize\n // change (and once on init, so the consumer fetches the first page).\n effect(() => {\n if (!this.lazy()) return;\n const state: StrctDatagridLazyState = {\n page: this.page(),\n pageSize: this.pageSize(),\n sortKey: this.sort().key,\n sortDir: this.sort().dir,\n };\n const key = JSON.stringify(state);\n untracked(() => {\n if (key === this.lastLazyKey) return;\n this.lastLazyKey = key;\n this.lazyLoad.emit(state);\n });\n });\n // Restore persisted column preferences once, before the first render.\n const persisted = this.readPersistedState();\n if (persisted) this.applyColumnState(persisted);\n // Apply externally-driven columnState.\n effect(() => {\n const st = this.columnState();\n untracked(() => {\n if (!st || JSON.stringify(st) === this.lastStateKey) return;\n this.lastStateKey = JSON.stringify(st);\n this.applyColumnState(st);\n });\n });\n // Push user changes (resize / chooser / reorder) outward + persist under stateKey.\n effect(() => {\n const widths = Object.fromEntries(this.columnWidths());\n const hidden = [...this.hiddenColumns()];\n const order = this.columnOrder() ?? undefined;\n const st: StrctDatagridColumnState = { widths, hidden, order };\n const key = JSON.stringify(st);\n untracked(() => {\n if (key === this.lastStateKey) return;\n this.lastStateKey = key;\n this.columnState.set(st);\n const sk = this.stateKey();\n if (sk && typeof localStorage !== 'undefined') {\n try {\n localStorage.setItem(`strct-dg:${sk}`, key);\n } catch {\n /* storage full / denied — persistence is best-effort */\n }\n }\n });\n });\n }\n\n private readPersistedState(): StrctDatagridColumnState | null {\n const sk = this.stateKey();\n if (!sk || typeof localStorage === 'undefined') return null;\n try {\n const raw = localStorage.getItem(`strct-dg:${sk}`);\n return raw ? (JSON.parse(raw) as StrctDatagridColumnState) : null;\n } catch {\n return null;\n }\n }\n\n private applyColumnState(st: StrctDatagridColumnState): void {\n this.columnWidths.set(new Map(Object.entries(st.widths ?? {}).map(([k, v]) => [k, Number(v)])));\n this.hiddenColumns.set(new Set(st.hidden ?? []));\n this.columnOrder.set(st.order?.length ? [...st.order] : null);\n }\n\n /**\n * The grid as CSV: header labels + every non-hidden column, all rows in the\n * current order (client mode: the full sorted set, not just the page).\n */\n toCSV(): string {\n const hidden = this.hiddenColumns();\n const cols = this.columns().filter((c) => !hidden.has(c.key));\n const esc = (v: unknown): string => {\n const s = v == null ? '' : String(v);\n return /[\",\\n;]/.test(s) ? `\"${s.replace(/\"/g, '\"\"')}\"` : s;\n };\n const data = this.lazy() ? this.rows() : this.sorted();\n return [\n cols.map((c) => esc(c.label)).join(','),\n ...data.map((r) => cols.map((c) => esc(r[c.key])).join(',')),\n ].join('\\n');\n }\n\n /**\n * The grid as a real .xlsx workbook (dependency-free SpreadsheetML):\n * header labels + every non-hidden column in the current order, all rows in\n * the current sort; numeric cells stay numeric.\n */\n toXLSX(): Uint8Array {\n const hidden = this.hiddenColumns();\n const cols = this.orderedColumns().filter((c) => !hidden.has(c.key));\n const data = this.lazy() ? this.rows() : this.sorted();\n return buildXlsx(\n cols.map((c) => c.label),\n data.map((r) => cols.map((c) => r[c.key] as XlsxValue)),\n );\n }\n\n /** Download the grid as an .xlsx file. */\n downloadXLSX(filename = 'datagrid.xlsx'): void {\n if (typeof document === 'undefined') return;\n const bytes = this.toXLSX();\n const copy = new Uint8Array(bytes);\n const blob = new Blob([copy.buffer], {\n type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n URL.revokeObjectURL(url);\n }\n\n /** Download the grid as a CSV file. */\n downloadCSV(filename = 'datagrid.csv'): void {\n if (typeof document === 'undefined') return;\n const blob = new Blob(['\\uFEFF' + this.toCSV()], { type: 'text/csv;charset=utf-8' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n URL.revokeObjectURL(url);\n }\n\n protected colspan(): number {\n return (\n this.visibleColumns().length +\n (this.selectable() ? 1 : 0) +\n (this.canExpand() ? 1 : 0) +\n (this.canDetail() ? 1 : 0) +\n (this.canActions() ? 1 : 0)\n );\n }\n\n /** Toggle the detail pane for a row (triggered by its » button, not the row,\n * so row cells remain selectable for copy). */\n openDetail(row: StrctRow): void {\n const id = this.idOf(row);\n this.activeId.set(this.activeId() === id ? null : id);\n }\n\n closePane(): void {\n this.activeId.set(null);\n }\n\n /** Open the row-action menu next to the clicked kebab button. */\n protected openRowMenu(row: StrctRow, event: MouseEvent): void {\n event.stopPropagation();\n const fn = this.rowActions();\n if (!fn) return;\n const items = fn(row);\n if (!items.length) return;\n const rect = (event.currentTarget as HTMLElement).getBoundingClientRect();\n this.menu.open({\n x: rect.right,\n y: rect.bottom + 4,\n items,\n data: row,\n onSelect: (item) => this.rowAction.emit({ row, item }),\n });\n }\n\n sortBy(key: string): void {\n const current = this.sort();\n if (current.key !== key) {\n this.sort.set({ key, dir: 'asc' });\n } else if (current.dir === 'asc') {\n this.sort.set({ key, dir: 'desc' });\n } else {\n this.sort.set({ key: null, dir: 'asc' });\n }\n }\n\n protected sortIcon(key: string): string {\n const { key: k, dir } = this.sort();\n if (k !== key) return 'sortNone';\n return dir === 'asc' ? 'sortAsc' : 'sortDesc';\n }\n\n protected ariaSort(key: string): 'ascending' | 'descending' | 'none' {\n const { key: k, dir } = this.sort();\n if (k !== key) return 'none';\n return dir === 'asc' ? 'ascending' : 'descending';\n }\n\n protected onHeaderSpace(event: Event, key: string): void {\n event.preventDefault(); // stop page scroll\n this.sortBy(key);\n }\n\n toggleColumn(key: string, visible: boolean): void {\n this.hiddenColumns.update((set) => {\n const next = new Set(set);\n if (visible) next.delete(key);\n else next.add(key);\n return next;\n });\n }\n\n protected isSelected(row: StrctRow): boolean {\n return this.selected().has(this.idOf(row));\n }\n\n protected isExpanded(row: StrctRow): boolean {\n return this.expandedRows().has(this.idOf(row));\n }\n\n toggleExpand(row: StrctRow): void {\n const id = this.idOf(row);\n const next = new Set(this.expandedRows());\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n this.expandedRows.set(next);\n }\n\n toggleRow(row: StrctRow): void {\n const id = this.idOf(row);\n const next = new Set(this.selected());\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n this.commitSelection(next);\n }\n\n toggleAll(): void {\n const next = new Set(this.selected());\n const rows = this.paged();\n if (this.allPageSelected()) {\n rows.forEach((r) => next.delete(this.idOf(r)));\n } else {\n rows.forEach((r) => next.add(this.idOf(r)));\n }\n this.commitSelection(next);\n }\n\n clearSelection(): void {\n this.commitSelection(new Set());\n }\n\n /** Emit the current row objects whose id is selected (resolved against the\n * latest data, so consumers always get fresh references). */\n private commitSelection(next: Set<unknown>): void {\n this.selected.set(next);\n this.selectionChange.emit(this.rows().filter((r) => next.has(this.idOf(r))));\n }\n\n private compare(a: unknown, b: unknown): number {\n if (typeof a === 'number' && typeof b === 'number') return a - b;\n return String(a ?? '').localeCompare(String(b ?? ''), undefined, { numeric: true });\n }\n}\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation, input } from '@angular/core';\n\n/** Timeline node state colors. */\nexport type StrctTimelineState = 'default' | 'current' | 'success' | 'warning' | 'critical';\n\n/** Vertical timeline container. Wraps `<strct-timeline-item>` children. */\n@Component({\n selector: 'strct-timeline',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `<ng-content />`,\n host: { class: 'strct-tl' },\n styles: [\n `\n .strct-tl {\n display: flex;\n flex-direction: column;\n }\n `,\n ],\n})\nexport class StrctTimeline {}\n\n/** A timeline entry: a node on the rail plus a title and projected body. */\n@Component({\n selector: 'strct-timeline-item',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n <div class=\"strct-tli__rail\">\n <span class=\"strct-tli__node\"></span>\n <span class=\"strct-tli__line\"></span>\n </div>\n <div class=\"strct-tli__content\">\n <div class=\"strct-tli__title\">{{ title() }}</div>\n <div class=\"strct-tli__body\"><ng-content /></div>\n </div>\n `,\n host: {\n class: 'strct-tli',\n '[class.strct-tli--current]': \"state() === 'current'\",\n '[class.strct-tli--success]': \"state() === 'success'\",\n '[class.strct-tli--warning]': \"state() === 'warning'\",\n '[class.strct-tli--critical]': \"state() === 'critical'\",\n },\n styles: [\n `\n .strct-tli {\n display: flex;\n gap: 12px;\n }\n .strct-tli__rail {\n display: flex;\n flex-direction: column;\n align-items: center;\n }\n .strct-tli__node {\n width: 11px;\n height: 11px;\n border-radius: 50%;\n margin-top: 3px;\n flex-shrink: 0;\n background: var(--bg-1);\n border: 2px solid var(--b3);\n }\n .strct-tli__line {\n flex: 1;\n width: 2px;\n background: var(--b2);\n margin: 4px 0;\n }\n .strct-tli:last-child .strct-tli__line {\n display: none;\n }\n .strct-tli__content {\n padding-bottom: 18px;\n }\n .strct-tli__title {\n font-size: 13px;\n font-weight: 600;\n color: var(--t1);\n }\n .strct-tli__body {\n margin-top: 3px;\n font-size: 13px;\n color: var(--t2);\n }\n\n .strct-tli--current .strct-tli__node {\n border-color: var(--acc);\n background: var(--acc-m);\n box-shadow: 0 0 0 3px var(--acc18);\n }\n .strct-tli--success .strct-tli__node {\n border-color: var(--success);\n background: var(--success);\n }\n .strct-tli--warning .strct-tli__node {\n border-color: var(--warning);\n background: var(--warning);\n }\n .strct-tli--critical .strct-tli__node {\n border-color: var(--critical);\n background: var(--critical);\n }\n `,\n ],\n})\nexport class StrctTimelineItem {\n /** Dialog title. */\n readonly title = input.required<string>();\n /** State. */\n readonly state = input<StrctTimelineState>('default');\n}\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation, input } from '@angular/core';\n\n/** Key/value definition list. Wraps `<strct-stack-item>` rows. */\n@Component({\n selector: 'strct-stack',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `<ng-content />`,\n host: { class: 'strct-stack' },\n styles: [\n `\n .strct-stack {\n display: block;\n border: 1px solid var(--b2);\n border-radius: 8px;\n overflow: hidden;\n }\n `,\n ],\n})\nexport class StrctStack {}\n\n/** A label + value row. The value is projected content. */\n@Component({\n selector: 'strct-stack-item',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n <span class=\"strct-stack__label\">{{ label() }}</span>\n <span class=\"strct-stack__value\"><ng-content /></span>\n `,\n host: { class: 'strct-stack__item' },\n styles: [\n `\n .strct-stack__item {\n display: grid;\n grid-template-columns: minmax(120px, 34%) 1fr;\n gap: 12px;\n padding: 10px 14px;\n border-bottom: 1px solid var(--b1);\n font-size: 13px;\n }\n .strct-stack__item:last-child {\n border-bottom: 0;\n }\n .strct-stack__item:nth-child(even) {\n background: var(--bg-2);\n }\n .strct-stack__label {\n color: var(--t2);\n }\n .strct-stack__value {\n color: var(--t1);\n }\n `,\n ],\n})\nexport class StrctStackItem {\n /** Label text. */\n readonly label = input.required<string>();\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n input,\n} from '@angular/core';\n\n/** Chart / gauge / sparkline status colors. */\nexport type StrctChartStatus = 'accent' | 'success' | 'warning' | 'critical';\n\nconst STROKE: Record<StrctChartStatus, string> = {\n accent: 'var(--acc)',\n success: 'var(--success)',\n warning: 'var(--warning)',\n critical: 'var(--critical)',\n};\n\n/**\n * Tiny inline trend line. `<strct-sparkline [data]=\"[3,5,4,8,6,9]\" area />`.\n */\n@Component({\n selector: 'strct-sparkline',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n <svg\n class=\"strct-spark__svg\"\n viewBox=\"0 0 100 30\"\n preserveAspectRatio=\"none\"\n [style.width.px]=\"width()\"\n [style.height.px]=\"height()\"\n >\n @if (area()) {\n <polygon class=\"strct-spark__area\" [attr.points]=\"areaPoints()\" [attr.fill]=\"color()\" />\n }\n <polyline\n class=\"strct-spark__line\"\n fill=\"none\"\n [attr.points]=\"linePoints()\"\n [attr.stroke]=\"color()\"\n />\n </svg>\n `,\n host: { class: 'strct-spark' },\n styles: [\n `\n .strct-spark {\n display: inline-block;\n line-height: 0;\n }\n .strct-spark__line {\n stroke-width: 1.6;\n vector-effect: non-scaling-stroke;\n stroke-linejoin: round;\n stroke-linecap: round;\n }\n .strct-spark__area {\n opacity: 0.14;\n }\n `,\n ],\n})\nexport class StrctSparkline {\n /** Data array. */\n readonly data = input.required<number[]>();\n /** Visual status color. */\n readonly status = input<StrctChartStatus>('accent');\n /** Fill the area under the line. */\n readonly area = input(false, { transform: booleanAttribute });\n /** Width (CSS length). */\n readonly width = input(100);\n /** Height in pixels. */\n readonly height = input(30);\n\n protected readonly color = computed(() => STROKE[this.status()]);\n\n private readonly points = computed(() => {\n const d = this.data();\n if (!d.length) return [] as { x: number; y: number }[];\n const min = Math.min(...d);\n const max = Math.max(...d);\n const span = max - min || 1;\n const stepX = d.length > 1 ? 100 / (d.length - 1) : 0;\n return d.map((v, i) => ({ x: i * stepX, y: 29 - ((v - min) / span) * 28 }));\n });\n\n protected readonly linePoints = computed(() =>\n this.points()\n .map((p) => `${p.x},${p.y}`)\n .join(' '),\n );\n\n protected readonly areaPoints = computed(() => {\n const pts = this.points();\n if (!pts.length) return '';\n return `0,30 ${pts.map((p) => `${p.x},${p.y}`).join(' ')} 100,30`;\n });\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n ViewEncapsulation,\n afterNextRender,\n booleanAttribute,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { StrctChartStatus } from './sparkline';\n\n/** Chart rendering types (line, area, bar). */\nexport type StrctChartType = 'line' | 'area' | 'bar';\n/** Line interpolation between points. */\nexport type StrctChartCurve = 'smooth' | 'linear' | 'step';\n\n/** One series in a multi-series chart. */\nexport interface StrctChartSeries {\n /** Values; `null` (or `NaN`) marks a data gap — the line breaks, no interpolation. */\n data: (number | null)[];\n /** Legend + tooltip name. */\n label?: string;\n /** Per-series color; falls back to the chart's `status`. */\n status?: StrctChartStatus;\n /** Per-series area fill. */\n area?: boolean;\n /** Per-series interpolation; falls back to the chart's `curve`. */\n curve?: StrctChartCurve;\n /**\n * Dashed line — a second visual channel besides color, so two series stay\n * distinguishable under color-vision deficiency. `true` uses `'5 4'`; pass a\n * custom SVG dasharray string to tune it.\n */\n dash?: boolean | string;\n /**\n * Optional per-point lower/upper bound (e.g. min/max per downsampled bucket).\n * When both are set a soft band is filled between them behind the line, so\n * within-bucket spikes stay visible; the tooltip shows `avg (min–max)`.\n */\n lower?: (number | null)[];\n upper?: (number | null)[];\n}\n\n/** A vertical event / annotation marker anchored to a data index. */\nexport interface StrctChartAnnotation {\n /** X position as a data index. */\n index: number;\n /** Shown near the top of the line and in the tooltip at that index. */\n label?: string;\n /** Line color; default 'accent'. */\n status?: StrctChartStatus;\n /** Dashed line; default true. */\n dashed?: boolean;\n}\n\n/** A horizontal reference / threshold line. */\nexport interface StrctChartThreshold {\n value: number;\n label?: string;\n /** Line color; default 'warning'. */\n status?: StrctChartStatus;\n /** Dashed line; default true. */\n dashed?: boolean;\n}\n\ninterface Pt {\n x: number;\n y: number;\n}\n\nconst COLOR: Record<StrctChartStatus, string> = {\n accent: 'var(--acc)',\n success: 'var(--success)',\n warning: 'var(--warning)',\n critical: 'var(--critical)',\n};\n\n/** Fallback width (px) before the element is measured. */\nconst W0 = 600;\nconst PAD = { l: 8, r: 8, t: 14, b: 12 };\n/** Left gutter when the y-axis scale labels are shown. */\nconst Y_AXIS_GUTTER = 42;\n\nlet chartUid = 0;\n\nconst round = (n: number): number => Math.round(n * 100) / 100;\n\n/** Linear path: straight segments between points. */\nfunction linearPath(p: Pt[]): string {\n if (!p.length) return '';\n return (\n `M${round(p[0].x)},${round(p[0].y)}` +\n p\n .slice(1)\n .map((q) => `L${round(q.x)},${round(q.y)}`)\n .join('')\n );\n}\n\n/** Step-after path: hold, then jump. */\nfunction stepPath(p: Pt[]): string {\n if (!p.length) return '';\n let d = `M${round(p[0].x)},${round(p[0].y)}`;\n for (let i = 1; i < p.length; i++) {\n d += `L${round(p[i].x)},${round(p[i - 1].y)}L${round(p[i].x)},${round(p[i].y)}`;\n }\n return d;\n}\n\n/**\n * Monotone cubic (Fritsch–Carlson) interpolation — smooth curves that never\n * overshoot the data, so a metric line stays within its own min/max.\n */\nfunction smoothPath(p: Pt[]): string {\n const n = p.length;\n if (n < 3) return linearPath(p);\n\n const dx: number[] = [];\n const delta: number[] = [];\n for (let i = 0; i < n - 1; i++) {\n dx[i] = p[i + 1].x - p[i].x;\n delta[i] = dx[i] === 0 ? 0 : (p[i + 1].y - p[i].y) / dx[i];\n }\n\n const tan: number[] = new Array(n);\n tan[0] = delta[0];\n tan[n - 1] = delta[n - 2];\n for (let i = 1; i < n - 1; i++) {\n tan[i] = delta[i - 1] * delta[i] <= 0 ? 0 : (delta[i - 1] + delta[i]) / 2;\n }\n for (let i = 0; i < n - 1; i++) {\n if (delta[i] === 0) {\n tan[i] = 0;\n tan[i + 1] = 0;\n continue;\n }\n const a = tan[i] / delta[i];\n const b = tan[i + 1] / delta[i];\n const s = a * a + b * b;\n if (s > 9) {\n const t = 3 / Math.sqrt(s);\n tan[i] = t * a * delta[i];\n tan[i + 1] = t * b * delta[i];\n }\n }\n\n let d = `M${round(p[0].x)},${round(p[0].y)}`;\n for (let i = 0; i < n - 1; i++) {\n const h = dx[i] / 3;\n const c1x = p[i].x + h;\n const c1y = p[i].y + h * tan[i];\n const c2x = p[i + 1].x - h;\n const c2y = p[i + 1].y - h * tan[i + 1];\n d += `C${round(c1x)},${round(c1y)} ${round(c2x)},${round(c2y)} ${round(p[i + 1].x)},${round(p[i + 1].y)}`;\n }\n return d;\n}\n\nfunction pathFor(pts: Pt[], curve: StrctChartCurve): string {\n return curve === 'linear' ? linearPath(pts) : curve === 'step' ? stepPath(pts) : smoothPath(pts);\n}\n\n/** A real value — `null` and `NaN` both mark a data gap. */\nfunction isVal(v: number | null | undefined): v is number {\n return v != null && !Number.isNaN(v);\n}\n\n/** Split a nullable point array into contiguous non-gap segments. */\nfunction segs(pts: (Pt | null)[]): Pt[][] {\n const out: Pt[][] = [];\n let cur: Pt[] = [];\n for (const p of pts) {\n if (p) cur.push(p);\n else if (cur.length) {\n out.push(cur);\n cur = [];\n }\n }\n if (cur.length) out.push(cur);\n return out;\n}\n\n/** Line path that breaks at gaps (one sub-path per segment). */\nfunction pathForSegs(pts: (Pt | null)[], curve: StrctChartCurve): string {\n return segs(pts)\n .map((s) => pathFor(s, curve))\n .join('');\n}\n\n/** Area path per segment — the fill drops to the baseline at gap edges, never across. */\nfunction areaForSegs(pts: (Pt | null)[], curve: StrctChartCurve, base: number): string {\n return segs(pts)\n .map(\n (s) =>\n `${pathFor(s, curve)}L${round(s[s.length - 1].x)},${round(base)}L${round(s[0].x)},${round(base)}Z`,\n )\n .join('');\n}\n\n/** Closed band between per-point upper and lower bounds (gap-aware). */\nfunction bandPath(upper: (Pt | null)[], lower: (Pt | null)[], curve: StrctChartCurve): string {\n let out = '';\n let u: Pt[] = [];\n let l: Pt[] = [];\n const flush = () => {\n if (u.length > 1) {\n const back = pathFor([...l].reverse(), curve).replace(/^M/, 'L');\n out += pathFor(u, curve) + back + 'Z';\n }\n u = [];\n l = [];\n };\n for (let i = 0; i < upper.length; i++) {\n const up = upper[i];\n const lo = lower[i];\n if (up && lo) {\n u.push(up);\n l.push(lo);\n } else flush();\n }\n flush();\n return out;\n}\n\ninterface SeriesRender {\n color: string;\n label: string;\n area: boolean;\n dash: string | null;\n pts: (Pt | null)[];\n path: string;\n areaPath: string;\n bandPath: string;\n /** Global x-offset (right-aligned) so shorter series line up on the right. */\n offset: number;\n data: (number | null)[];\n lower?: (number | null)[];\n upper?: (number | null)[];\n}\n\n/**\n * Single- or multi-series chart (line / area / bar). Dependency-free SVG,\n * token-coloured.\n *\n * Lines are smooth by default (monotone cubic, no overshoot); set `curve` to\n * `linear` or `step`. Toggle the gradient fill with `area`, the ambient glow with\n * `glow`, and turn on `live` for streaming metrics. Pass `series` for multiple\n * lines with a `legend`; add persistent scale labels with `yAxis`, reference lines\n * with `thresholds`, a floor with `min`, and thin x labels with `xTicks`. Hover\n * anywhere for a crosshair + tooltip. The SVG is measured (1:1 coordinates) so\n * dots and the glow stay crisp at any width. Reduced-motion safe.\n *\n * <strct-chart [data]=\"cpu\" area glow [labels]=\"hours\" status=\"warning\" />\n * <strct-chart [series]=\"[{data:inArr,label:'In'},{data:outArr,label:'Out'}]\" legend />\n */\n@Component({\n selector: 'strct-chart',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n @if (isEmpty()) {\n <div class=\"strct-chart__empty\" [style.height.px]=\"height()\">{{ emptyText() }}</div>\n } @else {\n @if (legend() && legendItems().length) {\n <div class=\"strct-chart__legend\">\n @for (it of legendItems(); track it.label) {\n <span class=\"strct-chart__leg\">\n <span\n class=\"strct-chart__leg-sw\"\n [style.background]=\"\n it.dash\n ? 'repeating-linear-gradient(90deg, ' +\n it.color +\n ' 0 4px, transparent 4px 7px)'\n : it.color\n \"\n ></span\n >{{ it.label }}\n </span>\n }\n </div>\n }\n\n <div class=\"strct-chart__plot\">\n <svg\n #svg\n class=\"strct-chart__svg\"\n role=\"img\"\n [attr.aria-label]=\"chartAria()\"\n [attr.tabindex]=\"interactive() && type() !== 'bar' ? 0 : null\"\n [attr.viewBox]=\"'0 0 ' + width() + ' ' + height()\"\n [attr.width]=\"width()\"\n [attr.height]=\"height()\"\n [style.height.px]=\"height()\"\n (pointerdown)=\"onDown($event)\"\n (pointermove)=\"onMove($event)\"\n (pointerup)=\"onUp()\"\n (lostpointercapture)=\"onUp()\"\n (pointerleave)=\"onLeave()\"\n (dblclick)=\"onDblClick()\"\n (keydown)=\"onKey($event)\"\n (blur)=\"onLeave()\"\n >\n <defs>\n <linearGradient [attr.id]=\"gradId\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0\" [attr.stop-color]=\"color()\" stop-opacity=\"0.22\" />\n <stop offset=\"0.9\" [attr.stop-color]=\"color()\" stop-opacity=\"0\" />\n </linearGradient>\n <clipPath [attr.id]=\"clipId\">\n <rect [attr.x]=\"0\" [attr.y]=\"0\" [attr.width]=\"width()\" [attr.height]=\"height()\" />\n </clipPath>\n </defs>\n\n @if (grid()) {\n @for (g of gridY(); track g) {\n <line\n class=\"strct-chart__grid\"\n [attr.x1]=\"pl()\"\n [attr.x2]=\"width() - pad.r\"\n [attr.y1]=\"g\"\n [attr.y2]=\"g\"\n />\n }\n }\n\n <!-- Event / annotation markers: behind the data, above the grid. -->\n @for (a of annotationLines(); track $index) {\n <line\n class=\"strct-chart__ann\"\n [class.strct-chart__ann--dashed]=\"a.dashed\"\n [attr.x1]=\"a.x\"\n [attr.x2]=\"a.x\"\n [attr.y1]=\"pad.t\"\n [attr.y2]=\"height() - pad.b\"\n [attr.stroke]=\"a.color\"\n />\n }\n\n @if (type() === 'bar' && !isMulti()) {\n @for (b of bars(); track $index) {\n <rect\n class=\"strct-chart__bar\"\n [attr.x]=\"b.x\"\n [attr.y]=\"b.y\"\n [attr.width]=\"b.w\"\n [attr.height]=\"b.h\"\n [attr.fill]=\"color()\"\n />\n }\n } @else {\n <g [attr.clip-path]=\"'url(#' + clipId + ')'\">\n <g\n class=\"strct-chart__flow\"\n [style.transform]=\"'translateX(' + slidePx() + 'px)'\"\n [style.transition]=\"sliding() ? 'transform ' + interval() + 'ms linear' : 'none'\"\n >\n @if (isMulti()) {\n @for (s of multiSeries(); track $index) {\n @if (s.bandPath) {\n <path\n class=\"strct-chart__band\"\n [class.strct-chart__band--stack]=\"stacked()\"\n [attr.d]=\"s.bandPath\"\n [attr.fill]=\"s.color\"\n />\n }\n @if (s.area && s.areaPath) {\n <path\n class=\"strct-chart__area strct-chart__area--flat\"\n [attr.d]=\"s.areaPath\"\n [attr.fill]=\"s.color\"\n />\n }\n <path\n class=\"strct-chart__line\"\n fill=\"none\"\n [attr.stroke-width]=\"strokeWidth()\"\n [attr.stroke-dasharray]=\"s.dash\"\n [attr.d]=\"s.path\"\n [attr.stroke]=\"s.color\"\n />\n }\n } @else {\n @if (showArea()) {\n <path\n class=\"strct-chart__area\"\n [attr.d]=\"areaPath()\"\n [attr.fill]=\"'url(#' + gradId + ')'\"\n />\n }\n <path\n class=\"strct-chart__line\"\n [class.strct-chart__line--draw]=\"drawOn()\"\n fill=\"none\"\n pathLength=\"1\"\n [attr.stroke-width]=\"strokeWidth()\"\n [attr.d]=\"linePath()\"\n [attr.stroke]=\"color()\"\n />\n @if (dots()) {\n @for (p of dotPts(); track $index) {\n <circle\n class=\"strct-chart__dot\"\n [attr.cx]=\"p.x\"\n [attr.cy]=\"p.y\"\n r=\"2.5\"\n [attr.fill]=\"color()\"\n />\n }\n }\n }\n </g>\n </g>\n\n @for (t of thresholdLines(); track $index) {\n <line\n class=\"strct-chart__threshold\"\n [class.strct-chart__threshold--dashed]=\"t.dashed\"\n [attr.x1]=\"pl()\"\n [attr.x2]=\"width() - pad.r\"\n [attr.y1]=\"t.y\"\n [attr.y2]=\"t.y\"\n [attr.stroke]=\"t.color\"\n />\n }\n\n @if (brushRect(); as br) {\n <rect\n class=\"strct-chart__brush\"\n [attr.x]=\"br.x\"\n [attr.y]=\"pad.t\"\n [attr.width]=\"br.w\"\n [attr.height]=\"height() - pad.t - pad.b\"\n />\n }\n\n @if (interactive() && hoverX() !== null) {\n <line\n class=\"strct-chart__cross\"\n [attr.x1]=\"hoverX()\"\n [attr.x2]=\"hoverX()\"\n [attr.y1]=\"pad.t\"\n [attr.y2]=\"height() - pad.b\"\n />\n @if (!isMulti() && hoverPt(); as hp) {\n <line\n class=\"strct-chart__cross\"\n [attr.x1]=\"pl()\"\n [attr.x2]=\"width() - pad.r\"\n [attr.y1]=\"hp.y\"\n [attr.y2]=\"hp.y\"\n />\n <circle\n class=\"strct-chart__hoverdot\"\n [attr.cx]=\"hp.x\"\n [attr.cy]=\"hp.y\"\n r=\"3.5\"\n [attr.fill]=\"color()\"\n />\n }\n @if (isMulti()) {\n @for (d of hoverDots(); track $index) {\n <circle\n class=\"strct-chart__hoverdot\"\n [attr.cx]=\"d.x\"\n [attr.cy]=\"d.y\"\n r=\"3.5\"\n [attr.fill]=\"d.color\"\n />\n }\n }\n }\n\n @if (!isMulti() && live() && head(); as h) {\n <g class=\"strct-chart__head\" [attr.transform]=\"'translate(' + h.x + ',' + h.y + ')'\">\n <circle class=\"strct-chart__pulse\" r=\"3\" [attr.fill]=\"color()\" />\n <circle class=\"strct-chart__head-dot\" r=\"3\" [attr.fill]=\"color()\" />\n </g>\n }\n }\n </svg>\n\n @if (yAxis()) {\n @for (t of yAxisTicks(); track t.value) {\n <div class=\"strct-chart__ytick\" [style.top.px]=\"t.y\">{{ t.text }}</div>\n }\n }\n\n @for (t of thresholdLines(); track $index) {\n @if (t.label) {\n <div class=\"strct-chart__thr\" [style.top.px]=\"t.y\" [style.color]=\"t.color\">\n {{ t.label }}\n </div>\n }\n }\n\n @for (a of annotationLines(); track $index) {\n @if (a.label) {\n <div class=\"strct-chart__ann-label\" [style.left.px]=\"a.x\" [style.color]=\"a.color\">\n {{ a.label }}\n </div>\n }\n }\n\n @if (zoomed()) {\n <button type=\"button\" class=\"strct-chart__reset\" (click)=\"resetZoom()\">\n ⟲ {{ resetLabel() }}\n </button>\n }\n\n @if (interactive() && hoverX() !== null) {\n @if (isMulti()) {\n <div\n class=\"strct-chart__tip strct-chart__tip--multi\"\n [style.left.px]=\"hoverX()\"\n [style.transform]=\"tipShift()\"\n >\n @if (hoverMeta()) {\n <span class=\"strct-chart__tip-l\">{{ hoverMeta() }}</span>\n }\n @if (annAt(); as ann) {\n <span class=\"strct-chart__tip-ann\" [style.color]=\"ann.color\">{{ ann.label }}</span>\n }\n @for (r of hoverRows(); track r.label) {\n <span class=\"strct-chart__tip-row\">\n <span class=\"strct-chart__tip-sw\" [style.background]=\"r.color\"></span>\n @if (r.label) {\n <span class=\"strct-chart__tip-rl\">{{ r.label }}</span>\n }\n <span class=\"strct-chart__tip-rv\">{{ r.text }}</span>\n </span>\n }\n </div>\n } @else if (hoverPt(); as hp) {\n <div class=\"strct-chart__axis-y\" [style.top.px]=\"axisChipY(hp.y)\">\n {{ hoverValueText() }}\n </div>\n <div\n class=\"strct-chart__tip\"\n [style.left.px]=\"hp.x\"\n [style.top.px]=\"hp.y\"\n [style.transform]=\"tipShiftRaised()\"\n >\n <span class=\"strct-chart__tip-v\">{{ hoverValueText() }}</span>\n @if (hoverDelta() !== null || hoverMeta()) {\n <span class=\"strct-chart__tip-meta\">\n @if (hoverDelta() !== null) {\n <span\n class=\"strct-chart__tip-delta\"\n [class.strct-chart__tip-delta--up]=\"hoverDelta()! > 0\"\n [class.strct-chart__tip-delta--down]=\"hoverDelta()! < 0\"\n >\n {{ hoverDelta()! > 0 ? '▲' : hoverDelta()! < 0 ? '▼' : '·'\n }}{{ absDeltaText() }}\n </span>\n }\n @if (hoverMeta()) {\n <span class=\"strct-chart__tip-l\">{{ hoverMeta() }}</span>\n }\n </span>\n }\n @if (annAt(); as ann) {\n <span class=\"strct-chart__tip-ann\" [style.color]=\"ann.color\">{{ ann.label }}</span>\n }\n </div>\n } @else if (hoverGap()) {\n <!-- A gap point: keep the time slot, say \"no data\" instead of a value. -->\n <div\n class=\"strct-chart__tip strct-chart__tip--gap\"\n [style.left.px]=\"hoverX()\"\n [style.transform]=\"tipShift()\"\n >\n <span class=\"strct-chart__tip-v\">{{ gapText() }}</span>\n @if (hoverMeta()) {\n <span class=\"strct-chart__tip-l\">{{ hoverMeta() }}</span>\n }\n </div>\n }\n }\n\n @if (interactive() && type() !== 'bar') {\n <span class=\"strct-chart__sr\" aria-live=\"polite\">{{ srText() }}</span>\n }\n </div>\n\n @if (displayLabels().length) {\n <!-- Labels sit at their datapoint's real x, so a subsampled axis never lies. -->\n <div class=\"strct-chart__labels\">\n @for (l of displayLabels(); track $index) {\n <span\n [class.strct-chart__label--active]=\"interactive() && dispIdx() === l.i\"\n [style.left.px]=\"xOf(l.i)\"\n >{{ l.text }}</span\n >\n }\n </div>\n }\n }\n `,\n host: {\n class: 'strct-chart',\n '[class.strct-chart--glow]': 'glow()',\n '[class.strct-chart--brush]': 'brush() || zoom()',\n '[style.--strct-chart-c]': 'color()',\n },\n styles: [\n `\n .strct-chart {\n display: block;\n position: relative;\n }\n /* Overlays (ticks, tooltip, threshold tags) anchor to the plot, so a legend\n above the svg can never shift them. */\n .strct-chart__plot {\n position: relative;\n }\n .strct-chart__svg {\n width: 100%;\n display: block;\n touch-action: none;\n }\n .strct-chart__svg:focus-visible {\n outline: 2px solid var(--acc50);\n outline-offset: 2px;\n border-radius: var(--radius-sm);\n }\n .strct-chart__sr {\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n }\n .strct-chart__empty {\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n color: var(--t3);\n }\n .strct-chart__grid {\n stroke: var(--b1);\n stroke-width: 1;\n vector-effect: non-scaling-stroke;\n }\n .strct-chart__line {\n vector-effect: non-scaling-stroke;\n stroke-linejoin: round;\n stroke-linecap: round;\n }\n .strct-chart__area {\n stroke: none;\n }\n .strct-chart__area--flat {\n opacity: 0.14;\n }\n .strct-chart__dot,\n .strct-chart__hoverdot,\n .strct-chart__head-dot {\n stroke: var(--bg-1);\n stroke-width: 1.5;\n }\n .strct-chart__cross {\n stroke: var(--strct-chart-c);\n stroke-width: 1;\n opacity: 0.4;\n stroke-dasharray: 3 3;\n vector-effect: non-scaling-stroke;\n }\n .strct-chart__threshold {\n stroke-width: 1;\n opacity: 0.85;\n vector-effect: non-scaling-stroke;\n }\n .strct-chart__threshold--dashed {\n stroke-dasharray: 4 3;\n }\n .strct-chart__bar {\n rx: 1.5;\n }\n\n /* Min–max envelope behind the series line. */\n .strct-chart__band {\n opacity: 0.13;\n stroke: none;\n }\n /* Stacked fills read as solid layers, not a faint halo. */\n .strct-chart__band--stack {\n opacity: 0.32;\n }\n\n /* Vertical event / annotation markers. */\n .strct-chart__ann {\n stroke-width: 1;\n opacity: 0.8;\n vector-effect: non-scaling-stroke;\n }\n .strct-chart__ann--dashed {\n stroke-dasharray: 4 3;\n }\n .strct-chart__ann-label {\n position: absolute;\n top: 0;\n transform: translateX(-50%);\n pointer-events: none;\n font-size: 12px;\n font-weight: 600;\n background: var(--bg-1);\n padding: 0 3px;\n border-radius: 3px;\n white-space: nowrap;\n }\n\n /* Brush selection + zoom-out chip. */\n .strct-chart--brush .strct-chart__svg {\n cursor: crosshair;\n }\n .strct-chart__brush {\n fill: var(--acc);\n opacity: 0.16;\n stroke: var(--acc50);\n stroke-width: 1;\n vector-effect: non-scaling-stroke;\n }\n .strct-chart__reset {\n position: absolute;\n top: 6px;\n right: 8px;\n z-index: 3;\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 2px 9px;\n border: 1px solid var(--b2);\n border-radius: 99px;\n background: var(--bg-a);\n color: var(--t2);\n font-family: var(--font);\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n }\n .strct-chart__reset:hover {\n color: var(--t1);\n border-color: var(--acc50);\n }\n .strct-chart__reset:focus-visible {\n outline: 2px solid var(--acc50);\n outline-offset: 1px;\n }\n\n .strct-chart__tip--gap {\n top: 6px;\n }\n .strct-chart__tip-ann {\n font-size: 12px;\n font-weight: 600;\n }\n\n /* Ambient neon glow — layered shadows for depth without thickening the line. */\n .strct-chart--glow .strct-chart__line {\n filter: drop-shadow(0 0 1.5px var(--strct-chart-c))\n drop-shadow(0 0 5px var(--strct-chart-c));\n }\n .strct-chart--glow .strct-chart__head-dot {\n filter: drop-shadow(0 0 2px var(--strct-chart-c)) drop-shadow(0 0 6px var(--strct-chart-c));\n }\n .strct-chart--glow .strct-chart__hoverdot {\n filter: drop-shadow(0 0 4px var(--strct-chart-c));\n }\n\n /* Persistent y-axis scale labels + crosshair value chip on the y-axis edge. */\n .strct-chart__ytick {\n position: absolute;\n left: 0;\n width: ${Y_AXIS_GUTTER - 8}px;\n text-align: end;\n transform: translateY(-50%);\n pointer-events: none;\n font-family: var(--mono);\n font-size: 12px;\n color: var(--t3);\n font-variant-numeric: tabular-nums;\n }\n .strct-chart__thr {\n position: absolute;\n right: 2px;\n transform: translateY(-50%);\n pointer-events: none;\n font-size: 12px;\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n background: var(--bg-1);\n padding: 0 3px;\n border-radius: 3px;\n }\n .strct-chart__axis-y {\n position: absolute;\n left: 0;\n transform: translateY(-50%);\n pointer-events: none;\n padding: 1px 5px;\n border-radius: var(--radius-sm);\n background: var(--bg-a);\n border: 1px solid var(--b2);\n font-family: var(--mono);\n font-size: 12px;\n font-weight: 600;\n color: var(--t2);\n font-variant-numeric: tabular-nums;\n z-index: 2;\n }\n .strct-chart__label--active {\n color: var(--t1);\n font-weight: 700;\n }\n\n /* Legend */\n .strct-chart__legend {\n display: flex;\n flex-wrap: wrap;\n gap: 6px 14px;\n margin-bottom: 8px;\n font-size: 12px;\n color: var(--t2);\n }\n .strct-chart__leg {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n }\n .strct-chart__leg-sw {\n width: 9px;\n height: 3px;\n border-radius: 2px;\n flex-shrink: 0;\n }\n\n /* Hover tooltip. */\n .strct-chart__tip {\n position: absolute;\n pointer-events: none;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 1px;\n padding: 4px 8px;\n border-radius: var(--radius-sm);\n background: var(--bg-a);\n border: 1px solid var(--b2);\n box-shadow: var(--shadow-elevated);\n white-space: nowrap;\n z-index: 2;\n }\n .strct-chart__tip--multi {\n top: 6px;\n align-items: stretch;\n gap: 3px;\n }\n .strct-chart__tip-v {\n font-size: 12px;\n font-weight: 700;\n color: var(--t1);\n font-variant-numeric: tabular-nums;\n }\n .strct-chart__tip-meta {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n }\n .strct-chart__tip-delta {\n font-size: 12px;\n font-weight: 600;\n color: var(--t3);\n font-variant-numeric: tabular-nums;\n }\n .strct-chart__tip-delta--up {\n color: var(--success);\n }\n .strct-chart__tip-delta--down {\n color: var(--critical);\n }\n .strct-chart__tip-l {\n font-size: 12px;\n color: var(--t3);\n }\n .strct-chart__tip-row {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n }\n .strct-chart__tip-sw {\n width: 8px;\n height: 3px;\n border-radius: 2px;\n flex-shrink: 0;\n }\n .strct-chart__tip-rl {\n color: var(--t3);\n margin-inline-end: auto;\n }\n .strct-chart__tip-rv {\n color: var(--t1);\n font-weight: 700;\n font-variant-numeric: tabular-nums;\n }\n\n .strct-chart__labels {\n position: relative;\n height: 15px;\n margin-top: 6px;\n font-size: 12px;\n color: var(--t3);\n }\n .strct-chart__labels span {\n position: absolute;\n transform: translateX(-50%);\n white-space: nowrap;\n }\n\n @media (prefers-reduced-motion: no-preference) {\n .strct-chart__line--draw {\n stroke-dasharray: 1;\n stroke-dashoffset: 1;\n animation: strct-chart-draw 0.9s ease forwards;\n }\n .strct-chart__pulse {\n transform-box: fill-box;\n transform-origin: center;\n animation: strct-chart-pulse 2.4s ease-out infinite;\n }\n }\n @keyframes strct-chart-draw {\n to {\n stroke-dashoffset: 0;\n }\n }\n @keyframes strct-chart-pulse {\n 0% {\n transform: scale(1);\n opacity: 0.45;\n }\n 70% {\n opacity: 0;\n }\n 100% {\n transform: scale(2.5);\n opacity: 0;\n }\n }\n `,\n ],\n})\nexport class StrctChart {\n /** Single-series data (or use `series`). `null` / `NaN` marks a gap — the line breaks. */\n readonly data = input<(number | null)[]>([]);\n /** Multiple series; when set it takes precedence over `data`. */\n readonly series = input<StrctChartSeries[] | null>(null);\n /** Visual type / variant. */\n readonly type = input<StrctChartType>('line');\n /** Line interpolation. */\n readonly curve = input<StrctChartCurve>('smooth');\n /** Fill the area under the line with a soft gradient. */\n readonly area = input(false, { transform: booleanAttribute });\n /** Soft ambient glow on the line and the leading-edge dot. */\n readonly glow = input(false, { transform: booleanAttribute });\n /** Live streaming: the window scrolls left as new points arrive. */\n readonly live = input(false, { transform: booleanAttribute });\n /** Expected ms between updates in live mode (drives the scroll duration). */\n readonly interval = input(1000);\n /** Hover crosshair + value tooltip. */\n readonly interactive = input(true, { transform: booleanAttribute });\n /** Line thickness in pixels. */\n readonly strokeWidth = input(1.75);\n /** Show the horizontal gridlines. */\n readonly grid = input(true, { transform: booleanAttribute });\n /** Show a dot at each data point (single-series). */\n readonly dots = input(false, { transform: booleanAttribute });\n /** Show a legend (with `series`). */\n readonly legend = input(false, { transform: booleanAttribute });\n /** X-axis labels. */\n readonly labels = input<string[]>([]);\n /** Target number of x labels; null renders every label. */\n readonly xTicks = input<number | null>(null);\n /** Formatter for x labels. */\n readonly xFormat = input<((label: string, index: number) => string) | null>(null);\n /** Visual status color. */\n readonly status = input<StrctChartStatus>('accent');\n /** Height in pixels. */\n readonly height = input(160);\n /** Override the top of the value axis (defaults to the data max + headroom). */\n readonly max = input<number | null>(null);\n /** Override the floor of the value axis (defaults to 0). */\n readonly min = input<number | null>(null);\n /** Persistent y-axis scale labels. */\n readonly yAxis = input(false, { transform: booleanAttribute });\n /** Approx number of y ticks. */\n readonly yTicks = input(3);\n /** Formatter for y-axis labels; falls back to `valueFormat`. */\n readonly axisFormat = input<((v: number) => string) | null>(null);\n /** Horizontal reference / threshold lines. */\n readonly thresholds = input<StrctChartThreshold[]>([]);\n /** Text shown when there is no data. */\n readonly emptyText = input<string>('No data');\n /** Formatter for the live-mode \"Xs ago\" tooltip line (receives seconds). */\n readonly agoFormat = input<((seconds: number) => string) | null>(null);\n /**\n * Optional formatter for the values shown in the hover tooltip + y-axis flag\n * (and the delta magnitude). Lets callers add units / fixed precision, e.g.\n * `[valueFormat]=\"v => v.toFixed(3) + ' %'\"`. When null, the raw value is shown.\n */\n readonly valueFormat = input<((v: number) => string) | null>(null);\n /** Vertical event / annotation markers (\"alarm raised\", \"deploy\", …). */\n readonly annotations = input<StrctChartAnnotation[]>([]);\n /**\n * Drive the crosshair externally (e.g. mirror a sibling chart's hover for a\n * vCenter-style synced dashboard). A local pointer wins while over this chart.\n */\n readonly activeIndex = input<number | null>(null);\n /** Drag-select a range; the selection is emitted through `brushChange`. */\n readonly brush = input(false, { transform: booleanAttribute });\n /**\n * Drag-select **zooms into** the selected range (implies `brush`).\n * Double-click, Escape or the reset chip zooms back out.\n */\n readonly zoom = input(false, { transform: booleanAttribute });\n /**\n * Stack multi-series values cumulatively: each series draws its line at the\n * running total and fills the band down to the series below (nulls break the\n * stack at that slot). Tooltips keep the original per-series values.\n */\n readonly stacked = input(false, { transform: booleanAttribute });\n /** Y-axis scale. `log` needs positive values; non-positives clamp to the floor. */\n readonly scale = input<'linear' | 'log'>('linear');\n /**\n * Per-point timestamps (ms epoch or Date). When set, x positions map to real\n * time, so uneven sampling renders honestly instead of equally spaced.\n */\n readonly times = input<(number | Date)[] | null>(null);\n /** Tooltip text for a gap (null) point. */\n readonly gapText = input('no data');\n /** Accessible label of the reset-zoom chip (localizable). */\n readonly resetLabel = input('Reset zoom');\n\n /** Emits the hovered point index (or null on leave) — wire cross-chart sync with it. */\n readonly hoverIndex = output<number | null>();\n /** Emits the brushed [startIndex, endIndex] (inclusive), or null when cleared. */\n readonly brushChange = output<[number, number] | null>();\n\n protected readonly pad = PAD;\n protected readonly color = computed(() => COLOR[this.status()]);\n protected readonly showArea = computed(() => this.area() || this.type() === 'area');\n\n private readonly uid = ++chartUid;\n protected readonly gradId = `strct-chart-grad-${this.uid}`;\n protected readonly clipId = `strct-chart-clip-${this.uid}`;\n\n /** Measured pixel width → 1:1 viewBox so dots / glow stay crisp at any size. */\n protected readonly width = signal(W0);\n private readonly svgRef = viewChild<ElementRef<SVGSVGElement>>('svg');\n\n // Live-scroll state.\n protected readonly slidePx = signal(0);\n protected readonly sliding = signal(false);\n protected readonly drawOn = signal(true);\n private firstData = true;\n /** Reactive OS motion preference (tracks live changes, not just first load). */\n private readonly reduceMotion = signal(\n typeof matchMedia !== 'undefined' && matchMedia('(prefers-reduced-motion: reduce)').matches,\n );\n\n // Hover state. `hoverIdx` is the local pointer/keyboard index; `dispIdx` is\n // what actually renders — local wins, else the externally driven activeIndex.\n protected readonly hoverIdx = signal<number | null>(null);\n protected readonly dispIdx = computed<number | null>(() => {\n const local = this.hoverIdx();\n const i = local ?? this.activeIndex();\n if (i == null) return null;\n const [s, e] = this.domain();\n return i >= s && i <= e ? i : null;\n });\n\n // Zoom / brush state (indices are always in the full-data domain).\n private readonly viewRange = signal<[number, number] | null>(null);\n protected readonly brushDrag = signal<{ a: number; b: number } | null>(null);\n private readonly brushEnabled = computed(() => this.brush() || this.zoom());\n protected readonly zoomed = computed(() => this.viewRange() !== null);\n\n constructor() {\n const destroyRef = inject(DestroyRef);\n\n if (typeof matchMedia !== 'undefined') {\n const mq = matchMedia('(prefers-reduced-motion: reduce)');\n const onChange = (e: MediaQueryListEvent) => this.reduceMotion.set(e.matches);\n mq.addEventListener?.('change', onChange);\n destroyRef.onDestroy(() => mq.removeEventListener?.('change', onChange));\n }\n\n afterNextRender(() => {\n const el = this.svgRef()?.nativeElement;\n if (!el) return;\n const measure = () => this.width.set(el.clientWidth || W0);\n measure();\n if (typeof ResizeObserver !== 'undefined') {\n const ro = new ResizeObserver(measure);\n ro.observe(el);\n destroyRef.onDestroy(() => ro.disconnect());\n }\n });\n\n // On each new data frame in live mode, jump one step right then ease back to\n // 0 — a continuous left scroll (the classic realtime \"conveyor\").\n effect(() => {\n const d = this.data();\n if (\n this.isMulti() ||\n !this.live() ||\n this.reduceMotion() ||\n typeof requestAnimationFrame === 'undefined'\n )\n return;\n untracked(() => {\n if (this.firstData) {\n this.firstData = false;\n return;\n }\n if (d.length < 2) return;\n this.sliding.set(false);\n this.slidePx.set(this.stepX());\n requestAnimationFrame(() => {\n this.sliding.set(true);\n this.slidePx.set(0);\n });\n });\n });\n }\n\n // ── Series / domain ────────────────────────────────────────────\n private readonly seriesResolved = computed<StrctChartSeries[] | null>(() => {\n const s = this.series();\n return s && s.length ? s : null;\n });\n protected readonly isMulti = computed(() => this.seriesResolved() !== null);\n\n /** All data arrays (multi or single). */\n private readonly allData = computed<(number | null)[][]>(() => {\n const s = this.seriesResolved();\n return s ? s.map((x) => x.data ?? []) : [this.data()];\n });\n protected readonly isEmpty = computed(() => this.allData().every((d) => d.length === 0));\n\n /** Number of x slots. */\n private readonly nx = computed(() => Math.max(1, ...this.allData().map((d) => d.length)));\n\n /** Visible index window: the brush-zoom range, or the full data. */\n private readonly domain = computed<[number, number]>(() => {\n const n = this.nx();\n const vr = this.viewRange();\n if (!vr) return [0, n - 1];\n const s = Math.max(0, Math.min(vr[0], n - 1));\n const e = Math.max(s, Math.min(vr[1], n - 1));\n return e > s ? [s, e] : [0, n - 1];\n });\n\n /** Left padding: wider when the y-axis labels are shown. */\n protected readonly pl = computed(() => (this.yAxis() ? Y_AXIS_GUTTER : PAD.l));\n private chartW(): number {\n return this.width() - this.pl() - PAD.r;\n }\n private chartH(): number {\n return this.height() - PAD.t - PAD.b;\n }\n\n /** Horizontal gap between two data points, in px (of the visible window). */\n private stepX(): number {\n const [s, e] = this.domain();\n return e > s ? this.chartW() / (e - s) : 0;\n }\n\n /** Real values inside the visible window (multi-aware; bands included;\n * per-slot totals when stacked). */\n private readonly visibleValues = computed<number[]>(() => {\n const [s, e] = this.domain();\n const out: number[] = [];\n const push = (v: number | null | undefined) => {\n if (isVal(v)) out.push(v);\n };\n const ser = this.seriesResolved();\n if (ser && this.stacked() && ser.length > 1) {\n const N = this.nx();\n const totals = new Array<number>(N).fill(0);\n const has = new Array<boolean>(N).fill(false);\n for (const x of ser) {\n const data = x.data ?? [];\n const offset = N - data.length;\n for (let li = 0; li < data.length; li++) {\n const v = data[li];\n if (isVal(v)) {\n totals[offset + li] += v;\n has[offset + li] = true;\n }\n }\n }\n for (let gi = s; gi <= Math.min(e, N - 1); gi++) if (has[gi]) out.push(totals[gi]);\n return out;\n }\n if (ser) {\n const N = this.nx();\n for (const x of ser) {\n const data = x.data ?? [];\n const offset = N - data.length;\n for (let gi = Math.max(s, offset); gi <= e; gi++) {\n const li = gi - offset;\n if (li < 0 || li >= data.length) continue;\n push(data[li]);\n push(x.upper?.[li]);\n }\n }\n } else {\n const d = this.data();\n for (let i = s; i <= Math.min(e, d.length - 1); i++) push(d[i]);\n }\n return out;\n });\n\n private readonly yMax = computed(() => {\n const explicit = this.max();\n if (explicit != null) return explicit || 1;\n const m = Math.max(0, ...this.visibleValues());\n return m === 0 ? 1 : m * 1.1;\n });\n private readonly yMin = computed(() => this.min() ?? 0);\n\n /** Smallest positive visible value — the floor of a log axis. */\n private readonly logFloor = computed(() => {\n const explicit = this.min();\n if (explicit != null && explicit > 0) return explicit;\n const positives = this.visibleValues().filter((v) => v > 0);\n return positives.length ? Math.min(...positives) : 1;\n });\n\n private yOf(v: number): number {\n if (this.scale() === 'log') {\n const lo = this.logFloor();\n const hi = Math.max(this.yMax(), lo * 10);\n const c = Math.max(lo, Math.min(hi, v));\n const span = Math.log10(hi) - Math.log10(lo) || 1;\n const f = (Math.log10(c) - Math.log10(lo)) / span;\n return PAD.t + (1 - f) * this.chartH();\n }\n const lo = this.yMin();\n const hi = this.yMax();\n const range = hi - lo || 1;\n const c = Math.max(lo, Math.min(hi, v));\n return PAD.t + (1 - (c - lo) / range) * this.chartH();\n }\n\n /** Timestamps normalized to ms (null when the axis is index-based). */\n private readonly timesMs = computed<number[] | null>(() => {\n const t = this.times();\n return t?.length ? t.map((v) => +v) : null;\n });\n\n // ── Single-series geometry (gap-aware; null keeps its x-slot) ──\n protected readonly points = computed<(Pt | null)[]>(() => {\n const d = this.data();\n return d.map((v, i) => (isVal(v) ? { x: this.xOf(i), y: this.yOf(v) } : null));\n });\n\n /** Non-gap points only (dot rendering). */\n protected readonly dotPts = computed<Pt[]>(() =>\n this.points().filter((p): p is Pt => p !== null),\n );\n\n protected readonly head = computed<Pt | null>(() => {\n const p = this.points();\n for (let i = p.length - 1; i >= 0; i--) if (p[i]) return p[i];\n return null;\n });\n\n private readonly plotPoints = computed<(Pt | null)[]>(() => {\n const p = this.points();\n if (!this.live() || p.length < 2 || !p[0]) return p;\n return [{ x: p[0].x - this.stepX(), y: p[0].y }, ...p];\n });\n\n protected readonly linePath = computed(() => pathForSegs(this.plotPoints(), this.curve()));\n\n protected readonly areaPath = computed(() =>\n areaForSegs(this.plotPoints(), this.curve(), this.height() - PAD.b),\n );\n\n // ── Multi-series geometry ─────────────────────────────────────\n protected readonly multiSeries = computed<SeriesRender[]>(() => {\n const s = this.seriesResolved();\n if (!s) return [];\n const N = this.nx();\n const base = this.height() - PAD.b;\n // Stacked: each series rides on the running total of the ones before it,\n // filling the band down to that total; a null breaks the stack there.\n if (this.stacked() && s.length > 1) {\n const running = new Array<number>(N).fill(0);\n return s.map((x) => {\n const data = x.data ?? [];\n const offset = N - data.length;\n const pts: (Pt | null)[] = [];\n const lowerPts: (Pt | null)[] = [];\n for (let li = 0; li < data.length; li++) {\n const v = data[li];\n const gi = offset + li;\n if (isVal(v)) {\n const lo = running[gi];\n const hi = lo + v;\n running[gi] = hi;\n const px = this.xOf(gi);\n lowerPts.push({ x: px, y: this.yOf(lo) });\n pts.push({ x: px, y: this.yOf(hi) });\n } else {\n lowerPts.push(null);\n pts.push(null);\n }\n }\n const curve = x.curve ?? this.curve();\n return {\n color: COLOR[x.status ?? this.status()],\n label: x.label ?? '',\n area: false,\n dash: x.dash ? (typeof x.dash === 'string' ? x.dash : '5 4') : null,\n pts,\n path: pathForSegs(pts, curve),\n areaPath: '',\n bandPath: bandPath(pts, lowerPts, curve),\n offset,\n data,\n };\n });\n }\n return s.map((x) => {\n const data = x.data ?? [];\n const offset = N - data.length; // right-align shorter series\n const ptOf = (v: number | null | undefined, i: number): Pt | null =>\n isVal(v) ? { x: this.xOf(offset + i), y: this.yOf(v) } : null;\n const pts = data.map((v, i) => ptOf(v, i));\n const curve = x.curve ?? this.curve();\n const path = pathForSegs(pts, curve);\n const area = x.area ?? false;\n const areaPath = area ? areaForSegs(pts, curve, base) : '';\n const band =\n x.lower && x.upper\n ? bandPath(\n x.upper.map((v, i) => ptOf(v, i)),\n x.lower.map((v, i) => ptOf(v, i)),\n curve,\n )\n : '';\n return {\n color: COLOR[x.status ?? this.status()],\n label: x.label ?? '',\n area,\n dash: x.dash ? (typeof x.dash === 'string' ? x.dash : '5 4') : null,\n pts,\n path,\n areaPath,\n bandPath: band,\n offset,\n data,\n lower: x.lower,\n upper: x.upper,\n };\n });\n });\n\n protected readonly legendItems = computed(() =>\n this.multiSeries()\n .filter((s) => s.label)\n .map((s) => ({ label: s.label, color: s.color, dash: s.dash })),\n );\n\n // ── Bars (single-series only; gaps render no bar, keep their slot) ──\n protected readonly bars = computed(() => {\n const d = this.data();\n const [s, e] = this.domain();\n const chartW = this.chartW();\n const base = this.height() - PAD.b;\n const last = Math.min(e, d.length - 1);\n const count = Math.max(1, last - s + 1);\n const slot = chartW / count;\n const w = slot * 0.6;\n const pl = this.pl();\n const out: { x: number; y: number; w: number; h: number }[] = [];\n for (let i = s; i <= last; i++) {\n const v = d[i];\n if (!isVal(v)) continue;\n const h = ((Math.max(0, v) - this.yMin()) / (this.yMax() - this.yMin() || 1)) * this.chartH();\n out.push({\n x: pl + (i - s) * slot + (slot - w) / 2,\n y: base - Math.max(0, h),\n w,\n h: Math.max(0, h),\n });\n }\n return out;\n });\n\n // ── Axes ───────────────────────────────────────────────────────\n protected readonly gridY = computed(() => {\n const top = PAD.t;\n const bottom = this.height() - PAD.b;\n return [top, (top + bottom) / 2, bottom];\n });\n\n private fmtAxis(v: number): string {\n const f = this.axisFormat() ?? this.valueFormat();\n return f ? f(v) : String(Math.round(v * 100) / 100);\n }\n\n protected readonly yAxisTicks = computed(() => {\n if (!this.yAxis()) return [];\n const out: { value: number; y: number; text: string }[] = [];\n if (this.scale() === 'log') {\n // Decade ticks between the floor and the max, endpoints included.\n const lo = this.logFloor();\n const hi = Math.max(this.yMax(), lo * 10);\n const values = new Set<number>([lo, hi]);\n for (let p = Math.ceil(Math.log10(lo)); p <= Math.floor(Math.log10(hi)); p++) {\n values.add(10 ** p);\n }\n for (const v of [...values].sort((a, b) => a - b)) {\n out.push({ value: v, y: this.yOf(v), text: this.fmtAxis(v) });\n }\n return out;\n }\n const n = Math.max(2, this.yTicks());\n const lo = this.yMin();\n const hi = this.yMax();\n for (let i = 0; i < n; i++) {\n const v = lo + (hi - lo) * (i / (n - 1));\n out.push({ value: v, y: this.yOf(v), text: this.fmtAxis(v) });\n }\n return out;\n });\n\n protected readonly thresholdLines = computed(() =>\n this.thresholds().map((t) => ({\n y: this.yOf(t.value),\n color: COLOR[t.status ?? 'warning'],\n dashed: t.dashed ?? true,\n label: t.label ?? '',\n })),\n );\n\n protected readonly displayLabels = computed(() => {\n const ls = this.labels();\n const fmt = this.xFormat();\n const xt = this.xTicks();\n const [s, e] = this.domain();\n const last = Math.min(e, ls.length - 1);\n let idxs: number[];\n if (xt && xt > 1 && last - s + 1 > xt) {\n const stepI = (last - s) / (xt - 1);\n idxs = Array.from(new Set(Array.from({ length: xt }, (_, k) => s + Math.round(k * stepI))));\n } else {\n idxs = Array.from({ length: Math.max(0, last - s + 1) }, (_, k) => s + k);\n }\n return idxs\n .filter((i) => i >= 0 && i < ls.length)\n .map((i) => ({\n text: fmt ? fmt(ls[i], i) : ls[i],\n i,\n }));\n });\n\n // ── Hover (driven by dispIdx: local pointer, else external activeIndex) ──\n protected readonly hoverX = computed<number | null>(() => {\n const i = this.dispIdx();\n if (i == null) return null;\n return this.xOf(i);\n });\n\n /**\n * Tooltip edge-flip (FR-CHART-14): near the left edge the balloon\n * left-aligns, near the right edge it right-aligns, otherwise it stays\n * centered — so the first/last point's values are never clipped by an\n * `overflow: hidden` ancestor. Only the balloon shifts; the crosshair\n * stays on the true point-X.\n */\n private readonly tipAlign = computed<'start' | 'center' | 'end'>(() => {\n const x = this.hoverX();\n const w = this.width();\n if (x == null || !w) return 'center';\n if (x < w * 0.12) return 'start';\n if (x > w * 0.88) return 'end';\n return 'center';\n });\n /** Horizontal-only shift (multi / gap tips, anchored below the plot top). */\n protected readonly tipShift = computed(() => {\n switch (this.tipAlign()) {\n case 'start':\n return 'translate(8px, 0)';\n case 'end':\n return 'translate(calc(-100% - 8px), 0)';\n default:\n return 'translate(-50%, 0)';\n }\n });\n /** Shift incl. the single tip's vertical lift above the hover point. */\n protected readonly tipShiftRaised = computed(() => {\n switch (this.tipAlign()) {\n case 'start':\n return 'translate(8px, calc(-100% - 10px))';\n case 'end':\n return 'translate(calc(-100% - 8px), calc(-100% - 10px))';\n default:\n return 'translate(-50%, calc(-100% - 10px))';\n }\n });\n /** Keep the y-axis value chip vertically inside the plot box. */\n protected axisChipY(y: number): number {\n return Math.max(12, Math.min(this.height() - 12, y));\n }\n\n protected readonly hoverPt = computed<Pt | null>(() => {\n const i = this.dispIdx();\n const p = this.points();\n return i != null && i >= 0 && i < p.length ? p[i] : null;\n });\n protected readonly hoverValue = computed(() => {\n const i = this.dispIdx();\n const d = this.data();\n const v = i != null && i >= 0 && i < d.length ? d[i] : null;\n return isVal(v) ? v : '';\n });\n /** The hovered slot exists but holds a gap (single-series). */\n protected readonly hoverGap = computed(() => {\n const i = this.dispIdx();\n if (i == null || this.isMulti()) return false;\n const d = this.data();\n return i >= 0 && i < d.length && !isVal(d[i]);\n });\n /** hoverValue run through valueFormat (unit / precision), else the raw value. */\n protected readonly hoverValueText = computed(() => {\n const v = this.hoverValue();\n if (v === '' || v == null) return '';\n const f = this.valueFormat();\n return f ? f(v as number) : String(v);\n });\n /** Delta magnitude, formatted the same way so its unit matches the value. */\n protected readonly absDeltaText = computed(() => {\n const f = this.valueFormat();\n return f ? f(this.absDelta()) : String(this.absDelta());\n });\n protected readonly hoverLabel = computed(() => {\n const i = this.dispIdx();\n const l = this.labels();\n return i != null && i >= 0 && i < l.length ? l[i] : '';\n });\n /** Change from the previous point (single-series; null at the first point or across a gap). */\n protected readonly hoverDelta = computed<number | null>(() => {\n const i = this.dispIdx();\n const d = this.data();\n if (i == null || i <= 0 || i >= d.length) return null;\n const cur = d[i];\n const prev = d[i - 1];\n return isVal(cur) && isVal(prev) ? cur - prev : null;\n });\n protected readonly absDelta = computed(() => Math.abs(this.hoverDelta() ?? 0));\n /** Second tooltip line: \"Xs ago\" while live, else the x label. */\n protected readonly hoverMeta = computed(() => {\n const i = this.dispIdx();\n if (i == null) return '';\n if (this.live()) {\n const ago = Math.round(((this.nx() - 1 - i) * this.interval()) / 1000);\n const fmt = this.agoFormat();\n if (fmt) return fmt(ago);\n return ago <= 0 ? 'now' : `${ago}s ago`;\n }\n const l = this.labels();\n return i >= 0 && i < l.length ? l[i] : '';\n });\n\n /** Per-series value at the hovered index (multi-series tooltip; bands as `avg (min–max)`). */\n protected readonly hoverRows = computed(() => {\n const i = this.dispIdx();\n const s = this.multiSeries();\n if (i == null || !s.length) return [];\n const f = this.valueFormat();\n const fmt = (v: number) => (f ? f(v) : String(v));\n return s\n .map((x) => {\n const li = i - x.offset;\n const raw = li >= 0 && li < x.data.length ? x.data[li] : null;\n const v = isVal(raw) ? raw : null;\n const lo = x.lower?.[li];\n const hi = x.upper?.[li];\n const band = isVal(lo) && isVal(hi) ? ` (${fmt(lo)}–${fmt(hi)})` : '';\n return {\n label: x.label,\n color: x.color,\n value: v,\n text: v == null ? '' : fmt(v) + band,\n };\n })\n .filter((r) => r.value !== null);\n });\n\n /** Per-series hover dots (multi-series). */\n protected readonly hoverDots = computed(() => {\n const i = this.dispIdx();\n const s = this.multiSeries();\n if (i == null || !s.length) return [];\n return s\n .map((x) => {\n const li = i - x.offset;\n const p = li >= 0 && li < x.pts.length ? x.pts[li] : null;\n return p ? { x: p.x, y: p.y, color: x.color } : null;\n })\n .filter((d): d is { x: number; y: number; color: string } => d !== null);\n });\n\n // ── Annotations ────────────────────────────────────────────────\n protected readonly annotationLines = computed(() => {\n const [s, e] = this.domain();\n return this.annotations()\n .filter((a) => a.index >= s && a.index <= e)\n .map((a) => ({\n x: this.xOf(a.index),\n color: COLOR[a.status ?? 'accent'],\n dashed: a.dashed ?? true,\n label: a.label ?? '',\n index: a.index,\n }));\n });\n /** The annotation sitting exactly under the crosshair, if any. */\n protected readonly annAt = computed(() => {\n const i = this.dispIdx();\n if (i == null) return null;\n return this.annotationLines().find((a) => a.index === i && a.label) ?? null;\n });\n\n // ── Brush / zoom ───────────────────────────────────────────────\n protected readonly brushRect = computed(() => {\n const d = this.brushDrag();\n if (!d) return null;\n const x1 = this.xOf(Math.min(d.a, d.b));\n const x2 = this.xOf(Math.max(d.a, d.b));\n return { x: round(x1), w: round(Math.max(1, x2 - x1)) };\n });\n\n /** Zoom back out to the full data window (also emits `brushChange` null). */\n resetZoom(): void {\n this.brushDrag.set(null);\n if (this.viewRange() !== null) {\n this.viewRange.set(null);\n this.brushChange.emit(null);\n }\n }\n\n /** Screen-reader summary of the whole chart (role=\"img\" name). */\n protected readonly chartAria = computed(() => {\n const f = this.valueFormat() ?? ((v: number) => String(Math.round(v * 100) / 100));\n if (this.isMulti()) {\n const parts = this.multiSeries().map((s) => {\n const reals = s.data.filter(isVal);\n const last = reals.length ? f(reals[reals.length - 1]) : '';\n return `${s.label || 'series'} latest ${last}`;\n });\n return `Chart, ${this.multiSeries().length} series: ${parts.join('; ')}`;\n }\n const d = this.data();\n const reals = d.filter(isVal);\n if (!reals.length) return this.emptyText();\n return `Chart, ${d.length} points. Min ${f(Math.min(...reals))}, max ${f(Math.max(...reals))}, latest ${f(reals[reals.length - 1])}`;\n });\n\n /** aria-live text announcing the hovered / keyboard-selected point. */\n protected readonly srText = computed(() => {\n const i = this.dispIdx();\n if (i == null) return '';\n if (this.isMulti()) {\n const rows = this.hoverRows()\n .map((r) => `${r.label || 'series'} ${r.text}`)\n .join(', ');\n return `${this.hoverMeta() || 'point ' + (i + 1)}: ${rows}`;\n }\n const meta = this.hoverMeta();\n const value = this.hoverGap() ? this.gapText() : this.hoverValueText();\n return `${meta ? meta + ': ' : ''}${value}`;\n });\n\n /** Pixel x of a data index (shared by the plot, labels and annotations).\n * With `times`, positions map to real timestamps — uneven sampling shows. */\n protected xOf(i: number): number {\n const [s, e] = this.domain();\n const t = this.timesMs();\n if (t && e > s) {\n const clamp = (k: number) => Math.min(Math.max(k, 0), t.length - 1);\n const t0 = t[clamp(s)];\n const span = t[clamp(e)] - t0 || 1;\n return this.pl() + ((t[clamp(i)] - t0) / span) * this.chartW();\n }\n return this.pl() + (i - s) * this.stepX();\n }\n\n /** Set the local hover index, emitting `hoverIndex` on change. */\n private setHover(i: number | null): void {\n if (i === this.hoverIdx()) return;\n this.hoverIdx.set(i);\n this.hoverIndex.emit(i);\n }\n\n protected onLeave(): void {\n this.setHover(null);\n }\n\n /** Keyboard access: arrows walk the points; Escape unwinds brush → zoom → crosshair. */\n protected onKey(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n if (this.brushDrag()) {\n this.brushDrag.set(null);\n } else if (this.zoomed()) {\n this.resetZoom();\n } else {\n this.setHover(null);\n }\n return;\n }\n if (!this.interactive() || this.type() === 'bar') return;\n const [s, e] = this.domain();\n const cur = this.hoverIdx();\n let next: number | null = null;\n switch (event.key) {\n case 'ArrowRight':\n next = cur == null ? s : Math.min(e, cur + 1);\n break;\n case 'ArrowLeft':\n next = cur == null ? e : Math.max(s, cur - 1);\n break;\n case 'Home':\n next = s;\n break;\n case 'End':\n next = e;\n break;\n default:\n return;\n }\n event.preventDefault();\n this.setHover(next);\n }\n\n /** Data index under the pointer, clamped to the visible window. */\n private idxAt(event: PointerEvent): number | null {\n const el = this.svgRef()?.nativeElement;\n if (!el || this.isEmpty()) return null;\n const rect = el.getBoundingClientRect();\n if (!rect.width) return null;\n const [s, e] = this.domain();\n if (this.timesMs()) {\n // Non-uniform x: nearest point by pixel distance.\n const svgX = ((event.clientX - rect.left) / rect.width) * this.width();\n let best = s;\n let bestDist = Infinity;\n for (let i = s; i <= e; i++) {\n const d = Math.abs(this.xOf(i) - svgX);\n if (d < bestDist) {\n bestDist = d;\n best = i;\n }\n }\n return best;\n }\n const plFrac = this.pl() / this.width();\n const rFrac = PAD.r / this.width();\n const fx = ((event.clientX - rect.left) / rect.width - plFrac) / (1 - plFrac - rFrac);\n return Math.max(s, Math.min(e, s + Math.round(fx * (e - s))));\n }\n\n protected onDown(event: PointerEvent): void {\n if (!this.brushEnabled() || this.isEmpty()) return;\n const i = this.idxAt(event);\n if (i == null) return;\n (event.currentTarget as Element | null)?.setPointerCapture?.(event.pointerId);\n this.brushDrag.set({ a: i, b: i });\n this.setHover(null);\n event.preventDefault();\n }\n\n protected onMove(event: PointerEvent): void {\n const drag = this.brushDrag();\n if (drag) {\n const i = this.idxAt(event);\n if (i != null && i !== drag.b) this.brushDrag.set({ a: drag.a, b: i });\n return;\n }\n if (!this.interactive() || (this.type() === 'bar' && !this.isMulti())) return;\n const i = this.idxAt(event);\n if (i != null) this.setHover(i);\n }\n\n protected onUp(): void {\n const d = this.brushDrag();\n if (!d) return;\n this.brushDrag.set(null);\n const lo = Math.min(d.a, d.b);\n const hi = Math.max(d.a, d.b);\n if (hi - lo < 1) return; // a click, not a selection\n if (this.zoom()) this.viewRange.set([lo, hi]);\n this.brushChange.emit([lo, hi]);\n }\n\n protected onDblClick(): void {\n if (this.brushEnabled()) this.resetZoom();\n }\n\n // ── Export (FR-CHART-13) ───────────────────────────────────────\n /**\n * The rendered chart as a standalone SVG string — theme colors resolved to\n * literals, background baked in, y-tick / x-label text included.\n */\n toSVG(): string {\n const svg = this.svgRef()?.nativeElement;\n if (!svg || typeof getComputedStyle === 'undefined') return '';\n const doc = svg.ownerDocument;\n const NS = 'http://www.w3.org/2000/svg';\n const clone = svg.cloneNode(true) as SVGSVGElement;\n clone.setAttribute('xmlns', NS);\n clone.removeAttribute('class');\n clone.removeAttribute('style');\n clone.removeAttribute('tabindex');\n const PROPS = [\n 'stroke',\n 'fill',\n 'stroke-width',\n 'stroke-dasharray',\n 'stroke-linecap',\n 'stroke-linejoin',\n 'opacity',\n 'fill-opacity',\n 'stroke-opacity',\n ];\n const src = Array.from(svg.querySelectorAll<SVGElement>('*'));\n const dst = Array.from(clone.querySelectorAll<SVGElement>('*'));\n src.forEach((el, i) => {\n const cs = getComputedStyle(el);\n for (const p of PROPS) {\n const v = cs.getPropertyValue(p);\n if (v) dst[i].setAttribute(p, v);\n }\n dst[i].removeAttribute('class');\n });\n const rootCs = getComputedStyle(svg);\n const bg = rootCs.getPropertyValue('--bg-1').trim();\n const fg = rootCs.getPropertyValue('--t3').trim() || '#888';\n const hasLabels = this.displayLabels().length > 0;\n const w = this.width();\n const h = this.height() + (hasLabels ? 18 : 0);\n clone.setAttribute('viewBox', `0 0 ${w} ${h}`);\n clone.setAttribute('width', String(w));\n clone.setAttribute('height', String(h));\n if (bg) {\n const rect = doc.createElementNS(NS, 'rect');\n rect.setAttribute('width', String(w));\n rect.setAttribute('height', String(h));\n rect.setAttribute('fill', bg);\n clone.insertBefore(rect, clone.firstChild);\n }\n const text = (x: number, y: number, content: string, anchor: string) => {\n const t = doc.createElementNS(NS, 'text');\n t.setAttribute('x', String(round(x)));\n t.setAttribute('y', String(round(y)));\n t.setAttribute('fill', fg);\n t.setAttribute('font-size', '10');\n t.setAttribute('font-family', 'monospace');\n t.setAttribute('text-anchor', anchor);\n t.textContent = content;\n clone.appendChild(t);\n };\n for (const tick of this.yAxisTicks()) text(this.pl() - 6, tick.y + 3.5, tick.text, 'end');\n if (hasLabels) {\n for (const l of this.displayLabels())\n text(this.xOf(l.i), this.height() + 12, l.text, 'middle');\n }\n return new XMLSerializer().serializeToString(clone);\n }\n\n /** The chart as a PNG data URL at the given scale (default 2×). */\n toPNG(scale = 2): Promise<string> {\n const s = this.toSVG();\n const w = this.width();\n const h = this.height() + (this.displayLabels().length ? 18 : 0);\n return new Promise((resolve, reject) => {\n if (!s) {\n reject(new Error('chart is not rendered'));\n return;\n }\n const img = new Image();\n img.onload = () => {\n const canvas = document.createElement('canvas');\n canvas.width = Math.round(w * scale);\n canvas.height = Math.round(h * scale);\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n reject(new Error('no 2d canvas context'));\n return;\n }\n ctx.scale(scale, scale);\n ctx.drawImage(img, 0, 0);\n resolve(canvas.toDataURL('image/png'));\n };\n img.onerror = () => reject(new Error('SVG rasterization failed'));\n img.src = 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(s);\n });\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n input,\n signal,\n} from '@angular/core';\n\n/** A single weighted slice of a donut chart. */\nexport interface StrctDonutSegment {\n value: number;\n label?: string;\n color?: string;\n}\n\nconst PALETTE = [\n 'var(--acc)',\n 'var(--success)',\n 'var(--warning)',\n 'var(--critical)',\n 'color-mix(in srgb, var(--acc) 55%, var(--bg-1))',\n 'var(--t3)',\n];\n\nconst round = (n: number): number => Math.round(n * 100) / 100;\n\n/**\n * Donut / ring chart from weighted segments. Rounded, gapped slices with a\n * sweep-in animation; hover a slice (or its legend row) to highlight it and read\n * its value + share in the center. Dependency-free SVG, token-coloured.\n *\n * <strct-donut\n * [segments]=\"[{ value: 36, label: 'Running' }, { value: 8, label: 'Stopped' }]\"\n * centerValue=\"44\" centerLabel=\"VMs\" legend />\n */\n@Component({\n selector: 'strct-donut',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n <div class=\"strct-donut__layout\">\n <div class=\"strct-donut__wrap\" [style.width.px]=\"size()\" [style.height.px]=\"size()\">\n <svg\n class=\"strct-donut__svg\"\n role=\"img\"\n [attr.aria-label]=\"ariaSummary()\"\n [attr.viewBox]=\"'0 0 ' + size() + ' ' + size()\"\n [style.width.px]=\"size()\"\n [style.height.px]=\"size()\"\n >\n <g [attr.transform]=\"'rotate(-90 ' + half() + ' ' + half() + ')'\">\n <circle\n class=\"strct-donut__track\"\n [attr.cx]=\"half()\"\n [attr.cy]=\"half()\"\n [attr.r]=\"radius()\"\n fill=\"none\"\n [attr.stroke-width]=\"thickness()\"\n />\n @for (arc of arcs(); track $index) {\n <circle\n class=\"strct-donut__arc\"\n [class.is-dim]=\"hovered() !== null && hovered() !== $index\"\n [attr.cx]=\"half()\"\n [attr.cy]=\"half()\"\n [attr.r]=\"radius()\"\n fill=\"none\"\n stroke-linecap=\"round\"\n [attr.stroke]=\"arc.color\"\n [attr.stroke-width]=\"hovered() === $index ? thickness() + 5 : thickness()\"\n [attr.stroke-dasharray]=\"arc.dash\"\n [attr.stroke-dashoffset]=\"arc.offset\"\n (pointerenter)=\"enter($index)\"\n (pointerleave)=\"leave()\"\n />\n }\n </g>\n </svg>\n @if (centerMain() || centerSub()) {\n <div class=\"strct-donut__center\">\n <div class=\"strct-donut__value\" [style.color]=\"centerColor()\">{{ centerMain() }}</div>\n <div class=\"strct-donut__label\">{{ centerSub() }}</div>\n </div>\n }\n </div>\n\n @if (legend()) {\n <ul class=\"strct-donut__legend\">\n @for (arc of arcs(); track $index) {\n <li\n class=\"strct-donut__leg\"\n tabindex=\"0\"\n [class.is-active]=\"hovered() === $index\"\n [class.is-dim]=\"hovered() !== null && hovered() !== $index\"\n (pointerenter)=\"enter($index)\"\n (pointerleave)=\"leave()\"\n (focus)=\"enter($index)\"\n (blur)=\"leave()\"\n >\n <span class=\"strct-donut__swatch\" [style.background]=\"arc.color\"></span>\n <span class=\"strct-donut__leg-label\">{{ arc.label }}</span>\n <span class=\"strct-donut__leg-val\">{{ arc.value }}</span>\n <span class=\"strct-donut__leg-pct\">{{ arc.pct }}%</span>\n </li>\n }\n </ul>\n }\n </div>\n `,\n host: { class: 'strct-donut' },\n styles: [\n `\n .strct-donut {\n display: inline-block;\n }\n .strct-donut__layout {\n display: inline-flex;\n align-items: center;\n gap: 20px;\n }\n .strct-donut__wrap {\n position: relative;\n flex-shrink: 0;\n }\n .strct-donut__track {\n stroke: var(--bg-3);\n }\n .strct-donut__arc {\n cursor: pointer;\n transition:\n stroke-width 0.16s ease,\n opacity 0.16s ease;\n }\n .strct-donut__arc.is-dim {\n opacity: 0.32;\n }\n .strct-donut__center {\n position: absolute;\n inset: 0;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n pointer-events: none;\n }\n .strct-donut__value {\n font-size: var(--text-2xl);\n font-weight: 650;\n color: var(--t1);\n line-height: 1;\n font-variant-numeric: tabular-nums;\n transition: color 0.16s ease;\n }\n .strct-donut__label {\n font-size: 12px;\n color: var(--t2);\n margin-top: 3px;\n }\n\n /* Legend */\n .strct-donut__legend {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n }\n .strct-donut__leg {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 3px 6px;\n border-radius: var(--radius-sm);\n font-size: 12px;\n color: var(--t2);\n cursor: pointer;\n transition:\n background 0.14s ease,\n opacity 0.14s ease;\n }\n .strct-donut__leg.is-active {\n background: var(--bg-2);\n color: var(--t1);\n }\n .strct-donut__leg.is-dim {\n opacity: 0.45;\n }\n .strct-donut__leg:focus-visible {\n outline: none;\n box-shadow: inset 0 0 0 2px var(--acc50);\n }\n .strct-donut__swatch {\n width: 9px;\n height: 9px;\n border-radius: 2px;\n flex-shrink: 0;\n }\n .strct-donut__leg-label {\n flex: 1;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n .strct-donut__leg-val {\n font-variant-numeric: tabular-nums;\n font-weight: 600;\n color: var(--t1);\n }\n .strct-donut__leg-pct {\n font-variant-numeric: tabular-nums;\n color: var(--t3);\n min-width: 34px;\n text-align: end;\n }\n\n @media (prefers-reduced-motion: no-preference) {\n .strct-donut__svg {\n transform-origin: center;\n animation: strct-donut-in 0.6s cubic-bezier(0.22, 1, 0.36, 1) both;\n }\n }\n @keyframes strct-donut-in {\n from {\n opacity: 0;\n transform: rotate(-16deg) scale(0.94);\n }\n to {\n opacity: 1;\n transform: none;\n }\n }\n `,\n ],\n})\nexport class StrctDonut {\n /** Weighted segments. */\n readonly segments = input.required<StrctDonutSegment[]>();\n /** Size variant. */\n readonly size = input(120);\n /** Stroke thickness in pixels. */\n readonly thickness = input(14);\n /** Value shown in the donut center (when no slice is hovered). */\n readonly centerValue = input<string | number>('');\n /** Label shown in the donut center (when no slice is hovered). */\n readonly centerLabel = input('');\n /** Show a legend (color · label · value · %) beside the ring. */\n readonly legend = input(false, { transform: booleanAttribute });\n /** Gap between slices, in degrees. */\n readonly gap = input(3);\n /** Hover highlight + center readout. */\n readonly interactive = input(true, { transform: booleanAttribute });\n\n protected readonly hovered = signal<number | null>(null);\n\n protected readonly half = computed(() => this.size() / 2);\n protected readonly radius = computed(() => (this.size() - this.thickness()) / 2);\n protected readonly circumference = computed(() => 2 * Math.PI * this.radius());\n\n private readonly total = computed(\n () => this.segments().reduce((s, x) => s + Math.max(0, x.value), 0) || 1,\n );\n\n protected readonly arcs = computed(() => {\n const segs = this.segments();\n const total = this.total();\n const c = this.circumference();\n // Gap (in px along the circumference) only when there is more than one slice.\n const gapPx = segs.length > 1 ? (this.gap() / 360) * c : 0;\n let cursor = 0;\n return segs.map((seg, i) => {\n const full = (Math.max(0, seg.value) / total) * c;\n const vis = Math.max(0, full - gapPx);\n const arc = {\n color: seg.color ?? PALETTE[i % PALETTE.length],\n label: seg.label ?? `Slice ${i + 1}`,\n value: seg.value,\n pct: Math.round((Math.max(0, seg.value) / total) * 100),\n dash: `${round(vis)} ${round(c - vis)}`,\n offset: round(-(cursor + gapPx / 2)),\n };\n cursor += full;\n return arc;\n });\n });\n\n protected readonly centerMain = computed(() => {\n const h = this.hovered();\n if (h !== null) return this.arcs()[h]?.value ?? '';\n return this.centerValue();\n });\n protected readonly centerSub = computed(() => {\n const h = this.hovered();\n if (h !== null) {\n const a = this.arcs()[h];\n return a ? `${a.label} · ${a.pct}%` : '';\n }\n return this.centerLabel();\n });\n protected readonly centerColor = computed(() => {\n const h = this.hovered();\n return h !== null ? (this.arcs()[h]?.color ?? 'var(--t1)') : 'var(--t1)';\n });\n\n /** Screen-reader summary (role=\"img\" name): every slice with value + share. */\n protected readonly ariaSummary = computed(() => {\n const parts = this.arcs().map((a) => `${a.label} ${a.value} (${a.pct}%)`);\n return `Donut chart: ${parts.join(', ')}`;\n });\n\n protected enter(i: number): void {\n if (this.interactive()) this.hovered.set(i);\n }\n protected leave(): void {\n this.hovered.set(null);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n input,\n} from '@angular/core';\nimport { StrctChartStatus } from './sparkline';\nimport { StrctThresholds } from '../status';\n\nconst COLOR: Record<StrctChartStatus, string> = {\n accent: 'var(--acc)',\n success: 'var(--success)',\n warning: 'var(--warning)',\n critical: 'var(--critical)',\n};\n\n/**\n * 270° radial gauge for a 0–100 value (CPU, memory, capacity …).\n * <strct-gauge [value]=\"72\" status=\"warning\" label=\"CPU\" />\n */\n@Component({\n selector: 'strct-gauge',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n <div class=\"strct-gauge__wrap\" [style.width.px]=\"size()\" [style.height.px]=\"size()\">\n <svg\n [attr.viewBox]=\"'0 0 ' + size() + ' ' + size()\"\n [style.width.px]=\"size()\"\n [style.height.px]=\"size()\"\n >\n <g [attr.transform]=\"'rotate(135 ' + half() + ' ' + half() + ')'\">\n <circle\n class=\"strct-gauge__track\"\n [attr.cx]=\"half()\"\n [attr.cy]=\"half()\"\n [attr.r]=\"radius()\"\n fill=\"none\"\n [attr.stroke-width]=\"thickness()\"\n stroke-linecap=\"round\"\n [attr.stroke-dasharray]=\"trackDash()\"\n />\n <circle\n class=\"strct-gauge__value\"\n [attr.cx]=\"half()\"\n [attr.cy]=\"half()\"\n [attr.r]=\"radius()\"\n fill=\"none\"\n [attr.stroke]=\"color()\"\n [attr.stroke-width]=\"thickness()\"\n stroke-linecap=\"round\"\n [attr.stroke-dasharray]=\"valueDash()\"\n />\n </g>\n </svg>\n <div class=\"strct-gauge__center\">\n <div class=\"strct-gauge__num\">{{ clamped() }}<span class=\"strct-gauge__pct\">%</span></div>\n @if (label()) {\n <div class=\"strct-gauge__label\">{{ label() }}</div>\n }\n </div>\n </div>\n `,\n host: { class: 'strct-gauge' },\n styles: [\n `\n .strct-gauge {\n display: inline-block;\n }\n .strct-gauge__wrap {\n position: relative;\n }\n .strct-gauge__track {\n stroke: var(--bg-3);\n }\n .strct-gauge__value {\n transition: stroke-dasharray 0.4s ease;\n }\n .strct-gauge__center {\n position: absolute;\n inset: 0;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n pointer-events: none;\n }\n .strct-gauge__num {\n font-size: var(--text-2xl);\n font-weight: 600;\n color: var(--t1);\n line-height: 1;\n }\n .strct-gauge__pct {\n font-size: 12px;\n color: var(--t2);\n margin-inline-start: 1px;\n }\n .strct-gauge__label {\n font-size: 12px;\n color: var(--t2);\n margin-top: 3px;\n }\n `,\n ],\n})\nexport class StrctGauge {\n /** Current value. */\n readonly value = input(0);\n /** Visual status color. */\n readonly status = input<StrctChartStatus>('accent');\n /**\n * Optional value-driven thresholds. When set, the gauge picks its own status\n * from the value: `value >= critical` → critical, `>= warning` → warning, else\n * the healthy base (`status`, or `'success'` when `status` is left at its\n * default `'accent'`).\n */\n readonly thresholds = input<StrctThresholds | null>(null);\n /** Label text. */\n readonly label = input('');\n /** Size variant. */\n readonly size = input(120);\n /** Stroke thickness in pixels. */\n readonly thickness = input(12);\n\n protected readonly clamped = computed(() => Math.round(Math.max(0, Math.min(100, this.value()))));\n protected readonly half = computed(() => this.size() / 2);\n protected readonly radius = computed(() => (this.size() - this.thickness()) / 2);\n\n /** Status after applying thresholds (falls back to `status` when none set). */\n protected readonly resolvedStatus = computed<StrctChartStatus>(() => {\n const t = this.thresholds();\n if (!t) return this.status();\n const v = this.value();\n if (t.critical != null && v >= t.critical) return 'critical';\n if (t.warning != null && v >= t.warning) return 'warning';\n const base = this.status();\n return base === 'accent' ? 'success' : base;\n });\n\n protected readonly color = computed(() => COLOR[this.resolvedStatus()]);\n\n private readonly circumference = computed(() => 2 * Math.PI * this.radius());\n\n protected readonly trackDash = computed(() => {\n const c = this.circumference();\n return `${0.75 * c} ${c}`;\n });\n\n protected readonly valueDash = computed(() => {\n const c = this.circumference();\n return `${(this.clamped() / 100) * 0.75 * c} ${c}`;\n });\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n input,\n} from '@angular/core';\nimport { StrctStatus } from '../status';\n\n/** One endpoint in a `StrctFlow`. */\nexport interface StrctFlowNode {\n /** Stable identity (used as the @for track key). */\n id: string;\n /** Primary terminal label. */\n label: string;\n /** Optional secondary line under the label. */\n sublabel?: string;\n /** Optional role tag (e.g. \"ACTIVE\", \"STANDBY\"). */\n role?: string;\n /** Optional status dot tone for this terminal. */\n status?: StrctStatus;\n}\n\n/** Direction of travel for the animated flow. */\nexport type StrctFlowDirection = 'forward' | 'reverse' | 'both';\n/** Axis the terminals are laid out along. */\nexport type StrctFlowOrientation = 'horizontal' | 'vertical';\n\n/**\n * Shows a connection between two (or N) endpoints with an optional animated\n * \"flow\" — moving dots travelling along the connector — to represent live data\n * movement (replication, sync, a pipeline).\n *\n * <strct-flow\n * [nodes]=\"[\n * { id: 'a', label: 'node01', role: 'ACTIVE', status: 'success' },\n * { id: 'b', label: 'node02', role: 'STANDBY', status: 'accent' }\n * ]\"\n * [live]=\"true\" label=\"live replication · 0 lag\" status=\"success\" />\n *\n * When `live` is off (or the user prefers reduced motion) the connector is a\n * static gradient with a direction arrow instead of moving dots.\n */\n@Component({\n selector: 'strct-flow',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n <div class=\"strct-flow__row\">\n @for (node of nodes(); track node.id; let last = $last) {\n <div class=\"strct-flow__node strct-flow__node--{{ node.status ?? 'neutral' }}\">\n <span class=\"strct-flow__dot\" aria-hidden=\"true\"></span>\n <span class=\"strct-flow__node-text\">\n <span class=\"strct-flow__label\">{{ node.label }}</span>\n @if (node.role) {\n <span class=\"strct-flow__role\">{{ node.role }}</span>\n }\n @if (node.sublabel) {\n <span class=\"strct-flow__sub\">{{ node.sublabel }}</span>\n }\n </span>\n </div>\n\n @if (!last) {\n <div class=\"strct-flow__conn\" aria-hidden=\"true\">\n <span class=\"strct-flow__line\"></span>\n @if (showArrow('forward')) {\n <span class=\"strct-flow__arrow strct-flow__arrow--fwd\"></span>\n }\n @if (showArrow('reverse')) {\n <span class=\"strct-flow__arrow strct-flow__arrow--rev\"></span>\n }\n @if (animated()) {\n @if (showArrow('forward')) {\n <span class=\"strct-flow__pkt strct-flow__pkt--fwd strct-flow__pkt--1\"></span>\n <span class=\"strct-flow__pkt strct-flow__pkt--fwd strct-flow__pkt--2\"></span>\n <span class=\"strct-flow__pkt strct-flow__pkt--fwd strct-flow__pkt--3\"></span>\n }\n @if (showArrow('reverse')) {\n <span class=\"strct-flow__pkt strct-flow__pkt--rev strct-flow__pkt--1\"></span>\n <span class=\"strct-flow__pkt strct-flow__pkt--rev strct-flow__pkt--2\"></span>\n <span class=\"strct-flow__pkt strct-flow__pkt--rev strct-flow__pkt--3\"></span>\n }\n }\n </div>\n }\n }\n </div>\n\n @if (caption()) {\n <div class=\"strct-flow__caption\">{{ caption() }}</div>\n }\n `,\n host: {\n class: 'strct-flow',\n role: 'img',\n '[class.strct-flow--vertical]': \"orientation() === 'vertical'\",\n '[class.strct-flow--neutral]': \"status() === 'neutral'\",\n '[class.strct-flow--accent]': \"status() === 'accent'\",\n '[class.strct-flow--success]': \"status() === 'success'\",\n '[class.strct-flow--warning]': \"status() === 'warning'\",\n '[class.strct-flow--critical]': \"status() === 'critical'\",\n '[class.strct-flow--live]': 'animated()',\n '[attr.aria-label]': 'ariaLabel()',\n },\n styles: [\n `\n .strct-flow {\n --strct-flow-color: var(--acc);\n display: block;\n }\n .strct-flow--neutral {\n --strct-flow-color: var(--t3);\n }\n .strct-flow--accent {\n --strct-flow-color: var(--acc);\n }\n .strct-flow--success {\n --strct-flow-color: var(--success);\n }\n .strct-flow--warning {\n --strct-flow-color: var(--warning);\n }\n .strct-flow--critical {\n --strct-flow-color: var(--critical);\n }\n\n .strct-flow__row {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n }\n .strct-flow--vertical .strct-flow__row {\n flex-direction: column;\n align-items: stretch;\n }\n\n /* ── Terminal ─────────────────────────────────────────────── */\n .strct-flow__node {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n padding: var(--space-2) var(--space-3);\n border: 1px solid var(--b2);\n border-radius: var(--radius-md);\n background: var(--bg-1);\n flex-shrink: 0;\n }\n .strct-flow__dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n flex-shrink: 0;\n background: var(--t3);\n }\n .strct-flow__node--accent .strct-flow__dot {\n background: var(--acc);\n }\n .strct-flow__node--success .strct-flow__dot {\n background: var(--success);\n }\n .strct-flow__node--warning .strct-flow__dot {\n background: var(--warning);\n }\n .strct-flow__node--critical .strct-flow__dot {\n background: var(--critical);\n }\n .strct-flow__node-text {\n display: flex;\n flex-direction: column;\n gap: 1px;\n min-width: 0;\n }\n .strct-flow__label {\n font-size: var(--text-md);\n font-weight: 600;\n color: var(--t1);\n line-height: 1.2;\n }\n .strct-flow__role {\n font-size: 12px;\n font-weight: 700;\n letter-spacing: 0.4px;\n color: var(--t3);\n }\n .strct-flow__sub {\n font-size: var(--text-sm);\n color: var(--t3);\n }\n\n /* ── Connector ────────────────────────────────────────────── */\n .strct-flow__conn {\n position: relative;\n flex: 1 1 auto;\n min-width: 40px;\n height: 2px;\n align-self: center;\n }\n .strct-flow--vertical .strct-flow__conn {\n width: 2px;\n min-width: 0;\n height: 28px;\n flex: 0 0 28px;\n align-self: center;\n }\n .strct-flow__line {\n position: absolute;\n inset: 0;\n border-radius: 2px;\n background: linear-gradient(\n to right,\n var(--b3),\n color-mix(in srgb, var(--strct-flow-color) 55%, transparent),\n var(--b3)\n );\n }\n .strct-flow--vertical .strct-flow__line {\n background: linear-gradient(\n to bottom,\n var(--b3),\n color-mix(in srgb, var(--strct-flow-color) 55%, transparent),\n var(--b3)\n );\n }\n\n /* Direction arrowheads (always shown, even when not live). */\n .strct-flow__arrow {\n position: absolute;\n top: 50%;\n width: 0;\n height: 0;\n border-top: 4px solid transparent;\n border-bottom: 4px solid transparent;\n }\n .strct-flow__arrow--fwd {\n right: -1px;\n transform: translateY(-50%);\n border-inline-start: 6px solid var(--strct-flow-color);\n }\n .strct-flow__arrow--rev {\n left: -1px;\n transform: translateY(-50%);\n border-inline-end: 6px solid var(--strct-flow-color);\n }\n .strct-flow--vertical .strct-flow__arrow {\n top: auto;\n left: 50%;\n }\n .strct-flow--vertical .strct-flow__arrow--fwd {\n right: auto;\n bottom: -1px;\n transform: translateX(-50%);\n border-inline-start: 4px solid transparent;\n border-inline-end: 4px solid transparent;\n border-top: 6px solid var(--strct-flow-color);\n border-bottom: 0;\n }\n .strct-flow--vertical .strct-flow__arrow--rev {\n left: 50%;\n top: -1px;\n transform: translateX(-50%);\n border-inline-start: 4px solid transparent;\n border-inline-end: 4px solid transparent;\n border-bottom: 6px solid var(--strct-flow-color);\n border-top: 0;\n }\n\n /* Travelling packets. */\n .strct-flow__pkt {\n position: absolute;\n top: 50%;\n width: 5px;\n height: 5px;\n margin: -2.5px 0 0 -2.5px;\n border-radius: 50%;\n background: var(--strct-flow-color);\n box-shadow: 0 0 5px var(--strct-flow-color);\n }\n .strct-flow--vertical .strct-flow__pkt {\n top: 0;\n left: 50%;\n }\n .strct-flow__pkt--fwd {\n animation: strct-flow-fwd 1.8s linear infinite;\n }\n .strct-flow__pkt--rev {\n animation: strct-flow-rev 1.8s linear infinite;\n }\n .strct-flow--vertical .strct-flow__pkt--fwd {\n animation-name: strct-flow-fwd-v;\n }\n .strct-flow--vertical .strct-flow__pkt--rev {\n animation-name: strct-flow-rev-v;\n }\n .strct-flow__pkt--2 {\n animation-delay: 0.6s;\n }\n .strct-flow__pkt--3 {\n animation-delay: 1.2s;\n }\n\n @keyframes strct-flow-fwd {\n from {\n left: 0;\n opacity: 0;\n }\n 15%,\n 85% {\n opacity: 1;\n }\n to {\n left: 100%;\n opacity: 0;\n }\n }\n @keyframes strct-flow-rev {\n from {\n left: 100%;\n opacity: 0;\n }\n 15%,\n 85% {\n opacity: 1;\n }\n to {\n left: 0;\n opacity: 0;\n }\n }\n @keyframes strct-flow-fwd-v {\n from {\n top: 0;\n opacity: 0;\n }\n 15%,\n 85% {\n opacity: 1;\n }\n to {\n top: 100%;\n opacity: 0;\n }\n }\n @keyframes strct-flow-rev-v {\n from {\n top: 100%;\n opacity: 0;\n }\n 15%,\n 85% {\n opacity: 1;\n }\n to {\n top: 0;\n opacity: 0;\n }\n }\n\n .strct-flow__caption {\n margin-top: var(--space-2);\n text-align: center;\n font-size: var(--text-sm);\n color: var(--t3);\n }\n .strct-flow--vertical .strct-flow__caption {\n text-align: start;\n }\n\n /* Reduced motion: keep the static gradient + arrows, drop the packets. */\n @media (prefers-reduced-motion: reduce) {\n .strct-flow__pkt {\n display: none;\n }\n }\n `,\n ],\n})\nexport class StrctFlow {\n /** Ordered endpoints. */\n readonly nodes = input<StrctFlowNode[]>([]);\n /** Animate the flow (packets travel along the connector). */\n readonly live = input(false, { transform: booleanAttribute });\n /** Direction of travel. */\n readonly direction = input<StrctFlowDirection>('forward');\n /** Caption under the connector (e.g. \"live replication\", \"0 lag\"). */\n readonly label = input('');\n /** Connector + packet color. */\n readonly status = input<StrctStatus>('accent');\n /** Layout axis. */\n readonly orientation = input<StrctFlowOrientation>('horizontal');\n\n /** A flow needs at least two terminals to animate. */\n protected readonly connected = computed(() => this.nodes().length > 1);\n protected readonly animated = computed(() => this.live() && this.connected());\n\n /** Whether to show packets / arrow in the given travel direction. */\n protected showArrow(dir: 'forward' | 'reverse'): boolean {\n const d = this.direction();\n return d === 'both' || d === dir;\n }\n\n /** Caption text, falling back to a \"no connection\" hint for a lone terminal. */\n protected readonly caption = computed(() => {\n if (!this.connected()) return this.label() || 'No connection';\n return this.label();\n });\n\n /** Human-readable summary for assistive tech. */\n protected readonly ariaLabel = computed(() => {\n const labels = this.nodes().map((n) => n.label);\n if (labels.length === 0) return this.label() || 'Flow';\n if (labels.length === 1) return `${labels[0]}, no connection`;\n const sep =\n this.direction() === 'both' ? ' ↔ ' : this.direction() === 'reverse' ? ' ← ' : ' → ';\n const live = this.live() ? ', live' : '';\n const cap = this.label() ? ` (${this.label()})` : '';\n return `Flow ${labels.join(sep)}${live}${cap}`;\n });\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n input,\n} from '@angular/core';\nimport { StrctIcon } from '../icon/icon';\nimport { StrctChartStatus, StrctSparkline } from '../charts/sparkline';\n\n/** Accent colour for a metric tile. */\nexport type StrctMetricStatus = 'neutral' | 'accent' | 'success' | 'warning' | 'critical';\n\n/**\n * Dense KPI tile: a label, a large value (+ unit), an optional change indicator\n * and an optional inline sparkline. Built for at-a-glance dashboards.\n *\n * <strct-metric-tile label=\"CPU\" [value]=\"62\" unit=\"%\" icon=\"cpu\"\n * status=\"warning\" [delta]=\"8\" [data]=\"cpuTrend\" />\n */\n@Component({\n selector: 'strct-metric-tile',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon, StrctSparkline],\n template: `\n <div class=\"strct-mt__top\">\n @if (icon()) {\n <span class=\"strct-mt__icon\"><strct-icon [name]=\"icon()\" [size]=\"16\" /></span>\n }\n <span class=\"strct-mt__label\">{{ label() }}</span>\n @if (hasDelta()) {\n <span class=\"strct-mt__delta strct-mt__delta--{{ deltaTone() }}\">\n <strct-icon\n [name]=\"delta()! >= 0 ? 'arrowUp' : 'arrowDown'\"\n [size]=\"11\"\n [strokeWidth]=\"2\"\n />\n {{ absDelta() }}{{ deltaSuffix() }}\n </span>\n }\n </div>\n\n <div class=\"strct-mt__value strct-mt__value--{{ status() }}\">\n {{ value() }}\n @if (unit()) {\n <span class=\"strct-mt__unit\">{{ unit() }}</span>\n }\n </div>\n\n @if (caption()) {\n <div class=\"strct-mt__caption\">{{ caption() }}</div>\n }\n\n @if (data().length) {\n <div class=\"strct-mt__spark\">\n <strct-sparkline [data]=\"data()\" [status]=\"sparkStatus()\" area [height]=\"28\" />\n </div>\n }\n `,\n host: { class: 'strct-mt' },\n styles: [\n `\n .strct-mt {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 13px 15px;\n border: 1px solid var(--b2);\n border-radius: 10px;\n background: var(--bg-1);\n min-width: 0;\n }\n .strct-mt__top {\n display: flex;\n align-items: center;\n gap: 7px;\n }\n .strct-mt__icon {\n display: inline-flex;\n color: var(--t3);\n flex-shrink: 0;\n }\n .strct-mt__label {\n font-size: 12px;\n font-weight: 500;\n color: var(--t3);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n .strct-mt__delta {\n display: inline-flex;\n align-items: center;\n gap: 2px;\n margin-inline-start: auto;\n font-size: 12px;\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n flex-shrink: 0;\n }\n .strct-mt__delta--up {\n color: var(--success);\n }\n .strct-mt__delta--down {\n color: var(--critical);\n }\n .strct-mt__delta--flat {\n color: var(--t3);\n }\n .strct-mt__value {\n display: flex;\n align-items: baseline;\n gap: 4px;\n font-size: var(--text-3xl);\n font-weight: 650;\n letter-spacing: -0.01em;\n color: var(--t1);\n line-height: 1.1;\n }\n .strct-mt__value--accent {\n color: var(--acc);\n }\n .strct-mt__value--success {\n color: var(--success);\n }\n .strct-mt__value--warning {\n color: var(--warning);\n }\n .strct-mt__value--critical {\n color: var(--critical);\n }\n .strct-mt__unit {\n font-size: 14px;\n font-weight: 500;\n color: var(--t3);\n letter-spacing: 0;\n }\n .strct-mt__caption {\n font-size: 12px;\n color: var(--t3);\n }\n .strct-mt__spark {\n margin-top: 2px;\n line-height: 0;\n }\n .strct-mt__spark strct-sparkline,\n .strct-mt__spark .strct-spark__svg {\n width: 100%;\n }\n `,\n ],\n})\nexport class StrctMetricTile {\n /** Small caption above the value. */\n readonly label = input.required<string>();\n /** The headline value. */\n readonly value = input.required<string | number>();\n /** Unit shown after the value (e.g. `%`, `GB`). */\n readonly unit = input('');\n /** Optional leading icon name. */\n readonly icon = input('');\n /** Tints the value (defaults to neutral primary text). */\n readonly status = input<StrctMetricStatus>('neutral');\n /** Change indicator; sign drives the arrow + colour. Null hides it. */\n readonly delta = input<number | null>(null);\n /** Suffix for the delta number. */\n readonly deltaSuffix = input('%');\n /** Treat a positive delta as bad (e.g. error rate, latency). */\n readonly invertDelta = input(false, { transform: booleanAttribute });\n /** Small sub-text under the value (e.g. \"of 256 GB\"). */\n readonly caption = input('');\n /** Sparkline series; empty hides the chart. */\n readonly data = input<number[]>([]);\n\n protected readonly hasDelta = computed(() => this.delta() !== null);\n protected readonly absDelta = computed(() => Math.abs(this.delta() ?? 0));\n protected readonly deltaTone = computed<'up' | 'down' | 'flat'>(() => {\n const d = this.delta() ?? 0;\n if (d === 0) return 'flat';\n const good = this.invertDelta() ? d < 0 : d > 0;\n return good ? 'up' : 'down';\n });\n\n protected readonly sparkStatus = computed<StrctChartStatus>(() => {\n const s = this.status();\n return s === 'neutral' ? 'accent' : s;\n });\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n input,\n} from '@angular/core';\nimport { StrctIcon } from '../icon/icon';\nimport { StrctStatus } from '../status';\n\nlet heroCounter = 0;\n\n/** Default leading icon per status, when `icon` is not supplied. */\nconst DEFAULT_ICON: Record<StrctStatus, string> = {\n success: 'success',\n warning: 'warning',\n critical: 'critical',\n accent: 'info',\n neutral: 'info',\n};\n\n/**\n * Page-level status summary banner: a tone-colored surface with a leading icon\n * chip, a heading, a description, and optional right-aligned metadata / actions.\n *\n * Distinct from `StrctAlert` (a dismissible inline notification) and\n * `StrctSignpost` (a popover). Use it for the prominent \"Protected\", \"All systems\n * healthy\", \"Clock synchronized\" summaries apps otherwise hand-roll.\n *\n * <strct-hero status=\"success\" icon=\"shield\" heading=\"High availability is on\">\n * The standby node can take over if this one fails.\n * <div strctHeroMeta><strct-badge status=\"success\">HA ON</strct-badge></div>\n * <div strctHeroActions>\n * <button strct-button size=\"sm\">Switch over</button>\n * </div>\n * </strct-hero>\n */\n@Component({\n selector: 'strct-hero',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon],\n template: `\n <span class=\"strct-hero__chip\" aria-hidden=\"true\">\n <strct-icon [name]=\"resolvedIcon()\" [size]=\"dense() ? 16 : 18\" />\n </span>\n\n <div class=\"strct-hero__text\">\n <div class=\"strct-hero__heading\" [id]=\"headingId\">{{ heading() }}</div>\n <div class=\"strct-hero__desc\"><ng-content /></div>\n </div>\n\n <div class=\"strct-hero__aside\">\n <div class=\"strct-hero__meta\"><ng-content select=\"[strctHeroMeta]\" /></div>\n <div class=\"strct-hero__actions\"><ng-content select=\"[strctHeroActions]\" /></div>\n </div>\n `,\n host: {\n class: 'strct-hero',\n '[class.strct-hero--accent]': \"status() === 'accent'\",\n '[class.strct-hero--success]': \"status() === 'success'\",\n '[class.strct-hero--warning]': \"status() === 'warning'\",\n '[class.strct-hero--critical]': \"status() === 'critical'\",\n '[class.strct-hero--dense]': 'dense()',\n '[attr.role]': \"status() === 'critical' ? 'alert' : 'status'\",\n '[attr.aria-labelledby]': 'headingId',\n },\n styles: [\n `\n /* Restrained: neutral raised surface with a colored left rail + a filled,\n status-colored icon chip — the tint carries the tone without a loud fill. */\n .strct-hero {\n display: flex;\n align-items: flex-start;\n flex-wrap: wrap;\n gap: var(--space-3);\n padding: var(--space-4) var(--space-5);\n border-radius: var(--radius-lg);\n background: var(--bg-1);\n border: 1px solid var(--b2);\n border-inline-start: 3px solid var(--b3);\n }\n .strct-hero--dense {\n padding: var(--space-3) var(--space-4);\n gap: var(--space-2);\n }\n\n .strct-hero__chip {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 34px;\n height: 34px;\n border-radius: 50%;\n flex-shrink: 0;\n background: var(--bg-a);\n color: var(--t2);\n }\n .strct-hero--dense .strct-hero__chip {\n width: 28px;\n height: 28px;\n }\n\n .strct-hero__text {\n flex: 1 1 280px;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 3px;\n }\n .strct-hero__heading {\n font-size: var(--text-xl);\n font-weight: 650;\n letter-spacing: -0.01em;\n color: var(--t1);\n line-height: var(--leading-tight);\n }\n .strct-hero--dense .strct-hero__heading {\n font-size: var(--text-lg);\n }\n .strct-hero__desc {\n font-size: var(--text-md);\n color: var(--t2);\n line-height: var(--leading-normal);\n }\n /* Collapse the description wrapper when nothing is projected into it. */\n .strct-hero__desc:empty {\n display: none;\n }\n\n /* Right-aligned cluster: metadata above, actions below; wraps under the text\n on narrow widths. */\n .strct-hero__aside {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: var(--space-2);\n margin-inline-start: auto;\n }\n .strct-hero__meta,\n .strct-hero__actions {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: var(--space-2);\n justify-content: flex-end;\n }\n .strct-hero__meta:empty,\n .strct-hero__actions:empty {\n display: none;\n }\n .strct-hero__aside:not(:has(*:not(:empty))) {\n display: none;\n }\n\n /* Status tints: colored left rail + filled icon chip. */\n .strct-hero--accent {\n border-inline-start-color: var(--acc);\n }\n .strct-hero--accent .strct-hero__chip {\n background: var(--acc);\n color: var(--inv);\n }\n .strct-hero--success {\n border-inline-start-color: var(--success);\n }\n .strct-hero--success .strct-hero__chip {\n background: var(--success);\n color: var(--inv);\n }\n .strct-hero--warning {\n border-inline-start-color: var(--warning);\n }\n .strct-hero--warning .strct-hero__chip {\n background: var(--warning);\n color: var(--inv);\n }\n .strct-hero--critical {\n border-inline-start-color: var(--critical);\n }\n .strct-hero--critical .strct-hero__chip {\n background: var(--critical);\n color: var(--inv);\n }\n\n @media (max-width: 560px) {\n .strct-hero__aside {\n margin-inline-start: 0;\n align-items: stretch;\n width: 100%;\n }\n .strct-hero__meta,\n .strct-hero__actions {\n justify-content: flex-start;\n }\n }\n `,\n ],\n})\nexport class StrctHero {\n /** Tone: drives the left rail + icon chip color. */\n readonly status = input<StrctStatus>('neutral');\n /** Leading icon name (StrctIcon set). Falls back to a per-status default. */\n readonly icon = input('');\n /** The headline; exposed as the banner's accessible name. */\n readonly heading = input.required<string>();\n /** Tighter padding for secondary placements. */\n readonly dense = input(false, { transform: booleanAttribute });\n\n protected readonly headingId = `strct-hero-${++heroCounter}`;\n protected readonly resolvedIcon = computed(() => this.icon() || DEFAULT_ICON[this.status()]);\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n input,\n output,\n} from '@angular/core';\nimport { StrctIcon } from '../icon/icon';\n\n/** Alert visual types. */\nexport type StrctAlertType = 'info' | 'success' | 'warning' | 'critical';\n\n/** Inline contextual banner. `<strct-alert type=\"warning\">…</strct-alert>`. */\n@Component({\n selector: 'strct-alert',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon],\n template: `\n <strct-icon [name]=\"icon()\" [size]=\"16\" />\n <div class=\"strct-alert__body\"><ng-content /></div>\n @if (closable()) {\n <button\n type=\"button\"\n class=\"strct-alert__close\"\n [attr.aria-label]=\"dismissLabel()\"\n (click)=\"closed.emit()\"\n >\n <strct-icon name=\"close\" [size]=\"13\" />\n </button>\n }\n `,\n host: {\n class: 'strct-alert',\n role: 'status',\n '[class.strct-alert--success]': \"type() === 'success'\",\n '[class.strct-alert--warning]': \"type() === 'warning'\",\n '[class.strct-alert--critical]': \"type() === 'critical'\",\n },\n styles: [\n `\n /* Restrained: neutral surface with a colored left rail + colored icon,\n instead of a fully tinted background. */\n .strct-alert {\n display: flex;\n align-items: flex-start;\n gap: var(--space-2);\n padding: var(--space-2) var(--space-3);\n border-radius: var(--radius-lg);\n font-size: 13px;\n color: var(--t1);\n background: var(--bg-1);\n border: 1px solid var(--b2);\n border-inline-start: 3px solid var(--acc);\n }\n .strct-alert strct-icon {\n color: var(--acc);\n margin-top: 1px;\n flex-shrink: 0;\n }\n .strct-alert__body {\n flex: 1;\n color: var(--t1);\n }\n .strct-alert__close {\n flex-shrink: 0;\n display: inline-flex;\n padding: 2px;\n margin: -2px -2px 0 0;\n border: 0;\n background: transparent;\n color: var(--t3);\n cursor: pointer;\n border-radius: 4px;\n }\n .strct-alert__close:hover {\n color: var(--t1);\n background: var(--bg-3);\n }\n\n .strct-alert--success {\n border-inline-start-color: var(--success);\n }\n .strct-alert--success strct-icon {\n color: var(--success);\n }\n .strct-alert--warning {\n border-inline-start-color: var(--warning);\n }\n .strct-alert--warning strct-icon {\n color: var(--warning);\n }\n .strct-alert--critical {\n border-inline-start-color: var(--critical);\n }\n .strct-alert--critical strct-icon {\n color: var(--critical);\n }\n `,\n ],\n})\nexport class StrctAlert {\n /** Visual type / variant. */\n readonly type = input<StrctAlertType>('info');\n /** Show a dismiss button. */\n readonly closable = input(false, { transform: booleanAttribute });\n /** Accessible label of the dismiss button (localizable). */\n readonly dismissLabel = input('Dismiss');\n /** Emitted when the alert is dismissed. */\n readonly closed = output<void>();\n\n protected readonly icon = computed(() => {\n switch (this.type()) {\n case 'success':\n return 'success';\n case 'warning':\n return 'warning';\n case 'critical':\n return 'critical';\n default:\n return 'info';\n }\n });\n}\n","import {\n DOCUMENT,\n Directive,\n ElementRef,\n HostListener,\n Renderer2,\n inject,\n input,\n} from '@angular/core';\n\n/** Tooltip placement relative to the host element. */\nexport type StrctTooltipPosition = 'top' | 'bottom' | 'left' | 'right';\n\n/**\n * Lightweight hover/focus tooltip. Renders a fixed-positioned bubble so it is\n * never clipped by an ancestor's `overflow`.\n * <button strct-button strctTooltip=\"More info\">?</button>\n */\n@Directive({ selector: '[strctTooltip]' })\nexport class StrctTooltip {\n private readonly host = inject(ElementRef<HTMLElement>);\n private readonly renderer = inject(Renderer2);\n private readonly doc = inject(DOCUMENT);\n private bubble: HTMLElement | null = null;\n\n /** Tooltip text. */\n readonly strctTooltip = input.required<string>();\n /** Tooltip placement relative to the host. */\n readonly tooltipPosition = input<StrctTooltipPosition>('top');\n\n @HostListener('mouseenter')\n @HostListener('focus')\n protected show(): void {\n const text = this.strctTooltip();\n if (!text || this.bubble) return;\n\n const el = this.renderer.createElement('span') as HTMLElement;\n this.renderer.appendChild(el, this.renderer.createText(text));\n const s = el.style;\n s.position = 'fixed';\n s.zIndex = '1300';\n s.pointerEvents = 'none';\n s.whiteSpace = 'nowrap';\n s.padding = '5px 8px';\n s.fontSize = '11px';\n s.fontWeight = '500';\n s.lineHeight = '1';\n s.color = 'var(--t1)';\n s.background = 'var(--bg-0)';\n s.border = '1px solid var(--b3)';\n s.borderRadius = '5px';\n s.boxShadow = 'var(--shh)';\n s.top = '0';\n s.left = '0';\n s.visibility = 'hidden';\n\n // Append to <body> so the fixed bubble can't be trapped by a transformed\n // ancestor's containing block (e.g. a translated speed-dial / animation).\n this.renderer.appendChild(this.doc.body, el);\n this.bubble = el;\n this.place(el);\n }\n\n @HostListener('mouseleave')\n @HostListener('blur')\n protected hide(): void {\n if (this.bubble) {\n this.renderer.removeChild(this.doc.body, this.bubble);\n this.bubble = null;\n }\n }\n\n private place(el: HTMLElement): void {\n const a = this.host.nativeElement.getBoundingClientRect();\n const w = el.offsetWidth;\n const h = el.offsetHeight;\n const gap = 7;\n let top: number;\n let left: number;\n\n switch (this.tooltipPosition()) {\n case 'bottom':\n top = a.bottom + gap;\n left = a.left + a.width / 2 - w / 2;\n break;\n case 'left':\n left = a.left - gap - w;\n top = a.top + a.height / 2 - h / 2;\n break;\n case 'right':\n left = a.right + gap;\n top = a.top + a.height / 2 - h / 2;\n break;\n default:\n top = a.top - gap - h;\n left = a.left + a.width / 2 - w / 2;\n }\n\n const m = 4;\n left = Math.max(m, Math.min(left, window.innerWidth - w - m));\n top = Math.max(m, Math.min(top, window.innerHeight - h - m));\n el.style.left = `${Math.round(left)}px`;\n el.style.top = `${Math.round(top)}px`;\n el.style.visibility = 'visible';\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n ElementRef,\n HostListener,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { StrctOverlay, StrctOverlayPlacement } from '../overlay/overlay';\n\n/** Signpost popover placement. */\nexport type StrctSignpostPosition = 'top' | 'bottom' | 'left' | 'right';\n\n/**\n * A click-triggered popover with an arrow, for contextual help / detail.\n * <strct-signpost position=\"right\">\n * <button strct-button size=\"sm\" strctSignpostTrigger>?</button>\n * <h4>Title</h4>\n * <p>Any projected content…</p>\n * </strct-signpost>\n */\n@Component({\n selector: 'strct-signpost',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctOverlay],\n template: `\n <div\n #trigger\n class=\"strct-sp__trigger\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"toggle()\"\n (keydown.enter)=\"toggle()\"\n (keydown.space)=\"toggle()\"\n >\n <ng-content select=\"[strctSignpostTrigger]\" />\n </div>\n @if (open()) {\n <div\n class=\"strct-sp__panel\"\n [class]=\"'strct-sp__panel--' + position()\"\n role=\"dialog\"\n [strctOverlay]=\"trigger\"\n [strctOverlayPlacement]=\"overlayPlacement()\"\n >\n <ng-content />\n </div>\n }\n `,\n host: { class: 'strct-sp' },\n styles: [\n `\n .strct-sp {\n position: relative;\n display: inline-block;\n }\n .strct-sp__trigger {\n display: inline-flex;\n }\n .strct-sp__panel {\n position: absolute;\n z-index: 300;\n width: max-content;\n max-width: 280px;\n padding: 12px 14px;\n font-size: 13px;\n color: var(--t1);\n background: var(--bg-1);\n border: 1px solid var(--b2);\n border-radius: 8px;\n box-shadow: var(--shh);\n animation: strct-sp-in 0.11s ease;\n }\n .strct-sp__panel h4 {\n margin: 0 0 6px;\n font-size: 13px;\n font-weight: 600;\n }\n .strct-sp__panel p {\n margin: 0;\n color: var(--t2);\n }\n .strct-sp__panel::before {\n content: '';\n position: absolute;\n width: 9px;\n height: 9px;\n background: var(--bg-1);\n border: 1px solid var(--b2);\n border-inline-end: 0;\n border-bottom: 0;\n }\n .strct-sp__panel--bottom {\n top: calc(100% + 9px);\n left: 0;\n }\n .strct-sp__panel--bottom::before {\n top: -5px;\n left: 16px;\n transform: rotate(45deg);\n }\n .strct-sp__panel--top {\n bottom: calc(100% + 9px);\n left: 0;\n }\n .strct-sp__panel--top::before {\n bottom: -5px;\n left: 16px;\n transform: rotate(225deg);\n }\n .strct-sp__panel--right {\n left: calc(100% + 9px);\n top: 0;\n }\n .strct-sp__panel--right::before {\n left: -5px;\n top: 14px;\n transform: rotate(-45deg);\n }\n .strct-sp__panel--left {\n right: calc(100% + 9px);\n top: 0;\n }\n .strct-sp__panel--left::before {\n right: -5px;\n top: 14px;\n transform: rotate(135deg);\n }\n @keyframes strct-sp-in {\n from {\n opacity: 0;\n transform: scale(0.97);\n }\n }\n `,\n ],\n})\nexport class StrctSignpost {\n private readonly host = inject(ElementRef<HTMLElement>);\n /** Popover placement relative to the trigger. */\n readonly position = input<StrctSignpostPosition>('bottom');\n readonly open = signal(false);\n\n toggle(): void {\n this.open.update((v) => !v);\n }\n close(): void {\n this.open.set(false);\n }\n\n protected overlayPlacement(): StrctOverlayPlacement {\n switch (this.position()) {\n case 'top':\n return 'top-start';\n case 'right':\n return 'right';\n case 'left':\n return 'left';\n default:\n return 'bottom-start';\n }\n }\n\n @HostListener('document:click', ['$event'])\n protected onDocClick(event: MouseEvent): void {\n if (this.open() && !this.host.nativeElement.contains(event.target as Node)) {\n this.close();\n }\n }\n\n @HostListener('document:keydown.escape')\n protected onEscape(): void {\n this.close();\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n Injectable,\n ViewEncapsulation,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { StrctIcon } from '../icon/icon';\n\n/** Toast visual types. */\nexport type StrctToastType = 'info' | 'success' | 'warning' | 'critical';\n\n/** A single toast notification. */\nexport interface StrctToast {\n id: number;\n type: StrctToastType;\n message: string;\n /** Auto-dismiss after this many ms; 0 keeps it until dismissed. */\n duration: number;\n}\n\n/** Options passed when creating a toast. */\nexport interface StrctToastOptions {\n type?: StrctToastType;\n duration?: number;\n}\n\n/**\n * Queues transient notifications. Render `<strct-toast-outlet />` once near the\n * app root, then call from anywhere:\n * inject(StrctToastService).success('Saved');\n */\n@Injectable({ providedIn: 'root' })\nexport class StrctToastService {\n private counter = 0;\n private readonly _toasts = signal<StrctToast[]>([]);\n readonly toasts = this._toasts.asReadonly();\n\n show(message: string, options: StrctToastOptions = {}): number {\n const id = ++this.counter;\n const duration = options.duration ?? 4000;\n this._toasts.update((list) => [\n ...list,\n { id, type: options.type ?? 'info', message, duration },\n ]);\n if (duration > 0) {\n setTimeout(() => this.dismiss(id), duration);\n }\n return id;\n }\n\n info(message: string, duration?: number) {\n return this.show(message, { type: 'info', duration });\n }\n success(message: string, duration?: number) {\n return this.show(message, { type: 'success', duration });\n }\n warning(message: string, duration?: number) {\n return this.show(message, { type: 'warning', duration });\n }\n critical(message: string, duration?: number) {\n return this.show(message, { type: 'critical', duration });\n }\n\n dismiss(id: number): void {\n this._toasts.update((list) => list.filter((t) => t.id !== id));\n }\n\n clear(): void {\n this._toasts.set([]);\n }\n}\n\nconst TOAST_ICON: Record<StrctToastType, string> = {\n info: 'info',\n success: 'success',\n warning: 'warning',\n critical: 'critical',\n};\n\n/** Renders the toast stack. Place once, typically just inside the app shell. */\n@Component({\n selector: 'strct-toast-outlet',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon],\n template: `\n <div class=\"strct-toasts\" role=\"region\" [attr.aria-label]=\"regionLabel()\" aria-live=\"polite\">\n @for (toast of service.toasts(); track toast.id) {\n <div\n class=\"strct-toast\"\n [class.strct-toast--success]=\"toast.type === 'success'\"\n [class.strct-toast--warning]=\"toast.type === 'warning'\"\n [class.strct-toast--critical]=\"toast.type === 'critical'\"\n >\n <strct-icon [name]=\"icon(toast.type)\" [size]=\"16\" />\n <span class=\"strct-toast__msg\">{{ toast.message }}</span>\n <button\n type=\"button\"\n class=\"strct-toast__close\"\n aria-label=\"Dismiss\"\n (click)=\"service.dismiss(toast.id)\"\n >\n <strct-icon name=\"close\" [size]=\"13\" />\n </button>\n </div>\n }\n </div>\n `,\n styles: [\n `\n .strct-toasts {\n position: fixed;\n top: var(--space-4);\n right: var(--space-4);\n z-index: 1200;\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n max-width: 360px;\n pointer-events: none;\n }\n .strct-toast {\n pointer-events: auto;\n display: flex;\n align-items: flex-start;\n gap: var(--space-2);\n padding: var(--space-3);\n font-size: 13px;\n color: var(--t1);\n background: var(--bg-1);\n border: 1px solid var(--b2);\n border-inline-start: 3px solid var(--acc);\n border-radius: var(--radius-lg);\n box-shadow: var(--shadow-floating);\n animation: strct-toast-in 0.16s ease;\n }\n .strct-toast strct-icon {\n color: var(--acc);\n margin-top: 1px;\n flex-shrink: 0;\n }\n .strct-toast__msg {\n flex: 1;\n }\n .strct-toast__close {\n flex-shrink: 0;\n display: inline-flex;\n padding: 2px;\n margin: -2px -2px 0 0;\n border: 0;\n background: transparent;\n color: var(--t3);\n cursor: pointer;\n border-radius: 4px;\n }\n .strct-toast__close:hover {\n color: var(--t1);\n background: var(--bg-3);\n }\n .strct-toast--success {\n border-inline-start-color: var(--success);\n }\n .strct-toast--success strct-icon {\n color: var(--success);\n }\n .strct-toast--warning {\n border-inline-start-color: var(--warning);\n }\n .strct-toast--warning strct-icon {\n color: var(--warning);\n }\n .strct-toast--critical {\n border-inline-start-color: var(--critical);\n }\n .strct-toast--critical strct-icon {\n color: var(--critical);\n }\n @keyframes strct-toast-in {\n from {\n opacity: 0;\n transform: translateX(16px);\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n .strct-toast {\n animation: none;\n }\n }\n `,\n ],\n})\nexport class StrctToastOutlet {\n /** Accessible name of the notifications region (localizable). */\n readonly regionLabel = input('Notifications');\n protected readonly service = inject(StrctToastService);\n protected icon(type: StrctToastType): string {\n return TOAST_ICON[type];\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n input,\n} from '@angular/core';\nimport { StrctIcon } from '../icon/icon';\n\n/** Preset zero/permission/error states with a sensible icon + tone. */\nexport type StrctEmptyVariant = 'empty' | 'denied' | 'error' | 'notfound';\n\nconst VARIANTS: Record<StrctEmptyVariant, { icon: string; tone: string }> = {\n empty: { icon: 'folder', tone: 'neutral' },\n denied: { icon: 'lock', tone: 'warning' },\n error: { icon: 'warning', tone: 'critical' },\n notfound: { icon: 'search', tone: 'neutral' },\n};\n\n/**\n * A centered empty / permission / error state — an icon, a title, an optional\n * description and a slot for call-to-action buttons. Project actions as children.\n *\n * <strct-empty-state variant=\"denied\" title=\"Insufficient privileges\"\n * description=\"You don't have access to this cluster.\">\n * <button strct-button variant=\"primary\">Request access</button>\n * </strct-empty-state>\n */\n@Component({\n selector: 'strct-empty-state',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [StrctIcon],\n template: `\n <span class=\"strct-empty__icon strct-empty__icon--{{ toneClass() }}\">\n <strct-icon [name]=\"resolvedIcon()\" [size]=\"26\" [strokeWidth]=\"1.4\" />\n </span>\n <h3 class=\"strct-empty__title\">{{ title() }}</h3>\n @if (description()) {\n <p class=\"strct-empty__desc\">{{ description() }}</p>\n }\n <div class=\"strct-empty__actions\"><ng-content /></div>\n `,\n host: { class: 'strct-empty' },\n styles: [\n `\n .strct-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n text-align: center;\n gap: 10px;\n padding: 40px 24px;\n }\n .strct-empty__icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 56px;\n height: 56px;\n border-radius: 14px;\n margin-bottom: 2px;\n }\n .strct-empty__icon--neutral {\n background: var(--bg-3);\n color: var(--t2);\n }\n .strct-empty__icon--warning {\n background: var(--warning-bg);\n color: var(--warning);\n }\n .strct-empty__icon--critical {\n background: var(--critical-bg);\n color: var(--critical);\n }\n .strct-empty__icon--accent {\n background: var(--acc-m);\n color: var(--acc);\n }\n .strct-empty__title {\n margin: 0;\n font-size: 15px;\n font-weight: 600;\n color: var(--t1);\n }\n .strct-empty__desc {\n margin: 0;\n max-width: 360px;\n font-size: 13px;\n line-height: 1.5;\n color: var(--t3);\n }\n .strct-empty__actions {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-top: 6px;\n }\n .strct-empty__actions:empty {\n display: none;\n }\n `,\n ],\n})\nexport class StrctEmptyState {\n /** Preset that supplies a default icon + tone. */\n readonly variant = input<StrctEmptyVariant>('empty');\n /** Override the preset icon. */\n readonly icon = input('');\n /** Override the preset tone (neutral / warning / critical / accent). */\n readonly tone = input<string>('');\n readonly title = input.required<string>();\n readonly description = input('');\n\n protected readonly resolvedIcon = computed(() => this.icon() || VARIANTS[this.variant()].icon);\n protected readonly toneClass = computed(() => this.tone() || VARIANTS[this.variant()].tone);\n}\n","/**\n * Public API surface of the strct UI library.\n */\n\n// Theme\nexport * from './lib/theme/theme.service';\nexport * from './lib/theme/theme-switcher';\n\n// Foundations\nexport * from './lib/status';\nexport * from './lib/icon/icon';\nexport * from './lib/overlay/overlay';\n\n// Layout\nexport * from './lib/layout/layout';\nexport * from './lib/layout/nav';\nexport * from './lib/layout/rail';\nexport * from './lib/layout/login';\n\n// Buttons & indicators\nexport * from './lib/button/button';\nexport * from './lib/badge/badge';\nexport * from './lib/tag/tag';\nexport * from './lib/avatar/avatar';\nexport * from './lib/progress/progress';\nexport * from './lib/spinner/spinner';\nexport * from './lib/skeleton/skeleton';\nexport * from './lib/speed-dial/speed-dial';\n\n// Surfaces & disclosure\nexport * from './lib/card/card';\nexport * from './lib/accordion/accordion';\nexport * from './lib/tabs/tabs';\nexport * from './lib/tree/tree';\nexport * from './lib/modal/modal';\nexport * from './lib/drawer/drawer';\nexport * from './lib/dropdown/dropdown';\nexport * from './lib/context-menu/context-menu';\nexport * from './lib/context-menu/submenu';\nexport * from './lib/context-menu/menu';\nexport * from './lib/wizard/wizard';\nexport * from './lib/divider/divider';\n\n// Navigation\nexport * from './lib/breadcrumb/breadcrumb';\nexport * from './lib/pagination/pagination';\nexport * from './lib/section-menu/section-menu';\nexport * from './lib/command-palette/command-palette';\nexport * from './lib/kbd/kbd';\n\n// Forms\nexport * from './lib/forms/field';\nexport * from './lib/forms/input';\nexport * from './lib/validation/validation';\nexport * from './lib/forms/checkbox';\nexport * from './lib/forms/toggle';\nexport * from './lib/forms/radio';\nexport * from './lib/segmented/segmented';\nexport * from './lib/forms/range';\nexport * from './lib/forms/password';\nexport * from './lib/forms/file';\nexport * from './lib/rating/rating';\nexport * from './lib/chips/chips';\nexport * from './lib/input-otp/input-otp';\nexport * from './lib/knob/knob';\nexport * from './lib/input-mask/input-mask';\nexport * from './lib/combobox/combobox';\nexport * from './lib/datepicker/datepicker';\nexport * from './lib/color-picker/color-picker';\nexport * from './lib/cascade-select/cascade-select';\n\n// Data\nexport * from './lib/description-list/description-list';\nexport * from './lib/table/table';\nexport * from './lib/datagrid/datagrid';\nexport * from './lib/timeline/timeline';\nexport * from './lib/stack/stack';\n\n// Charts\nexport * from './lib/charts/sparkline';\nexport * from './lib/charts/chart';\nexport * from './lib/charts/donut';\nexport * from './lib/charts/gauge';\nexport * from './lib/flow/flow';\nexport * from './lib/metric-tile/metric-tile';\n\n// Feedback\nexport * from './lib/hero/hero';\nexport * from './lib/alert/alert';\nexport * from './lib/tooltip/tooltip';\nexport * from './lib/signpost/signpost';\nexport * from './lib/toast/toast';\nexport * from './lib/empty-state/empty-state';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["DOCUMENT","COLOR","round"],"mappings":"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"}
|