@truenas/ui-components 0.3.26 → 0.4.1

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.1",
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,13 +9023,101 @@ 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>;
9110
+ /**
9111
+ * Open the picker popup when the input is clicked while no path is selected
9112
+ * yet — an empty field means the user is about to pick something, so the
9113
+ * browser opens without the extra click on the folder button. A field that
9114
+ * already holds a path keeps plain click behavior (the user may just want to
9115
+ * edit the text). Deliberately pointer-only: opening on focus would pop the
9116
+ * overlay on keyboard users tabbing through a form and leave it open behind
9117
+ * them; tabbing never opens it, and the folder button stays the keyboard
9118
+ * path to the popup.
9119
+ */
9120
+ openOnClick: _angular_core.InputSignal<boolean>;
9055
9121
  placeholder: _angular_core.InputSignal<string>;
9056
9122
  disabled: _angular_core.InputSignal<boolean>;
9057
9123
  /**
@@ -9060,12 +9126,14 @@ declare class TnFilePickerComponent implements ControlValueAccessor, OnInit, OnD
9060
9126
  */
9061
9127
  testId: _angular_core.InputSignal<TnTestIdValue>;
9062
9128
  startPath: _angular_core.InputSignal<string>;
9129
+ /** Restricts navigation — users cannot navigate above this path. */
9063
9130
  rootPath: _angular_core.InputSignal<string | undefined>;
9064
9131
  fileExtensions: _angular_core.InputSignal<string[] | undefined>;
9065
9132
  callbacks: _angular_core.InputSignal<FilePickerCallbacks | undefined>;
9066
9133
  selectionChange: _angular_core.OutputEmitterRef<string | string[]>;
9067
9134
  pathChange: _angular_core.OutputEmitterRef<string>;
9068
- createFolder: _angular_core.OutputEmitterRef<CreateFolderEvent>;
9135
+ /** Re-emitted from the popup when one of the `createActions` buttons is pressed. */
9136
+ createAction: _angular_core.OutputEmitterRef<FilePickerCreateActionEvent>;
9069
9137
  error: _angular_core.OutputEmitterRef<FilePickerError>;
9070
9138
  wrapperEl: _angular_core.Signal<ElementRef<HTMLDivElement>>;
9071
9139
  filePickerTemplate: _angular_core.Signal<TemplateRef<unknown>>;
@@ -9079,10 +9147,9 @@ declare class TnFilePickerComponent implements ControlValueAccessor, OnInit, OnD
9079
9147
  selectedItems: _angular_core.WritableSignal<string[]>;
9080
9148
  loading: _angular_core.WritableSignal<boolean>;
9081
9149
  hasError: _angular_core.WritableSignal<boolean>;
9082
- creatingItemTempId: _angular_core.WritableSignal<string | null>;
9083
- creationLoading: _angular_core.WritableSignal<boolean>;
9084
9150
  private formDisabled;
9085
9151
  isDisabled: _angular_core.Signal<boolean>;
9152
+ effectiveRootPath: _angular_core.Signal<string>;
9086
9153
  private onChange;
9087
9154
  private onTouched;
9088
9155
  private overlay;
@@ -9094,7 +9161,15 @@ declare class TnFilePickerComponent implements ControlValueAccessor, OnInit, OnD
9094
9161
  registerOnChange(fn: (value: string | string[]) => void): void;
9095
9162
  registerOnTouched(fn: () => void): void;
9096
9163
  setDisabledState(isDisabled: boolean): void;
9097
- onPathInput(event: Event): void;
9164
+ /**
9165
+ * Commits a manually typed path. Bound to the input's `change` event
9166
+ * (Enter or blur), not `input`: validating per keystroke would emit an
9167
+ * error for every incomplete prefix of a valid path ('/m', '/mn', …)
9168
+ * and spam `validatePath` with paths the user never meant.
9169
+ */
9170
+ onPathCommit(event: Event): void;
9171
+ /** `openOnClick` entry point. */
9172
+ onInputClick(): void;
9098
9173
  openFilePicker(): void;
9099
9174
  close(): void;
9100
9175
  onItemClick(item: FileSystemItem): void;
@@ -9102,104 +9177,213 @@ declare class TnFilePickerComponent implements ControlValueAccessor, OnInit, OnD
9102
9177
  onSubmit(): void;
9103
9178
  onCancel(): void;
9104
9179
  navigateToPath(path: string): void;
