@truenas/ui-components 0.1.57 → 0.1.59

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.1.57",
3
+ "version": "0.1.59",
4
4
  "publishConfig": {
5
5
  "registry": "https://registry.npmjs.org",
6
6
  "access": "public"
@@ -16,6 +16,7 @@
16
16
  "@angular/cdk": "^21.0.0",
17
17
  "@angular/common": "^21.0.0",
18
18
  "@angular/core": "^21.0.0",
19
+ "@angular/router": "^21.0.0",
19
20
  "@mdi/angular-material": "^7.2.96",
20
21
  "@mdi/js": "^7.4.47"
21
22
  },
@@ -1,15 +1,15 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { ElementRef, OnDestroy, AfterViewInit, AfterContentInit, TemplateRef, Provider, ChangeDetectorRef, OnInit, PipeTransform, ViewContainerRef, AfterViewChecked, ComponentRef, InjectionToken } from '@angular/core';
2
+ import { ElementRef, OnDestroy, AfterViewInit, AfterContentInit, TemplateRef, Provider, ChangeDetectorRef, OnInit, InjectionToken, Signal, PipeTransform, ViewContainerRef, AfterViewChecked, ComponentRef } from '@angular/core';
3
3
  import { ControlValueAccessor, NgControl } from '@angular/forms';
4
4
  import { ComponentHarness, BaseHarnessFilters, HarnessPredicate, HarnessLoader } from '@angular/cdk/testing';
5
5
  import { SafeHtml, SafeResourceUrl, DomSanitizer } from '@angular/platform-browser';
6
6
  import { ComponentFixture } from '@angular/core/testing';
7
7
  import { SelectionModel, DataSource } from '@angular/cdk/collections';
8
+ import * as rxjs from 'rxjs';
9
+ import { Observable } from 'rxjs';
8
10
  import * as i1 from '@angular/cdk/tree';
9
11
  import { CdkTree, FlatTreeControl, CdkTreeNode, CdkNestedTreeNode } from '@angular/cdk/tree';
10
12
  export { FlatTreeControl } from '@angular/cdk/tree';
11
- import * as rxjs from 'rxjs';
12
- import { Observable } from 'rxjs';
13
13
  import { Overlay } from '@angular/cdk/overlay';
14
14
  import { DialogConfig, DialogRef } from '@angular/cdk/dialog';
15
15
  import { ComponentType } from '@angular/cdk/portal';
