@truenas/ui-components 0.1.68 → 0.1.69

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@truenas/ui-components",
3
- "version": "0.1.68",
3
+ "version": "0.1.69",
4
4
  "publishConfig": {
5
5
  "registry": "https://registry.npmjs.org",
6
6
  "access": "public"
@@ -1,5 +1,5 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { OnDestroy, ElementRef, AfterViewInit, OnInit, TemplateRef, AfterContentInit, Provider, ChangeDetectorRef, InjectionToken, Signal, PipeTransform, ViewContainerRef, AfterViewChecked, ComponentRef } from '@angular/core';
2
+ import { OnDestroy, ElementRef, InjectionToken, AfterViewInit, OnInit, TemplateRef, AfterContentInit, Provider, ChangeDetectorRef, Signal, PipeTransform, ViewContainerRef, AfterViewChecked, ComponentRef } from '@angular/core';
3
3
  import { ControlValueAccessor, NgControl } from '@angular/forms';
4
4
  import { ComponentHarness, BaseHarnessFilters, HarnessPredicate, HarnessLoader } from '@angular/cdk/testing';
5
5
  import { SafeHtml, SafeResourceUrl, DomSanitizer } from '@angular/platform-browser';
@@ -11,7 +11,7 @@ import * as i1 from '@angular/cdk/tree';
11
11
  import { CdkTree, FlatTreeControl, CdkTreeNode, CdkNestedTreeNode } from '@angular/cdk/tree';
12
12
  export { FlatTreeControl } from '@angular/cdk/tree';
13
13
  import { Overlay } from '@angular/cdk/overlay';
14
- import { DialogConfig, DialogRef } from '@angular/cdk/dialog';
14
+ import { DialogRef, DialogConfig } from '@angular/cdk/dialog';
15
15
  import { ComponentType } from '@angular/cdk/portal';
16
16
 
17
17
  declare class TnAutocompleteComponent<T = unknown> implements ControlValueAccessor, OnDestroy {
@@ -289,6 +289,113 @@ interface AutocompleteHarnessFilters extends BaseHarnessFilters {
289
289
  placeholder?: string;
290
290
  }
291
291
 
292
+ /**
293
+ * Value shapes accepted as a test-id base.
294
+ *
295
+ * A consumer supplies the *semantic* part of a test id — a single token
296
+ * (`'save'`, `'username'`) or an ordered list of segments
297
+ * (`['username', option.value]`). The library owns the element-type prefix and
298
+ * the final string assembly; consumers never hand-craft the full id.
299
+ */
300
+ type TnTestIdValue = string | number | (string | number | null | undefined)[] | null | undefined;
301
+ /**
302
+ * Normalize one segment to a kebab-case token: split camelCase, lower-case,
303
+ * collapse any run of non-alphanumeric characters to a single hyphen, and trim
304
+ * leading/trailing hyphens.
305
+ *
306
+ * Mirrors the normalization webui's legacy `ixTest` directive applied via
307
+ * lodash `kebabCase`, so migrated values stay stable (`sshPort` → `ssh-port`,
308
+ * `addr_trtype` → `addr-trtype`, `'My Label'` → `my-label`).
309
+ */
310
+ declare function kebabTestSegment(part: string | number): string;
311
+ /**
312
+ * Compose the canonical test-id string: `${type}-${...segments}`.
313
+ *
314
+ * - `type` is the element-type prefix the component declares (e.g. `'button'`,
315
+ * `'option'`, `'menu-item'`). Pass `null`/`undefined` for no prefix.
316
+ * - `value` is the consumer-provided base — a single token or an array of
317
+ * segments (used to scope dynamic/repeated children, e.g. `[base, item.id]`).
318
+ *
319
+ * Falsy/empty parts are dropped, every part is kebab-normalized, and parts are
320
+ * joined with `-`. Returns `''` when nothing usable remains — callers treat
321
+ * `''` as "render no attribute" (avoids `data-testid=""`).
322
+ *
323
+ * @example
324
+ * composeTestId('button', 'save') // 'button-save'
325
+ * composeTestId('option', ['username', 'Jane Doe'])// 'option-username-jane-doe'
326
+ * composeTestId('menu-item', [undefined, 'edit']) // 'menu-item-edit' (no base → unscoped)
327
+ * composeTestId('menu-item', ['actions', 'edit']) // 'menu-item-actions-edit'
328
+ * composeTestId(undefined, 'already-made') // 'already-made' (verbatim passthrough)
329
+ * composeTestId('button', 'button-first-page') // 'button-first-page' (idempotent — not doubled)
330
+ */
331
+ declare function composeTestId(type: string | null | undefined, value: TnTestIdValue): string;
332
+
333
+ /**
334
+ * Test-id attribute names supported by the library.
335
+ *
336
+ * - `'data-testid'` is the modern industry default and the library's out-of-the-box behavior.
337
+ * - `'data-test'` exists for consumers that have an established convention they don't want to disrupt
338
+ * (notably webui, which has thousands of selectors targeting `data-test`).
339
+ */
340
+ type TnTestAttrName = 'data-test' | 'data-testid';
341
+ /**
342
+ * Controls which attribute name the library renders `testId` values to.
343
+ *
344
+ * Defaults to `'data-testid'`. Consumers can override at the application root:
345
+ *
346
+ * ```ts
347
+ * bootstrapApplication(AppComponent, {
348
+ * providers: [
349
+ * { provide: TN_TEST_ATTR, useValue: 'data-test' },
350
+ * ],
351
+ * });
352
+ * ```
353
+ *
354
+ * Every component-level `testId` input and every `[tnTestId]` directive usage reads this token
355
+ * so that a single override switches the entire library consistently.
356
+ */
357
+ declare const TN_TEST_ATTR: InjectionToken<TnTestAttrName>;
358
+
359
+ /**
360
+ * Writes a composed `testId` value to whichever attribute name is configured via
361
+ * {@link TN_TEST_ATTR} (default `data-testid`).
362
+ *
363
+ * The library owns the whole id: the consumer passes only the *semantic* base
364
+ * (`tnTestId`), the component declares its element type (`tnTestIdType`), and
365
+ * this directive assembles `${type}-${base}` (kebab-cased, see
366
+ * {@link composeTestId}). When no `tnTestIdType` is set the value is written
367
+ * verbatim, so existing call sites are unaffected.
368
+ *
369
+ * @example
370
+ * ```html
371
+ * <!-- component-owned prefix: emits data-testid="button-save" -->
372
+ * <button [tnTestId]="'save'" tnTestIdType="button">Save</button>
373
+ *
374
+ * <!-- array base scopes a dynamic child: emits data-testid="option-username-jane-doe" -->
375
+ * <li [tnTestId]="['username', option.label]" tnTestIdType="option"></li>
376
+ *
377
+ * <!-- no type: written verbatim (legacy behavior) -->
378
+ * <button [tnTestId]="myTestId()">Click me</button>
379
+ * ```
380
+ *
381
+ * Falsy / empty results remove the attribute entirely (avoids `data-testid=""`).
382
+ */
383
+ declare class TnTestIdDirective {
384
+ private readonly renderer;
385
+ private readonly host;
386
+ private readonly attrName;
387
+ /** The semantic base value (token or ordered segments). Falsy parts are dropped. */
388
+ readonly testId: _angular_core.InputSignal<TnTestIdValue>;
389
+ /**
390
+ * Element-type prefix the component declares (e.g. `'button'`, `'option'`).
391
+ * Omit to write the base verbatim with no prefix.
392
+ */
393
+ readonly tnTestIdType: _angular_core.InputSignal<string | null | undefined>;
394
+ constructor();
395
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnTestIdDirective, never>;
396
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<TnTestIdDirective, "[tnTestId]", never, { "testId": { "alias": "tnTestId"; "required": false; "isSignal": true; }; "tnTestIdType": { "alias": "tnTestIdType"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
397
+ }
398
+
292
399
  type TnDrawerMode = 'side' | 'over';
293
400
  type TnDrawerPosition = 'start' | 'end';
294
401
  declare class TnDrawerComponent implements OnDestroy {
@@ -309,7 +416,7 @@ declare class TnDrawerComponent implements OnDestroy {
309
416
  * Test-id applied to the drawer panel. Rendered under whichever attribute name is
310
417
  * configured via `TN_TEST_ATTR` (default `data-testid`).
311
418
  */
312
- testId: _angular_core.InputSignal<string | undefined>;
419
+ testId: _angular_core.InputSignal<TnTestIdValue>;
313
420
  /** Fires after the open transition completes */
314
421
  openedComplete: _angular_core.OutputEmitterRef<void>;
315
422
  /** Fires after the close transition completes */
@@ -568,10 +675,13 @@ declare class TnButtonComponent implements AfterViewInit {
568
675
  label: _angular_core.InputSignal<string>;
569
676
  disabled: _angular_core.InputSignal<boolean>;
570
677
  /**
571
- * Test-id applied to the rendered element. Rendered under whichever attribute
572
- * name is configured via `TN_TEST_ATTR` (default `data-testid`).
678
+ * Semantic test-id base for the rendered element. The library prepends the
679
+ * element type (`button`) and renders the result under whichever attribute
680
+ * name is configured via `TN_TEST_ATTR` (default `data-testid`) — e.g.
681
+ * `testId="save"` → `button-save`. Accepts an array of segments to scope the
682
+ * id (e.g. `[formControlName, 'submit']`).
573
683
  */
574
- testId: _angular_core.InputSignal<string | undefined>;
684
+ testId: _angular_core.InputSignal<TnTestIdValue>;
575
685
  /**
576
686
  * Renders the button as an `<a>` with a plain `href` attribute.
577
687
  * Mutually exclusive with `routerLink` — if both are provided, `routerLink` wins.
@@ -807,10 +917,12 @@ declare class TnIconButtonComponent implements AfterViewInit {
807
917
  /** Reflects an expanded/collapsed state (e.g. toggling a panel) onto the inner button. */
808
918
  ariaExpanded: _angular_core.InputSignal<boolean | undefined>;
809
919
  /**
810
- * Test-id applied to the rendered `<button>` element. Rendered under whichever attribute
811
- * name is configured via `TN_TEST_ATTR` (default `data-testid`).
920
+ * Semantic test-id base for the rendered `<button>`. The library prepends the
921
+ * element type (`button`) and renders the result under whichever attribute
922
+ * name is configured via `TN_TEST_ATTR` (default `data-testid`) — e.g.
923
+ * `testId="first-page"` → `button-first-page`.
812
924
  */
813
- testId: _angular_core.InputSignal<string | undefined>;
925
+ testId: _angular_core.InputSignal<TnTestIdValue>;
814
926
  name: _angular_core.InputSignal<string>;
815
927
  size: _angular_core.InputSignal<IconSize>;
816
928
  color: _angular_core.InputSignal<string | undefined>;
@@ -996,7 +1108,7 @@ declare class TnInputComponent implements AfterViewInit, OnDestroy, ControlValue
996
1108
  inputEl: _angular_core.Signal<ElementRef<HTMLInputElement | HTMLTextAreaElement>>;
997
1109
  inputType: _angular_core.InputSignal<InputType>;
998
1110
  placeholder: _angular_core.InputSignal<string>;
999
- testId: _angular_core.InputSignal<string | undefined>;
1111
+ testId: _angular_core.InputSignal<TnTestIdValue>;
1000
1112
  disabled: _angular_core.InputSignal<boolean>;
1001
1113
  multiline: _angular_core.InputSignal<boolean>;
1002
1114
  rows: _angular_core.InputSignal<number>;
@@ -1403,7 +1515,7 @@ declare class TnChipComponent implements AfterViewInit, OnDestroy {
1403
1515
  closable: _angular_core.InputSignal<boolean>;
1404
1516
  disabled: _angular_core.InputSignal<boolean>;
1405
1517
  color: _angular_core.InputSignal<ChipColor>;
1406
- testId: _angular_core.InputSignal<string | undefined>;
1518
+ testId: _angular_core.InputSignal<TnTestIdValue>;
1407
1519
  onClose: _angular_core.OutputEmitterRef<void>;
1408
1520
  onClick: _angular_core.OutputEmitterRef<MouseEvent>;
1409
1521
  private focusMonitor;
@@ -1570,6 +1682,14 @@ interface TnMenuItem {
1570
1682
  declare class TnMenuComponent implements OnDestroy {
1571
1683
  items: _angular_core.InputSignal<TnMenuItem[]>;
1572
1684
  contextMenu: _angular_core.InputSignal<boolean>;
1685
+ /**
1686
+ * Semantic base that scopes the test ids of this menu's items. Each item
1687
+ * resolves to `menu-item-${testId}-${item.id}` (e.g. menu `testId="actions"`
1688
+ * + item `id="edit"` → `menu-item-actions-edit`), which keeps ids unique when
1689
+ * several menus render on one page. Omit it and items fall back to the
1690
+ * unscoped `menu-item-${item.id}`. A per-item `testId` overrides both.
1691
+ */
1692
+ testId: _angular_core.InputSignal<string | undefined>;
1573
1693
  menuItemClick: _angular_core.OutputEmitterRef<TnMenuItem>;
1574
1694
  menuOpen: _angular_core.OutputEmitterRef<void>;
1575
1695
  menuClose: _angular_core.OutputEmitterRef<void>;
@@ -1599,7 +1719,7 @@ declare class TnMenuComponent implements OnDestroy {
1599
1719
  ngOnDestroy(): void;
1600
1720
  onContextMenu(event: MouseEvent): void;
1601
1721
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnMenuComponent, never>;
1602
- 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"], ["*"], true, never>;
1722
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnMenuComponent, "tn-menu", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "contextMenu": { "alias": "contextMenu"; "required": false; "isSignal": true; }; "testId": { "alias": "testId"; "required": false; "isSignal": true; }; }, { "menuItemClick": "menuItemClick"; "menuOpen": "menuOpen"; "menuClose": "menuClose"; }, ["contentItems"], ["*"], true, never>;
1603
1723
  }
1604
1724
 
1605
1725
  declare class TnCardComponent {
@@ -1655,11 +1775,11 @@ declare class TnExpansionPanelComponent {
1655
1775
  * Test-id applied to the panel's root element. Rendered under whichever attribute name
1656
1776
  * is configured via `TN_TEST_ATTR` (default `data-testid`).
1657
1777
  */
1658
- testId: _angular_core.InputSignal<string | undefined>;
1778
+ testId: _angular_core.InputSignal<TnTestIdValue>;
1659
1779
  /**
1660
1780
  * Test-id applied to the expand/collapse toggle header button.
1661
1781
  */
1662
- toggleTestId: _angular_core.InputSignal<string | undefined>;
1782
+ toggleTestId: _angular_core.InputSignal<TnTestIdValue>;
1663
1783
  expandedChange: _angular_core.OutputEmitterRef<boolean>;
1664
1784
  toggleEvent: _angular_core.OutputEmitterRef<void>;
1665
1785
  private internalExpanded;
@@ -1810,7 +1930,7 @@ declare class TnCheckboxComponent implements AfterViewInit, OnDestroy, ControlVa
1810
1930
  disabled: _angular_core.InputSignal<boolean>;
1811
1931
  required: _angular_core.InputSignal<boolean>;
1812
1932
  indeterminate: _angular_core.InputSignal<boolean>;
1813
- testId: _angular_core.InputSignal<string | undefined>;
1933
+ testId: _angular_core.InputSignal<TnTestIdValue>;
1814
1934
  error: _angular_core.InputSignal<string | null>;
1815
1935
  checked: _angular_core.InputSignal<boolean>;
1816
1936
  change: _angular_core.OutputEmitterRef<boolean>;
@@ -2019,7 +2139,7 @@ declare class TnRadioComponent implements AfterViewInit, OnDestroy, ControlValue
2019
2139
  name: _angular_core.InputSignal<string | undefined>;
2020
2140
  disabled: _angular_core.InputSignal<boolean>;
2021
2141
  required: _angular_core.InputSignal<boolean>;
2022
- testId: _angular_core.InputSignal<string | undefined>;
2142
+ testId: _angular_core.InputSignal<TnTestIdValue>;
2023
2143
  error: _angular_core.InputSignal<string | null>;
2024
2144
  change: _angular_core.OutputEmitterRef<unknown>;
2025
2145
  id: string;
@@ -2162,7 +2282,7 @@ declare class TnSlideToggleComponent implements AfterViewInit, OnDestroy, Contro
2162
2282
  disabled: _angular_core.InputSignal<boolean>;
2163
2283
  required: _angular_core.InputSignal<boolean>;
2164
2284
  color: _angular_core.InputSignal<SlideToggleColor>;
2165
- testId: _angular_core.InputSignal<string | undefined>;
2285
+ testId: _angular_core.InputSignal<TnTestIdValue>;
2166
2286
  ariaLabel: _angular_core.InputSignal<string | undefined>;
2167
2287
  ariaLabelledby: _angular_core.InputSignal<string | undefined>;
2168
2288
  checked: _angular_core.InputSignal<boolean>;
@@ -2275,7 +2395,7 @@ declare class TnTabComponent implements AfterContentInit {
2275
2395
  disabled: _angular_core.InputSignal<boolean>;
2276
2396
  icon: _angular_core.InputSignal<string | undefined>;
2277
2397
  iconTemplate: _angular_core.InputSignal<TemplateRef<unknown> | undefined>;
2278
- testId: _angular_core.InputSignal<string | undefined>;
2398
+ testId: _angular_core.InputSignal<TnTestIdValue>;
2279
2399
  selected: _angular_core.OutputEmitterRef<void>;
2280
2400
  iconContent: _angular_core.Signal<TemplateRef<unknown> | undefined>;
2281
2401
  index: _angular_core.WritableSignal<number>;
@@ -2299,7 +2419,7 @@ declare class TnTabComponent implements AfterContentInit {
2299
2419
  declare class TnTabPanelComponent {
2300
2420
  label: _angular_core.InputSignal<string>;
2301
2421
  lazyLoad: _angular_core.InputSignal<boolean>;
2302
- testId: _angular_core.InputSignal<string | undefined>;
2422
+ testId: _angular_core.InputSignal<TnTestIdValue>;
2303
2423
  content: _angular_core.Signal<TemplateRef<unknown>>;
2304
2424
  index: _angular_core.WritableSignal<number>;
2305
2425
  isActive: _angular_core.WritableSignal<boolean>;
@@ -2328,7 +2448,7 @@ declare class TnTabsComponent implements AfterContentInit, AfterViewInit, OnDest
2328
2448
  * Test-id applied to the tablist root element. Rendered under whichever attribute name
2329
2449
  * is configured via `TN_TEST_ATTR` (default `data-testid`).
2330
2450
  */
2331
- testId: _angular_core.InputSignal<string | undefined>;
2451
+ testId: _angular_core.InputSignal<TnTestIdValue>;
2332
2452
  selectedIndexChange: _angular_core.OutputEmitterRef<number>;
2333
2453
  tabChange: _angular_core.OutputEmitterRef<TabChangeEvent>;
2334
2454
  private internalSelectedIndex;
@@ -2963,7 +3083,7 @@ declare class TnFormFieldComponent implements AfterContentInit {
2963
3083
  label: _angular_core.InputSignal<string>;
2964
3084
  hint: _angular_core.InputSignal<string>;
2965
3085
  required: _angular_core.InputSignal<boolean>;
2966
- testId: _angular_core.InputSignal<string>;
3086
+ testId: _angular_core.InputSignal<TnTestIdValue>;
2967
3087
  subscriptSizing: _angular_core.InputSignal<SubscriptSizing>;
2968
3088
  /** Optional tooltip shown via a help icon next to the label. */
2969
3089
  tooltip: _angular_core.InputSignal<string>;
@@ -3195,6 +3315,18 @@ declare class TnSelectComponent<T = unknown> implements ControlValueAccessor, On
3195
3315
  disabled: _angular_core.InputSignal<boolean>;
3196
3316
  testId: _angular_core.InputSignal<string>;
3197
3317
  multiple: _angular_core.InputSignal<boolean>;
3318
+ /**
3319
+ * Optional extractor for the per-option test-id discriminator. Defaults to
3320
+ * the option's `value` (when a string/number) or its `label`. Provide this
3321
+ * when option values are objects, or to pick a more stable/unique key —
3322
+ * mirrors webui's `[ixTest]="[controlName, option.<field>]"` discriminator.
3323
+ *
3324
+ * @example
3325
+ * ```html
3326
+ * <tn-select testId="user" [optionTestIdKey]="(o) => o.value.id" ... />
3327
+ * ```
3328
+ */
3329
+ optionTestIdKey: _angular_core.InputSignal<((option: TnSelectOption<T>) => string | number | null | undefined) | undefined>;
3198
3330
  /**
3199
3331
  * Custom comparator for matching option values against the selected value(s).
3200
3332
  *
@@ -3244,6 +3376,15 @@ declare class TnSelectComponent<T = unknown> implements ControlValueAccessor, On
3244
3376
  optionId(option: TnSelectOption<T>): string | null;
3245
3377
  /** Whether `option` is the keyboard-highlighted item. */
3246
3378
  isOptionFocused(option: TnSelectOption<T>): boolean;
3379
+ /**
3380
+ * Test-id segments for an option row, consumed by `[tnTestId]` with
3381
+ * `tnTestIdType="option"`. The select's `testId` scopes each option so ids
3382
+ * stay unique across selects: base `quick-filters` + option value `ssd` →
3383
+ * `option-quick-filters-ssd`; with no base → `option-ssd`. The discriminator
3384
+ * comes from `optionTestIdKey` when provided, else the option's primitive
3385
+ * `value`, else its `label`.
3386
+ */
3387
+ protected optionTestIdParts(option: TnSelectOption<T>): (string | number | null | undefined)[];
3247
3388
  private onChange;
3248
3389
  private onTouched;
3249
3390
  private elementRef;
@@ -3330,7 +3471,7 @@ declare class TnSelectComponent<T = unknown> implements ControlValueAccessor, On
3330
3471
  private activateFocusedOption;
3331
3472
  private scrollFocusedIntoView;
3332
3473
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnSelectComponent<any>, never>;
3333
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnSelectComponent<any>, "tn-select", never, { "options": { "alias": "options"; "required": false; "isSignal": true; }; "optionGroups": { "alias": "optionGroups"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "noOptionsLabel": { "alias": "noOptionsLabel"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "testId": { "alias": "testId"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; }, { "selectionChange": "selectionChange"; "multiSelectionChange": "multiSelectionChange"; }, never, never, true, never>;
3474
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnSelectComponent<any>, "tn-select", never, { "options": { "alias": "options"; "required": false; "isSignal": true; }; "optionGroups": { "alias": "optionGroups"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "noOptionsLabel": { "alias": "noOptionsLabel"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "testId": { "alias": "testId"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "optionTestIdKey": { "alias": "optionTestIdKey"; "required": false; "isSignal": true; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; }, { "selectionChange": "selectionChange"; "multiSelectionChange": "multiSelectionChange"; }, never, never, true, never>;
3334
3475
  }
3335
3476
 
3336
3477
  /**
@@ -4022,32 +4163,6 @@ declare class TnListOptionComponent implements AfterContentInit {
4022
4163
  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>;
4023
4164
  }
4024
4165
 
4025
- /**
4026
- * Primitive directive that writes a raw `testId` value to whichever attribute name has been
4027
- * configured via {@link TN_TEST_ATTR} (default `data-testid`).
4028
- *
4029
- * Library components should use this directive instead of hard-coding `[attr.data-testid]` so
4030
- * the attribute name remains centrally controlled and consumers with different conventions
4031
- * (e.g. `data-test`) can opt in with a single root-level provider.
4032
- *
4033
- * @example
4034
- * ```html
4035
- * <button [tnTestId]="myTestId()">Click me</button>
4036
- * ```
4037
- *
4038
- * Passing `null` / `undefined` / `''` removes the attribute entirely (avoids `data-testid=""`).
4039
- */
4040
- declare class TnTestIdDirective {
4041
- private readonly renderer;
4042
- private readonly host;
4043
- private readonly attrName;
4044
- /** The raw test-id value to apply. Falsy values remove the attribute. */
4045
- readonly testId: _angular_core.InputSignal<string | null | undefined>;
4046
- constructor();
4047
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnTestIdDirective, never>;
4048
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<TnTestIdDirective, "[tnTestId]", never, { "testId": { "alias": "tnTestId"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
4049
- }
4050
-
4051
4166
  interface TnSelectionChange {
4052
4167
  source: TnSelectionListComponent;
4053
4168
  options: TnListOptionComponent[];
@@ -4486,6 +4601,14 @@ interface TnTableDataProvider {
4486
4601
  */
4487
4602
  declare class TnTablePagerComponent {
4488
4603
  private destroyRef;
4604
+ private readonly testIdDirective;
4605
+ /**
4606
+ * Build a child control's test-id base by joining the pager's `testId` with
4607
+ * `suffix` into a single string (kebab-joined). Returning a string keeps it
4608
+ * assignable to both `tn-select`'s `string` testId and `tn-icon-button`'s
4609
+ * `TnTestIdValue` testId.
4610
+ */
4611
+ protected childTestId(suffix: string): string;
4489
4612
  /**
4490
4613
  * Normalize the injected token into a Signal so consumers can supply either
4491
4614
  * a plain object or a reactive signal (e.g. derived from a TranslateService's
@@ -5556,7 +5679,7 @@ declare class TnSliderComponent implements ControlValueAccessor, OnDestroy, Afte
5556
5679
  * Test-id applied to the slider's root container. Rendered under whichever attribute name
5557
5680
  * is configured via `TN_TEST_ATTR` (default `data-testid`).
5558
5681
  */
5559
- testId: _angular_core.InputSignal<string | undefined>;
5682
+ testId: _angular_core.InputSignal<TnTestIdValue>;
5560
5683
  thumbDirective: _angular_core.Signal<TnSliderThumbDirective>;
5561
5684
  sliderContainer: _angular_core.Signal<ElementRef<HTMLDivElement>>;
5562
5685
  thumbVisual: _angular_core.Signal<ElementRef<HTMLDivElement>>;
@@ -5637,7 +5760,7 @@ declare class TnButtonToggleGroupComponent implements ControlValueAccessor {
5637
5760
  * Test-id applied to the group root. Rendered under whichever attribute name
5638
5761
  * is configured via `TN_TEST_ATTR` (default `data-testid`).
5639
5762
  */
5640
- testId: _angular_core.InputSignal<string | undefined>;
5763
+ testId: _angular_core.InputSignal<TnTestIdValue>;
5641
5764
  change: _angular_core.OutputEmitterRef<{
5642
5765
  source: TnButtonToggleComponent;
5643
5766
  value: unknown;
@@ -5675,7 +5798,7 @@ declare class TnButtonToggleComponent implements ControlValueAccessor {
5675
5798
  * Test-id applied to the rendered toggle button. Rendered under whichever attribute name
5676
5799
  * is configured via `TN_TEST_ATTR` (default `data-testid`).
5677
5800
  */
5678
- testId: _angular_core.InputSignal<string | undefined>;
5801
+ testId: _angular_core.InputSignal<TnTestIdValue>;
5679
5802
  change: _angular_core.OutputEmitterRef<{
5680
5803
  source: TnButtonToggleComponent;
5681
5804
  value: unknown;
@@ -5868,6 +5991,27 @@ declare class TnTooltipComponent {
5868
5991
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnTooltipComponent, "tn-tooltip", never, { "message": { "alias": "message"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
5869
5992
  }
5870
5993
 
5994
+ interface TnConfirmDialogData {
5995
+ title: string;
5996
+ message?: string;
5997
+ confirmText?: string;
5998
+ cancelText?: string;
5999
+ destructive?: boolean;
6000
+ /**
6001
+ * Semantic test-id bases for the library-rendered action buttons. The buttons
6002
+ * emit `button-confirm` / `button-cancel` by default (the library adds the
6003
+ * `button-` prefix); override here when a page opens more than one dialog.
6004
+ */
6005
+ confirmTestId?: string;
6006
+ cancelTestId?: string;
6007
+ }
6008
+ declare class TnConfirmDialogComponent {
6009
+ ref: DialogRef<boolean, unknown>;
6010
+ data: TnConfirmDialogData;
6011
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnConfirmDialogComponent, never>;
6012
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnConfirmDialogComponent, "tn-confirm-dialog", never, {}, {}, never, never, true, never>;
6013
+ }
6014
+
5871
6015
  type TnDialogOpenTarget<C> = ComponentType<C> | TemplateRef<unknown>;
5872
6016
  interface TnDialogDefaults {
5873
6017
  panelClass?: string | string[];
@@ -5894,13 +6038,7 @@ declare class TnDialog {
5894
6038
  /**
5895
6039
  * Open a confirmation dialog. Resolves to true if confirmed, false otherwise.
5896
6040
  */
5897
- confirm(opts: {
5898
- title: string;
5899
- message?: string;
5900
- confirmText?: string;
5901
- cancelText?: string;
5902
- destructive?: boolean;
5903
- }): Promise<boolean>;
6041
+ confirm(opts: TnConfirmDialogData): Promise<boolean>;
5904
6042
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnDialog, never>;
5905
6043
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<TnDialog>;
5906
6044
  }
@@ -5908,6 +6046,13 @@ declare class TnDialog {
5908
6046
  declare class TnDialogShellComponent implements OnInit {
5909
6047
  title: _angular_core.InputSignal<string>;
5910
6048
  showFullscreenButton: _angular_core.InputSignal<boolean>;
6049
+ /**
6050
+ * Optional semantic base that scopes the shell's chrome buttons. The close
6051
+ * and fullscreen buttons emit `button-close` / `button-fullscreen` by default,
6052
+ * or `button-<testId>-close` / `-fullscreen` when a base is provided (useful
6053
+ * when more than one dialog can be open).
6054
+ */
6055
+ testId: _angular_core.InputSignal<string | undefined>;
5911
6056
  /** Stable id for the title heading, referenced by the dialog's aria-labelledby. */
5912
6057
  readonly titleId: string;
5913
6058
  isFullscreen: _angular_core.WritableSignal<boolean>;
@@ -5923,21 +6068,7 @@ declare class TnDialogShellComponent implements OnInit {
5923
6068
  private enterFullscreen;
5924
6069
  private exitFullscreen;
5925
6070
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnDialogShellComponent, never>;
5926
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnDialogShellComponent, "tn-dialog-shell", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "showFullscreenButton": { "alias": "showFullscreenButton"; "required": false; "isSignal": true; }; }, {}, never, ["*", "[tnDialogAction]"], true, never>;
5927
- }
5928
-
5929
- interface TnConfirmDialogData {
5930
- title: string;
5931
- message?: string;
5932
- confirmText?: string;
5933
- cancelText?: string;
5934
- destructive?: boolean;
5935
- }
5936
- declare class TnConfirmDialogComponent {
5937
- ref: DialogRef<boolean, unknown>;
5938
- data: TnConfirmDialogData;
5939
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnConfirmDialogComponent, never>;
5940
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnConfirmDialogComponent, "tn-confirm-dialog", never, {}, {}, never, never, true, never>;
6071
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnDialogShellComponent, "tn-dialog-shell", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "showFullscreenButton": { "alias": "showFullscreenButton"; "required": false; "isSignal": true; }; "testId": { "alias": "testId"; "required": false; "isSignal": true; }; }, {}, never, ["*", "[tnDialogAction]"], true, never>;
5941
6072
  }
5942
6073
 
5943
6074
  /**
@@ -6261,7 +6392,7 @@ declare class TnStepperComponent {
6261
6392
  * Test-id applied to the stepper root. Rendered under whichever attribute name
6262
6393
  * is configured via `TN_TEST_ATTR` (default `data-testid`).
6263
6394
  */
6264
- testId: _angular_core.InputSignal<string | undefined>;
6395
+ testId: _angular_core.InputSignal<TnTestIdValue>;
6265
6396
  selectionChange: _angular_core.OutputEmitterRef<{
6266
6397
  selectedIndex: number;
6267
6398
  previouslySelectedIndex: number;
@@ -6810,32 +6941,6 @@ declare class TnKeyboardShortcutService {
6810
6941
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<TnKeyboardShortcutService>;
6811
6942
  }
6812
6943
 
6813
- /**
6814
- * Test-id attribute names supported by the library.
6815
- *
6816
- * - `'data-testid'` is the modern industry default and the library's out-of-the-box behavior.
6817
- * - `'data-test'` exists for consumers that have an established convention they don't want to disrupt
6818
- * (notably webui, which has thousands of selectors targeting `data-test`).
6819
- */
6820
- type TnTestAttrName = 'data-test' | 'data-testid';
6821
- /**
6822
- * Controls which attribute name the library renders `testId` values to.
6823
- *
6824
- * Defaults to `'data-testid'`. Consumers can override at the application root:
6825
- *
6826
- * ```ts
6827
- * bootstrapApplication(AppComponent, {
6828
- * providers: [
6829
- * { provide: TN_TEST_ATTR, useValue: 'data-test' },
6830
- * ],
6831
- * });
6832
- * ```
6833
- *
6834
- * Every component-level `testId` input and every `[tnTestId]` directive usage reads this token
6835
- * so that a single override switches the entire library consistently.
6836
- */
6837
- declare const TN_TEST_ATTR: InjectionToken<TnTestAttrName>;
6838
-
6839
6944
  /**
6840
6945
  * Enum of available theme names.
6841
6946
  * Use these constants instead of hardcoded strings.
@@ -7030,5 +7135,5 @@ declare const TN_THEME_DEFINITIONS: readonly TnThemeDefinition[];
7030
7135
  */
7031
7136
  declare const THEME_MAP: Map<TnTheme, TnThemeDefinition>;
7032
7137
 
7033
- export { CommonShortcuts, DEFAULT_THEME, DiskIconComponent, DiskType, FileSizePipe, InputType, LIGHT_THEME, LinuxModifierKeys, LinuxShortcuts, ModifierKeys, QuickShortcuts, ShortcutBuilder, StripMntPrefixPipe, THEME_MAP, THEME_STORAGE_KEY, TN_TABLE_PAGER_DEFAULT_LABELS, TN_TABLE_PAGER_LABELS, TN_TEST_ATTR, TN_THEME_DEFINITIONS, TnAutocompleteComponent, TnAutocompleteHarness, TnBannerActionDirective, TnBannerComponent, TnBannerHarness, TnBrandedSpinnerComponent, TnButtonComponent, TnButtonHarness, TnButtonToggleComponent, TnButtonToggleGroupComponent, TnButtonToggleGroupHarness, TnButtonToggleHarness, TnCalendarComponent, TnCalendarHeaderComponent, TnCardComponent, TnCardHeaderDirective, TnCellDefDirective, TnCheckboxComponent, TnCheckboxHarness, TnCheckboxLabelDirective, TnChipComponent, TnConfirmDialogComponent, TnDateInputComponent, TnDateInputHarness, TnDateRangeInputComponent, TnDateRangeInputHarness, TnDetailRowDefDirective, TnDialog, TnDialogHarness, TnDialogShellComponent, TnDialogTesting, TnDividerComponent, TnDividerDirective, TnDrawerComponent, TnDrawerContainerComponent, TnDrawerContainerHarness, TnDrawerContentComponent, TnDrawerHarness, TnEmptyComponent, TnEmptyHarness, TnExpansionPanelComponent, TnExpansionPanelHarness, TnFilePickerComponent, TnFilePickerPopupComponent, TnFormFieldComponent, TnFormFieldHarness, TnHeaderCellDefDirective, TnIconButtonComponent, TnIconButtonHarness, TnIconComponent, TnIconHarness, TnIconRegistryService, TnIconTesting, TnInputComponent, TnInputDirective, TnInputHarness, TnKeyboardShortcutComponent, TnKeyboardShortcutService, TnListAvatarDirective, TnListComponent, TnListIconDirective, TnListItemComponent, TnListItemLineDirective, TnListItemPrimaryDirective, TnListItemSecondaryDirective, TnListItemTitleDirective, TnListItemTrailingDirective, TnListOptionComponent, TnListSubheaderComponent, TnMenuActivateHoverDirective, TnMenuComponent, TnMenuHarness, TnMenuItemComponent, TnMenuTesting, TnMenuTriggerDirective, TnMonthViewComponent, TnMultiYearViewComponent, TnNestedTreeNodeComponent, TnParticleProgressBarComponent, TnProgressBarComponent, TnRadioComponent, TnRadioHarness, TnSelectComponent, TnSelectHarness, TnSelectionListComponent, TnSidePanelActionDirective, TnSidePanelComponent, TnSidePanelHarness, TnSidePanelHeaderActionDirective, TnSlideToggleComponent, TnSlideToggleHarness, TnSliderComponent, TnSliderThumbDirective, TnSliderWithLabelDirective, TnSpinnerComponent, TnSpriteLoaderService, TnStepComponent, TnStepperComponent, TnTabComponent, TnTabHarness, TnTabPanelComponent, TnTabPanelHarness, TnTableColumnDirective, TnTableComponent, TnTableHarness, TnTablePagerComponent, TnTablePagerHarness, TnTabsComponent, TnTabsHarness, TnTestIdDirective, TnTheme, TnThemeService, TnTimeInputComponent, TnToastComponent, TnToastMock, TnToastPosition, TnToastRef, TnToastService, TnToastTesting, TnToastType, TnTooltipComponent, TnTooltipDirective, TnTreeComponent, TnTreeFlatDataSource, TnTreeFlattener, TnTreeNodeComponent, TnTreeNodeOutletDirective, TruncatePathPipe, WindowsModifierKeys, WindowsShortcuts, createLucideLibrary, createShortcut, defaultSpriteBasePath, defaultSpriteConfigPath, libIconMarker, registerLucideIcons, setupLucideIntegration, tnIconMarker };
7034
- export type { AutocompleteHarnessFilters, BannerHarnessFilters, ButtonHarnessFilters, ButtonToggleHarnessFilters, CalendarCell, CheckboxHarnessFilters, ChipColor, CreateFolderEvent, DateInputHarnessFilters, DateRange, DateRangeInputHarnessFilters, DialogHarnessFilters, EmptyHarnessFilters, ExpansionPanelHarnessFilters, FilePickerCallbacks, FilePickerError, FilePickerMode, FileSystemItem, FormFieldHarnessFilters, IconButtonHarnessFilters, IconHarnessFilters, IconLibrary, IconLibraryType, IconResult, IconSize, IconSource, IconTestingMockOverrides, InputHarnessFilters, KeyCombination, LabelType, LucideIconOptions, MenuHarnessFilters, MockIconRegistry, MockSpriteLoader, PathSegment, PlatformType, ProgressBarMode, RadioHarnessFilters, ResolvedIcon, SelectHarnessFilters, ShortcutHandler, SidePanelHarnessFilters, SlideToggleColor, SlideToggleHarnessFilters, SpinnerMode, SpriteConfig, SubscriptSizing, TabChangeEvent, TabHarnessFilters, TabPanelHarnessFilters, TabsHarnessFilters, TnBannerType, TnButtonToggleType, TnCardAction, TnCardControl, TnCardFooterLink, TnCardHeaderStatus, TnConfirmDialogData, TnDialogDefaults, TnDialogOpenTarget, TnDrawerMode, TnDrawerPosition, TnEmptySize, TnFlatTreeNode, TnMenuItem, TnSelectOption, TnSelectOptionGroup, TnSelectionChange, TnSortEvent, TnTableDataProvider, TnTableDataSource, TnTableHarnessFilters, TnTablePagerHarnessFilters, TnTablePagerLabels, TnTablePagination, TnTestAttrName, TnThemeDefinition, TnToastCall, TnToastConfig, TooltipPosition, YearCell };
7138
+ export { CommonShortcuts, DEFAULT_THEME, DiskIconComponent, DiskType, FileSizePipe, InputType, LIGHT_THEME, LinuxModifierKeys, LinuxShortcuts, ModifierKeys, QuickShortcuts, ShortcutBuilder, StripMntPrefixPipe, THEME_MAP, THEME_STORAGE_KEY, TN_TABLE_PAGER_DEFAULT_LABELS, TN_TABLE_PAGER_LABELS, TN_TEST_ATTR, TN_THEME_DEFINITIONS, TnAutocompleteComponent, TnAutocompleteHarness, TnBannerActionDirective, TnBannerComponent, TnBannerHarness, TnBrandedSpinnerComponent, TnButtonComponent, TnButtonHarness, TnButtonToggleComponent, TnButtonToggleGroupComponent, TnButtonToggleGroupHarness, TnButtonToggleHarness, TnCalendarComponent, TnCalendarHeaderComponent, TnCardComponent, TnCardHeaderDirective, TnCellDefDirective, TnCheckboxComponent, TnCheckboxHarness, TnCheckboxLabelDirective, TnChipComponent, TnConfirmDialogComponent, TnDateInputComponent, TnDateInputHarness, TnDateRangeInputComponent, TnDateRangeInputHarness, TnDetailRowDefDirective, TnDialog, TnDialogHarness, TnDialogShellComponent, TnDialogTesting, TnDividerComponent, TnDividerDirective, TnDrawerComponent, TnDrawerContainerComponent, TnDrawerContainerHarness, TnDrawerContentComponent, TnDrawerHarness, TnEmptyComponent, TnEmptyHarness, TnExpansionPanelComponent, TnExpansionPanelHarness, TnFilePickerComponent, TnFilePickerPopupComponent, TnFormFieldComponent, TnFormFieldHarness, TnHeaderCellDefDirective, TnIconButtonComponent, TnIconButtonHarness, TnIconComponent, TnIconHarness, TnIconRegistryService, TnIconTesting, TnInputComponent, TnInputDirective, TnInputHarness, TnKeyboardShortcutComponent, TnKeyboardShortcutService, TnListAvatarDirective, TnListComponent, TnListIconDirective, TnListItemComponent, TnListItemLineDirective, TnListItemPrimaryDirective, TnListItemSecondaryDirective, TnListItemTitleDirective, TnListItemTrailingDirective, TnListOptionComponent, TnListSubheaderComponent, TnMenuActivateHoverDirective, TnMenuComponent, TnMenuHarness, TnMenuItemComponent, TnMenuTesting, TnMenuTriggerDirective, TnMonthViewComponent, TnMultiYearViewComponent, TnNestedTreeNodeComponent, TnParticleProgressBarComponent, TnProgressBarComponent, TnRadioComponent, TnRadioHarness, TnSelectComponent, TnSelectHarness, TnSelectionListComponent, TnSidePanelActionDirective, TnSidePanelComponent, TnSidePanelHarness, TnSidePanelHeaderActionDirective, TnSlideToggleComponent, TnSlideToggleHarness, TnSliderComponent, TnSliderThumbDirective, TnSliderWithLabelDirective, TnSpinnerComponent, TnSpriteLoaderService, TnStepComponent, TnStepperComponent, TnTabComponent, TnTabHarness, TnTabPanelComponent, TnTabPanelHarness, TnTableColumnDirective, TnTableComponent, TnTableHarness, TnTablePagerComponent, TnTablePagerHarness, TnTabsComponent, TnTabsHarness, TnTestIdDirective, TnTheme, TnThemeService, TnTimeInputComponent, TnToastComponent, TnToastMock, TnToastPosition, TnToastRef, TnToastService, TnToastTesting, TnToastType, TnTooltipComponent, TnTooltipDirective, TnTreeComponent, TnTreeFlatDataSource, TnTreeFlattener, TnTreeNodeComponent, TnTreeNodeOutletDirective, TruncatePathPipe, WindowsModifierKeys, WindowsShortcuts, composeTestId, createLucideLibrary, createShortcut, defaultSpriteBasePath, defaultSpriteConfigPath, kebabTestSegment, libIconMarker, registerLucideIcons, setupLucideIntegration, tnIconMarker };
7139
+ export type { AutocompleteHarnessFilters, BannerHarnessFilters, ButtonHarnessFilters, ButtonToggleHarnessFilters, CalendarCell, CheckboxHarnessFilters, ChipColor, CreateFolderEvent, DateInputHarnessFilters, DateRange, DateRangeInputHarnessFilters, DialogHarnessFilters, EmptyHarnessFilters, ExpansionPanelHarnessFilters, FilePickerCallbacks, FilePickerError, FilePickerMode, FileSystemItem, FormFieldHarnessFilters, IconButtonHarnessFilters, IconHarnessFilters, IconLibrary, IconLibraryType, IconResult, IconSize, IconSource, IconTestingMockOverrides, InputHarnessFilters, KeyCombination, LabelType, LucideIconOptions, MenuHarnessFilters, MockIconRegistry, MockSpriteLoader, PathSegment, PlatformType, ProgressBarMode, RadioHarnessFilters, ResolvedIcon, SelectHarnessFilters, ShortcutHandler, SidePanelHarnessFilters, SlideToggleColor, SlideToggleHarnessFilters, SpinnerMode, SpriteConfig, SubscriptSizing, TabChangeEvent, TabHarnessFilters, TabPanelHarnessFilters, TabsHarnessFilters, TnBannerType, TnButtonToggleType, TnCardAction, TnCardControl, TnCardFooterLink, TnCardHeaderStatus, TnConfirmDialogData, TnDialogDefaults, TnDialogOpenTarget, TnDrawerMode, TnDrawerPosition, TnEmptySize, TnFlatTreeNode, TnMenuItem, TnSelectOption, TnSelectOptionGroup, TnSelectionChange, TnSortEvent, TnTableDataProvider, TnTableDataSource, TnTableHarnessFilters, TnTablePagerHarnessFilters, TnTablePagerLabels, TnTablePagination, TnTestAttrName, TnTestIdValue, TnThemeDefinition, TnToastCall, TnToastConfig, TooltipPosition, YearCell };