@truenas/ui-components 0.1.56 → 0.1.58

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.
@@ -1,5 +1,5 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { ElementRef, OnDestroy, AfterViewInit, AfterContentInit, TemplateRef, Provider, ChangeDetectorRef, OnInit, PipeTransform, ViewContainerRef, AfterViewChecked, ComponentRef } from '@angular/core';
2
+ import { ElementRef, OnDestroy, AfterViewInit, AfterContentInit, TemplateRef, Provider, ChangeDetectorRef, OnInit, PipeTransform, ViewContainerRef, AfterViewChecked, ComponentRef, InjectionToken } 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';
@@ -270,6 +270,11 @@ declare class TnDrawerComponent implements OnDestroy {
270
270
  position: _angular_core.InputSignal<TnDrawerPosition>;
271
271
  /** Accessible label for the drawer panel */
272
272
  ariaLabel: _angular_core.InputSignal<string | undefined>;
273
+ /**
274
+ * Test-id applied to the drawer panel. Rendered under whichever attribute name is
275
+ * configured via `TN_TEST_ATTR` (default `data-testid`).
276
+ */
277
+ testId: _angular_core.InputSignal<string | undefined>;
273
278
  /** Fires after the open transition completes */
274
279
  openedComplete: _angular_core.OutputEmitterRef<void>;
275
280
  /** Fires after the close transition completes */
@@ -308,7 +313,7 @@ declare class TnDrawerComponent implements OnDestroy {
308
313
  protected onTransitionEnd(event: TransitionEvent): void;
309
314
  private restoreFocus;
310
315
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnDrawerComponent, never>;
311
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnDrawerComponent, "tn-drawer", never, { "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "opened": { "alias": "opened"; "required": false; "isSignal": true; }; "disableClose": { "alias": "disableClose"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "opened": "openedChange"; "openedComplete": "openedComplete"; "closed": "closed"; }, never, ["*"], true, never>;
316
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnDrawerComponent, "tn-drawer", never, { "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "opened": { "alias": "opened"; "required": false; "isSignal": true; }; "disableClose": { "alias": "disableClose"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "testId": { "alias": "testId"; "required": false; "isSignal": true; }; }, { "opened": "openedChange"; "openedComplete": "openedComplete"; "closed": "closed"; }, never, ["*"], true, never>;
312
317
  }
313
318
 
314
319
  declare class TnDrawerContainerComponent {
@@ -527,10 +532,37 @@ declare class TnButtonComponent {
527
532
  backgroundColor: _angular_core.InputSignal<string | undefined>;
528
533
  label: _angular_core.InputSignal<string>;
529
534
  disabled: _angular_core.InputSignal<boolean>;
535
+ /**
536
+ * Test-id applied to the rendered element. Rendered under whichever attribute
537
+ * name is configured via `TN_TEST_ATTR` (default `data-testid`).
538
+ */
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>;
530
559
  onClick: _angular_core.OutputEmitterRef<MouseEvent>;
560
+ isAnchor: _angular_core.Signal<boolean>;
561
+ isRouterLink: _angular_core.Signal<boolean>;
531
562
  classes: _angular_core.Signal<string[]>;
563
+ handleAnchorClick(event: MouseEvent): void;
532
564
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnButtonComponent, never>;
533
- 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; }; }, { "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>;
534
566
  }
535
567
 
536
568
  /**
@@ -599,6 +631,18 @@ declare class TnButtonHarness extends ComponentHarness {
599
631
  * ```
600
632
  */
601
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>;
602
646
  /**
603
647
  * Clicks the button.
604
648
  *
@@ -673,6 +717,11 @@ declare class TnIconComponent {
673
717
  declare class TnIconButtonComponent {
674
718
  disabled: _angular_core.InputSignal<boolean>;
675
719
  ariaLabel: _angular_core.InputSignal<string | undefined>;
720
+ /**
721
+ * Test-id applied to the rendered `<button>` element. Rendered under whichever attribute
722
+ * name is configured via `TN_TEST_ATTR` (default `data-testid`).
723
+ */
724
+ testId: _angular_core.InputSignal<string | undefined>;
676
725
  name: _angular_core.InputSignal<string>;
677
726
  size: _angular_core.InputSignal<IconSize>;
678
727
  color: _angular_core.InputSignal<string | undefined>;
@@ -682,7 +731,7 @@ declare class TnIconButtonComponent {
682
731
  classes: _angular_core.Signal<string[]>;
683
732
  effectiveAriaLabel: _angular_core.Signal<string>;
684
733
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnIconButtonComponent, never>;
685
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnIconButtonComponent, "tn-icon-button", never, { "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "tooltip": { "alias": "tooltip"; "required": false; "isSignal": true; }; "library": { "alias": "library"; "required": false; "isSignal": true; }; }, { "onClick": "onClick"; }, never, never, true, never>;
734
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnIconButtonComponent, "tn-icon-button", never, { "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "testId": { "alias": "testId"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "tooltip": { "alias": "tooltip"; "required": false; "isSignal": true; }; "library": { "alias": "library"; "required": false; "isSignal": true; }; }, { "onClick": "onClick"; }, never, never, true, never>;
686
735
  }
687
736
 
688
737
  /**
@@ -1213,20 +1262,40 @@ interface TnCardAction {
1213
1262
  handler: () => void;
1214
1263
  disabled?: boolean;
1215
1264
  icon?: string;
1265
+ /**
1266
+ * Test-id applied to the rendered action button. Rendered under whichever attribute name
1267
+ * is configured via `TN_TEST_ATTR` (default `data-testid`).
1268
+ */
1269
+ testId?: string;
1216
1270
  }
1217
1271
  interface TnCardControl {
1218
1272
  label: string;
1219
1273
  checked: boolean;
1220
1274
  handler: (checked: boolean) => void;
1221
1275
  disabled?: boolean;
1276
+ /**
1277
+ * Test-id applied to the rendered slide-toggle. Rendered under whichever attribute name
1278
+ * is configured via `TN_TEST_ATTR` (default `data-testid`).
1279
+ */
1280
+ testId?: string;
1222
1281
  }
1223
1282
  interface TnCardHeaderStatus {
1224
1283
  label: string;
1225
1284
  type?: 'success' | 'warning' | 'error' | 'info' | 'neutral';
1285
+ /**
1286
+ * Test-id applied to the rendered status pill `<div>`. Rendered under whichever attribute name
1287
+ * is configured via `TN_TEST_ATTR` (default `data-testid`).
1288
+ */
1289
+ testId?: string;
1226
1290
  }
1227
1291
  interface TnCardFooterLink {
1228
1292
  label: string;
1229
1293
  handler: () => void;
1294
+ /**
1295
+ * Test-id applied to the rendered footer link button. Rendered under whichever attribute name
1296
+ * is configured via `TN_TEST_ATTR` (default `data-testid`).
1297
+ */
1298
+ testId?: string;
1230
1299
  }
1231
1300
 
1232
1301
  /**
@@ -1259,6 +1328,12 @@ interface TnMenuItem {
1259
1328
  action?: () => void;
1260
1329
  children?: TnMenuItem[];
1261
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;
1262
1337
  }
1263
1338
  declare class TnMenuComponent {
1264
1339
  items: _angular_core.InputSignal<TnMenuItem[]>;
@@ -1272,6 +1347,8 @@ declare class TnMenuComponent {
1272
1347
  private overlay;
1273
1348
  private viewContainerRef;
1274
1349
  onMenuItemClick(item: TnMenuItem): void;
1350
+ private contentItems;
1351
+ constructor();
1275
1352
  hasChildren: _angular_core.Signal<(item: TnMenuItem) => boolean>;
1276
1353
  onMenuOpen(): void;
1277
1354
  onMenuClose(): void;
@@ -1284,7 +1361,7 @@ declare class TnMenuComponent {
1284
1361
  onContextMenu(event: MouseEvent): void;
1285
1362
  trackByItemId(index: number, item: TnMenuItem): string;
1286
1363
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnMenuComponent, never>;
1287
- 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>;
1288
1365
  }
1289
1366
 
1290
1367
  declare class TnCardComponent {
@@ -1301,6 +1378,12 @@ declare class TnCardComponent {
1301
1378
  headerStatus: _angular_core.InputSignal<TnCardHeaderStatus | undefined>;
1302
1379
  headerControl: _angular_core.InputSignal<TnCardControl | undefined>;
1303
1380
  headerMenu: _angular_core.InputSignal<TnMenuItem[] | undefined>;
1381
+ /**
1382
+ * Test-id applied to the kebab-menu trigger button rendered when `headerMenu` is set.
1383
+ * Rendered under whichever attribute name is configured via `TN_TEST_ATTR`
1384
+ * (default `data-testid`).
1385
+ */
1386
+ headerMenuTriggerTestId: _angular_core.InputSignal<string | undefined>;
1304
1387
  primaryAction: _angular_core.InputSignal<TnCardAction | undefined>;
1305
1388
  secondaryAction: _angular_core.InputSignal<TnCardAction | undefined>;
1306
1389
  footerLink: _angular_core.InputSignal<TnCardFooterLink | undefined>;
@@ -1317,7 +1400,7 @@ declare class TnCardComponent {
1317
1400
  onHeaderMenuItemClick(_item: TnMenuItem): void;
1318
1401
  getStatusClass(type?: string): string;
1319
1402
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnCardComponent, never>;
1320
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnCardComponent, "tn-card", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "titleLink": { "alias": "titleLink"; "required": false; "isSignal": true; }; "elevation": { "alias": "elevation"; "required": false; "isSignal": true; }; "padding": { "alias": "padding"; "required": false; "isSignal": true; }; "padContent": { "alias": "padContent"; "required": false; "isSignal": true; }; "bordered": { "alias": "bordered"; "required": false; "isSignal": true; }; "background": { "alias": "background"; "required": false; "isSignal": true; }; "headerStatus": { "alias": "headerStatus"; "required": false; "isSignal": true; }; "headerControl": { "alias": "headerControl"; "required": false; "isSignal": true; }; "headerMenu": { "alias": "headerMenu"; "required": false; "isSignal": true; }; "primaryAction": { "alias": "primaryAction"; "required": false; "isSignal": true; }; "secondaryAction": { "alias": "secondaryAction"; "required": false; "isSignal": true; }; "footerLink": { "alias": "footerLink"; "required": false; "isSignal": true; }; }, {}, ["projectedHeader"], ["[tnCardHeader]", "*"], true, never>;
1403
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnCardComponent, "tn-card", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "titleLink": { "alias": "titleLink"; "required": false; "isSignal": true; }; "elevation": { "alias": "elevation"; "required": false; "isSignal": true; }; "padding": { "alias": "padding"; "required": false; "isSignal": true; }; "padContent": { "alias": "padContent"; "required": false; "isSignal": true; }; "bordered": { "alias": "bordered"; "required": false; "isSignal": true; }; "background": { "alias": "background"; "required": false; "isSignal": true; }; "headerStatus": { "alias": "headerStatus"; "required": false; "isSignal": true; }; "headerControl": { "alias": "headerControl"; "required": false; "isSignal": true; }; "headerMenu": { "alias": "headerMenu"; "required": false; "isSignal": true; }; "headerMenuTriggerTestId": { "alias": "headerMenuTriggerTestId"; "required": false; "isSignal": true; }; "primaryAction": { "alias": "primaryAction"; "required": false; "isSignal": true; }; "secondaryAction": { "alias": "secondaryAction"; "required": false; "isSignal": true; }; "footerLink": { "alias": "footerLink"; "required": false; "isSignal": true; }; }, {}, ["projectedHeader"], ["[tnCardHeader]", "*"], true, never>;
1321
1404
  }
1322
1405
 
1323
1406
  declare class TnExpansionPanelComponent {
@@ -1329,6 +1412,15 @@ declare class TnExpansionPanelComponent {
1329
1412
  expanded: _angular_core.InputSignal<boolean>;
1330
1413
  disabled: _angular_core.InputSignal<boolean>;
1331
1414
  titleStyle: _angular_core.InputSignal<"body" | "header" | "link">;
1415
+ /**
1416
+ * Test-id applied to the panel's root element. Rendered under whichever attribute name
1417
+ * is configured via `TN_TEST_ATTR` (default `data-testid`).
1418
+ */
1419
+ testId: _angular_core.InputSignal<string | undefined>;
1420
+ /**
1421
+ * Test-id applied to the expand/collapse toggle header button.
1422
+ */
1423
+ toggleTestId: _angular_core.InputSignal<string | undefined>;
1332
1424
  expandedChange: _angular_core.OutputEmitterRef<boolean>;
1333
1425
  toggleEvent: _angular_core.OutputEmitterRef<void>;
1334
1426
  private internalExpanded;
@@ -1337,7 +1429,7 @@ declare class TnExpansionPanelComponent {
1337
1429
  toggle(): void;
1338
1430
  classes: _angular_core.Signal<string[]>;
1339
1431
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnExpansionPanelComponent, never>;
1340
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnExpansionPanelComponent, "tn-expansion-panel", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "elevation": { "alias": "elevation"; "required": false; "isSignal": true; }; "padding": { "alias": "padding"; "required": false; "isSignal": true; }; "bordered": { "alias": "bordered"; "required": false; "isSignal": true; }; "background": { "alias": "background"; "required": false; "isSignal": true; }; "expanded": { "alias": "expanded"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "titleStyle": { "alias": "titleStyle"; "required": false; "isSignal": true; }; }, { "expandedChange": "expandedChange"; "toggleEvent": "toggleEvent"; }, never, ["[slot=title]", "*"], true, never>;
1432
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnExpansionPanelComponent, "tn-expansion-panel", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "elevation": { "alias": "elevation"; "required": false; "isSignal": true; }; "padding": { "alias": "padding"; "required": false; "isSignal": true; }; "bordered": { "alias": "bordered"; "required": false; "isSignal": true; }; "background": { "alias": "background"; "required": false; "isSignal": true; }; "expanded": { "alias": "expanded"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "titleStyle": { "alias": "titleStyle"; "required": false; "isSignal": true; }; "testId": { "alias": "testId"; "required": false; "isSignal": true; }; "toggleTestId": { "alias": "toggleTestId"; "required": false; "isSignal": true; }; }, { "expandedChange": "expandedChange"; "toggleEvent": "toggleEvent"; }, never, ["[slot=title]", "*"], true, never>;
1341
1433
  }
1342
1434
 
1343
1435
  /**
@@ -1992,6 +2084,11 @@ declare class TnTabsComponent implements AfterContentInit, AfterViewInit, OnDest
1992
2084
  selectedIndex: _angular_core.InputSignal<number>;
1993
2085
  orientation: _angular_core.InputSignal<"horizontal" | "vertical">;
1994
2086
  highlightPosition: _angular_core.InputSignal<"top" | "bottom" | "left" | "right">;
2087
+ /**
2088
+ * Test-id applied to the tablist root element. Rendered under whichever attribute name
2089
+ * is configured via `TN_TEST_ATTR` (default `data-testid`).
2090
+ */
2091
+ testId: _angular_core.InputSignal<string | undefined>;
1995
2092
  selectedIndexChange: _angular_core.OutputEmitterRef<number>;
1996
2093
  tabChange: _angular_core.OutputEmitterRef<TabChangeEvent>;
1997
2094
  private internalSelectedIndex;
@@ -2017,7 +2114,7 @@ declare class TnTabsComponent implements AfterContentInit, AfterViewInit, OnDest
2017
2114
  private focusTab;
2018
2115
  classes: _angular_core.Signal<string>;
2019
2116
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnTabsComponent, never>;
2020
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnTabsComponent, "tn-tabs", never, { "selectedIndex": { "alias": "selectedIndex"; "required": false; "isSignal": true; }; "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "highlightPosition": { "alias": "highlightPosition"; "required": false; "isSignal": true; }; }, { "selectedIndexChange": "selectedIndexChange"; "tabChange": "tabChange"; }, ["tabs", "panels"], ["tn-tab", "tn-tab-panel"], true, never>;
2117
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnTabsComponent, "tn-tabs", never, { "selectedIndex": { "alias": "selectedIndex"; "required": false; "isSignal": true; }; "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "highlightPosition": { "alias": "highlightPosition"; "required": false; "isSignal": true; }; "testId": { "alias": "testId"; "required": false; "isSignal": true; }; }, { "selectedIndexChange": "selectedIndexChange"; "tabChange": "tabChange"; }, ["tabs", "panels"], ["tn-tab", "tn-tab-panel"], true, never>;
2021
2118
  }
2022
2119
 
2023
2120
  /**
@@ -2378,6 +2475,55 @@ interface TabsHarnessFilters extends BaseHarnessFilters {
2378
2475
  hasTab?: string | RegExp;
2379
2476
  }
2380
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
+
2381
2527
  /**
2382
2528
  * Directive that attaches a menu to any element.
2383
2529
  * Usage: <button [tnMenuTriggerFor]="menu">Open Menu</button>
@@ -2500,6 +2646,24 @@ declare class TnMenuHarness extends ComponentHarness {
2500
2646
  * Gets the number of menu items (excluding separators).
2501
2647
  */
2502
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>;
2503
2667
  }
2504
2668
  /**
2505
2669
  * A set of criteria that can be used to filter `TnMenuHarness` instances.
@@ -3494,6 +3658,32 @@ declare class TnListOptionComponent implements AfterContentInit {
3494
3658
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnListOptionComponent, "tn-list-option", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; }, { "selectionChange": "selectionChange"; }, never, ["[tnListIcon], [tnListAvatar]", "[tnListItemTitle], [tnListItemPrimary]", "*", "[tnListItemLine], [tnListItemSecondary]"], true, never>;
3495
3659
  }
3496
3660
 
3661
+ /**
3662
+ * Primitive directive that writes a raw `testId` value to whichever attribute name has been
3663
+ * configured via {@link TN_TEST_ATTR} (default `data-testid`).
3664
+ *
3665
+ * Library components should use this directive instead of hard-coding `[attr.data-testid]` so
3666
+ * the attribute name remains centrally controlled and consumers with different conventions
3667
+ * (e.g. `data-test`) can opt in with a single root-level provider.
3668
+ *
3669
+ * @example
3670
+ * ```html
3671
+ * <button [tnTestId]="myTestId()">Click me</button>
3672
+ * ```
3673
+ *
3674
+ * Passing `null` / `undefined` / `''` removes the attribute entirely (avoids `data-testid=""`).
3675
+ */
3676
+ declare class TnTestIdDirective {
3677
+ private readonly renderer;
3678
+ private readonly host;
3679
+ private readonly attrName;
3680
+ /** The raw test-id value to apply. Falsy values remove the attribute. */
3681
+ readonly testId: _angular_core.InputSignal<string | null | undefined>;
3682
+ constructor();
3683
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnTestIdDirective, never>;
3684
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<TnTestIdDirective, "[tnTestId]", never, { "testId": { "alias": "tnTestId"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
3685
+ }
3686
+
3497
3687
  interface TnSelectionChange {
3498
3688
  source: TnSelectionListComponent;
3499
3689
  options: TnListOptionComponent[];
@@ -3517,7 +3707,7 @@ declare class TnSelectionListComponent implements ControlValueAccessor {
3517
3707
  onOptionSelectionChange(): void;
3518
3708
  get selectedOptions(): TnListOptionComponent[];
3519
3709
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnSelectionListComponent, never>;
3520
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnSelectionListComponent, "tn-selection-list", never, { "dense": { "alias": "dense"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; }, { "selectionChange": "selectionChange"; }, ["options"], ["*"], true, never>;
3710
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnSelectionListComponent, "tn-selection-list", never, { "dense": { "alias": "dense"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; }, { "selectionChange": "selectionChange"; }, ["options"], ["*"], true, [{ directive: typeof TnTestIdDirective; inputs: { "tnTestId": "testId"; }; outputs: {}; }]>;
3521
3711
  }
3522
3712
 
3523
3713
  declare class TnHeaderCellDefDirective {
@@ -3614,7 +3804,7 @@ declare class TnTableComponent<T = unknown> implements OnInit {
3614
3804
  getColumnDef(columnName: string): TnTableColumnDirective | undefined;
3615
3805
  getCellValue(row: T, column: string): unknown;
3616
3806
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnTableComponent<any>, never>;
3617
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnTableComponent<any>, "tn-table", never, { "dataSource": { "alias": "dataSource"; "required": false; "isSignal": true; }; "displayedColumns": { "alias": "displayedColumns"; "required": false; "isSignal": true; }; "trackBy": { "alias": "trackBy"; "required": false; "isSignal": true; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; "isSignal": true; }; "emptyIcon": { "alias": "emptyIcon"; "required": false; "isSignal": true; }; "selectable": { "alias": "selectable"; "required": false; "isSignal": true; }; "expandable": { "alias": "expandable"; "required": false; "isSignal": true; }; "bordered": { "alias": "bordered"; "required": false; "isSignal": true; }; }, { "sortChange": "sortChange"; "selectionChange": "selectionChange"; }, ["columnDefs", "detailRowDef"], never, true, never>;
3807
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnTableComponent<any>, "tn-table", never, { "dataSource": { "alias": "dataSource"; "required": false; "isSignal": true; }; "displayedColumns": { "alias": "displayedColumns"; "required": false; "isSignal": true; }; "trackBy": { "alias": "trackBy"; "required": false; "isSignal": true; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; "isSignal": true; }; "emptyIcon": { "alias": "emptyIcon"; "required": false; "isSignal": true; }; "selectable": { "alias": "selectable"; "required": false; "isSignal": true; }; "expandable": { "alias": "expandable"; "required": false; "isSignal": true; }; "bordered": { "alias": "bordered"; "required": false; "isSignal": true; }; }, { "sortChange": "sortChange"; "selectionChange": "selectionChange"; }, ["columnDefs", "detailRowDef"], never, true, [{ directive: typeof TnTestIdDirective; inputs: { "tnTestId": "testId"; }; outputs: {}; }]>;
3618
3808
  }
3619
3809
 
3620
3810
  /**
@@ -3790,7 +3980,7 @@ declare class TnTreeFlatDataSource<T, F> extends DataSource<F> {
3790
3980
  declare class TnTreeComponent<T, K = T> extends CdkTree<T, K> {
3791
3981
  constructor();
3792
3982
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnTreeComponent<any, any>, never>;
3793
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnTreeComponent<any, any>, "tn-tree", ["tnTree"], {}, {}, never, never, true, never>;
3983
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnTreeComponent<any, any>, "tn-tree", ["tnTree"], {}, {}, never, never, true, [{ directive: typeof TnTestIdDirective; inputs: { "tnTestId": "testId"; }; outputs: {}; }]>;
3794
3984
  }
3795
3985
 
3796
3986
  declare class TnTreeNodeComponent<T, K = T> extends CdkTreeNode<T, K> {
@@ -3802,7 +3992,7 @@ declare class TnTreeNodeComponent<T, K = T> extends CdkTreeNode<T, K> {
3802
3992
  /** Whether the tree node is expanded */
3803
3993
  get isExpanded(): boolean;
3804
3994
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnTreeNodeComponent<any, any>, never>;
3805
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnTreeNodeComponent<any, any>, "tn-tree-node", ["tnTreeNode"], {}, {}, never, ["*"], true, never>;
3995
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnTreeNodeComponent<any, any>, "tn-tree-node", ["tnTreeNode"], {}, {}, never, ["*"], true, [{ directive: typeof TnTestIdDirective; inputs: { "tnTestId": "testId"; }; outputs: {}; }]>;
3806
3996
  }
3807
3997
 
3808
3998
  declare class TnNestedTreeNodeComponent<T, K = T> extends CdkNestedTreeNode<T, K> {
@@ -4172,6 +4362,11 @@ interface DateRange {
4172
4362
  declare class TnDateRangeInputComponent implements ControlValueAccessor, OnInit, OnDestroy {
4173
4363
  disabled: _angular_core.InputSignal<boolean>;
4174
4364
  placeholder: _angular_core.InputSignal<string>;
4365
+ /**
4366
+ * Test-id applied to the date-range-input container. Rendered under whichever attribute name
4367
+ * is configured via `TN_TEST_ATTR` (default `data-testid`).
4368
+ */
4369
+ testId: _angular_core.InputSignal<string | undefined>;
4175
4370
  private formDisabled;
4176
4371
  isDisabled: _angular_core.Signal<boolean>;
4177
4372
  startMonthRef: _angular_core.Signal<ElementRef<HTMLInputElement>>;
@@ -4220,7 +4415,7 @@ declare class TnDateRangeInputComponent implements ControlValueAccessor, OnInit,
4220
4415
  close(): void;
4221
4416
  private createOverlay;
4222
4417
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnDateRangeInputComponent, never>;
4223
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnDateRangeInputComponent, "tn-date-range-input", never, { "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
4418
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnDateRangeInputComponent, "tn-date-range-input", never, { "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "testId": { "alias": "testId"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
4224
4419
  }
4225
4420
 
4226
4421
  declare class TnCalendarComponent implements OnInit {
@@ -4260,7 +4455,7 @@ declare class TnCalendarComponent implements OnInit {
4260
4455
  */
4261
4456
  resetInteractionState(): void;
4262
4457
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnCalendarComponent, never>;
4263
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnCalendarComponent, "tn-calendar", never, { "startView": { "alias": "startView"; "required": false; "isSignal": true; }; "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "minDate": { "alias": "minDate"; "required": false; "isSignal": true; }; "maxDate": { "alias": "maxDate"; "required": false; "isSignal": true; }; "dateFilter": { "alias": "dateFilter"; "required": false; "isSignal": true; }; "rangeMode": { "alias": "rangeMode"; "required": false; "isSignal": true; }; "selectedRange": { "alias": "selectedRange"; "required": false; "isSignal": true; }; }, { "selectedChange": "selectedChange"; "activeDateChange": "activeDateChange"; "viewChanged": "viewChanged"; "selectedRangeChange": "selectedRangeChange"; }, never, never, true, never>;
4458
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnCalendarComponent, "tn-calendar", never, { "startView": { "alias": "startView"; "required": false; "isSignal": true; }; "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "minDate": { "alias": "minDate"; "required": false; "isSignal": true; }; "maxDate": { "alias": "maxDate"; "required": false; "isSignal": true; }; "dateFilter": { "alias": "dateFilter"; "required": false; "isSignal": true; }; "rangeMode": { "alias": "rangeMode"; "required": false; "isSignal": true; }; "selectedRange": { "alias": "selectedRange"; "required": false; "isSignal": true; }; }, { "selectedChange": "selectedChange"; "activeDateChange": "activeDateChange"; "viewChanged": "viewChanged"; "selectedRangeChange": "selectedRangeChange"; }, never, never, true, [{ directive: typeof TnTestIdDirective; inputs: { "tnTestId": "testId"; }; outputs: {}; }]>;
4264
4459
  }
4265
4460
 
4266
4461
  declare class TnCalendarHeaderComponent {
@@ -4372,6 +4567,11 @@ declare class TnDateInputComponent implements ControlValueAccessor, OnInit, OnDe
4372
4567
  min: _angular_core.InputSignal<Date | undefined>;
4373
4568
  max: _angular_core.InputSignal<Date | undefined>;
4374
4569
  dateFilter: _angular_core.InputSignal<((date: Date) => boolean) | undefined>;
4570
+ /**
4571
+ * Test-id applied to the date-input container. Rendered under whichever attribute name
4572
+ * is configured via `TN_TEST_ATTR` (default `data-testid`).
4573
+ */
4574
+ testId: _angular_core.InputSignal<string | undefined>;
4375
4575
  private formDisabled;
4376
4576
  isDisabled: _angular_core.Signal<boolean>;
4377
4577
  monthRef: _angular_core.Signal<ElementRef<HTMLInputElement>>;
@@ -4409,7 +4609,7 @@ declare class TnDateInputComponent implements ControlValueAccessor, OnInit, OnDe
4409
4609
  close(): void;
4410
4610
  private createOverlay;
4411
4611
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnDateInputComponent, never>;
4412
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnDateInputComponent, "tn-date-input", never, { "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "dateFilter": { "alias": "dateFilter"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
4612
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnDateInputComponent, "tn-date-input", never, { "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "dateFilter": { "alias": "dateFilter"; "required": false; "isSignal": true; }; "testId": { "alias": "testId"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
4413
4613
  }
4414
4614
 
4415
4615
  /**
@@ -4674,6 +4874,11 @@ declare class TnSliderComponent implements ControlValueAccessor, OnDestroy, Afte
4674
4874
  labelPrefix: _angular_core.InputSignal<string>;
4675
4875
  labelSuffix: _angular_core.InputSignal<string>;
4676
4876
  labelType: _angular_core.InputSignal<LabelType>;
4877
+ /**
4878
+ * Test-id applied to the slider's root container. Rendered under whichever attribute name
4879
+ * is configured via `TN_TEST_ATTR` (default `data-testid`).
4880
+ */
4881
+ testId: _angular_core.InputSignal<string | undefined>;
4677
4882
  thumbDirective: _angular_core.Signal<TnSliderThumbDirective>;
4678
4883
  sliderContainer: _angular_core.Signal<ElementRef<HTMLDivElement>>;
4679
4884
  thumbVisual: _angular_core.Signal<ElementRef<HTMLDivElement>>;
@@ -4709,7 +4914,7 @@ declare class TnSliderComponent implements ControlValueAccessor, OnDestroy, Afte
4709
4914
  private onInteractionStart;
4710
4915
  private onInteractionEnd;
4711
4916
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnSliderComponent, never>;
4712
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnSliderComponent, "tn-slider", never, { "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "labelPrefix": { "alias": "labelPrefix"; "required": false; "isSignal": true; }; "labelSuffix": { "alias": "labelSuffix"; "required": false; "isSignal": true; }; "labelType": { "alias": "labelType"; "required": false; "isSignal": true; }; }, {}, ["thumbDirective"], ["*"], true, never>;
4917
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnSliderComponent, "tn-slider", never, { "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "labelPrefix": { "alias": "labelPrefix"; "required": false; "isSignal": true; }; "labelSuffix": { "alias": "labelSuffix"; "required": false; "isSignal": true; }; "labelType": { "alias": "labelType"; "required": false; "isSignal": true; }; "testId": { "alias": "testId"; "required": false; "isSignal": true; }; }, {}, ["thumbDirective"], ["*"], true, never>;
4713
4918
  }
4714
4919
 
4715
4920
  declare class TnSliderWithLabelDirective implements OnInit, OnDestroy {
@@ -4734,6 +4939,11 @@ declare class TnButtonToggleGroupComponent implements ControlValueAccessor {
4734
4939
  name: _angular_core.InputSignal<string>;
4735
4940
  ariaLabel: _angular_core.InputSignal<string>;
4736
4941
  ariaLabelledby: _angular_core.InputSignal<string>;
4942
+ /**
4943
+ * Test-id applied to the group root. Rendered under whichever attribute name
4944
+ * is configured via `TN_TEST_ATTR` (default `data-testid`).
4945
+ */
4946
+ testId: _angular_core.InputSignal<string | undefined>;
4737
4947
  change: _angular_core.OutputEmitterRef<{
4738
4948
  source: TnButtonToggleComponent;
4739
4949
  value: unknown;
@@ -4755,7 +4965,7 @@ declare class TnButtonToggleGroupComponent implements ControlValueAccessor {
4755
4965
  private updateTogglesFromValue;
4756
4966
  private updateTogglesFromValues;
4757
4967
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnButtonToggleGroupComponent, never>;
4758
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnButtonToggleGroupComponent, "tn-button-toggle-group", never, { "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "ariaLabelledby": { "alias": "ariaLabelledby"; "required": false; "isSignal": true; }; }, { "change": "change"; }, ["buttonToggles"], ["*"], true, never>;
4968
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnButtonToggleGroupComponent, "tn-button-toggle-group", never, { "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "ariaLabelledby": { "alias": "ariaLabelledby"; "required": false; "isSignal": true; }; "testId": { "alias": "testId"; "required": false; "isSignal": true; }; }, { "change": "change"; }, ["buttonToggles"], ["*"], true, never>;
4759
4969
  }
4760
4970
 
4761
4971
  declare class TnButtonToggleComponent implements ControlValueAccessor {
@@ -4767,6 +4977,11 @@ declare class TnButtonToggleComponent implements ControlValueAccessor {
4767
4977
  checked: _angular_core.WritableSignal<boolean>;
4768
4978
  ariaLabel: _angular_core.InputSignal<string>;
4769
4979
  ariaLabelledby: _angular_core.InputSignal<string>;
4980
+ /**
4981
+ * Test-id applied to the rendered toggle button. Rendered under whichever attribute name
4982
+ * is configured via `TN_TEST_ATTR` (default `data-testid`).
4983
+ */
4984
+ testId: _angular_core.InputSignal<string | undefined>;
4770
4985
  change: _angular_core.OutputEmitterRef<{
4771
4986
  source: TnButtonToggleComponent;
4772
4987
  value: unknown;
@@ -4786,7 +5001,7 @@ declare class TnButtonToggleComponent implements ControlValueAccessor {
4786
5001
  _markForCheck(): void;
4787
5002
  _markForUncheck(): void;
4788
5003
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnButtonToggleComponent, never>;
4789
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnButtonToggleComponent, "tn-button-toggle", never, { "id": { "alias": "id"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "ariaLabelledby": { "alias": "ariaLabelledby"; "required": false; "isSignal": true; }; }, { "change": "change"; }, never, ["*"], true, never>;
5004
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnButtonToggleComponent, "tn-button-toggle", never, { "id": { "alias": "id"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "ariaLabelledby": { "alias": "ariaLabelledby"; "required": false; "isSignal": true; }; "testId": { "alias": "testId"; "required": false; "isSignal": true; }; }, { "change": "change"; }, never, ["*"], true, never>;
4790
5005
  }
4791
5006
 
4792
5007
  /**
@@ -5285,6 +5500,15 @@ declare class TnSidePanelComponent implements OnDestroy {
5285
5500
  hasBackdrop: _angular_core.InputSignal<boolean>;
5286
5501
  closeOnBackdropClick: _angular_core.InputSignal<boolean>;
5287
5502
  closeOnEscape: _angular_core.InputSignal<boolean>;
5503
+ /**
5504
+ * Test-id applied to the panel's root overlay element. Rendered under whichever attribute
5505
+ * name is configured via `TN_TEST_ATTR` (default `data-testid`).
5506
+ */
5507
+ testId: _angular_core.InputSignal<string | undefined>;
5508
+ /**
5509
+ * Test-id applied to the panel's close (×) button.
5510
+ */
5511
+ closeButtonTestId: _angular_core.InputSignal<string | undefined>;
5288
5512
  opened: _angular_core.OutputEmitterRef<void>;
5289
5513
  closed: _angular_core.OutputEmitterRef<void>;
5290
5514
  private actionContent;
@@ -5301,7 +5525,7 @@ declare class TnSidePanelComponent implements OnDestroy {
5301
5525
  private restoreFocus;
5302
5526
  private registerMdiIcons;
5303
5527
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnSidePanelComponent, never>;
5304
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnSidePanelComponent, "tn-side-panel", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "hasBackdrop": { "alias": "hasBackdrop"; "required": false; "isSignal": true; }; "closeOnBackdropClick": { "alias": "closeOnBackdropClick"; "required": false; "isSignal": true; }; "closeOnEscape": { "alias": "closeOnEscape"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "opened": "opened"; "closed": "closed"; }, ["actionContent"], ["[tnSidePanelHeaderAction]", "*", "[tnSidePanelAction]"], true, never>;
5528
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnSidePanelComponent, "tn-side-panel", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "hasBackdrop": { "alias": "hasBackdrop"; "required": false; "isSignal": true; }; "closeOnBackdropClick": { "alias": "closeOnBackdropClick"; "required": false; "isSignal": true; }; "closeOnEscape": { "alias": "closeOnEscape"; "required": false; "isSignal": true; }; "testId": { "alias": "testId"; "required": false; "isSignal": true; }; "closeButtonTestId": { "alias": "closeButtonTestId"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "opened": "opened"; "closed": "closed"; }, ["actionContent"], ["[tnSidePanelHeaderAction]", "*", "[tnSidePanelAction]"], true, never>;
5305
5529
  }
5306
5530
 
5307
5531
  interface SidePanelHarnessFilters extends BaseHarnessFilters {
@@ -5353,6 +5577,11 @@ declare class TnStepperComponent {
5353
5577
  orientation: _angular_core.InputSignal<"auto" | "horizontal" | "vertical">;
5354
5578
  linear: _angular_core.InputSignal<boolean>;
5355
5579
  selectedIndex: _angular_core.ModelSignal<number>;
5580
+ /**
5581
+ * Test-id applied to the stepper root. Rendered under whichever attribute name
5582
+ * is configured via `TN_TEST_ATTR` (default `data-testid`).
5583
+ */
5584
+ testId: _angular_core.InputSignal<string | undefined>;
5356
5585
  selectionChange: _angular_core.OutputEmitterRef<{
5357
5586
  selectedIndex: number;
5358
5587
  previouslySelectedIndex: number;
@@ -5374,7 +5603,7 @@ declare class TnStepperComponent {
5374
5603
  previous(): void;
5375
5604
  _trackByStepIndex(index: number): number;
5376
5605
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnStepperComponent, never>;
5377
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnStepperComponent, "tn-stepper", never, { "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "linear": { "alias": "linear"; "required": false; "isSignal": true; }; "selectedIndex": { "alias": "selectedIndex"; "required": false; "isSignal": true; }; }, { "selectedIndex": "selectedIndexChange"; "selectionChange": "selectionChange"; "completed": "completed"; }, ["steps"], never, true, never>;
5606
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnStepperComponent, "tn-stepper", never, { "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "linear": { "alias": "linear"; "required": false; "isSignal": true; }; "selectedIndex": { "alias": "selectedIndex"; "required": false; "isSignal": true; }; "testId": { "alias": "testId"; "required": false; "isSignal": true; }; }, { "selectedIndex": "selectedIndexChange"; "selectionChange": "selectionChange"; "completed": "completed"; }, ["steps"], never, true, never>;
5378
5607
  }
5379
5608
 
5380
5609
  declare class TnFilePickerComponent implements ControlValueAccessor, OnInit, OnDestroy {
@@ -5386,6 +5615,11 @@ declare class TnFilePickerComponent implements ControlValueAccessor, OnInit, OnD
5386
5615
  allowManualInput: _angular_core.InputSignal<boolean>;
5387
5616
  placeholder: _angular_core.InputSignal<string>;
5388
5617
  disabled: _angular_core.InputSignal<boolean>;
5618
+ /**
5619
+ * Test-id applied to the file-picker container. Rendered under whichever attribute name
5620
+ * is configured via `TN_TEST_ATTR` (default `data-testid`).
5621
+ */
5622
+ testId: _angular_core.InputSignal<string | undefined>;
5389
5623
  startPath: _angular_core.InputSignal<string>;
5390
5624
  rootPath: _angular_core.InputSignal<string | undefined>;
5391
5625
  fileExtensions: _angular_core.InputSignal<string[] | undefined>;
@@ -5444,7 +5678,7 @@ declare class TnFilePickerComponent implements ControlValueAccessor, OnInit, OnD
5444
5678
  private emitError;
5445
5679
  private createOverlay;
5446
5680
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnFilePickerComponent, never>;
5447
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnFilePickerComponent, "tn-file-picker", never, { "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "multiSelect": { "alias": "multiSelect"; "required": false; "isSignal": true; }; "allowCreate": { "alias": "allowCreate"; "required": false; "isSignal": true; }; "allowDatasetCreate": { "alias": "allowDatasetCreate"; "required": false; "isSignal": true; }; "allowZvolCreate": { "alias": "allowZvolCreate"; "required": false; "isSignal": true; }; "allowManualInput": { "alias": "allowManualInput"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "startPath": { "alias": "startPath"; "required": false; "isSignal": true; }; "rootPath": { "alias": "rootPath"; "required": false; "isSignal": true; }; "fileExtensions": { "alias": "fileExtensions"; "required": false; "isSignal": true; }; "callbacks": { "alias": "callbacks"; "required": false; "isSignal": true; }; }, { "selectionChange": "selectionChange"; "pathChange": "pathChange"; "createFolder": "createFolder"; "error": "error"; }, never, never, true, never>;
5681
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnFilePickerComponent, "tn-file-picker", never, { "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "multiSelect": { "alias": "multiSelect"; "required": false; "isSignal": true; }; "allowCreate": { "alias": "allowCreate"; "required": false; "isSignal": true; }; "allowDatasetCreate": { "alias": "allowDatasetCreate"; "required": false; "isSignal": true; }; "allowZvolCreate": { "alias": "allowZvolCreate"; "required": false; "isSignal": true; }; "allowManualInput": { "alias": "allowManualInput"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "testId": { "alias": "testId"; "required": false; "isSignal": true; }; "startPath": { "alias": "startPath"; "required": false; "isSignal": true; }; "rootPath": { "alias": "rootPath"; "required": false; "isSignal": true; }; "fileExtensions": { "alias": "fileExtensions"; "required": false; "isSignal": true; }; "callbacks": { "alias": "callbacks"; "required": false; "isSignal": true; }; }, { "selectionChange": "selectionChange"; "pathChange": "pathChange"; "createFolder": "createFolder"; "error": "error"; }, never, never, true, never>;
5448
5682
  }
5449
5683
 
5450
5684
  declare class TnFilePickerPopupComponent implements OnInit, AfterViewInit, AfterViewChecked {
@@ -5535,14 +5769,20 @@ declare class TnEmptyComponent {
5535
5769
  description: _angular_core.InputSignal<string | undefined>;
5536
5770
  icon: _angular_core.InputSignal<string | undefined>;
5537
5771
  iconLibrary: _angular_core.InputSignal<IconLibraryType>;
5772
+ /**
5773
+ * Overrides the icon size derived from `size`. Accepts any valid CSS size value
5774
+ * (e.g. `'48px'`, `'3rem'`). Use this when the variant presets are too small for an
5775
+ * empty-state illustration. When unset, the icon falls back to the `size`-based preset.
5776
+ */
5777
+ iconSize: _angular_core.InputSignal<string | undefined>;
5538
5778
  actionText: _angular_core.InputSignal<string | undefined>;
5539
5779
  bordered: _angular_core.InputSignal<boolean>;
5540
5780
  size: _angular_core.InputSignal<TnEmptySize>;
5541
5781
  onAction: _angular_core.OutputEmitterRef<void>;
5542
5782
  protected hasAction: _angular_core.Signal<boolean>;
5543
- iconSize: _angular_core.Signal<"lg" | "xl">;
5783
+ protected iconSizePreset: _angular_core.Signal<"lg" | "xl">;
5544
5784
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnEmptyComponent, never>;
5545
- 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>;
5785
+ 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>;
5546
5786
  }
5547
5787
 
5548
5788
  /**
@@ -5883,6 +6123,32 @@ declare class TnKeyboardShortcutService {
5883
6123
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<TnKeyboardShortcutService>;
5884
6124
  }
5885
6125
 
6126
+ /**
6127
+ * Test-id attribute names supported by the library.
6128
+ *
6129
+ * - `'data-testid'` is the modern industry default and the library's out-of-the-box behavior.
6130
+ * - `'data-test'` exists for consumers that have an established convention they don't want to disrupt
6131
+ * (notably webui, which has thousands of selectors targeting `data-test`).
6132
+ */
6133
+ type TnTestAttrName = 'data-test' | 'data-testid';
6134
+ /**
6135
+ * Controls which attribute name the library renders `testId` values to.
6136
+ *
6137
+ * Defaults to `'data-testid'`. Consumers can override at the application root:
6138
+ *
6139
+ * ```ts
6140
+ * bootstrapApplication(AppComponent, {
6141
+ * providers: [
6142
+ * { provide: TN_TEST_ATTR, useValue: 'data-test' },
6143
+ * ],
6144
+ * });
6145
+ * ```
6146
+ *
6147
+ * Every component-level `testId` input and every `[tnTestId]` directive usage reads this token
6148
+ * so that a single override switches the entire library consistently.
6149
+ */
6150
+ declare const TN_TEST_ATTR: InjectionToken<TnTestAttrName>;
6151
+
5886
6152
  /**
5887
6153
  * Enum of available theme names.
5888
6154
  * Use these constants instead of hardcoded strings.
@@ -6077,5 +6343,5 @@ declare const TN_THEME_DEFINITIONS: readonly TnThemeDefinition[];
6077
6343
  */
6078
6344
  declare const THEME_MAP: Map<TnTheme, TnThemeDefinition>;
6079
6345
 
6080
- export { CommonShortcuts, DEFAULT_THEME, DiskIconComponent, DiskType, FileSizePipe, InputType, LIGHT_THEME, LinuxModifierKeys, LinuxShortcuts, ModifierKeys, QuickShortcuts, ShortcutBuilder, StripMntPrefixPipe, THEME_MAP, THEME_STORAGE_KEY, 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, 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 };
6081
- 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, TnThemeDefinition, TnToastCall, TnToastConfig, TooltipPosition, YearCell };
6346
+ 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, 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, 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 };
6347
+ 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 };