@akcelik/strct 1.5.0 → 1.10.2

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
 
@@ -93,11 +93,214 @@ interface StrctThresholds {
93
93
  * storage, VMs …). Object state — running / stopped / maintenance — is layered
94
94
  * on with the `badge` input rather than a separate icon per state.
95
95
  */
96
+ declare const STRCT_ICON_DEFS: {
97
+ hexagon: string;
98
+ chevronRight: string;
99
+ chevronLeft: string;
100
+ chevronDoubleRight: string;
101
+ chevronDown: string;
102
+ compass: string;
103
+ close: string;
104
+ check: string;
105
+ menu: string;
106
+ dots: string;
107
+ ellipsis: string;
108
+ search: string;
109
+ calendar: string;
110
+ eye: string;
111
+ upload: string;
112
+ download: string;
113
+ droplet: string;
114
+ sortAsc: string;
115
+ sortDesc: string;
116
+ sortNone: string;
117
+ sun: string;
118
+ moon: string;
119
+ info: string;
120
+ warning: string;
121
+ critical: string;
122
+ success: string;
123
+ bell: string;
124
+ heart: string;
125
+ layers: string;
126
+ grid: string;
127
+ form: string;
128
+ chart: string;
129
+ bars: string;
130
+ sidebar: string;
131
+ palette: string;
132
+ gauge: string;
133
+ copy: string;
134
+ code: string;
135
+ book: string;
136
+ terminal: string;
137
+ folder: string;
138
+ template: string;
139
+ file: string;
140
+ clipboard: string;
141
+ tag: string;
142
+ plus: string;
143
+ minus: string;
144
+ pencil: string;
145
+ trash: string;
146
+ refresh: string;
147
+ filter: string;
148
+ settings: string;
149
+ user: string;
150
+ logout: string;
151
+ undo: string;
152
+ redo: string;
153
+ arrowUp: string;
154
+ arrowDown: string;
155
+ arrowLeft: string;
156
+ arrowRight: string;
157
+ externalLink: string;
158
+ datacenter: string;
159
+ rack: string;
160
+ cluster: string;
161
+ host: string;
162
+ vm: string;
163
+ switch: string;
164
+ storage: string;
165
+ network: string;
166
+ cpu: string;
167
+ memory: string;
168
+ disk: string;
169
+ port: string;
170
+ power: string;
171
+ nic: string;
172
+ hba: string;
173
+ ethernet: string;
174
+ resourcePool: string;
175
+ portGroup: string;
176
+ pod: string;
177
+ deployment: string;
178
+ service: string;
179
+ node: string;
180
+ ingress: string;
181
+ cloud: string;
182
+ container: string;
183
+ firewall: string;
184
+ shield: string;
185
+ certificate: string;
186
+ key: string;
187
+ metrics: string;
188
+ logs: string;
189
+ trace: string;
190
+ universalAccess: string;
191
+ wheelchair: string;
192
+ hearing: string;
193
+ lowVision: string;
194
+ braille: string;
195
+ signLanguage: string;
196
+ siren: string;
197
+ alarm: string;
198
+ megaphone: string;
199
+ flag: string;
200
+ shieldAlert: string;
201
+ rocket: string;
202
+ shieldCheck: string;
203
+ running: string;
204
+ stopped: string;
205
+ paused: string;
206
+ maintenance: string;
207
+ sync: string;
208
+ snapshot: string;
209
+ lock: string;
210
+ clock: string;
211
+ history: string;
212
+ timer: string;
213
+ hourglass: string;
214
+ mail: string;
215
+ chat: string;
216
+ help: string;
217
+ home: string;
218
+ link: string;
219
+ globe: string;
220
+ star: string;
221
+ pin: string;
222
+ share: string;
223
+ archive: string;
224
+ zoomIn: string;
225
+ zoomOut: string;
226
+ fullscreen: string;
227
+ exitFullscreen: string;
228
+ listView: string;
229
+ dragHandle: string;
230
+ chevronUp: string;
231
+ chevronDoubleLeft: string;
232
+ chevronDoubleUp: string;
233
+ chevronDoubleDown: string;
234
+ dns: string;
235
+ vpn: string;
236
+ api: string;
237
+ bolt: string;
238
+ queue: string;
239
+ users: string;
240
+ login: string;
241
+ unlock: string;
242
+ ban: string;
243
+ vendorVmware: string;
244
+ vendorCisco: string;
245
+ vendorHpe: string;
246
+ vendorDell: string;
247
+ vendorKaytus: string;
248
+ opticalDisc: string;
249
+ ssd: string;
250
+ usb: string;
251
+ sdCard: string;
252
+ tape: string;
253
+ gpu: string;
254
+ psu: string;
255
+ fan: string;
256
+ battery: string;
257
+ ups: string;
258
+ motherboard: string;
259
+ sensor: string;
260
+ thermometer: string;
261
+ sparkles: string;
262
+ brain: string;
263
+ robot: string;
264
+ neuralNetwork: string;
265
+ aiChip: string;
266
+ wand: string;
267
+ model: string;
268
+ router: string;
269
+ loadBalancer: string;
270
+ wifi: string;
271
+ bluetooth: string;
272
+ monitor: string;
273
+ keyboard: string;
274
+ printer: string;
275
+ };
276
+ declare const STRCT_ICON_DERIVED_DEFS: {
277
+ eyeOff: string;
278
+ bellOff: string;
279
+ wifiOff: string;
280
+ cloudOff: string;
281
+ linkOff: string;
282
+ unlink: string;
283
+ webhook: string;
284
+ };
285
+ /**
286
+ * Every built-in icon name, as a compile-time union — a mistyped name is a
287
+ * build error instead of a silently empty box:
288
+ *
289
+ * const icon: StrctIconName = 'shieldCheck'; // ✓
290
+ * const icon: StrctIconName = 'sheildCheck'; // ✗ compile error
291
+ */
292
+ type StrctIconName = keyof typeof STRCT_ICON_DEFS | keyof typeof STRCT_ICON_DERIVED_DEFS;
293
+ /**
294
+ * Icon name → glyph markup. Open (`Record<string, string>`) on purpose so
295
+ * `registerStrctIcon` can add app-specific names at runtime.
296
+ */
96
297
  declare const STRCT_ICONS: Record<string, string>;
298
+ /** All built-in icon names — greppable, iterable (galleries, docs, tests). */
299
+ declare const STRCT_ICON_NAMES: readonly StrctIconName[];
97
300
  /** Icon names grouped for galleries / documentation. */
98
301
  declare const STRCT_ICON_GROUPS: {
99
302
  label: string;
100
- names: string[];
303
+ names: StrctIconName[];
101
304
  }[];
102
305
  /**
103
306
  * Full-SVG icons that keep their own viewBox and colors (no stroke wrapper).
@@ -123,15 +326,13 @@ declare function registerStrctIcon(name: string, content: string, options?: {
123
326
  * green disc ▶ running · amber disc ⏸ paused · grey disc ■ off.
124
327
  */
125
328
  type StrctIconBadge = 'none' | 'success' | 'warning' | 'critical' | 'running' | 'paused' | 'off' | 'info' | 'maintenance';
