@akcelik/strct 1.6.0 → 1.11.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,6 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { OnDestroy, TemplateRef } from '@angular/core';
3
- import { SafeHtml } from '@angular/platform-browser';
2
+ import { OnDestroy, TemplateRef, PipeTransform } from '@angular/core';
3
+ import { SafeHtml, SafeStyle } from '@angular/platform-browser';
4
4
  import { ControlValueAccessor } from '@angular/forms';
5
5
  import * as _akcelik_strct from '@akcelik/strct';
6
6
 
@@ -198,6 +198,7 @@ declare const STRCT_ICON_DEFS: {
198
198
  megaphone: string;
199
199
  flag: string;
200
200
  shieldAlert: string;
201
+ rocket: string;
201
202
  shieldCheck: string;
202
203
  running: string;
203
204
  stopped: string;
@@ -1212,6 +1213,7 @@ declare class StrctDropdown {
1212
1213
  /** Accessible name of the popover dialog (localizable). */
1213
1214
  readonly popoverLabel: _angular_core.InputSignal<string>;
1214
1215
  readonly open: _angular_core.WritableSignal<boolean>;
1216
+ constructor();
1215
1217
  toggle(): void;
1216
1218
  close(): void;
1217
1219
  /** Menu items close on activation; popover form controls never do. */
@@ -1221,6 +1223,16 @@ declare class StrctDropdown {
1221
1223
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctDropdown, never>;
1222
1224
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctDropdown, "strct-dropdown", never, { "align": { "alias": "align"; "required": false; "isSignal": true; }; "popover": { "alias": "popover"; "required": false; "isSignal": true; }; "popoverLabel": { "alias": "popoverLabel"; "required": false; "isSignal": true; }; }, {}, never, ["[strctDropdownTrigger]", "*"], true, never>;
1223
1225
  }
1226
+ /**
1227
+ * Marks (and upgrades) the dropdown's trigger element. The attribute alone is
1228
+ * enough for content projection; importing the directive additionally wires
1229
+ * `aria-haspopup` / `aria-expanded` onto the real button.
1230
+ */
1231
+ declare class StrctDropdownTrigger {
1232
+ protected readonly dd: StrctDropdown | null;
1233
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctDropdownTrigger, never>;
1234
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<StrctDropdownTrigger, "[strctDropdownTrigger]", never, {}, {}, never, never, true, never>;
1235
+ }
1224
1236
  /** A selectable row inside a `<strct-dropdown>`. */
1225
1237
  declare class StrctDropdownItem {
1226
1238
  /** Danger. */
@@ -2472,6 +2484,12 @@ interface StrctDatagridLabels {
2472
2484
  chooseColumns: string;
2473
2485
  refresh: string;
2474
2486
  actions: string;
2487
+ filterColumn: string;
2488
+ filterPlaceholder: string;
2489
+ clearFilter: string;
2490
+ editCell: string;
2491
+ toggleChildren: string;
2492
+ quickFilter: string;
2475
2493
  }
2476
2494
  /** Resolves a stable identity for a row: a property key, or a function. */
2477
2495
  type StrctRowId = string | ((row: StrctRow) => unknown);
@@ -2491,7 +2509,19 @@ interface StrctDatagridColumn {
2491
2509
  * except the last an explicit px `width` so offsets stay exact.
2492
2510
  */
2493
2511
  sticky?: boolean;
2512
+ /** Header filter popover: contains-text by default; see `filterOptions`. */
2513
+ filterable?: boolean;
2514
+ /** Distinct values for a checkbox set-filter (implies `filterable`). */
2515
+ filterOptions?: unknown[];
2516
+ /**
2517
+ * Inline cell editing: double-click opens an input; Enter / blur commit via
2518
+ * `(cellEdit)`, Escape cancels. The grid never mutates rows — apply the
2519
+ * change in your handler and pass the updated array back in.
2520
+ */
2521
+ editable?: boolean;
2494
2522
  }
2523
+ /** Per-column filter state: contains-text, or the checked value set. */
2524
+ type StrctDatagridFilters = Record<string, string | unknown[]>;
2495
2525
  type SortDir = 'asc' | 'desc';
2496
2526
  /** What the grid wants loaded in server-side (`lazy`) mode. */
2497
2527
  interface StrctDatagridLazyState {
@@ -2500,6 +2530,10 @@ interface StrctDatagridLazyState {
2500
2530
  pageSize: number;
2501
2531
  sortKey: string | null;
2502
2532
  sortDir: SortDir;
2533
+ /** Active per-column filters (empty object when none). */
2534
+ filters: StrctDatagridFilters;
2535
+ /** The global quick-filter term ('' when none). */
2536
+ quickFilter: string;
2503
2537
  }
2504
2538
  /** Persistable user column preferences (widths from resize, hidden from the
2505
2539
  * chooser, order from drag-reorder). */
@@ -2608,6 +2642,12 @@ declare class StrctDatagrid {
2608
2642
  chooseColumns: string;
2609
2643
  refresh: string;
2610
2644
  actions: string;
2645
+ filterColumn: string;
2646
+ filterPlaceholder: string;
2647
+ clearFilter: string;
2648
+ editCell: string;
2649
+ toggleChildren: string;
2650
+ quickFilter: string;
2611
2651
  }>;
2612
2652
  /**
2613
2653
  * Virtual scrolling for large data sets: only the rows inside the viewport
@@ -2645,6 +2685,30 @@ declare class StrctDatagrid {
2645
2685
  * groups. Paging is bypassed while grouped; not combinable with `virtual`.
2646
2686
  */
2647
2687
  readonly groupBy: _angular_core.InputSignal<string | null>;
2688
+ /**
2689
+ * Two-way per-column filter state: `key → contains-text` (text filter) or
2690
+ * `key → unknown[]` (checked value set). Applied client-side; in `lazy`
2691
+ * mode it is passed through on `lazyLoad` instead.
2692
+ */
2693
+ readonly filters: _angular_core.ModelSignal<StrctDatagridFilters>;
2694
+ /**
2695
+ * Global quick filter (two-way): one term substring-matched (OR) across
2696
+ * `quickFilterFields` — the console-standard "filter this list fast" box.
2697
+ * Complementary to the per-column `filters` (which AND). Applied before
2698
+ * paging client-side; passed through on `lazyLoad` in server mode.
2699
+ */
2700
+ readonly quickFilter: _angular_core.ModelSignal<string>;
2701
+ /** Columns the quick term scans. Defaults to every column's `key`. */
2702
+ readonly quickFilterFields: _angular_core.InputSignal<string[] | null>;
2703
+ /** Render the built-in quick-filter searchbox in the toolbar. */
2704
+ readonly quickFilterable: _angular_core.InputSignalWithTransform<boolean, unknown>;
2705
+ /**
2706
+ * Tree-grid: the row property holding a row's children array. Rows render
2707
+ * hierarchically with indent + carets; sorting applies per sibling level;
2708
+ * an active filter shows matches with their ancestors, force-expanded.
2709
+ * Not combinable with `groupBy` or `lazy`.
2710
+ */
2711
+ readonly childrenKey: _angular_core.InputSignal<string | null>;
2648
2712
  /** Emitted when the selection changes. */
2649
2713
  readonly selectionChange: _angular_core.OutputEmitterRef<StrctRow[]>;
2650
2714
  /** Emitted when the refresh button is clicked. */
@@ -2656,6 +2720,14 @@ declare class StrctDatagrid {
2656
2720
  }>;
2657
2721
  /** Server-side data request (lazy mode): load this page / sort and set `rows`. */
2658
2722
  readonly lazyLoad: _angular_core.OutputEmitterRef<StrctDatagridLazyState>;
2723
+ /** An editable cell was committed (Enter / blur). The grid does not mutate
2724
+ * rows — apply `value` to your data and pass the updated array back in. */
2725
+ readonly cellEdit: _angular_core.OutputEmitterRef<{
2726
+ row: StrctRow;
2727
+ column: StrctDatagridColumn;
2728
+ value: string;
2729
+ previous: unknown;
2730
+ }>;
2659
2731
  private readonly menu;
2660
2732
  protected readonly detailDef: _angular_core.Signal<StrctRowDetailDef | undefined>;
2661
2733
  protected readonly actionBarDef: _angular_core.Signal<StrctDatagridActionBar | undefined>;
@@ -2702,6 +2774,42 @@ declare class StrctDatagrid {
2702
2774
  /** What tbody renders: plain (virtual/paged) rows, or groups + their rows. */
2703
2775
  protected readonly displayItems: _angular_core.Signal<DgItem[]>;
2704
2776
  protected itemKey(it: DgItem): unknown;
2777
+ protected readonly filterOpenKey: _angular_core.WritableSignal<string | null>;
2778
+ protected toggleFilterPanel(key: string, event: Event): void;
2779
+ protected hasFilter(key: string): boolean;
2780
+ protected textFilter(key: string): string;
2781
+ protected setTextFilter(key: string, value: string): void;
2782
+ protected optionChecked(key: string, opt: unknown): boolean;
2783
+ protected toggleFilterOption(key: string, opt: unknown): void;
2784
+ protected clearFilter(key: string): void;
2785
+ protected onDocClickFilter(event: MouseEvent): void;
2786
+ protected onEscapeFilter(): void;
2787
+ private readonly expandedTree;
2788
+ protected treeDepth(row: StrctRow): number;
2789
+ protected treeHasChildren(row: StrctRow): boolean;
2790
+ protected treeExpanded(row: StrctRow): boolean;
2791
+ /** Expand / collapse one tree row. */
2792
+ toggleTreeRow(row: StrctRow): void;
2793
+ private readonly hostRef;
2794
+ protected readonly editing: _angular_core.WritableSignal<{
2795
+ rowKey: unknown;
2796
+ colKey: string;
2797
+ } | null>;
2798
+ protected isEditingCell(row: StrctRow, col: StrctDatagridColumn): boolean;
2799
+ protected startEdit(row: StrctRow, col: StrctDatagridColumn): void;
2800
+ protected commitEdit(row: StrctRow, col: StrctDatagridColumn, event: Event): void;
2801
+ protected cancelEdit(event?: Event): void;
2802
+ /** Active (non-empty) filter entries. */
2803
+ private readonly activeFilters;
2804
+ private readonly quickTerm;
2805
+ private matchesQuick;
2806
+ private matchesFilters;
2807
+ /** Rows surviving the quick + per-column filters (client-side modes only). */
2808
+ private readonly filteredRows;
2809
+ /** "12 / 480" — shown while any client-side filtering narrows the set. */
2810
+ protected readonly filterNote: _angular_core.Signal<string | null>;
2811
+ /** Tree mode: flattened visible rows + per-row depth/children/expanded meta. */
2812
+ private readonly treeFlat;
2705
2813
  protected readonly sorted: _angular_core.Signal<StrctRow[]>;
2706
2814
  protected readonly paged: _angular_core.Signal<StrctRow[]>;
2707
2815
  /** Full count for the pager / footer (server total in lazy mode). */
@@ -2778,7 +2886,7 @@ declare class StrctDatagrid {
2778
2886
  private commitSelection;
2779
2887
  private compare;
2780
2888
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctDatagrid, never>;
2781
- 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; }; "singleLine": { "alias": "singleLine"; "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; }; "virtual": { "alias": "virtual"; "required": false; "isSignal": true; }; "viewportHeight": { "alias": "viewportHeight"; "required": false; "isSignal": true; }; "rowHeight": { "alias": "rowHeight"; "required": false; "isSignal": true; }; "lazy": { "alias": "lazy"; "required": false; "isSignal": true; }; "total": { "alias": "total"; "required": false; "isSignal": true; }; "stateKey": { "alias": "stateKey"; "required": false; "isSignal": true; }; "columnState": { "alias": "columnState"; "required": false; "isSignal": true; }; "reorderable": { "alias": "reorderable"; "required": false; "isSignal": true; }; "groupBy": { "alias": "groupBy"; "required": false; "isSignal": true; }; }, { "columnState": "columnStateChange"; "selectionChange": "selectionChange"; "syncChange": "syncChange"; "rowAction": "rowAction"; "lazyLoad": "lazyLoad"; }, ["detailDef", "actionBarDef", "cellDefs"], ["[strctDatagridActionBar]"], true, never>;
2889
+ 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; }; "singleLine": { "alias": "singleLine"; "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; }; "virtual": { "alias": "virtual"; "required": false; "isSignal": true; }; "viewportHeight": { "alias": "viewportHeight"; "required": false; "isSignal": true; }; "rowHeight": { "alias": "rowHeight"; "required": false; "isSignal": true; }; "lazy": { "alias": "lazy"; "required": false; "isSignal": true; }; "total": { "alias": "total"; "required": false; "isSignal": true; }; "stateKey": { "alias": "stateKey"; "required": false; "isSignal": true; }; "columnState": { "alias": "columnState"; "required": false; "isSignal": true; }; "reorderable": { "alias": "reorderable"; "required": false; "isSignal": true; }; "groupBy": { "alias": "groupBy"; "required": false; "isSignal": true; }; "filters": { "alias": "filters"; "required": false; "isSignal": true; }; "quickFilter": { "alias": "quickFilter"; "required": false; "isSignal": true; }; "quickFilterFields": { "alias": "quickFilterFields"; "required": false; "isSignal": true; }; "quickFilterable": { "alias": "quickFilterable"; "required": false; "isSignal": true; }; "childrenKey": { "alias": "childrenKey"; "required": false; "isSignal": true; }; }, { "columnState": "columnStateChange"; "filters": "filtersChange"; "quickFilter": "quickFilterChange"; "selectionChange": "selectionChange"; "syncChange": "syncChange"; "rowAction": "rowAction"; "lazyLoad": "lazyLoad"; "cellEdit": "cellEdit"; }, ["detailDef", "actionBarDef", "cellDefs"], ["[strctDatagridActionBar]"], true, never>;
2782
2890
  }
2783
2891
 
2784
2892
  /** Timeline node state colors. */
@@ -3565,5 +3673,628 @@ declare class StrctEmptyState {
3565
3673
  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>;
3566
3674
  }
3567
3675
 
3568
- export { STRCT_ICONS, STRCT_ICON_GROUPS, STRCT_ICON_NAMES, 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, StrctCode, StrctColorPicker, StrctCombobox, StrctCommandPalette, StrctContextMenu, StrctContextMenuTrigger, StrctCopy, StrctDatagrid, StrctDatagridActionBar, StrctDatepicker, StrctDesc, StrctDescriptionList, StrctDivider, StrctDonut, StrctDrawer, StrctDrawerFooter, StrctDropdown, StrctDropdownDivider, StrctDropdownItem, StrctEmptyState, StrctField, StrctFile, StrctFilterBar, StrctFlow, StrctFooter, StrctGauge, StrctHeader, StrctHero, StrctIcon, StrctInput, StrctInputMask, StrctInputOtp, StrctKbd, StrctKnob, StrctLogin, StrctMenuPanel, StrctMenuService, StrctMetricTile, StrctModal, StrctNav, StrctNavItem, StrctOverlay, StrctPageHeader, StrctPageHeaderActions, StrctPageHeaderCrumbs, StrctPagination, StrctPassword, StrctProgress, StrctRadio, StrctRadioGroup, StrctRail, StrctRange, StrctRating, StrctRowDetailDef, StrctSearchbox, 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 };
3569
- export type { StrctAlertType, StrctAvatarSize, StrctAvatarStatus, StrctBadgeStatus, StrctButtonSize, StrctButtonVariant, StrctCascadeOption, StrctCellContext, StrctChartAnnotation, StrctChartColor, StrctChartCurve, StrctChartSeries, StrctChartSlot, StrctChartStatus, StrctChartThreshold, StrctChartType, StrctColumn, StrctCommandItem, StrctDatagridColumn, StrctDatagridColumnState, StrctDatagridLabels, StrctDatagridLazyState, StrctDescAlign, StrctDescItem, StrctDonutSegment, StrctDrawerSide, StrctDrawerSize, StrctEmptyVariant, StrctFilterChip, StrctFlowDirection, StrctFlowNode, StrctFlowOrientation, StrctIconBadge, StrctIconName, 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 };
3676
+ /**
3677
+ * Format a byte count. Binary (KiB, 1024) by default — the storage/memory
3678
+ * convention consoles actually mean; pass `binary: false` for decimal (kB).
3679
+ */
3680
+ declare function strctFormatBytes(bytes: number, options?: {
3681
+ binary?: boolean;
3682
+ digits?: number;
3683
+ }): string;
3684
+ /**
3685
+ * Format a data rate from bits per second (network convention). Pass bytes/s
3686
+ * through `strctFormatBytes(...) + '/s'` instead if you mean throughput.
3687
+ */
3688
+ declare function strctFormatRate(bitsPerSecond: number, options?: {
3689
+ digits?: number;
3690
+ }): string;
3691
+ /**
3692
+ * Format a duration in ms as the two most significant units: "2h 14m",
3693
+ * "3d 6h", "45s", "820ms". Sub-second stays in ms; `maxUnits` widens it.
3694
+ */
3695
+ declare function strctFormatDuration(ms: number, options?: {
3696
+ maxUnits?: number;
3697
+ }): string;
3698
+ /** Format a count with SI magnitude suffixes: 12400 → "12.4k". */
3699
+ declare function strctFormatSi(value: number, options?: {
3700
+ digits?: number;
3701
+ unit?: string;
3702
+ }): string;
3703
+ /** `{{ bytes | strctBytes }}` / `{{ bytes | strctBytes : false }}` (decimal). */
3704
+ declare class StrctBytesPipe implements PipeTransform {
3705
+ transform(value: number, binary?: boolean, digits?: number): string;
3706
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctBytesPipe, never>;
3707
+ static ɵpipe: _angular_core.ɵɵPipeDeclaration<StrctBytesPipe, "strctBytes", true>;
3708
+ }
3709
+ /** `{{ bps | strctRate }}` — bits per second with kbit/Mbit/Gbit steps. */
3710
+ declare class StrctRatePipe implements PipeTransform {
3711
+ transform(value: number, digits?: number): string;
3712
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctRatePipe, never>;
3713
+ static ɵpipe: _angular_core.ɵɵPipeDeclaration<StrctRatePipe, "strctRate", true>;
3714
+ }
3715
+ /** `{{ ms | strctDuration }}` — "2h 14m"; optional max unit count. */
3716
+ declare class StrctDurationPipe implements PipeTransform {
3717
+ transform(value: number, maxUnits?: number): string;
3718
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctDurationPipe, never>;
3719
+ static ɵpipe: _angular_core.ɵɵPipeDeclaration<StrctDurationPipe, "strctDuration", true>;
3720
+ }
3721
+ /** `{{ n | strctSi : 'IOPS' }}` — SI magnitude with an optional unit label. */
3722
+ declare class StrctSiPipe implements PipeTransform {
3723
+ transform(value: number, unit?: string, digits?: number): string;
3724
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctSiPipe, never>;
3725
+ static ɵpipe: _angular_core.ɵɵPipeDeclaration<StrctSiPipe, "strctSi", true>;
3726
+ }
3727
+
3728
+ /** A resolved time window. `presetId` is set when it came from a quick range. */
3729
+ interface StrctTimeRange {
3730
+ from: Date;
3731
+ to: Date;
3732
+ presetId?: string;
3733
+ }
3734
+ /** A "last X" quick range. `ms` is the window length ending at now. */
3735
+ interface StrctTimeRangePreset {
3736
+ id: string;
3737
+ label: string;
3738
+ ms: number;
3739
+ }
3740
+ /** The Grafana-conventional quick ranges consoles expect. */
3741
+ declare const STRCT_TIME_RANGE_PRESETS: StrctTimeRangePreset[];
3742
+ /**
3743
+ * Monitoring time-range picker — the "Last 1 hour ▾" control charts hang off:
3744
+ * quick relative ranges plus an absolute from/to editor, in one popover.
3745
+ *
3746
+ * <strct-time-range [(range)]="range" />
3747
+ *
3748
+ * Picking a preset resolves it against "now" immediately and stamps
3749
+ * `presetId`, so a consumer can re-resolve the same preset on its own refresh
3750
+ * tick. The popover reuses `strct-dropdown`'s dialog semantics: inner clicks
3751
+ * keep it open, outside click / Escape dismiss.
3752
+ */
3753
+ declare class StrctTimeRangePicker {
3754
+ /** The selected window, two-way. Null until the user (or you) picks one. */
3755
+ readonly range: _angular_core.ModelSignal<StrctTimeRange | null>;
3756
+ /** Quick ranges shown in the left column. */
3757
+ readonly presets: _angular_core.InputSignal<StrctTimeRangePreset[]>;
3758
+ /** Popover alignment, as in strct-dropdown. */
3759
+ readonly align: _angular_core.InputSignal<"end" | "start">;
3760
+ /** Trigger size — match it to the toolbar's buttons (sm strips). */
3761
+ readonly size: _angular_core.InputSignal<"md" | "sm">;
3762
+ /** Localizable strings. */
3763
+ readonly dialogLabel: _angular_core.InputSignal<string>;
3764
+ readonly quickLabel: _angular_core.InputSignal<string>;
3765
+ readonly absoluteLabel: _angular_core.InputSignal<string>;
3766
+ readonly fromLabel: _angular_core.InputSignal<string>;
3767
+ readonly toLabel: _angular_core.InputSignal<string>;
3768
+ readonly applyLabel: _angular_core.InputSignal<string>;
3769
+ readonly invalidLabel: _angular_core.InputSignal<string>;
3770
+ readonly placeholderLabel: _angular_core.InputSignal<string>;
3771
+ /** Fires on every commit (preset pick or absolute apply). */
3772
+ readonly applied: _angular_core.OutputEmitterRef<StrctTimeRange>;
3773
+ protected readonly dd: _angular_core.Signal<StrctDropdown>;
3774
+ protected readonly draftFrom: _angular_core.WritableSignal<string>;
3775
+ protected readonly draftTo: _angular_core.WritableSignal<string>;
3776
+ protected readonly draftError: _angular_core.Signal<boolean>;
3777
+ protected readonly triggerLabel: _angular_core.Signal<string>;
3778
+ protected pickPreset(p: StrctTimeRangePreset): void;
3779
+ protected applyAbsolute(): boolean;
3780
+ /** Re-resolve a preset range against "now" — call from your refresh tick. */
3781
+ refresh(): void;
3782
+ private seedDraft;
3783
+ private toLocal;
3784
+ private formatStamp;
3785
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctTimeRangePicker, never>;
3786
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctTimeRangePicker, "strct-time-range", never, { "range": { "alias": "range"; "required": false; "isSignal": true; }; "presets": { "alias": "presets"; "required": false; "isSignal": true; }; "align": { "alias": "align"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "dialogLabel": { "alias": "dialogLabel"; "required": false; "isSignal": true; }; "quickLabel": { "alias": "quickLabel"; "required": false; "isSignal": true; }; "absoluteLabel": { "alias": "absoluteLabel"; "required": false; "isSignal": true; }; "fromLabel": { "alias": "fromLabel"; "required": false; "isSignal": true; }; "toLabel": { "alias": "toLabel"; "required": false; "isSignal": true; }; "applyLabel": { "alias": "applyLabel"; "required": false; "isSignal": true; }; "invalidLabel": { "alias": "invalidLabel"; "required": false; "isSignal": true; }; "placeholderLabel": { "alias": "placeholderLabel"; "required": false; "isSignal": true; }; }, { "range": "rangeChange"; "applied": "applied"; }, never, never, true, never>;
3787
+ }
3788
+
3789
+ /** A log line: plain text plus an optional severity for tinting. */
3790
+ interface StrctLogLine {
3791
+ text: string;
3792
+ level?: 'error' | 'warn' | 'info' | 'debug';
3793
+ }
3794
+ /** One render segment of a line after ANSI parsing. */
3795
+ interface LogSegment {
3796
+ text: string;
3797
+ cls: string;
3798
+ }
3799
+ interface RenderLine {
3800
+ index: number;
3801
+ level: string;
3802
+ segments: LogSegment[];
3803
+ }
3804
+ /**
3805
+ * Virtualized log tail — the `kubectl logs -f` surface as a component:
3806
+ *
3807
+ * <strct-log-viewer [lines]="lines()" [(follow)]="follow" [height]="360" />
3808
+ *
3809
+ * - **Virtualized**: only the visible window plus overscan is in the DOM, so
3810
+ * 100k lines scroll flat.
3811
+ * - **Follow mode** (two-way): sticks to the tail as lines stream in;
3812
+ * scrolling up pauses it, the button (or scrolling back to the bottom)
3813
+ * resumes it — the Grafana/Loki convention.
3814
+ * - **ANSI SGR colors** (16-color + bold) parsed into safe spans — no
3815
+ * innerHTML — and severity tinting from `StrctLogLine.level` or, for plain
3816
+ * strings, auto-detected ERROR/WARN/INFO/DEBUG tokens.
3817
+ */
3818
+ declare class StrctLogViewer {
3819
+ /** Log lines — plain strings or `{ text, level }` objects. */
3820
+ readonly lines: _angular_core.InputSignal<(string | StrctLogLine)[]>;
3821
+ /** Viewport height in px. */
3822
+ readonly height: _angular_core.InputSignal<number>;
3823
+ /** Follow the tail as new lines arrive (two-way; pauses on scroll-up). */
3824
+ readonly follow: _angular_core.ModelSignal<boolean>;
3825
+ /** Soft-wrap long lines instead of horizontal scrolling (two-way). */
3826
+ readonly wrapMode: _angular_core.ModelSignal<boolean>;
3827
+ /** Auto-detect ERROR/WARN/INFO/DEBUG tokens on plain-string lines. */
3828
+ readonly autoLevel: _angular_core.InputSignalWithTransform<boolean, unknown>;
3829
+ /** Localizable strings. */
3830
+ readonly title: _angular_core.InputSignal<string>;
3831
+ readonly followLabel: _angular_core.InputSignal<string>;
3832
+ readonly wrapLabel: _angular_core.InputSignal<string>;
3833
+ readonly linesLabel: _angular_core.InputSignal<string>;
3834
+ readonly emptyLabel: _angular_core.InputSignal<string>;
3835
+ private readonly scroller;
3836
+ private readonly scrollTop;
3837
+ private suppressScrollEvent;
3838
+ private static readonly LINE_H;
3839
+ private static readonly OVERSCAN;
3840
+ protected readonly normalized: _angular_core.Signal<StrctLogLine[]>;
3841
+ protected readonly totalHeight: _angular_core.Signal<number>;
3842
+ private readonly windowStart;
3843
+ protected readonly offsetY: _angular_core.Signal<number>;
3844
+ protected readonly window: _angular_core.Signal<RenderLine[]>;
3845
+ constructor();
3846
+ protected onScroll(): void;
3847
+ protected toggleFollow(): void;
3848
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctLogViewer, never>;
3849
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctLogViewer, "strct-log-viewer", never, { "lines": { "alias": "lines"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "follow": { "alias": "follow"; "required": false; "isSignal": true; }; "wrapMode": { "alias": "wrapMode"; "required": false; "isSignal": true; }; "autoLevel": { "alias": "autoLevel"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "followLabel": { "alias": "followLabel"; "required": false; "isSignal": true; }; "wrapLabel": { "alias": "wrapLabel"; "required": false; "isSignal": true; }; "linesLabel": { "alias": "linesLabel"; "required": false; "isSignal": true; }; "emptyLabel": { "alias": "emptyLabel"; "required": false; "isSignal": true; }; }, { "follow": "followChange"; "wrapMode": "wrapModeChange"; }, never, never, true, never>;
3850
+ }
3851
+ /** Parse ANSI SGR sequences into class-tagged segments (16-color + bold). */
3852
+ declare function parseAnsi(text: string): LogSegment[];
3853
+
3854
+ /** One row of a computed line diff. */
3855
+ interface StrctDiffRow {
3856
+ type: 'ctx' | 'add' | 'del';
3857
+ oldNo: number | null;
3858
+ newNo: number | null;
3859
+ text: string;
3860
+ }
3861
+ interface DisplayRow extends StrctDiffRow {
3862
+ kind: 'row';
3863
+ }
3864
+ interface SkipRow {
3865
+ kind: 'skip';
3866
+ count: number;
3867
+ startIndex: number;
3868
+ }
3869
+ type AnyRow = DisplayRow | SkipRow;
3870
+ /** Split-view pairing: a left (old) and right (new) cell per visual row. */
3871
+ interface SplitCell {
3872
+ type: 'ctx' | 'add' | 'del' | 'empty';
3873
+ no: number | null;
3874
+ text: string;
3875
+ }
3876
+ interface SplitPair {
3877
+ kind: 'row';
3878
+ left: SplitCell;
3879
+ right: SplitCell;
3880
+ }
3881
+ type AnySplitRow = SplitPair | SkipRow;
3882
+ /**
3883
+ * Compute a line diff (LCS-based). Exported for programmatic use — change
3884
+ * counts, gating "anything changed?" logic, custom renderings.
3885
+ */
3886
+ declare function strctComputeDiff(before: string, after: string): StrctDiffRow[];
3887
+ /**
3888
+ * Config / YAML diff viewer — change-approval screens without a hand-rolled
3889
+ * diff. Unified by default, `split` for side-by-side; long unchanged runs
3890
+ * collapse to an expandable "· N unchanged lines ·" row.
3891
+ *
3892
+ * <strct-diff [before]="saved" [after]="draft" beforeLabel="Running" afterLabel="Draft" />
3893
+ *
3894
+ * Rows are marked by symbol (+/−) as well as tint, so the diff reads without
3895
+ * color — the same CVD rule the icon badges follow.
3896
+ */
3897
+ declare class StrctDiff {
3898
+ /** The two texts to compare. */
3899
+ readonly before: _angular_core.InputSignal<string>;
3900
+ readonly after: _angular_core.InputSignal<string>;
3901
+ /** Unified (default) or side-by-side split view. */
3902
+ readonly mode: _angular_core.InputSignal<"unified" | "split">;
3903
+ /** Context lines kept around changes before collapsing (0 disables collapsing). */
3904
+ readonly context: _angular_core.InputSignal<number>;
3905
+ /** Header bits. */
3906
+ readonly title: _angular_core.InputSignal<string>;
3907
+ readonly language: _angular_core.InputSignal<string>;
3908
+ readonly beforeLabel: _angular_core.InputSignal<string>;
3909
+ readonly afterLabel: _angular_core.InputSignal<string>;
3910
+ readonly copyable: _angular_core.InputSignalWithTransform<boolean, unknown>;
3911
+ readonly copyAfterLabel: _angular_core.InputSignal<string>;
3912
+ readonly unchangedLabel: _angular_core.InputSignal<string>;
3913
+ /** Scroll the body past this height (px); null grows freely. */
3914
+ readonly maxHeight: _angular_core.InputSignal<number | null>;
3915
+ private readonly expanded;
3916
+ protected readonly rows: _angular_core.Signal<StrctDiffRow[]>;
3917
+ protected readonly addCount: _angular_core.Signal<number>;
3918
+ protected readonly delCount: _angular_core.Signal<number>;
3919
+ protected readonly unifiedRows: _angular_core.Signal<AnyRow[]>;
3920
+ protected readonly splitRows: _angular_core.Signal<AnySplitRow[]>;
3921
+ /** Group rows into visible chunks and collapsible unchanged runs. */
3922
+ private readonly chunks;
3923
+ protected expand(startIndex: number): void;
3924
+ protected sign(type: string): string;
3925
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctDiff, never>;
3926
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctDiff, "strct-diff", never, { "before": { "alias": "before"; "required": true; "isSignal": true; }; "after": { "alias": "after"; "required": true; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "context": { "alias": "context"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "language": { "alias": "language"; "required": false; "isSignal": true; }; "beforeLabel": { "alias": "beforeLabel"; "required": false; "isSignal": true; }; "afterLabel": { "alias": "afterLabel"; "required": false; "isSignal": true; }; "copyable": { "alias": "copyable"; "required": false; "isSignal": true; }; "copyAfterLabel": { "alias": "copyAfterLabel"; "required": false; "isSignal": true; }; "unchangedLabel": { "alias": "unchangedLabel"; "required": false; "isSignal": true; }; "maxHeight": { "alias": "maxHeight"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
3927
+ }
3928
+
3929
+ /**
3930
+ * Two resizable panes with a draggable gutter — master/detail layouts where
3931
+ * the split is the user's to own:
3932
+ *
3933
+ * <strct-splitter [(split)]="pct" [min]="20" [max]="80">
3934
+ * <div strctPaneStart>…list…</div>
3935
+ * <div strctPaneEnd>…detail…</div>
3936
+ * </strct-splitter>
3937
+ *
3938
+ * `split` is the start pane's share in percent (two-way, persistable).
3939
+ * The gutter is a keyboard separator: arrows nudge, Home/End jump to min/max.
3940
+ */
3941
+ declare class StrctSplitter {
3942
+ private readonly host;
3943
+ /** Start pane share in percent (two-way). */
3944
+ readonly split: _angular_core.ModelSignal<number>;
3945
+ /** Clamp bounds for the split (percent). */
3946
+ readonly min: _angular_core.InputSignal<number>;
3947
+ readonly max: _angular_core.InputSignal<number>;
3948
+ /** Stack panes vertically (gutter drags up/down). */
3949
+ readonly vertical: _angular_core.InputSignal<boolean>;
3950
+ /** Accessible name of the separator (localizable). */
3951
+ readonly gutterLabel: _angular_core.InputSignal<string>;
3952
+ /** Keyboard nudge step in percent. */
3953
+ readonly step: _angular_core.InputSignal<number>;
3954
+ protected readonly clamped: _angular_core.Signal<number>;
3955
+ protected dragging: boolean;
3956
+ private moveHandler;
3957
+ private upHandler;
3958
+ protected onDragStart(event: MouseEvent): void;
3959
+ private onDragMove;
3960
+ private onDragEnd;
3961
+ protected onKeydown(event: KeyboardEvent): void;
3962
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctSplitter, never>;
3963
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctSplitter, "strct-splitter", never, { "split": { "alias": "split"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "vertical": { "alias": "vertical"; "required": false; "isSignal": true; }; "gutterLabel": { "alias": "gutterLabel"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; }, { "split": "splitChange"; }, never, ["[strctPaneStart]", "[strctPaneEnd]"], true, never>;
3964
+ }
3965
+
3966
+ /** One transferable item. */
3967
+ interface StrctTransferItem {
3968
+ id: string;
3969
+ label: string;
3970
+ icon?: string;
3971
+ disabled?: boolean;
3972
+ data?: unknown;
3973
+ }
3974
+ /**
3975
+ * Dual-list transfer (picklist) — "assign hosts to the cluster": all items on
3976
+ * the left, the chosen set on the right, checkbox multi-select and move
3977
+ * buttons in between, with a searchbox per side.
3978
+ *
3979
+ * <strct-transfer [items]="hosts" [(assigned)]="clusterHosts" />
3980
+ *
3981
+ * `assigned` is the two-way id set (string[]); `items` stays the single
3982
+ * source-of-truth list.
3983
+ */
3984
+ declare class StrctTransfer {
3985
+ /** The full item universe. */
3986
+ readonly items: _angular_core.InputSignal<StrctTransferItem[]>;
3987
+ /** Assigned item ids (two-way). */
3988
+ readonly assigned: _angular_core.ModelSignal<string[]>;
3989
+ /** Localizable strings. */
3990
+ readonly sourceLabel: _angular_core.InputSignal<string>;
3991
+ readonly targetLabel: _angular_core.InputSignal<string>;
3992
+ readonly searchPlaceholder: _angular_core.InputSignal<string>;
3993
+ readonly emptyLabel: _angular_core.InputSignal<string>;
3994
+ readonly assignLabel: _angular_core.InputSignal<string>;
3995
+ readonly unassignLabel: _angular_core.InputSignal<string>;
3996
+ /** A move happened (either direction) with the moved ids. */
3997
+ readonly moved: _angular_core.OutputEmitterRef<{
3998
+ direction: "assign" | "unassign";
3999
+ ids: string[];
4000
+ }>;
4001
+ protected readonly sourceQuery: _angular_core.WritableSignal<string>;
4002
+ protected readonly targetQuery: _angular_core.WritableSignal<string>;
4003
+ protected readonly sourceChecked: _angular_core.WritableSignal<Set<string>>;
4004
+ protected readonly targetChecked: _angular_core.WritableSignal<Set<string>>;
4005
+ private readonly assignedSet;
4006
+ protected readonly sourceItems: _angular_core.Signal<StrctTransferItem[]>;
4007
+ protected readonly targetItems: _angular_core.Signal<StrctTransferItem[]>;
4008
+ private matches;
4009
+ protected toggle(which: typeof this.sourceChecked | typeof this.targetChecked, id: string): void;
4010
+ protected assign(): void;
4011
+ protected unassign(): void;
4012
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctTransfer, never>;
4013
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctTransfer, "strct-transfer", never, { "items": { "alias": "items"; "required": true; "isSignal": true; }; "assigned": { "alias": "assigned"; "required": false; "isSignal": true; }; "sourceLabel": { "alias": "sourceLabel"; "required": false; "isSignal": true; }; "targetLabel": { "alias": "targetLabel"; "required": false; "isSignal": true; }; "searchPlaceholder": { "alias": "searchPlaceholder"; "required": false; "isSignal": true; }; "emptyLabel": { "alias": "emptyLabel"; "required": false; "isSignal": true; }; "assignLabel": { "alias": "assignLabel"; "required": false; "isSignal": true; }; "unassignLabel": { "alias": "unassignLabel"; "required": false; "isSignal": true; }; }, { "assigned": "assignedChange"; "moved": "moved"; }, never, never, true, never>;
4014
+ }
4015
+
4016
+ /**
4017
+ * Split button — a primary action plus a chevron opening its variants
4018
+ * (Fluent's pattern): "Deploy ▾ → Deploy with snapshot / Deploy paused".
4019
+ *
4020
+ * <strct-split-button label="Deploy" [items]="variants"
4021
+ * (action)="deploy()" (picked)="run($event)" />
4022
+ *
4023
+ * The main segment fires `(action)`; menu entries fire `(picked)`.
4024
+ */
4025
+ declare class StrctSplitButton {
4026
+ /** Main action label. */
4027
+ readonly label: _angular_core.InputSignal<string>;
4028
+ /** Menu entries (StrctMenuItem: id, label, icon?, critical?, disabled?). */
4029
+ readonly items: _angular_core.InputSignal<StrctMenuItem[]>;
4030
+ /** Optional leading icon of the main segment. */
4031
+ readonly icon: _angular_core.InputSignal<string>;
4032
+ /** Filled (solid accent) look. */
4033
+ readonly solid: _angular_core.InputSignalWithTransform<boolean, unknown>;
4034
+ /** Disable both segments. */
4035
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
4036
+ /** Accessible name of the chevron (localizable). */
4037
+ readonly menuLabel: _angular_core.InputSignal<string>;
4038
+ /** The main segment was clicked. */
4039
+ readonly action: _angular_core.OutputEmitterRef<void>;
4040
+ /** A menu entry was chosen. */
4041
+ readonly picked: _angular_core.OutputEmitterRef<StrctMenuItem>;
4042
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctSplitButton, never>;
4043
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctSplitButton, "strct-split-button", never, { "label": { "alias": "label"; "required": true; "isSignal": true; }; "items": { "alias": "items"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "solid": { "alias": "solid"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "menuLabel": { "alias": "menuLabel"; "required": false; "isSignal": true; }; }, { "action": "action"; "picked": "picked"; }, never, never, true, never>;
4044
+ }
4045
+
4046
+ /**
4047
+ * Repeating diagonal text watermark over its content — compliance overlays
4048
+ * for classified/internal consoles ("CONFIDENTIAL", "user@corp · 2026-07-21"):
4049
+ *
4050
+ * <strct-watermark text="CONFIDENTIAL">…page…</strct-watermark>
4051
+ *
4052
+ * Rendered as a pointer-transparent tiled SVG layer, so the content below
4053
+ * stays fully interactive and selectable. Purely visual — `aria-hidden`.
4054
+ */
4055
+ declare class StrctWatermark {
4056
+ private readonly sanitizer;
4057
+ /** The repeated watermark text. */
4058
+ readonly text: _angular_core.InputSignal<string>;
4059
+ /** Layer opacity (0–1). */
4060
+ readonly opacity: _angular_core.InputSignal<number>;
4061
+ /** Rotation in degrees (negative = up-slope). */
4062
+ readonly angle: _angular_core.InputSignal<number>;
4063
+ /** Tile size in px — larger spreads the marks out. */
4064
+ readonly gap: _angular_core.InputSignal<number>;
4065
+ /** Font size in px. */
4066
+ readonly fontSize: _angular_core.InputSignal<number>;
4067
+ protected readonly tile: _angular_core.Signal<SafeStyle>;
4068
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctWatermark, never>;
4069
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctWatermark, "strct-watermark", never, { "text": { "alias": "text"; "required": true; "isSignal": true; }; "opacity": { "alias": "opacity"; "required": false; "isSignal": true; }; "angle": { "alias": "angle"; "required": false; "isSignal": true; }; "gap": { "alias": "gap"; "required": false; "isSignal": true; }; "fontSize": { "alias": "fontSize"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
4070
+ }
4071
+
4072
+ /** One coach-mark step. `target` is a CSS selector; null centers the card. */
4073
+ interface StrctTourStep {
4074
+ target: string | null;
4075
+ title: string;
4076
+ body: string;
4077
+ }
4078
+ /**
4079
+ * Feature tour (coach marks) — "what's new" onboarding over live UI:
4080
+ *
4081
+ * <strct-tour [(open)]="tourOpen" [steps]="steps" (finished)="done()" />
4082
+ *
4083
+ * Each step spotlights its `target` selector with a ring cut out of a dimmed
4084
+ * backdrop and anchors a card next to it. Arrows / buttons step, Escape
4085
+ * closes, and the card is a labeled dialog. Purely DOM-driven: targets are
4086
+ * looked up when the step shows, so it works over any page.
4087
+ */
4088
+ declare class StrctTour {
4089
+ /** Whether the tour is showing (two-way). */
4090
+ readonly open: _angular_core.ModelSignal<boolean>;
4091
+ /** The steps, in order. */
4092
+ readonly steps: _angular_core.InputSignal<StrctTourStep[]>;
4093
+ /** Localizable strings. */
4094
+ readonly nextLabel: _angular_core.InputSignal<string>;
4095
+ readonly backLabel: _angular_core.InputSignal<string>;
4096
+ readonly skipLabel: _angular_core.InputSignal<string>;
4097
+ readonly doneLabel: _angular_core.InputSignal<string>;
4098
+ /** The last step's Done was clicked (Escape / Skip emit `dismissed`). */
4099
+ readonly finished: _angular_core.OutputEmitterRef<void>;
4100
+ readonly dismissed: _angular_core.OutputEmitterRef<void>;
4101
+ protected readonly index: _angular_core.WritableSignal<number>;
4102
+ /** Bumped on open/step/resize to re-measure the target. */
4103
+ private readonly measureTick;
4104
+ protected readonly current: _angular_core.Signal<StrctTourStep>;
4105
+ protected readonly spot: _angular_core.Signal<{
4106
+ top: number;
4107
+ left: number;
4108
+ width: number;
4109
+ height: number;
4110
+ } | null>;
4111
+ protected readonly cardPos: _angular_core.Signal<{
4112
+ top: number;
4113
+ left: number;
4114
+ }>;
4115
+ constructor();
4116
+ protected next(): void;
4117
+ protected prev(): void;
4118
+ protected close(): void;
4119
+ private scrollToTarget;
4120
+ protected onEscape(): void;
4121
+ protected onReflow(): void;
4122
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctTour, never>;
4123
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctTour, "strct-tour", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "steps": { "alias": "steps"; "required": true; "isSignal": true; }; "nextLabel": { "alias": "nextLabel"; "required": false; "isSignal": true; }; "backLabel": { "alias": "backLabel"; "required": false; "isSignal": true; }; "skipLabel": { "alias": "skipLabel"; "required": false; "isSignal": true; }; "doneLabel": { "alias": "doneLabel"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "finished": "finished"; "dismissed": "dismissed"; }, never, never, true, never>;
4124
+ }
4125
+
4126
+ /** One top-level menubar entry with its menu. */
4127
+ interface StrctMenubarItem {
4128
+ id: string;
4129
+ label: string;
4130
+ items: StrctMenuItem[];
4131
+ }
4132
+ /**
4133
+ * Horizontal menubar — the application-menu strip ("File · Edit · View") for
4134
+ * dense tool-style consoles:
4135
+ *
4136
+ * <strct-menubar [menus]="menus" (picked)="run($event)" />
4137
+ *
4138
+ * Click (or Enter/Down) opens a menu; Left/Right move across the bar and,
4139
+ * while open, switch the open menu (the APG menubar convention). Escape and
4140
+ * outside click close. `(picked)` carries `{ menu, item }`.
4141
+ */
4142
+ declare class StrctMenubar {
4143
+ private readonly host;
4144
+ /** Top-level menus. */
4145
+ readonly menus: _angular_core.InputSignal<StrctMenubarItem[]>;
4146
+ /** Accessible name of the bar (localizable). */
4147
+ readonly ariaLabel: _angular_core.InputSignal<string>;
4148
+ /** A menu entry was chosen. */
4149
+ readonly picked: _angular_core.OutputEmitterRef<{
4150
+ menu: StrctMenubarItem;
4151
+ item: StrctMenuItem;
4152
+ }>;
4153
+ protected readonly openId: _angular_core.WritableSignal<string | null>;
4154
+ protected readonly focusIdx: _angular_core.WritableSignal<number>;
4155
+ protected toggleMenu(id: string, i: number): void;
4156
+ protected pick(menu: StrctMenubarItem, item: StrctMenuItem): void;
4157
+ protected onTopKey(event: KeyboardEvent, i: number): void;
4158
+ protected onDocClick(event: MouseEvent): void;
4159
+ protected onEscape(): void;
4160
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctMenubar, never>;
4161
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctMenubar, "strct-menubar", never, { "menus": { "alias": "menus"; "required": true; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "picked": "picked"; }, never, never, true, never>;
4162
+ }
4163
+
4164
+ /**
4165
+ * Screen-reader announcements for state changes that have no visible text —
4166
+ * "12 rows loaded", "Snapshot created" (Material's LiveAnnouncer, strct-sized):
4167
+ *
4168
+ * private announcer = inject(StrctAnnouncer);
4169
+ * this.announcer.announce('12 rows loaded');
4170
+ *
4171
+ * Maintains one visually-hidden live region per politeness level; repeated
4172
+ * identical messages are re-announced (the region is cleared first).
4173
+ */
4174
+ declare class StrctAnnouncer implements OnDestroy {
4175
+ private regions;
4176
+ private clearTimer;
4177
+ announce(message: string, politeness?: 'polite' | 'assertive'): void;
4178
+ private regionFor;
4179
+ ngOnDestroy(): void;
4180
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctAnnouncer, never>;
4181
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<StrctAnnouncer>;
4182
+ }
4183
+
4184
+ /** A registered application hotkey. */
4185
+ interface StrctHotkey {
4186
+ /** Combo like `'ctrl+k'`, `'meta+shift+p'`, `'?'` — `mod` = Ctrl/⌘. */
4187
+ combo: string;
4188
+ /** Human description shown in the help overlay. */
4189
+ description: string;
4190
+ /** Help-overlay group heading. */
4191
+ group?: string;
4192
+ handler: (event: KeyboardEvent) => void;
4193
+ }
4194
+ /**
4195
+ * Application hotkeys, centrally registered so they are discoverable — the
4196
+ * Blueprint pattern:
4197
+ *
4198
+ * private hotkeys = inject(StrctHotkeysService);
4199
+ * ngOnInit() { this.dispose = this.hotkeys.register(
4200
+ * { combo: 'mod+k', description: 'Open command palette', group: 'Global',
4201
+ * handler: () => this.palette.open() }); }
4202
+ *
4203
+ * Combos: `'a'`, `'?'`, `'ctrl+k'`, `'meta+shift+p'`, `'mod+k'` (mod = Ctrl/⌘).
4204
+ * Plain-key combos are suppressed while typing in inputs / textareas /
4205
+ * contenteditable; modifier combos always fire. Pair with
4206
+ * `<strct-hotkeys-help/>` for the ⌘/ ("?") cheatsheet overlay.
4207
+ */
4208
+ declare class StrctHotkeysService implements OnDestroy {
4209
+ private readonly registry;
4210
+ /** All registered hotkeys (for the help overlay). */
4211
+ readonly hotkeys: _angular_core.Signal<StrctHotkey[]>;
4212
+ private readonly listener;
4213
+ constructor();
4214
+ /** Register a hotkey; the returned function unregisters it. */
4215
+ register(hotkey: StrctHotkey): () => void;
4216
+ private onKeydown;
4217
+ ngOnDestroy(): void;
4218
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctHotkeysService, never>;
4219
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<StrctHotkeysService>;
4220
+ }
4221
+ /**
4222
+ * The hotkey cheatsheet overlay. Mount once near the app root; it registers
4223
+ * `?` itself and lists everything in the service, grouped:
4224
+ *
4225
+ * <strct-hotkeys-help />
4226
+ */
4227
+ declare class StrctHotkeysHelp {
4228
+ private readonly service;
4229
+ /** Overlay visibility (two-way; `?` toggles it too). */
4230
+ readonly open: _angular_core.ModelSignal<boolean>;
4231
+ /** Localizable strings. */
4232
+ readonly title: _angular_core.InputSignal<string>;
4233
+ readonly emptyText: _angular_core.InputSignal<string>;
4234
+ protected readonly grouped: _angular_core.Signal<{
4235
+ name: string;
4236
+ keys: StrctHotkey[];
4237
+ }[]>;
4238
+ constructor();
4239
+ protected onEscape(): void;
4240
+ protected parts(combo: string): string[];
4241
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctHotkeysHelp, never>;
4242
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctHotkeysHelp, "strct-hotkeys-help", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "emptyText": { "alias": "emptyText"; "required": false; "isSignal": true; }; }, { "open": "openChange"; }, never, never, true, never>;
4243
+ }
4244
+
4245
+ /** A completed reorder: move the item at `from` to `to` in your array. */
4246
+ interface StrctReorderEvent {
4247
+ from: number;
4248
+ to: number;
4249
+ }
4250
+ /**
4251
+ * List drag-reorder primitive — the consumer owns the array:
4252
+ *
4253
+ * <ul strctReorder (reordered)="move($event)">
4254
+ * @for (s of steps(); track s.id) {
4255
+ * <li strctReorderItem>{{ s.label }}</li>
4256
+ * }
4257
+ * </ul>
4258
+ *
4259
+ * move({ from, to }: StrctReorderEvent) {
4260
+ * this.steps.update((s) => { const c = [...s]; c.splice(to, 0, ...c.splice(from, 1)); return c; });
4261
+ * }
4262
+ *
4263
+ * Items are HTML5-draggable; keyboard reorder is Alt+ArrowUp / Alt+ArrowDown
4264
+ * on the focused item (items get `tabindex="0"` unless they already manage
4265
+ * focus). Indexes are positions among the `strctReorderItem` siblings.
4266
+ */
4267
+ declare class StrctReorder {
4268
+ private readonly host;
4269
+ /** Emits when a drag or keyboard move completes. */
4270
+ readonly reordered: _angular_core.OutputEmitterRef<StrctReorderEvent>;
4271
+ /** Disable all reordering (display-only mode). */
4272
+ readonly reorderDisabled: _angular_core.InputSignal<boolean>;
4273
+ readonly dragIndex: _angular_core.WritableSignal<number | null>;
4274
+ readonly overIndex: _angular_core.WritableSignal<number | null>;
4275
+ items(): HTMLElement[];
4276
+ indexOf(el: HTMLElement): number;
4277
+ commit(from: number, to: number): void;
4278
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctReorder, never>;
4279
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<StrctReorder, "[strctReorder]", never, { "reorderDisabled": { "alias": "reorderDisabled"; "required": false; "isSignal": true; }; }, { "reordered": "reordered"; }, never, never, true, never>;
4280
+ }
4281
+ /** One draggable row inside a `[strctReorder]` container. */
4282
+ declare class StrctReorderItem {
4283
+ protected readonly list: StrctReorder;
4284
+ private readonly el;
4285
+ private readonly hadOwnTabindex;
4286
+ protected hostTabindex(): number | null;
4287
+ protected isDragging(): boolean;
4288
+ protected isOver(): boolean;
4289
+ private index;
4290
+ protected onDragStart(event: DragEvent): void;
4291
+ protected onDragOver(event: DragEvent): void;
4292
+ protected onDrop(event: DragEvent): void;
4293
+ protected onDragEnd(): void;
4294
+ protected onKeydown(event: KeyboardEvent): void;
4295
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctReorderItem, never>;
4296
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<StrctReorderItem, "[strctReorderItem]", never, {}, {}, never, never, true, never>;
4297
+ }
4298
+
4299
+ export { STRCT_ICONS, STRCT_ICON_GROUPS, STRCT_ICON_NAMES, STRCT_MASKS, STRCT_PALETTES, STRCT_RAW_ICONS, STRCT_TIME_RANGE_PRESETS, StrctAccordion, StrctAccordionPanel, StrctAlert, StrctAnnouncer, StrctAvatar, StrctBadge, StrctBreadcrumb, StrctBreadcrumbItem, StrctButton, StrctButtonGroup, StrctBytesPipe, StrctCard, StrctCardBlock, StrctCardFooter, StrctCardHeader, StrctCascadeHost, StrctCascadeNode, StrctCascadeSelect, StrctCellDef, StrctCellStatus, StrctChart, StrctCheckbox, StrctChips, StrctCode, StrctColorPicker, StrctCombobox, StrctCommandPalette, StrctContextMenu, StrctContextMenuTrigger, StrctCopy, StrctDatagrid, StrctDatagridActionBar, StrctDatepicker, StrctDesc, StrctDescriptionList, StrctDiff, StrctDivider, StrctDonut, StrctDrawer, StrctDrawerFooter, StrctDropdown, StrctDropdownDivider, StrctDropdownItem, StrctDropdownTrigger, StrctDurationPipe, StrctEmptyState, StrctField, StrctFile, StrctFilterBar, StrctFlow, StrctFooter, StrctGauge, StrctHeader, StrctHero, StrctHotkeysHelp, StrctHotkeysService, StrctIcon, StrctInput, StrctInputMask, StrctInputOtp, StrctKbd, StrctKnob, StrctLogViewer, StrctLogin, StrctMenuPanel, StrctMenuService, StrctMenubar, StrctMetricTile, StrctModal, StrctNav, StrctNavItem, StrctOverlay, StrctPageHeader, StrctPageHeaderActions, StrctPageHeaderCrumbs, StrctPagination, StrctPassword, StrctProgress, StrctRadio, StrctRadioGroup, StrctRail, StrctRange, StrctRatePipe, StrctRating, StrctReorder, StrctReorderItem, StrctRowDetailDef, StrctSearchbox, StrctSectionMenu, StrctSegmented, StrctShell, StrctShellService, StrctSiPipe, StrctSignpost, StrctSkeleton, StrctSparkline, StrctSpeedDial, StrctSpinner, StrctSplitButton, StrctSplitter, StrctStack, StrctStackItem, StrctStep, StrctSubmenu, StrctTab, StrctTable, StrctTabs, StrctTag, StrctThemeService, StrctThemeSwitcher, StrctTimeRangePicker, StrctTimeline, StrctTimelineItem, StrctToastOutlet, StrctToastService, StrctToggle, StrctTooltip, StrctTour, StrctTransfer, StrctTree, StrctTreeNode, StrctVerticalNav, StrctWatermark, StrctWizard, parseAnsi, registerStrctIcon, strctComputeDiff, strctFormatBytes, strctFormatDuration, strctFormatRate, strctFormatSi, strctValidationIcon, strctValidationTone };
4300
+ export type { StrctAlertType, StrctAvatarSize, StrctAvatarStatus, StrctBadgeStatus, StrctButtonSize, StrctButtonVariant, StrctCascadeOption, StrctCellContext, StrctChartAnnotation, StrctChartColor, StrctChartCurve, StrctChartSeries, StrctChartSlot, StrctChartStatus, StrctChartThreshold, StrctChartType, StrctColumn, StrctCommandItem, StrctDatagridColumn, StrctDatagridColumnState, StrctDatagridFilters, StrctDatagridLabels, StrctDatagridLazyState, StrctDescAlign, StrctDescItem, StrctDiffRow, StrctDonutSegment, StrctDrawerSide, StrctDrawerSize, StrctEmptyVariant, StrctFilterChip, StrctFlowDirection, StrctFlowNode, StrctFlowOrientation, StrctHotkey, StrctIconBadge, StrctIconName, StrctKnobStatus, StrctLogLine, StrctMenuItem, StrctMenuLink, StrctMenuOpenOptions, StrctMenuSection, StrctMenubarItem, StrctMetricStatus, StrctModalSize, StrctMode, StrctOption, StrctOverlayPlacement, StrctPalette, StrctPaletteInfo, StrctProgressStatus, StrctRailItem, StrctRailStatus, StrctReorderEvent, StrctRow, StrctRowId, StrctSegmentedOption, StrctSegmentedSize, StrctSignpostPosition, StrctSpeedDialDirection, StrctSpinnerSize, StrctStatus, StrctTagStatus, StrctThresholds, StrctTimeRange, StrctTimeRangePreset, StrctTimelineState, StrctToast, StrctToastOptions, StrctToastType, StrctTooltipPosition, StrctTourStep, StrctTransferItem, StrctTreeMenuEvent, StrctTreeNodeData, StrctTreeNodeMenuFn, StrctValidationState, StrctValidationStatus };