9105
- onCreateFolder(): void;
9180
+ /** An inline `create` flow finished — show the new item selected and applied. */
9181
+ onCreated(path: string): void;
9182
+ /**
9183
+ * Re-fetches the listing of the directory currently being browsed. Call it
9184
+ * when the directory changed outside the picker, e.g. after a
9185
+ * `createAction` flow created something in it.
9186
+ */
9187
+ refresh(): Promise<void>;
9188
+ /**
9189
+ * Programmatically selects `path`, e.g. the mountpoint a `createAction`
9190
+ * flow just created: browses to its parent so the refreshed listing shows
9191
+ * the new item selected, and applies the path as the picker's value (form
9192
+ * value and `selectionChange`). The popup stays open so the user can
9193
+ * confirm with Select or keep browsing. Paths outside `rootPath` are
9194
+ * rejected with a `validation` error — the picker's value honors the same
9195
+ * confinement as navigation and manual input.
9196
+ *
9197
+ * This is a single-path operation: like a manually typed path, it
9198
+ * REPLACES any pending multi-selection rather than appending to it —
9199
+ * the intent is to focus the one path (e.g. a just-created item), not to
9200
+ * merge it into picks the user may have abandoned.
9201
+ */
9202
+ selectPath(path: string): Promise<void>;
9203
+ private clampToRoot;
9204
+ /**
9205
+ * Browsing to another directory drops a not-yet-applied single-select
9206
+ * selection: keeping it would leave the footer claiming an item from a
9207
+ * directory the user is no longer looking at, and would mask the implicit
9208
+ * current-directory selection. Multi-select keeps its selection so items
9209
+ * can be picked across directories. The applied value (`selectedPath`,
9210
+ * form value) is untouched either way.
9211
+ */
9212
+ private clearStalePendingSelection;
9106
9213
  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
9214
  private loadDirectory;
9113
9215
  private getMockFileItems;
9216
+ /**
9217
+ * Applies `path` as the picker's whole value. In multi-select this
9218
+ * replaces the selection with the single path — both callers (typed
9219
+ * paths, `selectPath()`) express one deliberate choice, so appending
9220
+ * would be the surprising behavior.
9221
+ */
9114
9222
  private updateSelection;
9115
- private updateSelectionFromItems;
9116
- private toFullPath;
9117
9223
  private emitError;
9118
9224
  private createOverlay;
9119
9225
  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>;
9226
+ 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; }; "openOnClick": { "alias": "openOnClick"; "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
9227
  }
9122
9228
 
