@akcelik/strct 5.7.0 → 5.9.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@akcelik/strct",
3
- "version": "5.7.0",
3
+ "version": "5.9.0",
4
4
  "description": "UIStruct — a standalone Angular component library with a tokenised, multi-palette theme system, built for datacenter / infrastructure management UIs.",
5
5
  "author": "Serkan Akcelik <serkan.akcelik@gmail.com>",
6
6
  "license": "MIT",
@@ -734,6 +734,11 @@ declare class StrctList {
734
734
  * `strct-list-item [wrap]` turns it on for one row.
735
735
  */
736
736
  readonly wrap: _angular_core.InputSignalWithTransform<boolean, unknown>;
737
+ /**
738
+ * Drop the rows' inline padding, so a list of statements lines up with the
739
+ * paragraphs around it instead of sitting 12px inside them.
740
+ */
741
+ readonly flush: _angular_core.InputSignalWithTransform<boolean, unknown>;
737
742
  /** Hairline between rows. */
738
743
  readonly dividers: _angular_core.InputSignalWithTransform<boolean, unknown>;
739
744
  /** Shown when the list has no items. */
@@ -742,7 +747,7 @@ declare class StrctList {
742
747
  readonly label: _angular_core.InputSignal<string>;
743
748
  protected readonly items: _angular_core.Signal<readonly StrctListItem[]>;
744
749
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctList, never>;
745
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctList, "strct-list", never, { "dense": { "alias": "dense"; "required": false; "isSignal": true; }; "wrap": { "alias": "wrap"; "required": false; "isSignal": true; }; "dividers": { "alias": "dividers"; "required": false; "isSignal": true; }; "emptyText": { "alias": "emptyText"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, {}, ["items"], ["*"], true, never>;
750
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctList, "strct-list", never, { "dense": { "alias": "dense"; "required": false; "isSignal": true; }; "wrap": { "alias": "wrap"; "required": false; "isSignal": true; }; "flush": { "alias": "flush"; "required": false; "isSignal": true; }; "dividers": { "alias": "dividers"; "required": false; "isSignal": true; }; "emptyText": { "alias": "emptyText"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, {}, ["items"], ["*"], true, never>;
746
751
  }
747
752
 
748
753
  /** Follows the heading on its line — a badge, a count, a status dot. */
@@ -2526,17 +2531,24 @@ declare class StrctCodeInline {
2526
2531
  readonly value: _angular_core.InputSignal<string>;
2527
2532
  /** Long ids wrap instead of overflowing a narrow card. */
2528
2533
  readonly wrap: _angular_core.InputSignalWithTransform<boolean, unknown>;
2534
+ /**
2535
+ * What the copy button is called. Two spans in the same drawer are both
2536
+ * "Copy" without it; these are "Copy thumbprint" and "Copy serial number".
2537
+ */
2538
+ readonly copyLabel: _angular_core.InputSignal<string>;
2529
2539
  private readonly host;
2530
2540
  private readonly vcr;
2531
2541
  private readonly destroyRef;
2532
2542
  /** The button, once it exists; and a counter the observer bumps. */
2533
2543
  private readonly copyRef;
2534
2544
  private readonly revision;
2545
+ /** The host exists: nothing may be created into it before that. */
2546
+ private readonly rendered;
2535
2547
  constructor();
2536
2548
  /** What the element says, without the copy button's own content. */
2537
2549
  private ownText;
2538
2550
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctCodeInline, never>;
2539
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<StrctCodeInline, "[strctCode]", never, { "copyable": { "alias": "copyable"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "wrap": { "alias": "wrap"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
2551
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<StrctCodeInline, "[strctCode]", never, { "copyable": { "alias": "copyable"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "wrap": { "alias": "wrap"; "required": false; "isSignal": true; }; "copyLabel": { "alias": "copyLabel"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
2540
2552
  }
2541
2553
 
2542
2554
  /** One active filter chip in a {@link StrctFilterBar}. */
@@ -2645,8 +2657,15 @@ declare class StrctFieldHint {
2645
2657
  * 9px above the label's line, because the column centres on a 34px control.
2646
2658
  */
2647
2659
  declare class StrctFieldValue {
2660
+ /**
2661
+ * What the slot holds. Text (the default) reads on the label's own line; a
2662
+ * `control` — a segmented picker, a small button, a switch with its own box
2663
+ * — is centred where a real control in this column would be, rather than
2664
+ * pushed down by the padding that puts text on the line.
2665
+ */
2666
+ readonly strctFieldValue: _angular_core.InputSignal<"" | "text" | "control">;
2648
2667
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctFieldValue, never>;
2649
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<StrctFieldValue, "[strctFieldValue]", never, {}, {}, never, never, true, never>;
2668
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<StrctFieldValue, "[strctFieldValue]", never, { "strctFieldValue": { "alias": "strctFieldValue"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
2650
2669
  }
2651
2670
  /**
2652
2671
  * Wrapper that opts a run of `layout="inline"` fields out of the hairlines
@@ -2810,6 +2829,8 @@ declare class StrctToggle implements ControlValueAccessor {
2810
2829
  * `[strctControlDescription]` projects one with markup in it.
2811
2830
  */
2812
2831
  readonly description: _angular_core.InputSignal<string>;
2832
+ /** The switch's accessible name, where no visible label gives it one. */
2833
+ readonly ariaLabel: _angular_core.InputSignal<string | null>;
2813
2834
  private readonly n;
2814
2835
  protected readonly descId: string;
2815
2836
  protected readonly labelId: string;
@@ -2827,7 +2848,7 @@ declare class StrctToggle implements ControlValueAccessor {
2827
2848
  registerOnTouched(fn: () => void): void;
2828
2849
  setDisabledState(isDisabled: boolean): void;
2829
2850
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctToggle, never>;
2830
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctToggle, "strct-toggle", never, { "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; }, {}, ["projected"], ["[strctControlDescription]", "*"], true, never>;
2851
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctToggle, "strct-toggle", never, { "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, {}, ["projected"], ["[strctControlDescription]", "*"], true, never>;
2831
2852
  }
2832
2853
 
2833
2854
  /**
@@ -3418,6 +3439,12 @@ declare class StrctSelect implements ControlValueAccessor {
3418
3439
  readonly options: _angular_core.InputSignal<StrctOption[]>;
3419
3440
  /** Muted text shown while no value is selected (localizable). */
3420
3441
  readonly placeholder: _angular_core.InputSignal<string>;
3442
+ /**
3443
+ * The control's accessible name, where it is not inside a `strct-field`.
3444
+ * ARIA does not let a `combobox` take its name from its content, so a bare
3445
+ * select — a filter above a list, a cell editor — has none without this.
3446
+ */
3447
+ readonly ariaLabel: _angular_core.InputSignal<string | null>;
3421
3448
  /** Accessible name of the listbox (localizable). */
3422
3449
  readonly listLabel: _angular_core.InputSignal<string>;
3423
3450
  /** Text shown when `options` is empty (localizable). */
@@ -3464,7 +3491,7 @@ declare class StrctSelect implements ControlValueAccessor {
3464
3491
  registerOnTouched(fn: () => void): void;
3465
3492
  setDisabledState(isDisabled: boolean): void;
3466
3493
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctSelect, never>;
3467
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctSelect, "strct-select", never, { "options": { "alias": "options"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "listLabel": { "alias": "listLabel"; "required": false; "isSignal": true; }; "emptyText": { "alias": "emptyText"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
3494
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctSelect, "strct-select", never, { "options": { "alias": "options"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "listLabel": { "alias": "listLabel"; "required": false; "isSignal": true; }; "emptyText": { "alias": "emptyText"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
3468
3495
  }
3469
3496
 
3470
3497
  interface DayCell {
@@ -3892,7 +3919,27 @@ interface StrctDatagridColumn {
3892
3919
  */
3893
3920
  editor?: 'text' | 'number' | 'select';
3894
3921
  /** Options for `editor: 'select'` (the library's own option shape). */
3895
- editorOptions?: StrctOption[];
3922
+ /**
3923
+ * What this column sorts by, when the cell does not show it: "1.5 TB" is
3924
+ * sorted by its bytes, a formatted date by its timestamp. `null` and `''`
3925
+ * are "unread" and sort last in both directions.
3926
+ */
3927
+ sortValue?: (row: StrctRow) => unknown;
3928
+ /** Full control of the order, when a key is not enough. Wins over `sortValue`. */
3929
+ comparator?: (a: StrctRow, b: StrctRow) => number;
3930
+ /** What an export writes for this column; defaults to the stored value. */
3931
+ exportValue?: (row: StrctRow) => unknown;
3932
+ /**
3933
+ * Hidden until the chooser is asked for it — the column exists, it is just
3934
+ * not one of the defaults. A persisted or bound `columnState` wins.
3935
+ */
3936
+ hidden?: boolean;
3937
+ /**
3938
+ * The choices an `editor: 'select'` offers. A function is asked per row: a
3939
+ * rule that holds a value the host no longer reports lists it for that row
3940
+ * only, rather than every row's picker carrying every other row's.
3941
+ */
3942
+ editorOptions?: StrctOption[] | ((row: StrctRow) => StrctOption[]);
3896
3943
  /** Bounds and step for `editor: 'number'`. */
3897
3944
  editorMin?: number;
3898
3945
  editorMax?: number;
@@ -3930,6 +3977,9 @@ interface StrctDatagridColumnState {
3930
3977
  widths?: Record<string, number>;
3931
3978
  hidden?: string[];
3932
3979
  order?: string[];
3980
+ /** The column the operator sorted by, and which way. */
3981
+ sortKey?: string | null;
3982
+ sortDir?: 'asc' | 'desc';
3933
3983
  }
3934
3984
  /** One rendered tbody item: a data row, or a group header. */
3935
3985
  interface DgItem {
@@ -4325,6 +4375,8 @@ declare class StrctDatagrid {
4325
4375
  protected onEditCellKeydown(row: StrctRow, col: StrctDatagridColumn, event: KeyboardEvent): void;
4326
4376
  /** Put focus back on the cell an editor just left, so the keys keep working. */
4327
4377
  private refocusCell;
4378
+ /** A column's choices, asked per row when the column gives a function. */
4379
+ protected editorOptionsFor(row: StrctRow, col: StrctDatagridColumn): StrctOption[];
4328
4380
  protected startEdit(row: StrctRow, col: StrctDatagridColumn): void;
4329
4381
  protected readonly captionId: string;
4330
4382
  /** Whether a cell has nothing to show and the column says what to show then. */
@@ -4439,11 +4491,28 @@ declare class StrctDatagrid {
4439
4491
  constructor();
4440
4492
  private readPersistedState;
4441
4493
  private applyColumnState;
4494
+ /** Whether a persisted or bound state has already decided what is hidden. */
4495
+ private hiddenDecidedByState;
4496
+ /** Whether the columns' own `hidden` flags have been read (once). */
4497
+ private declaredHiddenApplied;
4498
+ /**
4499
+ * Columns the consumer declared hidden — the default for a column no state
4500
+ * mentions. A list that shows five of twenty columns says so on the columns,
4501
+ * rather than seeding `columnState` and reaching into the library's storage
4502
+ * key to keep from overriding what the operator chose.
4503
+ */
4504
+ private applyDeclaredHidden;
4442
4505
  /**
4443
4506
  * The grid as CSV: header labels + every non-hidden column, all rows in the
4444
4507
  * current order (client mode: the full sorted set, not just the page).
4445
4508
  */
4446
4509
  toCSV(): string;
4510
+ /**
4511
+ * What an export writes for a cell: what the column says, else the stored
4512
+ * value. A templated cell shows "2 h 15 m" and stored 8100; without this the
4513
+ * export carries the seconds, an enum code or a bare `true`.
4514
+ */
4515
+ private exportValueOf;
4447
4516
  /**
4448
4517
  * The grid as a real .xlsx workbook (dependency-free SpreadsheetML):
4449
4518
  * header labels + every non-hidden column in the current order, all rows in
@@ -4502,6 +4571,17 @@ declare class StrctDatagrid {
4502
4571
  /** Emit every selected row: fresh objects from the latest data where
4503
4572
  * available, the last known snapshot otherwise (off-page lazy rows). */
4504
4573
  private commitSelection;
4574
+ /**
4575
+ * One row's sort key for a column: what the column says to sort by, else the
4576
+ * stored value. A cell that shows "1.5 TB" sorts as text without this, which
4577
+ * puts it before "900 GB"; a date written by toLocaleString sorts across
4578
+ * days and AM/PM by its characters.
4579
+ */
4580
+ private sortKeyOf;
4581
+ /** The column a key belongs to — the comparator and the sort key need it. */
4582
+ private columnOf;
4583
+ /** Compare two rows by a column, honouring its comparator and nulls-last. */
4584
+ private compareRows;
4505
4585
  private compare;
4506
4586
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctDatagrid, never>;
4507
4587
  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; }; "selectionMode": { "alias": "selectionMode"; "required": false; "isSignal": true; }; "selectedId": { "alias": "selectedId"; "required": false; "isSignal": true; }; "rowSelectable": { "alias": "rowSelectable"; "required": false; "isSignal": true; }; "flush": { "alias": "flush"; "required": false; "isSignal": true; }; "caption": { "alias": "caption"; "required": false; "isSignal": true; }; "paging": { "alias": "paging"; "required": false; "isSignal": true; }; "hasMore": { "alias": "hasMore"; "required": false; "isSignal": true; }; "loadingMore": { "alias": "loadingMore"; "required": false; "isSignal": true; }; "moreTotal": { "alias": "moreTotal"; "required": false; "isSignal": true; }; "groupSelect": { "alias": "groupSelect"; "required": false; "isSignal": true; }; "rowActions": { "alias": "rowActions"; "required": false; "isSignal": true; }; "initialSelection": { "alias": "initialSelection"; "required": false; "isSignal": true; }; "selectedIds": { "alias": "selectedIds"; "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; }; "maxHeight": { "alias": "maxHeight"; "required": false; "isSignal": true; }; "editHint": { "alias": "editHint"; "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; }; "quickFilterAlign": { "alias": "quickFilterAlign"; "required": false; "isSignal": true; }; "childrenKey": { "alias": "childrenKey"; "required": false; "isSignal": true; }; }, { "selectedId": "selectedIdChange"; "loadMore": "loadMore"; "selectedIds": "selectedIdsChange"; "columnState": "columnStateChange"; "filters": "filtersChange"; "quickFilter": "quickFilterChange"; "selectionChange": "selectionChange"; "syncChange": "syncChange"; "rowAction": "rowAction"; "lazyLoad": "lazyLoad"; "cellEdit": "cellEdit"; }, ["detailDef", "actionBarDef", "actionBarCaptionDef", "cellDefs"], ["[strctDatagridActionBarCaption]", "[strctDatagridActionBar]"], true, never>;
@@ -6544,6 +6624,12 @@ interface StrctLegendItem {
6544
6624
  disabled?: boolean;
6545
6625
  /** Why a `disabled` row cannot be picked; its title and its description. */
6546
6626
  reason?: string;
6627
+ /**
6628
+ * What the row is, for any row — "vm.cpu.wait — CPU ready (written by the
6629
+ * agent)". `reason` is the why-not of a row that cannot be picked; this is
6630
+ * the what of one that can.
6631
+ */
6632
+ description?: string;
6547
6633
  }
6548
6634
  /**
6549
6635
  * A chart's key is a component. The same swatch · label · value rows serve a
@@ -6760,6 +6846,12 @@ declare class StrctWindow {
6760
6846
  readonly resizeLabel: _angular_core.InputSignal<(corner: string) => string>;
6761
6847
  /** A leading icon in the title bar, as `strct-page-header [icon]` has. */
6762
6848
  readonly icon: _angular_core.InputSignal<string>;
6849
+ /**
6850
+ * Whatever the consumer needs to recognise this window elsewhere — a session
6851
+ * id, the object it shows. The dock passes it to `[strctWindowDockItem]`, so
6852
+ * an app no longer keeps its own window-to-thing index.
6853
+ */
6854
+ readonly data: _angular_core.InputSignal<unknown>;
6763
6855
  /**
6764
6856
  * What a double-click on the title bar does. A console whose content has a
6765
6857
  * real full screen of its own wants `none` and its own answer to
@@ -6838,7 +6930,7 @@ declare class StrctWindow {
6838
6930
  private clamp;
6839
6931
  private setRect;
6840
6932
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctWindow, never>;
6841
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctWindow, "strct-window", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "minimized": { "alias": "minimized"; "required": false; "isSignal": true; }; "maximized": { "alias": "maximized"; "required": false; "isSignal": true; }; "bounds": { "alias": "bounds"; "required": false; "isSignal": true; }; "heading": { "alias": "heading"; "required": false; "isSignal": true; }; "resizable": { "alias": "resizable"; "required": false; "isSignal": true; }; "minWidth": { "alias": "minWidth"; "required": false; "isSignal": true; }; "minHeight": { "alias": "minHeight"; "required": false; "isSignal": true; }; "palette": { "alias": "palette"; "required": false; "isSignal": true; }; "closeOnOutside": { "alias": "closeOnOutside"; "required": false; "isSignal": true; }; "labels": { "alias": "labels"; "required": false; "isSignal": true; }; "resizeLabel": { "alias": "resizeLabel"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "titleDblclick": { "alias": "titleDblclick"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "minimized": "minimizedChange"; "maximized": "maximizedChange"; "bounds": "boundsChange"; "closed": "closed"; "titleDblclicked": "titleDblclicked"; "outsidePointer": "outsidePointer"; }, never, ["[strctWindowTitleMeta]", "[strctWindowActions]", "*", "[strctWindowStatus]"], true, never>;
6933
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctWindow, "strct-window", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "minimized": { "alias": "minimized"; "required": false; "isSignal": true; }; "maximized": { "alias": "maximized"; "required": false; "isSignal": true; }; "bounds": { "alias": "bounds"; "required": false; "isSignal": true; }; "heading": { "alias": "heading"; "required": false; "isSignal": true; }; "resizable": { "alias": "resizable"; "required": false; "isSignal": true; }; "minWidth": { "alias": "minWidth"; "required": false; "isSignal": true; }; "minHeight": { "alias": "minHeight"; "required": false; "isSignal": true; }; "palette": { "alias": "palette"; "required": false; "isSignal": true; }; "closeOnOutside": { "alias": "closeOnOutside"; "required": false; "isSignal": true; }; "labels": { "alias": "labels"; "required": false; "isSignal": true; }; "resizeLabel": { "alias": "resizeLabel"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "data": { "alias": "data"; "required": false; "isSignal": true; }; "titleDblclick": { "alias": "titleDblclick"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "minimized": "minimizedChange"; "maximized": "maximizedChange"; "bounds": "boundsChange"; "closed": "closed"; "titleDblclicked": "titleDblclicked"; "outsidePointer": "outsidePointer"; }, never, ["[strctWindowTitleMeta]", "[strctWindowActions]", "*", "[strctWindowStatus]"], true, never>;
6842
6934
  }
6843
6935
  /**
6844
6936
  * What a dock chip shows, when the window's heading is not enough — a status
@@ -6863,6 +6955,11 @@ declare class StrctWindowDock {
6863
6955
  readonly label: _angular_core.InputSignal<string>;
6864
6956
  /** The name of each chip's close button. */
6865
6957
  readonly closeLabel: _angular_core.InputSignal<(heading: string) => string>;
6958
+ /**
6959
+ * The name of each chip itself — what restoring it does: "Show the console
6960
+ * of APP02". The window is passed, so its `data` can shape the sentence.
6961
+ */
6962
+ readonly restoreLabel: _angular_core.InputSignal<(w: StrctWindow) => string>;
6866
6963
  /** What each chip shows, when a heading is not enough. */
6867
6964
  protected readonly itemTpl: _angular_core.Signal<TemplateRef<any> | undefined>;
6868
6965
  /**
@@ -6877,7 +6974,7 @@ declare class StrctWindowDock {
6877
6974
  readonly restoreRequest: _angular_core.OutputEmitterRef<StrctWindow>;
6878
6975
  protected onRestore(w: StrctWindow): void;
6879
6976
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctWindowDock, never>;
6880
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctWindowDock, "strct-window-dock", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "closeLabel": { "alias": "closeLabel"; "required": false; "isSignal": true; }; "restoreMode": { "alias": "restoreMode"; "required": false; "isSignal": true; }; }, { "restoreRequest": "restoreRequest"; }, ["itemTpl"], never, true, never>;
6977
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctWindowDock, "strct-window-dock", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "closeLabel": { "alias": "closeLabel"; "required": false; "isSignal": true; }; "restoreLabel": { "alias": "restoreLabel"; "required": false; "isSignal": true; }; "restoreMode": { "alias": "restoreMode"; "required": false; "isSignal": true; }; }, { "restoreRequest": "restoreRequest"; }, ["itemTpl"], never, true, never>;
6881
6978
  }
6882
6979
 
6883
6980
  /** Who wrote a message. */