@truenas/ui-components 0.1.13 → 0.1.15

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.
@@ -465,6 +465,14 @@ declare class TnInputComponent implements AfterViewInit, ControlValueAccessor {
465
465
  disabled: _angular_core.InputSignal<boolean>;
466
466
  multiline: _angular_core.InputSignal<boolean>;
467
467
  rows: _angular_core.InputSignal<number>;
468
+ prefixIcon: _angular_core.InputSignal<string | undefined>;
469
+ prefixIconLibrary: _angular_core.InputSignal<IconLibraryType | undefined>;
470
+ suffixIcon: _angular_core.InputSignal<string | undefined>;
471
+ suffixIconLibrary: _angular_core.InputSignal<IconLibraryType | undefined>;
472
+ suffixIconAriaLabel: _angular_core.InputSignal<string | undefined>;
473
+ onSuffixAction: _angular_core.OutputEmitterRef<MouseEvent>;
474
+ hasPrefixIcon: _angular_core.Signal<boolean>;
475
+ hasSuffixIcon: _angular_core.Signal<boolean>;
468
476
  id: string;
469
477
  value: string;
470
478
  private formDisabled;
@@ -480,7 +488,308 @@ declare class TnInputComponent implements AfterViewInit, ControlValueAccessor {
480
488
  onValueChange(event: Event): void;
481
489
  onBlur(): void;
482
490
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnInputComponent, never>;
483
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnInputComponent, "tn-input", never, { "inputType": { "alias": "inputType"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "testId": { "alias": "testId"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "multiline": { "alias": "multiline"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
491
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnInputComponent, "tn-input", never, { "inputType": { "alias": "inputType"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "testId": { "alias": "testId"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "multiline": { "alias": "multiline"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "prefixIcon": { "alias": "prefixIcon"; "required": false; "isSignal": true; }; "prefixIconLibrary": { "alias": "prefixIconLibrary"; "required": false; "isSignal": true; }; "suffixIcon": { "alias": "suffixIcon"; "required": false; "isSignal": true; }; "suffixIconLibrary": { "alias": "suffixIconLibrary"; "required": false; "isSignal": true; }; "suffixIconAriaLabel": { "alias": "suffixIconAriaLabel"; "required": false; "isSignal": true; }; }, { "onSuffixAction": "onSuffixAction"; }, never, never, true, never>;
492
+ }
493
+
494
+ /**
495
+ * Harness for interacting with tn-icon in tests.
496
+ * Provides filtering by icon name and library for existence checks, as well as click interaction.
497
+ *
498
+ * @example
499
+ * ```typescript
500
+ * // Check for existence
501
+ * const icon = await loader.getHarness(TnIconHarness);
502
+ *
503
+ * // Find icon by name
504
+ * const folderIcon = await loader.getHarness(
505
+ * TnIconHarness.with({ name: 'folder' })
506
+ * );
507
+ *
508
+ * // Find icon by name and library
509
+ * const mdiIcon = await loader.getHarness(
510
+ * TnIconHarness.with({ name: 'account-circle', library: 'mdi' })
511
+ * );
512
+ *
513
+ * // Check if icon exists
514
+ * const hasIcon = await loader.hasHarness(
515
+ * TnIconHarness.with({ name: 'check' })
516
+ * );
517
+ *
518
+ * // Click an icon
519
+ * const closeIcon = await loader.getHarness(
520
+ * TnIconHarness.with({ name: 'close' })
521
+ * );
522
+ * await closeIcon.click();
523
+ * ```
524
+ */
525
+ declare class TnIconHarness extends ComponentHarness {
526
+ /**
527
+ * The selector for the host element of a `TnIconComponent` instance.
528
+ */
529
+ static hostSelector: string;
530
+ /**
531
+ * Gets a `HarnessPredicate` that can be used to search for an icon
532
+ * with specific attributes.
533
+ *
534
+ * @param options Options for filtering which icon instances are considered a match.
535
+ * @returns A `HarnessPredicate` configured with the given options.
536
+ *
537
+ * @example
538
+ * ```typescript
539
+ * // Find icon by name
540
+ * const icon = await loader.getHarness(
541
+ * TnIconHarness.with({ name: 'home' })
542
+ * );
543
+ *
544
+ * // Find icon by library
545
+ * const customIcon = await loader.getHarness(
546
+ * TnIconHarness.with({ library: 'custom' })
547
+ * );
548
+ *
549
+ * // Find icon with specific size
550
+ * const largeIcon = await loader.getHarness(
551
+ * TnIconHarness.with({ size: 'lg' })
552
+ * );
553
+ * ```
554
+ */
555
+ static with(options?: IconHarnessFilters): HarnessPredicate<TnIconHarness>;
556
+ /**
557
+ * Gets the icon name.
558
+ *
559
+ * @returns Promise resolving to the icon name.
560
+ *
561
+ * @example
562
+ * ```typescript
563
+ * const icon = await loader.getHarness(TnIconHarness);
564
+ * const name = await icon.getName();
565
+ * expect(name).toBe('folder');
566
+ * ```
567
+ */
568
+ getName(): Promise<string | null>;
569
+ /**
570
+ * Gets the icon library.
571
+ *
572
+ * @returns Promise resolving to the icon library.
573
+ *
574
+ * @example
575
+ * ```typescript
576
+ * const icon = await loader.getHarness(TnIconHarness);
577
+ * const library = await icon.getLibrary();
578
+ * expect(library).toBe('mdi');
579
+ * ```
580
+ */
581
+ getLibrary(): Promise<string | null>;
582
+ /**
583
+ * Gets the icon size.
584
+ *
585
+ * @returns Promise resolving to the icon size.
586
+ *
587
+ * @example
588
+ * ```typescript
589
+ * const icon = await loader.getHarness(TnIconHarness);
590
+ * const size = await icon.getSize();
591
+ * expect(size).toBe('lg');
592
+ * ```
593
+ */
594
+ getSize(): Promise<string | null>;
595
+ /**
596
+ * Gets the icon color.
597
+ *
598
+ * @returns Promise resolving to the icon color.
599
+ *
600
+ * @example
601
+ * ```typescript
602
+ * const icon = await loader.getHarness(TnIconHarness);
603
+ * const color = await icon.getColor();
604
+ * expect(color).toBe('primary');
605
+ * ```
606
+ */
607
+ getColor(): Promise<string | null>;
608
+ /**
609
+ * Checks if the icon is in full-size mode.
610
+ *
611
+ * @returns Promise resolving to true if the icon is full-size, false otherwise.
612
+ *
613
+ * @example
614
+ * ```typescript
615
+ * const icon = await loader.getHarness(TnIconHarness);
616
+ * const isFullSize = await icon.isFullSize();
617
+ * expect(isFullSize).toBe(true);
618
+ * ```
619
+ */
620
+ isFullSize(): Promise<boolean>;
621
+ /**
622
+ * Gets the icon custom size.
623
+ *
624
+ * @returns Promise resolving to the custom size value, or null if not set.
625
+ *
626
+ * @example
627
+ * ```typescript
628
+ * const icon = await loader.getHarness(TnIconHarness);
629
+ * const customSize = await icon.getCustomSize();
630
+ * expect(customSize).toBe('64px');
631
+ * ```
632
+ */
633
+ getCustomSize(): Promise<string | null>;
634
+ /**
635
+ * Checks if the icon is using a custom size.
636
+ *
637
+ * @returns Promise resolving to true if a custom size is set, false otherwise.
638
+ *
639
+ * @example
640
+ * ```typescript
641
+ * const icon = await loader.getHarness(TnIconHarness);
642
+ * const hasCustomSize = await icon.hasCustomSize();
643
+ * expect(hasCustomSize).toBe(true);
644
+ * ```
645
+ */
646
+ hasCustomSize(): Promise<boolean>;
647
+ /**
648
+ * Clicks the icon.
649
+ *
650
+ * @returns Promise that resolves when the click action is complete.
651
+ *
652
+ * @example
653
+ * ```typescript
654
+ * const icon = await loader.getHarness(TnIconHarness.with({ name: 'close' }));
655
+ * await icon.click();
656
+ * ```
657
+ */
658
+ click(): Promise<void>;
659
+ }
660
+ /**
661
+ * A set of criteria that can be used to filter a list of `TnIconHarness` instances.
662
+ */
663
+ interface IconHarnessFilters extends BaseHarnessFilters {
664
+ /** Filters by icon name. */
665
+ name?: string;
666
+ /** Filters by icon library (material, mdi, custom, lucide). */
667
+ library?: string;
668
+ /** Filters by icon size (xs, sm, md, lg, xl). */
669
+ size?: string;
670
+ /** Filters by full-size mode. */
671
+ fullSize?: boolean;
672
+ /** Filters by custom size value. */
673
+ customSize?: string;
674
+ }
675
+
676
+ /**
677
+ * Harness for interacting with tn-input in tests.
678
+ * Provides methods for querying state, setting values, and interacting with prefix/suffix icons.
679
+ *
680
+ * @example
681
+ * ```typescript
682
+ * // Get the input harness
683
+ * const input = await loader.getHarness(TnInputHarness);
684
+ *
685
+ * // Set and read a value
686
+ * await input.setValue('hello');
687
+ * expect(await input.getValue()).toBe('hello');
688
+ *
689
+ * // Check for prefix icon
690
+ * expect(await input.hasPrefixIcon()).toBe(true);
691
+ *
692
+ * // Click suffix action
693
+ * await input.clickSuffixAction();
694
+ * ```
695
+ */
696
+ declare class TnInputHarness extends ComponentHarness {
697
+ /**
698
+ * The selector for the host element of a `TnInputComponent` instance.
699
+ */
700
+ static hostSelector: string;
701
+ private inputEl;
702
+ private textareaEl;
703
+ private prefixIconEl;
704
+ private suffixButton;
705
+ private suffixIconEl;
706
+ /**
707
+ * Gets a `HarnessPredicate` that can be used to search for an input
708
+ * with specific attributes.
709
+ *
710
+ * @param options Options for filtering which input instances are considered a match.
711
+ * @returns A `HarnessPredicate` configured with the given options.
712
+ */
713
+ static with(options?: InputHarnessFilters): HarnessPredicate<TnInputHarness>;
714
+ /**
715
+ * Gets the current value of the input.
716
+ *
717
+ * @returns Promise resolving to the input value.
718
+ */
719
+ getValue(): Promise<string>;
720
+ /**
721
+ * Sets the value of the input by clearing and typing.
722
+ *
723
+ * @param value The value to set.
724
+ */
725
+ setValue(value: string): Promise<void>;
726
+ /**
727
+ * Gets the placeholder text.
728
+ *
729
+ * @returns Promise resolving to the placeholder string.
730
+ */
731
+ getPlaceholder(): Promise<string | null>;
732
+ /**
733
+ * Checks whether the input is disabled.
734
+ *
735
+ * @returns Promise resolving to true if the input is disabled.
736
+ */
737
+ isDisabled(): Promise<boolean>;
738
+ /**
739
+ * Checks whether the input renders as a textarea.
740
+ *
741
+ * @returns Promise resolving to true if multiline.
742
+ */
743
+ isMultiline(): Promise<boolean>;
744
+ /**
745
+ * Checks whether a prefix icon is present.
746
+ *
747
+ * @returns Promise resolving to true if a prefix icon exists.
748
+ */
749
+ hasPrefixIcon(): Promise<boolean>;
750
+ /**
751
+ * Gets the prefix icon harness for further inspection.
752
+ *
753
+ * @returns Promise resolving to the prefix TnIconHarness, or null if not present.
754
+ */
755
+ getPrefixIcon(): Promise<TnIconHarness | null>;
756
+ /**
757
+ * Checks whether a suffix action button is present.
758
+ *
759
+ * @returns Promise resolving to true if a suffix action exists.
760
+ */
761
+ hasSuffixAction(): Promise<boolean>;
762
+ /**
763
+ * Gets the suffix icon harness for further inspection.
764
+ *
765
+ * @returns Promise resolving to the suffix TnIconHarness, or null if not present.
766
+ */
767
+ getSuffixIcon(): Promise<TnIconHarness | null>;
768
+ /**
769
+ * Clicks the suffix action button.
770
+ *
771
+ * @returns Promise that resolves when the click action is complete.
772
+ */
773
+ clickSuffixAction(): Promise<void>;
774
+ /**
775
+ * Focuses the input element.
776
+ *
777
+ * @returns Promise that resolves when the input is focused.
778
+ */
779
+ focus(): Promise<void>;
780
+ /**
781
+ * Blurs the input element.
782
+ *
783
+ * @returns Promise that resolves when the input is blurred.
784
+ */
785
+ blur(): Promise<void>;
786
+ }
787
+ /**
788
+ * A set of criteria that can be used to filter a list of `TnInputHarness` instances.
789
+ */
790
+ interface InputHarnessFilters extends BaseHarnessFilters {
791
+ /** Filters by placeholder text. */
792
+ placeholder?: string;
484
793
  }
485
794
 
486
795
  declare class TnInputDirective {
@@ -730,6 +1039,7 @@ declare class TnTabComponent implements AfterContentInit {
730
1039
  isActive: _angular_core.WritableSignal<boolean>;
731
1040
  tabsComponent?: {
732
1041
  onKeydown: (event: KeyboardEvent, index: number) => void;
1042
+ selectTab: (index: number) => void;
733
1043
  };
734
1044
  elementRef: ElementRef<any>;
735
1045
  protected hasIconContent: _angular_core.WritableSignal<boolean>;
@@ -800,15 +1110,373 @@ declare class TnTabsComponent implements AfterContentInit, AfterViewInit, OnDest
800
1110
  }
801
1111
 
802
1112
  /**
803
- * Directive that attaches a menu to any element.
804
- * Usage: <button [tnMenuTriggerFor]="menu">Open Menu</button>
1113
+ * Harness for interacting with tn-tab in tests.
1114
+ * Provides methods for querying individual tab state and simulating selection.
1115
+ *
1116
+ * @example
1117
+ * ```typescript
1118
+ * // Find a tab by label
1119
+ * const tab = await loader.getHarness(TnTabHarness.with({ label: 'Settings' }));
1120
+ *
1121
+ * // Check if active
1122
+ * expect(await tab.isSelected()).toBe(false);
1123
+ *
1124
+ * // Select it
1125
+ * await tab.select();
1126
+ * expect(await tab.isSelected()).toBe(true);
1127
+ * ```
805
1128
  */
806
- declare class TnMenuTriggerDirective {
807
- menu: _angular_core.InputSignal<TnMenuComponent>;
808
- tnMenuPosition: _angular_core.InputSignal<"after" | "before" | "above" | "below">;
809
- private overlayRef?;
810
- private isMenuOpen;
811
- private elementRef;
1129
+ declare class TnTabHarness extends ComponentHarness {
1130
+ /**
1131
+ * The selector for the host element of a `TnTabComponent` instance.
1132
+ */
1133
+ static hostSelector: string;
1134
+ private _button;
1135
+ /**
1136
+ * Gets a `HarnessPredicate` that can be used to search for a tab
1137
+ * with specific attributes.
1138
+ *
1139
+ * @param options Options for filtering which tab instances are considered a match.
1140
+ * @returns A `HarnessPredicate` configured with the given options.
1141
+ *
1142
+ * @example
1143
+ * ```typescript
1144
+ * // Find tab by exact label
1145
+ * const tab = await loader.getHarness(TnTabHarness.with({ label: 'Overview' }));
1146
+ *
1147
+ * // Find tab by regex
1148
+ * const tab = await loader.getHarness(TnTabHarness.with({ label: /settings/i }));
1149
+ * ```
1150
+ */
1151
+ static with(options?: TabHarnessFilters): HarnessPredicate<TnTabHarness>;
1152
+ /**
1153
+ * Gets the tab's label text.
1154
+ *
1155
+ * @returns Promise resolving to the tab's label string.
1156
+ *
1157
+ * @example
1158
+ * ```typescript
1159
+ * const tab = await loader.getHarness(TnTabHarness);
1160
+ * expect(await tab.getLabel()).toBe('Overview');
1161
+ * ```
1162
+ */
1163
+ getLabel(): Promise<string>;
1164
+ /**
1165
+ * Checks whether the tab is currently selected (active).
1166
+ *
1167
+ * @returns Promise resolving to true if the tab is selected.
1168
+ *
1169
+ * @example
1170
+ * ```typescript
1171
+ * const tab = await loader.getHarness(TnTabHarness.with({ label: 'Overview' }));
1172
+ * expect(await tab.isSelected()).toBe(true);
1173
+ * ```
1174
+ */
1175
+ isSelected(): Promise<boolean>;
1176
+ /**
1177
+ * Checks whether the tab is disabled.
1178
+ *
1179
+ * @returns Promise resolving to true if the tab is disabled.
1180
+ *
1181
+ * @example
1182
+ * ```typescript
1183
+ * const tab = await loader.getHarness(TnTabHarness.with({ label: 'Disabled Tab' }));
1184
+ * expect(await tab.isDisabled()).toBe(true);
1185
+ * ```
1186
+ */
1187
+ isDisabled(): Promise<boolean>;
1188
+ /**
1189
+ * Selects the tab by clicking it.
1190
+ *
1191
+ * @returns Promise that resolves when the tab has been clicked.
1192
+ *
1193
+ * @example
1194
+ * ```typescript
1195
+ * const tab = await loader.getHarness(TnTabHarness.with({ label: 'Settings' }));
1196
+ * await tab.select();
1197
+ * ```
1198
+ */
1199
+ select(): Promise<void>;
1200
+ /**
1201
+ * Gets the tab's testId attribute value.
1202
+ *
1203
+ * @returns Promise resolving to the data-testid value, or null if not set.
1204
+ *
1205
+ * @example
1206
+ * ```typescript
1207
+ * const tab = await loader.getHarness(TnTabHarness);
1208
+ * expect(await tab.getTestId()).toBe('my-tab');
1209
+ * ```
1210
+ */
1211
+ getTestId(): Promise<string | null>;
1212
+ }
1213
+ /**
1214
+ * A set of criteria that can be used to filter a list of `TnTabHarness` instances.
1215
+ */
1216
+ interface TabHarnessFilters extends BaseHarnessFilters {
1217
+ /** Filters by tab label text. Supports string or regex matching. */
1218
+ label?: string | RegExp;
1219
+ }
1220
+
1221
+ /**
1222
+ * Harness for interacting with tn-tab-panel in tests.
1223
+ * Provides methods for querying panel visibility and content.
1224
+ *
1225
+ * @example
1226
+ * ```typescript
1227
+ * // Get all panels
1228
+ * const panels = await loader.getAllHarnesses(TnTabPanelHarness);
1229
+ *
1230
+ * // Check which panel is active
1231
+ * for (const panel of panels) {
1232
+ * if (await panel.isActive()) {
1233
+ * const text = await panel.getTextContent();
1234
+ * expect(text).toContain('Overview');
1235
+ * }
1236
+ * }
1237
+ * ```
1238
+ */
1239
+ declare class TnTabPanelHarness extends ComponentHarness {
1240
+ /**
1241
+ * The selector for the host element of a `TnTabPanelComponent` instance.
1242
+ */
1243
+ static hostSelector: string;
1244
+ private _panel;
1245
+ /**
1246
+ * Gets a `HarnessPredicate` that can be used to search for a tab panel
1247
+ * with specific attributes.
1248
+ *
1249
+ * @param options Options for filtering which panel instances are considered a match.
1250
+ * @returns A `HarnessPredicate` configured with the given options.
1251
+ *
1252
+ * @example
1253
+ * ```typescript
1254
+ * const panel = await loader.getHarness(
1255
+ * TnTabPanelHarness.with({ textContains: 'Overview' })
1256
+ * );
1257
+ * ```
1258
+ */
1259
+ static with(options?: TabPanelHarnessFilters): HarnessPredicate<TnTabPanelHarness>;
1260
+ /**
1261
+ * Checks whether the panel is currently active (visible).
1262
+ *
1263
+ * @returns Promise resolving to true if the panel is active.
1264
+ *
1265
+ * @example
1266
+ * ```typescript
1267
+ * const panel = await loader.getHarness(TnTabPanelHarness);
1268
+ * expect(await panel.isActive()).toBe(true);
1269
+ * ```
1270
+ */
1271
+ isActive(): Promise<boolean>;
1272
+ /**
1273
+ * Gets the text content of the panel.
1274
+ *
1275
+ * @returns Promise resolving to the panel's text content.
1276
+ *
1277
+ * @example
1278
+ * ```typescript
1279
+ * const panel = await loader.getHarness(TnTabPanelHarness);
1280
+ * expect(await panel.getTextContent()).toContain('Overview');
1281
+ * ```
1282
+ */
1283
+ getTextContent(): Promise<string>;
1284
+ /**
1285
+ * Gets the panel's testId attribute value.
1286
+ *
1287
+ * @returns Promise resolving to the data-testid value, or null if not set.
1288
+ *
1289
+ * @example
1290
+ * ```typescript
1291
+ * const panel = await loader.getHarness(TnTabPanelHarness);
1292
+ * expect(await panel.getTestId()).toBe('my-panel');
1293
+ * ```
1294
+ */
1295
+ getTestId(): Promise<string | null>;
1296
+ }
1297
+ /**
1298
+ * A set of criteria that can be used to filter a list of `TnTabPanelHarness` instances.
1299
+ */
1300
+ interface TabPanelHarnessFilters extends BaseHarnessFilters {
1301
+ /** Filters by text content within panel. Supports string or regex matching. */
1302
+ textContains?: string | RegExp;
1303
+ }
1304
+
1305
+ /**
1306
+ * Harness for interacting with tn-tabs in tests.
1307
+ * Provides methods for querying tab state, selecting tabs, and inspecting panels.
1308
+ *
1309
+ * @example
1310
+ * ```typescript
1311
+ * // Get the tabs harness
1312
+ * const tabs = await loader.getHarness(TnTabsHarness);
1313
+ *
1314
+ * // Select a tab by label
1315
+ * await tabs.selectTab({ label: 'Settings' });
1316
+ *
1317
+ * // Get the selected tab label
1318
+ * const selected = await tabs.getSelectedTab();
1319
+ * expect(await selected.getLabel()).toBe('Settings');
1320
+ *
1321
+ * // Get all tab labels
1322
+ * const labels = await tabs.getTabLabels();
1323
+ * expect(labels).toEqual(['Overview', 'Details', 'Settings']);
1324
+ * ```
1325
+ */
1326
+ declare class TnTabsHarness extends ComponentHarness {
1327
+ /**
1328
+ * The selector for the host element of a `TnTabsComponent` instance.
1329
+ */
1330
+ static hostSelector: string;
1331
+ /**
1332
+ * Gets a `HarnessPredicate` that can be used to search for tabs
1333
+ * with specific attributes.
1334
+ *
1335
+ * @param options Options for filtering which tabs instances are considered a match.
1336
+ * @returns A `HarnessPredicate` configured with the given options.
1337
+ *
1338
+ * @example
1339
+ * ```typescript
1340
+ * // Find by orientation
1341
+ * const tabs = await loader.getHarness(TnTabsHarness.with({ orientation: 'vertical' }));
1342
+ *
1343
+ * // Find the tab group containing a "Settings" tab
1344
+ * const tabs = await loader.getHarness(TnTabsHarness.with({ hasTab: 'Settings' }));
1345
+ *
1346
+ * // Find by regex
1347
+ * const tabs = await loader.getHarness(TnTabsHarness.with({ hasTab: /settings/i }));
1348
+ * ```
1349
+ */
1350
+ static with(options?: TabsHarnessFilters): HarnessPredicate<TnTabsHarness>;
1351
+ /**
1352
+ * Gets all tab harnesses within this tab group.
1353
+ *
1354
+ * @returns Promise resolving to an array of `TnTabHarness` instances.
1355
+ *
1356
+ * @example
1357
+ * ```typescript
1358
+ * const tabs = await loader.getHarness(TnTabsHarness);
1359
+ * const allTabs = await tabs.getTabs();
1360
+ * expect(allTabs.length).toBe(3);
1361
+ * ```
1362
+ */
1363
+ getTabs(): Promise<TnTabHarness[]>;
1364
+ /**
1365
+ * Gets a specific tab by filter criteria.
1366
+ *
1367
+ * @param filter Optional filter to match a specific tab.
1368
+ * @returns Promise resolving to the matching `TnTabHarness`.
1369
+ *
1370
+ * @example
1371
+ * ```typescript
1372
+ * const tabs = await loader.getHarness(TnTabsHarness);
1373
+ * const settingsTab = await tabs.getTab({ label: 'Settings' });
1374
+ * ```
1375
+ */
1376
+ getTab(filter?: TabHarnessFilters): Promise<TnTabHarness>;
1377
+ /**
1378
+ * Gets all panel harnesses within this tab group.
1379
+ *
1380
+ * @returns Promise resolving to an array of `TnTabPanelHarness` instances.
1381
+ *
1382
+ * @example
1383
+ * ```typescript
1384
+ * const tabs = await loader.getHarness(TnTabsHarness);
1385
+ * const panels = await tabs.getPanels();
1386
+ * expect(panels.length).toBe(3);
1387
+ * ```
1388
+ */
1389
+ getPanels(): Promise<TnTabPanelHarness[]>;
1390
+ /**
1391
+ * Gets all tab labels as strings.
1392
+ *
1393
+ * @returns Promise resolving to an array of tab label strings.
1394
+ *
1395
+ * @example
1396
+ * ```typescript
1397
+ * const tabs = await loader.getHarness(TnTabsHarness);
1398
+ * const labels = await tabs.getTabLabels();
1399
+ * expect(labels).toEqual(['Overview', 'Details', 'Settings']);
1400
+ * ```
1401
+ */
1402
+ getTabLabels(): Promise<string[]>;
1403
+ /**
1404
+ * Gets the currently selected (active) tab.
1405
+ *
1406
+ * @returns Promise resolving to the active `TnTabHarness`.
1407
+ * @throws If no active tab is found.
1408
+ *
1409
+ * @example
1410
+ * ```typescript
1411
+ * const tabs = await loader.getHarness(TnTabsHarness);
1412
+ * const selected = await tabs.getSelectedTab();
1413
+ * expect(await selected.getLabel()).toBe('Overview');
1414
+ * ```
1415
+ */
1416
+ getSelectedTab(): Promise<TnTabHarness>;
1417
+ /**
1418
+ * Selects a tab by filter criteria. Clicks the matching tab button.
1419
+ *
1420
+ * @param filter Filter to identify which tab to select.
1421
+ * @returns Promise that resolves when the tab has been selected.
1422
+ *
1423
+ * @example
1424
+ * ```typescript
1425
+ * const tabs = await loader.getHarness(TnTabsHarness);
1426
+ *
1427
+ * // Select by label
1428
+ * await tabs.selectTab({ label: 'Settings' });
1429
+ *
1430
+ * // Select by regex
1431
+ * await tabs.selectTab({ label: /detail/i });
1432
+ * ```
1433
+ */
1434
+ selectTab(filter: TabHarnessFilters): Promise<void>;
1435
+ /**
1436
+ * Gets the orientation of the tab group.
1437
+ *
1438
+ * @returns Promise resolving to 'horizontal' or 'vertical'.
1439
+ *
1440
+ * @example
1441
+ * ```typescript
1442
+ * const tabs = await loader.getHarness(TnTabsHarness);
1443
+ * expect(await tabs.getOrientation()).toBe('horizontal');
1444
+ * ```
1445
+ */
1446
+ getOrientation(): Promise<string>;
1447
+ /**
1448
+ * Gets the number of tabs.
1449
+ *
1450
+ * @returns Promise resolving to the tab count.
1451
+ *
1452
+ * @example
1453
+ * ```typescript
1454
+ * const tabs = await loader.getHarness(TnTabsHarness);
1455
+ * expect(await tabs.getTabCount()).toBe(3);
1456
+ * ```
1457
+ */
1458
+ getTabCount(): Promise<number>;
1459
+ }
1460
+ /**
1461
+ * A set of criteria that can be used to filter a list of `TnTabsHarness` instances.
1462
+ */
1463
+ interface TabsHarnessFilters extends BaseHarnessFilters {
1464
+ /** Filters by tab group orientation. */
1465
+ orientation?: 'horizontal' | 'vertical';
1466
+ /** Filters by the presence of a tab with a matching label. Supports string or regex. */
1467
+ hasTab?: string | RegExp;
1468
+ }
1469
+
1470
+ /**
1471
+ * Directive that attaches a menu to any element.
1472
+ * Usage: <button [tnMenuTriggerFor]="menu">Open Menu</button>
1473
+ */
1474
+ declare class TnMenuTriggerDirective {
1475
+ menu: _angular_core.InputSignal<TnMenuComponent>;
1476
+ tnMenuPosition: _angular_core.InputSignal<"after" | "before" | "above" | "below">;
1477
+ private overlayRef?;
1478
+ private isMenuOpen;
1479
+ private elementRef;
812
1480
  private overlay;
813
1481
  private viewContainerRef;
814
1482
  onClick(): void;
@@ -1076,188 +1744,6 @@ interface SelectHarnessFilters extends BaseHarnessFilters {
1076
1744
  displayText?: string | RegExp;
1077
1745
  }
1078
1746
 
1079
- /**
1080
- * Harness for interacting with tn-icon in tests.
1081
- * Provides filtering by icon name and library for existence checks, as well as click interaction.
1082
- *
1083
- * @example
1084
- * ```typescript
1085
- * // Check for existence
1086
- * const icon = await loader.getHarness(TnIconHarness);
1087
- *
1088
- * // Find icon by name
1089
- * const folderIcon = await loader.getHarness(
1090
- * TnIconHarness.with({ name: 'folder' })
1091
- * );
1092
- *
1093
- * // Find icon by name and library
1094
- * const mdiIcon = await loader.getHarness(
1095
- * TnIconHarness.with({ name: 'account-circle', library: 'mdi' })
1096
- * );
1097
- *
1098
- * // Check if icon exists
1099
- * const hasIcon = await loader.hasHarness(
1100
- * TnIconHarness.with({ name: 'check' })
1101
- * );
1102
- *
1103
- * // Click an icon
1104
- * const closeIcon = await loader.getHarness(
1105
- * TnIconHarness.with({ name: 'close' })
1106
- * );
1107
- * await closeIcon.click();
1108
- * ```
1109
- */
1110
- declare class TnIconHarness extends ComponentHarness {
1111
- /**
1112
- * The selector for the host element of a `TnIconComponent` instance.
1113
- */
1114
- static hostSelector: string;
1115
- /**
1116
- * Gets a `HarnessPredicate` that can be used to search for an icon
1117
- * with specific attributes.
1118
- *
1119
- * @param options Options for filtering which icon instances are considered a match.
1120
- * @returns A `HarnessPredicate` configured with the given options.
1121
- *
1122
- * @example
1123
- * ```typescript
1124
- * // Find icon by name
1125
- * const icon = await loader.getHarness(
1126
- * TnIconHarness.with({ name: 'home' })
1127
- * );
1128
- *
1129
- * // Find icon by library
1130
- * const customIcon = await loader.getHarness(
1131
- * TnIconHarness.with({ library: 'custom' })
1132
- * );
1133
- *
1134
- * // Find icon with specific size
1135
- * const largeIcon = await loader.getHarness(
1136
- * TnIconHarness.with({ size: 'lg' })
1137
- * );
1138
- * ```
1139
- */
1140
- static with(options?: IconHarnessFilters): HarnessPredicate<TnIconHarness>;
1141
- /**
1142
- * Gets the icon name.
1143
- *
1144
- * @returns Promise resolving to the icon name.
1145
- *
1146
- * @example
1147
- * ```typescript
1148
- * const icon = await loader.getHarness(TnIconHarness);
1149
- * const name = await icon.getName();
1150
- * expect(name).toBe('folder');
1151
- * ```
1152
- */
1153
- getName(): Promise<string | null>;
1154
- /**
1155
- * Gets the icon library.
1156
- *
1157
- * @returns Promise resolving to the icon library.
1158
- *
1159
- * @example
1160
- * ```typescript
1161
- * const icon = await loader.getHarness(TnIconHarness);
1162
- * const library = await icon.getLibrary();
1163
- * expect(library).toBe('mdi');
1164
- * ```
1165
- */
1166
- getLibrary(): Promise<string | null>;
1167
- /**
1168
- * Gets the icon size.
1169
- *
1170
- * @returns Promise resolving to the icon size.
1171
- *
1172
- * @example
1173
- * ```typescript
1174
- * const icon = await loader.getHarness(TnIconHarness);
1175
- * const size = await icon.getSize();
1176
- * expect(size).toBe('lg');
1177
- * ```
1178
- */
1179
- getSize(): Promise<string | null>;
1180
- /**
1181
- * Gets the icon color.
1182
- *
1183
- * @returns Promise resolving to the icon color.
1184
- *
1185
- * @example
1186
- * ```typescript
1187
- * const icon = await loader.getHarness(TnIconHarness);
1188
- * const color = await icon.getColor();
1189
- * expect(color).toBe('primary');
1190
- * ```
1191
- */
1192
- getColor(): Promise<string | null>;
1193
- /**
1194
- * Checks if the icon is in full-size mode.
1195
- *
1196
- * @returns Promise resolving to true if the icon is full-size, false otherwise.
1197
- *
1198
- * @example
1199
- * ```typescript
1200
- * const icon = await loader.getHarness(TnIconHarness);
1201
- * const isFullSize = await icon.isFullSize();
1202
- * expect(isFullSize).toBe(true);
1203
- * ```
1204
- */
1205
- isFullSize(): Promise<boolean>;
1206
- /**
1207
- * Gets the icon custom size.
1208
- *
1209
- * @returns Promise resolving to the custom size value, or null if not set.
1210
- *
1211
- * @example
1212
- * ```typescript
1213
- * const icon = await loader.getHarness(TnIconHarness);
1214
- * const customSize = await icon.getCustomSize();
1215
- * expect(customSize).toBe('64px');
1216
- * ```
1217
- */
1218
- getCustomSize(): Promise<string | null>;
1219
- /**
1220
- * Checks if the icon is using a custom size.
1221
- *
1222
- * @returns Promise resolving to true if a custom size is set, false otherwise.
1223
- *
1224
- * @example
1225
- * ```typescript
1226
- * const icon = await loader.getHarness(TnIconHarness);
1227
- * const hasCustomSize = await icon.hasCustomSize();
1228
- * expect(hasCustomSize).toBe(true);
1229
- * ```
1230
- */
1231
- hasCustomSize(): Promise<boolean>;
1232
- /**
1233
- * Clicks the icon.
1234
- *
1235
- * @returns Promise that resolves when the click action is complete.
1236
- *
1237
- * @example
1238
- * ```typescript
1239
- * const icon = await loader.getHarness(TnIconHarness.with({ name: 'close' }));
1240
- * await icon.click();
1241
- * ```
1242
- */
1243
- click(): Promise<void>;
1244
- }
1245
- /**
1246
- * A set of criteria that can be used to filter a list of `TnIconHarness` instances.
1247
- */
1248
- interface IconHarnessFilters extends BaseHarnessFilters {
1249
- /** Filters by icon name. */
1250
- name?: string;
1251
- /** Filters by icon library (material, mdi, custom, lucide). */
1252
- library?: string;
1253
- /** Filters by icon size (xs, sm, md, lg, xl). */
1254
- size?: string;
1255
- /** Filters by full-size mode. */
1256
- fullSize?: boolean;
1257
- /** Filters by custom size value. */
1258
- customSize?: string;
1259
- }
1260
-
1261
1747
  /**
1262
1748
  * Default base path for sprite assets (namespaced to avoid collisions with consumer apps)
1263
1749
  * This should match the value in sprite-config-interface.ts
@@ -3251,5 +3737,5 @@ declare const TN_THEME_DEFINITIONS: readonly TnThemeDefinition[];
3251
3737
  */
3252
3738
  declare const THEME_MAP: Map<TnTheme, TnThemeDefinition>;
3253
3739
 
3254
- export { CommonShortcuts, DEFAULT_THEME, DiskIconComponent, DiskType, FileSizePipe, InputType, LinuxModifierKeys, LinuxShortcuts, ModifierKeys, QuickShortcuts, ShortcutBuilder, StripMntPrefixPipe, THEME_MAP, THEME_STORAGE_KEY, TN_THEME_DEFINITIONS, TnBannerActionDirective, TnBannerComponent, TnBannerHarness, TnBrandedSpinnerComponent, TnButtonComponent, TnButtonHarness, TnButtonToggleComponent, TnButtonToggleGroupComponent, TnCalendarComponent, TnCalendarHeaderComponent, TnCardComponent, TnCellDefDirective, TnCheckboxComponent, TnChipComponent, TnConfirmDialogComponent, TnDateInputComponent, TnDateRangeInputComponent, TnDialog, TnDialogShellComponent, TnDividerComponent, TnDividerDirective, TnExpansionPanelComponent, TnFilePickerComponent, TnFilePickerPopupComponent, TnFormFieldComponent, TnHeaderCellDefDirective, TnIconButtonComponent, TnIconButtonHarness, TnIconComponent, TnIconHarness, TnIconRegistryService, TnIconTesting, TnInputComponent, TnInputDirective, TnKeyboardShortcutComponent, TnKeyboardShortcutService, TnListAvatarDirective, TnListComponent, TnListIconDirective, TnListItemComponent, TnListItemLineDirective, TnListItemPrimaryDirective, TnListItemSecondaryDirective, TnListItemTitleDirective, TnListItemTrailingDirective, TnListOptionComponent, TnListSubheaderComponent, TnMenuComponent, TnMenuTriggerDirective, TnMonthViewComponent, TnMultiYearViewComponent, TnNestedTreeNodeComponent, TnParticleProgressBarComponent, TnProgressBarComponent, TnRadioComponent, TnSelectComponent, TnSelectHarness, TnSelectionListComponent, TnSlideToggleComponent, TnSliderComponent, TnSliderThumbDirective, TnSliderWithLabelDirective, TnSpinnerComponent, TnSpriteLoaderService, TnStepComponent, TnStepperComponent, TnTabComponent, TnTabPanelComponent, TnTableColumnDirective, TnTableComponent, TnTabsComponent, TnTheme, TnThemeService, TnTimeInputComponent, TnTooltipComponent, TnTooltipDirective, TnTreeComponent, TnTreeFlatDataSource, TnTreeFlattener, TnTreeNodeComponent, TnTreeNodeOutletDirective, TruncatePathPipe, WindowsModifierKeys, WindowsShortcuts, createLucideLibrary, createShortcut, defaultSpriteBasePath, defaultSpriteConfigPath, libIconMarker, registerLucideIcons, setupLucideIntegration, tnIconMarker };
3255
- export type { BannerHarnessFilters, ButtonHarnessFilters, CalendarCell, ChipColor, CreateFolderEvent, DateRange, FilePickerCallbacks, FilePickerError, FilePickerMode, FileSystemItem, IconButtonHarnessFilters, IconHarnessFilters, IconLibrary, IconLibraryType, IconResult, IconSize, IconSource, IconTestingMockOverrides, KeyCombination, LabelType, LucideIconOptions, MockIconRegistry, MockSpriteLoader, PathSegment, PlatformType, ProgressBarMode, ResolvedIcon, SelectHarnessFilters, ShortcutHandler, SlideToggleColor, SpinnerMode, SpriteConfig, TabChangeEvent, TnBannerType, TnButtonToggleType, TnCardAction, TnCardControl, TnCardFooterLink, TnCardHeaderStatus, TnConfirmDialogData, TnDialogDefaults, TnDialogOpenTarget, TnFlatTreeNode, TnMenuItem, TnSelectOption, TnSelectOptionGroup, TnSelectionChange, TnTableDataSource, TnThemeDefinition, TooltipPosition, YearCell };
3740
+ export { CommonShortcuts, DEFAULT_THEME, DiskIconComponent, DiskType, FileSizePipe, InputType, LinuxModifierKeys, LinuxShortcuts, ModifierKeys, QuickShortcuts, ShortcutBuilder, StripMntPrefixPipe, THEME_MAP, THEME_STORAGE_KEY, TN_THEME_DEFINITIONS, TnBannerActionDirective, TnBannerComponent, TnBannerHarness, TnBrandedSpinnerComponent, TnButtonComponent, TnButtonHarness, TnButtonToggleComponent, TnButtonToggleGroupComponent, TnCalendarComponent, TnCalendarHeaderComponent, TnCardComponent, TnCellDefDirective, TnCheckboxComponent, TnChipComponent, TnConfirmDialogComponent, TnDateInputComponent, TnDateRangeInputComponent, TnDialog, TnDialogShellComponent, TnDividerComponent, TnDividerDirective, TnExpansionPanelComponent, TnFilePickerComponent, TnFilePickerPopupComponent, TnFormFieldComponent, TnHeaderCellDefDirective, TnIconButtonComponent, TnIconButtonHarness, TnIconComponent, TnIconHarness, TnIconRegistryService, TnIconTesting, TnInputComponent, TnInputDirective, TnInputHarness, TnKeyboardShortcutComponent, TnKeyboardShortcutService, TnListAvatarDirective, TnListComponent, TnListIconDirective, TnListItemComponent, TnListItemLineDirective, TnListItemPrimaryDirective, TnListItemSecondaryDirective, TnListItemTitleDirective, TnListItemTrailingDirective, TnListOptionComponent, TnListSubheaderComponent, TnMenuComponent, TnMenuTriggerDirective, TnMonthViewComponent, TnMultiYearViewComponent, TnNestedTreeNodeComponent, TnParticleProgressBarComponent, TnProgressBarComponent, TnRadioComponent, TnSelectComponent, TnSelectHarness, TnSelectionListComponent, TnSlideToggleComponent, TnSliderComponent, TnSliderThumbDirective, TnSliderWithLabelDirective, TnSpinnerComponent, TnSpriteLoaderService, TnStepComponent, TnStepperComponent, TnTabComponent, TnTabHarness, TnTabPanelComponent, TnTabPanelHarness, TnTableColumnDirective, TnTableComponent, TnTabsComponent, TnTabsHarness, TnTheme, TnThemeService, TnTimeInputComponent, TnTooltipComponent, TnTooltipDirective, TnTreeComponent, TnTreeFlatDataSource, TnTreeFlattener, TnTreeNodeComponent, TnTreeNodeOutletDirective, TruncatePathPipe, WindowsModifierKeys, WindowsShortcuts, createLucideLibrary, createShortcut, defaultSpriteBasePath, defaultSpriteConfigPath, libIconMarker, registerLucideIcons, setupLucideIntegration, tnIconMarker };
3741
+ export type { BannerHarnessFilters, ButtonHarnessFilters, CalendarCell, ChipColor, CreateFolderEvent, DateRange, FilePickerCallbacks, FilePickerError, FilePickerMode, FileSystemItem, IconButtonHarnessFilters, IconHarnessFilters, IconLibrary, IconLibraryType, IconResult, IconSize, IconSource, IconTestingMockOverrides, InputHarnessFilters, KeyCombination, LabelType, LucideIconOptions, MockIconRegistry, MockSpriteLoader, PathSegment, PlatformType, ProgressBarMode, ResolvedIcon, SelectHarnessFilters, ShortcutHandler, SlideToggleColor, SpinnerMode, SpriteConfig, TabChangeEvent, TabHarnessFilters, TabPanelHarnessFilters, TabsHarnessFilters, TnBannerType, TnButtonToggleType, TnCardAction, TnCardControl, TnCardFooterLink, TnCardHeaderStatus, TnConfirmDialogData, TnDialogDefaults, TnDialogOpenTarget, TnFlatTreeNode, TnMenuItem, TnSelectOption, TnSelectOptionGroup, TnSelectionChange, TnTableDataSource, TnThemeDefinition, TooltipPosition, YearCell };