@akcelik/strct 5.17.0 → 5.19.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.17.0",
3
+ "version": "5.19.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",
@@ -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. */
@@ -4189,6 +4195,16 @@ interface StrctDatagridLabels {
4189
4195
  loadMore: string;
4190
4196
  /** `paging="more"`: what the footer says it is showing. */
4191
4197
  showing: (shown: number, total?: number) => string;
4198
+ /**
4199
+ * What the grid announces after it changes under the reader: sorting
4200
+ * reorders every row, a page replaces them, a filter hides most of them —
4201
+ * none of it is visible to someone who cannot see the table.
4202
+ */
4203
+ sortedAscending: (column: string) => string;
4204
+ sortedDescending: (column: string) => string;
4205
+ sortCleared: string;
4206
+ pageOf: (page: number, pages: number) => string;
4207
+ rowsMatch: (shown: number, total: number) => string;
4192
4208
  }
4193
4209
  /** Resolves a stable identity for a row: a property key, or a function. */
4194
4210
  type StrctRowId = string | ((row: StrctRow) => unknown);
@@ -4520,6 +4536,11 @@ declare class StrctDatagrid {
4520
4536
  quickFilter: string;
4521
4537
  loadMore: string;
4522
4538
  showing: (shown: number, total?: number) => string;
4539
+ sortedAscending: (column: string) => string;
4540
+ sortedDescending: (column: string) => string;
4541
+ sortCleared: string;
4542
+ pageOf: (page: number, pages: number) => string;
4543
+ rowsMatch: (shown: number, total: number) => string;
4523
4544
  }>;
4524
4545
  /**
4525
4546
  * Virtual scrolling for large data sets: only the rows inside the viewport
@@ -4618,6 +4639,29 @@ declare class StrctDatagrid {
4618
4639
  * Tab walks the interactive elements inside each row as usual.
4619
4640
  */
4620
4641
  readonly childrenKey: _angular_core.InputSignal<string | null>;
4642
+ /**
4643
+ * `'table'` (the default) is what the grid has always been: a table whose
4644
+ * controls each take a tab stop. `'grid'` is the APG grid: the table claims
4645
+ * `role="grid"`, the rows carry a roving tabindex so the whole grid is **one**
4646
+ * tab stop, ↑/↓ move the cursor, Home/End jump, →/← step through the focused
4647
+ * row's own controls and Escape comes back out, Space picks and Enter
4648
+ * activates. It also makes a selected row say so — `aria-selected` on a row
4649
+ * reaches no screen reader outside a grid.
4650
+ *
4651
+ * Opt-in, because it changes what Tab does inside the table.
4652
+ */
4653
+ readonly interactionMode: _angular_core.InputSignal<"grid" | "table">;
4654
+ /**
4655
+ * `'none'` hides the tick / radio column while selection keeps working — a
4656
+ * file list selects by clicking the row, not a control in it. The row is
4657
+ * then the control, so pair it with `interactionMode="grid"`.
4658
+ */
4659
+ readonly selectionColumn: _angular_core.InputSignal<"none" | "auto">;
4660
+ /**
4661
+ * The row was opened: a double-click, or Enter on the focused row in grid
4662
+ * mode. Selection is "which rows do I mean"; activation is "go".
4663
+ */
4664
+ readonly rowActivate: _angular_core.OutputEmitterRef<StrctRow>;
4621
4665
  /** Emitted when the selection changes. */
4622
4666
  readonly selectionChange: _angular_core.OutputEmitterRef<StrctRow[]>;
4623
4667
  /** Emitted when the refresh button is clicked. */
@@ -4656,6 +4700,10 @@ declare class StrctDatagrid {
4656
4700
  private readonly cellDefs;
4657
4701
  private readonly cellMap;
4658
4702
  readonly page: _angular_core.WritableSignal<number>;
4703
+ /** What the polite region is saying right now; '' until something happens. */
4704
+ protected readonly announcement: _angular_core.WritableSignal<string>;
4705
+ /** The first filtered() run is the initial render, which announces nothing. */
4706
+ private filterSettled;
4659
4707
  private readonly sort;
4660
4708
  /** Selection / expansion are tracked by row id (see {@link rowId}). */
4661
4709
  private readonly selected;
@@ -4733,6 +4781,20 @@ declare class StrctDatagrid {
4733
4781
  private readonly activeTreeRow;
4734
4782
  protected treeRowTabindex(row: StrctRow): number;
4735
4783
  protected onTreeRowKeydown(row: StrctRow, event: KeyboardEvent): void;
4784
+ /** The row the grid's single tab stop is on. */
4785
+ private readonly cursorRow;
4786
+ protected gridRowTabindex(row: StrctRow): number;
4787
+ /** The focused row's own controls, in the order the arrows visit them. */
4788
+ private rowControls;
4789
+ protected onGridRowKeydown(row: StrctRow, event: KeyboardEvent): void;
4790
+ /** Move the cursor to the row at `idx` and focus it once it has rendered. */
4791
+ private focusGridRow;
4792
+ /**
4793
+ * "Go": a double-click, or Enter on the focused row. It opens the detail
4794
+ * pane where there is one — a row click that shows the row is what every
4795
+ * console does — and always tells the consumer.
4796
+ */
4797
+ protected onRowActivate(row: StrctRow): void;
4736
4798
  /** Move the roving tabindex to the row at `idx` and focus its element once
4737
4799
  * the new tabindex has rendered. */
4738
4800
  private focusTreeRow;
@@ -4862,6 +4924,13 @@ declare class StrctDatagrid {
4862
4924
  /** `selectionMode` wins; `selectable` is the pre-4.8 spelling of 'multiple'. */
4863
4925
  protected readonly mode: _angular_core.Signal<"none" | "multiple" | "single">;
4864
4926
  protected readonly hasSelectionColumn: _angular_core.Signal<boolean>;
4927
+ /** The grid interaction model, opt-in. */
4928
+ protected readonly gridMode: _angular_core.Signal<boolean>;
4929
+ /**
4930
+ * In grid mode the row is the tab stop and its controls are reached with the
4931
+ * arrows, so they leave the tab order; in table mode nothing changes.
4932
+ */
4933
+ protected ctlTabindex(): number | null;
4865
4934
  /** One radio group per grid instance. */
4866
4935
  protected readonly radioName: string;
4867
4936
  /**
@@ -4940,6 +5009,13 @@ declare class StrctDatagrid {
4940
5009
  /** Open the row-action menu next to the clicked kebab button. */
4941
5010
  protected openRowMenu(row: StrctRow, event: MouseEvent): void;
4942
5011
  sortBy(key: string): void;
5012
+ /** The pager's own change, plus what it means for a reader. */
5013
+ protected goToPage(page: number): void;
5014
+ /**
5015
+ * Says something once. The same text twice in a row would be dropped by a
5016
+ * screen reader, so a repeat is nudged with a trailing space.
5017
+ */
5018
+ private announce;
4943
5019
  protected sortIcon(key: string): string;
4944
5020
  protected ariaSort(key: string): 'ascending' | 'descending' | 'none';
4945
5021
  protected onHeaderSpace(event: Event, key: string): void;
@@ -4993,7 +5069,7 @@ declare class StrctDatagrid {
4993
5069
  private compareRows;
4994
5070
  private compare;
4995
5071
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctDatagrid, never>;
4996
- 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>;
5072
+ 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>;
4997
5073
  }
4998
5074
 
4999
5075
  /** Timeline node state colors. */