@truenas/ui-components 0.7.0 → 0.7.2

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.
@@ -1055,26 +1055,6 @@ interface AutocompleteHarnessFilters extends BaseHarnessFilters {
1055
1055
 
1056
1056
  type TnDrawerMode = 'side' | 'over';
1057
1057
  type TnDrawerPosition = 'start' | 'end';
1058
- /**
1059
- * The accessible name a drawer falls back to when the caller names neither
1060
- * `ariaLabel` nor `ariaLabelledby` (#214).
1061
- *
1062
- * `ariaLabel` defaults to `undefined`, so the DEFAULT rendering in `over` mode
1063
- * was a `role="dialog"` with `aria-modal="true"` and no name — measured as an
1064
- * `aria-dialog-name` violation. In `side` mode the same omission leaves a
1065
- * `role="navigation"` landmark unnamed, which axe does not report while there is
1066
- * only one of them on the page, and which stops telling them apart the moment
1067
- * there are two.
1068
- *
1069
- * One fallback for both modes rather than one per mode: the drawer is the same
1070
- * surface either way, the name answers the same question ("what is this?"), and
1071
- * a rule that changes with the mode is one more thing for a caller to be wrong
1072
- * about. A generic name is still a poor one, so it is paired with the dev-mode
1073
- * warning `tnAccessibleName` raises.
1074
- *
1075
- * Exported so specs assert against it by name rather than by a copied literal.
1076
- */
1077
- declare const TN_DRAWER_DEFAULT_LABEL = "Drawer";
1078
1058
  /**
1079
1059
  * A drawer, which is two different things by `mode`: in `side` it is
1080
1060
  * persistent navigation beside the page's content, and in `over` it is a modal
@@ -1184,6 +1164,7 @@ declare class TnDrawerComponent implements OnDestroy {
1184
1164
  protected trapFocus: _angular_core.Signal<boolean>;
1185
1165
  /** Role depends on mode: navigation for side, dialog for over */
1186
1166
  protected panelRole: _angular_core.Signal<"dialog" | "navigation">;
1167
+ private readonly fallbackName;
1187
1168
  /**
1188
1169
  * The name to render as `aria-label`, or `null` to render none — and the
1189
1170
  * dev-mode warning when the caller named neither input.
@@ -4723,6 +4704,294 @@ interface CheckboxHarnessFilters extends BaseHarnessFilters {
4723
4704
  testId?: string;
4724
4705
  }
4725
4706
 
4707
+ /** One option of a `tn-checkbox-group`, rendered as a single `tn-checkbox`. */
4708
+ interface TnCheckboxOption<T = unknown> {
4709
+ value: T;
4710
+ label: string;
4711
+ disabled?: boolean;
4712
+ }
4713
+ /**
4714
+ * A `role="group"` wrapper that owns the selection for a set of `tn-checkbox`es, as one control
4715
+ * whose value is the ARRAY of checked option values.
4716
+ *
4717
+ * `tn-checkbox` is a boolean `ControlValueAccessor` — one control per box. A multi-select field
4718
+ * ("which USB devices to pass through", "which catalog trains to offer") has a single
4719
+ * array-valued control instead, and nothing in the library spoke that shape: consumers either
4720
+ * exploded it into one boolean control per option and reassembled the array by hand on submit, or
4721
+ * kept a bespoke component outside the library. This is that shape, with the same
4722
+ * `options`/`compareWith`/`testId` surface as {@link TnRadioGroupComponent} so the single-select
4723
+ * and multi-select forms of the same field read alike.
4724
+ *
4725
+ * ```html
4726
+ * <tn-form-field label="USB Devices" tooltip="Devices to pass through to the container">
4727
+ * <tn-checkbox-group formControlName="usb_devices" [options]="usbOptions" />
4728
+ * </tn-form-field>
4729
+ * ```
4730
+ *
4731
+ * Inside a `tn-form-field` the group is a normal control: the field names it via
4732
+ * `aria-labelledby`, infers the required indicator from its validators, and renders its validation
4733
+ * message — none of which a loose pile of checkboxes gets.
4734
+ *
4735
+ * Options come from the `options` input only. Unlike `tn-radio`, `tn-checkbox` is not group-aware,
4736
+ * so a projected child would render as an independent boolean control that silently ignores the
4737
+ * group's value; the group therefore projects nothing rather than accepting content it cannot
4738
+ * drive.
4739
+ */
4740
+ declare class TnCheckboxGroupComponent<T = unknown> implements ControlValueAccessor {
4741
+ /**
4742
+ * Options to render, one checkbox each.
4743
+ *
4744
+ * Options are tracked by `value`, so object values must be referentially stable — rebuilding
4745
+ * them as fresh literals on every change detection pass re-creates the whole list. Same
4746
+ * requirement the `compareWith` case implies; hold the objects in a field.
4747
+ */
4748
+ options: _angular_core.InputSignal<TnCheckboxOption<T>[]>;
4749
+ /**
4750
+ * Lays the options out in a wrapping row of equal columns instead of stacking them. Column width
4751
+ * comes from `--tn-checkbox-group-inline-basis` (default `50%`), and collapses to one column on
4752
+ * a narrow viewport.
4753
+ */
4754
+ inline: _angular_core.InputSignal<boolean>;
4755
+ /**
4756
+ * Explicit accessible name for the group. Inside a `tn-form-field` with a label this is
4757
+ * unnecessary — the field names the group automatically — but a group with neither is announced
4758
+ * as an unlabeled group.
4759
+ *
4760
+ * A required group appends "required" to whatever this says, since that is the only channel
4761
+ * `role="group"` leaves open for it — see the `required` input.
4762
+ */
4763
+ ariaLabel: _angular_core.InputSignal<string | undefined>;
4764
+ disabled: _angular_core.InputSignal<boolean>;
4765
+ /**
4766
+ * Whether the group announces itself as required.
4767
+ *
4768
+ * Deliberately NOT propagated to the options' native `required`, which is the opposite of the
4769
+ * choice `tn-radio-group` makes — and the difference is in the HTML, not in taste. A required
4770
+ * radio is satisfied by any one option in the `name` group; a required checkbox is satisfied
4771
+ * only by ITSELF being checked, so propagating it here would have the browser demand every box.
4772
+ * "At least one" is a validator's job.
4773
+ *
4774
+ * Nor does it become `aria-required`, which is the OTHER place `tn-radio-group` cannot be
4775
+ * copied: WAI-ARIA 1.2 supports only the globals plus `aria-activedescendant`/`aria-disabled`
4776
+ * on `role="group"`, so an `aria-required` there is dropped by assistive tech and flagged by
4777
+ * axe, whereas `role="radiogroup"` genuinely supports it. The state instead rides in the
4778
+ * group's accessible NAME, as a "required" suffix — see {@link labelledBy}.
4779
+ */
4780
+ required: _angular_core.InputSignal<boolean>;
4781
+ /**
4782
+ * Test-id base for the group and, scoped by the option label, for every option: base
4783
+ * `usb_devices` yields `checkbox-group-usb-devices` on the group and
4784
+ * `checkbox-usb-devices-web-cam` on its options. Falls back to the bound control name.
4785
+ */
4786
+ testId: _angular_core.InputSignal<TnTestIdValue>;
4787
+ /**
4788
+ * Custom comparator for matching option values against the selected ones. Provide it when option
4789
+ * values are objects — the default is identity, so a structurally-equal-but-distinct object
4790
+ * would leave the group rendering nothing as checked.
4791
+ *
4792
+ * Called with an option value on the right and a currently-selected value on the left, and must
4793
+ * tolerate `null`/`undefined` on either side rather than dereferencing straight into a property.
4794
+ *
4795
+ * @example
4796
+ * ```ts
4797
+ * compareWith = (a, b) => a?.id === b?.id;
4798
+ * ```
4799
+ */
4800
+ compareWith: _angular_core.InputSignal<((a: T | null, b: T | null) => boolean) | undefined>;
4801
+ /** Emits the new value array on every user toggle (not on programmatic writes). */
4802
+ change: _angular_core.OutputEmitterRef<T[]>;
4803
+ /**
4804
+ * ARIA wiring from an enclosing `tn-form-field` (label, error/hint, invalid, required).
4805
+ * All-null standalone, or when `ariaLabel` overrides the field's label.
4806
+ */
4807
+ protected readonly fieldAria: _truenas_ui_components.TnFormFieldAriaBindings;
4808
+ /** Test-id base, falling back to the bound control name when `testId` is unset. */
4809
+ protected readonly resolvedTestId: _angular_core.Signal<TnTestIdValue>;
4810
+ private readonly selectedValues;
4811
+ private readonly formDisabled;
4812
+ /**
4813
+ * Combined disabled state (own input plus a disabled bound control). The native `disabled` on
4814
+ * each option is what blocks interaction; `aria-disabled` on the group is what tells a screen
4815
+ * reader landing on the container about it, and gives styling a hook for the group as a whole.
4816
+ */
4817
+ readonly isDisabled: _angular_core.Signal<boolean>;
4818
+ /** Whether the group announces itself as required: its own input, or the field's inferred state. */
4819
+ protected readonly ariaRequired: _angular_core.Signal<boolean>;
4820
+ /** Id of the visually hidden "required" text this group contributes to its own name. */
4821
+ protected readonly requiredTextId: string;
4822
+ /**
4823
+ * `aria-label` for the group: the `ariaLabel` input with the required-ness folded in, since
4824
+ * `role="group"` gives it nowhere else to go (see the `required` input).
4825
+ */
4826
+ protected readonly resolvedAriaLabel: _angular_core.Signal<string | null>;
4827
+ /**
4828
+ * `aria-labelledby` for the group: the enclosing field's label, plus this group's own hidden
4829
+ * "required" text when required. A multi-id `aria-labelledby` concatenates, so the field keeps
4830
+ * naming the group and the required-ness reaches a screen reader as part of that name.
4831
+ *
4832
+ * Null when the name comes from `ariaLabel` instead — that path carries the suffix itself,
4833
+ * because `aria-labelledby` would otherwise win over the very label it is meant to extend.
4834
+ */
4835
+ protected readonly labelledBy: _angular_core.Signal<string | null>;
4836
+ private onChange;
4837
+ private onTouched;
4838
+ /** Whether `value` is among the currently selected values. */
4839
+ protected isSelected(value: T): boolean;
4840
+ /**
4841
+ * Adds or removes an option's value.
4842
+ *
4843
+ * The emitted array is rebuilt in `options` order rather than appended to in click order, so the
4844
+ * value a given set of checked boxes produces is the same however the user got there — which is
4845
+ * what makes a payload diff (and a spec asserting one) stable.
4846
+ *
4847
+ * Ordering is all the rebuild changes: an already-selected value is re-emitted as the object the
4848
+ * consumer wrote, not as the equal-under-`compareWith` object the option holds. A control loaded
4849
+ * with `{ id: 2, name: 'usb-cam' }` against an option of `{ id: 2 }` keeps its `name` when an
4850
+ * unrelated box is toggled; only a newly checked option contributes the option's own value.
4851
+ */
4852
+ protected toggle(value: T, checked: boolean): void;
4853
+ private matches;
4854
+ writeValue(value: T[] | null | undefined): void;
4855
+ registerOnChange(fn: (value: T[]) => void): void;
4856
+ registerOnTouched(fn: () => void): void;
4857
+ setDisabledState(isDisabled: boolean): void;
4858
+ /**
4859
+ * Marks the control touched when focus leaves the group. `focusout` also fires while moving
4860
+ * between the group's own options, which is harmless — the user has interacted either way — and
4861
+ * it is the only blur signal available, since a checkbox's blur does not bubble.
4862
+ */
4863
+ protected onFocusOut(): void;
4864
+ /** Per-option test-id segments: the group's base scoped by the option label. */
4865
+ protected optionTestId(option: TnCheckboxOption<T>): TnTestIdValue;
4866
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnCheckboxGroupComponent<any>, never>;
4867
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnCheckboxGroupComponent<any>, "tn-checkbox-group", never, { "options": { "alias": "options"; "required": false; "isSignal": true; }; "inline": { "alias": "inline"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "testId": { "alias": "testId"; "required": false; "isSignal": true; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; }, { "change": "change"; }, never, never, true, never>;
4868
+ }
4869
+
4870
+ /**
4871
+ * Harness for interacting with `tn-checkbox-group` in tests.
4872
+ * Drives the group as a whole — reading the checked set, replacing it wholesale, toggling one
4873
+ * option by label — rather than reaching for each `tn-checkbox` individually.
4874
+ *
4875
+ * @example
4876
+ * ```typescript
4877
+ * const group = await loader.getHarness(TnCheckboxGroupHarness.with({ testId: 'checkbox-group-trains' }));
4878
+ * // Labels, not option values — the DOM only carries what the user can read.
4879
+ * await group.setValue(['Stable', 'Enterprise']);
4880
+ * expect(await group.getValue()).toEqual(['Stable', 'Enterprise']);
4881
+ * ```
4882
+ */
4883
+ declare class TnCheckboxGroupHarness extends ComponentHarness {
4884
+ /** The selector for the host element of a `TnCheckboxGroupComponent` instance. */
4885
+ static hostSelector: string;
4886
+ private _root;
4887
+ private _checkboxes;
4888
+ /**
4889
+ * Gets a `HarnessPredicate` that can be used to search for a checkbox group with specific
4890
+ * attributes.
4891
+ *
4892
+ * @param options Options for filtering which checkbox group instances are considered a match.
4893
+ * @returns A `HarnessPredicate` configured with the given options.
4894
+ *
4895
+ * @example
4896
+ * ```typescript
4897
+ * // Find by accessible name
4898
+ * const group = await loader.getHarness(TnCheckboxGroupHarness.with({ ariaLabel: 'USB Devices' }));
4899
+ *
4900
+ * // Find by testId
4901
+ * const group = await loader.getHarness(TnCheckboxGroupHarness.with({ testId: 'checkbox-group-usb-devices' }));
4902
+ * ```
4903
+ */
4904
+ static with(options?: CheckboxGroupHarnessFilters): HarnessPredicate<TnCheckboxGroupHarness>;
4905
+ /**
4906
+ * Gets the harnesses for the group's options, in DOM order.
4907
+ *
4908
+ * @example
4909
+ * ```typescript
4910
+ * const options = await group.getOptions();
4911
+ * expect(options).toHaveLength(3);
4912
+ * ```
4913
+ */
4914
+ getOptions(): Promise<TnCheckboxHarness[]>;
4915
+ /**
4916
+ * Gets the label text of every option, in DOM order.
4917
+ *
4918
+ * @example
4919
+ * ```typescript
4920
+ * expect(await group.getOptionLabels()).toEqual(['Stable', 'Enterprise']);
4921
+ * ```
4922
+ */
4923
+ getOptionLabels(): Promise<string[]>;
4924
+ /**
4925
+ * Gets the labels of the currently checked options, in DOM order.
4926
+ *
4927
+ * Labels rather than values, because the values live in the bound control and the DOM only ever
4928
+ * carries what the user can read.
4929
+ *
4930
+ * @example
4931
+ * ```typescript
4932
+ * expect(await group.getValue()).toEqual(['Stable']);
4933
+ * ```
4934
+ */
4935
+ getValue(): Promise<string[]>;
4936
+ /**
4937
+ * Makes the checked set exactly the options with the given labels — checking the ones listed and
4938
+ * unchecking every other.
4939
+ *
4940
+ * @param labels Label text of the options that should end up checked.
4941
+ *
4942
+ * @example
4943
+ * ```typescript
4944
+ * await group.setValue(['Stable']);
4945
+ * ```
4946
+ */
4947
+ setValue(labels: string[]): Promise<void>;
4948
+ /**
4949
+ * Toggles the option with the given label. Throws when the group has no such option, so a
4950
+ * renamed or missing option fails loudly instead of silently leaving the selection unchanged.
4951
+ *
4952
+ * @param label Label text of the option to toggle.
4953
+ *
4954
+ * @example
4955
+ * ```typescript
4956
+ * await group.toggle('Enterprise');
4957
+ * ```
4958
+ */
4959
+ toggle(label: string): Promise<void>;
4960
+ /**
4961
+ * Checks whether every option is disabled — the state a disabled group or a disabled bound form
4962
+ * control produces. Use {@link getOptions} to inspect a single per-option `disabled`.
4963
+ *
4964
+ * @example
4965
+ * ```typescript
4966
+ * expect(await group.isDisabled()).toBe(true);
4967
+ * ```
4968
+ */
4969
+ isDisabled(): Promise<boolean>;
4970
+ /**
4971
+ * Gets the group's accessible name as written by the `ariaLabel` input, or null when the name
4972
+ * comes from an enclosing `tn-form-field` (see {@link getAriaLabelledBy}).
4973
+ */
4974
+ getAriaLabel(): Promise<string | null>;
4975
+ /** Gets the id the group's accessible name is delegated to, or null. */
4976
+ getAriaLabelledBy(): Promise<string | null>;
4977
+ /**
4978
+ * Gets the test ID attribute value of the group root.
4979
+ *
4980
+ * @example
4981
+ * ```typescript
4982
+ * expect(await group.getTestId()).toBe('checkbox-group-trains');
4983
+ * ```
4984
+ */
4985
+ getTestId(): Promise<string | null>;
4986
+ }
4987
+ /** A set of criteria that can be used to filter a list of `TnCheckboxGroupHarness` instances. */
4988
+ interface CheckboxGroupHarnessFilters extends BaseHarnessFilters {
4989
+ /** Filters by the group's `aria-label`. Supports string or regex matching. */
4990
+ ariaLabel?: string | RegExp;
4991
+ /** Filters by the resolved test-id attribute on the group root. */
4992
+ testId?: string;
4993
+ }
4994
+
4726
4995
  declare class TnRadioComponent implements AfterViewInit, OnDestroy, ControlValueAccessor {
4727
4996
  radioEl: _angular_core.Signal<ElementRef<HTMLInputElement>>;
4728
4997
  label: _angular_core.InputSignal<string>;
@@ -11029,21 +11298,236 @@ declare function labelMarkupToHtml(value: string): string;
11029
11298
  */
11030
11299
  declare function labelMarkupToText(value: string): string;
11031
11300
 
11032
- type SpinnerMode = 'determinate' | 'indeterminate';
11301
+ /**
11302
+ * Every generic name this library falls back to when a caller names neither
11303
+ * `ariaLabel` nor `ariaLabelledby`, in one bundle a consumer provides once.
11304
+ *
11305
+ * WHY A TOKEN AND NOT CONSTANTS ALONE
11306
+ * -----------------------------------
11307
+ * The constants below are English, and a spinner announcing "Loading" to a
11308
+ * screen reader in a Spanish app is the same untranslated-chrome bug that
11309
+ * `TN_SELECT_LABELS` and `TN_TABLE_LABELS` were added for: a string this
11310
+ * library renders into a consumer's UI has to be translatable, and the only
11311
+ * route to these was an `ariaLabel` on every single call site. In webui that
11312
+ * came to nineteen spinners and nineteen bars each carrying an identical
11313
+ * `[ariaLabel]="'Loading' | translate"` — the copy-on-every-instance shape
11314
+ * those two tokens already exist to remove.
11315
+ *
11316
+ * A per-instance `ariaLabel` still wins, and is still the right answer wherever
11317
+ * a name can say WHAT is loading or WHAT is open. This token is for the rest:
11318
+ * the generic name the component would otherwise render in English.
11319
+ *
11320
+ * WHY ONE BUNDLE, AND WHICH NAMES ARE IN IT
11321
+ * -----------------------------------------
11322
+ * Exactly the fallbacks `tnAccessibleName` renders — the four progressbars and
11323
+ * the three surfaces — because they already share one rule, and a consumer
11324
+ * translating one of them wants all seven. Separate keys rather than one shared
11325
+ * string, because the least-bad generic name differs by what the component is
11326
+ * ("Progress" for a bar, "Loading" for a spinner, "Dialog" for a dialog), and
11327
+ * `tn-branded-spinner` differs again for a reason
11328
+ * {@link TN_BRANDED_SPINNER_DEFAULT_LABEL} sets out.
11329
+ *
11330
+ * Not in it: `TN_SIDE_PANEL_CONTENT_LABEL`, `TN_DRAWER_CONTENT_LABEL`,
11331
+ * `TN_TAB_PANEL_CONTENT_LABEL` and `TN_TABLE_SCROLL_REGION_LABEL`. Those name a
11332
+ * scrolling REGION rather than the component, each already has a per-instance
11333
+ * input a consumer can translate through, and none of them warns — so they are
11334
+ * a separate decision from this one rather than part of it.
11335
+ *
11336
+ * WHAT PROVIDING IT DOES TO THE DEV WARNING
11337
+ * -----------------------------------------
11338
+ * It stands the warning down for the components whose fallback it supplies.
11339
+ * That is the same exception `tn-table-pager` already has, for the same reason,
11340
+ * written out at `resolvedTablePaginationLabel`: a name the consumer configured
11341
+ * is a DESIGNED name, not a last resort for one someone forgot, so warning
11342
+ * about it fires on the ordinary case and teaches readers to ignore the warning
11343
+ * where it means something. Registering this provider is a deliberate app-wide
11344
+ * decision about what an unnamed spinner or surface should say; the warning has
11345
+ * been heard, and an app that has answered it should not have every test that
11346
+ * renders a spinner fail on the answer.
11347
+ *
11348
+ * The half of `tnAccessibleName` that is NOT about the warning is unchanged: an
11349
+ * explicit `ariaLabel` still always survives, and the fallback — configured or
11350
+ * not — is still withheld beside an `ariaLabelledby`, so a dangling IDREF still
11351
+ * fails its axe name rule loudly instead of being masked by a name that says
11352
+ * nothing.
11353
+ *
11354
+ * Unlike its neighbours in this folder (`accessible-name.ts`, `live-region.ts`),
11355
+ * this file IS part of the public API: it is how a consumer answers the
11356
+ * question those two only ask.
11357
+ */
11358
+ interface TnFallbackLabels {
11359
+ /** Fallback name for `tn-spinner`. */
11360
+ spinner: string;
11361
+ /** Fallback name for `tn-branded-spinner`. */
11362
+ brandedSpinner: string;
11363
+ /** Fallback name for `tn-progress-bar`. */
11364
+ progressBar: string;
11365
+ /** Fallback name for `tn-particle-progress-bar`. */
11366
+ particleProgressBar: string;
11367
+ /** Fallback name for the `tn-dialog-shell` surface itself, for a dialog with no `title`. */
11368
+ dialog: string;
11369
+ /** Fallback name for the `tn-side-panel` surface itself, for a panel with no `title`. */
11370
+ sidePanel: string;
11371
+ /** Fallback name for `tn-drawer`, in both of its modes. */
11372
+ drawer: string;
11373
+ }
11033
11374
  /**
11034
11375
  * The accessible name a spinner falls back to when the caller names neither
11035
11376
  * `ariaLabel` nor `ariaLabelledby` (#202). Same reasoning as
11036
- * `TN_PROGRESS_BAR_DEFAULT_LABEL`, and the case is sharper here: the spinner
11037
- * defaults to indeterminate mode, so its unnamed default rendering reached
11038
- * assistive technology as a progressbar with neither a name nor a value.
11377
+ * {@link TN_PROGRESS_BAR_DEFAULT_LABEL}, and the case is sharper here: the
11378
+ * spinner defaults to indeterminate mode, so its unnamed default rendering
11379
+ * reached assistive technology as a progressbar with neither a name nor a
11380
+ * value.
11039
11381
  *
11040
- * `branded-spinner.component.ts` in this folder already fell back this way —
11382
+ * `branded-spinner.component.ts` already fell back this way —
11041
11383
  * `ariaLabel() || "Loading..."` inline — so a fallback is the shape this
11042
11384
  * library had already settled on; what it lacked was the warning. It has both
11043
- * since #206, through the same `tnAccessibleName` this component uses, which is
11385
+ * since #206, through the same `tnAccessibleName` that component uses, which is
11044
11386
  * why the two constants sit side by side and differ.
11045
11387
  */
11046
11388
  declare const TN_SPINNER_DEFAULT_LABEL = "Loading";
11389
+ /**
11390
+ * The name `tn-branded-spinner` falls back to when the caller names neither
11391
+ * `ariaLabel` nor `ariaLabelledby`. Same reasoning as
11392
+ * {@link TN_SPINNER_DEFAULT_LABEL} and {@link TN_PROGRESS_BAR_DEFAULT_LABEL}.
11393
+ *
11394
+ * It differs from `TN_SPINNER_DEFAULT_LABEL` — `"Loading..."` against
11395
+ * `"Loading"` — only because this is the string the component already rendered,
11396
+ * inline in its host binding, before #206 gave it the shared resolver. Aligning
11397
+ * the two would change what a screen reader announces for every unnamed branded
11398
+ * spinner already in the wild, which is a louder change than the consistency
11399
+ * fix it would be part of. Exported so specs assert against it by name rather
11400
+ * than by a copied string literal.
11401
+ */
11402
+ declare const TN_BRANDED_SPINNER_DEFAULT_LABEL = "Loading...";
11403
+ /**
11404
+ * The accessible name a bar falls back to when the caller names neither
11405
+ * `ariaLabel` nor `ariaLabelledby` (#202).
11406
+ *
11407
+ * Deliberately generic, and deliberately not silent: the host carries
11408
+ * `role="progressbar"` unconditionally, so without a fallback the default
11409
+ * rendering is a progressbar assistive technology announces with no name at all
11410
+ * — "progress bar, 40%", with nothing to say what is progressing. The
11411
+ * alternative fix, withholding the role until there is a name for it, trades
11412
+ * that for no announcement whatever, which is worse: a screen reader would not
11413
+ * learn that anything is in progress, and on a determinate bar it would lose
11414
+ * the value too.
11415
+ *
11416
+ * A generic name is still a poor one, so it is paired with the dev-mode warning
11417
+ * `tnAccessibleName` raises. Exported so specs assert against it by name rather
11418
+ * than by a copied string literal.
11419
+ */
11420
+ declare const TN_PROGRESS_BAR_DEFAULT_LABEL = "Progress";
11421
+ /**
11422
+ * The accessible name `tn-particle-progress-bar` falls back to when the caller
11423
+ * names neither `ariaLabel` nor `ariaLabelledby` (#209).
11424
+ *
11425
+ * The same string and the same reasoning as
11426
+ * {@link TN_PROGRESS_BAR_DEFAULT_LABEL} next door, and deliberately a separate
11427
+ * constant rather than an alias of it: `tnAccessibleName` takes a fallback PER
11428
+ * COMPONENT because the least-bad generic name differs by what the component is
11429
+ * ("Progress" for a bar, "Loading" for a spinner), and sharing the binding would
11430
+ * make a future divergence in one a silent change to the other. Exported so
11431
+ * specs assert against it by name rather than by a copied string literal.
11432
+ */
11433
+ declare const TN_PARTICLE_PROGRESS_BAR_DEFAULT_LABEL = "Progress";
11434
+ /**
11435
+ * The accessible name a dialog falls back to when it renders no `title` and the
11436
+ * caller named it through neither this component nor the `DialogConfig` (#219).
11437
+ *
11438
+ * `title` defaults to `''`, so the DEFAULT rendering of this component put an
11439
+ * empty `<h2>` in the header and left the CDK container with no naming
11440
+ * attribute at all — measured as `empty-heading` on the heading and
11441
+ * `aria-dialog-name` on the dialog. A dialog with no name is announced as
11442
+ * "dialog" and nothing else, which is the whole of what a screen-reader user is
11443
+ * told about a surface that just took over the page and trapped their focus.
11444
+ *
11445
+ * "Dialog" is a poor name, and says almost exactly what the role already says.
11446
+ * It is still better than the two alternatives: leaving the surface unnamed, or
11447
+ * withholding `role="dialog"` until there is a name — the latter would move a
11448
+ * listener into a focus trap with no announcement that anything had opened. So
11449
+ * it is paired with the dev-mode warning `tnAccessibleName` raises, which is
11450
+ * what keeps the fallback from becoming a quiet way to ship a nameless dialog.
11451
+ *
11452
+ * Exported so specs assert against it by name rather than by a copied literal.
11453
+ */
11454
+ declare const TN_DIALOG_SHELL_DEFAULT_LABEL = "Dialog";
11455
+ /**
11456
+ * The accessible name an open panel falls back to when it has no `title` and the
11457
+ * caller named neither `ariaLabel` nor `ariaLabelledby` (#214).
11458
+ *
11459
+ * `title` defaults to `''`, so the DEFAULT rendering of this component was a
11460
+ * `role="dialog"` with `aria-labelledby` pointing at an empty `<h2>` — measured
11461
+ * as an `aria-dialog-name` violation, alongside `empty-heading`. A dialog with no
11462
+ * name is announced as "dialog" and nothing else, which is the whole of what a
11463
+ * screen-reader user gets told about a surface that just covered the page.
11464
+ *
11465
+ * Withholding `role="dialog"` until there is a name would be the other way to
11466
+ * clear the rule, and it is worse: the panel traps focus either way, so a
11467
+ * listener would be moved into a region with no announcement that anything had
11468
+ * opened. A generic name is still a poor one, so it is paired with the dev-mode
11469
+ * warning `tnAccessibleName` raises.
11470
+ *
11471
+ * Exported so specs assert against it by name rather than by a copied literal.
11472
+ */
11473
+ declare const TN_SIDE_PANEL_DEFAULT_LABEL = "Side panel";
11474
+ /**
11475
+ * The accessible name a drawer falls back to when the caller names neither
11476
+ * `ariaLabel` nor `ariaLabelledby` (#214).
11477
+ *
11478
+ * `ariaLabel` defaults to `undefined`, so the DEFAULT rendering in `over` mode
11479
+ * was a `role="dialog"` with `aria-modal="true"` and no name — measured as an
11480
+ * `aria-dialog-name` violation. In `side` mode the same omission leaves a
11481
+ * `role="navigation"` landmark unnamed, which axe does not report while there is
11482
+ * only one of them on the page, and which stops telling them apart the moment
11483
+ * there are two.
11484
+ *
11485
+ * One fallback for both modes rather than one per mode: the drawer is the same
11486
+ * surface either way, the name answers the same question ("what is this?"), and
11487
+ * a rule that changes with the mode is one more thing for a caller to be wrong
11488
+ * about. A generic name is still a poor one, so it is paired with the dev-mode
11489
+ * warning `tnAccessibleName` raises.
11490
+ *
11491
+ * Exported so specs assert against it by name rather than by a copied literal.
11492
+ */
11493
+ declare const TN_DRAWER_DEFAULT_LABEL = "Drawer";
11494
+ /** English defaults used when no {@link TN_FALLBACK_LABELS} provider is registered. */
11495
+ declare const TN_DEFAULT_FALLBACK_LABELS: TnFallbackLabels;
11496
+ /**
11497
+ * DI token for the app-wide fallback names above. Provide either a static
11498
+ * object or a `Signal<TnFallbackLabels>` — the latter lets every component
11499
+ * react to language changes when the consumer wires it up to an i18n service.
11500
+ *
11501
+ * An `ariaLabel` on a particular instance still wins over these, and is still
11502
+ * what to reach for when a name can say what is loading or what is open.
11503
+ */
11504
+ declare const TN_FALLBACK_LABELS: InjectionToken<TnFallbackLabels | Signal<TnFallbackLabels>>;
11505
+ /** One component's fallback name, and where it came from. */
11506
+ interface TnFallbackName {
11507
+ /** The name to render when the caller names neither input. */
11508
+ label: Signal<string>;
11509
+ /**
11510
+ * Whether that name came from a consumer's provider rather than this
11511
+ * library's English default — which is what decides whether an unnamed
11512
+ * instance warns. See the file comment above.
11513
+ */
11514
+ configured: boolean;
11515
+ }
11516
+ /**
11517
+ * Reads one component's fallback name out of {@link TN_FALLBACK_LABELS}.
11518
+ *
11519
+ * Not `injectTnLabels`, which normalizes the token to a Signal and drops the
11520
+ * value it started from: telling a configured bundle from the built-in one is an
11521
+ * identity check against `builtInLabels`, so this needs the raw injected value.
11522
+ * A consumer who provides a bundle equal to the defaults — the exported constant
11523
+ * included — still counts as configured, which is the right way round: they said
11524
+ * so on purpose.
11525
+ *
11526
+ * **Must be called from an injection context.**
11527
+ */
11528
+ declare function injectTnFallbackName(key: keyof TnFallbackLabels): TnFallbackName;
11529
+
11530
+ type SpinnerMode = 'determinate' | 'indeterminate';
11047
11531
  declare class TnSpinnerComponent {
11048
11532
  mode: _angular_core.InputSignal<SpinnerMode>;
11049
11533
  value: _angular_core.InputSignal<number>;
@@ -11051,6 +11535,7 @@ declare class TnSpinnerComponent {
11051
11535
  strokeWidth: _angular_core.InputSignal<number>;
11052
11536
  ariaLabel: _angular_core.InputSignal<string | null>;
11053
11537
  ariaLabelledby: _angular_core.InputSignal<string | null>;
11538
+ private readonly fallbackName;
11054
11539
  /**
11055
11540
  * The name to render, or `null` to render no `aria-label` attribute — and the
11056
11541
  * dev-mode warning when the caller named neither input.
@@ -11072,23 +11557,10 @@ declare class TnSpinnerComponent {
11072
11557
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnSpinnerComponent, "tn-spinner", never, { "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "diameter": { "alias": "diameter"; "required": false; "isSignal": true; }; "strokeWidth": { "alias": "strokeWidth"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "ariaLabelledby": { "alias": "ariaLabelledby"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
11073
11558
  }
11074
11559
 
11075
- /**
11076
- * The name this spinner falls back to when the caller names neither `ariaLabel`
11077
- * nor `ariaLabelledby`. Same reasoning as `TN_SPINNER_DEFAULT_LABEL` and
11078
- * `TN_PROGRESS_BAR_DEFAULT_LABEL`.
11079
- *
11080
- * It differs from `TN_SPINNER_DEFAULT_LABEL` — `"Loading..."` against
11081
- * `"Loading"` — only because this is the string the component already rendered,
11082
- * inline in its host binding, before #206 gave it the shared resolver. Aligning
11083
- * the two would change what a screen reader announces for every unnamed branded
11084
- * spinner already in the wild, which is a louder change than the consistency
11085
- * fix it would be part of. Exported so specs assert against it by name rather
11086
- * than by a copied string literal.
11087
- */
11088
- declare const TN_BRANDED_SPINNER_DEFAULT_LABEL = "Loading...";
11089
11560
  declare class TnBrandedSpinnerComponent implements OnInit, OnDestroy, AfterViewInit {
11090
11561
  ariaLabel: _angular_core.InputSignal<string | null>;
11091
11562
  ariaLabelledby: _angular_core.InputSignal<string | null>;
11563
+ private readonly fallbackName;
11092
11564
  /**
11093
11565
  * The name to render, or `null` to render no `aria-label` attribute — and the
11094
11566
  * dev-mode warning when the caller named neither input.
@@ -11120,30 +11592,13 @@ declare class TnBrandedSpinnerComponent implements OnInit, OnDestroy, AfterViewI
11120
11592
  }
11121
11593
 
11122
11594
  type ProgressBarMode = 'determinate' | 'indeterminate' | 'buffer';
11123
- /**
11124
- * The accessible name a bar falls back to when the caller names neither
11125
- * `ariaLabel` nor `ariaLabelledby` (#202).
11126
- *
11127
- * Deliberately generic, and deliberately not silent: the host carries
11128
- * `role="progressbar"` unconditionally, so without a fallback the default
11129
- * rendering is a progressbar assistive technology announces with no name at all
11130
- * — "progress bar, 40%", with nothing to say what is progressing. The
11131
- * alternative fix, withholding the role until there is a name for it, trades
11132
- * that for no announcement whatever, which is worse: a screen reader would not
11133
- * learn that anything is in progress, and on a determinate bar it would lose
11134
- * the value too.
11135
- *
11136
- * A generic name is still a poor one, so it is paired with the dev-mode warning
11137
- * `tnAccessibleName` raises. Exported so specs assert against it by name rather
11138
- * than by a copied string literal.
11139
- */
11140
- declare const TN_PROGRESS_BAR_DEFAULT_LABEL = "Progress";
11141
11595
  declare class TnProgressBarComponent {
11142
11596
  mode: _angular_core.InputSignal<ProgressBarMode>;
11143
11597
  value: _angular_core.InputSignal<number>;
11144
11598
  bufferValue: _angular_core.InputSignal<number>;
11145
11599
  ariaLabel: _angular_core.InputSignal<string | null>;
11146
11600
  ariaLabelledby: _angular_core.InputSignal<string | null>;
11601
+ private readonly fallbackName;
11147
11602
  /**
11148
11603
  * The name to render, or `null` to render no `aria-label` attribute — and the
11149
11604
  * dev-mode warning when the caller named neither input.
@@ -11177,19 +11632,6 @@ declare class TnProgressBarComponent {
11177
11632
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnProgressBarComponent, "tn-progress-bar", never, { "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "bufferValue": { "alias": "bufferValue"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "ariaLabelledby": { "alias": "ariaLabelledby"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
11178
11633
  }
11179
11634
 
11180
- /**
11181
- * The accessible name this bar falls back to when the caller names neither
11182
- * `ariaLabel` nor `ariaLabelledby` (#209).
11183
- *
11184
- * The same string and the same reasoning as `TN_PROGRESS_BAR_DEFAULT_LABEL`
11185
- * next door, and deliberately a separate constant rather than an import of it:
11186
- * `tnAccessibleName` takes a fallback PER COMPONENT because the least-bad
11187
- * generic name differs by what the component is ("Progress" for a bar,
11188
- * "Loading" for a spinner), and sharing the binding would make a future
11189
- * divergence in one a silent change to the other. Exported so specs assert
11190
- * against it by name rather than by a copied string literal.
11191
- */
11192
- declare const TN_PARTICLE_PROGRESS_BAR_DEFAULT_LABEL = "Progress";
11193
11635
  /**
11194
11636
  * THE DECISION #209 ASKED FOR: THIS IS A PROGRESSBAR, NOT DECORATION
11195
11637
  * ------------------------------------------------------------------
@@ -11249,6 +11691,7 @@ declare class TnParticleProgressBarComponent implements AfterViewInit, OnDestroy
11249
11691
  canvasRef: _angular_core.Signal<ElementRef<HTMLCanvasElement>>;
11250
11692
  /** Exposed to the template so the rects and the ARIA value share one inset. */
11251
11693
  readonly trackInset = 50;
11694
+ private readonly fallbackName;
11252
11695
  /**
11253
11696
  * The name to render, or `null` to render no `aria-label` at all — and the
11254
11697
  * dev-mode warning when the caller named neither input.
@@ -13156,27 +13599,6 @@ declare const TN_DIALOG_DEFAULT_CHROME_LABELS: TnDialogChromeLabels;
13156
13599
  * the consumer wires it up to an i18n service.
13157
13600
  */
13158
13601
  declare const TN_DIALOG_CHROME_LABELS: InjectionToken<TnDialogChromeLabels | Signal<TnDialogChromeLabels>>;
13159
- /**
13160
- * The accessible name a dialog falls back to when it renders no `title` and the
13161
- * caller named it through neither this component nor the `DialogConfig` (#219).
13162
- *
13163
- * `title` defaults to `''`, so the DEFAULT rendering of this component put an
13164
- * empty `<h2>` in the header and left the CDK container with no naming
13165
- * attribute at all — measured as `empty-heading` on the heading and
13166
- * `aria-dialog-name` on the dialog. A dialog with no name is announced as
13167
- * "dialog" and nothing else, which is the whole of what a screen-reader user is
13168
- * told about a surface that just took over the page and trapped their focus.
13169
- *
13170
- * "Dialog" is a poor name, and says almost exactly what the role already says.
13171
- * It is still better than the two alternatives: leaving the surface unnamed, or
13172
- * withholding `role="dialog"` until there is a name — the latter would move a
13173
- * listener into a focus trap with no announcement that anything had opened. So
13174
- * it is paired with the dev-mode warning `tnAccessibleName` raises, which is
13175
- * what keeps the fallback from becoming a quiet way to ship a nameless dialog.
13176
- *
13177
- * Exported so specs assert against it by name rather than by a copied literal.
13178
- */
13179
- declare const TN_DIALOG_SHELL_DEFAULT_LABEL = "Dialog";
13180
13602
  declare class TnDialogShellComponent implements OnInit {
13181
13603
  protected readonly labels: Signal<TnDialogChromeLabels>;
13182
13604
  /** Accessible name for the fullscreen toggle, following its current state. */
@@ -13276,6 +13698,7 @@ declare class TnDialogShellComponent implements OnInit {
13276
13698
  private resolvedAriaLabelledby;
13277
13699
  /** An explicit label, from this component's input or from the `DialogConfig`. */
13278
13700
  private explicitAriaLabel;
13701
+ private readonly fallbackName;
13279
13702
  /**
13280
13703
  * The name to render as `aria-label`, or `null` to render none — and the
13281
13704
  * dev-mode warning when the dialog has no name from any route.
@@ -13493,25 +13916,6 @@ declare class TnDialogTesting {
13493
13916
  static rootLoader(fixture: ComponentFixture<unknown>): HarnessLoader;
13494
13917
  }
13495
13918
 
13496
- /**
13497
- * The accessible name an open panel falls back to when it has no `title` and the
13498
- * caller named neither `ariaLabel` nor `ariaLabelledby` (#214).
13499
- *
13500
- * `title` defaults to `''`, so the DEFAULT rendering of this component was a
13501
- * `role="dialog"` with `aria-labelledby` pointing at an empty `<h2>` — measured
13502
- * as an `aria-dialog-name` violation, alongside `empty-heading`. A dialog with no
13503
- * name is announced as "dialog" and nothing else, which is the whole of what a
13504
- * screen-reader user gets told about a surface that just covered the page.
13505
- *
13506
- * Withholding `role="dialog"` until there is a name would be the other way to
13507
- * clear the rule, and it is worse: the panel traps focus either way, so a
13508
- * listener would be moved into a region with no announcement that anything had
13509
- * opened. A generic name is still a poor one, so it is paired with the dev-mode
13510
- * warning `tnAccessibleName` raises.
13511
- *
13512
- * Exported so specs assert against it by name rather than by a copied literal.
13513
- */
13514
- declare const TN_SIDE_PANEL_DEFAULT_LABEL = "Side panel";
13515
13919
  /**
13516
13920
  * The name given to the scrolling content region once it becomes focusable
13517
13921
  * (#248).
@@ -13700,6 +14104,7 @@ declare class TnSidePanelComponent implements OnDestroy {
13700
14104
  * when there is one, the caller's IDREF otherwise.
13701
14105
  */
13702
14106
  protected resolvedAriaLabelledby: _angular_core.Signal<string | null>;
14107
+ private readonly fallbackName;
13703
14108
  /**
13704
14109
  * The name to render as `aria-label`, or `null` to render none — and the
13705
14110
  * dev-mode warning when the panel has no name from any route.
@@ -15226,5 +15631,5 @@ declare const TN_THEME_DEFINITIONS: readonly TnThemeDefinition[];
15226
15631
  */
15227
15632
  declare const THEME_MAP: Map<TnTheme, TnThemeDefinition>;
15228
15633
 
15229
- export { CommonShortcuts, DEFAULT_THEME, DiskIconComponent, DiskType, FileSizePipe, InputType, LIGHT_THEME, LabelMarkupPipe, LabelTextPipe, LinuxModifierKeys, LinuxShortcuts, ModifierKeys, QuickShortcuts, ShortcutBuilder, THEME_MAP, THEME_STORAGE_KEY, TN_AUTOCOMPLETE_DEFAULT_LABELS, TN_AUTOCOMPLETE_LABELS, TN_BRANDED_SPINNER_DEFAULT_LABEL, TN_CALENDAR_INTL, TN_CALENDAR_INTL_DEFAULTS, TN_DIALOG_CHROME_LABELS, TN_DIALOG_DEFAULT_CHROME_LABELS, TN_DIALOG_SHELL_DEFAULT_LABEL, TN_DRAWER_CONTENT_LABEL, TN_DRAWER_DEFAULT_LABEL, TN_FORM_FIELD_CONTEXT, TN_FORM_FIELD_DISMISSIBLE_ERRORS, TN_FORM_FIELD_ERRORS, TN_FORM_LIST_CONTEXT, TN_PARTICLE_PROGRESS_BAR_DEFAULT_LABEL, TN_PROGRESS_BAR_DEFAULT_LABEL, TN_RADIO_GROUP, TN_SELECT_DEFAULT_LABELS, TN_SELECT_LABELS, TN_SIDE_PANEL_CONTENT_LABEL, TN_SIDE_PANEL_DEFAULT_LABEL, TN_SIDE_PANEL_OVERFLOW_TOLERANCE_PX, TN_SPINNER_DEFAULT_LABEL, TN_STEPPER_STATUS_COMPLETED, TN_STEPPER_STATUS_ERROR, TN_TABLE_DEFAULT_LABELS, TN_TABLE_LABELS, TN_TABLE_PAGER_DEFAULT_LABELS, TN_TABLE_PAGER_LABELS, TN_TABLE_SCROLL_REGION_LABEL, TN_TAB_PANEL_CONTENT_LABEL, TN_TEST_ATTR, TN_THEME_DEFINITIONS, TN_TOAST_ANNOUNCE_DELAY_MS, TnAutocompleteComponent, TnAutocompleteHarness, TnBannerActionDirective, TnBannerActionHarness, TnBannerComponent, TnBannerHarness, TnBrandedSpinnerComponent, TnButtonComponent, TnButtonHarness, TnButtonToggleComponent, TnButtonToggleGroupComponent, TnButtonToggleGroupHarness, TnButtonToggleHarness, TnCalendarCellHarness, TnCalendarComponent, TnCalendarHarness, TnCalendarHeaderComponent, TnCardComponent, TnCardFooterActionsDirective, TnCardHeaderActionsDirective, TnCardHeaderDirective, TnCellDefDirective, TnCheckboxComponent, TnCheckboxHarness, TnCheckboxLabelDirective, TnChipComponent, TnChipHarness, TnChipInputComponent, TnChipInputHarness, TnConfirmDialogComponent, TnDateInputComponent, TnDateInputHarness, TnDateRangeInputComponent, TnDateRangeInputHarness, TnDetailRowDefDirective, TnDialog, TnDialogHarness, TnDialogShellComponent, TnDialogTesting, TnDividerComponent, TnDividerDirective, TnDrawerComponent, TnDrawerContainerComponent, TnDrawerContainerHarness, TnDrawerContentComponent, TnDrawerHarness, TnEmptyComponent, TnEmptyHarness, TnExpansionPanelComponent, TnExpansionPanelHarness, TnFileInputComponent, TnFileInputHarness, TnFilePickerComponent, TnFilePickerHarness, TnFilePickerPopupComponent, TnFormErrorsComponent, TnFormErrorsHarness, TnFormFieldComponent, TnFormFieldHarness, TnFormListComponent, TnFormListHarness, TnFormListItemComponent, TnFormListItemHarness, TnFormSectionComponent, TnFormSectionHarness, 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, TnNestedTreeDataSource, TnNestedTreeNodeComponent, TnParticleProgressBarComponent, TnProgressBarComponent, TnRadioComponent, TnRadioGroupComponent, TnRadioGroupHarness, TnRadioHarness, TnRowActionsDefDirective, TnSelectComponent, TnSelectHarness, TnSelectionListComponent, TnSidePanelActionDirective, TnSidePanelComponent, TnSidePanelHarness, TnSidePanelHeaderActionDirective, TnSlideToggleComponent, TnSlideToggleHarness, TnSliderComponent, TnSliderThumbDirective, TnSliderWithLabelDirective, TnSpinnerComponent, TnSpriteLoaderService, TnStepComponent, TnStepperComponent, TnStepperHarness, TnStepperNextDirective, TnStepperPreviousDirective, TnTabComponent, TnTabHarness, TnTabPanelComponent, TnTabPanelHarness, TnTableColumnDirective, TnTableComponent, TnTableHarness, TnTablePagerComponent, TnTablePagerHarness, TnTableTesting, TnTabsComponent, TnTabsHarness, TnTestIdDirective, TnTheme, TnThemeService, TnTimeInputComponent, TnToastComponent, TnToastMock, TnToastPosition, TnToastRef, TnToastService, TnToastTesting, TnToastType, TnTooltipComponent, TnTooltipDirective, TnTooltipHarness, TnTooltipTesting, TnTreeComponent, TnTreeFlatDataSource, TnTreeFlattener, TnTreeHarness, TnTreeNodeComponent, TnTreeNodeHarness, TnTreeNodeOutletDirective, TnTreeVirtualScrollNodeOutletDirective, TnTreeVirtualScrollViewComponent, TnTreeVirtualScrollViewHarness, TruncatePathPipe, WindowsModifierKeys, WindowsShortcuts, allowsCurrentDirectorySelection, canonicalizeSize, composeTestId, controlTestId, createFlatTreeControl, createLucideLibrary, createNestedTreeControl, createShortcut, defaultSpriteBasePath, defaultSpriteConfigPath, defaultTreeItemSize, formatSize, formatSizeExact, formatSizeForEditing, getSelectableTypes, injectTnCalendarIntl, injectTnFormFieldAria, injectTnLabels, isPathWithinRoot, kebabTestSegment, labelMarkupToHtml, labelMarkupToText, libIconMarker, normalizeRootPath, optionTestId, parseLabelMarkup, parseSize, parseSizeParts, registerLucideIcons, resolveErrorMessage, scopeTestId, setupLucideIntegration, tnIconMarker, writeTestId };
15230
- export type { AutocompleteHarnessFilters, BannerActionHarnessFilters, BannerHarnessFilters, ButtonHarnessFilters, ButtonToggleHarnessFilters, CalendarCell, CalendarCellFill, CalendarCellHarnessFilters, CalendarHarnessFilters, CheckboxHarnessFilters, ChipColor, ChipHarnessFilters, DateInputHarnessFilters, DateRange, DateRangeInputHarnessFilters, DialogHarnessFilters, EmptyHarnessFilters, ExpansionPanelHarnessFilters, FileInputHarnessFilters, FilePickerCallbacks, FilePickerCreateAction, FilePickerCreateActionEvent, FilePickerError, FilePickerHarnessFilters, FilePickerMode, FileSystemItem, FileSystemItemType, FlatTreeControlOptions, FormFieldHarnessFilters, FormSectionHarnessFilters, IconButtonHarnessFilters, IconHarnessFilters, IconLibrary, IconLibraryType, IconResult, IconSize, IconSource, IconTestingMockOverrides, InputHarnessFilters, KeyCombination, LabelMarkupSegment, LabelMarkupSegmentType, LabelType, LucideIconOptions, MenuHarnessFilters, MockIconRegistry, MockSpriteLoader, NestedTreeControlOptions, ParsedSize, PathSegment, PlatformType, ProgressBarMode, RadioGroupHarnessFilters, RadioHarnessFilters, ResolveErrorMessageOptions, ResolvedIcon, SelectHarnessFilters, ShortcutHandler, SidePanelHarnessFilters, SizeStandard, SlideToggleColor, SlideToggleHarnessFilters, SpinnerMode, SpriteConfig, StepperHarnessFilters, SubscriptSizing, TabChangeEvent, TabHarnessFilters, TabPanelHarnessFilters, TabsHarnessFilters, TnAutocompleteLabels, TnAutocompleteOption, TnBannerType, TnButtonToggleType, TnCalendarIntl, TnCalendarIntlInput, TnCalendarView, TnCardAction, TnCardControl, TnCardFooterLink, TnCardHeaderStatus, TnChipInputHarnessFilters, TnChipInputOption, TnConfirmDialogData, TnDialogChromeLabels, TnDialogDefaults, TnDialogOpenTarget, TnDrawerMode, TnDrawerPosition, TnEmptySize, TnFlatTreeNode, TnFormErrorsHarnessFilters, TnFormFieldAriaBindings, TnFormFieldContext, TnFormFieldErrorMessage, TnFormFieldErrorMessages, TnFormFieldErrorResolver, TnFormListContext, TnFormListHarnessFilters, TnFormListItemHarnessFilters, TnMenuItem, TnOptionTestIdSource, TnRadioGroupApi, TnRadioOption, TnSelectLabels, TnSelectOption, TnSelectOptionGroup, TnSelectionChange, TnSortEvent, TnTableDataProvider, TnTableDataSource, TnTableHarnessFilters, TnTableLabels, TnTableMobileLayout, TnTablePagerHarnessFilters, TnTablePagerLabels, TnTablePagination, TnTestAttrName, TnTestIdValue, TnThemeDefinition, TnToastCall, TnToastConfig, TnTreeExpansion, TnTreeHarnessFilters, TnTreeNodeHarnessFilters, TnTreeVirtualNodeData, TnTreeVirtualScrollViewHarnessFilters, TooltipHarnessFilters, TooltipPosition, YearCell };
15634
+ export { CommonShortcuts, DEFAULT_THEME, DiskIconComponent, DiskType, FileSizePipe, InputType, LIGHT_THEME, LabelMarkupPipe, LabelTextPipe, LinuxModifierKeys, LinuxShortcuts, ModifierKeys, QuickShortcuts, ShortcutBuilder, THEME_MAP, THEME_STORAGE_KEY, TN_AUTOCOMPLETE_DEFAULT_LABELS, TN_AUTOCOMPLETE_LABELS, TN_BRANDED_SPINNER_DEFAULT_LABEL, TN_CALENDAR_INTL, TN_CALENDAR_INTL_DEFAULTS, TN_DEFAULT_FALLBACK_LABELS, TN_DIALOG_CHROME_LABELS, TN_DIALOG_DEFAULT_CHROME_LABELS, TN_DIALOG_SHELL_DEFAULT_LABEL, TN_DRAWER_CONTENT_LABEL, TN_DRAWER_DEFAULT_LABEL, TN_FALLBACK_LABELS, TN_FORM_FIELD_CONTEXT, TN_FORM_FIELD_DISMISSIBLE_ERRORS, TN_FORM_FIELD_ERRORS, TN_FORM_LIST_CONTEXT, TN_PARTICLE_PROGRESS_BAR_DEFAULT_LABEL, TN_PROGRESS_BAR_DEFAULT_LABEL, TN_RADIO_GROUP, TN_SELECT_DEFAULT_LABELS, TN_SELECT_LABELS, TN_SIDE_PANEL_CONTENT_LABEL, TN_SIDE_PANEL_DEFAULT_LABEL, TN_SIDE_PANEL_OVERFLOW_TOLERANCE_PX, TN_SPINNER_DEFAULT_LABEL, TN_STEPPER_STATUS_COMPLETED, TN_STEPPER_STATUS_ERROR, TN_TABLE_DEFAULT_LABELS, TN_TABLE_LABELS, TN_TABLE_PAGER_DEFAULT_LABELS, TN_TABLE_PAGER_LABELS, TN_TABLE_SCROLL_REGION_LABEL, TN_TAB_PANEL_CONTENT_LABEL, TN_TEST_ATTR, TN_THEME_DEFINITIONS, TN_TOAST_ANNOUNCE_DELAY_MS, TnAutocompleteComponent, TnAutocompleteHarness, TnBannerActionDirective, TnBannerActionHarness, TnBannerComponent, TnBannerHarness, TnBrandedSpinnerComponent, TnButtonComponent, TnButtonHarness, TnButtonToggleComponent, TnButtonToggleGroupComponent, TnButtonToggleGroupHarness, TnButtonToggleHarness, TnCalendarCellHarness, TnCalendarComponent, TnCalendarHarness, TnCalendarHeaderComponent, TnCardComponent, TnCardFooterActionsDirective, TnCardHeaderActionsDirective, TnCardHeaderDirective, TnCellDefDirective, TnCheckboxComponent, TnCheckboxGroupComponent, TnCheckboxGroupHarness, TnCheckboxHarness, TnCheckboxLabelDirective, TnChipComponent, TnChipHarness, TnChipInputComponent, TnChipInputHarness, TnConfirmDialogComponent, TnDateInputComponent, TnDateInputHarness, TnDateRangeInputComponent, TnDateRangeInputHarness, TnDetailRowDefDirective, TnDialog, TnDialogHarness, TnDialogShellComponent, TnDialogTesting, TnDividerComponent, TnDividerDirective, TnDrawerComponent, TnDrawerContainerComponent, TnDrawerContainerHarness, TnDrawerContentComponent, TnDrawerHarness, TnEmptyComponent, TnEmptyHarness, TnExpansionPanelComponent, TnExpansionPanelHarness, TnFileInputComponent, TnFileInputHarness, TnFilePickerComponent, TnFilePickerHarness, TnFilePickerPopupComponent, TnFormErrorsComponent, TnFormErrorsHarness, TnFormFieldComponent, TnFormFieldHarness, TnFormListComponent, TnFormListHarness, TnFormListItemComponent, TnFormListItemHarness, TnFormSectionComponent, TnFormSectionHarness, 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, TnNestedTreeDataSource, TnNestedTreeNodeComponent, TnParticleProgressBarComponent, TnProgressBarComponent, TnRadioComponent, TnRadioGroupComponent, TnRadioGroupHarness, TnRadioHarness, TnRowActionsDefDirective, TnSelectComponent, TnSelectHarness, TnSelectionListComponent, TnSidePanelActionDirective, TnSidePanelComponent, TnSidePanelHarness, TnSidePanelHeaderActionDirective, TnSlideToggleComponent, TnSlideToggleHarness, TnSliderComponent, TnSliderThumbDirective, TnSliderWithLabelDirective, TnSpinnerComponent, TnSpriteLoaderService, TnStepComponent, TnStepperComponent, TnStepperHarness, TnStepperNextDirective, TnStepperPreviousDirective, TnTabComponent, TnTabHarness, TnTabPanelComponent, TnTabPanelHarness, TnTableColumnDirective, TnTableComponent, TnTableHarness, TnTablePagerComponent, TnTablePagerHarness, TnTableTesting, TnTabsComponent, TnTabsHarness, TnTestIdDirective, TnTheme, TnThemeService, TnTimeInputComponent, TnToastComponent, TnToastMock, TnToastPosition, TnToastRef, TnToastService, TnToastTesting, TnToastType, TnTooltipComponent, TnTooltipDirective, TnTooltipHarness, TnTooltipTesting, TnTreeComponent, TnTreeFlatDataSource, TnTreeFlattener, TnTreeHarness, TnTreeNodeComponent, TnTreeNodeHarness, TnTreeNodeOutletDirective, TnTreeVirtualScrollNodeOutletDirective, TnTreeVirtualScrollViewComponent, TnTreeVirtualScrollViewHarness, TruncatePathPipe, WindowsModifierKeys, WindowsShortcuts, allowsCurrentDirectorySelection, canonicalizeSize, composeTestId, controlTestId, createFlatTreeControl, createLucideLibrary, createNestedTreeControl, createShortcut, defaultSpriteBasePath, defaultSpriteConfigPath, defaultTreeItemSize, formatSize, formatSizeExact, formatSizeForEditing, getSelectableTypes, injectTnCalendarIntl, injectTnFallbackName, injectTnFormFieldAria, injectTnLabels, isPathWithinRoot, kebabTestSegment, labelMarkupToHtml, labelMarkupToText, libIconMarker, normalizeRootPath, optionTestId, parseLabelMarkup, parseSize, parseSizeParts, registerLucideIcons, resolveErrorMessage, scopeTestId, setupLucideIntegration, tnIconMarker, writeTestId };
15635
+ export type { AutocompleteHarnessFilters, BannerActionHarnessFilters, BannerHarnessFilters, ButtonHarnessFilters, ButtonToggleHarnessFilters, CalendarCell, CalendarCellFill, CalendarCellHarnessFilters, CalendarHarnessFilters, CheckboxGroupHarnessFilters, CheckboxHarnessFilters, ChipColor, ChipHarnessFilters, DateInputHarnessFilters, DateRange, DateRangeInputHarnessFilters, DialogHarnessFilters, EmptyHarnessFilters, ExpansionPanelHarnessFilters, FileInputHarnessFilters, FilePickerCallbacks, FilePickerCreateAction, FilePickerCreateActionEvent, FilePickerError, FilePickerHarnessFilters, FilePickerMode, FileSystemItem, FileSystemItemType, FlatTreeControlOptions, FormFieldHarnessFilters, FormSectionHarnessFilters, IconButtonHarnessFilters, IconHarnessFilters, IconLibrary, IconLibraryType, IconResult, IconSize, IconSource, IconTestingMockOverrides, InputHarnessFilters, KeyCombination, LabelMarkupSegment, LabelMarkupSegmentType, LabelType, LucideIconOptions, MenuHarnessFilters, MockIconRegistry, MockSpriteLoader, NestedTreeControlOptions, ParsedSize, PathSegment, PlatformType, ProgressBarMode, RadioGroupHarnessFilters, RadioHarnessFilters, ResolveErrorMessageOptions, ResolvedIcon, SelectHarnessFilters, ShortcutHandler, SidePanelHarnessFilters, SizeStandard, SlideToggleColor, SlideToggleHarnessFilters, SpinnerMode, SpriteConfig, StepperHarnessFilters, SubscriptSizing, TabChangeEvent, TabHarnessFilters, TabPanelHarnessFilters, TabsHarnessFilters, TnAutocompleteLabels, TnAutocompleteOption, TnBannerType, TnButtonToggleType, TnCalendarIntl, TnCalendarIntlInput, TnCalendarView, TnCardAction, TnCardControl, TnCardFooterLink, TnCardHeaderStatus, TnCheckboxOption, TnChipInputHarnessFilters, TnChipInputOption, TnConfirmDialogData, TnDialogChromeLabels, TnDialogDefaults, TnDialogOpenTarget, TnDrawerMode, TnDrawerPosition, TnEmptySize, TnFallbackLabels, TnFallbackName, TnFlatTreeNode, TnFormErrorsHarnessFilters, TnFormFieldAriaBindings, TnFormFieldContext, TnFormFieldErrorMessage, TnFormFieldErrorMessages, TnFormFieldErrorResolver, TnFormListContext, TnFormListHarnessFilters, TnFormListItemHarnessFilters, TnMenuItem, TnOptionTestIdSource, TnRadioGroupApi, TnRadioOption, TnSelectLabels, TnSelectOption, TnSelectOptionGroup, TnSelectionChange, TnSortEvent, TnTableDataProvider, TnTableDataSource, TnTableHarnessFilters, TnTableLabels, TnTableMobileLayout, TnTablePagerHarnessFilters, TnTablePagerLabels, TnTablePagination, TnTestAttrName, TnTestIdValue, TnThemeDefinition, TnToastCall, TnToastConfig, TnTreeExpansion, TnTreeHarnessFilters, TnTreeNodeHarnessFilters, TnTreeVirtualNodeData, TnTreeVirtualScrollViewHarnessFilters, TooltipHarnessFilters, TooltipPosition, YearCell };