9123
- declare class TnFilePickerPopupComponent implements OnInit, AfterViewInit, AfterViewChecked {
9124
- mode: _angular_core.InputSignal<FilePickerMode>;
9229
+ /** State of an open inline creation row. */
9230
+ interface InlineCreationState {
9231
+ action: FilePickerCreateAction;
9232
+ /** Name entered so far, mirrored from the input on every keystroke. */
9233
+ name: string;
9234
+ loading: boolean;
9235
+ error?: string;
9236
+ }
9237
+ /** FileSystemItem decorated for display, plus the synthetic inline-create row. */
9238
+ interface DisplayedFileItem extends FileSystemItem {
9239
+ /** Dim only items with no interaction left. */
9240
+ dimmed: boolean;
9241
+ /** Marks the synthetic first row hosting the inline creation input. */
9242
+ inlineCreate?: boolean;
9243
+ }
9244
+ declare class TnFilePickerPopupComponent implements AfterViewChecked {
9245
+ /**
9246
+ * What can be selected: a single mode, or an explicit list of selectable
9247
+ * item types, e.g. ['folder', 'dataset'].
9248
+ */
9249
+ mode: _angular_core.InputSignal<FilePickerMode | ("file" | "folder" | "dataset" | "zvol" | "mountpoint")[]>;
9125
9250
  multiSelect: _angular_core.InputSignal<boolean>;
9126
- allowCreate: _angular_core.InputSignal<boolean>;
9127
- allowDatasetCreate: _angular_core.InputSignal<boolean>;
9128
- allowZvolCreate: _angular_core.InputSignal<boolean>;
9251
+ /**
9252
+ * Consumer-defined creation flows rendered as buttons in the footer, next to the
9253
+ * Select button. Pressing one emits `createAction` with the action id and the
9254
+ * currently browsed path.
9255
+ */
9256
+ createActions: _angular_core.InputSignal<FilePickerCreateAction[]>;
9129
9257
  currentPath: _angular_core.InputSignal<string>;
9258
+ /**
9259
+ * Topmost path the breadcrumb can navigate to. It is always the first
9260
+ * breadcrumb segment, rendered with its leading slash drawn as a separator
9261
+ * so the path reads "/ mnt / showcase".
9262
+ */
9263
+ rootPath: _angular_core.InputSignal<string>;
9130
9264
  fileItems: _angular_core.InputSignal<FileSystemItem[]>;
9131
9265
  selectedItems: _angular_core.InputSignal<string[]>;
9132
9266
  loading: _angular_core.InputSignal<boolean>;
9133
- creationLoading: _angular_core.InputSignal<boolean>;
9134
9267
  fileExtensions: _angular_core.InputSignal<string[] | undefined>;
9135
9268
  private iconRegistry;
9269
+ private elementRef;
9136
9270
  constructor();
9137
9271
  /**
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
9272
+ * Requests a focus of the inline creation input on the next view check.
9273
+ * Set when the row opens and when a failed attempt re-enables the input —
9274
+ * the two moments the input either just entered the DOM or just lost focus
9275
+ * to the `disabled` attribute. Cleared once the focus is scheduled, so
9276
+ * focus is NOT permanently forced back: after an error the user can still
9277
+ * click elsewhere without being trapped in the input.
9278
+ */
9279
+ private pendingCreationFocus;
9280
+ /**
9281
+ * Focus runs here rather than at the call sites because the input may not
9282
+ * be in the DOM (or may still be disabled) until a later view check, and a
9283
+ * re-render can replace the element after focus() was scheduled — render
9284
+ * scheduling differs between hosts. So the request keeps retrying on each
9285
+ * check and is cleared only once the input actually holds focus.
9140
9286
  */
9141
- private registerMdiIcons;
9142
- ngOnInit(): void;
9143
- ngAfterViewInit(): void;
9144
9287
  ngAfterViewChecked(): void;
9145
9288
  itemClick: _angular_core.OutputEmitterRef<FileSystemItem>;
9146
9289
  itemDoubleClick: _angular_core.OutputEmitterRef<FileSystemItem>;
9147
9290
  pathNavigate: _angular_core.OutputEmitterRef<string>;
9148
- createFolder: _angular_core.OutputEmitterRef<CreateFolderEvent>;
9291
+ /** Emits when a `createActions` button without a `create` callback is pressed. */
9292
+ createAction: _angular_core.OutputEmitterRef<FilePickerCreateActionEvent>;
9293
+ /** Emits the created path when an inline `create` flow succeeds. */
9294
+ created: _angular_core.OutputEmitterRef<string>;
9149
9295
  clearSelection: _angular_core.OutputEmitterRef<void>;
9150
9296
  close: _angular_core.OutputEmitterRef<void>;
9151
9297
  submit: _angular_core.OutputEmitterRef<void>;
9152
9298
  cancel: _angular_core.OutputEmitterRef<void>;
9153
- submitFolderName: _angular_core.OutputEmitterRef<{
9154
- name: string;
9155
- tempId: string;
9156
- }>;
9157
- cancelFolderCreation: _angular_core.OutputEmitterRef<string>;
9158
9299
  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
- }[]>;
9300
+ /**
9301
+ * Whether an empty selection stands for the directory being browsed: true
9302
+ * whenever the selectable types include a directory-like type. The footer
9303
+ * then names the implicit selection and the Select button stays enabled; on
9304
+ * `submit` with no `selectedItems`, consumers treat `currentPath` as the
9305
+ * selection.
9306
+ */
9307
+ allowCurrentDirectorySelection: _angular_core.Signal<boolean>;
9308
+ filteredFileItems: _angular_core.Signal<DisplayedFileItem[]>;
9172
9309
  onItemClick(item: FileSystemItem): void;
9173
9310
  onItemDoubleClick(item: FileSystemItem): void;
9311
+ onNavigateClick(event: Event, item: FileSystemItem): void;
9174
9312
  navigateToPath(path: string): void;
9175
- onCreateFolder(): void;
9313
+ onCreateAction(action: FilePickerCreateAction): void;
9314
+ /**
9315
+ * Inline creation state while a `create`-capable action's row is open.
9316
+ * The consumer's `create` callback does the real work; the row shows its
9317
+ * rejection message as the inline error. The entered name lives here (not
9318
+ * only in the DOM) so a listing re-render can't wipe it.
9319
+ */
9320
+ inlineCreation: _angular_core.WritableSignal<InlineCreationState | null>;
9321
+ /** Links the inline creation input to its error message for screen readers. */
9322
+ inlineErrorId: string;
9323
+ submitInlineCreation(): Promise<void>;
9324
+ onInlineCreationKeyDown(event: KeyboardEvent): void;
9325
+ /**
9326
+ * Mirrors the typed name into the creation state and clears a shown error
9327
+ * as soon as the name is edited, re-arming blur submit.
9328
+ */
9329
+ onInlineCreationInput(event: Event): void;
9330
+ onInlineCreationBlur(): void;
9176
9331
  onClearSelection(): void;
9177
9332
  onSubmit(): void;
9178
9333
  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
9334
  isNavigatable(item: FileSystemItem): boolean;
9185
- getItemIcon(item: FileSystemItem): string;
9186
- getFileIcon(filename: string): string;
9187
9335
  /**
9188
- * Get the library type for the icon
9189
- * @param item FileSystemItem
9190
- * @returns 'custom' for TrueNAS custom icons, 'mdi' for Material Design Icons
9336
+ * Fully-qualified sprite icon name for an item. `tnIconMarker`/`libIconMarker`
9337
+ * calls double as build-time markers that pull these icons into the sprite.
9191
9338
  */
9192
- getItemIconLibrary(item: FileSystemItem): 'mdi' | 'custom';
9339
+ getItemIcon(item: FileSystemItem): string;
9340
+ getFileIcon(filename: string): string;
9193
9341
  getZfsBadge(item: FileSystemItem): string;
9194
9342
  isZfsObject(item: FileSystemItem): boolean;
9195
9343
  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;
9344
+ /**
9345
+ * Highlights selected rows through the table's supported active-row
9346
+ * styling (`activeWhen`) instead of reaching into its DOM.
9347
+ */
9348
+ isRowSelected: (row: FileSystemItem) => boolean;
9200
9349
  formatDate(date: Date): string;
9201
9350
  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>;
9351
+ 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>;
9352
+ }
9353
+
9354
+ /** Item types selectable under `mode`; null means every type is selectable. */
9355
+ declare function getSelectableTypes(mode: FilePickerMode | FileSystemItemType[]): FileSystemItemType[] | null;
9356
+ /**
9357
+ * Whether the browsed directory itself is a valid selection under `mode`,
9358
+ * i.e. whether any selectable type is directory-like. An empty selection
9359
+ * then stands for the current directory, which keeps empty directories
9360
+ * selectable.
9361
+ */
9362
+ declare function allowsCurrentDirectorySelection(mode: FilePickerMode | FileSystemItemType[]): boolean;
9363
+
9364
+ /**
9365
+ * Whether `path` is `root` itself or nested anywhere beneath it. A plain
9366
+ * prefix check is not enough: '/mntx' is not within '/mnt', and a path
9367
+ * containing relative segments ('/mnt/../etc') could resolve outside the
9368
+ * root even though it starts with it — such paths are never within the root.
9369
+ */
9370
+ declare function isPathWithinRoot(path: string, root: string): boolean;
9371
+ /**
9372
+ * Collapses trailing slashes so root comparisons are exact: '/mnt/backups/'
9373
+ * would otherwise never equal the '/mnt/backups' produced by navigation.
9374
+ * '/' stays '/'.
9375
+ */
9376
+ declare function normalizeRootPath(root: string): string;
9377
+
9378
+ declare class TruncatePathPipe implements PipeTransform {
9379
+ transform(path: string, rootPath?: string): PathSegment[];
9380
+ /**
9381
+ * Collapses the middle of deep paths into an "…" segment that navigates to the
9382
+ * parent of the first visible directory, e.g. /mnt/a/b/c/d/e/f → /mnt … d e f.
9383
+ */
9384
+ private truncateMiddle;
9385
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TruncatePathPipe, never>;
9386
+ static ɵpipe: _angular_core.ɵɵPipeDeclaration<TruncatePathPipe, "tnTruncatePath", true>;
9203
9387
  }
9204
9388
 
9205
9389
  type TnEmptySize = 'default' | 'compact';
@@ -9763,5 +9947,5 @@ declare const TN_THEME_DEFINITIONS: readonly TnThemeDefinition[];
9763
9947
  */
9764
9948
  declare const THEME_MAP: Map<TnTheme, TnThemeDefinition>;
9765
9949
 
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 };
9950
+ 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 };
9951
+ 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 };