@truenas/ui-components 0.3.25 → 0.4.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": "@truenas/ui-components",
3
- "version": "0.3.25",
3
+ "version": "0.4.0",
4
4
  "publishConfig": {
5
5
  "registry": "https://registry.npmjs.org",
6
6
  "access": "public"
@@ -5933,6 +5933,15 @@ declare class TnTableComponent<T = unknown> implements OnInit {
5933
5933
  * the row by id in your data source before assigning here.
5934
5934
  */
5935
5935
  activeRow: _angular_core.InputSignal<T | null>;
5936
+ /**
5937
+ * Optional predicate marking rows as active, in addition to `activeRow`.
5938
+ * Use when several rows can be active at once (e.g. multi-selection
5939
+ * highlighting) or when matching by key rather than by reference. Active
5940
+ * rows get the same `tn-table__row--active` styling and, when `clickable`,
5941
+ * `aria-selected`. Re-evaluated on each change detection, so it may depend
5942
+ * on signals — keep it cheap and pure.
5943
+ */
5944
+ activeWhen: _angular_core.InputSignal<((row: T) => boolean) | undefined>;
5936
5945
  /**
5937
5946
  * Overrides the active-row background color. Accepts any CSS color value
5938
5947
  * (`#hex`, `rgb()`, `var(--token)`). Defaults to `--tn-bg3` when null.
@@ -5961,6 +5970,13 @@ declare class TnTableComponent<T = unknown> implements OnInit {
5961
5970
  selectionChange: _angular_core.OutputEmitterRef<T[]>;
5962
5971
  /** Emits the row when a clickable row is activated (click or Enter/Space). */
5963
5972
  rowClick: _angular_core.OutputEmitterRef<T>;
5973
+ /**
5974
+ * Emits the row when a clickable row is double-clicked. Double-click has no
5975
+ * keyboard equivalent (Enter/Space emit `rowClick`), so consumers must
5976
+ * provide an accessible alternative for the same action — e.g. a dedicated
5977
+ * button inside the row, as the file picker does for entering directories.
5978
+ */
5979
+ rowDoubleClick: _angular_core.OutputEmitterRef<T>;
5964
5980
  columnDefs: _angular_core.Signal<readonly TnTableColumnDirective[]>;
5965
5981
  detailRowDef: _angular_core.Signal<TnDetailRowDefDirective | undefined>;
5966
5982
  sortColumn: _angular_core.WritableSignal<string>;
@@ -5997,6 +6013,7 @@ declare class TnTableComponent<T = unknown> implements OnInit {
5997
6013
  isRowExpanded(row: T): boolean;
5998
6014
  isRowActive(row: T): boolean;
5999
6015
  onRowClick(row: T): void;
6016
+ onRowDoubleClick(row: T): void;
6000
6017
  onRowKeydown(event: KeyboardEvent, row: T): void;
6001
6018
  toggleSelectAll(): void;
6002
6019
  toggleRowSelection(row: T): void;
@@ -6004,7 +6021,7 @@ declare class TnTableComponent<T = unknown> implements OnInit {
6004
6021
  getColumnDef(columnName: string): TnTableColumnDirective | undefined;
6005
6022
  getCellValue(row: T, column: string): unknown;
6006
6023
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnTableComponent<any>, never>;
6007
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnTableComponent<any>, "tn-table", never, { "dataSource": { "alias": "dataSource"; "required": false; "isSignal": true; }; "displayedColumns": { "alias": "displayedColumns"; "required": false; "isSignal": true; }; "trackBy": { "alias": "trackBy"; "required": false; "isSignal": true; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; "isSignal": true; }; "emptyIcon": { "alias": "emptyIcon"; "required": false; "isSignal": true; }; "selectable": { "alias": "selectable"; "required": false; "isSignal": true; }; "expandable": { "alias": "expandable"; "required": false; "isSignal": true; }; "bordered": { "alias": "bordered"; "required": false; "isSignal": true; }; "isRowExpandable": { "alias": "isRowExpandable"; "required": false; "isSignal": true; }; "activeRow": { "alias": "activeRow"; "required": false; "isSignal": true; }; "activeBg": { "alias": "activeBg"; "required": false; "isSignal": true; }; "activeIndicator": { "alias": "activeIndicator"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "loadingMessage": { "alias": "loadingMessage"; "required": false; "isSignal": true; }; "clickable": { "alias": "clickable"; "required": false; "isSignal": true; }; }, { "sortChange": "sortChange"; "selectionChange": "selectionChange"; "rowClick": "rowClick"; }, ["columnDefs", "detailRowDef"], never, true, [{ directive: typeof TnTestIdDirective; inputs: { "tnTestId": "testId"; }; outputs: {}; }]>;
6024
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnTableComponent<any>, "tn-table", never, { "dataSource": { "alias": "dataSource"; "required": false; "isSignal": true; }; "displayedColumns": { "alias": "displayedColumns"; "required": false; "isSignal": true; }; "trackBy": { "alias": "trackBy"; "required": false; "isSignal": true; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; "isSignal": true; }; "emptyIcon": { "alias": "emptyIcon"; "required": false; "isSignal": true; }; "selectable": { "alias": "selectable"; "required": false; "isSignal": true; }; "expandable": { "alias": "expandable"; "required": false; "isSignal": true; }; "bordered": { "alias": "bordered"; "required": false; "isSignal": true; }; "isRowExpandable": { "alias": "isRowExpandable"; "required": false; "isSignal": true; }; "activeRow": { "alias": "activeRow"; "required": false; "isSignal": true; }; "activeWhen": { "alias": "activeWhen"; "required": false; "isSignal": true; }; "activeBg": { "alias": "activeBg"; "required": false; "isSignal": true; }; "activeIndicator": { "alias": "activeIndicator"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "loadingMessage": { "alias": "loadingMessage"; "required": false; "isSignal": true; }; "clickable": { "alias": "clickable"; "required": false; "isSignal": true; }; }, { "sortChange": "sortChange"; "selectionChange": "selectionChange"; "rowClick": "rowClick"; "rowDoubleClick": "rowDoubleClick"; }, ["columnDefs", "detailRowDef"], never, true, [{ directive: typeof TnTestIdDirective; inputs: { "tnTestId": "testId"; }; outputs: {}; }]>;
6008
6025
  }
6009
6026
 
6010
6027
  /**
@@ -6136,6 +6153,14 @@ declare class TnTableHarness extends ComponentHarness {
6136
6153
  * @param rowIndex Zero-based index of the data row.
6137
6154
  */
6138
6155
  clickRow(rowIndex: number): Promise<void>;
6156
+ /**
6157
+ * Double-clicks a row (for tables with `clickable` enabled), triggering
6158
+ * `rowDoubleClick`. Note that a real double-click also fires two single
6159
+ * clicks first; this helper dispatches only the `dblclick` event.
6160
+ *
6161
+ * @param rowIndex Zero-based index of the data row.
6162
+ */
6163
+ doubleClickRow(rowIndex: number): Promise<void>;
6139
6164
  /**
6140
6165
  * Sends a keyboard event to a row (Enter/Space activate clickable rows).
6141
6166
  *
@@ -6572,7 +6597,12 @@ declare class TnNestedTreeNodeComponent<T, K = T> extends CdkNestedTreeNode<T, K
6572
6597
  * defaults to the previous hardcoded value.
6573
6598
  */
6574
6599
  readonly toggleAriaLabel: _angular_core.InputSignal<string>;
6575
- /** Semantic test-id base applied to the built-in toggle button (`button-` prefixed). */
6600
+ /**
6601
+ * Semantic test-id base applied to the built-in toggle button (`button-`
6602
+ * prefixed). When unset, derives from the node's own `testId` — a row with
6603
+ * `[testId]="['vdev', guid]"` gets `button-toggle-vdev-<guid>` — so every
6604
+ * identified row has an addressable expand control without repeating the id.
6605
+ */
6576
6606
  readonly toggleTestId: _angular_core.InputSignal<TnTestIdValue>;
6577
6607
  /**
6578
6608
  * Suppresses the built-in toggle button (and its alignment spacer) so the
@@ -6584,7 +6614,10 @@ declare class TnNestedTreeNodeComponent<T, K = T> extends CdkNestedTreeNode<T, K
6584
6614
  */
6585
6615
  readonly hideToggle: _angular_core.InputSignalWithTransform<boolean, unknown>;
6586
6616
  private readonly changeDetectorRef;
6617
+ private readonly hostTestId;
6587
6618
  private destroyed;
6619
+ /** Explicit `toggleTestId` wins; otherwise `toggle`-scoped from the node's `testId`. */
6620
+ protected readonly resolvedToggleTestId: _angular_core.Signal<TnTestIdValue>;
6588
6621
  constructor();
6589
6622
  /** The tree node's level in the tree */
6590
6623
  get level(): number;
@@ -6744,8 +6777,6 @@ interface TnTreeNodeHarnessFilters extends BaseHarnessFilters {
6744
6777
  /** Only find nodes at the given 0-based level (root nodes are 0). */
6745
6778
  level?: number;
6746
6779
  }
6747
- /** Filters for finding `TnTreeHarness` instances. */
6748
- type TnTreeHarnessFilters = BaseHarnessFilters;
6749
6780
  /**
6750
6781
  * Harness for interacting with a single `tn-tree-node` or `tn-nested-tree-node`.
6751
6782
  *
@@ -6817,6 +6848,9 @@ declare class TnTreeNodeHarness extends ComponentHarness {
6817
6848
  collapse(): Promise<void>;
6818
6849
  private getToggle;
6819
6850
  }
6851
+
6852
+ /** Filters for finding `TnTreeHarness` instances. */
6853
+ type TnTreeHarnessFilters = BaseHarnessFilters;
6820
6854
  /**
6821
6855
  * Harness for interacting with `tn-tree` in tests.
6822
6856
  *
@@ -7446,53 +7480,6 @@ declare function labelMarkupToHtml(value: string): string;
7446
7480
  */
7447
7481
  declare function labelMarkupToText(value: string): string;
7448
7482
 
7449
- declare class StripMntPrefixPipe implements PipeTransform {
7450
- transform(path: string | null | undefined): string;
7451
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<StripMntPrefixPipe, never>;
7452
- static ɵpipe: _angular_core.ɵɵPipeDeclaration<StripMntPrefixPipe, "tnStripMntPrefix", true>;
7453
- }
7454
-
7455
- interface FileSystemItem {
7456
- path: string;
7457
- name: string;
7458
- type: 'file' | 'folder' | 'dataset' | 'zvol' | 'mountpoint';
7459
- size?: number;
7460
- modified?: Date;
7461
- permissions?: 'read' | 'write' | 'none';
7462
- icon?: string;
7463
- disabled?: boolean;
7464
- isCreating?: boolean;
7465
- tempId?: string;
7466
- creationError?: string;
7467
- }
7468
- interface FilePickerCallbacks {
7469
- getChildren?: (path: string) => Promise<FileSystemItem[]>;
7470
- validatePath?: (path: string) => Promise<boolean>;
7471
- createFolder?: (parentPath: string, name: string) => Promise<string>;
7472
- createDataset?: (parentPath: string) => Promise<string>;
7473
- createZvol?: (parentPath: string) => Promise<string>;
7474
- }
7475
- interface CreateFolderEvent {
7476
- parentPath: string;
7477
- folderName: string;
7478
- }
7479
- interface FilePickerError {
7480
- type: 'navigation' | 'permission' | 'creation' | 'validation';
7481
- message: string;
7482
- path?: string;
7483
- }
7484
- interface PathSegment {
7485
- name: string;
7486
- path: string;
7487
- }
7488
- type FilePickerMode = 'file' | 'folder' | 'dataset' | 'zvol' | 'any';
7489
-
7490
- declare class TruncatePathPipe implements PipeTransform {
7491
- transform(path: string): PathSegment[];
7492
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<TruncatePathPipe, never>;
7493
- static ɵpipe: _angular_core.ɵɵPipeDeclaration<TruncatePathPipe, "tnTruncatePath", true>;
7494
- }
7495
-
7496
7483
  type SpinnerMode = 'determinate' | 'indeterminate';
7497
7484
  declare class TnSpinnerComponent {
7498
7485
  mode: _angular_core.InputSignal<SpinnerMode>;
@@ -9036,12 +9023,89 @@ interface StepperHarnessFilters extends BaseHarnessFilters {
9036
9023
  orientation?: 'horizontal' | 'vertical';
9037
9024
  }
9038
9025
 
9026
+ interface FileSystemItem {
9027
+ path: string;
9028
+ name: string;
9029
+ type: 'file' | 'folder' | 'dataset' | 'zvol' | 'mountpoint';
9030
+ size?: number;
9031
+ modified?: Date;
9032
+ permissions?: 'read' | 'write' | 'none';
9033
+ /**
9034
+ * Fully-qualified sprite icon id overriding the type-based default, e.g.
9035
+ * 'mdi-folder' or 'tn-dataset'. Mark the icon for sprite inclusion with
9036
+ * `tnIconMarker` in the consuming code.
9037
+ */
9038
+ icon?: string;
9039
+ disabled?: boolean;
9040
+ }
9041
+ interface FilePickerCallbacks {
9042
+ getChildren?: (path: string) => Promise<FileSystemItem[]>;
9043
+ validatePath?: (path: string) => Promise<boolean>;
9044
+ }
9045
+ /**
9046
+ * A consumer-defined creation flow surfaced as a button in the picker footer,
9047
+ * e.g. creating a dataset or zvol through a dialog. The creation itself
9048
+ * always happens outside the picker — either in a fully consumer-owned flow
9049
+ * (`createAction` event) or through the pluggable inline flow (`create`).
9050
+ */
9051
+ interface FilePickerCreateAction {
9052
+ /** Identifies the action in `createAction` events, e.g. 'dataset'. */
9053
+ id: string;
9054
+ /** Button label. */
9055
+ label: string;
9056
+ /**
9057
+ * Fully-qualified sprite icon id shown in the inline creation row,
9058
+ * e.g. 'tn-dataset'. Defaults to 'mdi-folder'.
9059
+ */
9060
+ icon?: string;
9061
+ /**
9062
+ * Opts into the built-in inline creation row. Pressing the action's button
9063
+ * then renders an editable name row at the top of the listing instead of
9064
+ * emitting `createAction`; submitting calls this with the browsed directory
9065
+ * and the entered name — the implementation does the real work (e.g. a
9066
+ * websocket API call). Resolve with the created path: the picker refreshes
9067
+ * the listing and selects it. Reject with an Error to show its message as
9068
+ * the inline error and keep the row editable for retry. Name validation
9069
+ * (duplicates, invalid characters, …) belongs in this callback.
9070
+ *
9071
+ * The row auto-submits when it loses focus with a non-empty name
9072
+ * (matching inline-rename conventions), so this callback can also fire
9073
+ * when the user clicks away — including on a click that navigates
9074
+ * elsewhere, which abandons the row and silently discards the resolved
9075
+ * path even though the item was created. Implementations should tolerate
9076
+ * that (e.g. creation is cheap to leave behind, or idempotent).
9077
+ */
9078
+ create?: (parentPath: string, name: string) => Promise<string>;
9079
+ }
9080
+ interface FilePickerCreateActionEvent {
9081
+ actionId: string;
9082
+ /** Directory being browsed when the action was triggered. */
9083
+ parentPath: string;
9084
+ }
9085
+ interface FilePickerError {
9086
+ type: 'navigation' | 'permission' | 'creation' | 'validation';
9087
+ message: string;
9088
+ path?: string;
9089
+ }
9090
+ interface PathSegment {
9091
+ name: string;
9092
+ path: string;
9093
+ }
9094
+ type FileSystemItemType = FileSystemItem['type'];
9095
+ type FilePickerMode = 'file' | 'folder' | 'dataset' | 'zvol' | 'any';
9096
+
9039
9097
  declare class TnFilePickerComponent implements ControlValueAccessor, OnInit, OnDestroy {
9040
- mode: _angular_core.InputSignal<FilePickerMode>;
9098
+ /**
9099
+ * What can be selected: a single mode, or an explicit list of selectable
9100
+ * item types, e.g. ['folder', 'dataset']. Whenever a directory-like type
9101
+ * (folder, dataset, mountpoint) is selectable, an empty selection stands
9102
+ * for the directory being browsed and submitting it picks `currentPath` —
9103
+ * this keeps empty directories selectable.
9104
+ */
9105
+ mode: _angular_core.InputSignal<FilePickerMode | ("file" | "folder" | "dataset" | "zvol" | "mountpoint")[]>;
9041
9106
  multiSelect: _angular_core.InputSignal<boolean>;
9042
- allowCreate: _angular_core.InputSignal<boolean>;
9043
- allowDatasetCreate: _angular_core.InputSignal<boolean>;
9044
- allowZvolCreate: _angular_core.InputSignal<boolean>;
9107
+ /** Consumer-defined creation flows shown as buttons in the popup footer. */
9108
+ createActions: _angular_core.InputSignal<FilePickerCreateAction[]>;
9045
9109
  allowManualInput: _angular_core.InputSignal<boolean>;
9046
9110
  placeholder: _angular_core.InputSignal<string>;
9047
9111
  disabled: _angular_core.InputSignal<boolean>;
@@ -9051,12 +9115,14 @@ declare class TnFilePickerComponent implements ControlValueAccessor, OnInit, OnD
9051
9115
  */
9052
9116
  testId: _angular_core.InputSignal<TnTestIdValue>;
9053
9117
  startPath: _angular_core.InputSignal<string>;
9118
+ /** Restricts navigation — users cannot navigate above this path. */
9054
9119
  rootPath: _angular_core.InputSignal<string | undefined>;
9055
9120
  fileExtensions: _angular_core.InputSignal<string[] | undefined>;
9056
9121
  callbacks: _angular_core.InputSignal<FilePickerCallbacks | undefined>;
9057
9122
  selectionChange: _angular_core.OutputEmitterRef<string | string[]>;
9058
9123
  pathChange: _angular_core.OutputEmitterRef<string>;
9059
- createFolder: _angular_core.OutputEmitterRef<CreateFolderEvent>;
9124
+ /** Re-emitted from the popup when one of the `createActions` buttons is pressed. */
9125
+ createAction: _angular_core.OutputEmitterRef<FilePickerCreateActionEvent>;
9060
9126
  error: _angular_core.OutputEmitterRef<FilePickerError>;
9061
9127
  wrapperEl: _angular_core.Signal<ElementRef<HTMLDivElement>>;
9062
9128
  filePickerTemplate: _angular_core.Signal<TemplateRef<unknown>>;
@@ -9070,10 +9136,9 @@ declare class TnFilePickerComponent implements ControlValueAccessor, OnInit, OnD
9070
9136
  selectedItems: _angular_core.WritableSignal<string[]>;
9071
9137
  loading: _angular_core.WritableSignal<boolean>;
9072
9138
  hasError: _angular_core.WritableSignal<boolean>;
9073
- creatingItemTempId: _angular_core.WritableSignal<string | null>;
9074
- creationLoading: _angular_core.WritableSignal<boolean>;
9075
9139
  private formDisabled;
9076
9140
  isDisabled: _angular_core.Signal<boolean>;
9141
+ effectiveRootPath: _angular_core.Signal<string>;
9077
9142
  private onChange;
9078
9143
  private onTouched;
9079
9144
  private overlay;
@@ -9085,7 +9150,13 @@ declare class TnFilePickerComponent implements ControlValueAccessor, OnInit, OnD
9085
9150
  registerOnChange(fn: (value: string | string[]) => void): void;
9086
9151
  registerOnTouched(fn: () => void): void;
9087
9152
  setDisabledState(isDisabled: boolean): void;
9088
- onPathInput(event: Event): void;
9153
+ /**
9154
+ * Commits a manually typed path. Bound to the input's `change` event
9155
+ * (Enter or blur), not `input`: validating per keystroke would emit an
9156
+ * error for every incomplete prefix of a valid path ('/m', '/mn', …)
9157
+ * and spam `validatePath` with paths the user never meant.
9158
+ */
9159
+ onPathCommit(event: Event): void;
9089
9160
  openFilePicker(): void;
9090
9161
  close(): void;
9091
9162
  onItemClick(item: FileSystemItem): void;
@@ -9093,104 +9164,213 @@ declare class TnFilePickerComponent implements ControlValueAccessor, OnInit, OnD
9093
9164
  onSubmit(): void;
9094
9165
  onCancel(): void;
9095
9166
  navigateToPath(path: string): void;
9096
- onCreateFolder(): void;
9167
+ /** An inline `create` flow finished — show the new item selected and applied. */
9168
+ onCreated(path: string): void;
9169
+ /**
9170
+ * Re-fetches the listing of the directory currently being browsed. Call it
9171
+ * when the directory changed outside the picker, e.g. after a
9172
+ * `createAction` flow created something in it.
9173
+ */
9174
+ refresh(): Promise<void>;
9175
+ /**
9176
+ * Programmatically selects `path`, e.g. the mountpoint a `createAction`
9177
+ * flow just created: browses to its parent so the refreshed listing shows
9178
+ * the new item selected, and applies the path as the picker's value (form
9179
+ * value and `selectionChange`). The popup stays open so the user can
9180
+ * confirm with Select or keep browsing. Paths outside `rootPath` are
9181
+ * rejected with a `validation` error — the picker's value honors the same
9182
+ * confinement as navigation and manual input.
9183
+ *
9184
+ * This is a single-path operation: like a manually typed path, it
9185
+ * REPLACES any pending multi-selection rather than appending to it —
9186
+ * the intent is to focus the one path (e.g. a just-created item), not to
9187
+ * merge it into picks the user may have abandoned.
9188
+ */
9189
+ selectPath(path: string): Promise<void>;
9190
+ private clampToRoot;
9191
+ /**
9192
+ * Browsing to another directory drops a not-yet-applied single-select
9193
+ * selection: keeping it would leave the footer claiming an item from a
9194
+ * directory the user is no longer looking at, and would mask the implicit
9195
+ * current-directory selection. Multi-select keeps its selection so items
9196
+ * can be picked across directories. The applied value (`selectedPath`,
9197
+ * form value) is untouched either way.
9198
+ */
9199
+ private clearStalePendingSelection;
9097
9200
  onClearSelection(): void;
9098
- onSubmitFolderName(name: string, tempId: string): Promise<void>;
9099
- onCancelFolderCreation(tempId: string): void;
9100
- private removePendingItem;
9101
- private updateCreatingItemError;
9102
- private validateFolderName;
9103
9201
  private loadDirectory;
9104
9202
  private getMockFileItems;
9203
+ /**
9204
+ * Applies `path` as the picker's whole value. In multi-select this
9205
+ * replaces the selection with the single path — both callers (typed
9206
+ * paths, `selectPath()`) express one deliberate choice, so appending
9207
+ * would be the surprising behavior.
9208
+ */
9105
9209
  private updateSelection;
9106
- private updateSelectionFromItems;
9107
- private toFullPath;
9108
9210
  private emitError;
9109
9211
  private createOverlay;
9110
9212
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnFilePickerComponent, never>;
9111
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnFilePickerComponent, "tn-file-picker", never, { "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "multiSelect": { "alias": "multiSelect"; "required": false; "isSignal": true; }; "allowCreate": { "alias": "allowCreate"; "required": false; "isSignal": true; }; "allowDatasetCreate": { "alias": "allowDatasetCreate"; "required": false; "isSignal": true; }; "allowZvolCreate": { "alias": "allowZvolCreate"; "required": false; "isSignal": true; }; "allowManualInput": { "alias": "allowManualInput"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "testId": { "alias": "testId"; "required": false; "isSignal": true; }; "startPath": { "alias": "startPath"; "required": false; "isSignal": true; }; "rootPath": { "alias": "rootPath"; "required": false; "isSignal": true; }; "fileExtensions": { "alias": "fileExtensions"; "required": false; "isSignal": true; }; "callbacks": { "alias": "callbacks"; "required": false; "isSignal": true; }; }, { "selectionChange": "selectionChange"; "pathChange": "pathChange"; "createFolder": "createFolder"; "error": "error"; }, never, never, true, never>;
9213
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnFilePickerComponent, "tn-file-picker", never, { "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "multiSelect": { "alias": "multiSelect"; "required": false; "isSignal": true; }; "createActions": { "alias": "createActions"; "required": false; "isSignal": true; }; "allowManualInput": { "alias": "allowManualInput"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "testId": { "alias": "testId"; "required": false; "isSignal": true; }; "startPath": { "alias": "startPath"; "required": false; "isSignal": true; }; "rootPath": { "alias": "rootPath"; "required": false; "isSignal": true; }; "fileExtensions": { "alias": "fileExtensions"; "required": false; "isSignal": true; }; "callbacks": { "alias": "callbacks"; "required": false; "isSignal": true; }; }, { "selectionChange": "selectionChange"; "pathChange": "pathChange"; "createAction": "createAction"; "error": "error"; }, never, never, true, never>;
9112
9214
  }
9113
9215
 
9114
- declare class TnFilePickerPopupComponent implements OnInit, AfterViewInit, AfterViewChecked {
9115
- mode: _angular_core.InputSignal<FilePickerMode>;
9216
+ /** State of an open inline creation row. */
9217
+ interface InlineCreationState {
9218
+ action: FilePickerCreateAction;
9219
+ /** Name entered so far, mirrored from the input on every keystroke. */
9220
+ name: string;
9221
+ loading: boolean;
9222
+ error?: string;
9223
+ }
9224
+ /** FileSystemItem decorated for display, plus the synthetic inline-create row. */
9225
+ interface DisplayedFileItem extends FileSystemItem {
9226
+ /** Dim only items with no interaction left. */
9227
+ dimmed: boolean;
9228
+ /** Marks the synthetic first row hosting the inline creation input. */
9229
+ inlineCreate?: boolean;
9230
+ }
9231
+ declare class TnFilePickerPopupComponent implements AfterViewChecked {
9232
+ /**
9233
+ * What can be selected: a single mode, or an explicit list of selectable
9234
+ * item types, e.g. ['folder', 'dataset'].
9235
+ */
9236
+ mode: _angular_core.InputSignal<FilePickerMode | ("file" | "folder" | "dataset" | "zvol" | "mountpoint")[]>;
9116
9237
  multiSelect: _angular_core.InputSignal<boolean>;
9117
- allowCreate: _angular_core.InputSignal<boolean>;
9118
- allowDatasetCreate: _angular_core.InputSignal<boolean>;
9119
- allowZvolCreate: _angular_core.InputSignal<boolean>;
9238
+ /**
9239
+ * Consumer-defined creation flows rendered as buttons in the footer, next to the
9240
+ * Select button. Pressing one emits `createAction` with the action id and the
9241
+ * currently browsed path.
9242
+ */
9243
+ createActions: _angular_core.InputSignal<FilePickerCreateAction[]>;
9120
9244
  currentPath: _angular_core.InputSignal<string>;
9245
+ /**
9246
+ * Topmost path the breadcrumb can navigate to. It is always the first
9247
+ * breadcrumb segment, rendered with its leading slash drawn as a separator
9248
+ * so the path reads "/ mnt / showcase".
9249
+ */
9250
+ rootPath: _angular_core.InputSignal<string>;
9121
9251
  fileItems: _angular_core.InputSignal<FileSystemItem[]>;
9122
9252
  selectedItems: _angular_core.InputSignal<string[]>;
9123
9253
  loading: _angular_core.InputSignal<boolean>;
9124
- creationLoading: _angular_core.InputSignal<boolean>;
9125
9254
  fileExtensions: _angular_core.InputSignal<string[] | undefined>;
9126
9255
  private iconRegistry;
9256
+ private elementRef;
9127
9257
  constructor();
9128
9258
  /**
9129
- * Register MDI icon library with all icons used by the file picker component
9130
- * This makes the component self-contained with zero configuration required
9259
+ * Requests a focus of the inline creation input on the next view check.
9260
+ * Set when the row opens and when a failed attempt re-enables the input —
9261
+ * the two moments the input either just entered the DOM or just lost focus
9262
+ * to the `disabled` attribute. Cleared once the focus is scheduled, so
9263
+ * focus is NOT permanently forced back: after an error the user can still
9264
+ * click elsewhere without being trapped in the input.
9265
+ */
9266
+ private pendingCreationFocus;
9267
+ /**
9268
+ * Focus runs here rather than at the call sites because the input may not
9269
+ * be in the DOM (or may still be disabled) until a later view check, and a
9270
+ * re-render can replace the element after focus() was scheduled — render
9271
+ * scheduling differs between hosts. So the request keeps retrying on each
9272
+ * check and is cleared only once the input actually holds focus.
9131
9273
  */
9132
- private registerMdiIcons;
9133
- ngOnInit(): void;
9134
- ngAfterViewInit(): void;
9135
9274
  ngAfterViewChecked(): void;
9136
9275
  itemClick: _angular_core.OutputEmitterRef<FileSystemItem>;
9137
9276
  itemDoubleClick: _angular_core.OutputEmitterRef<FileSystemItem>;
9138
9277
  pathNavigate: _angular_core.OutputEmitterRef<string>;
9139
- createFolder: _angular_core.OutputEmitterRef<CreateFolderEvent>;
9278
+ /** Emits when a `createActions` button without a `create` callback is pressed. */
9279
+ createAction: _angular_core.OutputEmitterRef<FilePickerCreateActionEvent>;
9280
+ /** Emits the created path when an inline `create` flow succeeds. */
9281
+ created: _angular_core.OutputEmitterRef<string>;
9140
9282
  clearSelection: _angular_core.OutputEmitterRef<void>;
9141
9283
  close: _angular_core.OutputEmitterRef<void>;
9142
9284
  submit: _angular_core.OutputEmitterRef<void>;
9143
9285
  cancel: _angular_core.OutputEmitterRef<void>;
9144
- submitFolderName: _angular_core.OutputEmitterRef<{
9145
- name: string;
9146
- tempId: string;
9147
- }>;
9148
- cancelFolderCreation: _angular_core.OutputEmitterRef<string>;
9149
9286
  displayedColumns: string[];
9150
- filteredFileItems: _angular_core.Signal<{
9151
- disabled: boolean;
9152
- path: string;
9153
- name: string;
9154
- type: "file" | "folder" | "dataset" | "zvol" | "mountpoint";
9155
- size?: number;
9156
- modified?: Date;
9157
- permissions?: "read" | "write" | "none";
9158
- icon?: string;
9159
- isCreating?: boolean;
9160
- tempId?: string;
9161
- creationError?: string;
9162
- }[]>;
9287
+ /**
9288
+ * Whether an empty selection stands for the directory being browsed: true
9289
+ * whenever the selectable types include a directory-like type. The footer
9290
+ * then names the implicit selection and the Select button stays enabled; on
9291
+ * `submit` with no `selectedItems`, consumers treat `currentPath` as the
9292
+ * selection.
9293
+ */
9294
+ allowCurrentDirectorySelection: _angular_core.Signal<boolean>;
9295
+ filteredFileItems: _angular_core.Signal<DisplayedFileItem[]>;
9163
9296
  onItemClick(item: FileSystemItem): void;
9164
9297
  onItemDoubleClick(item: FileSystemItem): void;
9298
+ onNavigateClick(event: Event, item: FileSystemItem): void;
9165
9299
  navigateToPath(path: string): void;
9166
- onCreateFolder(): void;
9300
+ onCreateAction(action: FilePickerCreateAction): void;
9301
+ /**
9302
+ * Inline creation state while a `create`-capable action's row is open.
9303
+ * The consumer's `create` callback does the real work; the row shows its
9304
+ * rejection message as the inline error. The entered name lives here (not
9305
+ * only in the DOM) so a listing re-render can't wipe it.
9306
+ */
9307
+ inlineCreation: _angular_core.WritableSignal<InlineCreationState | null>;
9308
+ /** Links the inline creation input to its error message for screen readers. */
9309
+ inlineErrorId: string;
9310
+ submitInlineCreation(): Promise<void>;
9311
+ onInlineCreationKeyDown(event: KeyboardEvent): void;
9312
+ /**
9313
+ * Mirrors the typed name into the creation state and clears a shown error
9314
+ * as soon as the name is edited, re-arming blur submit.
9315
+ */
9316
+ onInlineCreationInput(event: Event): void;
9317
+ onInlineCreationBlur(): void;
9167
9318
  onClearSelection(): void;
9168
9319
  onSubmit(): void;
9169
9320
  onCancel(): void;
9170
- onFolderNameSubmit(event: Event, item: FileSystemItem): void;
9171
- onFolderNameCancel(item: FileSystemItem): void;
9172
- onFolderNameInputBlur(event: Event, item: FileSystemItem): void;
9173
- onFolderNameKeyDown(event: KeyboardEvent, item: FileSystemItem): void;
9174
- isCreateDisabled(): boolean;
9175
9321
  isNavigatable(item: FileSystemItem): boolean;
9176
- getItemIcon(item: FileSystemItem): string;
9177
- getFileIcon(filename: string): string;
9178
9322
  /**
9179
- * Get the library type for the icon
9180
- * @param item FileSystemItem
9181
- * @returns 'custom' for TrueNAS custom icons, 'mdi' for Material Design Icons
9323
+ * Fully-qualified sprite icon name for an item. `tnIconMarker`/`libIconMarker`
9324
+ * calls double as build-time markers that pull these icons into the sprite.
9182
9325
  */
9183
- getItemIconLibrary(item: FileSystemItem): 'mdi' | 'custom';
9326
+ getItemIcon(item: FileSystemItem): string;
9327
+ getFileIcon(filename: string): string;
9184
9328
  getZfsBadge(item: FileSystemItem): string;
9185
9329
  isZfsObject(item: FileSystemItem): boolean;
9186
9330
  isSelected(item: FileSystemItem): boolean;
9187
- getRowClass: (row: FileSystemItem) => string | string[];
9188
- getFileInfo(item: FileSystemItem): string;
9189
- formatFileSize(bytes: number): string;
9190
- getTypeDisplayName(type: string): string;
9331
+ /**
9332
+ * Highlights selected rows through the table's supported active-row
9333
+ * styling (`activeWhen`) instead of reaching into its DOM.
9334
+ */
9335
+ isRowSelected: (row: FileSystemItem) => boolean;
9191
9336
  formatDate(date: Date): string;
9192
9337
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnFilePickerPopupComponent, never>;
9193
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnFilePickerPopupComponent, "tn-file-picker-popup", never, { "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "multiSelect": { "alias": "multiSelect"; "required": false; "isSignal": true; }; "allowCreate": { "alias": "allowCreate"; "required": false; "isSignal": true; }; "allowDatasetCreate": { "alias": "allowDatasetCreate"; "required": false; "isSignal": true; }; "allowZvolCreate": { "alias": "allowZvolCreate"; "required": false; "isSignal": true; }; "currentPath": { "alias": "currentPath"; "required": false; "isSignal": true; }; "fileItems": { "alias": "fileItems"; "required": false; "isSignal": true; }; "selectedItems": { "alias": "selectedItems"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "creationLoading": { "alias": "creationLoading"; "required": false; "isSignal": true; }; "fileExtensions": { "alias": "fileExtensions"; "required": false; "isSignal": true; }; }, { "itemClick": "itemClick"; "itemDoubleClick": "itemDoubleClick"; "pathNavigate": "pathNavigate"; "createFolder": "createFolder"; "clearSelection": "clearSelection"; "close": "close"; "submit": "submit"; "cancel": "cancel"; "submitFolderName": "submitFolderName"; "cancelFolderCreation": "cancelFolderCreation"; }, never, never, true, never>;
9338
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnFilePickerPopupComponent, "tn-file-picker-popup", never, { "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "multiSelect": { "alias": "multiSelect"; "required": false; "isSignal": true; }; "createActions": { "alias": "createActions"; "required": false; "isSignal": true; }; "currentPath": { "alias": "currentPath"; "required": false; "isSignal": true; }; "rootPath": { "alias": "rootPath"; "required": false; "isSignal": true; }; "fileItems": { "alias": "fileItems"; "required": false; "isSignal": true; }; "selectedItems": { "alias": "selectedItems"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "fileExtensions": { "alias": "fileExtensions"; "required": false; "isSignal": true; }; }, { "itemClick": "itemClick"; "itemDoubleClick": "itemDoubleClick"; "pathNavigate": "pathNavigate"; "createAction": "createAction"; "created": "created"; "clearSelection": "clearSelection"; "close": "close"; "submit": "submit"; "cancel": "cancel"; }, never, never, true, never>;
9339
+ }
9340
+
9341
+ /** Item types selectable under `mode`; null means every type is selectable. */
9342
+ declare function getSelectableTypes(mode: FilePickerMode | FileSystemItemType[]): FileSystemItemType[] | null;
9343
+ /**
9344
+ * Whether the browsed directory itself is a valid selection under `mode`,
9345
+ * i.e. whether any selectable type is directory-like. An empty selection
9346
+ * then stands for the current directory, which keeps empty directories
9347
+ * selectable.
9348
+ */
9349
+ declare function allowsCurrentDirectorySelection(mode: FilePickerMode | FileSystemItemType[]): boolean;
9350
+
9351
+ /**
9352
+ * Whether `path` is `root` itself or nested anywhere beneath it. A plain
9353
+ * prefix check is not enough: '/mntx' is not within '/mnt', and a path
9354
+ * containing relative segments ('/mnt/../etc') could resolve outside the
9355
+ * root even though it starts with it — such paths are never within the root.
9356
+ */
9357
+ declare function isPathWithinRoot(path: string, root: string): boolean;
9358
+ /**
9359
+ * Collapses trailing slashes so root comparisons are exact: '/mnt/backups/'
9360
+ * would otherwise never equal the '/mnt/backups' produced by navigation.
9361
+ * '/' stays '/'.
9362
+ */
9363
+ declare function normalizeRootPath(root: string): string;
9364
+
9365
+ declare class TruncatePathPipe implements PipeTransform {
9366
+ transform(path: string, rootPath?: string): PathSegment[];
9367
+ /**
9368
+ * Collapses the middle of deep paths into an "…" segment that navigates to the
9369
+ * parent of the first visible directory, e.g. /mnt/a/b/c/d/e/f → /mnt … d e f.
9370
+ */
9371
+ private truncateMiddle;
9372
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TruncatePathPipe, never>;
9373
+ static ɵpipe: _angular_core.ɵɵPipeDeclaration<TruncatePathPipe, "tnTruncatePath", true>;
9194
9374
  }
9195
9375
 
9196
9376
  type TnEmptySize = 'default' | 'compact';
@@ -9754,5 +9934,5 @@ declare const TN_THEME_DEFINITIONS: readonly TnThemeDefinition[];
9754
9934
  */
9755
9935
  declare const THEME_MAP: Map<TnTheme, TnThemeDefinition>;
9756
9936
 
9757
- export { CommonShortcuts, DEFAULT_THEME, DiskIconComponent, DiskType, FileSizePipe, InputType, LIGHT_THEME, LabelMarkupPipe, LabelTextPipe, LinuxModifierKeys, LinuxShortcuts, ModifierKeys, QuickShortcuts, ShortcutBuilder, StripMntPrefixPipe, THEME_MAP, THEME_STORAGE_KEY, TN_FORM_FIELD_CONTEXT, TN_FORM_FIELD_ERRORS, TN_TABLE_PAGER_DEFAULT_LABELS, TN_TABLE_PAGER_LABELS, TN_TEST_ATTR, TN_THEME_DEFINITIONS, TnAutocompleteComponent, TnAutocompleteHarness, TnBannerActionDirective, TnBannerComponent, TnBannerHarness, TnBrandedSpinnerComponent, TnButtonComponent, TnButtonHarness, TnButtonToggleComponent, TnButtonToggleGroupComponent, TnButtonToggleGroupHarness, TnButtonToggleHarness, TnCalendarComponent, TnCalendarHeaderComponent, TnCardComponent, TnCardFooterActionsDirective, TnCardHeaderActionsDirective, TnCardHeaderDirective, TnCellDefDirective, TnCheckboxComponent, TnCheckboxHarness, TnCheckboxLabelDirective, TnChipComponent, TnChipHarness, TnChipInputComponent, TnChipInputHarness, TnConfirmDialogComponent, TnDateInputComponent, TnDateInputHarness, TnDateRangeInputComponent, TnDateRangeInputHarness, TnDetailRowDefDirective, TnDialog, TnDialogHarness, TnDialogShellComponent, TnDialogTesting, TnDividerComponent, TnDividerDirective, TnDrawerComponent, TnDrawerContainerComponent, TnDrawerContainerHarness, TnDrawerContentComponent, TnDrawerHarness, TnEmptyComponent, TnEmptyHarness, TnExpansionPanelComponent, TnExpansionPanelHarness, TnFileInputComponent, TnFileInputHarness, TnFilePickerComponent, TnFilePickerPopupComponent, TnFormFieldComponent, TnFormFieldHarness, TnFormSectionComponent, TnFormSectionHarness, TnHeaderCellDefDirective, TnIconButtonComponent, TnIconButtonHarness, TnIconComponent, TnIconHarness, TnIconRegistryService, TnIconTesting, TnInputComponent, TnInputDirective, TnInputHarness, TnKeyboardShortcutComponent, TnKeyboardShortcutService, TnListAvatarDirective, TnListComponent, TnListIconDirective, TnListItemComponent, TnListItemLineDirective, TnListItemPrimaryDirective, TnListItemSecondaryDirective, TnListItemTitleDirective, TnListItemTrailingDirective, TnListOptionComponent, TnListSubheaderComponent, TnMenuActivateHoverDirective, TnMenuComponent, TnMenuHarness, TnMenuItemComponent, TnMenuTesting, TnMenuTriggerDirective, TnMonthViewComponent, TnMultiYearViewComponent, TnNestedTreeDataSource, TnNestedTreeNodeComponent, TnParticleProgressBarComponent, TnProgressBarComponent, TnRadioComponent, TnRadioHarness, TnSelectComponent, TnSelectHarness, TnSelectionListComponent, TnSidePanelActionDirective, TnSidePanelComponent, TnSidePanelHarness, TnSidePanelHeaderActionDirective, TnSlideToggleComponent, TnSlideToggleHarness, TnSliderComponent, TnSliderThumbDirective, TnSliderWithLabelDirective, TnSpinnerComponent, TnSpriteLoaderService, TnStepComponent, TnStepperComponent, TnStepperHarness, TnStepperNextDirective, TnStepperPreviousDirective, TnTabComponent, TnTabHarness, TnTabPanelComponent, TnTabPanelHarness, TnTableColumnDirective, TnTableComponent, TnTableHarness, TnTablePagerComponent, TnTablePagerHarness, TnTabsComponent, TnTabsHarness, TnTestIdDirective, TnTheme, TnThemeService, TnTimeInputComponent, TnToastComponent, TnToastMock, TnToastPosition, TnToastRef, TnToastService, TnToastTesting, TnToastType, TnTooltipComponent, TnTooltipDirective, TnTreeComponent, TnTreeFlatDataSource, TnTreeFlattener, TnTreeHarness, TnTreeNodeComponent, TnTreeNodeHarness, TnTreeNodeOutletDirective, TnTreeVirtualScrollNodeOutletDirective, TnTreeVirtualScrollViewComponent, TnTreeVirtualScrollViewHarness, TruncatePathPipe, WindowsModifierKeys, WindowsShortcuts, composeTestId, controlTestId, createFlatTreeControl, createLucideLibrary, createNestedTreeControl, createShortcut, defaultSpriteBasePath, defaultSpriteConfigPath, defaultTreeItemSize, formatSize, injectTnFormFieldAria, kebabTestSegment, labelMarkupToHtml, labelMarkupToText, libIconMarker, optionTestId, parseLabelMarkup, parseSize, registerLucideIcons, scopeTestId, setupLucideIntegration, tnIconMarker, writeTestId };
9758
- export type { AutocompleteHarnessFilters, BannerHarnessFilters, ButtonHarnessFilters, ButtonToggleHarnessFilters, CalendarCell, CheckboxHarnessFilters, ChipColor, ChipHarnessFilters, CreateFolderEvent, DateInputHarnessFilters, DateRange, DateRangeInputHarnessFilters, DialogHarnessFilters, EmptyHarnessFilters, ExpansionPanelHarnessFilters, FileInputHarnessFilters, FilePickerCallbacks, FilePickerError, FilePickerMode, FileSystemItem, FlatTreeControlOptions, FormFieldHarnessFilters, FormSectionHarnessFilters, IconButtonHarnessFilters, IconHarnessFilters, IconLibrary, IconLibraryType, IconResult, IconSize, IconSource, IconTestingMockOverrides, InputHarnessFilters, KeyCombination, LabelMarkupSegment, LabelMarkupSegmentType, LabelType, LucideIconOptions, MenuHarnessFilters, MockIconRegistry, MockSpriteLoader, NestedTreeControlOptions, PathSegment, PlatformType, ProgressBarMode, RadioHarnessFilters, ResolvedIcon, SelectHarnessFilters, ShortcutHandler, SidePanelHarnessFilters, SizeStandard, SlideToggleColor, SlideToggleHarnessFilters, SpinnerMode, SpriteConfig, StepperHarnessFilters, SubscriptSizing, TabChangeEvent, TabHarnessFilters, TabPanelHarnessFilters, TabsHarnessFilters, TnAutocompleteOption, TnBannerType, TnButtonToggleType, TnCardAction, TnCardControl, TnCardFooterLink, TnCardHeaderStatus, TnChipInputHarnessFilters, TnChipInputOption, TnConfirmDialogData, TnDialogDefaults, TnDialogOpenTarget, TnDrawerMode, TnDrawerPosition, TnEmptySize, TnFlatTreeNode, TnFormFieldAriaBindings, TnFormFieldContext, TnFormFieldErrorMessage, TnFormFieldErrorMessages, TnFormFieldErrorResolver, TnMenuItem, TnOptionTestIdSource, TnSelectOption, TnSelectOptionGroup, TnSelectionChange, TnSortEvent, TnTableDataProvider, TnTableDataSource, TnTableHarnessFilters, TnTablePagerHarnessFilters, TnTablePagerLabels, TnTablePagination, TnTestAttrName, TnTestIdValue, TnThemeDefinition, TnToastCall, TnToastConfig, TnTreeExpansion, TnTreeHarnessFilters, TnTreeNodeHarnessFilters, TnTreeVirtualNodeData, TnTreeVirtualScrollViewHarnessFilters, TooltipPosition, YearCell };
9937
+ export { CommonShortcuts, DEFAULT_THEME, DiskIconComponent, DiskType, FileSizePipe, InputType, LIGHT_THEME, LabelMarkupPipe, LabelTextPipe, LinuxModifierKeys, LinuxShortcuts, ModifierKeys, QuickShortcuts, ShortcutBuilder, THEME_MAP, THEME_STORAGE_KEY, TN_FORM_FIELD_CONTEXT, TN_FORM_FIELD_ERRORS, TN_TABLE_PAGER_DEFAULT_LABELS, TN_TABLE_PAGER_LABELS, TN_TEST_ATTR, TN_THEME_DEFINITIONS, TnAutocompleteComponent, TnAutocompleteHarness, TnBannerActionDirective, TnBannerComponent, TnBannerHarness, TnBrandedSpinnerComponent, TnButtonComponent, TnButtonHarness, TnButtonToggleComponent, TnButtonToggleGroupComponent, TnButtonToggleGroupHarness, TnButtonToggleHarness, TnCalendarComponent, TnCalendarHeaderComponent, TnCardComponent, TnCardFooterActionsDirective, TnCardHeaderActionsDirective, TnCardHeaderDirective, TnCellDefDirective, TnCheckboxComponent, TnCheckboxHarness, TnCheckboxLabelDirective, TnChipComponent, TnChipHarness, TnChipInputComponent, TnChipInputHarness, TnConfirmDialogComponent, TnDateInputComponent, TnDateInputHarness, TnDateRangeInputComponent, TnDateRangeInputHarness, TnDetailRowDefDirective, TnDialog, TnDialogHarness, TnDialogShellComponent, TnDialogTesting, TnDividerComponent, TnDividerDirective, TnDrawerComponent, TnDrawerContainerComponent, TnDrawerContainerHarness, TnDrawerContentComponent, TnDrawerHarness, TnEmptyComponent, TnEmptyHarness, TnExpansionPanelComponent, TnExpansionPanelHarness, TnFileInputComponent, TnFileInputHarness, TnFilePickerComponent, TnFilePickerPopupComponent, TnFormFieldComponent, TnFormFieldHarness, TnFormSectionComponent, TnFormSectionHarness, TnHeaderCellDefDirective, TnIconButtonComponent, TnIconButtonHarness, TnIconComponent, TnIconHarness, TnIconRegistryService, TnIconTesting, TnInputComponent, TnInputDirective, TnInputHarness, TnKeyboardShortcutComponent, TnKeyboardShortcutService, TnListAvatarDirective, TnListComponent, TnListIconDirective, TnListItemComponent, TnListItemLineDirective, TnListItemPrimaryDirective, TnListItemSecondaryDirective, TnListItemTitleDirective, TnListItemTrailingDirective, TnListOptionComponent, TnListSubheaderComponent, TnMenuActivateHoverDirective, TnMenuComponent, TnMenuHarness, TnMenuItemComponent, TnMenuTesting, TnMenuTriggerDirective, TnMonthViewComponent, TnMultiYearViewComponent, TnNestedTreeDataSource, TnNestedTreeNodeComponent, TnParticleProgressBarComponent, TnProgressBarComponent, TnRadioComponent, TnRadioHarness, TnSelectComponent, TnSelectHarness, TnSelectionListComponent, TnSidePanelActionDirective, TnSidePanelComponent, TnSidePanelHarness, TnSidePanelHeaderActionDirective, TnSlideToggleComponent, TnSlideToggleHarness, TnSliderComponent, TnSliderThumbDirective, TnSliderWithLabelDirective, TnSpinnerComponent, TnSpriteLoaderService, TnStepComponent, TnStepperComponent, TnStepperHarness, TnStepperNextDirective, TnStepperPreviousDirective, TnTabComponent, TnTabHarness, TnTabPanelComponent, TnTabPanelHarness, TnTableColumnDirective, TnTableComponent, TnTableHarness, TnTablePagerComponent, TnTablePagerHarness, TnTabsComponent, TnTabsHarness, TnTestIdDirective, TnTheme, TnThemeService, TnTimeInputComponent, TnToastComponent, TnToastMock, TnToastPosition, TnToastRef, TnToastService, TnToastTesting, TnToastType, TnTooltipComponent, TnTooltipDirective, TnTreeComponent, TnTreeFlatDataSource, TnTreeFlattener, TnTreeHarness, TnTreeNodeComponent, TnTreeNodeHarness, TnTreeNodeOutletDirective, TnTreeVirtualScrollNodeOutletDirective, TnTreeVirtualScrollViewComponent, TnTreeVirtualScrollViewHarness, TruncatePathPipe, WindowsModifierKeys, WindowsShortcuts, allowsCurrentDirectorySelection, composeTestId, controlTestId, createFlatTreeControl, createLucideLibrary, createNestedTreeControl, createShortcut, defaultSpriteBasePath, defaultSpriteConfigPath, defaultTreeItemSize, formatSize, getSelectableTypes, injectTnFormFieldAria, isPathWithinRoot, kebabTestSegment, labelMarkupToHtml, labelMarkupToText, libIconMarker, normalizeRootPath, optionTestId, parseLabelMarkup, parseSize, registerLucideIcons, scopeTestId, setupLucideIntegration, tnIconMarker, writeTestId };
9938
+ export type { AutocompleteHarnessFilters, BannerHarnessFilters, ButtonHarnessFilters, ButtonToggleHarnessFilters, CalendarCell, CheckboxHarnessFilters, ChipColor, ChipHarnessFilters, DateInputHarnessFilters, DateRange, DateRangeInputHarnessFilters, DialogHarnessFilters, EmptyHarnessFilters, ExpansionPanelHarnessFilters, FileInputHarnessFilters, FilePickerCallbacks, FilePickerCreateAction, FilePickerCreateActionEvent, FilePickerError, FilePickerMode, FileSystemItem, FileSystemItemType, FlatTreeControlOptions, FormFieldHarnessFilters, FormSectionHarnessFilters, IconButtonHarnessFilters, IconHarnessFilters, IconLibrary, IconLibraryType, IconResult, IconSize, IconSource, IconTestingMockOverrides, InputHarnessFilters, KeyCombination, LabelMarkupSegment, LabelMarkupSegmentType, LabelType, LucideIconOptions, MenuHarnessFilters, MockIconRegistry, MockSpriteLoader, NestedTreeControlOptions, PathSegment, PlatformType, ProgressBarMode, RadioHarnessFilters, ResolvedIcon, SelectHarnessFilters, ShortcutHandler, SidePanelHarnessFilters, SizeStandard, SlideToggleColor, SlideToggleHarnessFilters, SpinnerMode, SpriteConfig, StepperHarnessFilters, SubscriptSizing, TabChangeEvent, TabHarnessFilters, TabPanelHarnessFilters, TabsHarnessFilters, TnAutocompleteOption, TnBannerType, TnButtonToggleType, TnCardAction, TnCardControl, TnCardFooterLink, TnCardHeaderStatus, TnChipInputHarnessFilters, TnChipInputOption, TnConfirmDialogData, TnDialogDefaults, TnDialogOpenTarget, TnDrawerMode, TnDrawerPosition, TnEmptySize, TnFlatTreeNode, TnFormFieldAriaBindings, TnFormFieldContext, TnFormFieldErrorMessage, TnFormFieldErrorMessages, TnFormFieldErrorResolver, TnMenuItem, TnOptionTestIdSource, TnSelectOption, TnSelectOptionGroup, TnSelectionChange, TnSortEvent, TnTableDataProvider, TnTableDataSource, TnTableHarnessFilters, TnTablePagerHarnessFilters, TnTablePagerLabels, TnTablePagination, TnTestAttrName, TnTestIdValue, TnThemeDefinition, TnToastCall, TnToastConfig, TnTreeExpansion, TnTreeHarnessFilters, TnTreeNodeHarnessFilters, TnTreeVirtualNodeData, TnTreeVirtualScrollViewHarnessFilters, TooltipPosition, YearCell };