@@ -533,14 +533,36 @@ declare class TnButtonComponent {
533
533
  label: _angular_core.InputSignal<string>;
534
534
  disabled: _angular_core.InputSignal<boolean>;
535
535
  /**
536
- * Test-id applied to the rendered `<button>` element. Rendered under whichever attribute
536
+ * Test-id applied to the rendered element. Rendered under whichever attribute
537
537
  * name is configured via `TN_TEST_ATTR` (default `data-testid`).
538
538
  */
539
539
  testId: _angular_core.InputSignal<string | undefined>;
540
+ /**
541
+ * Renders the button as an `<a>` with a plain `href` attribute.
542
+ * Mutually exclusive with `routerLink` — if both are provided, `routerLink` wins.
543
+ */
544
+ href: _angular_core.InputSignal<string | undefined>;
545
+ /**
546
+ * Renders the button as an `<a>` driven by Angular Router. Accepts the same
547
+ * shapes as `[routerLink]` (`string | any[]`).
548
+ */
549
+ routerLink: _angular_core.InputSignal<string | unknown[] | undefined>;
550
+ queryParams: _angular_core.InputSignal<Record<string, unknown> | undefined>;
551
+ fragment: _angular_core.InputSignal<string | undefined>;
552
+ target: _angular_core.InputSignal<string | undefined>;
553
+ rel: _angular_core.InputSignal<string | undefined>;
554
+ /**
555
+ * Accessible label for the rendered element. Mirrors `aria-label`; useful when
556
+ * the visible label alone is insufficient (e.g. icon-only links).
557
+ */
558
+ ariaLabel: _angular_core.InputSignal<string | undefined>;
540
559
  onClick: _angular_core.OutputEmitterRef<MouseEvent>;
560
+ isAnchor: _angular_core.Signal<boolean>;
561
+ isRouterLink: _angular_core.Signal<boolean>;
541
562
  classes: _angular_core.Signal<string[]>;
563
+ handleAnchorClick(event: MouseEvent): void;
542
564
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnButtonComponent, never>;
543
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnButtonComponent, "tn-button", never, { "primary": { "alias": "primary"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "backgroundColor": { "alias": "backgroundColor"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "testId": { "alias": "testId"; "required": false; "isSignal": true; }; }, { "onClick": "onClick"; }, never, never, true, never>;
565
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnButtonComponent, "tn-button", never, { "primary": { "alias": "primary"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "backgroundColor": { "alias": "backgroundColor"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "testId": { "alias": "testId"; "required": false; "isSignal": true; }; "href": { "alias": "href"; "required": false; "isSignal": true; }; "routerLink": { "alias": "routerLink"; "required": false; "isSignal": true; }; "queryParams": { "alias": "queryParams"; "required": false; "isSignal": true; }; "fragment": { "alias": "fragment"; "required": false; "isSignal": true; }; "target": { "alias": "target"; "required": false; "isSignal": true; }; "rel": { "alias": "rel"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "onClick": "onClick"; }, never, never, true, never>;
544
566
  }
545
567
 
546
568
  /**
@@ -609,6 +631,18 @@ declare class TnButtonHarness extends ComponentHarness {
609
631
  * ```
610
632
  */
611
633
  isDisabled(): Promise<boolean>;
634
+ /**
635
+ * Gets the resolved URL of the rendered element. Returns the `href` for
636
+ * anchor-mode renders (both plain `href` and `routerLink`) and `null` for
637
+ * button-mode renders.
638
+ *
639
+ * @example
640
+ * ```typescript
641
+ * const link = await loader.getHarness(TnButtonHarness.with({ label: 'Audit Settings' }));
642
+ * expect(await link.getHref()).toContain('/audit/settings');
643
+ * ```
644
+ */
645
+ getHref(): Promise<string | null>;
612
646
  /**
613
647
  * Clicks the button.
614
648
  *
@@ -1294,6 +1328,12 @@ interface TnMenuItem {
1294
1328
  action?: () => void;
1295
1329
  children?: TnMenuItem[];
1296
1330
  shortcut?: string;
1331
+ /**
1332
+ * Marks this item as the currently-chosen option (e.g. the active sort key
1333
+ * or export format). Applies the `tn-menu-item--selected` class and an
1334
+ * `aria-current="true"` attribute. Visually distinct from focus/hover.
1335
+ */
1336
+ selected?: boolean;
1297
1337
  }
1298
1338
  declare class TnMenuComponent {
1299
1339
  items: _angular_core.InputSignal<TnMenuItem[]>;
@@ -1307,6 +1347,8 @@ declare class TnMenuComponent {
1307
1347
  private overlay;
1308
1348
  private viewContainerRef;
1309
1349
  onMenuItemClick(item: TnMenuItem): void;
1350
+ private contentItems;
1351
+ constructor();
1310
1352
  hasChildren: _angular_core.Signal<(item: TnMenuItem) => boolean>;
1311
1353
  onMenuOpen(): void;
1312
1354
  onMenuClose(): void;
@@ -1319,7 +1361,7 @@ declare class TnMenuComponent {
1319
1361
  onContextMenu(event: MouseEvent): void;
1320
1362
  trackByItemId(index: number, item: TnMenuItem): string;
1321
1363
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnMenuComponent, never>;
1322
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnMenuComponent, "tn-menu", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "contextMenu": { "alias": "contextMenu"; "required": false; "isSignal": true; }; }, { "menuItemClick": "menuItemClick"; "menuOpen": "menuOpen"; "menuClose": "menuClose"; }, never, ["*"], true, never>;
1364
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnMenuComponent, "tn-menu", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "contextMenu": { "alias": "contextMenu"; "required": false; "isSignal": true; }; }, { "menuItemClick": "menuItemClick"; "menuOpen": "menuOpen"; "menuClose": "menuClose"; }, ["contentItems"], ["*", "tn-menu-item, .tn-menu-separator"], true, never>;
1323
1365
  }
1324
1366
 
1325
1367
  declare class TnCardComponent {
@@ -2433,6 +2475,55 @@ interface TabsHarnessFilters extends BaseHarnessFilters {
2433
2475
  hasTab?: string | RegExp;
2434
2476
  }
2435
2477
 
2478
+ /**
2479
+ * Projection-based menu item for use inside `<tn-menu>`.
2480
+ *
2481
+ * Two authoring modes:
2482
+ * 1. **Convenience** — set `label` (and optionally `icon`/`shortcut`); the
2483
+ * default icon + label + shortcut layout renders.
2484
+ * 2. **Custom content** — omit `label`; project arbitrary content via
2485
+ * `<ng-content>` (badges, two-line layouts, etc.).
2486
+ *
2487
+ * Existing `<tn-menu [items]="...">` consumers don't need this component;
2488
+ * the items-array API continues to work unchanged. Items-array entries and
2489
+ * projected `<tn-menu-item>` children render together inside one `<tn-menu>`.
2490
+ *
2491
+ * Subscribe to either the projected item's own `itemClick` output (preferred,
2492
+ * per-item handlers) or the parent menu's `menuItemClick` (uniform handler).
2493
+ * Trigger-driven menus close automatically on projected-item click.
2494
+ *
2495
+ * **Note on keyboard navigation:** projected items render as `role="menuitem"`
2496
+ * buttons but do not participate in `CdkMenu` arrow-key navigation (CdkMenuItem
2497
+ * requires its parent `CdkMenu` in the same injector tree, which projection
2498
+ * breaks). For menus that depend on arrow-key navigation between options, use
2499
+ * the `items` input form. Tab/Shift+Tab and Enter/Space activation still work.
2500
+ *
2501
+ * @example
2502
+ * ```html
2503
+ * <tn-menu>
2504
+ * <tn-menu-item label="JSON" [selected]="format === 'json'"
2505
+ * (itemClick)="setFormat('json')" />
2506
+ * <tn-menu-item label="CSV" [selected]="format === 'csv'"
2507
+ * (itemClick)="setFormat('csv')" />
2508
+ * </tn-menu>
2509
+ * ```
2510
+ */
2511
+ declare class TnMenuItemComponent {
2512
+ id: _angular_core.InputSignal<string | undefined>;
2513
+ label: _angular_core.InputSignal<string | undefined>;
2514
+ icon: _angular_core.InputSignal<string | undefined>;
2515
+ iconLibrary: _angular_core.InputSignal<"material" | "mdi" | "custom" | "lucide" | undefined>;
2516
+ shortcut: _angular_core.InputSignal<string | undefined>;
2517
+ disabled: _angular_core.InputSignal<boolean>;
2518
+ selected: _angular_core.InputSignal<boolean>;
2519
+ testId: _angular_core.InputSignal<string | undefined>;
2520
+ itemClick: _angular_core.OutputEmitterRef<MouseEvent>;
2521
+ resolvedTestId: _angular_core.Signal<string | undefined>;
2522
+ handleClick(event: MouseEvent): void;
2523
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnMenuItemComponent, never>;
2524
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnMenuItemComponent, "tn-menu-item", never, { "id": { "alias": "id"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "iconLibrary": { "alias": "iconLibrary"; "required": false; "isSignal": true; }; "shortcut": { "alias": "shortcut"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "testId": { "alias": "testId"; "required": false; "isSignal": true; }; }, { "itemClick": "itemClick"; }, never, ["*"], true, never>;
2525
+ }
2526
+
2436
2527
  /**
2437
2528
  * Directive that attaches a menu to any element.
2438
2529
  * Usage: <button [tnMenuTriggerFor]="menu">Open Menu</button>
@@ -2555,6 +2646,24 @@ declare class TnMenuHarness extends ComponentHarness {
2555
2646
  * Gets the number of menu items (excluding separators).
2556
2647
  */
2557
2648
  getItemCount(): Promise<number>;
2649
+ /**
2650
+ * Checks whether a menu item is marked as the currently-selected option
2651
+ * (i.e. has `aria-current="true"`).
2652
+ *
2653
+ * @example
2654
+ * ```typescript
2655
+ * const menu = await rootLoader.getHarness(TnMenuHarness);
2656
+ * expect(await menu.isItemSelected({ label: 'JSON' })).toBe(true);
2657
+ * ```
2658
+ */
2659
+ isItemSelected(filter: {
2660
+ label: string | RegExp;
2661
+ }): Promise<boolean>;
2662
+ /**
2663
+ * Gets the label of the currently-selected item, or `null` when no item is
2664
+ * marked as selected.
2665
+ */
2666
+ getSelectedItemLabel(): Promise<string | null>;
2558
2667
  }
2559
2668
  /**
2560
2669
  * A set of criteria that can be used to filter `TnMenuHarness` instances.
@@ -2824,40 +2933,141 @@ declare class TnSelectComponent<T = unknown> implements ControlValueAccessor {
2824
2933
  options: _angular_core.InputSignal<TnSelectOption<T>[]>;
2825
2934
  optionGroups: _angular_core.InputSignal<TnSelectOptionGroup<T>[]>;
2826
2935
  placeholder: _angular_core.InputSignal<string>;
2936
+ /**
2937
+ * Accessible label for the select trigger. When set, this is used as the
2938
+ * trigger's `aria-label` instead of the visible `placeholder` — useful in
2939
+ * contexts (e.g. a pager's page-size dropdown) where the placeholder text
2940
+ * doesn't accurately describe the field's purpose to screen readers.
2941
+ */
2942
+ ariaLabel: _angular_core.InputSignal<string | undefined>;
2943
+ /**
2944
+ * Message shown inside the dropdown when no options (and no option groups)
2945
+ * are available. Defaults to the English `'No options available'`; consumers
2946
+ * with i18n requirements can pass a translated string.
2947
+ */
2948
+ noOptionsLabel: _angular_core.InputSignal<string>;
2827
2949
  disabled: _angular_core.InputSignal<boolean>;
2828
2950
  testId: _angular_core.InputSignal<string>;
2829
2951
  multiple: _angular_core.InputSignal<boolean>;
2952
+ /**
2953
+ * Custom comparator for matching option values against the selected value(s).
2954
+ *
2955
+ * When the option values are objects, **provide this** — the built-in
2956
+ * fallback uses `JSON.stringify`, which is key-order dependent and can
2957
+ * produce false negatives for structurally equal objects. For primitives the
2958
+ * default identity check is fine.
2959
+ */
2830
2960
  compareWith: _angular_core.InputSignal<((a: T | null, b: T | null) => boolean) | undefined>;
2831
2961
  selectionChange: _angular_core.OutputEmitterRef<T>;
2832
2962
  /** Emits the full array of selected values after each toggle in multiple mode. */
2833
2963
  multiSelectionChange: _angular_core.OutputEmitterRef<T[]>;
2834
2964
  protected isOpen: _angular_core.WritableSignal<boolean>;
2965
+ protected dropdownPosition: _angular_core.WritableSignal<"above" | "below">;
2835
2966
  protected selectedValue: _angular_core.WritableSignal<T | null>;
2836
2967
  protected selectedValues: _angular_core.WritableSignal<T[]>;
2968
+ /** Index into `flatOptions` of the keyboard-focused row (-1 when none). */
2969
+ protected focusedIndex: _angular_core.WritableSignal<number>;
2837
2970
  private formDisabled;
2971
+ private static readonly DROPDOWN_MAX_HEIGHT_VAR;
2972
+ private static readonly DROPDOWN_MAX_HEIGHT_FALLBACK;
2973
+ private readonly fallbackId;
2974
+ protected uniqueId: _angular_core.Signal<string>;
2838
2975
  isDisabled: _angular_core.Signal<boolean>;
2976
+ /**
2977
+ * Flattened option list (ungrouped + grouped, in render order). The keyboard
2978
+ * navigation walks this list — entries from disabled groups are kept but
2979
+ * marked disabled so the cursor skips over them correctly.
2980
+ */
2981
+ protected flatOptions: _angular_core.Signal<TnSelectOption<T>[]>;
2982
+ /**
2983
+ * Starting flat-index of each option group, used by the template to
2984
+ * translate a (group, option) pair into the matching `flatOptions` index.
2985
+ */
2986
+ protected groupOffsets: _angular_core.Signal<number[]>;
2987
+ /** `aria-activedescendant` id for the focused option (or null). */
2988
+ protected activeOptionId: _angular_core.Signal<string | null>;
2839
2989
  private onChange;
2840
2990
  private onTouched;
2841
2991
  private elementRef;
2842
2992
  private cdr;
2993
+ protected triggerEl: _angular_core.Signal<ElementRef<HTMLElement> | undefined>;
2843
2994
  constructor();
2844
2995
  writeValue(value: T | T[] | null): void;
2845
2996
  registerOnChange(fn: (value: T | T[] | null) => void): void;
2846
2997
  registerOnTouched(fn: () => void): void;
2847
2998
  setDisabledState(isDisabled: boolean): void;
2848
2999
  toggleDropdown(): void;
2849
- closeDropdown(): void;
3000
+ /**
3001
+ * Open the dropdown, seed the keyboard cursor on the currently-selected
3002
+ * option (or the first focusable one), and decide whether to flip up.
3003
+ */
3004
+ private openDropdown;
3005
+ /**
3006
+ * Close the dropdown.
3007
+ *
3008
+ * @param restoreFocus When `true` (default), return focus to the trigger so
3009
+ * keyboard users land somewhere sensible. Pass `false` for click-outside
3010
+ * so we don't steal focus from the element the user just navigated to.
3011
+ */
3012
+ closeDropdown(options?: {
3013
+ restoreFocus?: boolean;
3014
+ }): void;
3015
+ /** Picks the initial focused-row index when the dropdown opens. */
3016
+ private initialFocusIndex;
3017
+ /**
3018
+ * Decide whether the dropdown should open above or below the trigger.
3019
+ * Opens above when there isn't enough space below the trigger AND there is
3020
+ * more space above — otherwise stays below. Falls back to `'below'` when no
3021
+ * trigger element is found yet.
3022
+ */
3023
+ private computeDropdownPosition;
3024
+ /**
3025
+ * Reads the dropdown's max-height from the CSS custom property set in
3026
+ * select.component.scss. Single source of truth for the flip-up threshold —
3027
+ * if the stylesheet changes, the heuristic follows automatically.
3028
+ */
3029
+ private readDropdownMaxHeight;
2850
3030
  onOptionClick(option: TnSelectOption<T>, groupDisabled?: boolean): void;
2851
3031
  selectOption(option: TnSelectOption<T>): void;
2852
3032
  private toggleOption;
2853
3033
  isOptionSelected(option: TnSelectOption<T>): boolean;
2854
- getDisplayText: _angular_core.Signal<string>;
3034
+ /** Build a stable DOM id for the option at `index` for aria-activedescendant. */
3035
+ protected optionId(index: number): string;
3036
+ protected displayText: _angular_core.Signal<string>;
2855
3037
  private findOptionByValue;
2856
- hasAnyOptions: _angular_core.Signal<boolean>;
3038
+ protected anyOptionsPresent: _angular_core.Signal<boolean>;
3039
+ /**
3040
+ * Compares two option values for equality. Uses `compareWith` if provided,
3041
+ * otherwise identity (`===`). For object values it falls back to
3042
+ * `JSON.stringify`, which is key-order dependent — consumers with object
3043
+ * values should provide `compareWith` to avoid subtle bugs.
3044
+ */
2857
3045
  private compareValues;
3046
+ /**
3047
+ * Keyboard handling on the trigger (focus stays on the trigger while the
3048
+ * dropdown is open — options use mousedown-preventDefault to avoid stealing
3049
+ * it). Implements the WAI-ARIA combobox pattern subset we need:
3050
+ *
3051
+ * - **Enter / Space**: open closed dropdown, or select the focused row
3052
+ * (toggle in multi-mode).
3053
+ * - **ArrowDown / ArrowUp**: move the focused row; opens the dropdown first
3054
+ * if it's closed.
3055
+ * - **Home / End**: jump to first / last focusable row (when open).
3056
+ * - **Escape**: close and restore focus to the trigger.
3057
+ * - **Tab**: close without preventing default so focus moves to the next
3058
+ * element naturally.
3059
+ */
2858
3060
  onKeydown(event: KeyboardEvent): void;
3061
+ /** Step the focused row by ±1 (or more), skipping disabled options. */
3062
+ private moveFocus;
3063
+ /** Move focus to a specific index, scanning forward/backward to skip disabled. */
3064
+ private moveFocusTo;
3065
+ /** Select (or toggle, in multi-mode) the currently keyboard-focused row. */
3066
+ private selectFocused;
3067
+ /** Scrolls the keyboard-focused option into view if it's outside the dropdown's viewport. */
3068
+ private scrollFocusedIntoView;
2859
3069
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnSelectComponent<any>, never>;
2860
- 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; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "testId": { "alias": "testId"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; }, { "selectionChange": "selectionChange"; "multiSelectionChange": "multiSelectionChange"; }, never, never, true, never>;
3070
+ 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; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "testId": { "alias": "testId"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; }, { "selectionChange": "selectionChange"; "multiSelectionChange": "multiSelectionChange"; }, never, never, true, never>;
2861
3071
  }
2862
3072
 
2863
3073
  /**
@@ -3834,6 +4044,238 @@ declare class TnTableHarness extends ComponentHarness {
3834
4044
  interface TnTableHarnessFilters extends BaseHarnessFilters {
3835
4045
  }
3836
4046
 
4047
+ /**
4048
+ * Default labels rendered inside `tn-table-pager`. Consumers can override any
4049
+ * subset of these at the app root by providing a value for the
4050
+ * `TN_TABLE_PAGER_LABELS` token — typically wired up to an i18n service so the
4051
+ * pager picks up translated copy without each call site having to bind six
4052
+ * label inputs. Inputs on `<tn-table-pager>` still win when explicitly set.
4053
+ */
4054
+ interface TnTablePagerLabels {
4055
+ itemsPerPage: string;
4056
+ of: string;
4057
+ firstPage: string;
4058
+ previousPage: string;
4059
+ nextPage: string;
4060
+ lastPage: string;
4061
+ /** Accessible label applied to the pager's `navigation` landmark. */
4062
+ tablePagination: string;
4063
+ }
4064
+ /** English defaults used when no `TN_TABLE_PAGER_LABELS` provider is registered. */
4065
+ declare const TN_TABLE_PAGER_DEFAULT_LABELS: TnTablePagerLabels;
4066
+ /**
4067
+ * DI token for app-wide default labels. Provide either a static object or a
4068
+ * `Signal<TnTablePagerLabels>` — the latter lets the pager react to language
4069
+ * changes when the consumer wires it up to an i18n service.
4070
+ *
4071
+ * Explicit input bindings on `<tn-table-pager>` still win over these defaults.
4072
+ */
4073
+ declare const TN_TABLE_PAGER_LABELS: InjectionToken<TnTablePagerLabels | Signal<TnTablePagerLabels>>;
4074
+ /** Pagination state shared between `tn-table-pager` and an arbitrary data layer. */
4075
+ interface TnTablePagination {
4076
+ pageNumber: number | null;
4077
+ pageSize: number | null;
4078
+ }
4079
+ /**
4080
+ * Minimal contract a data layer must implement to be driven by `tn-table-pager`
4081
+ * via the `dataProvider` input. Designed to match the shape of NAS's
4082
+ * `ix-table` `DataProvider<T>` so existing wrappers can be removed — but the
4083
+ * library itself only depends on this slim interface, not on any consumer code.
4084
+ */
4085
+ interface TnTableDataProvider {
4086
+ /** Total number of rows the data layer is aware of, across all pages. */
4087
+ totalRows: number;
4088
+ /** The data layer's current pagination state. */
4089
+ pagination: TnTablePagination;
4090
+ /**
4091
+ * Emits whenever the data layer's state changes in a way the pager should
4092
+ * react to. The emitted value itself isn't read — it's purely a "something
4093
+ * changed, re-read me" notification.
4094
+ *
4095
+ * **Implementations must emit on**:
4096
+ * - page-number changes (the canonical case),
4097
+ * - page-size changes the data layer applies on its own, and
4098
+ * - **`totalRows` changes** (e.g. after a filter/refresh).
4099
+ *
4100
+ * The pager reads `totalRows` imperatively inside its sync handler, so a
4101
+ * provider that only emits on `pageNumber` won't surface row-count updates
4102
+ * to the displayed range.
4103
+ *
4104
+ * Any stream type (`Subject`, `BehaviorSubject`, `ReplaySubject`, …) works —
4105
+ * the pager guards against feedback loops by remembering the last pagination
4106
+ * it pushed and treating a matching emission as its own echo. Replay
4107
+ * semantics are therefore harmless but not required.
4108
+ */
4109
+ currentPage$: Observable<unknown>;
4110
+ /** Pushes new pagination to the data layer; typically triggers a data refresh. */
4111
+ setPagination(pagination: TnTablePagination): void;
4112
+ }
4113
+ /**
4114
+ * Pagination control for the `tn-table` (or any list view that paginates).
4115
+ *
4116
+ * Works in two modes:
4117
+ *
4118
+ * 1. **Dumb mode** — bind `[currentPage]`, `[pageSize]`, `[totalItems]` and listen
4119
+ * to `pageChange` / `pageSizeChange`. The component owns no provider state.
4120
+ * 2. **Data-provider mode** — bind `[dataProvider]` and the component drives
4121
+ * `setPagination()` on the provider, mirrors `totalRows`, and reacts to
4122
+ * `currentPage$` changes (with an internal guard against feedback loops).
4123
+ *
4124
+ * @example Dumb mode
4125
+ * ```html
4126
+ * <tn-table-pager
4127
+ * [(currentPage)]="page"
4128
+ * [(pageSize)]="size"
4129
+ * [totalItems]="total()"
4130
+ * (pageChange)="loadPage($event)" />
4131
+ * ```
4132
+ *
4133
+ * @example Data-provider mode (replaces the typical ix-table-pager wrapper)
4134
+ * ```html
4135
+ * <tn-table-pager
4136
+ * [dataProvider]="dataProvider()"
4137
+ * [pageSize]="dataProvider().pagination.pageSize ?? 50"
4138
+ * [currentPage]="dataProvider().pagination.pageNumber ?? 1"
4139
+ * [itemsPerPageLabel]="'Items per page' | translate" />
4140
+ * ```
4141
+ */
4142
+ declare class TnTablePagerComponent {
4143
+ private destroyRef;
4144
+ /**
4145
+ * Normalize the injected token into a Signal so consumers can supply either
4146
+ * a plain object or a reactive signal (e.g. derived from a TranslateService's
4147
+ * onLangChange) and the pager re-renders when labels change.
4148
+ */
4149
+ private readonly defaultLabels;
4150
+ /** 1-based index of the currently displayed page. */
4151
+ currentPage: _angular_core.ModelSignal<number>;
4152
+ /** Number of items per page. */
4153
+ pageSize: _angular_core.ModelSignal<number>;
4154
+ /** Selectable page-size values rendered in the dropdown. */
4155
+ pageSizeOptions: _angular_core.InputSignal<number[]>;
4156
+ /**
4157
+ * Total item count across all pages — drives `totalPages` and the range
4158
+ * labels. Ignored when `dataProvider` is set (the provider's `totalRows`
4159
+ * wins, so consumers don't have to keep both in sync).
4160
+ */
4161
+ totalItems: _angular_core.InputSignal<number>;
4162
+ /**
4163
+ * Optional data-provider integration. When supplied, the pager initializes
4164
+ * the provider's pagination on the first effect run, mirrors `totalRows`
4165
+ * into the displayed total, and listens to `currentPage$` to sync external
4166
+ * page changes. Page/size changes from user input are pushed back via
4167
+ * `setPagination()`.
4168
+ */
4169
+ dataProvider: _angular_core.InputSignal<TnTableDataProvider | undefined>;
4170
+ /**
4171
+ * Label inputs are nullable on purpose: the template reads the resolved
4172
+ * `*Label` computed signals below, which fall back to the DI-provided default
4173
+ * (a signal — so language changes propagate live). An explicit input binding
4174
+ * always wins.
4175
+ */
4176
+ itemsPerPageLabel: _angular_core.InputSignal<string | undefined>;
4177
+ ofLabel: _angular_core.InputSignal<string | undefined>;
4178
+ firstPageLabel: _angular_core.InputSignal<string | undefined>;
4179
+ previousPageLabel: _angular_core.InputSignal<string | undefined>;
4180
+ nextPageLabel: _angular_core.InputSignal<string | undefined>;
4181
+ lastPageLabel: _angular_core.InputSignal<string | undefined>;
4182
+ tablePaginationLabel: _angular_core.InputSignal<string | undefined>;
4183
+ /** Resolved labels: explicit input takes precedence over the DI default. */
4184
+ protected resolvedItemsPerPageLabel: Signal<string>;
4185
+ protected resolvedOfLabel: Signal<string>;
4186
+ protected resolvedFirstPageLabel: Signal<string>;
4187
+ protected resolvedPreviousPageLabel: Signal<string>;
4188
+ protected resolvedNextPageLabel: Signal<string>;
4189
+ protected resolvedLastPageLabel: Signal<string>;
4190
+ protected resolvedTablePaginationLabel: Signal<string>;
4191
+ /** Emits the new 1-based page number whenever the user navigates. */
4192
+ pageChange: _angular_core.OutputEmitterRef<number>;
4193
+ /** Emits the new page-size value when the dropdown changes. */
4194
+ pageSizeChange: _angular_core.OutputEmitterRef<number>;
4195
+ /**
4196
+ * Total items reported by the data provider (when one is bound). Falls back
4197
+ * to `totalItems` input otherwise — see `effectiveTotalItems`.
4198
+ */
4199
+ private providerTotalItems;
4200
+ /** The provider reference we're currently bound to (used to detect swaps). */
4201
+ private currentProvider;
4202
+ /** Subscription to the current provider's `currentPage$` — torn down on swap. */
4203
+ private providerSub;
4204
+ /**
4205
+ * Last pagination value we pushed to the provider. Used to recognize the
4206
+ * provider's resulting emission as our own echo and break the feedback loop
4207
+ * (setPagination → provider emits → syncFromProvider → setPagination …)
4208
+ * regardless of whether the provider emits synchronously or asynchronously,
4209
+ * and regardless of whether its stream replays on subscribe.
4210
+ */
4211
+ private lastPushedPagination;
4212
+ protected effectiveTotalItems: Signal<number>;
4213
+ protected totalPages: Signal<number>;
4214
+ protected firstItemOnPage: Signal<number>;
4215
+ protected lastItemOnPage: Signal<number>;
4216
+ protected isFirstPageDisabled: Signal<boolean>;
4217
+ protected isLastPageDisabled: Signal<boolean>;
4218
+ protected pageSizeSelectOptions: Signal<TnSelectOption<number>[]>;
4219
+ constructor();
4220
+ private syncFromProvider;
4221
+ /**
4222
+ * Public navigation API: jump to a specific 1-based page. Used both by the
4223
+ * template (first/last buttons) and by consumers who want to drive the pager
4224
+ * programmatically. Out-of-range values and no-op transitions are silently
4225
+ * ignored. Sibling helpers `previousPage` / `nextPage` are template-only and
4226
+ * therefore `protected` — `goToPage` is intentionally part of the public API.
4227
+ */
4228
+ goToPage(pageNumber: number): void;
4229
+ protected previousPage(): void;
4230
+ protected nextPage(): void;
4231
+ protected onPageSizeChange(value: number): void;
4232
+ /** Forwards the current page/size to the data provider, if one is bound. */
4233
+ private pushToProvider;
4234
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnTablePagerComponent, never>;
4235
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnTablePagerComponent, "tn-table-pager", never, { "currentPage": { "alias": "currentPage"; "required": false; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "pageSizeOptions": { "alias": "pageSizeOptions"; "required": false; "isSignal": true; }; "totalItems": { "alias": "totalItems"; "required": false; "isSignal": true; }; "dataProvider": { "alias": "dataProvider"; "required": false; "isSignal": true; }; "itemsPerPageLabel": { "alias": "itemsPerPageLabel"; "required": false; "isSignal": true; }; "ofLabel": { "alias": "ofLabel"; "required": false; "isSignal": true; }; "firstPageLabel": { "alias": "firstPageLabel"; "required": false; "isSignal": true; }; "previousPageLabel": { "alias": "previousPageLabel"; "required": false; "isSignal": true; }; "nextPageLabel": { "alias": "nextPageLabel"; "required": false; "isSignal": true; }; "lastPageLabel": { "alias": "lastPageLabel"; "required": false; "isSignal": true; }; "tablePaginationLabel": { "alias": "tablePaginationLabel"; "required": false; "isSignal": true; }; }, { "currentPage": "currentPageChange"; "pageSize": "pageSizeChange"; "pageChange": "pageChange"; "pageSizeChange": "pageSizeChange"; }, never, never, true, [{ directive: typeof TnTestIdDirective; inputs: { "tnTestId": "testId"; }; outputs: {}; }]>;
4236
+ }
4237
+
4238
+ /**
4239
+ * Harness for interacting with `tn-table-pager` in tests.
4240
+ *
4241
+ * @example
4242
+ * ```ts
4243
+ * const pager = await loader.getHarness(TnTablePagerHarness);
4244
+ * await pager.nextPage();
4245
+ * expect(await pager.getRangeText()).toBe('21 – 40 of 47');
4246
+ * ```
4247
+ */
4248
+ declare class TnTablePagerHarness extends ComponentHarness {
4249
+ static hostSelector: string;
4250
+ static with(options?: TnTablePagerHarnessFilters): HarnessPredicate<TnTablePagerHarness>;
4251
+ private firstButton;
4252
+ private previousButton;
4253
+ private nextButton;
4254
+ private lastButton;
4255
+ private pageSizeSelect;
4256
+ private rangeEl;
4257
+ /**
4258
+ * Returns the rendered range text (e.g. `"1 – 20 of 47"`).
4259
+ */
4260
+ getRangeText(): Promise<string>;
4261
+ /** Clicks the "first page" button. */
4262
+ goToFirstPage(): Promise<void>;
4263
+ /** Clicks the "previous page" button. */
4264
+ previousPage(): Promise<void>;
4265
+ /** Clicks the "next page" button. */
4266
+ nextPage(): Promise<void>;
4267
+ /** Clicks the "last page" button. */
4268
+ goToLastPage(): Promise<void>;
4269
+ isFirstButtonDisabled(): Promise<boolean>;
4270
+ isPreviousButtonDisabled(): Promise<boolean>;
4271
+ isNextButtonDisabled(): Promise<boolean>;
4272
+ isLastButtonDisabled(): Promise<boolean>;
4273
+ /** Returns the harness for the underlying page-size `tn-select`. */
4274
+ getPageSizeSelect(): Promise<TnSelectHarness>;
4275
+ }
4276
+ interface TnTablePagerHarnessFilters extends BaseHarnessFilters {
4277
+ }
4278
+
3837
4279
  /** Flat node with expandable and level information */
3838
4280
  interface TnFlatTreeNode<T = unknown> {
3839
4281
  data: T;
@@ -5660,14 +6102,20 @@ declare class TnEmptyComponent {
5660
6102
  description: _angular_core.InputSignal<string | undefined>;
5661
6103
  icon: _angular_core.InputSignal<string | undefined>;
5662
6104
  iconLibrary: _angular_core.InputSignal<IconLibraryType>;
6105
+ /**
6106
+ * Overrides the icon size derived from `size`. Accepts any valid CSS size value
6107
+ * (e.g. `'48px'`, `'3rem'`). Use this when the variant presets are too small for an
6108
+ * empty-state illustration. When unset, the icon falls back to the `size`-based preset.
6109
+ */
6110
+ iconSize: _angular_core.InputSignal<string | undefined>;
5663
6111
  actionText: _angular_core.InputSignal<string | undefined>;
5664
6112
  bordered: _angular_core.InputSignal<boolean>;
5665
6113
  size: _angular_core.InputSignal<TnEmptySize>;
5666
6114
  onAction: _angular_core.OutputEmitterRef<void>;
5667
6115
  protected hasAction: _angular_core.Signal<boolean>;
5668
- iconSize: _angular_core.Signal<"lg" | "xl">;
6116
+ protected iconSizePreset: _angular_core.Signal<"lg" | "xl">;
5669
6117
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnEmptyComponent, never>;
5670
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnEmptyComponent, "tn-empty", never, { "title": { "alias": "title"; "required": true; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "iconLibrary": { "alias": "iconLibrary"; "required": false; "isSignal": true; }; "actionText": { "alias": "actionText"; "required": false; "isSignal": true; }; "bordered": { "alias": "bordered"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, { "onAction": "onAction"; }, never, never, true, never>;
6118
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnEmptyComponent, "tn-empty", never, { "title": { "alias": "title"; "required": true; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "iconLibrary": { "alias": "iconLibrary"; "required": false; "isSignal": true; }; "iconSize": { "alias": "iconSize"; "required": false; "isSignal": true; }; "actionText": { "alias": "actionText"; "required": false; "isSignal": true; }; "bordered": { "alias": "bordered"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, { "onAction": "onAction"; }, never, never, true, never>;
5671
6119
  }
5672
6120
 
5673
6121
  /**
@@ -6228,5 +6676,5 @@ declare const TN_THEME_DEFINITIONS: readonly TnThemeDefinition[];
6228
6676
  */
6229
6677
  declare const THEME_MAP: Map<TnTheme, TnThemeDefinition>;
6230
6678
 
6231
- export { CommonShortcuts, DEFAULT_THEME, DiskIconComponent, DiskType, FileSizePipe, InputType, LIGHT_THEME, LinuxModifierKeys, LinuxShortcuts, ModifierKeys, QuickShortcuts, ShortcutBuilder, StripMntPrefixPipe, THEME_MAP, THEME_STORAGE_KEY, 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, 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, TnTabsComponent, TnTabsHarness, TnTestIdDirective, TnTheme, TnThemeService, TnTimeInputComponent, TnToastComponent, TnToastMock, TnToastPosition, TnToastRef, TnToastService, TnToastTesting, TnToastType, TnTooltipComponent, TnTooltipDirective, TnTreeComponent, TnTreeFlatDataSource, TnTreeFlattener, TnTreeNodeComponent, TnTreeNodeOutletDirective, TruncatePathPipe, WindowsModifierKeys, WindowsShortcuts, createLucideLibrary, createShortcut, defaultSpriteBasePath, defaultSpriteConfigPath, libIconMarker, registerLucideIcons, setupLucideIntegration, tnIconMarker };
6232
- 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, LabelType, LucideIconOptions, MenuHarnessFilters, MockIconRegistry, MockSpriteLoader, PathSegment, PlatformType, ProgressBarMode, RadioHarnessFilters, ResolvedIcon, SelectHarnessFilters, ShortcutHandler, SidePanelHarnessFilters, SlideToggleColor, SlideToggleHarnessFilters, SpinnerMode, SpriteConfig, SubscriptSizing, TabChangeEvent, TabHarnessFilters, TabPanelHarnessFilters, TabsHarnessFilters, TnBannerType, TnButtonToggleType, TnCardAction, TnCardControl, TnCardFooterLink, TnCardHeaderStatus, TnConfirmDialogData, TnDialogDefaults, TnDialogOpenTarget, TnDrawerMode, TnDrawerPosition, TnEmptySize, TnFlatTreeNode, TnMenuItem, TnSelectOption, TnSelectOptionGroup, TnSelectionChange, TnSortEvent, TnTableDataSource, TnTableHarnessFilters, TnTestAttrName, TnThemeDefinition, TnToastCall, TnToastConfig, TooltipPosition, YearCell };
6679
+ export { CommonShortcuts, DEFAULT_THEME, DiskIconComponent, DiskType, FileSizePipe, InputType, LIGHT_THEME, LinuxModifierKeys, LinuxShortcuts, ModifierKeys, QuickShortcuts, ShortcutBuilder, StripMntPrefixPipe, THEME_MAP, THEME_STORAGE_KEY, 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, createLucideLibrary, createShortcut, defaultSpriteBasePath, defaultSpriteConfigPath, libIconMarker, registerLucideIcons, setupLucideIntegration, tnIconMarker };
6680
+ 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, LabelType, LucideIconOptions, MenuHarnessFilters, MockIconRegistry, MockSpriteLoader, PathSegment, PlatformType, ProgressBarMode, RadioHarnessFilters, ResolvedIcon, SelectHarnessFilters, ShortcutHandler, SidePanelHarnessFilters, SlideToggleColor, SlideToggleHarnessFilters, SpinnerMode, SpriteConfig, SubscriptSizing, TabChangeEvent, TabHarnessFilters, TabPanelHarnessFilters, TabsHarnessFilters, TnBannerType, TnButtonToggleType, TnCardAction, TnCardControl, TnCardFooterLink, TnCardHeaderStatus, TnConfirmDialogData, TnDialogDefaults, TnDialogOpenTarget, TnDrawerMode, TnDrawerPosition, TnEmptySize, TnFlatTreeNode, TnMenuItem, TnSelectOption, TnSelectOptionGroup, TnSelectionChange, TnSortEvent, TnTableDataProvider, TnTableDataSource, TnTableHarnessFilters, TnTablePagerHarnessFilters, TnTablePagerLabels, TnTablePagination, TnTestAttrName, TnThemeDefinition, TnToastCall, TnToastConfig, TooltipPosition, YearCell };