@akcelik/strct 5.18.0 → 5.20.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.18.0",
3
+ "version": "5.20.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",
@@ -1028,7 +1028,7 @@ declare class StrctTag {
1028
1028
  readonly activated: _angular_core.OutputEmitterRef<void>;
1029
1029
  protected onActivate(): void;
1030
1030
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctTag, never>;
1031
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctTag, "strct-tag", never, { "status": { "alias": "status"; "required": false; "isSignal": true; }; "removable": { "alias": "removable"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "removeLabel": { "alias": "removeLabel"; "required": false; "isSignal": true; }; "activateLabel": { "alias": "activateLabel"; "required": false; "isSignal": true; }; "href": { "alias": "href"; "required": false; "isSignal": true; }; "target": { "alias": "target"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "shape": { "alias": "shape"; "required": false; "isSignal": true; }; "mono": { "alias": "mono"; "required": false; "isSignal": true; }; }, { "removed": "removed"; "activated": "activated"; }, never, ["[strctTagLeading]", "*", "[strctTagLeading]", "*"], true, never>;
1031
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctTag, "strct-tag", never, { "status": { "alias": "status"; "required": false; "isSignal": true; }; "removable": { "alias": "removable"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "removeLabel": { "alias": "removeLabel"; "required": false; "isSignal": true; }; "activateLabel": { "alias": "activateLabel"; "required": false; "isSignal": true; }; "href": { "alias": "href"; "required": false; "isSignal": true; }; "target": { "alias": "target"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "shape": { "alias": "shape"; "required": false; "isSignal": true; }; "mono": { "alias": "mono"; "required": false; "isSignal": true; }; }, { "removed": "removed"; "activated": "activated"; }, never, ["[strctTagLeading]", "*"], true, never>;
1032
1032
  }
1033
1033
 
1034
1034
  /** Avatar size variants. */
@@ -3084,6 +3084,12 @@ declare class StrctCheckbox implements ControlValueAccessor {
3084
3084
  * the name. `[strctControlDescription]` projects one with markup in it.
3085
3085
  */
3086
3086
  readonly description: _angular_core.InputSignal<string>;
3087
+ /**
3088
+ * Takes the box out of the tab order (`-1`) where something around it owns
3089
+ * the keyboard — a datagrid in grid mode roves its rows and reaches the box
3090
+ * with the arrows. `null` leaves the native order alone.
3091
+ */
3092
+ readonly tabIndex: _angular_core.InputSignal<number | null>;
3087
3093
  private readonly n;
3088
3094
  protected readonly descId: string;
3089
3095
  protected readonly labelId: string;
@@ -3105,7 +3111,7 @@ declare class StrctCheckbox implements ControlValueAccessor {
3105
3111
  registerOnTouched(fn: () => void): void;
3106
3112
  setDisabledState(isDisabled: boolean): void;
3107
3113
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctCheckbox, never>;
3108
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctCheckbox, "strct-checkbox", never, { "checked": { "alias": "checked"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "indeterminate": { "alias": "indeterminate"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; }, { "checked": "checkedChange"; }, ["projected"], ["[strctControlDescription]", "*"], true, never>;
3114
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctCheckbox, "strct-checkbox", never, { "checked": { "alias": "checked"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "indeterminate": { "alias": "indeterminate"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "tabIndex": { "alias": "tabIndex"; "required": false; "isSignal": true; }; }, { "checked": "checkedChange"; }, ["projected"], ["[strctControlDescription]", "*"], true, never>;
3109
3115
  }
3110
3116
 
3111
3117
  /** On/off switch. Works with `[(ngModel)]` / reactive forms. */
@@ -4194,6 +4200,15 @@ interface StrctDatagridLabels {
4194
4200
  * reorders every row, a page replaces them, a filter hides most of them —
4195
4201
  * none of it is visible to someone who cannot see the table.
4196
4202
  */
4203
+ /** The two empty states, and the way out of the filtered one. */
4204
+ noMatches: string;
4205
+ noMatchesFor: (query: string) => string;
4206
+ clearFilters: string;
4207
+ /** The bulk-selection escape: the page is selected, everything is not. */
4208
+ pageSelected: (shown: number) => string;
4209
+ selectAllCount: (total: number) => string;
4210
+ allSelected: (total: number) => string;
4211
+ clearSelection: string;
4197
4212
  sortedAscending: (column: string) => string;
4198
4213
  sortedDescending: (column: string) => string;
4199
4214
  sortCleared: string;
@@ -4530,6 +4545,13 @@ declare class StrctDatagrid {
4530
4545
  quickFilter: string;
4531
4546
  loadMore: string;
4532
4547
  showing: (shown: number, total?: number) => string;
4548
+ noMatches: string;
4549
+ noMatchesFor: (query: string) => string;
4550
+ clearFilters: string;
4551
+ pageSelected: (shown: number) => string;
4552
+ selectAllCount: (total: number) => string;
4553
+ allSelected: (total: number) => string;
4554
+ clearSelection: string;
4533
4555
  sortedAscending: (column: string) => string;
4534
4556
  sortedDescending: (column: string) => string;
4535
4557
  sortCleared: string;
@@ -4633,6 +4655,29 @@ declare class StrctDatagrid {
4633
4655
  * Tab walks the interactive elements inside each row as usual.
4634
4656
  */
4635
4657
  readonly childrenKey: _angular_core.InputSignal<string | null>;
4658
+ /**
4659
+ * `'table'` (the default) is what the grid has always been: a table whose
4660
+ * controls each take a tab stop. `'grid'` is the APG grid: the table claims
4661
+ * `role="grid"`, the rows carry a roving tabindex so the whole grid is **one**
4662
+ * tab stop, ↑/↓ move the cursor, Home/End jump, →/← step through the focused
4663
+ * row's own controls and Escape comes back out, Space picks and Enter
4664
+ * activates. It also makes a selected row say so — `aria-selected` on a row
4665
+ * reaches no screen reader outside a grid.
4666
+ *
4667
+ * Opt-in, because it changes what Tab does inside the table.
4668
+ */
4669
+ readonly interactionMode: _angular_core.InputSignal<"grid" | "table">;
4670
+ /**
4671
+ * `'none'` hides the tick / radio column while selection keeps working — a
4672
+ * file list selects by clicking the row, not a control in it. The row is
4673
+ * then the control, so pair it with `interactionMode="grid"`.
4674
+ */
4675
+ readonly selectionColumn: _angular_core.InputSignal<"none" | "auto">;
4676
+ /**
4677
+ * The row was opened: a double-click, or Enter on the focused row in grid
4678
+ * mode. Selection is "which rows do I mean"; activation is "go".
4679
+ */
4680
+ readonly rowActivate: _angular_core.OutputEmitterRef<StrctRow>;
4636
4681
  /** Emitted when the selection changes. */
4637
4682
  readonly selectionChange: _angular_core.OutputEmitterRef<StrctRow[]>;
4638
4683
  /** Emitted when the refresh button is clicked. */
@@ -4731,6 +4776,25 @@ declare class StrctDatagrid {
4731
4776
  protected setTextFilter(key: string, value: string): void;
4732
4777
  protected optionChecked(key: string, opt: unknown): boolean;
4733
4778
  protected toggleFilterOption(key: string, opt: unknown): void;
4779
+ /**
4780
+ * The escape every bulk workflow needs: the header tick selects the page,
4781
+ * and nothing says the other pages exist. Offered only when the grid holds
4782
+ * the rows — in `lazy` mode it cannot name rows the server has not sent,
4783
+ * and selecting them would be a lie.
4784
+ */
4785
+ protected readonly bulkHint: _angular_core.Signal<{
4786
+ text: string;
4787
+ action: string;
4788
+ run: () => void;
4789
+ } | null>;
4790
+ /** Select every row the filter allows, not only the page. */
4791
+ selectAllFiltered(): void;
4792
+ /** Rows exist, but nothing the filter allows — the undoable empty. */
4793
+ protected readonly filteredAway: _angular_core.Signal<boolean>;
4794
+ protected readonly anyFilter: _angular_core.Signal<boolean>;
4795
+ protected noMatchesDescription(): string;
4796
+ /** The way back out of the filtered empty state. */
4797
+ protected clearAllFilters(): void;
4734
4798
  protected clearFilter(key: string): void;
4735
4799
  protected onDocClickOverlays(event: MouseEvent): void;
4736
4800
  /** Escape closes the topmost transient surface and hands focus back to its
@@ -4752,6 +4816,20 @@ declare class StrctDatagrid {
4752
4816
  private readonly activeTreeRow;
4753
4817
  protected treeRowTabindex(row: StrctRow): number;
4754
4818
  protected onTreeRowKeydown(row: StrctRow, event: KeyboardEvent): void;
4819
+ /** The row the grid's single tab stop is on. */
4820
+ private readonly cursorRow;
4821
+ protected gridRowTabindex(row: StrctRow): number;
4822
+ /** The focused row's own controls, in the order the arrows visit them. */
4823
+ private rowControls;
4824
+ protected onGridRowKeydown(row: StrctRow, event: KeyboardEvent): void;
4825
+ /** Move the cursor to the row at `idx` and focus it once it has rendered. */
4826
+ private focusGridRow;
4827
+ /**
4828
+ * "Go": a double-click, or Enter on the focused row. It opens the detail
4829
+ * pane where there is one — a row click that shows the row is what every
4830
+ * console does — and always tells the consumer.
4831
+ */
4832
+ protected onRowActivate(row: StrctRow): void;
4755
4833
  /** Move the roving tabindex to the row at `idx` and focus its element once
4756
4834
  * the new tabindex has rendered. */
4757
4835
  private focusTreeRow;
@@ -4881,6 +4959,13 @@ declare class StrctDatagrid {
4881
4959
  /** `selectionMode` wins; `selectable` is the pre-4.8 spelling of 'multiple'. */
4882
4960
  protected readonly mode: _angular_core.Signal<"none" | "multiple" | "single">;
4883
4961
  protected readonly hasSelectionColumn: _angular_core.Signal<boolean>;
4962
+ /** The grid interaction model, opt-in. */
4963
+ protected readonly gridMode: _angular_core.Signal<boolean>;
4964
+ /**
4965
+ * In grid mode the row is the tab stop and its controls are reached with the
4966
+ * arrows, so they leave the tab order; in table mode nothing changes.
4967
+ */
4968
+ protected ctlTabindex(): number | null;
4884
4969
  /** One radio group per grid instance. */
4885
4970
  protected readonly radioName: string;
4886
4971
  /**
@@ -5019,7 +5104,7 @@ declare class StrctDatagrid {
5019
5104
  private compareRows;
5020
5105
  private compare;
5021
5106
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctDatagrid, never>;
5022
- 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; }; "paneListWidth": { "alias": "paneListWidth"; "required": false; "isSignal": true; }; "paneTakeoverWidth": { "alias": "paneTakeoverWidth"; "required": false; "isSignal": true; }; "activeRowId": { "alias": "activeRowId"; "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; }; "groups": { "alias": "groups"; "required": false; "isSignal": true; }; "showEmptyGroups": { "alias": "showEmptyGroups"; "required": false; "isSignal": true; }; "collapsedGroups": { "alias": "collapsedGroups"; "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; }; }, { "activeRowId": "activeRowIdChange"; "selectedId": "selectedIdChange"; "loadMore": "loadMore"; "selectedIds": "selectedIdsChange"; "columnState": "columnStateChange"; "collapsedGroups": "collapsedGroupsChange"; "filters": "filtersChange"; "quickFilter": "quickFilterChange"; "selectionChange": "selectionChange"; "syncChange": "syncChange"; "rowAction": "rowAction"; "lazyLoad": "lazyLoad"; "cellEdit": "cellEdit"; }, ["detailDef", "groupHeaderDef", "paneTitleDef", "actionBarDef", "actionBarCaptionDef", "cellDefs"], ["[strctDatagridActionBarCaption]", "[strctDatagridActionBar]", "[strctDetailPaneTitle]", "[strctDetailPaneMeta]", "[strctDetailPaneActions]"], true, never>;
5107
+ 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; }; "paneListWidth": { "alias": "paneListWidth"; "required": false; "isSignal": true; }; "paneTakeoverWidth": { "alias": "paneTakeoverWidth"; "required": false; "isSignal": true; }; "activeRowId": { "alias": "activeRowId"; "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; }; "groups": { "alias": "groups"; "required": false; "isSignal": true; }; "showEmptyGroups": { "alias": "showEmptyGroups"; "required": false; "isSignal": true; }; "collapsedGroups": { "alias": "collapsedGroups"; "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; }; "interactionMode": { "alias": "interactionMode"; "required": false; "isSignal": true; }; "selectionColumn": { "alias": "selectionColumn"; "required": false; "isSignal": true; }; }, { "activeRowId": "activeRowIdChange"; "selectedId": "selectedIdChange"; "loadMore": "loadMore"; "selectedIds": "selectedIdsChange"; "columnState": "columnStateChange"; "collapsedGroups": "collapsedGroupsChange"; "filters": "filtersChange"; "quickFilter": "quickFilterChange"; "rowActivate": "rowActivate"; "selectionChange": "selectionChange"; "syncChange": "syncChange"; "rowAction": "rowAction"; "lazyLoad": "lazyLoad"; "cellEdit": "cellEdit"; }, ["detailDef", "groupHeaderDef", "paneTitleDef", "actionBarDef", "actionBarCaptionDef", "cellDefs"], ["[strctDatagridActionBarCaption]", "[strctDatagridActionBar]", "[strctDetailPaneTitle]", "[strctDetailPaneMeta]", "[strctDetailPaneActions]"], true, never>;
5023
5108
  }
5024
5109
 
5025
5110
  /** Timeline node state colors. */