@akcelik/strct 0.11.0 → 0.24.0

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.
@@ -1,6 +1,7 @@
1
1
  import * as _angular_core from '@angular/core';
2
2
  import { OnDestroy, TemplateRef } from '@angular/core';
3
3
  import { SafeHtml } from '@angular/platform-browser';
4
+ import * as _akcelik_strct from '@akcelik/strct';
4
5
  import { ControlValueAccessor } from '@angular/forms';
5
6
 
6
7
  /** Available color palettes. */
@@ -54,10 +55,40 @@ declare class StrctThemeSwitcher {
54
55
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctThemeSwitcher, "strct-theme-switcher", never, {}, {}, never, never, true, never>;
55
56
  }
56
57
 
58
+ /**
59
+ * Shared status / tone union used across the library's tone-colored components
60
+ * (badge, metric tile, hero, flow, segmented …). One canonical type so apps and
61
+ * components agree on the same five tones instead of each re-declaring them.
62
+ *
63
+ * `StrctProgress` / `StrctGauge` use the narrower `StrctChartStatus` (no
64
+ * `'neutral'`) since a bar/gauge is always tinted.
65
+ */
66
+ type StrctStatus = 'neutral' | 'accent' | 'success' | 'warning' | 'critical';
67
+ /**
68
+ * Optional value-driven thresholds for meters (`StrctProgress`, `StrctGauge`).
69
+ * When supplied, the component derives its own status from the value:
70
+ * `value >= critical → 'critical'`, `>= warning → 'warning'`, otherwise the
71
+ * healthy base ('success' by default).
72
+ */
73
+ interface StrctThresholds {
74
+ warning?: number;
75
+ critical?: number;
76
+ }
77
+
57
78
  /**
58
79
  * Inner markup (path/shape contents) for each icon, drawn on a 0 0 16 16
59
80
  * viewBox with `currentColor` stroke. Keep strokes at 1.3–1.5 for crispness.
60
81
  *
82
+ * RENDER SIZES ("16 Native" policy): object / semantic glyphs must render at the
83
+ * grid's native 16px or larger — never downscaled (fractional scaling blurs
84
+ * hairlines). Simple single-stroke glyphs (chevrons, close, check, dots) may
85
+ * render at 11–14px; their wide details survive scaling.
86
+ *
87
+ * DETAIL BUDGET (small-size legibility): icons render as small as 14px, so keep
88
+ * gaps between parallel details ≥ 1.5px on the 16-grid (≈ max 3 parallel lines),
89
+ * prefer one large distinguishing feature over many small ones, and cap a glyph
90
+ * at ~6 drawing elements. Filled dots should be r ≥ 0.55.
91
+ *
61
92
  * The set is intentionally datacenter-flavoured (hosts, clusters, switches,
62
93
  * storage, VMs …). Object state — running / stopped / maintenance — is layered
63
94
  * on with the `badge` input rather than a separate icon per state.
@@ -346,11 +377,23 @@ type StrctProgressStatus = 'accent' | 'success' | 'warning' | 'critical';
346
377
  declare class StrctProgress {
347
378
  /** Current value. */
348
379
  readonly value: _angular_core.InputSignal<number>;
380
+ /** Accessible name of the bar (e.g. "CPU usage"). Falls back to "Progress". */
381
+ readonly label: _angular_core.InputSignal<string>;
349
382
  /** Visual status color. */
350
383
  readonly status: _angular_core.InputSignal<StrctProgressStatus>;
384
+ /**
385
+ * Optional value-driven thresholds. When set, the component picks its own
386
+ * status from the value instead of the caller computing it: `value >= critical`
387
+ * → critical, `>= warning` → warning, else the healthy base. The healthy base is
388
+ * `status` when it has been set to a semantic tone, or `'success'` when `status`
389
+ * is left at its default `'accent'`.
390
+ */
391
+ readonly thresholds: _angular_core.InputSignal<StrctThresholds | null>;
351
392
  protected readonly clamped: _angular_core.Signal<number>;
