@truenas/ui-components 0.2.6 → 0.3.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.
@@ -160,16 +160,249 @@ declare class TnTestIdDirective {
160
160
  */
161
161
  declare function writeTestId(renderer: Renderer2, element: Element, attrName: string, composed: string): void;
162
162
 
163
+ interface TnSelectOption<T = unknown> {
164
+ value: T;
165
+ label: string;
166
+ disabled?: boolean;
167
+ }
168
+ interface TnSelectOptionGroup<T = unknown> {
169
+ label: string;
170
+ options: TnSelectOption<T>[];
171
+ disabled?: boolean;
172
+ }
173
+ declare class TnSelectComponent<T = unknown> implements ControlValueAccessor, OnDestroy {
174
+ options: _angular_core.InputSignal<TnSelectOption<T>[]>;
175
+ optionGroups: _angular_core.InputSignal<TnSelectOptionGroup<T>[]>;
176
+ placeholder: _angular_core.InputSignal<string>;
177
+ /**
178
+ * Accessible label for the select trigger. When set, this is used as the
179
+ * trigger's `aria-label` instead of the visible `placeholder` — useful in
180
+ * contexts (e.g. a pager's page-size dropdown) where the placeholder text
181
+ * doesn't accurately describe the field's purpose to screen readers.
182
+ */
183
+ ariaLabel: _angular_core.InputSignal<string | undefined>;
184
+ /**
185
+ * Message shown inside the dropdown when no options (and no option groups)
186
+ * are available. Defaults to the English `'No options available'`; consumers
187
+ * with i18n requirements can pass a translated string.
188
+ */
189
+ noOptionsLabel: _angular_core.InputSignal<string>;
190
+ /**
191
+ * When `true` (single-select mode only), prepends a synthetic "empty"
192
+ * option to the dropdown so users can unset a chosen value: picking it
193
+ * resets the selection to `null`, shows the placeholder again, and emits
194
+ * `null` via `selectionChange` (and to any bound form control). Mirrors
195
+ * webui ix-select's `--` option. Ignored when `multiple` is set — there,
196
+ * values are cleared by toggling them off individually.
197
+ */
198
+ allowEmpty: _angular_core.InputSignal<boolean>;
199
+ /** Label of the empty option rendered when `allowEmpty` is set. */
200
+ emptyLabel: _angular_core.InputSignal<string>;
201
+ disabled: _angular_core.InputSignal<boolean>;
202
+ testId: _angular_core.InputSignal<TnTestIdValue>;
203
+ multiple: _angular_core.InputSignal<boolean>;
204
+ /**
205
+ * Optional extractor for the per-option test-id discriminator. Defaults to
206
+ * the option's `value` (when a string/number) or its `label`. Provide this
207
+ * when option values are objects, or to pick a more stable/unique key —
208
+ * mirrors webui's `[ixTest]="[controlName, option.<field>]"` discriminator.
209
+ *
210
+ * @example
211
+ * ```html
212
+ * <tn-select testId="user" [optionTestIdKey]="(o) => o.value.id" ... />
213
+ * ```
214
+ */
215
+ optionTestIdKey: _angular_core.InputSignal<((option: TnSelectOption<T>) => string | number | null | undefined) | undefined>;
216
+ /**
217
+ * Custom comparator for matching option values against the selected value(s).
218
+ *
219
+ * When the option values are objects, **provide this** — the built-in
220
+ * fallback uses `JSON.stringify`, which is key-order dependent and can
221
+ * produce false negatives for structurally equal objects. For primitives the
222
+ * default identity check is fine.
223
+ *
224
+ * @example
225
+ * ```ts
226
+ * compareWith = (a, b) => a?.id === b?.id;
227
+ * ```
228
+ */
229
+ compareWith: _angular_core.InputSignal<((a: T | null, b: T | null) => boolean) | undefined>;
230
+ /**
231
+ * Emits the picked value on each selection in single mode. Emits `null`
232
+ * when the user picks the `allowEmpty` empty option to clear the field.
233
+ */
234
+ selectionChange: _angular_core.OutputEmitterRef<T | null>;
235
+ /** Emits the full array of selected values after each toggle in multiple mode. */
236
+ multiSelectionChange: _angular_core.OutputEmitterRef<T[]>;
237
+ protected isOpen: _angular_core.WritableSignal<boolean>;
238
+ protected dropdownPosition: _angular_core.WritableSignal<"below" | "above">;
239
+ protected selectedValue: _angular_core.WritableSignal<T | null>;
240
+ protected selectedValues: _angular_core.WritableSignal<T[]>;
241
+ /** Index into `flatOptions` of the keyboard-focused row (-1 when none). */
242
+ protected focusedIndex: _angular_core.WritableSignal<number>;
243
+ private formDisabled;
244
+ private static instanceCounter;
245
+ private instanceId;
246
+ /**
247
+ * Id namespace used by all DOM ids the template emits (dropdown panel,
248
+ * option rows, group labels). Prefers `testId` when set so tests can target
249
+ * specific instances; otherwise falls back to a per-instance counter so two
250
+ * `<tn-select>`s on the same page never collide on `aria-controls`/group ids.
251
+ */
252
+ protected idNamespace: _angular_core.Signal<string>;
253
+ isDisabled: _angular_core.Signal<boolean>;
254
+ /**
255
+ * The synthetic clear-selection option (`allowEmpty`, single mode only).
256
+ * Its value is `null` cast to `T` so it flows through the same selection
257
+ * path as real options — `selectedValue`/`writeValue` already model "no
258
+ * selection" as `null`, so picking it clears the field for free.
259
+ */
260
+ protected emptyOption: _angular_core.Signal<TnSelectOption<T> | null>;
261
+ /** Ungrouped options as rendered: the empty option (when enabled) first. */
262
+ protected displayOptions: _angular_core.Signal<TnSelectOption<T>[]>;
263
+ /** Whether `option` is the synthetic `allowEmpty` clear option. */
264
+ protected isEmptyOption(option: TnSelectOption<T>): boolean;
265
+ /**
266
+ * Selectable, non-disabled options in display order (regular options first,
267
+ * then groups). Used by keyboard navigation so we can skip disabled
268
+ * entries and group headers without a separate filter pass.
269
+ */
270
+ navigableOptions: _angular_core.Signal<{
271
+ option: TnSelectOption<T>;
272
+ id: string;
273
+ }[]>;
274
+ /** Stable DOM id of the currently-highlighted option, for aria-activedescendant. */
275
+ focusedOptionId: _angular_core.Signal<string | null>;
276
+ /** Stable DOM id for an option; matches what navigableOptions() assigns. */
277
+ optionId(option: TnSelectOption<T>): string | null;
278
+ /** Whether `option` is the keyboard-highlighted item. */
279
+ isOptionFocused(option: TnSelectOption<T>): boolean;
280
+ /**
281
+ * Test-id segments for an option row, consumed by `[tnTestId]` with
282
+ * `tnTestIdType="option"`. The select's `testId` scopes each option so ids
283
+ * stay unique across selects: base `quick-filters` + option value `ssd` →
284
+ * `option-quick-filters-ssd`; with no base → `option-ssd`. The discriminator
285
+ * comes from `optionTestIdKey` when provided, else the option's primitive
286
+ * `value`, else its `label`.
287
+ */
288
+ protected optionTestIdParts(option: TnSelectOption<T>): (string | number | null | undefined)[];
289
+ private onChange;
290
+ private onTouched;
291
+ private elementRef;
292
+ private cdr;
293
+ private overlay;
294
+ private viewContainerRef;
295
+ private triggerEl;
296
+ private dropdownTemplate;
297
+ private overlayRef?;
298
+ private overlaySubs;
299
+ writeValue(value: T | T[] | null): void;
300
+ registerOnChange(fn: (value: T | T[] | null) => void): void;
301
+ registerOnTouched(fn: () => void): void;
302
+ setDisabledState(isDisabled: boolean): void;
303
+ toggleDropdown(): void;
304
+ openDropdown(): void;
305
+ /**
306
+ * Attach the dropdown panel as a CDK overlay anchored to the trigger.
307
+ *
308
+ * Why an overlay (vs. an inline absolutely-positioned panel):
309
+ * - Escapes parent `overflow: hidden`/clipping in surrounding layouts.
310
+ * - `outsidePointerEvents()` notifies on outside pointerdown WITHOUT
311
+ * intercepting the click (no backdrop) — so the user's click reaches
312
+ * the underlying target while the select closes silently.
313
+ * - Position is recomputed on scroll so the panel stays attached.
314
+ * - Width is matched to the trigger so the panel doesn't jump in size.
315
+ */
316
+ private attachOverlay;
317
+ private detachOverlay;
318
+ ngOnDestroy(): void;
319
+ /**
320
+ * Closes the dropdown.
321
+ *
322
+ * @param restoreFocus When `true` (the default), returns focus to the
323
+ * trigger. Used for explicit closes — Escape, Enter/Space activation,
324
+ * option click — where the user is still interacting with the select.
325
+ * Pass `false` for click-outside / blur paths so we don't steal focus
326
+ * from the element the user actually navigated to.
327
+ */
328
+ closeDropdown(restoreFocus?: boolean): void;
329
+ onOptionClick(option: TnSelectOption<T>, groupDisabled?: boolean): void;
330
+ selectOption(option: TnSelectOption<T>): void;
331
+ private toggleOption;
332
+ isOptionSelected(option: TnSelectOption<T>): boolean;
333
+ protected displayText: _angular_core.Signal<string>;
334
+ private findOptionByValue;
335
+ protected hasAnyOptions: _angular_core.Signal<boolean>;
336
+ /** One-shot guard so the object-compare warning fires at most once per instance. */
337
+ private warnedAboutObjectCompare;
338
+ /**
339
+ * Compares two option values for equality.
340
+ *
341
+ * - Uses `compareWith` when provided (the supported path for object values).
342
+ * - Falls back to strict identity (`===`) — adequate for primitives.
343
+ * - For object values WITHOUT `compareWith` we return `false` (no
344
+ * structural compare) and emit a one-time warning. The previous
345
+ * `JSON.stringify` fallback was key-order sensitive and produced silent
346
+ * false-negatives that were hard to diagnose; returning `false` makes the
347
+ * misuse loud (selection won't match) and the warning points to the fix.
348
+ *
349
+ * The warning is **unconditional** (not gated on `isDevMode()`) so prod
350
+ * monitoring picks it up — consumers relying on the old stringify fallback
351
+ * would otherwise see selections silently stop matching after upgrade with
352
+ * no signal in production logs.
353
+ */
354
+ private compareValues;
355
+ /**
356
+ * Keyboard navigation for the combobox trigger.
357
+ *
358
+ * - **ArrowDown / ArrowUp** opens the dropdown if closed; otherwise moves
359
+ * the keyboard-focus highlight (via aria-activedescendant) up/down,
360
+ * skipping disabled options and group headers.
361
+ * - **Home / End** jump to the first / last enabled option.
362
+ * - **Enter / Space** opens the dropdown if closed; if open and an option
363
+ * is highlighted, selects that option (in single mode) or toggles it
364
+ * (in multiple mode).
365
+ * - **Escape** closes the dropdown without changing the selection.
366
+ *
367
+ * All navigation keys call `event.preventDefault()` so the page does not
368
+ * scroll while the user is moving through options.
369
+ */
370
+ onKeydown(event: KeyboardEvent): void;
371
+ private moveFocus;
372
+ private activateFocusedOption;
373
+ private scrollFocusedIntoView;
374
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnSelectComponent<any>, never>;
375
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnSelectComponent<any>, "tn-select", never, { "options": { "alias": "options"; "required": false; "isSignal": true; }; "optionGroups": { "alias": "optionGroups"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "noOptionsLabel": { "alias": "noOptionsLabel"; "required": false; "isSignal": true; }; "allowEmpty": { "alias": "allowEmpty"; "required": false; "isSignal": true; }; "emptyLabel": { "alias": "emptyLabel"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "testId": { "alias": "testId"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "optionTestIdKey": { "alias": "optionTestIdKey"; "required": false; "isSignal": true; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; }, { "selectionChange": "selectionChange"; "multiSelectionChange": "multiSelectionChange"; }, never, never, true, never>;
376
+ }
377
+
378
+ /**
379
+ * Option shape for `tn-autocomplete` — the `label` is displayed, the `value`
380
+ * is committed to the form control, and a truthy `disabled` keeps the row
381
+ * visible but non-selectable (skipped by keyboard nav, click, and text-match
382
+ * commits). Structurally identical to `TnSelectOption`, so the same data
383
+ * sources feed both dropdown components.
384
+ */
385
+ type TnAutocompleteOption<T = unknown> = TnSelectOption<T>;
163
386
  declare class TnAutocompleteComponent<T = unknown> implements ControlValueAccessor, OnDestroy {
164
387
  private readonly elementRef;
165
388
  private readonly overlay;
166
389
  private readonly viewContainerRef;
167
390
  /** Unique instance ID for ARIA linkage */
168
391
  protected readonly uid: string;
169
- /** All available options */
170
- options: _angular_core.InputSignal<T[]>;
171
- /** Transform a value to its display string */
172
- displayWith: _angular_core.InputSignal<(value: T) => string>;
392
+ /**
393
+ * All available options. The `label` is displayed; the `value` is committed
394
+ * to the form control. A written value is resolved back to its option's
395
+ * label for display — falling back to `String(value)` until the matching
396
+ * option is available, and upgraded once an async option load lands.
397
+ */
398
+ options: _angular_core.InputSignal<TnAutocompleteOption<T>[]>;
399
+ /**
400
+ * Custom comparator for matching a written control value against option
401
+ * values during display resolution. Defaults to identity (`===`), which is
402
+ * right for primitive values; provide this when option values are objects.
403
+ * Mirrors `tn-select`'s `compareWith`.
404
+ */
405
+ compareWith: _angular_core.InputSignal<((a: T | null, b: T | null) => boolean) | undefined>;
173
406
  /** Placeholder text for the input */
174
407
  placeholder: _angular_core.InputSignal<string>;
175
408
  /** Whether the input is disabled */
@@ -191,8 +424,8 @@ declare class TnAutocompleteComponent<T = unknown> implements ControlValueAccess
191
424
  loading: _angular_core.InputSignal<boolean>;
192
425
  /** Text shown next to the spinner while `loading` is set. */
193
426
  loadingText: _angular_core.InputSignal<string>;
194
- /** Custom filter function. Defaults to case-insensitive includes on displayWith text */
195
- filterFn: _angular_core.InputSignal<((option: T, searchTerm: string) => boolean) | undefined>;
427
+ /** Custom filter function. Defaults to case-insensitive includes on the option label */
428
+ filterFn: _angular_core.InputSignal<((option: TnAutocompleteOption<T>, searchTerm: string) => boolean) | undefined>;
196
429
  /** Text shown when no options match the search */
197
430
  noResultsText: _angular_core.InputSignal<string>;
198
431
  /**
@@ -212,8 +445,8 @@ declare class TnAutocompleteComponent<T = unknown> implements ControlValueAccess
212
445
  panelMaxHeight: _angular_core.InputSignal<string | number>;
213
446
  /** Test ID attribute */
214
447
  testId: _angular_core.InputSignal<TnTestIdValue>;
215
- /** Emits when an option is selected */
216
- optionSelected: _angular_core.OutputEmitterRef<T>;
448
+ /** Emits the full option (label + value) when one is selected */
449
+ optionSelected: _angular_core.OutputEmitterRef<TnAutocompleteOption<T>>;
217
450
  /**
218
451
  * Emits the search term as the user types (not on programmatic writes or
219
452
  * option selection). Drive server-side filtering from this: fetch matches
@@ -249,14 +482,14 @@ declare class TnAutocompleteComponent<T = unknown> implements ControlValueAccess
249
482
  protected isOpen: _angular_core.WritableSignal<boolean>;
250
483
  /** Index of the currently highlighted option for keyboard nav */
251
484
  protected highlightedIndex: _angular_core.WritableSignal<number>;
252
- /** The currently selected value */
485
+ /** The currently committed value (an option's `value`, or a custom-typed one) */
253
486
  private selectedValue;
254
487
  /** CVA disabled state from the form */
255
488
  private formDisabled;
256
489
  /** Combined disabled state */
257
490
  isDisabled: _angular_core.Signal<boolean>;
258
491
  /** Filtered and capped options */
259
- protected filteredOptions: _angular_core.Signal<T[]>;
492
+ protected filteredOptions: _angular_core.Signal<TnAutocompleteOption<T>[]>;
260
493
  /** Whether there are any results to show */
261
494
  protected hasResults: _angular_core.Signal<boolean>;
262
495
  private onChange;
@@ -273,6 +506,8 @@ declare class TnAutocompleteComponent<T = unknown> implements ControlValueAccess
273
506
  private lastOptionsCount;
274
507
  /** Scroll distance (px) from the panel bottom that triggers `loadMore`. */
275
508
  private static readonly loadMoreThresholdPx;
509
+ /** Guards the object-without-compareWith warning so it fires only once. */
510
+ private warnedAboutObjectCompare;
276
511
  constructor();
277
512
  ngOnDestroy(): void;
278
513
  writeValue(value: T | null): void;
@@ -282,7 +517,7 @@ declare class TnAutocompleteComponent<T = unknown> implements ControlValueAccess
282
517
  onInput(event: Event): void;
283
518
  onFocus(): void;
284
519
  onBlur(): void;
285
- onOptionClick(option: T): void;
520
+ onOptionClick(option: TnAutocompleteOption<T>): void;
286
521
  onKeydown(event: KeyboardEvent): void;
287
522
  /**
288
523
  * `loadMore` normally fires from a scroll event, which never happens when
@@ -292,6 +527,25 @@ declare class TnAutocompleteComponent<T = unknown> implements ControlValueAccess
292
527
  */
293
528
  private checkUnderfill;
294
529
  onPanelScroll(event: Event): void;
530
+ /**
531
+ * Whether `option` carries the committed value — drives `aria-selected` so
532
+ * assistive tech announces the current choice independently of the keyboard
533
+ * cursor (which is conveyed via `aria-activedescendant`).
534
+ */
535
+ protected isOptionSelected(option: TnAutocompleteOption<T>): boolean;
536
+ /**
537
+ * Index of the committed value's option in the visible list, or -1 when
538
+ * nothing is committed or the match is absent/disabled. Used to seed the
539
+ * keyboard cursor when the panel opens.
540
+ */
541
+ private selectedOptionIndex;
542
+ /**
543
+ * Next selectable option index from `from` in `direction` (+1 down, -1 up),
544
+ * skipping disabled rows and wrapping around. `from` of -1 ("nothing
545
+ * highlighted") lands on the first row going down, the last going up.
546
+ * Returns -1 when every visible option is disabled.
547
+ */
548
+ private nextEnabledIndex;
295
549
  /**
296
550
  * Commit the current search term as the value (allowCustomValue mode). A
297
551
  * display match (case-insensitive, same as the requireSelection path)
@@ -299,6 +553,19 @@ declare class TnAutocompleteComponent<T = unknown> implements ControlValueAccess
299
553
  * typing its full text behaves like clicking it.
300
554
  */
301
555
  private commitCustomValue;
556
+ /**
557
+ * Resolves a committed value back to its option's display label, falling
558
+ * back to the raw value's string until the matching option is available.
559
+ */
560
+ private displayValue;
561
+ /**
562
+ * Compares option values, honoring `compareWith` when provided. Without one,
563
+ * falls back to identity (`===`) — which never matches structurally-equal
564
+ * objects from different references, so display resolution and selection
565
+ * silently fail. Warn once on that misuse (unconditional, like `tn-select`,
566
+ * so prod monitoring catches it) and return `false` to make it loud.
567
+ */
568
+ private valueMatches;
302
569
  private selectOption;
303
570
  private open;
304
571
  private close;
@@ -315,7 +582,7 @@ declare class TnAutocompleteComponent<T = unknown> implements ControlValueAccess
315
582
  private detachOverlay;
316
583
  private scrollToHighlighted;
317
584
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnAutocompleteComponent<any>, never>;
318
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnAutocompleteComponent<any>, "tn-autocomplete", never, { "options": { "alias": "options"; "required": false; "isSignal": true; }; "displayWith": { "alias": "displayWith"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "requireSelection": { "alias": "requireSelection"; "required": false; "isSignal": true; }; "allowCustomValue": { "alias": "allowCustomValue"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "loadingText": { "alias": "loadingText"; "required": false; "isSignal": true; }; "filterFn": { "alias": "filterFn"; "required": false; "isSignal": true; }; "noResultsText": { "alias": "noResultsText"; "required": false; "isSignal": true; }; "maxResults": { "alias": "maxResults"; "required": false; "isSignal": true; }; "panelMaxHeight": { "alias": "panelMaxHeight"; "required": false; "isSignal": true; }; "testId": { "alias": "testId"; "required": false; "isSignal": true; }; }, { "optionSelected": "optionSelected"; "searchChange": "searchChange"; "loadMore": "loadMore"; "opened": "opened"; }, never, never, true, never>;
585
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnAutocompleteComponent<any>, "tn-autocomplete", never, { "options": { "alias": "options"; "required": false; "isSignal": true; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "requireSelection": { "alias": "requireSelection"; "required": false; "isSignal": true; }; "allowCustomValue": { "alias": "allowCustomValue"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "loadingText": { "alias": "loadingText"; "required": false; "isSignal": true; }; "filterFn": { "alias": "filterFn"; "required": false; "isSignal": true; }; "noResultsText": { "alias": "noResultsText"; "required": false; "isSignal": true; }; "maxResults": { "alias": "maxResults"; "required": false; "isSignal": true; }; "panelMaxHeight": { "alias": "panelMaxHeight"; "required": false; "isSignal": true; }; "testId": { "alias": "testId"; "required": false; "isSignal": true; }; }, { "optionSelected": "optionSelected"; "searchChange": "searchChange"; "loadMore": "loadMore"; "opened": "opened"; }, never, never, true, never>;
319
586
  }
320
587
 
321
588
  /**
@@ -1846,46 +2113,184 @@ declare class TnInputHarness extends ComponentHarness {
1846
2113
  /**
1847
2114
  * Blurs the input element.
1848
2115
  *
1849
- * @returns Promise that resolves when the input is blurred.
2116
+ * @returns Promise that resolves when the input is blurred.
2117
+ */
2118
+ blur(): Promise<void>;
2119
+ }
2120
+ /**
2121
+ * A set of criteria that can be used to filter a list of `TnInputHarness` instances.
2122
+ */
2123
+ interface InputHarnessFilters extends BaseHarnessFilters {
2124
+ /** Filters by placeholder text. */
2125
+ placeholder?: string;
2126
+ /** Filters by the native `name` attribute (typically the form control name). */
2127
+ name?: string;
2128
+ }
2129
+
2130
+ declare class TnInputDirective {
2131
+ constructor();
2132
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnInputDirective, never>;
2133
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<TnInputDirective, "input[tnInput], textarea[tnInput], div[tnInput]", never, {}, {}, never, never, true, never>;
2134
+ }
2135
+
2136
+ type ChipColor = 'primary' | 'secondary' | 'accent';
2137
+ declare class TnChipComponent implements AfterViewInit, OnDestroy {
2138
+ chipEl: _angular_core.Signal<ElementRef<HTMLElement>>;
2139
+ label: _angular_core.InputSignal<string>;
2140
+ icon: _angular_core.InputSignal<string | undefined>;
2141
+ closable: _angular_core.InputSignal<boolean>;
2142
+ disabled: _angular_core.InputSignal<boolean>;
2143
+ color: _angular_core.InputSignal<ChipColor>;
2144
+ testId: _angular_core.InputSignal<TnTestIdValue>;
2145
+ onClose: _angular_core.OutputEmitterRef<void>;
2146
+ onClick: _angular_core.OutputEmitterRef<MouseEvent>;
2147
+ private focusMonitor;
2148
+ ngAfterViewInit(): void;
2149
+ ngOnDestroy(): void;
2150
+ classes: _angular_core.Signal<string[]>;
2151
+ handleClick(event: MouseEvent): void;
2152
+ handleClose(event: MouseEvent): void;
2153
+ handleKeyDown(event: KeyboardEvent): void;
2154
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnChipComponent, never>;
2155
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnChipComponent, "tn-chip", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "closable": { "alias": "closable"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "testId": { "alias": "testId"; "required": false; "isSignal": true; }; }, { "onClose": "onClose"; "onClick": "onClick"; }, never, never, true, never>;
2156
+ }
2157
+
2158
+ /**
2159
+ * Harness for interacting with tn-chip in tests.
2160
+ * Provides methods for reading chip state and simulating user interactions
2161
+ * (selecting the chip and dismissing a closable chip).
2162
+ *
2163
+ * @example
2164
+ * ```typescript
2165
+ * // Find a chip by label and click it
2166
+ * const chip = await loader.getHarness(TnChipHarness.with({ label: 'Active' }));
2167
+ * await chip.click();
2168
+ *
2169
+ * // Dismiss a closable chip
2170
+ * const filter = await loader.getHarness(TnChipHarness.with({ label: 'Has SSH Access' }));
2171
+ * if (await filter.isClosable()) {
2172
+ * await filter.close();
2173
+ * }
2174
+ * ```
2175
+ */
2176
+ declare class TnChipHarness extends ComponentHarness {
2177
+ /**
2178
+ * The selector for the host element of a `TnChipComponent` instance.
2179
+ */
2180
+ static hostSelector: string;
2181
+ private _chip;
2182
+ private _label;
2183
+ private _icon;
2184
+ private _closeButton;
2185
+ /**
2186
+ * Gets a `HarnessPredicate` that can be used to search for a chip
2187
+ * with specific attributes.
2188
+ *
2189
+ * @param options Options for filtering which chip instances are considered a match.
2190
+ * @returns A `HarnessPredicate` configured with the given options.
2191
+ *
2192
+ * @example
2193
+ * ```typescript
2194
+ * // Find chip by exact label
2195
+ * const chip = await loader.getHarness(TnChipHarness.with({ label: 'Production' }));
2196
+ *
2197
+ * // Find chip with regex pattern
2198
+ * const chip = await loader.getHarness(TnChipHarness.with({ label: /access/i }));
2199
+ * ```
2200
+ */
2201
+ static with(options?: ChipHarnessFilters): HarnessPredicate<TnChipHarness>;
2202
+ /**
2203
+ * Gets the chip's label text.
2204
+ *
2205
+ * @returns Promise resolving to the chip's text content.
2206
+ *
2207
+ * @example
2208
+ * ```typescript
2209
+ * const chip = await loader.getHarness(TnChipHarness);
2210
+ * expect(await chip.getLabel()).toBe('Active');
2211
+ * ```
2212
+ */
2213
+ getLabel(): Promise<string>;
2214
+ /**
2215
+ * Gets the chip's color variant (`primary`, `secondary`, or `accent`).
2216
+ *
2217
+ * @returns Promise resolving to the chip's color.
2218
+ *
2219
+ * @example
2220
+ * ```typescript
2221
+ * const chip = await loader.getHarness(TnChipHarness);
2222
+ * expect(await chip.getColor()).toBe('primary');
2223
+ * ```
2224
+ */
2225
+ getColor(): Promise<ChipColor>;
2226
+ /**
2227
+ * Checks whether the chip is disabled.
2228
+ *
2229
+ * @returns Promise resolving to true if the chip is disabled.
2230
+ *
2231
+ * @example
2232
+ * ```typescript
2233
+ * const chip = await loader.getHarness(TnChipHarness);
2234
+ * expect(await chip.isDisabled()).toBe(false);
2235
+ * ```
2236
+ */
2237
+ isDisabled(): Promise<boolean>;
2238
+ /**
2239
+ * Checks whether the chip renders a close (dismiss) button.
2240
+ *
2241
+ * @returns Promise resolving to true if the chip is closable.
2242
+ *
2243
+ * @example
2244
+ * ```typescript
2245
+ * const chip = await loader.getHarness(TnChipHarness);
2246
+ * expect(await chip.isClosable()).toBe(true);
2247
+ * ```
2248
+ */
2249
+ isClosable(): Promise<boolean>;
2250
+ /**
2251
+ * Checks whether the chip renders a leading icon.
2252
+ *
2253
+ * @returns Promise resolving to true if the chip has an icon.
2254
+ *
2255
+ * @example
2256
+ * ```typescript
2257
+ * const chip = await loader.getHarness(TnChipHarness);
2258
+ * expect(await chip.hasIcon()).toBe(true);
2259
+ * ```
2260
+ */
2261
+ hasIcon(): Promise<boolean>;
2262
+ /**
2263
+ * Clicks the chip body, triggering its `onClick` output.
2264
+ *
2265
+ * @returns Promise that resolves when the click action is complete.
2266
+ *
2267
+ * @example
2268
+ * ```typescript
2269
+ * const chip = await loader.getHarness(TnChipHarness.with({ label: 'Active' }));
2270
+ * await chip.click();
2271
+ * ```
2272
+ */
2273
+ click(): Promise<void>;
2274
+ /**
2275
+ * Clicks the chip's close button, triggering its `onClose` output.
2276
+ * Throws if the chip is not closable.
2277
+ *
2278
+ * @returns Promise that resolves when the close action is complete.
2279
+ *
2280
+ * @example
2281
+ * ```typescript
2282
+ * const chip = await loader.getHarness(TnChipHarness.with({ label: 'Has SSH Access' }));
2283
+ * await chip.close();
2284
+ * ```
1850
2285
  */
1851
- blur(): Promise<void>;
2286
+ close(): Promise<void>;
1852
2287
  }
1853
2288
  /**
1854
- * A set of criteria that can be used to filter a list of `TnInputHarness` instances.
2289
+ * A set of criteria that can be used to filter a list of `TnChipHarness` instances.
1855
2290
  */
1856
- interface InputHarnessFilters extends BaseHarnessFilters {
1857
- /** Filters by placeholder text. */
1858
- placeholder?: string;
1859
- /** Filters by the native `name` attribute (typically the form control name). */
1860
- name?: string;
1861
- }
1862
-
1863
- declare class TnInputDirective {
1864
- constructor();
1865
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnInputDirective, never>;
1866
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<TnInputDirective, "input[tnInput], textarea[tnInput], div[tnInput]", never, {}, {}, never, never, true, never>;
1867
- }
1868
-
1869
- type ChipColor = 'primary' | 'secondary' | 'accent';
1870
- declare class TnChipComponent implements AfterViewInit, OnDestroy {
1871
- chipEl: _angular_core.Signal<ElementRef<HTMLElement>>;
1872
- label: _angular_core.InputSignal<string>;
1873
- icon: _angular_core.InputSignal<string | undefined>;
1874
- closable: _angular_core.InputSignal<boolean>;
1875
- disabled: _angular_core.InputSignal<boolean>;
1876
- color: _angular_core.InputSignal<ChipColor>;
1877
- testId: _angular_core.InputSignal<TnTestIdValue>;
1878
- onClose: _angular_core.OutputEmitterRef<void>;
1879
- onClick: _angular_core.OutputEmitterRef<MouseEvent>;
1880
- private focusMonitor;
1881
- ngAfterViewInit(): void;
1882
- ngOnDestroy(): void;
1883
- classes: _angular_core.Signal<string[]>;
1884
- handleClick(event: MouseEvent): void;
1885
- handleClose(event: MouseEvent): void;
1886
- handleKeyDown(event: KeyboardEvent): void;
1887
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnChipComponent, never>;
1888
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnChipComponent, "tn-chip", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "closable": { "alias": "closable"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "testId": { "alias": "testId"; "required": false; "isSignal": true; }; }, { "onClose": "onClose"; "onClick": "onClick"; }, never, never, true, never>;
2291
+ interface ChipHarnessFilters extends BaseHarnessFilters {
2292
+ /** Filters by the chip's label text. Supports string or regex matching. */
2293
+ label?: string | RegExp;
1889
2294
  }
1890
2295
 
1891
2296
  declare class TnCardHeaderDirective {
@@ -2783,7 +3188,7 @@ declare class TnTabComponent implements AfterContentInit {
2783
3188
  onClick(): void;
2784
3189
  onKeydown(event: KeyboardEvent): void;
2785
3190
  classes: _angular_core.Signal<string>;
2786
- tabIndex: _angular_core.Signal<0 | -1>;
3191
+ tabIndex: _angular_core.Signal<-1 | 0>;
2787
3192
  hasIcon: _angular_core.Signal<boolean>;
2788
3193
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnTabComponent, never>;
2789
3194
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnTabComponent, "tn-tab", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "iconTemplate": { "alias": "iconTemplate"; "required": false; "isSignal": true; }; "testId": { "alias": "testId"; "required": false; "isSignal": true; }; }, { "selected": "selected"; }, ["iconContent"], ["*"], true, never>;
@@ -3214,7 +3619,7 @@ interface TabsHarnessFilters extends BaseHarnessFilters {
3214
3619
  */
3215
3620
  declare class TnMenuTriggerDirective implements OnDestroy {
3216
3621
  menu: _angular_core.InputSignal<TnMenuComponent>;
3217
- tnMenuPosition: _angular_core.InputSignal<"above" | "below" | "before" | "after">;
3622
+ tnMenuPosition: _angular_core.InputSignal<"below" | "above" | "before" | "after">;
3218
3623
  private overlayRef?;
3219
3624
  private isMenuOpen;
3220
3625
  private itemClickSub?;
@@ -3801,221 +4206,6 @@ interface FormFieldHarnessFilters extends BaseHarnessFilters {
3801
4206
  testId?: string;
3802
4207
  }
3803
4208
 
3804
- interface TnSelectOption<T = unknown> {
3805
- value: T;
3806
- label: string;
3807
- disabled?: boolean;
3808
- }
3809
- interface TnSelectOptionGroup<T = unknown> {
3810
- label: string;
3811
- options: TnSelectOption<T>[];
3812
- disabled?: boolean;
3813
- }
3814
- declare class TnSelectComponent<T = unknown> implements ControlValueAccessor, OnDestroy {
3815
- options: _angular_core.InputSignal<TnSelectOption<T>[]>;
3816
- optionGroups: _angular_core.InputSignal<TnSelectOptionGroup<T>[]>;
3817
- placeholder: _angular_core.InputSignal<string>;
3818
- /**
3819
- * Accessible label for the select trigger. When set, this is used as the
3820
- * trigger's `aria-label` instead of the visible `placeholder` — useful in
3821
- * contexts (e.g. a pager's page-size dropdown) where the placeholder text
3822
- * doesn't accurately describe the field's purpose to screen readers.
3823
- */
3824
- ariaLabel: _angular_core.InputSignal<string | undefined>;
3825
- /**
3826
- * Message shown inside the dropdown when no options (and no option groups)
3827
- * are available. Defaults to the English `'No options available'`; consumers
3828
- * with i18n requirements can pass a translated string.
3829
- */
3830
- noOptionsLabel: _angular_core.InputSignal<string>;
3831
- /**
3832
- * When `true` (single-select mode only), prepends a synthetic "empty"
3833
- * option to the dropdown so users can unset a chosen value: picking it
3834
- * resets the selection to `null`, shows the placeholder again, and emits
3835
- * `null` via `selectionChange` (and to any bound form control). Mirrors
3836
- * webui ix-select's `--` option. Ignored when `multiple` is set — there,
3837
- * values are cleared by toggling them off individually.
3838
- */
3839
- allowEmpty: _angular_core.InputSignal<boolean>;
3840
- /** Label of the empty option rendered when `allowEmpty` is set. */
3841
- emptyLabel: _angular_core.InputSignal<string>;
3842
- disabled: _angular_core.InputSignal<boolean>;
3843
- testId: _angular_core.InputSignal<TnTestIdValue>;
3844
- multiple: _angular_core.InputSignal<boolean>;
3845
- /**
3846
- * Optional extractor for the per-option test-id discriminator. Defaults to
3847
- * the option's `value` (when a string/number) or its `label`. Provide this
3848
- * when option values are objects, or to pick a more stable/unique key —
3849
- * mirrors webui's `[ixTest]="[controlName, option.<field>]"` discriminator.
3850
- *
3851
- * @example
3852
- * ```html
3853
- * <tn-select testId="user" [optionTestIdKey]="(o) => o.value.id" ... />
3854
- * ```
3855
- */
3856
- optionTestIdKey: _angular_core.InputSignal<((option: TnSelectOption<T>) => string | number | null | undefined) | undefined>;
3857
- /**
3858
- * Custom comparator for matching option values against the selected value(s).
3859
- *
3860
- * When the option values are objects, **provide this** — the built-in
3861
- * fallback uses `JSON.stringify`, which is key-order dependent and can
3862
- * produce false negatives for structurally equal objects. For primitives the
3863
- * default identity check is fine.
3864
- *
3865
- * @example
3866
- * ```ts
3867
- * compareWith = (a, b) => a?.id === b?.id;
3868
- * ```
3869
- */
3870
- compareWith: _angular_core.InputSignal<((a: T | null, b: T | null) => boolean) | undefined>;
3871
- /**
3872
- * Emits the picked value on each selection in single mode. Emits `null`
3873
- * when the user picks the `allowEmpty` empty option to clear the field.
3874
- */
3875
- selectionChange: _angular_core.OutputEmitterRef<T | null>;
3876
- /** Emits the full array of selected values after each toggle in multiple mode. */
3877
- multiSelectionChange: _angular_core.OutputEmitterRef<T[]>;
3878
- protected isOpen: _angular_core.WritableSignal<boolean>;
3879
- protected dropdownPosition: _angular_core.WritableSignal<"above" | "below">;
3880
- protected selectedValue: _angular_core.WritableSignal<T | null>;
3881
- protected selectedValues: _angular_core.WritableSignal<T[]>;
3882
- /** Index into `flatOptions` of the keyboard-focused row (-1 when none). */
3883
- protected focusedIndex: _angular_core.WritableSignal<number>;
3884
- private formDisabled;
3885
- private static instanceCounter;
3886
- private instanceId;
3887
- /**
3888
- * Id namespace used by all DOM ids the template emits (dropdown panel,
3889
- * option rows, group labels). Prefers `testId` when set so tests can target
3890
- * specific instances; otherwise falls back to a per-instance counter so two
3891
- * `<tn-select>`s on the same page never collide on `aria-controls`/group ids.
3892
- */
3893
- protected idNamespace: _angular_core.Signal<string>;
3894
- isDisabled: _angular_core.Signal<boolean>;
3895
- /**
3896
- * The synthetic clear-selection option (`allowEmpty`, single mode only).
3897
- * Its value is `null` cast to `T` so it flows through the same selection
3898
- * path as real options — `selectedValue`/`writeValue` already model "no
3899
- * selection" as `null`, so picking it clears the field for free.
3900
- */
3901
- protected emptyOption: _angular_core.Signal<TnSelectOption<T> | null>;
3902
- /** Ungrouped options as rendered: the empty option (when enabled) first. */
3903
- protected displayOptions: _angular_core.Signal<TnSelectOption<T>[]>;
3904
- /** Whether `option` is the synthetic `allowEmpty` clear option. */
3905
- protected isEmptyOption(option: TnSelectOption<T>): boolean;
3906
- /**
3907
- * Selectable, non-disabled options in display order (regular options first,
3908
- * then groups). Used by keyboard navigation so we can skip disabled
3909
- * entries and group headers without a separate filter pass.
3910
- */
3911
- navigableOptions: _angular_core.Signal<{
3912
- option: TnSelectOption<T>;
3913
- id: string;
3914
- }[]>;
3915
- /** Stable DOM id of the currently-highlighted option, for aria-activedescendant. */
3916
- focusedOptionId: _angular_core.Signal<string | null>;
3917
- /** Stable DOM id for an option; matches what navigableOptions() assigns. */
3918
- optionId(option: TnSelectOption<T>): string | null;
3919
- /** Whether `option` is the keyboard-highlighted item. */
3920
- isOptionFocused(option: TnSelectOption<T>): boolean;
3921
- /**
3922
- * Test-id segments for an option row, consumed by `[tnTestId]` with
3923
- * `tnTestIdType="option"`. The select's `testId` scopes each option so ids
3924
- * stay unique across selects: base `quick-filters` + option value `ssd` →
3925
- * `option-quick-filters-ssd`; with no base → `option-ssd`. The discriminator
3926
- * comes from `optionTestIdKey` when provided, else the option's primitive
3927
- * `value`, else its `label`.
3928
- */
3929
- protected optionTestIdParts(option: TnSelectOption<T>): (string | number | null | undefined)[];
3930
- private onChange;
3931
- private onTouched;
3932
- private elementRef;
3933
- private cdr;
3934
- private overlay;
3935
- private viewContainerRef;
3936
- private triggerEl;
3937
- private dropdownTemplate;
3938
- private overlayRef?;
3939
- private overlaySubs;
3940
- writeValue(value: T | T[] | null): void;
3941
- registerOnChange(fn: (value: T | T[] | null) => void): void;
3942
- registerOnTouched(fn: () => void): void;
3943
- setDisabledState(isDisabled: boolean): void;
3944
- toggleDropdown(): void;
3945
- openDropdown(): void;
3946
- /**
3947
- * Attach the dropdown panel as a CDK overlay anchored to the trigger.
3948
- *
3949
- * Why an overlay (vs. an inline absolutely-positioned panel):
3950
- * - Escapes parent `overflow: hidden`/clipping in surrounding layouts.
3951
- * - `outsidePointerEvents()` notifies on outside pointerdown WITHOUT
3952
- * intercepting the click (no backdrop) — so the user's click reaches
3953
- * the underlying target while the select closes silently.
3954
- * - Position is recomputed on scroll so the panel stays attached.
3955
- * - Width is matched to the trigger so the panel doesn't jump in size.
3956
- */
3957
- private attachOverlay;
3958
- private detachOverlay;
3959
- ngOnDestroy(): void;
3960
- /**
3961
- * Closes the dropdown.
3962
- *
3963
- * @param restoreFocus When `true` (the default), returns focus to the
3964
- * trigger. Used for explicit closes — Escape, Enter/Space activation,
3965
- * option click — where the user is still interacting with the select.
3966
- * Pass `false` for click-outside / blur paths so we don't steal focus
3967
- * from the element the user actually navigated to.
3968
- */
3969
- closeDropdown(restoreFocus?: boolean): void;
3970
- onOptionClick(option: TnSelectOption<T>, groupDisabled?: boolean): void;
3971
- selectOption(option: TnSelectOption<T>): void;
3972
- private toggleOption;
3973
- isOptionSelected(option: TnSelectOption<T>): boolean;
3974
- protected displayText: _angular_core.Signal<string>;
3975
- private findOptionByValue;
3976
- protected hasAnyOptions: _angular_core.Signal<boolean>;
3977
- /** One-shot guard so the object-compare warning fires at most once per instance. */
3978
- private warnedAboutObjectCompare;
3979
- /**
3980
- * Compares two option values for equality.
3981
- *
3982
- * - Uses `compareWith` when provided (the supported path for object values).
3983
- * - Falls back to strict identity (`===`) — adequate for primitives.
3984
- * - For object values WITHOUT `compareWith` we return `false` (no
3985
- * structural compare) and emit a one-time warning. The previous
3986
- * `JSON.stringify` fallback was key-order sensitive and produced silent
3987
- * false-negatives that were hard to diagnose; returning `false` makes the
3988
- * misuse loud (selection won't match) and the warning points to the fix.
3989
- *
3990
- * The warning is **unconditional** (not gated on `isDevMode()`) so prod
3991
- * monitoring picks it up — consumers relying on the old stringify fallback
3992
- * would otherwise see selections silently stop matching after upgrade with
3993
- * no signal in production logs.
3994
- */
3995
- private compareValues;
3996
- /**
3997
- * Keyboard navigation for the combobox trigger.
3998
- *
3999
- * - **ArrowDown / ArrowUp** opens the dropdown if closed; otherwise moves
4000
- * the keyboard-focus highlight (via aria-activedescendant) up/down,
4001
- * skipping disabled options and group headers.
4002
- * - **Home / End** jump to the first / last enabled option.
4003
- * - **Enter / Space** opens the dropdown if closed; if open and an option
4004
- * is highlighted, selects that option (in single mode) or toggles it
4005
- * (in multiple mode).
4006
- * - **Escape** closes the dropdown without changing the selection.
4007
- *
4008
- * All navigation keys call `event.preventDefault()` so the page does not
4009
- * scroll while the user is moving through options.
4010
- */
4011
- onKeydown(event: KeyboardEvent): void;
4012
- private moveFocus;
4013
- private activateFocusedOption;
4014
- private scrollFocusedIntoView;
4015
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnSelectComponent<any>, never>;
4016
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnSelectComponent<any>, "tn-select", never, { "options": { "alias": "options"; "required": false; "isSignal": true; }; "optionGroups": { "alias": "optionGroups"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "noOptionsLabel": { "alias": "noOptionsLabel"; "required": false; "isSignal": true; }; "allowEmpty": { "alias": "allowEmpty"; "required": false; "isSignal": true; }; "emptyLabel": { "alias": "emptyLabel"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "testId": { "alias": "testId"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "optionTestIdKey": { "alias": "optionTestIdKey"; "required": false; "isSignal": true; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; }, { "selectionChange": "selectionChange"; "multiSelectionChange": "multiSelectionChange"; }, never, never, true, never>;
4017
- }
4018
-
4019
4209
  /**
4020
4210
  * Harness for interacting with tn-select in tests.
4021
4211
  * Provides methods for querying select state, opening/closing the dropdown,
@@ -7793,5 +7983,5 @@ declare const TN_THEME_DEFINITIONS: readonly TnThemeDefinition[];
7793
7983
  */
7794
7984
  declare const THEME_MAP: Map<TnTheme, TnThemeDefinition>;
7795
7985
 
7796
- 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_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, TnCardHeaderDirective, TnCellDefDirective, TnCheckboxComponent, TnCheckboxHarness, TnCheckboxLabelDirective, TnChipComponent, TnConfirmDialogComponent, TnDateInputComponent, TnDateInputHarness, TnDateRangeInputComponent, TnDateRangeInputHarness, TnDetailRowDefDirective, TnDialog, TnDialogHarness, TnDialogShellComponent, TnDialogTesting, TnDividerComponent, TnDividerDirective, TnDrawerComponent, TnDrawerContainerComponent, TnDrawerContainerHarness, TnDrawerContentComponent, TnDrawerHarness, TnEmptyComponent, TnEmptyHarness, TnExpansionPanelComponent, TnExpansionPanelHarness, TnFilePickerComponent, TnFilePickerPopupComponent, TnFormFieldComponent, TnFormFieldHarness, 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, TnNestedTreeNodeComponent, TnParticleProgressBarComponent, TnProgressBarComponent, TnRadioComponent, TnRadioHarness, TnSelectComponent, TnSelectHarness, TnSelectionListComponent, TnSidePanelActionDirective, TnSidePanelComponent, TnSidePanelHarness, TnSidePanelHeaderActionDirective, TnSlideToggleComponent, TnSlideToggleHarness, TnSliderComponent, TnSliderThumbDirective, TnSliderWithLabelDirective, TnSpinnerComponent, TnSpriteLoaderService, TnStepComponent, TnStepperComponent, 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, TnTreeNodeComponent, TnTreeNodeOutletDirective, TruncatePathPipe, WindowsModifierKeys, WindowsShortcuts, composeTestId, createLucideLibrary, createShortcut, defaultSpriteBasePath, defaultSpriteConfigPath, formatSize, kebabTestSegment, labelMarkupToHtml, labelMarkupToText, libIconMarker, parseLabelMarkup, parseSize, registerLucideIcons, scopeTestId, setupLucideIntegration, tnIconMarker, writeTestId };
7797
- export type { AutocompleteHarnessFilters, BannerHarnessFilters, ButtonHarnessFilters, ButtonToggleHarnessFilters, CalendarCell, CheckboxHarnessFilters, ChipColor, CreateFolderEvent, DateInputHarnessFilters, DateRange, DateRangeInputHarnessFilters, DialogHarnessFilters, EmptyHarnessFilters, ExpansionPanelHarnessFilters, FilePickerCallbacks, FilePickerError, FilePickerMode, FileSystemItem, FormFieldHarnessFilters, IconButtonHarnessFilters, IconHarnessFilters, IconLibrary, IconLibraryType, IconResult, IconSize, IconSource, IconTestingMockOverrides, InputHarnessFilters, KeyCombination, LabelMarkupSegment, LabelMarkupSegmentType, LabelType, LucideIconOptions, MenuHarnessFilters, MockIconRegistry, MockSpriteLoader, PathSegment, PlatformType, ProgressBarMode, RadioHarnessFilters, ResolvedIcon, SelectHarnessFilters, ShortcutHandler, SidePanelHarnessFilters, SizeStandard, SlideToggleColor, SlideToggleHarnessFilters, SpinnerMode, SpriteConfig, SubscriptSizing, TabChangeEvent, TabHarnessFilters, TabPanelHarnessFilters, TabsHarnessFilters, TnBannerType, TnButtonToggleType, TnCardAction, TnCardControl, TnCardFooterLink, TnCardHeaderStatus, TnConfirmDialogData, TnDialogDefaults, TnDialogOpenTarget, TnDrawerMode, TnDrawerPosition, TnEmptySize, TnFlatTreeNode, TnFormFieldErrorMessage, TnFormFieldErrorMessages, TnFormFieldErrorResolver, TnMenuItem, TnSelectOption, TnSelectOptionGroup, TnSelectionChange, TnSortEvent, TnTableDataProvider, TnTableDataSource, TnTableHarnessFilters, TnTablePagerHarnessFilters, TnTablePagerLabels, TnTablePagination, TnTestAttrName, TnTestIdValue, TnThemeDefinition, TnToastCall, TnToastConfig, TooltipPosition, YearCell };
7986
+ 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_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, TnCardHeaderDirective, TnCellDefDirective, TnCheckboxComponent, TnCheckboxHarness, TnCheckboxLabelDirective, TnChipComponent, TnChipHarness, TnConfirmDialogComponent, TnDateInputComponent, TnDateInputHarness, TnDateRangeInputComponent, TnDateRangeInputHarness, TnDetailRowDefDirective, TnDialog, TnDialogHarness, TnDialogShellComponent, TnDialogTesting, TnDividerComponent, TnDividerDirective, TnDrawerComponent, TnDrawerContainerComponent, TnDrawerContainerHarness, TnDrawerContentComponent, TnDrawerHarness, TnEmptyComponent, TnEmptyHarness, TnExpansionPanelComponent, TnExpansionPanelHarness, TnFilePickerComponent, TnFilePickerPopupComponent, TnFormFieldComponent, TnFormFieldHarness, 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, TnNestedTreeNodeComponent, TnParticleProgressBarComponent, TnProgressBarComponent, TnRadioComponent, TnRadioHarness, TnSelectComponent, TnSelectHarness, TnSelectionListComponent, TnSidePanelActionDirective, TnSidePanelComponent, TnSidePanelHarness, TnSidePanelHeaderActionDirective, TnSlideToggleComponent, TnSlideToggleHarness, TnSliderComponent, TnSliderThumbDirective, TnSliderWithLabelDirective, TnSpinnerComponent, TnSpriteLoaderService, TnStepComponent, TnStepperComponent, 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, TnTreeNodeComponent, TnTreeNodeOutletDirective, TruncatePathPipe, WindowsModifierKeys, WindowsShortcuts, composeTestId, createLucideLibrary, createShortcut, defaultSpriteBasePath, defaultSpriteConfigPath, formatSize, kebabTestSegment, labelMarkupToHtml, labelMarkupToText, libIconMarker, parseLabelMarkup, parseSize, registerLucideIcons, scopeTestId, setupLucideIntegration, tnIconMarker, writeTestId };
7987
+ export type { AutocompleteHarnessFilters, BannerHarnessFilters, ButtonHarnessFilters, ButtonToggleHarnessFilters, CalendarCell, CheckboxHarnessFilters, ChipColor, ChipHarnessFilters, CreateFolderEvent, DateInputHarnessFilters, DateRange, DateRangeInputHarnessFilters, DialogHarnessFilters, EmptyHarnessFilters, ExpansionPanelHarnessFilters, FilePickerCallbacks, FilePickerError, FilePickerMode, FileSystemItem, FormFieldHarnessFilters, IconButtonHarnessFilters, IconHarnessFilters, IconLibrary, IconLibraryType, IconResult, IconSize, IconSource, IconTestingMockOverrides, InputHarnessFilters, KeyCombination, LabelMarkupSegment, LabelMarkupSegmentType, LabelType, LucideIconOptions, MenuHarnessFilters, MockIconRegistry, MockSpriteLoader, PathSegment, PlatformType, ProgressBarMode, RadioHarnessFilters, ResolvedIcon, SelectHarnessFilters, ShortcutHandler, SidePanelHarnessFilters, SizeStandard, SlideToggleColor, SlideToggleHarnessFilters, SpinnerMode, SpriteConfig, SubscriptSizing, TabChangeEvent, TabHarnessFilters, TabPanelHarnessFilters, TabsHarnessFilters, TnAutocompleteOption, TnBannerType, TnButtonToggleType, TnCardAction, TnCardControl, TnCardFooterLink, TnCardHeaderStatus, TnConfirmDialogData, TnDialogDefaults, TnDialogOpenTarget, TnDrawerMode, TnDrawerPosition, TnEmptySize, TnFlatTreeNode, TnFormFieldErrorMessage, TnFormFieldErrorMessages, TnFormFieldErrorResolver, TnMenuItem, TnSelectOption, TnSelectOptionGroup, TnSelectionChange, TnSortEvent, TnTableDataProvider, TnTableDataSource, TnTableHarnessFilters, TnTablePagerHarnessFilters, TnTablePagerLabels, TnTablePagination, TnTestAttrName, TnTestIdValue, TnThemeDefinition, TnToastCall, TnToastConfig, TooltipPosition, YearCell };