126
- /**
127
- * Inline stroke icon. `<strct-icon name="host" badge="success" />` renders the host
128
- * glyph with a green status dot (a "running host"). Unknown names render
129
- * nothing rather than throwing.
130
- */
131
329
  declare class StrctIcon {
132
330
  private readonly sanitizer;
133
- /** Icon name from the STRCT_ICONS registry. */
134
- readonly name: _angular_core.InputSignal<string>;
331
+ /**
332
+ * Icon name. Typed to autocomplete the built-in set while still accepting
333
+ * any string, since `registerStrctIcon` can add names at runtime.
334
+ */
335
+ readonly name: _angular_core.InputSignal<StrctIconName | (string & {})>;
135
336
  /** Icon size in pixels. */
136
337
  readonly size: _angular_core.InputSignal<number>;
137
338
  /** Stroke width for outline icons. */
@@ -988,18 +1189,49 @@ declare class StrctDrawer {
988
1189
  * <strct-dropdown-item>Rename</strct-dropdown-item>
989
1190
  * <strct-dropdown-item critical>Delete</strct-dropdown-item>
990
1191
  * </strct-dropdown>
1192
+ *
1193
+ * With `popover`, the panel holds *form controls* instead of menu items: an
1194
+ * inner click no longer closes it (only outside click / Escape do), and the
1195
+ * semantics switch from `role="menu"` to a labeled `role="dialog"` — a panel
1196
+ * of selects is not a menu to a screen reader either:
1197
+ *
1198
+ * <strct-dropdown popover popoverLabel="Filters">
1199
+ * <button strct-button strctDropdownTrigger>Filters</button>
1200
+ * <strct-field label="Severity">…</strct-field>
1201
+ * </strct-dropdown>
991
1202
  */
992
1203
  declare class StrctDropdown {
993
1204
  private readonly host;
994
1205
  /** Horizontal alignment of the menu. */
995
1206
  readonly align: _angular_core.InputSignal<"end" | "start">;
1207
+ /**
1208
+ * Popover mode for panels holding form controls (filter/settings panels):
1209
+ * inner clicks never close the panel — only outside click / Escape do —
1210
+ * and it renders as a labeled `role="dialog"` instead of a menu.
1211
+ */
1212
+ readonly popover: _angular_core.InputSignalWithTransform<boolean, unknown>;
1213
+ /** Accessible name of the popover dialog (localizable). */
1214
+ readonly popoverLabel: _angular_core.InputSignal<string>;
996
1215
  readonly open: _angular_core.WritableSignal<boolean>;
1216
+ constructor();
997
1217
  toggle(): void;
998
1218
  close(): void;
1219
+ /** Menu items close on activation; popover form controls never do. */
1220
+ protected onInnerActivate(): void;
999
1221
  protected onDocClick(event: MouseEvent): void;
1000
1222
  protected onEscape(): void;
1001
1223
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctDropdown, never>;
1002
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctDropdown, "strct-dropdown", never, { "align": { "alias": "align"; "required": false; "isSignal": true; }; }, {}, never, ["[strctDropdownTrigger]", "*"], true, never>;
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>;
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>;
1003
1235
  }
1004
1236
  /** A selectable row inside a `<strct-dropdown>`. */
1005
1237
  declare class StrctDropdownItem {
@@ -1261,9 +1493,24 @@ declare class StrctCommandPalette {
1261
1493
  readonly emptyText: _angular_core.InputSignal<string>;
1262
1494
  /** Maximum rendered results. */
1263
1495
  readonly maxResults: _angular_core.InputSignal<number>;
1496
+ /**
1497
+ * Internal ranked filtering. Set `false` for a **server-backed** palette:
1498
+ * items render in the order given (you already filtered them) and the query
1499
+ * reaches you through the two-way `query` model. `maxResults` still caps
1500
+ * rendering.
1501
+ */
1502
+ readonly filter: _angular_core.InputSignalWithTransform<boolean, unknown>;
1503
+ /** Show a "searching" row while server results are in flight. */
1504
+ readonly loading: _angular_core.InputSignalWithTransform<boolean, unknown>;
1505
+ /** Localizable text of the loading row. */
1506
+ readonly loadingText: _angular_core.InputSignal<string>;
1264
1507
  /** Emitted when a command is chosen (Enter or click); the palette closes. */
1265
1508
  readonly picked: _angular_core.OutputEmitterRef<StrctCommandItem>;
1266
- protected readonly query: _angular_core.WritableSignal<string>;
1509
+ /**
1510
+ * The typed query (two-way). The palette still owns typing and keyboard
1511
+ * behaviour; consumers observe it to serve results asynchronously.
1512
+ */
1513
+ readonly query: _angular_core.ModelSignal<string>;
1267
1514
  protected readonly activeIndex: _angular_core.WritableSignal<number>;
1268
1515
  protected readonly listId: string;
1269
1516
  private previousActive;
@@ -1279,7 +1526,7 @@ declare class StrctCommandPalette {
1279
1526
  protected pick(item: StrctCommandItem): void;
1280
1527
  protected close(): void;
1281
1528
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctCommandPalette, never>;
1282
- 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>;
1529
+ 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; }; "filter": { "alias": "filter"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "loadingText": { "alias": "loadingText"; "required": false; "isSignal": true; }; "query": { "alias": "query"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "picked": "picked"; "query": "queryChange"; }, never, never, true, never>;
1283
1530
  }
1284
1531
 
1285
1532
  /**
@@ -1395,6 +1642,12 @@ declare class StrctCode {
1395
1642
  readonly collapsed: _angular_core.ModelSignal<boolean>;
1396
1643
  /** Show a line-number gutter (numbers are never copied — `code` is). */
1397
1644
  readonly lineNumbers: _angular_core.InputSignalWithTransform<boolean, unknown>;
1645
+ /**
1646
+ * Soft-wrap long unbroken text (PEM/CSR blocks, base64, long commands) so a
1647
+ * dialog never scrolls horizontally. Wrapping breaks the gutter's visual
1648
+ * alignment, so `wrap` takes precedence and hides `lineNumbers`.
1649
+ */
1650
+ readonly wrap: _angular_core.InputSignalWithTransform<boolean, unknown>;
1398
1651
  /** Scroll the body past this height (px); null grows freely. */
1399
1652
  readonly maxHeight: _angular_core.InputSignal<number | null>;
1400
1653
  /** Localizable labels for the collapse toggle. */
@@ -1402,7 +1655,7 @@ declare class StrctCode {
1402
1655
  readonly expandLabel: _angular_core.InputSignal<string>;
1403
1656
  protected readonly lineNos: _angular_core.Signal<number[]>;
1404
1657
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctCode, never>;
1405
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctCode, "strct-code", never, { "code": { "alias": "code"; "required": true; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "language": { "alias": "language"; "required": false; "isSignal": true; }; "copyable": { "alias": "copyable"; "required": false; "isSignal": true; }; "collapsible": { "alias": "collapsible"; "required": false; "isSignal": true; }; "collapsed": { "alias": "collapsed"; "required": false; "isSignal": true; }; "lineNumbers": { "alias": "lineNumbers"; "required": false; "isSignal": true; }; "maxHeight": { "alias": "maxHeight"; "required": false; "isSignal": true; }; "collapseLabel": { "alias": "collapseLabel"; "required": false; "isSignal": true; }; "expandLabel": { "alias": "expandLabel"; "required": false; "isSignal": true; }; }, { "collapsed": "collapsedChange"; }, never, never, true, never>;
1658
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctCode, "strct-code", never, { "code": { "alias": "code"; "required": true; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "language": { "alias": "language"; "required": false; "isSignal": true; }; "copyable": { "alias": "copyable"; "required": false; "isSignal": true; }; "collapsible": { "alias": "collapsible"; "required": false; "isSignal": true; }; "collapsed": { "alias": "collapsed"; "required": false; "isSignal": true; }; "lineNumbers": { "alias": "lineNumbers"; "required": false; "isSignal": true; }; "wrap": { "alias": "wrap"; "required": false; "isSignal": true; }; "maxHeight": { "alias": "maxHeight"; "required": false; "isSignal": true; }; "collapseLabel": { "alias": "collapseLabel"; "required": false; "isSignal": true; }; "expandLabel": { "alias": "expandLabel"; "required": false; "isSignal": true; }; }, { "collapsed": "collapsedChange"; }, never, never, true, never>;
1406
1659
  }
1407
1660
 
1408
1661
  /** One active filter chip in a {@link StrctFilterBar}. */
@@ -2231,6 +2484,11 @@ interface StrctDatagridLabels {
2231
2484
  chooseColumns: string;
2232
2485
  refresh: string;
2233
2486
  actions: string;
2487
+ filterColumn: string;
2488
+ filterPlaceholder: string;
2489
+ clearFilter: string;
2490
+ editCell: string;
2491
+ toggleChildren: string;
2234
2492
  }
2235
2493
  /** Resolves a stable identity for a row: a property key, or a function. */
2236
2494
  type StrctRowId = string | ((row: StrctRow) => unknown);
@@ -2250,7 +2508,19 @@ interface StrctDatagridColumn {
2250
2508
  * except the last an explicit px `width` so offsets stay exact.
2251
2509
  */
2252
2510
  sticky?: boolean;
2511
+ /** Header filter popover: contains-text by default; see `filterOptions`. */
2512
+ filterable?: boolean;
2513
+ /** Distinct values for a checkbox set-filter (implies `filterable`). */
2514
+ filterOptions?: unknown[];
2515
+ /**
2516
+ * Inline cell editing: double-click opens an input; Enter / blur commit via
2517
+ * `(cellEdit)`, Escape cancels. The grid never mutates rows — apply the
2518
+ * change in your handler and pass the updated array back in.
2519
+ */
2520
+ editable?: boolean;
2253
2521
  }
2522
+ /** Per-column filter state: contains-text, or the checked value set. */
2523
+ type StrctDatagridFilters = Record<string, string | unknown[]>;
2254
2524
  type SortDir = 'asc' | 'desc';
2255
2525
  /** What the grid wants loaded in server-side (`lazy`) mode. */
2256
2526
  interface StrctDatagridLazyState {
@@ -2259,6 +2529,8 @@ interface StrctDatagridLazyState {
2259
2529
  pageSize: number;
2260
2530
  sortKey: string | null;
2261
2531
  sortDir: SortDir;
2532
+ /** Active per-column filters (empty object when none). */
2533
+ filters: StrctDatagridFilters;
2262
2534
  }
2263
2535
  /** Persistable user column preferences (widths from resize, hidden from the
2264
2536
  * chooser, order from drag-reorder). */
@@ -2367,6 +2639,11 @@ declare class StrctDatagrid {
2367
2639
  chooseColumns: string;
2368
2640
  refresh: string;
2369
2641
  actions: string;
2642
+ filterColumn: string;
2643
+ filterPlaceholder: string;
2644
+ clearFilter: string;
2645
+ editCell: string;
2646
+ toggleChildren: string;
2370
2647
  }>;
2371
2648
  /**
2372
2649
  * Virtual scrolling for large data sets: only the rows inside the viewport
@@ -2404,6 +2681,19 @@ declare class StrctDatagrid {
2404
2681
  * groups. Paging is bypassed while grouped; not combinable with `virtual`.
2405
2682
  */
2406
2683
  readonly groupBy: _angular_core.InputSignal<string | null>;
2684
+ /**
2685
+ * Two-way per-column filter state: `key → contains-text` (text filter) or
2686
+ * `key → unknown[]` (checked value set). Applied client-side; in `lazy`
2687
+ * mode it is passed through on `lazyLoad` instead.
2688
+ */
2689
+ readonly filters: _angular_core.ModelSignal<StrctDatagridFilters>;
2690
+ /**
2691
+ * Tree-grid: the row property holding a row's children array. Rows render
2692
+ * hierarchically with indent + carets; sorting applies per sibling level;
2693
+ * an active filter shows matches with their ancestors, force-expanded.
2694
+ * Not combinable with `groupBy` or `lazy`.
2695
+ */
2696
+ readonly childrenKey: _angular_core.InputSignal<string | null>;
2407
2697
  /** Emitted when the selection changes. */
2408
2698
  readonly selectionChange: _angular_core.OutputEmitterRef<StrctRow[]>;
2409
2699
  /** Emitted when the refresh button is clicked. */
@@ -2415,6 +2705,14 @@ declare class StrctDatagrid {
2415
2705
  }>;
2416
2706
  /** Server-side data request (lazy mode): load this page / sort and set `rows`. */
2417
2707
  readonly lazyLoad: _angular_core.OutputEmitterRef<StrctDatagridLazyState>;
2708
+ /** An editable cell was committed (Enter / blur). The grid does not mutate
2709
+ * rows — apply `value` to your data and pass the updated array back in. */
2710
+ readonly cellEdit: _angular_core.OutputEmitterRef<{
2711
+ row: StrctRow;
2712
+ column: StrctDatagridColumn;
2713
+ value: string;
2714
+ previous: unknown;
2715
+ }>;
2418
2716
  private readonly menu;
2419
2717
  protected readonly detailDef: _angular_core.Signal<StrctRowDetailDef | undefined>;
2420
2718
  protected readonly actionBarDef: _angular_core.Signal<StrctDatagridActionBar | undefined>;
@@ -2461,6 +2759,38 @@ declare class StrctDatagrid {
2461
2759
  /** What tbody renders: plain (virtual/paged) rows, or groups + their rows. */
2462
2760
  protected readonly displayItems: _angular_core.Signal<DgItem[]>;
2463
2761
  protected itemKey(it: DgItem): unknown;
2762
+ protected readonly filterOpenKey: _angular_core.WritableSignal<string | null>;
2763
+ protected toggleFilterPanel(key: string, event: Event): void;
2764
+ protected hasFilter(key: string): boolean;
2765
+ protected textFilter(key: string): string;
2766
+ protected setTextFilter(key: string, value: string): void;
2767
+ protected optionChecked(key: string, opt: unknown): boolean;
2768
+ protected toggleFilterOption(key: string, opt: unknown): void;
2769
+ protected clearFilter(key: string): void;
2770
+ protected onDocClickFilter(event: MouseEvent): void;
2771
+ protected onEscapeFilter(): void;
2772
+ private readonly expandedTree;
2773
+ protected treeDepth(row: StrctRow): number;
2774
+ protected treeHasChildren(row: StrctRow): boolean;
2775
+ protected treeExpanded(row: StrctRow): boolean;
2776
+ /** Expand / collapse one tree row. */
2777
+ toggleTreeRow(row: StrctRow): void;
2778
+ private readonly hostRef;
2779
+ protected readonly editing: _angular_core.WritableSignal<{
2780
+ rowKey: unknown;
2781
+ colKey: string;
2782
+ } | null>;
2783
+ protected isEditingCell(row: StrctRow, col: StrctDatagridColumn): boolean;
2784
+ protected startEdit(row: StrctRow, col: StrctDatagridColumn): void;
2785
+ protected commitEdit(row: StrctRow, col: StrctDatagridColumn, event: Event): void;
2786
+ protected cancelEdit(event?: Event): void;
2787
+ /** Active (non-empty) filter entries. */
2788
+ private readonly activeFilters;
2789
+ private matchesFilters;
2790
+ /** Rows surviving the per-column filters (client-side modes only). */
2791
+ private readonly filteredRows;
2792
+ /** Tree mode: flattened visible rows + per-row depth/children/expanded meta. */
2793
+ private readonly treeFlat;
2464
2794
  protected readonly sorted: _angular_core.Signal<StrctRow[]>;
2465
2795
  protected readonly paged: _angular_core.Signal<StrctRow[]>;
2466
2796
  /** Full count for the pager / footer (server total in lazy mode). */
@@ -2537,7 +2867,7 @@ declare class StrctDatagrid {
2537
2867
  private commitSelection;
2538
2868
  private compare;
2539
2869
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctDatagrid, never>;
2540
- 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>;
2870
+ 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; }; "childrenKey": { "alias": "childrenKey"; "required": false; "isSignal": true; }; }, { "columnState": "columnStateChange"; "filters": "filtersChange"; "selectionChange": "selectionChange"; "syncChange": "syncChange"; "rowAction": "rowAction"; "lazyLoad": "lazyLoad"; "cellEdit": "cellEdit"; }, ["detailDef", "actionBarDef", "cellDefs"], ["[strctDatagridActionBar]"], true, never>;
2541
2871
  }
2542
2872
 
2543
2873
  /** Timeline node state colors. */
@@ -3324,5 +3654,626 @@ declare class StrctEmptyState {
3324
3654
  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>;
3325
3655
  }
3326
3656
 
3327
- 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, 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 };
3328
- 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, 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 };
3657
+ /**
3658
+ * Format a byte count. Binary (KiB, 1024) by default — the storage/memory
3659
+ * convention consoles actually mean; pass `binary: false` for decimal (kB).
3660
+ */
3661
+ declare function strctFormatBytes(bytes: number, options?: {
3662
+ binary?: boolean;
3663
+ digits?: number;
3664
+ }): string;
3665
+ /**
3666
+ * Format a data rate from bits per second (network convention). Pass bytes/s
3667
+ * through `strctFormatBytes(...) + '/s'` instead if you mean throughput.
3668
+ */
3669
+ declare function strctFormatRate(bitsPerSecond: number, options?: {
3670
+ digits?: number;
3671
+ }): string;
3672
+ /**
3673
+ * Format a duration in ms as the two most significant units: "2h 14m",
3674
+ * "3d 6h", "45s", "820ms". Sub-second stays in ms; `maxUnits` widens it.
3675
+ */
3676
+ declare function strctFormatDuration(ms: number, options?: {
3677
+ maxUnits?: number;
3678
+ }): string;
3679
+ /** Format a count with SI magnitude suffixes: 12400 → "12.4k". */
3680
+ declare function strctFormatSi(value: number, options?: {
3681
+ digits?: number;
3682
+ unit?: string;
3683
+ }): string;
3684
+ /** `{{ bytes | strctBytes }}` / `{{ bytes | strctBytes : false }}` (decimal). */
3685
+ declare class StrctBytesPipe implements PipeTransform {
3686
+ transform(value: number, binary?: boolean, digits?: number): string;
3687
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctBytesPipe, never>;
3688
+ static ɵpipe: _angular_core.ɵɵPipeDeclaration<StrctBytesPipe, "strctBytes", true>;
3689
+ }
3690
+ /** `{{ bps | strctRate }}` — bits per second with kbit/Mbit/Gbit steps. */
3691
+ declare class StrctRatePipe implements PipeTransform {
3692
+ transform(value: number, digits?: number): string;
3693
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctRatePipe, never>;
3694
+ static ɵpipe: _angular_core.ɵɵPipeDeclaration<StrctRatePipe, "strctRate", true>;
3695
+ }
3696
+ /** `{{ ms | strctDuration }}` — "2h 14m"; optional max unit count. */
3697
+ declare class StrctDurationPipe implements PipeTransform {
3698
+ transform(value: number, maxUnits?: number): string;
3699
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctDurationPipe, never>;
3700
+ static ɵpipe: _angular_core.ɵɵPipeDeclaration<StrctDurationPipe, "strctDuration", true>;
3701
+ }
3702
+ /** `{{ n | strctSi : 'IOPS' }}` — SI magnitude with an optional unit label. */
3703
+ declare class StrctSiPipe implements PipeTransform {
3704
+ transform(value: number, unit?: string, digits?: number): string;
3705
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctSiPipe, never>;
3706
+ static ɵpipe: _angular_core.ɵɵPipeDeclaration<StrctSiPipe, "strctSi", true>;
3707
+ }
3708
+
3709
+ /** A resolved time window. `presetId` is set when it came from a quick range. */
3710
+ interface StrctTimeRange {
3711
+ from: Date;
3712
+ to: Date;
3713
+ presetId?: string;
3714
+ }
3715
+ /** A "last X" quick range. `ms` is the window length ending at now. */
3716
+ interface StrctTimeRangePreset {
3717
+ id: string;
3718
+ label: string;
3719
+ ms: number;
3720
+ }
3721
+ /** The Grafana-conventional quick ranges consoles expect. */
3722
+ declare const STRCT_TIME_RANGE_PRESETS: StrctTimeRangePreset[];
3723
+ /**
3724
+ * Monitoring time-range picker — the "Last 1 hour ▾" control charts hang off:
3725
+ * quick relative ranges plus an absolute from/to editor, in one popover.
3726
+ *
3727
+ * <strct-time-range [(range)]="range" />
3728
+ *
3729
+ * Picking a preset resolves it against "now" immediately and stamps
3730
+ * `presetId`, so a consumer can re-resolve the same preset on its own refresh
3731
+ * tick. The popover reuses `strct-dropdown`'s dialog semantics: inner clicks
3732
+ * keep it open, outside click / Escape dismiss.
3733
+ */
3734
+ declare class StrctTimeRangePicker {
3735
+ /** The selected window, two-way. Null until the user (or you) picks one. */
3736
+ readonly range: _angular_core.ModelSignal<StrctTimeRange | null>;
3737
+ /** Quick ranges shown in the left column. */
3738
+ readonly presets: _angular_core.InputSignal<StrctTimeRangePreset[]>;
3739
+ /** Popover alignment, as in strct-dropdown. */
3740
+ readonly align: _angular_core.InputSignal<"end" | "start">;
3741
+ /** Localizable strings. */
3742
+ readonly dialogLabel: _angular_core.InputSignal<string>;
3743
+ readonly quickLabel: _angular_core.InputSignal<string>;
3744
+ readonly absoluteLabel: _angular_core.InputSignal<string>;
3745
+ readonly fromLabel: _angular_core.InputSignal<string>;
3746
+ readonly toLabel: _angular_core.InputSignal<string>;
3747
+ readonly applyLabel: _angular_core.InputSignal<string>;
3748
+ readonly invalidLabel: _angular_core.InputSignal<string>;
3749
+ readonly placeholderLabel: _angular_core.InputSignal<string>;
3750
+ /** Fires on every commit (preset pick or absolute apply). */
3751
+ readonly applied: _angular_core.OutputEmitterRef<StrctTimeRange>;
3752
+ protected readonly dd: _angular_core.Signal<StrctDropdown>;
3753
+ protected readonly draftFrom: _angular_core.WritableSignal<string>;
3754
+ protected readonly draftTo: _angular_core.WritableSignal<string>;
3755
+ protected readonly draftError: _angular_core.Signal<boolean>;
3756
+ protected readonly triggerLabel: _angular_core.Signal<string>;
3757
+ protected pickPreset(p: StrctTimeRangePreset): void;
3758
+ protected applyAbsolute(): boolean;
3759
+ /** Re-resolve a preset range against "now" — call from your refresh tick. */
3760
+ refresh(): void;
3761
+ private seedDraft;
3762
+ private toLocal;
3763
+ private formatStamp;
3764
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctTimeRangePicker, never>;
3765
+ 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; }; "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>;
3766
+ }
3767
+
3768
+ /** A log line: plain text plus an optional severity for tinting. */
3769
+ interface StrctLogLine {
3770
+ text: string;
3771
+ level?: 'error' | 'warn' | 'info' | 'debug';
3772
+ }
3773
+ /** One render segment of a line after ANSI parsing. */
3774
+ interface LogSegment {
3775
+ text: string;
3776
+ cls: string;
3777
+ }
3778
+ interface RenderLine {
3779
+ index: number;
3780
+ level: string;
3781
+ segments: LogSegment[];
3782
+ }
3783
+ /**
3784
+ * Virtualized log tail — the `kubectl logs -f` surface as a component:
3785
+ *
3786
+ * <strct-log-viewer [lines]="lines()" [(follow)]="follow" [height]="360" />
3787
+ *
3788
+ * - **Virtualized**: only the visible window plus overscan is in the DOM, so
3789
+ * 100k lines scroll flat.
3790
+ * - **Follow mode** (two-way): sticks to the tail as lines stream in;
3791
+ * scrolling up pauses it, the button (or scrolling back to the bottom)
3792
+ * resumes it — the Grafana/Loki convention.
3793
+ * - **ANSI SGR colors** (16-color + bold) parsed into safe spans — no
3794
+ * innerHTML — and severity tinting from `StrctLogLine.level` or, for plain
3795
+ * strings, auto-detected ERROR/WARN/INFO/DEBUG tokens.
3796
+ */
3797
+ declare class StrctLogViewer {
3798
+ /** Log lines — plain strings or `{ text, level }` objects. */
3799
+ readonly lines: _angular_core.InputSignal<(string | StrctLogLine)[]>;
3800
+ /** Viewport height in px. */
3801
+ readonly height: _angular_core.InputSignal<number>;
3802
+ /** Follow the tail as new lines arrive (two-way; pauses on scroll-up). */
3803
+ readonly follow: _angular_core.ModelSignal<boolean>;
3804
+ /** Soft-wrap long lines instead of horizontal scrolling (two-way). */
3805
+ readonly wrapMode: _angular_core.ModelSignal<boolean>;
3806
+ /** Auto-detect ERROR/WARN/INFO/DEBUG tokens on plain-string lines. */
3807
+ readonly autoLevel: _angular_core.InputSignalWithTransform<boolean, unknown>;
3808
+ /** Localizable strings. */
3809
+ readonly title: _angular_core.InputSignal<string>;
3810
+ readonly followLabel: _angular_core.InputSignal<string>;
3811
+ readonly wrapLabel: _angular_core.InputSignal<string>;
3812
+ readonly linesLabel: _angular_core.InputSignal<string>;
3813
+ readonly emptyLabel: _angular_core.InputSignal<string>;
3814
+ private readonly scroller;
3815
+ private readonly scrollTop;
3816
+ private suppressScrollEvent;
3817
+ private static readonly LINE_H;
3818
+ private static readonly OVERSCAN;
3819
+ protected readonly normalized: _angular_core.Signal<StrctLogLine[]>;
3820
+ protected readonly totalHeight: _angular_core.Signal<number>;
3821
+ private readonly windowStart;
3822
+ protected readonly offsetY: _angular_core.Signal<number>;
3823
+ protected readonly window: _angular_core.Signal<RenderLine[]>;
3824
+ constructor();
3825
+ protected onScroll(): void;
3826
+ protected toggleFollow(): void;
3827
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctLogViewer, never>;
3828
+ 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>;
3829
+ }
3830
+ /** Parse ANSI SGR sequences into class-tagged segments (16-color + bold). */
3831
+ declare function parseAnsi(text: string): LogSegment[];
3832
+
3833
+ /** One row of a computed line diff. */
3834
+ interface StrctDiffRow {
3835
+ type: 'ctx' | 'add' | 'del';
3836
+ oldNo: number | null;
3837
+ newNo: number | null;
3838
+ text: string;
3839
+ }
3840
+ interface DisplayRow extends StrctDiffRow {
3841
+ kind: 'row';
3842
+ }
3843
+ interface SkipRow {
3844
+ kind: 'skip';
3845
+ count: number;
3846
+ startIndex: number;
3847
+ }
3848
+ type AnyRow = DisplayRow | SkipRow;
3849
+ /** Split-view pairing: a left (old) and right (new) cell per visual row. */
3850
+ interface SplitCell {
3851
+ type: 'ctx' | 'add' | 'del' | 'empty';
3852
+ no: number | null;
3853
+ text: string;
3854
+ }
3855
+ interface SplitPair {
3856
+ kind: 'row';
3857
+ left: SplitCell;
3858
+ right: SplitCell;
3859
+ }
3860
+ type AnySplitRow = SplitPair | SkipRow;
3861
+ /**
3862
+ * Compute a line diff (LCS-based). Exported for programmatic use — change
3863
+ * counts, gating "anything changed?" logic, custom renderings.
3864
+ */
3865
+ declare function strctComputeDiff(before: string, after: string): StrctDiffRow[];
3866
+ /**
3867
+ * Config / YAML diff viewer — change-approval screens without a hand-rolled
3868
+ * diff. Unified by default, `split` for side-by-side; long unchanged runs
3869
+ * collapse to an expandable "· N unchanged lines ·" row.
3870
+ *
3871
+ * <strct-diff [before]="saved" [after]="draft" beforeLabel="Running" afterLabel="Draft" />
3872
+ *
3873
+ * Rows are marked by symbol (+/−) as well as tint, so the diff reads without
3874
+ * color — the same CVD rule the icon badges follow.
3875
+ */
3876
+ declare class StrctDiff {
3877
+ /** The two texts to compare. */
3878
+ readonly before: _angular_core.InputSignal<string>;
3879
+ readonly after: _angular_core.InputSignal<string>;
3880
+ /** Unified (default) or side-by-side split view. */
3881
+ readonly mode: _angular_core.InputSignal<"unified" | "split">;
3882
+ /** Context lines kept around changes before collapsing (0 disables collapsing). */
3883
+ readonly context: _angular_core.InputSignal<number>;
3884
+ /** Header bits. */
3885
+ readonly title: _angular_core.InputSignal<string>;
3886
+ readonly language: _angular_core.InputSignal<string>;
3887
+ readonly beforeLabel: _angular_core.InputSignal<string>;
3888
+ readonly afterLabel: _angular_core.InputSignal<string>;
3889
+ readonly copyable: _angular_core.InputSignalWithTransform<boolean, unknown>;
3890
+ readonly copyAfterLabel: _angular_core.InputSignal<string>;
3891
+ readonly unchangedLabel: _angular_core.InputSignal<string>;
3892
+ /** Scroll the body past this height (px); null grows freely. */
3893
+ readonly maxHeight: _angular_core.InputSignal<number | null>;
3894
+ private readonly expanded;
3895
+ protected readonly rows: _angular_core.Signal<StrctDiffRow[]>;
3896
+ protected readonly addCount: _angular_core.Signal<number>;
3897
+ protected readonly delCount: _angular_core.Signal<number>;
3898
+ protected readonly unifiedRows: _angular_core.Signal<AnyRow[]>;
3899
+ protected readonly splitRows: _angular_core.Signal<AnySplitRow[]>;
3900
+ /** Group rows into visible chunks and collapsible unchanged runs. */
3901
+ private readonly chunks;
3902
+ protected expand(startIndex: number): void;
3903
+ protected sign(type: string): string;
3904
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctDiff, never>;
3905
+ 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>;
3906
+ }
3907
+
3908
+ /**
3909
+ * Two resizable panes with a draggable gutter — master/detail layouts where
3910
+ * the split is the user's to own:
3911
+ *
3912
+ * <strct-splitter [(split)]="pct" [min]="20" [max]="80">
3913
+ * <div strctPaneStart>…list…</div>
3914
+ * <div strctPaneEnd>…detail…</div>
3915
+ * </strct-splitter>
3916
+ *
3917
+ * `split` is the start pane's share in percent (two-way, persistable).
3918
+ * The gutter is a keyboard separator: arrows nudge, Home/End jump to min/max.
3919
+ */
3920
+ declare class StrctSplitter {
3921
+ private readonly host;
3922
+ /** Start pane share in percent (two-way). */
3923
+ readonly split: _angular_core.ModelSignal<number>;
3924
+ /** Clamp bounds for the split (percent). */
3925
+ readonly min: _angular_core.InputSignal<number>;
3926
+ readonly max: _angular_core.InputSignal<number>;
3927
+ /** Stack panes vertically (gutter drags up/down). */
3928
+ readonly vertical: _angular_core.InputSignal<boolean>;
3929
+ /** Accessible name of the separator (localizable). */
3930
+ readonly gutterLabel: _angular_core.InputSignal<string>;
3931
+ /** Keyboard nudge step in percent. */
3932
+ readonly step: _angular_core.InputSignal<number>;
3933
+ protected readonly clamped: _angular_core.Signal<number>;
3934
+ protected dragging: boolean;
3935
+ private moveHandler;
3936
+ private upHandler;
3937
+ protected onDragStart(event: MouseEvent): void;
3938
+ private onDragMove;
3939
+ private onDragEnd;
3940
+ protected onKeydown(event: KeyboardEvent): void;
3941
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctSplitter, never>;
3942
+ 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>;
3943
+ }
3944
+
3945
+ /** One transferable item. */
3946
+ interface StrctTransferItem {
3947
+ id: string;
3948
+ label: string;
3949
+ icon?: string;
3950
+ disabled?: boolean;
3951
+ data?: unknown;
3952
+ }
3953
+ /**
3954
+ * Dual-list transfer (picklist) — "assign hosts to the cluster": all items on
3955
+ * the left, the chosen set on the right, checkbox multi-select and move
3956
+ * buttons in between, with a searchbox per side.
3957
+ *
3958
+ * <strct-transfer [items]="hosts" [(assigned)]="clusterHosts" />
3959
+ *
3960
+ * `assigned` is the two-way id set (string[]); `items` stays the single
3961
+ * source-of-truth list.
3962
+ */
3963
+ declare class StrctTransfer {
3964
+ /** The full item universe. */
3965
+ readonly items: _angular_core.InputSignal<StrctTransferItem[]>;
3966
+ /** Assigned item ids (two-way). */
3967
+ readonly assigned: _angular_core.ModelSignal<string[]>;
3968
+ /** Localizable strings. */
3969
+ readonly sourceLabel: _angular_core.InputSignal<string>;
3970
+ readonly targetLabel: _angular_core.InputSignal<string>;
3971
+ readonly searchPlaceholder: _angular_core.InputSignal<string>;
3972
+ readonly emptyLabel: _angular_core.InputSignal<string>;
3973
+ readonly assignLabel: _angular_core.InputSignal<string>;
3974
+ readonly unassignLabel: _angular_core.InputSignal<string>;
3975
+ /** A move happened (either direction) with the moved ids. */
3976
+ readonly moved: _angular_core.OutputEmitterRef<{
3977
+ direction: "assign" | "unassign";
3978
+ ids: string[];
3979
+ }>;
3980
+ protected readonly sourceQuery: _angular_core.WritableSignal<string>;
3981
+ protected readonly targetQuery: _angular_core.WritableSignal<string>;
3982
+ protected readonly sourceChecked: _angular_core.WritableSignal<Set<string>>;
3983
+ protected readonly targetChecked: _angular_core.WritableSignal<Set<string>>;
3984
+ private readonly assignedSet;
3985
+ protected readonly sourceItems: _angular_core.Signal<StrctTransferItem[]>;
3986
+ protected readonly targetItems: _angular_core.Signal<StrctTransferItem[]>;
3987
+ private matches;
3988
+ protected toggle(which: typeof this.sourceChecked | typeof this.targetChecked, id: string): void;
3989
+ protected assign(): void;
3990
+ protected unassign(): void;
3991
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctTransfer, never>;
3992
+ 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>;
3993
+ }
3994
+
3995
+ /**
3996
+ * Split button — a primary action plus a chevron opening its variants
3997
+ * (Fluent's pattern): "Deploy ▾ → Deploy with snapshot / Deploy paused".
3998
+ *
3999
+ * <strct-split-button label="Deploy" [items]="variants"
4000
+ * (action)="deploy()" (picked)="run($event)" />
4001
+ *
4002
+ * The main segment fires `(action)`; menu entries fire `(picked)`.
4003
+ */
4004
+ declare class StrctSplitButton {
4005
+ /** Main action label. */
4006
+ readonly label: _angular_core.InputSignal<string>;
4007
+ /** Menu entries (StrctMenuItem: id, label, icon?, critical?, disabled?). */
4008
+ readonly items: _angular_core.InputSignal<StrctMenuItem[]>;
4009
+ /** Optional leading icon of the main segment. */
4010
+ readonly icon: _angular_core.InputSignal<string>;
4011
+ /** Filled (solid accent) look. */
4012
+ readonly solid: _angular_core.InputSignalWithTransform<boolean, unknown>;
4013
+ /** Disable both segments. */
4014
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
4015
+ /** Accessible name of the chevron (localizable). */
4016
+ readonly menuLabel: _angular_core.InputSignal<string>;
4017
+ /** The main segment was clicked. */
4018
+ readonly action: _angular_core.OutputEmitterRef<void>;
4019
+ /** A menu entry was chosen. */
4020
+ readonly picked: _angular_core.OutputEmitterRef<StrctMenuItem>;
4021
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctSplitButton, never>;
4022
+ 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>;
4023
+ }
4024
+
4025
+ /**
4026
+ * Repeating diagonal text watermark over its content — compliance overlays
4027
+ * for classified/internal consoles ("CONFIDENTIAL", "user@corp · 2026-07-21"):
4028
+ *
4029
+ * <strct-watermark text="CONFIDENTIAL">…page…</strct-watermark>
4030
+ *
4031
+ * Rendered as a pointer-transparent tiled SVG layer, so the content below
4032
+ * stays fully interactive and selectable. Purely visual — `aria-hidden`.
4033
+ */
4034
+ declare class StrctWatermark {
4035
+ private readonly sanitizer;
4036
+ /** The repeated watermark text. */
4037
+ readonly text: _angular_core.InputSignal<string>;
4038
+ /** Layer opacity (0–1). */
4039
+ readonly opacity: _angular_core.InputSignal<number>;
4040
+ /** Rotation in degrees (negative = up-slope). */
4041
+ readonly angle: _angular_core.InputSignal<number>;
4042
+ /** Tile size in px — larger spreads the marks out. */
4043
+ readonly gap: _angular_core.InputSignal<number>;
4044
+ /** Font size in px. */
4045
+ readonly fontSize: _angular_core.InputSignal<number>;
4046
+ protected readonly tile: _angular_core.Signal<SafeStyle>;
4047
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctWatermark, never>;
4048
+ 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>;
4049
+ }
4050
+
4051
+ /** One coach-mark step. `target` is a CSS selector; null centers the card. */
4052
+ interface StrctTourStep {
4053
+ target: string | null;
4054
+ title: string;
4055
+ body: string;
4056
+ }
4057
+ /**
4058
+ * Feature tour (coach marks) — "what's new" onboarding over live UI:
4059
+ *
4060
+ * <strct-tour [(open)]="tourOpen" [steps]="steps" (finished)="done()" />
4061
+ *
4062
+ * Each step spotlights its `target` selector with a ring cut out of a dimmed
4063
+ * backdrop and anchors a card next to it. Arrows / buttons step, Escape
4064
+ * closes, and the card is a labeled dialog. Purely DOM-driven: targets are
4065
+ * looked up when the step shows, so it works over any page.
4066
+ */
4067
+ declare class StrctTour {
4068
+ /** Whether the tour is showing (two-way). */
4069
+ readonly open: _angular_core.ModelSignal<boolean>;
4070
+ /** The steps, in order. */
4071
+ readonly steps: _angular_core.InputSignal<StrctTourStep[]>;
4072
+ /** Localizable strings. */
4073
+ readonly nextLabel: _angular_core.InputSignal<string>;
4074
+ readonly backLabel: _angular_core.InputSignal<string>;
4075
+ readonly skipLabel: _angular_core.InputSignal<string>;
4076
+ readonly doneLabel: _angular_core.InputSignal<string>;
4077
+ /** The last step's Done was clicked (Escape / Skip emit `dismissed`). */
4078
+ readonly finished: _angular_core.OutputEmitterRef<void>;
4079
+ readonly dismissed: _angular_core.OutputEmitterRef<void>;
4080
+ protected readonly index: _angular_core.WritableSignal<number>;
4081
+ /** Bumped on open/step/resize to re-measure the target. */
4082
+ private readonly measureTick;
4083
+ protected readonly current: _angular_core.Signal<StrctTourStep>;
4084
+ protected readonly spot: _angular_core.Signal<{
4085
+ top: number;
4086
+ left: number;
4087
+ width: number;
4088
+ height: number;
4089
+ } | null>;
4090
+ protected readonly cardPos: _angular_core.Signal<{
4091
+ top: number;
4092
+ left: number;
4093
+ }>;
4094
+ constructor();
4095
+ protected next(): void;
4096
+ protected prev(): void;
4097
+ protected close(): void;
4098
+ private scrollToTarget;
4099
+ protected onEscape(): void;
4100
+ protected onReflow(): void;
4101
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctTour, never>;
4102
+ 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>;
4103
+ }
4104
+
4105
+ /** One top-level menubar entry with its menu. */
4106
+ interface StrctMenubarItem {
4107
+ id: string;
4108
+ label: string;
4109
+ items: StrctMenuItem[];
4110
+ }
4111
+ /**
4112
+ * Horizontal menubar — the application-menu strip ("File · Edit · View") for
4113
+ * dense tool-style consoles:
4114
+ *
4115
+ * <strct-menubar [menus]="menus" (picked)="run($event)" />
4116
+ *
4117
+ * Click (or Enter/Down) opens a menu; Left/Right move across the bar and,
4118
+ * while open, switch the open menu (the APG menubar convention). Escape and
4119
+ * outside click close. `(picked)` carries `{ menu, item }`.
4120
+ */
4121
+ declare class StrctMenubar {
4122
+ private readonly host;
4123
+ /** Top-level menus. */
4124
+ readonly menus: _angular_core.InputSignal<StrctMenubarItem[]>;
4125
+ /** Accessible name of the bar (localizable). */
4126
+ readonly ariaLabel: _angular_core.InputSignal<string>;
4127
+ /** A menu entry was chosen. */
4128
+ readonly picked: _angular_core.OutputEmitterRef<{
4129
+ menu: StrctMenubarItem;
4130
+ item: StrctMenuItem;
4131
+ }>;
4132
+ protected readonly openId: _angular_core.WritableSignal<string | null>;
4133
+ protected readonly focusIdx: _angular_core.WritableSignal<number>;
4134
+ protected toggleMenu(id: string, i: number): void;
4135
+ protected pick(menu: StrctMenubarItem, item: StrctMenuItem): void;
4136
+ protected onTopKey(event: KeyboardEvent, i: number): void;
4137
+ protected onDocClick(event: MouseEvent): void;
4138
+ protected onEscape(): void;
4139
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctMenubar, never>;
4140
+ 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>;
4141
+ }
4142
+
4143
+ /**
4144
+ * Screen-reader announcements for state changes that have no visible text —
4145
+ * "12 rows loaded", "Snapshot created" (Material's LiveAnnouncer, strct-sized):
4146
+ *
4147
+ * private announcer = inject(StrctAnnouncer);
4148
+ * this.announcer.announce('12 rows loaded');
4149
+ *
4150
+ * Maintains one visually-hidden live region per politeness level; repeated
4151
+ * identical messages are re-announced (the region is cleared first).
4152
+ */
4153
+ declare class StrctAnnouncer implements OnDestroy {
4154
+ private regions;
4155
+ private clearTimer;
4156
+ announce(message: string, politeness?: 'polite' | 'assertive'): void;
4157
+ private regionFor;
4158
+ ngOnDestroy(): void;
4159
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctAnnouncer, never>;
4160
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<StrctAnnouncer>;
4161
+ }
4162
+
4163
+ /** A registered application hotkey. */
4164
+ interface StrctHotkey {
4165
+ /** Combo like `'ctrl+k'`, `'meta+shift+p'`, `'?'` — `mod` = Ctrl/⌘. */
4166
+ combo: string;
4167
+ /** Human description shown in the help overlay. */
4168
+ description: string;
4169
+ /** Help-overlay group heading. */
4170
+ group?: string;
4171
+ handler: (event: KeyboardEvent) => void;
4172
+ }
4173
+ /**
4174
+ * Application hotkeys, centrally registered so they are discoverable — the
4175
+ * Blueprint pattern:
4176
+ *
4177
+ * private hotkeys = inject(StrctHotkeysService);
4178
+ * ngOnInit() { this.dispose = this.hotkeys.register(
4179
+ * { combo: 'mod+k', description: 'Open command palette', group: 'Global',
4180
+ * handler: () => this.palette.open() }); }
4181
+ *
4182
+ * Combos: `'a'`, `'?'`, `'ctrl+k'`, `'meta+shift+p'`, `'mod+k'` (mod = Ctrl/⌘).
4183
+ * Plain-key combos are suppressed while typing in inputs / textareas /
4184
+ * contenteditable; modifier combos always fire. Pair with
4185
+ * `<strct-hotkeys-help/>` for the ⌘/ ("?") cheatsheet overlay.
4186
+ */
4187
+ declare class StrctHotkeysService implements OnDestroy {
4188
+ private readonly registry;
4189
+ /** All registered hotkeys (for the help overlay). */
4190
+ readonly hotkeys: _angular_core.Signal<StrctHotkey[]>;
4191
+ private readonly listener;
4192
+ constructor();
4193
+ /** Register a hotkey; the returned function unregisters it. */
4194
+ register(hotkey: StrctHotkey): () => void;
4195
+ private onKeydown;
4196
+ ngOnDestroy(): void;
4197
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctHotkeysService, never>;
4198
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<StrctHotkeysService>;
4199
+ }
4200
+ /**
4201
+ * The hotkey cheatsheet overlay. Mount once near the app root; it registers
4202
+ * `?` itself and lists everything in the service, grouped:
4203
+ *
4204
+ * <strct-hotkeys-help />
4205
+ */
4206
+ declare class StrctHotkeysHelp {
4207
+ private readonly service;
4208
+ /** Overlay visibility (two-way; `?` toggles it too). */
4209
+ readonly open: _angular_core.ModelSignal<boolean>;
4210
+ /** Localizable strings. */
4211
+ readonly title: _angular_core.InputSignal<string>;
4212
+ readonly emptyText: _angular_core.InputSignal<string>;
4213
+ protected readonly grouped: _angular_core.Signal<{
4214
+ name: string;
4215
+ keys: StrctHotkey[];
4216
+ }[]>;
4217
+ constructor();
4218
+ protected onEscape(): void;
4219
+ protected parts(combo: string): string[];
4220
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctHotkeysHelp, never>;
4221
+ 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>;
4222
+ }
4223
+
4224
+ /** A completed reorder: move the item at `from` to `to` in your array. */
4225
+ interface StrctReorderEvent {
4226
+ from: number;
4227
+ to: number;
4228
+ }
4229
+ /**
4230
+ * List drag-reorder primitive — the consumer owns the array:
4231
+ *
4232
+ * <ul strctReorder (reordered)="move($event)">
4233
+ * @for (s of steps(); track s.id) {
4234
+ * <li strctReorderItem>{{ s.label }}</li>
4235
+ * }
4236
+ * </ul>
4237
+ *
4238
+ * move({ from, to }: StrctReorderEvent) {
4239
+ * this.steps.update((s) => { const c = [...s]; c.splice(to, 0, ...c.splice(from, 1)); return c; });
4240
+ * }
4241
+ *
4242
+ * Items are HTML5-draggable; keyboard reorder is Alt+ArrowUp / Alt+ArrowDown
4243
+ * on the focused item (items get `tabindex="0"` unless they already manage
4244
+ * focus). Indexes are positions among the `strctReorderItem` siblings.
4245
+ */
4246
+ declare class StrctReorder {
4247
+ private readonly host;
4248
+ /** Emits when a drag or keyboard move completes. */
4249
+ readonly reordered: _angular_core.OutputEmitterRef<StrctReorderEvent>;
4250
+ /** Disable all reordering (display-only mode). */
4251
+ readonly reorderDisabled: _angular_core.InputSignal<boolean>;
4252
+ readonly dragIndex: _angular_core.WritableSignal<number | null>;
4253
+ readonly overIndex: _angular_core.WritableSignal<number | null>;
4254
+ items(): HTMLElement[];
4255
+ indexOf(el: HTMLElement): number;
4256
+ commit(from: number, to: number): void;
4257
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctReorder, never>;
4258
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<StrctReorder, "[strctReorder]", never, { "reorderDisabled": { "alias": "reorderDisabled"; "required": false; "isSignal": true; }; }, { "reordered": "reordered"; }, never, never, true, never>;
4259
+ }
4260
+ /** One draggable row inside a `[strctReorder]` container. */
4261
+ declare class StrctReorderItem {
4262
+ protected readonly list: StrctReorder;
4263
+ private readonly el;
4264
+ private readonly hadOwnTabindex;
4265
+ protected hostTabindex(): number | null;
4266
+ protected isDragging(): boolean;
4267
+ protected isOver(): boolean;
4268
+ private index;
4269
+ protected onDragStart(event: DragEvent): void;
4270
+ protected onDragOver(event: DragEvent): void;
4271
+ protected onDrop(event: DragEvent): void;
4272
+ protected onDragEnd(): void;
4273
+ protected onKeydown(event: KeyboardEvent): void;
4274
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctReorderItem, never>;
4275
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<StrctReorderItem, "[strctReorderItem]", never, {}, {}, never, never, true, never>;
4276
+ }
4277
+
4278
+ 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 };
4279
+ 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 };