@truenas/ui-components 0.3.26 → 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.26",
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
  *
@@ -7455,53 +7480,6 @@ declare function labelMarkupToHtml(value: string): string;
7455
7480
  */
7456
7481
  declare function labelMarkupToText(value: string): string;
7457
7482
 
7458
- declare class StripMntPrefixPipe implements PipeTransform {
7459
- transform(path: string | null | undefined): string;
7460
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<StripMntPrefixPipe, never>;
7461
- static ɵpipe: _angular_core.ɵɵPipeDeclaration<StripMntPrefixPipe, "tnStripMntPrefix", true>;
7462
- }
7463
-
7464
- interface FileSystemItem {
7465
- path: string;
7466
- name: string;
7467
- type: 'file' | 'folder' | 'dataset' | 'zvol' | 'mountpoint';
7468
- size?: number;
7469
- modified?: Date;
7470
- permissions?: 'read' | 'write' | 'none';
7471
- icon?: string;
7472
- disabled?: boolean;
7473
- isCreating?: boolean;
7474
- tempId?: string;
7475
- creationError?: string;
7476
- }
7477
- interface FilePickerCallbacks {
7478
- getChildren?: (path: string) => Promise<FileSystemItem[]>;
7479
- validatePath?: (path: string) => Promise<boolean>;
7480
- createFolder?: (parentPath: string, name: string) => Promise<string>;
7481
- createDataset?: (parentPath: string) => Promise<string>;
7482
- createZvol?: (parentPath: string) => Promise<string>;
7483
- }
7484
- interface CreateFolderEvent {
7485
- parentPath: string;
7486
- folderName: string;
7487
- }
7488
- interface FilePickerError {
7489
- type: 'navigation' | 'permission' | 'creation' | 'validation';
7490
- message: string;
7491
- path?: string;
7492
- }
7493
- interface PathSegment {
7494
- name: string;
7495
- path: string;
7496
- }
7497
- type FilePickerMode = 'file' | 'folder' | 'dataset' | 'zvol' | 'any';
7498
-
7499
- declare class TruncatePathPipe implements PipeTransform {
7500
- transform(path: string): PathSegment[];
7501
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<TruncatePathPipe, never>;
7502
- static ɵpipe: _angular_core.ɵɵPipeDeclaration<TruncatePathPipe, "tnTruncatePath", true>;
7503
- }
7504
-
7505
7483
  type SpinnerMode = 'determinate' | 'indeterminate';