393
+ /** Status after applying thresholds (falls back to `status` when none set). */
394
+ protected readonly resolvedStatus: _angular_core.Signal<StrctProgressStatus>;
352
395
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctProgress, never>;
353
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctProgress, "strct-progress", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "status": { "alias": "status"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
396
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctProgress, "strct-progress", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "status": { "alias": "status"; "required": false; "isSignal": true; }; "thresholds": { "alias": "thresholds"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
354
397
  }
355
398
 
356
399
  /** Spinner size variants. */
@@ -359,8 +402,10 @@ type StrctSpinnerSize = 'sm' | 'md' | 'lg';
359
402
  declare class StrctSpinner {
360
403
  /** Size variant. */
361
404
  readonly size: _angular_core.InputSignal<StrctSpinnerSize>;
405
+ /** Accessible label (localizable). */
406
+ readonly label: _angular_core.InputSignal<string>;
362
407
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctSpinner, never>;
363
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctSpinner, "strct-spinner", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
408
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctSpinner, "strct-spinner", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
364
409
  }
365
410
 
366
411
  /**
@@ -405,20 +450,51 @@ declare class StrctSpeedDial {
405
450
 
406
451
  /**
407
452
  * Surface container. Compose with the header / block / footer pieces:
408
- * <strct-card>
409
- * <strct-card-header>Title</strct-card-header>
410
- * <strct-card-block>...</strct-card-block>
453
+ *
454
+ * <strct-card status="warning" collapsible [(collapsed)]="hidden">
455
+ * <strct-card-header icon="host">Host hv-02</strct-card-header>
456
+ * <strct-card-block>…</strct-card-block>
411
457
  * <strct-card-footer><button strct-button>OK</button></strct-card-footer>
412
458
  * </strct-card>
459
+ *
460
+ * Rich options (all opt-in; defaults preserve the plain card):
461
+ * - `status` — tone rail on the leading edge (same language as alert / hero).
462
+ * - `interactive` — hover lift + accent border for clickable cards.
463
+ * - `selected` — accent ring for picker layouts.
464
+ * - `dense` — tighter paddings for dashboards.
465
+ * - `loading` — indeterminate top bar + `aria-busy` (reduced-motion safe).
466
+ * - `collapsible` + two-way `collapsed` — the header gains a chevron toggle;
467
+ * block and footer hide while collapsed.
413
468
  */
414
469
  declare class StrctCard {
470
+ /** Tone rail on the leading edge. */
471
+ readonly status: _angular_core.InputSignal<StrctStatus>;
472
+ /** Hover lift + accent border for clickable cards (style-only affordance). */
473
+ readonly interactive: _angular_core.InputSignalWithTransform<boolean, unknown>;
474
+ /** Accent ring — for picker / multi-select card layouts. */
475
+ readonly selected: _angular_core.InputSignalWithTransform<boolean, unknown>;
476
+ /** Tighter paddings for dense dashboards. */
477
+ readonly dense: _angular_core.InputSignalWithTransform<boolean, unknown>;
478
+ /** Indeterminate top bar + aria-busy; body/footer dim and ignore input. */
479
+ readonly loading: _angular_core.InputSignalWithTransform<boolean, unknown>;
480
+ /** Allow collapsing to just the header (a chevron appears in the header). */
481
+ readonly collapsible: _angular_core.InputSignalWithTransform<boolean, unknown>;
482
+ /** Collapsed state (two-way; only meaningful with `collapsible`). */
483
+ readonly collapsed: _angular_core.ModelSignal<boolean>;
484
+ toggle(): void;
415
485
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctCard, never>;
416
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctCard, "strct-card", never, {}, {}, never, ["*"], true, never>;
486
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctCard, "strct-card", never, { "status": { "alias": "status"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "dense": { "alias": "dense"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "collapsible": { "alias": "collapsible"; "required": false; "isSignal": true; }; "collapsed": { "alias": "collapsed"; "required": false; "isSignal": true; }; }, { "collapsed": "collapsedChange"; }, never, ["*"], true, never>;
417
487
  }
418
488
  /** Header section of a {@link StrctCard}. */
419
489
  declare class StrctCardHeader {
490
+ /** Optional leading icon (StrctIcon set). */
491
+ readonly icon: _angular_core.InputSignal<string>;
492
+ /** Accessible labels for the collapse toggle (localizable). */
493
+ readonly collapseLabel: _angular_core.InputSignal<string>;
494
+ readonly expandLabel: _angular_core.InputSignal<string>;
495
+ protected readonly card: StrctCard | null;
420
496
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctCardHeader, never>;
421
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctCardHeader, "strct-card-header", never, {}, {}, never, ["*"], true, never>;
497
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctCardHeader, "strct-card-header", never, { "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "collapseLabel": { "alias": "collapseLabel"; "required": false; "isSignal": true; }; "expandLabel": { "alias": "expandLabel"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
422
498
  }
423
499
  /** Body section of a {@link StrctCard}. */
424
500
  declare class StrctCardBlock {
@@ -463,12 +539,12 @@ declare class StrctTab {
463
539
  /** Tab group. Wraps `<strct-tab>` children and renders the tab bar. */
464
540
  declare class StrctTabs {
465
541
  readonly tabs: _angular_core.Signal<readonly StrctTab[]>;
466
- readonly selectedIndex: _angular_core.WritableSignal<number>;
542
+ readonly selectedIndex: _angular_core.ModelSignal<number>;
467
543
  constructor();
468
544
  select(index: number): void;
469
545
  onKeydown(event: KeyboardEvent, bar: HTMLElement): void;
470
546
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctTabs, never>;
471
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctTabs, "strct-tabs", never, {}, {}, ["tabs"], ["*"], true, never>;
547
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctTabs, "strct-tabs", never, { "selectedIndex": { "alias": "selectedIndex"; "required": false; "isSignal": true; }; }, { "selectedIndex": "selectedIndexChange"; }, ["tabs"], ["*"], true, never>;
472
548
  }
473
549
 
474
550
  /** A single entry in a data-driven menu. */
@@ -581,6 +657,12 @@ declare class StrctContextMenuTrigger {
581
657
 
582
658
  /** A node in the data-driven tree (`<strct-tree [nodes]="...">`). */
583
659
  interface StrctTreeNodeData {
660
+ /**
661
+ * Stable unique key — used for `trackBy`, controlled expansion state
662
+ * (`expandedIds`) and a `data-node-id` DOM attribute. Falls back to `label`
663
+ * when absent (backward-compatible).
664
+ */
665
+ id?: string;
584
666
  label: string;
585
667
  /** Optional leading icon name. */
586
668
  icon?: string;
@@ -634,15 +716,31 @@ declare class StrctTreeNode {
634
716
  readonly nodeMenuSelect: _angular_core.OutputEmitterRef<StrctTreeMenuEvent>;
635
717
  /** Right-click menu items for this node ([] when no resolver / not data mode). */
636
718
  protected readonly menuItems: _angular_core.Signal<StrctMenuItem[]>;
719
+ /** The owning `<strct-tree>` (null only for standalone nodes outside a tree). */
720
+ protected readonly tree: StrctTree | null;
721
+ /** Node icon scales with the owning tree's density (16 native → 18 comfortable). */
722
+ protected readonly iconSize: _angular_core.Signal<16 | 18>;
723
+ /** Parent tree node (element-injector ancestor); drives aria-level + ArrowLeft. */
724
+ readonly parent: StrctTreeNode | null;
725
+ /** 1-based depth, exposed as aria-level. */
726
+ readonly level: number;
727
+ private readonly hostEl;
637
728
  private readonly childNodes;
638
- /** Data-mode expansion (seeded from node.expanded on first toggle). */
729
+ /** Data-mode expansion fallback when there is no owning tree (seeded from node.expanded). */
639
730
  private readonly dataExpanded;
640
731
  protected readonly displayLabel: _angular_core.Signal<string>;
641
732
  protected readonly displayIcon: _angular_core.Signal<string | undefined>;
642
733
  protected readonly displayBadge: _angular_core.Signal<StrctIconBadge>;
643
734
  protected readonly displayActive: _angular_core.Signal<boolean>;
644
- protected readonly hasChildren: _angular_core.Signal<boolean>;
645
- protected readonly isOpen: _angular_core.Signal<boolean>;
735
+ constructor();
736
+ /** The focusable row element of this node. */
737
+ rowEl(): HTMLElement | null;
738
+ /** Roving tabindex: inside a tree only the active row is tabbable. */
739
+ protected readonly rowTabindex: _angular_core.Signal<0 | -1>;
740
+ protected onRowFocus(): void;
741
+ protected onRowKeydown(event: KeyboardEvent): void;
742
+ readonly hasChildren: _angular_core.Signal<boolean>;
743
+ readonly isOpen: _angular_core.Signal<boolean>;
646
744
  toggle(): void;
647
745
  protected onActivate(): void;
648
746
  protected onMenuSelect(item: StrctMenuItem): void;
@@ -657,14 +755,59 @@ declare class StrctTreeNode {
657
755
  declare class StrctTree {
658
756
  /** Data-driven node list; when set, projected content is ignored. */
659
757
  readonly nodes: _angular_core.InputSignal<StrctTreeNodeData[] | null>;
758
+ /**
759
+ * Row density. `compact` (default) is the dense inventory layout —
760
+ * 13px text / 16px icons; `comfortable` relaxes to 14px text / 18px icons
761
+ * with taller rows for touch-friendly or low-density consoles.
762
+ */
763
+ readonly density: _angular_core.InputSignal<"compact" | "comfortable">;
660
764
  /** Per-node right-click menu resolver. */
661
765
  readonly nodeMenu: _angular_core.InputSignal<StrctTreeNodeMenuFn | null>;
662
766
  /** Emitted when any data-driven node is clicked. */
663
767
  readonly nodeActivated: _angular_core.OutputEmitterRef<StrctTreeNodeData>;
664
768
  /** Emitted when a data-driven node's right-click menu item is chosen. */
665
769
  readonly nodeMenuSelect: _angular_core.OutputEmitterRef<StrctTreeMenuEvent>;
770
+ /**
771
+ * Controlled expansion (two-way). When non-null it is the single source of
772
+ * truth: node open state derives from it and toggles write back through it, so
773
+ * persisting/restoring is `<strct-tree [(expandedIds)]="ids" />`. When null
774
+ * (default), expansion is uncontrolled — seeded from each node's `expanded`
775
+ * flag and owned internally (backward-compatible).
776
+ */
777
+ readonly expandedIds: _angular_core.ModelSignal<string[] | null>;
778
+ /** The full set of expanded ids, emitted on every expand / collapse. */
779
+ readonly expandedChange: _angular_core.OutputEmitterRef<string[]>;
780
+ /** Emitted per toggle with the node and its new state. */
781
+ readonly nodeToggled: _angular_core.OutputEmitterRef<{
782
+ node: StrctTreeNodeData;
783
+ expanded: boolean;
784
+ }>;
785
+ /** Stable key for a node: its `id`, or the `label` as a fallback. */
786
+ private readonly keyOf;
787
+ /** Explicit user toggles layered on top of the `node.expanded` seed (uncontrolled). */
788
+ private readonly overrides;
789
+ /** Keys expanded by their `node.expanded` seed (pure — no flash on first render). */
790
+ private readonly seededSet;
791
+ /** The active expanded-key set — controlled `expandedIds`, or seed + overrides. */
792
+ private readonly currentSet;
793
+ /** Whether a node is currently expanded (called by its `StrctTreeNode`). */
794
+ isNodeOpen(node: StrctTreeNodeData): boolean;
795
+ private readonly registeredNodes;
796
+ private readonly activeRoving;
797
+ registerNode(node: StrctTreeNode): void;
798
+ unregisterNode(node: StrctTreeNode): void;
799
+ /** Visible nodes in document order (collapsed subtrees are never registered). */
800
+ private ordered;
801
+ /** Whether this node currently holds the roving tabindex (0). */
802
+ isRovingActive(node: StrctTreeNode): boolean;
803
+ setActive(node: StrctTreeNode): void;
804
+ private focusNode;
805
+ /** Keyboard navigation between visible rows (called from the focused node). */
806
+ navigate(node: StrctTreeNode, key: string): void;
807
+ /** Toggle a node's expansion, updating state and emitting outputs. */
808
+ toggleNode(node: StrctTreeNodeData): void;
666
809
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctTree, never>;
667
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctTree, "strct-tree", never, { "nodes": { "alias": "nodes"; "required": false; "isSignal": true; }; "nodeMenu": { "alias": "nodeMenu"; "required": false; "isSignal": true; }; }, { "nodeActivated": "nodeActivated"; "nodeMenuSelect": "nodeMenuSelect"; }, never, ["*"], true, never>;
810
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctTree, "strct-tree", never, { "nodes": { "alias": "nodes"; "required": false; "isSignal": true; }; "density": { "alias": "density"; "required": false; "isSignal": true; }; "nodeMenu": { "alias": "nodeMenu"; "required": false; "isSignal": true; }; "expandedIds": { "alias": "expandedIds"; "required": false; "isSignal": true; }; }, { "nodeActivated": "nodeActivated"; "nodeMenuSelect": "nodeMenuSelect"; "expandedIds": "expandedIdsChange"; "expandedChange": "expandedChange"; "nodeToggled": "nodeToggled"; }, never, ["*"], true, never>;
668
811
  }
669
812
 
670
813
  /** Fixed modal width presets: sm 480 · md 640 · lg 860 · xl 1080 (px). */
@@ -689,6 +832,8 @@ declare class StrctModal {
689
832
  readonly size: _angular_core.InputSignal<StrctModalSize>;
690
833
  /** Hide the footer slot. */
691
834
  readonly hideFooter: _angular_core.InputSignalWithTransform<boolean, unknown>;
835
+ /** Accessible label of the X close button (localizable). */
836
+ readonly closeLabel: _angular_core.InputSignal<string>;
692
837
  /**
693
838
  * Allow closing via a backdrop click / the Escape key. **Off by default** —
694
839
  * a modal closes only through its X button or an explicit action button, so a
@@ -705,7 +850,7 @@ declare class StrctModal {
705
850
  private locked;
706
851
  constructor();
707
852
  close(): void;
708
- protected onBackdrop(): void;
853
+ protected onBackdrop(event?: Event): void;
709
854
  protected onEscape(): void;
710
855
  /** Wrap Tab focus within the dialog. */
711
856
  protected onTab(event: Event): void;
@@ -713,7 +858,7 @@ declare class StrctModal {
713
858
  private focusable;
714
859
  private focusInitial;
715
860
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctModal, never>;
716
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctModal, "strct-modal", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "hideFooter": { "alias": "hideFooter"; "required": false; "isSignal": true; }; "dismissible": { "alias": "dismissible"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "closed": "closed"; }, never, ["*", "[strctModalFooter]"], true, never>;
861
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctModal, "strct-modal", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "hideFooter": { "alias": "hideFooter"; "required": false; "isSignal": true; }; "closeLabel": { "alias": "closeLabel"; "required": false; "isSignal": true; }; "dismissible": { "alias": "dismissible"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "closed": "closed"; }, never, ["*", "[strctModalFooter]"], true, never>;
717
862
  }
718
863
 
719
864
  /** Marks the drawer's footer action area: `<ng-container strctDrawerFooter>…`. */
@@ -858,9 +1003,12 @@ declare class StrctStep {
858
1003
  /** Multi-step flow with a numbered header and Back / Next / Finish controls. */
859
1004
  declare class StrctWizard {
860
1005
  readonly steps: _angular_core.Signal<readonly StrctStep[]>;
861
- readonly current: _angular_core.WritableSignal<number>;
1006
+ readonly current: _angular_core.ModelSignal<number>;
862
1007
  /** Label for the final-step button (default "Finish"). */
863
1008
  readonly finishLabel: _angular_core.InputSignal<string>;
1009
+ /** Labels for the Back / Next buttons (localizable). */
1010
+ readonly backLabel: _angular_core.InputSignal<string>;
1011
+ readonly nextLabel: _angular_core.InputSignal<string>;
864
1012
  /** Disable Finish and show a busy label while an async submit is in flight. */
865
1013
  readonly submitting: _angular_core.InputSignalWithTransform<boolean, unknown>;
866
1014
  /** Show a Cancel button on the left. */
@@ -879,7 +1027,7 @@ declare class StrctWizard {
879
1027
  back(): void;
880
1028
  finish(): void;
881
1029
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctWizard, never>;
882
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctWizard, "strct-wizard", never, { "finishLabel": { "alias": "finishLabel"; "required": false; "isSignal": true; }; "submitting": { "alias": "submitting"; "required": false; "isSignal": true; }; "cancelable": { "alias": "cancelable"; "required": false; "isSignal": true; }; }, { "finished": "finished"; "cancelled": "cancelled"; "stepChange": "stepChange"; }, ["steps"], ["*"], true, never>;
1030
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctWizard, "strct-wizard", never, { "current": { "alias": "current"; "required": false; "isSignal": true; }; "finishLabel": { "alias": "finishLabel"; "required": false; "isSignal": true; }; "backLabel": { "alias": "backLabel"; "required": false; "isSignal": true; }; "nextLabel": { "alias": "nextLabel"; "required": false; "isSignal": true; }; "submitting": { "alias": "submitting"; "required": false; "isSignal": true; }; "cancelable": { "alias": "cancelable"; "required": false; "isSignal": true; }; }, { "current": "currentChange"; "finished": "finished"; "cancelled": "cancelled"; "stepChange": "stepChange"; }, ["steps"], ["*"], true, never>;
883
1031
  }
884
1032
 
885
1033
  /**
@@ -914,6 +1062,10 @@ type PageToken = number | 'dots';
914
1062
  * <strct-pagination [total]="240" [pageSize]="20" [(page)]="page" />
915
1063
  */
916
1064
  declare class StrctPagination {
1065
+ /** Accessible labels (localizable). */
1066
+ readonly prevLabel: _angular_core.InputSignal<string>;
1067
+ readonly nextLabel: _angular_core.InputSignal<string>;
1068
+ readonly regionLabel: _angular_core.InputSignal<string>;
917
1069
  /** Total number of items. */
918
1070
  readonly total: _angular_core.InputSignal<number>;
919
1071
  /** Rows per page (0 disables paging). */
@@ -924,7 +1076,7 @@ declare class StrctPagination {
924
1076
  protected readonly pages: _angular_core.Signal<PageToken[]>;
925
1077
  go(target: number): void;
926
1078
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctPagination, never>;
927
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctPagination, "strct-pagination", never, { "total": { "alias": "total"; "required": true; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "page": { "alias": "page"; "required": false; "isSignal": true; }; }, { "page": "pageChange"; }, never, never, true, never>;
1079
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctPagination, "strct-pagination", never, { "prevLabel": { "alias": "prevLabel"; "required": false; "isSignal": true; }; "nextLabel": { "alias": "nextLabel"; "required": false; "isSignal": true; }; "regionLabel": { "alias": "regionLabel"; "required": false; "isSignal": true; }; "total": { "alias": "total"; "required": true; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "page": { "alias": "page"; "required": false; "isSignal": true; }; }, { "page": "pageChange"; }, never, never, true, never>;
928
1080
  }
929
1081
 
930
1082
  /** A leaf entry under a {@link StrctMenuSection}. */
@@ -976,6 +1128,113 @@ declare class StrctSectionMenu {
976
1128
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctSectionMenu, "strct-section-menu", never, { "sections": { "alias": "sections"; "required": true; "isSignal": true; }; "activeId": { "alias": "activeId"; "required": false; "isSignal": true; }; "collapsible": { "alias": "collapsible"; "required": false; "isSignal": true; }; "showIcons": { "alias": "showIcons"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "activeId": "activeIdChange"; "select": "select"; }, never, never, true, never>;
977
1129
  }
978
1130
 
1131
+ /** One searchable command in the palette. */
1132
+ interface StrctCommandItem {
1133
+ /** Stable key; returned with (picked). */
1134
+ id: string;
1135
+ label: string;
1136
+ /** Right-aligned group tag (e.g. a category or section name). */
1137
+ group?: string;
1138
+ /** Leading icon name (StrctIcon set). */
1139
+ icon?: string;
1140
+ /** Right-aligned shortcut hint, rendered as a key chip. */
1141
+ hint?: string;
1142
+ /** Extra search terms beyond label/group. */
1143
+ keywords?: string[];
1144
+ /** Arbitrary payload carried back with (picked). */
1145
+ data?: unknown;
1146
+ }
1147
+ /**
1148
+ * ⌘/Ctrl-K command palette — a spotlight search over app commands or pages.
1149
+ * Mount once near the app root, feed it `items`, and act on `(picked)`:
1150
+ *
1151
+ * <strct-command-palette [items]="commands" [(open)]="paletteOpen"
1152
+ * (picked)="run($event)" />
1153
+ *
1154
+ * Opens via the two-way `open` model or the built-in ⌘/Ctrl-K hotkey
1155
+ * (`hotkey` input). Implements the ARIA combobox/listbox pattern: arrow keys
1156
+ * move the active option, Enter picks, Escape closes; focus returns to the
1157
+ * previously focused element on close.
1158
+ */
1159
+ declare class StrctCommandPalette {
1160
+ private readonly doc;
1161
+ private readonly inputRef;
1162
+ /** Searchable commands. */
1163
+ readonly items: _angular_core.InputSignal<StrctCommandItem[]>;
1164
+ /** Whether the palette is open (two-way). */
1165
+ readonly open: _angular_core.ModelSignal<boolean>;
1166
+ /** Enable the built-in ⌘/Ctrl-K toggle. */
1167
+ readonly hotkey: _angular_core.InputSignalWithTransform<boolean, unknown>;
1168
+ /** Search input placeholder / dialog name (localizable). */
1169
+ readonly placeholder: _angular_core.InputSignal<string>;
1170
+ /** Empty-result message prefix (localizable). */
1171
+ readonly emptyText: _angular_core.InputSignal<string>;
1172
+ /** Maximum rendered results. */
1173
+ readonly maxResults: _angular_core.InputSignal<number>;
1174
+ /** Emitted when a command is chosen (Enter or click); the palette closes. */
1175
+ readonly picked: _angular_core.OutputEmitterRef<StrctCommandItem>;
1176
+ protected readonly query: _angular_core.WritableSignal<string>;
1177
+ protected readonly activeIndex: _angular_core.WritableSignal<number>;
1178
+ protected readonly listId: string;
1179
+ private previousActive;
1180
+ protected optionId(i: number): string;
1181
+ /** Rank: label prefix > word-start > substring; group/keyword matches last. */
1182
+ protected readonly filtered: _angular_core.Signal<StrctCommandItem[]>;
1183
+ constructor();
1184
+ /** ⌘/Ctrl-K toggle + global Escape while open. */
1185
+ protected onGlobalKey(event: KeyboardEvent): void;
1186
+ protected onType(event: Event): void;
1187
+ protected onKey(event: KeyboardEvent): void;
1188
+ private move;
1189
+ protected pick(item: StrctCommandItem): void;
1190
+ protected close(): void;
1191
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctCommandPalette, never>;
1192
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctCommandPalette, "strct-command-palette", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; "hotkey": { "alias": "hotkey"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "emptyText": { "alias": "emptyText"; "required": false; "isSignal": true; }; "maxResults": { "alias": "maxResults"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "picked": "picked"; }, never, never, true, never>;
1193
+ }
1194
+
1195
+ /**
1196
+ * Inline keyboard-key chip: `<strct-kbd>⌘K</strct-kbd>`. Used for shortcut hints
1197
+ * in menus, tooltips and the command palette.
1198
+ */
1199
+ declare class StrctKbd {
1200
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctKbd, never>;
1201
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctKbd, "strct-kbd", never, {}, {}, never, ["*"], true, never>;
1202
+ }
1203
+
1204
+ /** Lifecycle of an async (or deferred) validation check. */
1205
+ type StrctValidationStatus = 'idle' | 'checking' | 'ok' | 'warning' | 'error';
1206
+ /**
1207
+ * A first-class "validating… → ok / warning / error (reason)" model, so apps stop
1208
+ * composing a spinner + badge by hand (e.g. live reachability checks while typing).
1209
+ * Consumed by `StrctField`'s `validationState` input and the `[strctCellStatus]`
1210
+ * datagrid-cell helper.
1211
+ */
1212
+ interface StrctValidationState {
1213
+ status: StrctValidationStatus;
1214
+ /** Optional human-readable reason, shown beside the affordance / in the hint slot. */
1215
+ message?: string;
1216
+ }
1217
+ /** Tone class suffix per validation status (used by field + cell helper styles). */
1218
+ declare function strctValidationTone(status: StrctValidationStatus): string;
1219
+ /** Leading icon name per (non-checking) validation status; '' for idle/checking. */
1220
+ declare function strctValidationIcon(status: StrctValidationStatus): string;
1221
+ /**
1222
+ * Renders the shared "checking / ok / warning / error (reason)" affordance from a
1223
+ * small `StrctValidationState` model — a spinner while checking, then an icon and
1224
+ * an optional message. Drop it into a `StrctDatagrid` cell template for
1225
+ * list-building flows, as an element or an attribute:
1226
+ *
1227
+ * <strct-cell-status [state]="probe(row)" />
1228
+ * <span strct-cell-status [state]="probe(row)"></span>
1229
+ */
1230
+ declare class StrctCellStatus {
1231
+ /** The validation state to render. */
1232
+ readonly state: _angular_core.InputSignal<StrctValidationState>;
1233
+ protected readonly icon: _angular_core.Signal<string>;
1234
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctCellStatus, never>;
1235
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctCellStatus, "strct-cell-status, [strct-cell-status]", never, { "state": { "alias": "state"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
1236
+ }
1237
+
979
1238
  /**
980
1239
  * Form-field wrapper: a label (with optional required marker), the projected
981
1240
  * control, and a hint or error message. It auto-links the control via
@@ -994,18 +1253,33 @@ declare class StrctField {
994
1253
  readonly hint: _angular_core.InputSignal<string>;
995
1254
  /** Error message (string or first-of array); falsy clears the error state. */
996
1255
  readonly error: _angular_core.InputSignal<string | string[] | null | undefined>;
1256
+ /**
1257
+ * Async-validation state rendered as a trailing adornment (spinner / check /
1258
+ * warning) plus its message in the hint/error slot — so apps stop composing a
1259
+ * spinner + badge by hand for live "checking… → ok / warning / error" checks.
1260
+ */
1261
+ readonly validationState: _angular_core.InputSignal<StrctValidationState | null>;
997
1262
  private readonly host;
998
1263
  private readonly n;
999
1264
  protected readonly hintId: string;
1000
1265
  protected readonly errorId: string;
1001
1266
  protected readonly controlId: _angular_core.WritableSignal<string>;
1002
1267
  protected readonly errorText: _angular_core.Signal<string>;
1268
+ /** Effective validation status ('idle' when no state supplied). */
1269
+ protected readonly stateStatus: _angular_core.Signal<_akcelik_strct.StrctValidationStatus>;
1270
+ /** Whether to show the trailing adornment (an explicit error suppresses it). */
1271
+ protected readonly stateActive: _angular_core.Signal<boolean>;
1272
+ protected readonly stateIcon: _angular_core.Signal<string>;
1273
+ /** Validation message, shown only when there is no explicit error. */
1274
+ protected readonly stateMessage: _angular_core.Signal<string>;
1275
+ /** Invalid when an explicit error is set or the validation state is 'error'. */
1276
+ protected readonly isInvalid: _angular_core.Signal<boolean>;
1003
1277
  constructor();
1004
1278
  private control;
1005
1279
  private link;
1006
1280
  private applyAria;
1007
1281
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctField, never>;
1008
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctField, "strct-field", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
1282
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctField, "strct-field", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "validationState": { "alias": "validationState"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
1009
1283
  }
1010
1284
 
1011
1285
  /**
@@ -1092,6 +1366,56 @@ declare class StrctRadio {
1092
1366
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctRadio, "strct-radio", never, { "value": { "alias": "value"; "required": true; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
1093
1367
  }
1094
1368
 
1369
+ /** One segment of a `StrctSegmented`. */
1370
+ interface StrctSegmentedOption {
1371
+ value: unknown;
1372
+ label: string;
1373
+ /** Optional leading icon name (StrctIcon set). */
1374
+ icon?: string;
1375
+ /** Disable just this segment. */
1376
+ disabled?: boolean;
1377
+ }
1378
+ /** Segment size. */
1379
+ type StrctSegmentedSize = 'sm' | 'md';
1380
+ /**
1381
+ * One-of-N selection rendered as a joined segmented control with managed
1382
+ * selected state — distinct from `StrctTabs` (panel switching) and
1383
+ * `StrctButtonGroup` (a visual cluster only). For mode pickers and list filters.
1384
+ * CVA-compatible, so `formControlName` and `[(ngModel)]` both work.
1385
+ *
1386
+ * <strct-segmented
1387
+ * [options]="[{ value: 'all', label: 'All' }, { value: 'active', label: 'Active' }]"
1388
+ * [(ngModel)]="filter" size="sm" />
1389
+ */
1390
+ declare class StrctSegmented implements ControlValueAccessor {
1391
+ /** The selectable segments. */
1392
+ readonly options: _angular_core.InputSignal<StrctSegmentedOption[]>;
1393
+ /** Segment size. */
1394
+ readonly size: _angular_core.InputSignal<StrctSegmentedSize>;
1395
+ /** Stretch to the full width of the container. */
1396
+ readonly block: _angular_core.InputSignalWithTransform<boolean, unknown>;
1397
+ /** Static disable; forms' setDisabledState also drives the disabled state. */
1398
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
1399
+ readonly value: _angular_core.WritableSignal<unknown>;
1400
+ readonly isDisabled: _angular_core.WritableSignal<boolean>;
1401
+ private readonly segs;
1402
+ private onChange;
1403
+ protected onTouched: () => void;
1404
+ constructor();
1405
+ protected isSelected(opt: StrctSegmentedOption): boolean;
1406
+ /** Index of the currently selected (or first enabled) option for roving focus. */
1407
+ private readonly activeIndex;
1408
+ protected rovingIndex(opt: StrctSegmentedOption, i: number): number;
1409
+ protected select(opt: StrctSegmentedOption): void;
1410
+ protected onKeydown(event: KeyboardEvent): void;
1411
+ writeValue(value: unknown): void;
1412
+ registerOnChange(fn: (value: unknown) => void): void;
1413
+ registerOnTouched(fn: () => void): void;
1414
+ setDisabledState(isDisabled: boolean): void;
1415
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctSegmented, never>;
1416
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctSegmented, "strct-segmented", never, { "options": { "alias": "options"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "block": { "alias": "block"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1417
+ }
1418
+
1095
1419
  /**
1096
1420
  * Slider built on a native range input — fully accessible, CVA-compatible.
1097
1421
  * <strct-range [min]="0" [max]="100" [(ngModel)]="volume" showValue />
@@ -1530,6 +1854,57 @@ declare class StrctCascadeSelect extends StrctCascadeHost implements ControlValu
1530
1854
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctCascadeSelect, "strct-cascade-select", never, { "options": { "alias": "options"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1531
1855
  }
1532
1856
 
1857
+ /** One row in a `StrctDescriptionList` when driven by the `items` input. */
1858
+ interface StrctDescItem {
1859
+ label: string;
1860
+ value?: string | number;
1861
+ /** Render the value in the monospace face. */
1862
+ mono?: boolean;
1863
+ /** Dim the value (secondary information). */
1864
+ muted?: boolean;
1865
+ }
1866
+ /** Value alignment for the stacked (non-inline) layout. */
1867
+ type StrctDescAlign = 'between' | 'start';
1868
+ /**
1869
+ * Compact definition list: aligned `label : value` rows with an optional trailing
1870
+ * slot. The `inline` variant is the horizontal "stat strip" (label-value pairs in
1871
+ * a row). Replaces the hand-rolled `<dl>` + flex.
1872
+ *
1873
+ * Drive it with the `items` input, or project `<strct-desc>` rows so a value can
1874
+ * host a badge, icon or any rich content:
1875
+ *
1876
+ * <strct-description-list>
1877
+ * <strct-desc label="IPv4" mono>172.16.75.100/24</strct-desc>
1878
+ * <strct-desc label="IPv6"><strct-badge status="success">Enabled</strct-badge></strct-desc>
1879
+ * </strct-description-list>
1880
+ *
1881
+ * <strct-description-list [items]="[{ label: 'Gateway', value: '172.16.75.2', mono: true }]" />
1882
+ */
1883
+ declare class StrctDescriptionList {
1884
+ /** Rows, as an alternative to projecting `<strct-desc>` children. */
1885
+ readonly items: _angular_core.InputSignal<StrctDescItem[]>;
1886
+ /** Horizontal stat-strip layout instead of stacked rows. */
1887
+ readonly inline: _angular_core.InputSignalWithTransform<boolean, unknown>;
1888
+ /** Value alignment in stacked mode. */
1889
+ readonly align: _angular_core.InputSignal<StrctDescAlign>;
1890
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctDescriptionList, never>;
1891
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctDescriptionList, "strct-description-list", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "inline": { "alias": "inline"; "required": false; "isSignal": true; }; "align": { "alias": "align"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
1892
+ }
1893
+ /**
1894
+ * One projected `label → value` row inside a `<strct-description-list>`. The
1895
+ * value is whatever you project, so it can host a badge, icon or formatted text.
1896
+ */
1897
+ declare class StrctDesc {
1898
+ /** The row's label. */
1899
+ readonly label: _angular_core.InputSignal<string>;
1900
+ /** Render the projected value in the monospace face. */
1901
+ readonly mono: _angular_core.InputSignalWithTransform<boolean, unknown>;
1902
+ /** Dim the projected value. */
1903
+ readonly muted: _angular_core.InputSignalWithTransform<boolean, unknown>;
1904
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctDesc, never>;
1905
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctDesc, "strct-desc", never, { "label": { "alias": "label"; "required": true; "isSignal": true; }; "mono": { "alias": "mono"; "required": false; "isSignal": true; }; "muted": { "alias": "muted"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
1906
+ }
1907
+
1533
1908
  /** Column definition for the table. */
1534
1909
  interface StrctColumn {
1535
1910
  key: string;
@@ -1588,6 +1963,21 @@ declare class StrctTable {
1588
1963
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctTable, "strct-table", never, { "columns": { "alias": "columns"; "required": true; "isSignal": true; }; "rows": { "alias": "rows"; "required": true; "isSignal": true; }; "striped": { "alias": "striped"; "required": false; "isSignal": true; }; "hover": { "alias": "hover"; "required": false; "isSignal": true; }; "emptyText": { "alias": "emptyText"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; }, {}, ["cellDefs"], never, true, never>;
1589
1964
  }
1590
1965
 
1966
+ /** Every user-visible / assistive string in the grid, overridable for i18n. */
1967
+ interface StrctDatagridLabels {
1968
+ row: string;
1969
+ rows: string;
1970
+ selected: string;
1971
+ selectAll: string;
1972
+ selectRow: string;
1973
+ openDetail: string;
1974
+ toggleDetail: string;
1975
+ closeDetail: string;
1976
+ rowActions: string;
1977
+ chooseColumns: string;
1978
+ refresh: string;
1979
+ actions: string;
1980
+ }
1591
1981
  /** Resolves a stable identity for a row: a property key, or a function. */
1592
1982
  type StrctRowId = string | ((row: StrctRow) => unknown);
1593
1983
  /** Column definition for the datagrid. */
@@ -1663,6 +2053,30 @@ declare class StrctDatagrid {
1663
2053
  * [rowActions]="(row) => [{ label: 'Open', action: () => open(row) }, …]"
1664
2054
  */
1665
2055
  readonly rowActions: _angular_core.InputSignal<((row: StrctRow) => StrctMenuItem[]) | null>;
2056
+ /**
2057
+ * Seed the row selection. Each value is a row id (matching {@link rowId}); the
2058
+ * grid checks those rows when this input is set or changes. Requires
2059
+ * `selectable`. Assigning a new array (e.g. when opening a dialog) re-seeds the
2060
+ * selection; the user's subsequent toggles are preserved until the next change.
2061
+ */
2062
+ readonly initialSelection: _angular_core.InputSignal<readonly unknown[] | null>;
2063
+ /** Override any user-visible / assistive string (partial; merged over defaults). */
2064
+ readonly labels: _angular_core.InputSignal<Partial<StrctDatagridLabels>>;
2065
+ /** Effective labels (defaults + overrides). */
2066
+ protected readonly L: _angular_core.Signal<{
2067
+ row: string;
2068
+ rows: string;
2069
+ selected: string;
2070
+ selectAll: string;
2071
+ selectRow: string;
2072
+ openDetail: string;
2073
+ toggleDetail: string;
2074
+ closeDetail: string;
2075
+ rowActions: string;
2076
+ chooseColumns: string;
2077
+ refresh: string;
2078
+ actions: string;
2079
+ }>;
1666
2080
  /** Emitted when the selection changes. */
1667
2081
  readonly selectionChange: _angular_core.OutputEmitterRef<StrctRow[]>;
1668
2082
  /** Emitted when the refresh button is clicked. */
@@ -1734,7 +2148,7 @@ declare class StrctDatagrid {
1734
2148
  private commitSelection;
1735
2149
  private compare;
1736
2150
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctDatagrid, never>;
1737
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctDatagrid, "strct-datagrid", never, { "columns": { "alias": "columns"; "required": true; "isSignal": true; }; "rows": { "alias": "rows"; "required": true; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "selectable": { "alias": "selectable"; "required": false; "isSignal": true; }; "expandable": { "alias": "expandable"; "required": false; "isSignal": true; }; "detailPane": { "alias": "detailPane"; "required": false; "isSignal": true; }; "compact": { "alias": "compact"; "required": false; "isSignal": true; }; "emptyText": { "alias": "emptyText"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "resizable": { "alias": "resizable"; "required": false; "isSignal": true; }; "columnChooser": { "alias": "columnChooser"; "required": false; "isSignal": true; }; "sync": { "alias": "sync"; "required": false; "isSignal": true; }; "footerActionsDisabled": { "alias": "footerActionsDisabled"; "required": false; "isSignal": true; }; "rowId": { "alias": "rowId"; "required": false; "isSignal": true; }; "rowActions": { "alias": "rowActions"; "required": false; "isSignal": true; }; }, { "selectionChange": "selectionChange"; "syncChange": "syncChange"; "rowAction": "rowAction"; }, ["detailDef", "actionBarDef", "cellDefs"], ["[strctDatagridActionBar]"], true, never>;
2151
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctDatagrid, "strct-datagrid", never, { "columns": { "alias": "columns"; "required": true; "isSignal": true; }; "rows": { "alias": "rows"; "required": true; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "selectable": { "alias": "selectable"; "required": false; "isSignal": true; }; "expandable": { "alias": "expandable"; "required": false; "isSignal": true; }; "detailPane": { "alias": "detailPane"; "required": false; "isSignal": true; }; "compact": { "alias": "compact"; "required": false; "isSignal": true; }; "emptyText": { "alias": "emptyText"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "resizable": { "alias": "resizable"; "required": false; "isSignal": true; }; "columnChooser": { "alias": "columnChooser"; "required": false; "isSignal": true; }; "sync": { "alias": "sync"; "required": false; "isSignal": true; }; "footerActionsDisabled": { "alias": "footerActionsDisabled"; "required": false; "isSignal": true; }; "rowId": { "alias": "rowId"; "required": false; "isSignal": true; }; "rowActions": { "alias": "rowActions"; "required": false; "isSignal": true; }; "initialSelection": { "alias": "initialSelection"; "required": false; "isSignal": true; }; "labels": { "alias": "labels"; "required": false; "isSignal": true; }; }, { "selectionChange": "selectionChange"; "syncChange": "syncChange"; "rowAction": "rowAction"; }, ["detailDef", "actionBarDef", "cellDefs"], ["[strctDatagridActionBar]"], true, never>;
1738
2152
  }
1739
2153
 
1740
2154
  /** Timeline node state colors. */
@@ -1793,24 +2207,125 @@ declare class StrctSparkline {
1793
2207
 
1794
2208
  /** Chart rendering types (line, area, bar). */
1795
2209
  type StrctChartType = 'line' | 'area' | 'bar';
2210
+ /** Line interpolation between points. */
2211
+ type StrctChartCurve = 'smooth' | 'linear' | 'step';
2212
+ /** One series in a multi-series chart. */
2213
+ interface StrctChartSeries {
2214
+ data: number[];
2215
+ /** Legend + tooltip name. */
2216
+ label?: string;
2217
+ /** Per-series color; falls back to the chart's `status`. */
2218
+ status?: StrctChartStatus;
2219
+ /** Per-series area fill. */
2220
+ area?: boolean;
2221
+ /** Per-series interpolation; falls back to the chart's `curve`. */
2222
+ curve?: StrctChartCurve;
2223
+ /**
2224
+ * Dashed line — a second visual channel besides color, so two series stay
2225
+ * distinguishable under color-vision deficiency. `true` uses `'5 4'`; pass a
2226
+ * custom SVG dasharray string to tune it.
2227
+ */
2228
+ dash?: boolean | string;
2229
+ }
2230
+ /** A horizontal reference / threshold line. */
2231
+ interface StrctChartThreshold {
2232
+ value: number;
2233
+ label?: string;
2234
+ /** Line color; default 'warning'. */
2235
+ status?: StrctChartStatus;
2236
+ /** Dashed line; default true. */
2237
+ dashed?: boolean;
2238
+ }
2239
+ interface Pt {
2240
+ x: number;
2241
+ y: number;
2242
+ }
2243
+ interface SeriesRender {
2244
+ color: string;
2245
+ label: string;
2246
+ area: boolean;
2247
+ dash: string | null;
2248
+ pts: Pt[];
2249
+ path: string;
2250
+ areaPath: string;
2251
+ /** Global x-offset (right-aligned) so shorter series line up on the right. */
2252
+ offset: number;
2253
+ data: number[];
2254
+ }
1796
2255
  /**
1797
- * Single-series chart (line / area / bar). Dependency-free SVG, token-coloured.
1798
- * <strct-chart [data]="cpu" type="area" [labels]="hours" status="warning" />
2256
+ * Single- or multi-series chart (line / area / bar). Dependency-free SVG,
2257
+ * token-coloured.
2258
+ *
2259
+ * Lines are smooth by default (monotone cubic, no overshoot); set `curve` to
2260
+ * `linear` or `step`. Toggle the gradient fill with `area`, the ambient glow with
2261
+ * `glow`, and turn on `live` for streaming metrics. Pass `series` for multiple
2262
+ * lines with a `legend`; add persistent scale labels with `yAxis`, reference lines
2263
+ * with `thresholds`, a floor with `min`, and thin x labels with `xTicks`. Hover
2264
+ * anywhere for a crosshair + tooltip. The SVG is measured (1:1 coordinates) so
2265
+ * dots and the glow stay crisp at any width. Reduced-motion safe.
2266
+ *
2267
+ * <strct-chart [data]="cpu" area glow [labels]="hours" status="warning" />
2268
+ * <strct-chart [series]="[{data:inArr,label:'In'},{data:outArr,label:'Out'}]" legend />
1799
2269
  */
1800
2270
  declare class StrctChart {
1801
- /** Data array. */
2271
+ /** Single-series data (or use `series`). */
1802
2272
  readonly data: _angular_core.InputSignal<number[]>;
2273
+ /** Multiple series; when set it takes precedence over `data`. */
2274
+ readonly series: _angular_core.InputSignal<StrctChartSeries[] | null>;
1803
2275
  /** Visual type / variant. */
1804
2276
  readonly type: _angular_core.InputSignal<StrctChartType>;
2277
+ /** Line interpolation. */
2278
+ readonly curve: _angular_core.InputSignal<StrctChartCurve>;
2279
+ /** Fill the area under the line with a soft gradient. */
2280
+ readonly area: _angular_core.InputSignalWithTransform<boolean, unknown>;
2281
+ /** Soft ambient glow on the line and the leading-edge dot. */
2282
+ readonly glow: _angular_core.InputSignalWithTransform<boolean, unknown>;
2283
+ /** Live streaming: the window scrolls left as new points arrive. */
2284
+ readonly live: _angular_core.InputSignalWithTransform<boolean, unknown>;
2285
+ /** Expected ms between updates in live mode (drives the scroll duration). */
2286
+ readonly interval: _angular_core.InputSignal<number>;
2287
+ /** Hover crosshair + value tooltip. */
2288
+ readonly interactive: _angular_core.InputSignalWithTransform<boolean, unknown>;
2289
+ /** Line thickness in pixels. */
2290
+ readonly strokeWidth: _angular_core.InputSignal<number>;
2291
+ /** Show the horizontal gridlines. */
2292
+ readonly grid: _angular_core.InputSignalWithTransform<boolean, unknown>;
2293
+ /** Show a dot at each data point (single-series). */
2294
+ readonly dots: _angular_core.InputSignalWithTransform<boolean, unknown>;
2295
+ /** Show a legend (with `series`). */
2296
+ readonly legend: _angular_core.InputSignalWithTransform<boolean, unknown>;
1805
2297
  /** X-axis labels. */
1806
2298
  readonly labels: _angular_core.InputSignal<string[]>;
2299
+ /** Target number of x labels; null renders every label. */
2300
+ readonly xTicks: _angular_core.InputSignal<number | null>;
2301
+ /** Formatter for x labels. */
2302
+ readonly xFormat: _angular_core.InputSignal<((label: string, index: number) => string) | null>;
1807
2303
  /** Visual status color. */
1808
2304
  readonly status: _angular_core.InputSignal<StrctChartStatus>;
1809
2305
  /** Height in pixels. */
1810
2306
  readonly height: _angular_core.InputSignal<number>;
1811
2307
  /** Override the top of the value axis (defaults to the data max + headroom). */
1812
2308
  readonly max: _angular_core.InputSignal<number | null>;
1813
- protected readonly vbW = 320;
2309
+ /** Override the floor of the value axis (defaults to 0). */
2310
+ readonly min: _angular_core.InputSignal<number | null>;
2311
+ /** Persistent y-axis scale labels. */
2312
+ readonly yAxis: _angular_core.InputSignalWithTransform<boolean, unknown>;
2313
+ /** Approx number of y ticks. */
2314
+ readonly yTicks: _angular_core.InputSignal<number>;
2315
+ /** Formatter for y-axis labels; falls back to `valueFormat`. */
2316
+ readonly axisFormat: _angular_core.InputSignal<((v: number) => string) | null>;
2317
+ /** Horizontal reference / threshold lines. */
2318
+ readonly thresholds: _angular_core.InputSignal<StrctChartThreshold[]>;
2319
+ /** Text shown when there is no data. */
2320
+ readonly emptyText: _angular_core.InputSignal<string>;
2321
+ /** Formatter for the live-mode "Xs ago" tooltip line (receives seconds). */
2322
+ readonly agoFormat: _angular_core.InputSignal<((seconds: number) => string) | null>;
2323
+ /**
2324
+ * Optional formatter for the values shown in the hover tooltip + y-axis flag
2325
+ * (and the delta magnitude). Lets callers add units / fixed precision, e.g.
2326
+ * `[valueFormat]="v => v.toFixed(3) + ' %'"`. When null, the raw value is shown.
2327
+ */
2328
+ readonly valueFormat: _angular_core.InputSignal<((v: number) => string) | null>;
1814
2329
  protected readonly pad: {
1815
2330
  l: number;
1816
2331
  r: number;
@@ -1818,14 +2333,48 @@ declare class StrctChart {
1818
2333
  b: number;
1819
2334
  };
1820
2335
  protected readonly color: _angular_core.Signal<string>;
1821
- private readonly maxValue;
2336
+ protected readonly showArea: _angular_core.Signal<boolean>;
2337
+ private readonly uid;
2338
+ protected readonly gradId: string;
2339
+ protected readonly clipId: string;
2340
+ /** Measured pixel width → 1:1 viewBox so dots / glow stay crisp at any size. */
2341
+ protected readonly width: _angular_core.WritableSignal<number>;
2342
+ private readonly svgRef;
2343
+ protected readonly slidePx: _angular_core.WritableSignal<number>;
2344
+ protected readonly sliding: _angular_core.WritableSignal<boolean>;
2345
+ protected readonly drawOn: _angular_core.WritableSignal<boolean>;
2346
+ private firstData;
2347
+ /** Reactive OS motion preference (tracks live changes, not just first load). */
2348
+ private readonly reduceMotion;
2349
+ protected readonly hoverIdx: _angular_core.WritableSignal<number | null>;
2350
+ constructor();
2351
+ private readonly seriesResolved;
2352
+ protected readonly isMulti: _angular_core.Signal<boolean>;
2353
+ /** All data arrays (multi or single). */
2354
+ private readonly allData;
2355
+ protected readonly isEmpty: _angular_core.Signal<boolean>;
2356
+ /** Number of x slots. */
2357
+ private readonly nx;
2358
+ /** Left padding: wider when the y-axis labels are shown. */
2359
+ protected readonly pl: _angular_core.Signal<number>;
2360
+ private chartW;
1822
2361
  private chartH;
1823
- protected readonly points: _angular_core.Signal<{
1824
- x: number;
1825
- y: number;
2362
+ /** Horizontal gap between two data points, in px. */
2363
+ private stepX;
2364
+ private readonly yMax;
2365
+ private readonly yMin;
2366
+ private yOf;
2367
+ protected readonly points: _angular_core.Signal<Pt[]>;
2368
+ protected readonly head: _angular_core.Signal<Pt | null>;
2369
+ private readonly plotPoints;
2370
+ protected readonly linePath: _angular_core.Signal<string>;
2371
+ protected readonly areaPath: _angular_core.Signal<string>;
2372
+ protected readonly multiSeries: _angular_core.Signal<SeriesRender[]>;
2373
+ protected readonly legendItems: _angular_core.Signal<{
2374
+ label: string;
2375
+ color: string;
2376
+ dash: string | null;
1826
2377
  }[]>;
1827
- protected readonly linePoints: _angular_core.Signal<string>;
1828
- protected readonly areaPoints: _angular_core.Signal<string>;
1829
2378
  protected readonly bars: _angular_core.Signal<{
1830
2379
  x: number;
1831
2380
  y: number;
@@ -1833,8 +2382,59 @@ declare class StrctChart {
1833
2382
  h: number;
1834
2383
  }[]>;
1835
2384
  protected readonly gridY: _angular_core.Signal<number[]>;
2385
+ private fmtAxis;
2386
+ protected readonly yAxisTicks: _angular_core.Signal<{
2387
+ value: number;
2388
+ y: number;
2389
+ text: string;
2390
+ }[]>;
2391
+ protected readonly thresholdLines: _angular_core.Signal<{
2392
+ y: number;
2393
+ color: string;
2394
+ dashed: boolean;
2395
+ label: string;
2396
+ }[]>;
2397
+ protected readonly displayLabels: _angular_core.Signal<{
2398
+ text: string;
2399
+ i: number;
2400
+ }[]>;
2401
+ protected readonly hoverX: _angular_core.Signal<number | null>;
2402
+ protected readonly hoverPt: _angular_core.Signal<Pt | null>;
2403
+ protected readonly hoverValue: _angular_core.Signal<number | "">;
2404
+ /** hoverValue run through valueFormat (unit / precision), else the raw value. */
2405
+ protected readonly hoverValueText: _angular_core.Signal<string>;
2406
+ /** Delta magnitude, formatted the same way so its unit matches the value. */
2407
+ protected readonly absDeltaText: _angular_core.Signal<string>;
2408
+ protected readonly hoverLabel: _angular_core.Signal<string>;
2409
+ /** Change from the previous point (single-series; null at the first point). */
2410
+ protected readonly hoverDelta: _angular_core.Signal<number | null>;
2411
+ protected readonly absDelta: _angular_core.Signal<number>;
2412
+ /** Second tooltip line: "Xs ago" while live, else the x label. */
2413
+ protected readonly hoverMeta: _angular_core.Signal<string>;
2414
+ /** Per-series value at the hovered index (multi-series tooltip). */
2415
+ protected readonly hoverRows: _angular_core.Signal<{
2416
+ label: string;
2417
+ color: string;
2418
+ value: number | null;
2419
+ text: string;
2420
+ }[]>;
2421
+ /** Per-series hover dots (multi-series). */
2422
+ protected readonly hoverDots: _angular_core.Signal<{
2423
+ x: number;
2424
+ y: number;
2425
+ color: string;
2426
+ }[]>;
2427
+ /** Screen-reader summary of the whole chart (role="img" name). */
2428
+ protected readonly chartAria: _angular_core.Signal<string>;
2429
+ /** aria-live text announcing the hovered / keyboard-selected point. */
2430
+ protected readonly srText: _angular_core.Signal<string>;
2431
+ /** Pixel x of a data index (shared by the plot and the x-axis labels). */
2432
+ protected xOf(i: number): number;
2433
+ /** Keyboard access to the crosshair: arrows walk the points. */
2434
+ protected onKey(event: KeyboardEvent): void;
2435
+ protected onMove(event: PointerEvent): void;
1836
2436
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctChart, never>;
1837
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctChart, "strct-chart", never, { "data": { "alias": "data"; "required": true; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "labels": { "alias": "labels"; "required": false; "isSignal": true; }; "status": { "alias": "status"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
2437
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctChart, "strct-chart", never, { "data": { "alias": "data"; "required": false; "isSignal": true; }; "series": { "alias": "series"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "curve": { "alias": "curve"; "required": false; "isSignal": true; }; "area": { "alias": "area"; "required": false; "isSignal": true; }; "glow": { "alias": "glow"; "required": false; "isSignal": true; }; "live": { "alias": "live"; "required": false; "isSignal": true; }; "interval": { "alias": "interval"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "strokeWidth": { "alias": "strokeWidth"; "required": false; "isSignal": true; }; "grid": { "alias": "grid"; "required": false; "isSignal": true; }; "dots": { "alias": "dots"; "required": false; "isSignal": true; }; "legend": { "alias": "legend"; "required": false; "isSignal": true; }; "labels": { "alias": "labels"; "required": false; "isSignal": true; }; "xTicks": { "alias": "xTicks"; "required": false; "isSignal": true; }; "xFormat": { "alias": "xFormat"; "required": false; "isSignal": true; }; "status": { "alias": "status"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "yAxis": { "alias": "yAxis"; "required": false; "isSignal": true; }; "yTicks": { "alias": "yTicks"; "required": false; "isSignal": true; }; "axisFormat": { "alias": "axisFormat"; "required": false; "isSignal": true; }; "thresholds": { "alias": "thresholds"; "required": false; "isSignal": true; }; "emptyText": { "alias": "emptyText"; "required": false; "isSignal": true; }; "agoFormat": { "alias": "agoFormat"; "required": false; "isSignal": true; }; "valueFormat": { "alias": "valueFormat"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1838
2438
  }
1839
2439
 
1840
2440
  /** A single weighted slice of a donut chart. */
@@ -1844,9 +2444,13 @@ interface StrctDonutSegment {
1844
2444
  color?: string;
1845
2445
  }
1846
2446
  /**
1847
- * Donut / ring chart from weighted segments.
1848
- * <strct-donut [segments]="[{value:6,label:'Running'},{value:2,label:'Off'}]"
1849
- * centerValue="8" centerLabel="VMs" />
2447
+ * Donut / ring chart from weighted segments. Rounded, gapped slices with a
2448
+ * sweep-in animation; hover a slice (or its legend row) to highlight it and read
2449
+ * its value + share in the center. Dependency-free SVG, token-coloured.
2450
+ *
2451
+ * <strct-donut
2452
+ * [segments]="[{ value: 36, label: 'Running' }, { value: 8, label: 'Stopped' }]"
2453
+ * centerValue="44" centerLabel="VMs" legend />
1850
2454
  */
1851
2455
  declare class StrctDonut {
1852
2456
  /** Weighted segments. */
@@ -1855,20 +2459,38 @@ declare class StrctDonut {
1855
2459
  readonly size: _angular_core.InputSignal<number>;
1856
2460
  /** Stroke thickness in pixels. */
1857
2461
  readonly thickness: _angular_core.InputSignal<number>;
1858
- /** Value shown in the donut center. */
2462
+ /** Value shown in the donut center (when no slice is hovered). */
1859
2463
  readonly centerValue: _angular_core.InputSignal<string | number>;
1860
- /** Label shown in the donut center. */
2464
+ /** Label shown in the donut center (when no slice is hovered). */
1861
2465
  readonly centerLabel: _angular_core.InputSignal<string>;
2466
+ /** Show a legend (color · label · value · %) beside the ring. */
2467
+ readonly legend: _angular_core.InputSignalWithTransform<boolean, unknown>;
2468
+ /** Gap between slices, in degrees. */
2469
+ readonly gap: _angular_core.InputSignal<number>;
2470
+ /** Hover highlight + center readout. */
2471
+ readonly interactive: _angular_core.InputSignalWithTransform<boolean, unknown>;
2472
+ protected readonly hovered: _angular_core.WritableSignal<number | null>;
1862
2473
  protected readonly half: _angular_core.Signal<number>;
1863
2474
  protected readonly radius: _angular_core.Signal<number>;
1864
2475
  protected readonly circumference: _angular_core.Signal<number>;
2476
+ private readonly total;
1865
2477
  protected readonly arcs: _angular_core.Signal<{
1866
2478
  color: string;
1867
- len: number;
2479
+ label: string;
2480
+ value: number;
2481
+ pct: number;
2482
+ dash: string;
1868
2483
  offset: number;
1869
2484
  }[]>;
2485
+ protected readonly centerMain: _angular_core.Signal<string | number>;
2486
+ protected readonly centerSub: _angular_core.Signal<string>;
2487
+ protected readonly centerColor: _angular_core.Signal<string>;
2488
+ /** Screen-reader summary (role="img" name): every slice with value + share. */
2489
+ protected readonly ariaSummary: _angular_core.Signal<string>;
2490
+ protected enter(i: number): void;
2491
+ protected leave(): void;
1870
2492
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctDonut, never>;
1871
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctDonut, "strct-donut", never, { "segments": { "alias": "segments"; "required": true; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "thickness": { "alias": "thickness"; "required": false; "isSignal": true; }; "centerValue": { "alias": "centerValue"; "required": false; "isSignal": true; }; "centerLabel": { "alias": "centerLabel"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
2493
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctDonut, "strct-donut", never, { "segments": { "alias": "segments"; "required": true; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "thickness": { "alias": "thickness"; "required": false; "isSignal": true; }; "centerValue": { "alias": "centerValue"; "required": false; "isSignal": true; }; "centerLabel": { "alias": "centerLabel"; "required": false; "isSignal": true; }; "legend": { "alias": "legend"; "required": false; "isSignal": true; }; "gap": { "alias": "gap"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1872
2494
  }
1873
2495
 
1874
2496
  /**
@@ -1880,6 +2502,13 @@ declare class StrctGauge {
1880
2502
  readonly value: _angular_core.InputSignal<number>;
1881
2503
  /** Visual status color. */
1882
2504
  readonly status: _angular_core.InputSignal<StrctChartStatus>;
2505
+ /**
2506
+ * Optional value-driven thresholds. When set, the gauge picks its own status
2507
+ * from the value: `value >= critical` → critical, `>= warning` → warning, else
2508
+ * the healthy base (`status`, or `'success'` when `status` is left at its
2509
+ * default `'accent'`).
2510
+ */
2511
+ readonly thresholds: _angular_core.InputSignal<StrctThresholds | null>;
1883
2512
  /** Label text. */
1884
2513
  readonly label: _angular_core.InputSignal<string>;
1885
2514
  /** Size variant. */
@@ -1889,12 +2518,72 @@ declare class StrctGauge {
1889
2518
  protected readonly clamped: _angular_core.Signal<number>;
1890
2519
  protected readonly half: _angular_core.Signal<number>;
1891
2520
  protected readonly radius: _angular_core.Signal<number>;
2521
+ /** Status after applying thresholds (falls back to `status` when none set). */
2522
+ protected readonly resolvedStatus: _angular_core.Signal<StrctChartStatus>;
1892
2523
  protected readonly color: _angular_core.Signal<string>;
1893
2524
  private readonly circumference;
1894
2525
  protected readonly trackDash: _angular_core.Signal<string>;
1895
2526
  protected readonly valueDash: _angular_core.Signal<string>;
1896
2527
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctGauge, never>;
1897
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctGauge, "strct-gauge", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "status": { "alias": "status"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "thickness": { "alias": "thickness"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
2528
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctGauge, "strct-gauge", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "status": { "alias": "status"; "required": false; "isSignal": true; }; "thresholds": { "alias": "thresholds"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "thickness": { "alias": "thickness"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
2529
+ }
2530
+
2531
+ /** One endpoint in a `StrctFlow`. */
2532
+ interface StrctFlowNode {
2533
+ /** Stable identity (used as the @for track key). */
2534
+ id: string;
2535
+ /** Primary terminal label. */
2536
+ label: string;
2537
+ /** Optional secondary line under the label. */
2538
+ sublabel?: string;
2539
+ /** Optional role tag (e.g. "ACTIVE", "STANDBY"). */
2540
+ role?: string;
2541
+ /** Optional status dot tone for this terminal. */
2542
+ status?: StrctStatus;
2543
+ }
2544
+ /** Direction of travel for the animated flow. */
2545
+ type StrctFlowDirection = 'forward' | 'reverse' | 'both';
2546
+ /** Axis the terminals are laid out along. */
2547
+ type StrctFlowOrientation = 'horizontal' | 'vertical';
2548
+ /**
2549
+ * Shows a connection between two (or N) endpoints with an optional animated
2550
+ * "flow" — moving dots travelling along the connector — to represent live data
2551
+ * movement (replication, sync, a pipeline).
2552
+ *
2553
+ * <strct-flow
2554
+ * [nodes]="[
2555
+ * { id: 'a', label: 'node01', role: 'ACTIVE', status: 'success' },
2556
+ * { id: 'b', label: 'node02', role: 'STANDBY', status: 'accent' }
2557
+ * ]"
2558
+ * [live]="true" label="live replication · 0 lag" status="success" />
2559
+ *
2560
+ * When `live` is off (or the user prefers reduced motion) the connector is a
2561
+ * static gradient with a direction arrow instead of moving dots.
2562
+ */
2563
+ declare class StrctFlow {
2564
+ /** Ordered endpoints. */
2565
+ readonly nodes: _angular_core.InputSignal<StrctFlowNode[]>;
2566
+ /** Animate the flow (packets travel along the connector). */
2567
+ readonly live: _angular_core.InputSignalWithTransform<boolean, unknown>;
2568
+ /** Direction of travel. */
2569
+ readonly direction: _angular_core.InputSignal<StrctFlowDirection>;
2570
+ /** Caption under the connector (e.g. "live replication", "0 lag"). */
2571
+ readonly label: _angular_core.InputSignal<string>;
2572
+ /** Connector + packet color. */
2573
+ readonly status: _angular_core.InputSignal<StrctStatus>;
2574
+ /** Layout axis. */
2575
+ readonly orientation: _angular_core.InputSignal<StrctFlowOrientation>;
2576
+ /** A flow needs at least two terminals to animate. */
2577
+ protected readonly connected: _angular_core.Signal<boolean>;
2578
+ protected readonly animated: _angular_core.Signal<boolean>;
2579
+ /** Whether to show packets / arrow in the given travel direction. */
2580
+ protected showArrow(dir: 'forward' | 'reverse'): boolean;
2581
+ /** Caption text, falling back to a "no connection" hint for a lone terminal. */
2582
+ protected readonly caption: _angular_core.Signal<string>;
2583
+ /** Human-readable summary for assistive tech. */
2584
+ protected readonly ariaLabel: _angular_core.Signal<string>;
2585
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctFlow, never>;
2586
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctFlow, "strct-flow", never, { "nodes": { "alias": "nodes"; "required": false; "isSignal": true; }; "live": { "alias": "live"; "required": false; "isSignal": true; }; "direction": { "alias": "direction"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "status": { "alias": "status"; "required": false; "isSignal": true; }; "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1898
2587
  }
1899
2588
 
1900
2589
  /** Accent colour for a metric tile. */
@@ -1935,6 +2624,37 @@ declare class StrctMetricTile {
1935
2624
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctMetricTile, "strct-metric-tile", never, { "label": { "alias": "label"; "required": true; "isSignal": true; }; "value": { "alias": "value"; "required": true; "isSignal": true; }; "unit": { "alias": "unit"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "status": { "alias": "status"; "required": false; "isSignal": true; }; "delta": { "alias": "delta"; "required": false; "isSignal": true; }; "deltaSuffix": { "alias": "deltaSuffix"; "required": false; "isSignal": true; }; "invertDelta": { "alias": "invertDelta"; "required": false; "isSignal": true; }; "caption": { "alias": "caption"; "required": false; "isSignal": true; }; "data": { "alias": "data"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1936
2625
  }
1937
2626
 
2627
+ /**
2628
+ * Page-level status summary banner: a tone-colored surface with a leading icon
2629
+ * chip, a heading, a description, and optional right-aligned metadata / actions.
2630
+ *
2631
+ * Distinct from `StrctAlert` (a dismissible inline notification) and
2632
+ * `StrctSignpost` (a popover). Use it for the prominent "Protected", "All systems
2633
+ * healthy", "Clock synchronized" summaries apps otherwise hand-roll.
2634
+ *
2635
+ * <strct-hero status="success" icon="shield" heading="High availability is on">
2636
+ * The standby node can take over if this one fails.
2637
+ * <div strctHeroMeta><strct-badge status="success">HA ON</strct-badge></div>
2638
+ * <div strctHeroActions>
2639
+ * <button strct-button size="sm">Switch over</button>
2640
+ * </div>
2641
+ * </strct-hero>
2642
+ */
2643
+ declare class StrctHero {
2644
+ /** Tone: drives the left rail + icon chip color. */
2645
+ readonly status: _angular_core.InputSignal<StrctStatus>;
2646
+ /** Leading icon name (StrctIcon set). Falls back to a per-status default. */
2647
+ readonly icon: _angular_core.InputSignal<string>;
2648
+ /** The headline; exposed as the banner's accessible name. */
2649
+ readonly heading: _angular_core.InputSignal<string>;
2650
+ /** Tighter padding for secondary placements. */
2651
+ readonly dense: _angular_core.InputSignalWithTransform<boolean, unknown>;
2652
+ protected readonly headingId: string;
2653
+ protected readonly resolvedIcon: _angular_core.Signal<string>;
2654
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctHero, never>;
2655
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctHero, "strct-hero", never, { "status": { "alias": "status"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "heading": { "alias": "heading"; "required": true; "isSignal": true; }; "dense": { "alias": "dense"; "required": false; "isSignal": true; }; }, {}, never, ["*", "[strctHeroMeta]", "[strctHeroActions]"], true, never>;
2656
+ }
2657
+
1938
2658
  /** Alert visual types. */
1939
2659
  type StrctAlertType = 'info' | 'success' | 'warning' | 'critical';
1940
2660
  /** Inline contextual banner. `<strct-alert type="warning">…</strct-alert>`. */
@@ -1943,11 +2663,13 @@ declare class StrctAlert {
1943
2663
  readonly type: _angular_core.InputSignal<StrctAlertType>;
1944
2664
  /** Show a dismiss button. */
1945
2665
  readonly closable: _angular_core.InputSignalWithTransform<boolean, unknown>;
2666
+ /** Accessible label of the dismiss button (localizable). */
2667
+ readonly dismissLabel: _angular_core.InputSignal<string>;
1946
2668
  /** Emitted when the alert is dismissed. */
1947
2669
  readonly closed: _angular_core.OutputEmitterRef<void>;
1948
2670
  protected readonly icon: _angular_core.Signal<"info" | "success" | "warning" | "critical">;
1949
2671
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctAlert, never>;
1950
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctAlert, "strct-alert", never, { "type": { "alias": "type"; "required": false; "isSignal": true; }; "closable": { "alias": "closable"; "required": false; "isSignal": true; }; }, { "closed": "closed"; }, never, ["*"], true, never>;
2672
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctAlert, "strct-alert", never, { "type": { "alias": "type"; "required": false; "isSignal": true; }; "closable": { "alias": "closable"; "required": false; "isSignal": true; }; "dismissLabel": { "alias": "dismissLabel"; "required": false; "isSignal": true; }; }, { "closed": "closed"; }, never, ["*"], true, never>;
1951
2673
  }
1952
2674
 
1953
2675
  /** Tooltip placement relative to the host element. */
@@ -2033,10 +2755,12 @@ declare class StrctToastService {
2033
2755
  }
2034
2756
  /** Renders the toast stack. Place once, typically just inside the app shell. */
2035
2757
  declare class StrctToastOutlet {
2758
+ /** Accessible name of the notifications region (localizable). */
2759
+ readonly regionLabel: _angular_core.InputSignal<string>;
2036
2760
  protected readonly service: StrctToastService;
2037
2761
  protected icon(type: StrctToastType): string;
2038
2762
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctToastOutlet, never>;
2039
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctToastOutlet, "strct-toast-outlet", never, {}, {}, never, never, true, never>;
2763
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctToastOutlet, "strct-toast-outlet", never, { "regionLabel": { "alias": "regionLabel"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
2040
2764
  }
2041
2765
 
2042
2766
  /** Preset zero/permission/error states with a sensible icon + tone. */
@@ -2065,5 +2789,5 @@ declare class StrctEmptyState {
2065
2789
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctEmptyState, "strct-empty-state", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "tone": { "alias": "tone"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": true; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
2066
2790
  }
2067
2791
 
2068
- export { STRCT_ICONS, STRCT_ICON_GROUPS, STRCT_MASKS, STRCT_PALETTES, STRCT_RAW_ICONS, StrctAccordion, StrctAccordionPanel, StrctAlert, StrctAvatar, StrctBadge, StrctBreadcrumb, StrctBreadcrumbItem, StrctButton, StrctButtonGroup, StrctCard, StrctCardBlock, StrctCardFooter, StrctCardHeader, StrctCascadeHost, StrctCascadeNode, StrctCascadeSelect, StrctCellDef, StrctChart, StrctCheckbox, StrctChips, StrctColorPicker, StrctCombobox, StrctContextMenu, StrctContextMenuTrigger, StrctDatagrid, StrctDatagridActionBar, StrctDatepicker, StrctDivider, StrctDonut, StrctDrawer, StrctDrawerFooter, StrctDropdown, StrctDropdownDivider, StrctDropdownItem, StrctEmptyState, StrctField, StrctFile, StrctFooter, StrctGauge, StrctHeader, StrctIcon, StrctInput, StrctInputMask, StrctInputOtp, StrctKnob, StrctLogin, StrctMenuPanel, StrctMenuService, StrctMetricTile, StrctModal, StrctNav, StrctNavItem, StrctOverlay, StrctPagination, StrctPassword, StrctProgress, StrctRadio, StrctRadioGroup, StrctRail, StrctRange, StrctRating, StrctRowDetailDef, StrctSectionMenu, StrctShell, StrctShellService, StrctSignpost, StrctSkeleton, StrctSparkline, StrctSpeedDial, StrctSpinner, StrctStack, StrctStackItem, StrctStep, StrctSubmenu, StrctTab, StrctTable, StrctTabs, StrctTag, StrctThemeService, StrctThemeSwitcher, StrctTimeline, StrctTimelineItem, StrctToastOutlet, StrctToastService, StrctToggle, StrctTooltip, StrctTree, StrctTreeNode, StrctVerticalNav, StrctWizard, registerStrctIcon };
2069
- export type { StrctAlertType, StrctAvatarSize, StrctAvatarStatus, StrctBadgeStatus, StrctButtonSize, StrctButtonVariant, StrctCascadeOption, StrctCellContext, StrctChartStatus, StrctChartType, StrctColumn, StrctDatagridColumn, StrctDonutSegment, StrctDrawerSide, StrctDrawerSize, StrctEmptyVariant, StrctIconBadge, StrctKnobStatus, StrctMenuItem, StrctMenuLink, StrctMenuOpenOptions, StrctMenuSection, StrctMetricStatus, StrctModalSize, StrctMode, StrctOption, StrctOverlayPlacement, StrctPalette, StrctPaletteInfo, StrctProgressStatus, StrctRailItem, StrctRailStatus, StrctRow, StrctRowId, StrctSignpostPosition, StrctSpeedDialDirection, StrctSpinnerSize, StrctTagStatus, StrctTimelineState, StrctToast, StrctToastOptions, StrctToastType, StrctTooltipPosition, StrctTreeMenuEvent, StrctTreeNodeData, StrctTreeNodeMenuFn };
2792
+ export { STRCT_ICONS, STRCT_ICON_GROUPS, STRCT_MASKS, STRCT_PALETTES, STRCT_RAW_ICONS, StrctAccordion, StrctAccordionPanel, StrctAlert, StrctAvatar, StrctBadge, StrctBreadcrumb, StrctBreadcrumbItem, StrctButton, StrctButtonGroup, StrctCard, StrctCardBlock, StrctCardFooter, StrctCardHeader, StrctCascadeHost, StrctCascadeNode, StrctCascadeSelect, StrctCellDef, StrctCellStatus, StrctChart, StrctCheckbox, StrctChips, StrctColorPicker, StrctCombobox, StrctCommandPalette, StrctContextMenu, StrctContextMenuTrigger, StrctDatagrid, StrctDatagridActionBar, StrctDatepicker, StrctDesc, StrctDescriptionList, StrctDivider, StrctDonut, StrctDrawer, StrctDrawerFooter, StrctDropdown, StrctDropdownDivider, StrctDropdownItem, StrctEmptyState, StrctField, StrctFile, StrctFlow, StrctFooter, StrctGauge, StrctHeader, StrctHero, StrctIcon, StrctInput, StrctInputMask, StrctInputOtp, StrctKbd, StrctKnob, StrctLogin, StrctMenuPanel, StrctMenuService, StrctMetricTile, StrctModal, StrctNav, StrctNavItem, StrctOverlay, StrctPagination, StrctPassword, StrctProgress, StrctRadio, StrctRadioGroup, StrctRail, StrctRange, StrctRating, StrctRowDetailDef, StrctSectionMenu, StrctSegmented, StrctShell, StrctShellService, StrctSignpost, StrctSkeleton, StrctSparkline, StrctSpeedDial, StrctSpinner, StrctStack, StrctStackItem, StrctStep, StrctSubmenu, StrctTab, StrctTable, StrctTabs, StrctTag, StrctThemeService, StrctThemeSwitcher, StrctTimeline, StrctTimelineItem, StrctToastOutlet, StrctToastService, StrctToggle, StrctTooltip, StrctTree, StrctTreeNode, StrctVerticalNav, StrctWizard, registerStrctIcon, strctValidationIcon, strctValidationTone };
2793
+ export type { StrctAlertType, StrctAvatarSize, StrctAvatarStatus, StrctBadgeStatus, StrctButtonSize, StrctButtonVariant, StrctCascadeOption, StrctCellContext, StrctChartCurve, StrctChartSeries, StrctChartStatus, StrctChartThreshold, StrctChartType, StrctColumn, StrctCommandItem, StrctDatagridColumn, StrctDatagridLabels, StrctDescAlign, StrctDescItem, StrctDonutSegment, StrctDrawerSide, StrctDrawerSize, StrctEmptyVariant, StrctFlowDirection, StrctFlowNode, StrctFlowOrientation, StrctIconBadge, StrctKnobStatus, StrctMenuItem, StrctMenuLink, StrctMenuOpenOptions, StrctMenuSection, StrctMetricStatus, StrctModalSize, StrctMode, StrctOption, StrctOverlayPlacement, StrctPalette, StrctPaletteInfo, StrctProgressStatus, StrctRailItem, StrctRailStatus, StrctRow, StrctRowId, StrctSegmentedOption, StrctSegmentedSize, StrctSignpostPosition, StrctSpeedDialDirection, StrctSpinnerSize, StrctStatus, StrctTagStatus, StrctThresholds, StrctTimelineState, StrctToast, StrctToastOptions, StrctToastType, StrctTooltipPosition, StrctTreeMenuEvent, StrctTreeNodeData, StrctTreeNodeMenuFn, StrctValidationState, StrctValidationStatus };