7506
7484
  declare class TnSpinnerComponent {
7507
7485
  mode: _angular_core.InputSignal<SpinnerMode>;
@@ -9045,12 +9023,89 @@ interface StepperHarnessFilters extends BaseHarnessFilters {
9045
9023
  orientation?: 'horizontal' | 'vertical';
9046
9024
  }
9047
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
+
9048
9097
  declare class TnFilePickerComponent implements ControlValueAccessor, OnInit, OnDestroy {
9049
- 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")[]>;
9050
9106
  multiSelect: _angular_core.InputSignal<boolean>;
9051
- allowCreate: _angular_core.InputSignal<boolean>;
9052
- allowDatasetCreate: _angular_core.InputSignal<boolean>;
9053
- allowZvolCreate: _angular_core.InputSignal<boolean>;
9107
+ /** Consumer-defined creation flows shown as buttons in the popup footer. */
9108
+ createActions: _angular_core.InputSignal<FilePickerCreateAction[]>;
9054
9109
  allowManualInput: _angular_core.InputSignal<boolean>;
9055
9110
  placeholder: _angular_core.InputSignal<string>;
9056
9111
  disabled: _angular_core.InputSignal<boolean>;
@@ -9060,12 +9115,14 @@ declare class TnFilePickerComponent implements ControlValueAccessor, OnInit, OnD
9060
9115
  */
9061
9116
  testId: _angular_core.InputSignal<TnTestIdValue>;
9062
9117
  startPath: _angular_core.InputSignal<string>;
9118
+ /** Restricts navigation — users cannot navigate above this path. */
9063
9119
  rootPath: _angular_core.InputSignal<string | undefined>;
9064
9120
  fileExtensions: _angular_core.InputSignal<string[] | undefined>;
9065
9121
  callbacks: _angular_core.InputSignal<FilePickerCallbacks | undefined>;
9066
9122
  selectionChange: _angular_core.OutputEmitterRef<string | string[]>;
9067
9123
  pathChange: _angular_core.OutputEmitterRef<string>;
9068
- 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>;
9069
9126
  error: _angular_core.OutputEmitterRef<FilePickerError>;
9070
9127
  wrapperEl: _angular_core.Signal<ElementRef<HTMLDivElement>>;
9071
9128
  filePickerTemplate: _angular_core.Signal<TemplateRef<unknown>>;
@@ -9079,10 +9136,9 @@ declare class TnFilePickerComponent implements ControlValueAccessor, OnInit, OnD
9079
9136
  selectedItems: _angular_core.WritableSignal<string[]>;
9080
9137
  loading: _angular_core.WritableSignal<boolean>;
9081
9138
  hasError: _angular_core.WritableSignal<boolean>;
9082
- creatingItemTempId: _angular_core.WritableSignal<string | null>;
9083
- creationLoading: _angular_core.WritableSignal<boolean>;
9084
9139
  private formDisabled;
9085
9140
  isDisabled: _angular_core.Signal<boolean>;
9141
+ effectiveRootPath: _angular_core.Signal<string>;
9086
9142
  private onChange;
9087
9143
  private onTouched;
9088
9144
  private overlay;
@@ -9094,7 +9150,13 @@ declare class TnFilePickerComponent implements ControlValueAccessor, OnInit, OnD
9094
9150
  registerOnChange(fn: (value: string | string[]) => void): void;
9095
9151
  registerOnTouched(fn: () => void): void;
9096
9152
  setDisabledState(isDisabled: boolean): void;
9097
- 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;
9098
9160
  openFilePicker(): void;
9099
9161
  close(): void;
9100
9162
  onItemClick(item: FileSystemItem): void;
@@ -9102,104 +9164,213 @@ declare class TnFilePickerComponent implements ControlValueAccessor, OnInit, OnD
9102
9164
  onSubmit(): void;
9103
9165
  onCancel(): void;
9104
9166
  navigateToPath(path: string): void;
9105
- 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;
9106
9200
  onClearSelection(): void;
9107
- onSubmitFolderName(name: string, tempId: string): Promise<void>;
9108
- onCancelFolderCreation(tempId: string): void;
9109
- private removePendingItem;
9110
- private updateCreatingItemError;
9111
- private validateFolderName;
9112
9201
  private loadDirectory;
9113
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
+ */
9114
9209
  private updateSelection;
9115
- private updateSelectionFromItems;
9116
- private toFullPath;
9117
9210
  private emitError;
9118
9211
  private createOverlay;
9119
9212
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnFilePickerComponent, never>;
9120
- 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>;
9121
9214
  }
9122
9215
 
9123
- declare class TnFilePickerPopupComponent implements OnInit, AfterViewInit, AfterViewChecked {
9124
- 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")[]>;
9125
9237
  multiSelect: _angular_core.InputSignal<boolean>;
9126
- allowCreate: _angular_core.InputSignal<boolean>;
9127
- allowDatasetCreate: _angular_core.InputSignal<boolean>;
9128
- 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[]>;
9129
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>;
9130
9251
  fileItems: _angular_core.InputSignal<FileSystemItem[]>;
9131
9252
  selectedItems: _angular_core.InputSignal<string[]>;
9132
9253
  loading: _angular_core.InputSignal<boolean>;
9133
- creationLoading: _angular_core.InputSignal<boolean>;
9134
9254
  fileExtensions: _angular_core.InputSignal<string[] | undefined>;
9135
9255
  private iconRegistry;
9256
+ private elementRef;
9136
9257
  constructor();
9137
9258
  /**
9138
- * Register MDI icon library with all icons used by the file picker component
9139
- * 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.
9140
9273
  */
9141
- private registerMdiIcons;
9142
- ngOnInit(): void;
9143
- ngAfterViewInit(): void;
9144
9274
  ngAfterViewChecked(): void;
9145
9275
  itemClick: _angular_core.OutputEmitterRef<FileSystemItem>;
9146
9276
  itemDoubleClick: _angular_core.OutputEmitterRef<FileSystemItem>;
9147
9277
  pathNavigate: _angular_core.OutputEmitterRef<string>;
9148
- 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>;
9149
9282
  clearSelection: _angular_core.OutputEmitterRef<void>;
9150
9283
  close: _angular_core.OutputEmitterRef<void>;
9151
9284
  submit: _angular_core.OutputEmitterRef<void>;
9152
9285
  cancel: _angular_core.OutputEmitterRef<void>;
9153
- submitFolderName: _angular_core.OutputEmitterRef<{
9154
- name: string;
9155
- tempId: string;
9156
- }>;
9157
- cancelFolderCreation: _angular_core.OutputEmitterRef<string>;
9158
9286
  displayedColumns: string[];
9159
- filteredFileItems: _angular_core.Signal<{
9160
- disabled: boolean;
9161
- path: string;
9162
- name: string;
9163
- type: "file" | "folder" | "dataset" | "zvol" | "mountpoint";
9164
- size?: number;
9165
- modified?: Date;
9166
- permissions?: "read" | "write" | "none";
9167
- icon?: string;
9168
- isCreating?: boolean;
9169
- tempId?: string;
9170
- creationError?: string;
9171
- }[]>;
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[]>;
9172
9296
  onItemClick(item: FileSystemItem): void;
9173
9297
  onItemDoubleClick(item: FileSystemItem): void;
9298
+ onNavigateClick(event: Event, item: FileSystemItem): void;
9174
9299
  navigateToPath(path: string): void;
9175
- 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;
9176
9318
  onClearSelection(): void;
9177
9319
  onSubmit(): void;
9178
9320
  onCancel(): void;
9179
- onFolderNameSubmit(event: Event, item: FileSystemItem): void;
9180
- onFolderNameCancel(item: FileSystemItem): void;
9181
- onFolderNameInputBlur(event: Event, item: FileSystemItem): void;
9182
- onFolderNameKeyDown(event: KeyboardEvent, item: FileSystemItem): void;
9183
- isCreateDisabled(): boolean;
9184
9321
  isNavigatable(item: FileSystemItem): boolean;
9185
- getItemIcon(item: FileSystemItem): string;
9186
- getFileIcon(filename: string): string;
9187
9322
  /**
9188
- * Get the library type for the icon
9189
- * @param item FileSystemItem
9190
- * @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.
9191
9325
  */
9192
- getItemIconLibrary(item: FileSystemItem): 'mdi' | 'custom';
9326
+ getItemIcon(item: FileSystemItem): string;
9327
+ getFileIcon(filename: string): string;
9193
9328
  getZfsBadge(item: FileSystemItem): string;
9194
9329
  isZfsObject(item: FileSystemItem): boolean;
9195
9330
  isSelected(item: FileSystemItem): boolean;
9196
- getRowClass: (row: FileSystemItem) => string | string[];
9197
- getFileInfo(item: FileSystemItem): string;
9198
- formatFileSize(bytes: number): string;
9199
- 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;
9200
9336
  formatDate(date: Date): string;
9201
9337
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnFilePickerPopupComponent, never>;
9202
- 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>;
9203
9374
  }
9204
9375
 
9205
9376
  type TnEmptySize = 'default' | 'compact';
@@ -9763,5 +9934,5 @@ declare const TN_THEME_DEFINITIONS: readonly TnThemeDefinition[];
9763
9934
  */
9764
9935
  declare const THEME_MAP: Map<TnTheme, TnThemeDefinition>;
9765
9936
 
9766
- 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 };
9767
- 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 };