@ethlete/components 1.0.0-next.31 → 1.0.0-next.32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,16 +1,16 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { TemplateRef, ElementRef, InjectionToken, Type, InputSignal, Provider, Signal, WritableSignal, ViewContainerRef, Injector, Binding, StaticProvider, OnInit, ComponentRef, ModelSignal, OnDestroy, computed, EnvironmentInjector, ApplicationRef } from '@angular/core';
2
+ import { TemplateRef, ElementRef, InjectionToken, Type, InputSignal, Signal, WritableSignal, Provider, ViewContainerRef, Injector, Binding, StaticProvider, OnInit, ComponentRef, ModelSignal, OnDestroy, computed, EnvironmentInjector, ApplicationRef } from '@angular/core';
3
3
  import * as _ethlete_components from '@ethlete/components';
4
4
  import { RoundStageStructureWithMatchesView, RoundStageStructureView, MatchListViewUnion, RoundType } from '@ethlete/types';
5
5
  import * as _angular_platform_browser from '@angular/platform-browser';
6
6
  import * as _ethlete_core from '@ethlete/core';
7
- import { ScrollObserverDirective, ScrollToElementOptions, AnimatableDirective, OverlayRuntimeCloseSource, OverlayRuntimeCloseGuard, OverlayRuntimePositionStrategy, OverlayRuntimeCloseEvent, OverlayRuntimeRef, Breakpoint, AnimatedLifecycleDirective, AnimatedSizeAxis, ColorTheme, ResizeEdge, DragHandleDirective, ResizeMoveEvent, CreateUnsavedChangesTrackerConfig, UnsavedChangesTrackerRef, AnimatedLifecycleState, OverlayRuntimeShiftOptions, AngularRenderer, OverlayRuntimeAnimationDelegate, ConsentHandler, DragMoveEvent, ProvideColorDirective } from '@ethlete/core';
7
+ import { ScrollObserverDirective, ScrollToElementOptions, AnimatableDirective, OverlayRuntimeCloseSource, OverlayRuntimeCloseGuard, OverlayRuntimePositionStrategy, OverlayRuntimeCloseEvent, OverlayRuntimeRef, Breakpoint, AnimatedLifecycleDirective, AnimatedSizeAxis, ColorTheme, ResizeEdge, DragHandleDirective, ResizeMoveEvent, CreateUnsavedChangesTrackerConfig, UnsavedChangesTrackerRef, AnimatedLifecycleState, OverlayRuntimeShiftOptions, AngularRenderer, OverlayRuntimeAnimationDelegate, ConsentHandler, LabelsSource, DragMoveEvent, ProvideColorDirective } from '@ethlete/core';
8
8
  import { Locale } from 'date-fns';
9
- import { AnyQueryCreator, RequestArgs, QueryArgsOf, ResponseType, QueryErrorResponse, RequestError, QueryArgs, QueryCreator, AnyV2QueryCreator, AnyLegacyQueryCreator, QueryDataOf, QueryRepositoryEvent, QueryDevtoolsEntry, Query, QueryRepository, QueryRepositoryCacheEntry, AnyQueryStack, AnyPagedQueryStack, QuerySequence, AnyBearerAuthProvider, WebSocketDevtoolsHandle, QuerySequenceStatus, AnyQuerySnapshot } from '@ethlete/query';
9
+ import * as _angular_forms_signals from '@angular/forms/signals';
10
+ import { FieldTree, ValidationError, FormValueControl, FormCheckboxControl, PathKind, SchemaPath, SchemaPathRules, validate } from '@angular/forms/signals';
11
+ import { QueryFormFields, QueryFormSignals, QueryFormModel, AnyQueryCreator, RequestArgs, QueryArgsOf, ResponseType, QueryErrorResponse, RequestError, QueryArgs, QueryCreator, AnyV2QueryCreator, AnyLegacyQueryCreator, QueryDataOf, QueryRepositoryEvent, QueryDevtoolsEntry, Query, QueryRepository, QueryRepositoryCacheEntry, AnyQueryStack, AnyPagedQueryStack, QuerySequence, AnyBearerAuthProvider, WebSocketDevtoolsHandle, QuerySequenceStatus, AnyQuerySnapshot, AnyV2Query, AnyLegacyQuery, AnyQueryCollection } from '@ethlete/query';
10
12
  import * as rxjs from 'rxjs';
11
13
  import { Observable } from 'rxjs';
12
- import * as _angular_forms_signals from '@angular/forms/signals';
13
- import { ValidationError, FormValueControl, FormCheckboxControl, PathKind, SchemaPath, SchemaPathRules, validate } from '@angular/forms/signals';
14
14
  import { Placement, OffsetOptions, Padding } from '@floating-ui/dom';
15
15
  import * as i1 from '@angular/router';
16
16
 
@@ -957,17 +957,17 @@ type BreadcrumbLabels = {
957
957
  };
958
958
  /** The built-in English labels. */
959
959
  declare const DEFAULT_BREADCRUMB_LABELS: BreadcrumbLabels;
960
- /** The label set every breadcrumb in this injector uses. @default DEFAULT_BREADCRUMB_LABELS */
961
- declare const BREADCRUMB_LABELS: InjectionToken<BreadcrumbLabels>;
962
960
  /**
963
- * Localize the breadcrumb's strings for everything below this injector. Partial — whatever you leave
964
- * out keeps its {@link DEFAULT_BREADCRUMB_LABELS} value.
961
+ * Localize the breadcrumb's strings for everything below this injector, and read the set in effect
962
+ * here as a signal. Partial — whatever you leave out keeps its {@link DEFAULT_BREADCRUMB_LABELS}
963
+ * value. See {@link createLabels} for the shape, which every domain in this library shares.
965
964
  *
966
965
  * @example
967
966
  * provideBreadcrumbLabels({ navigation: 'Brotkrumen', overflow: 'Ausgeblendete Ebenen anzeigen' });
968
967
  */
969
- declare const provideBreadcrumbLabels: (labels: Partial<BreadcrumbLabels>) => Provider;
970
- declare const injectBreadcrumbLabels: () => BreadcrumbLabels;
968
+ declare const provideBreadcrumbLabels: (labels: _ethlete_core.LabelsSource<BreadcrumbLabels>) => _angular_core.Provider;
969
+ declare const injectBreadcrumbLabels: () => _angular_core.Signal<BreadcrumbLabels>;
970
+ declare const BREADCRUMB_LABELS: _angular_core.InjectionToken<_ethlete_core.LabelsSource<BreadcrumbLabels>>;
971
971
 
972
972
  /**
973
973
  * What the breadcrumb needs from a crumb — implemented by `etBreadcrumbItemTemplate`. It is a
@@ -1195,6 +1195,7 @@ declare class BreadcrumbSeparatorDirective {
1195
1195
  * </nav>
1196
1196
  */
1197
1197
  declare class BreadcrumbDirective {
1198
+ private elementRef;
1198
1199
  private injectedLabels;
1199
1200
  /**
1200
1201
  * Move the middle crumbs into an overflow control when the trail doesn't fit. Turn it off to let the
@@ -1230,11 +1231,32 @@ declare class BreadcrumbDirective {
1230
1231
  private fullTrailWidth;
1231
1232
  /** The space the trail has, from the reactive host dimensions (not a `clientWidth` read at call time). */
1232
1233
  private availableWidth;
1234
+ /**
1235
+ * Whether the trail has been measured at least once. Sticky: a later trail change re-measures, but
1236
+ * un-painting an already visible trail to do so would be a worse flash than the one this avoids.
1237
+ */
1238
+ private hasMeasured;
1239
+ /**
1240
+ * Nothing can be known about whether the trail fits before it has been measured, and rendering the full
1241
+ * trail on that guess is the flash on load: the browser paints the overflowing trail, then swaps it for
1242
+ * the collapsed one. While this is true the trail takes its space but isn't painted — see the
1243
+ * `[data-measuring]` rule in the CSS. Only while collapsing is possible at all; otherwise there is no
1244
+ * decision pending and nothing to wait for.
1245
+ *
1246
+ * @internal
1247
+ */
1248
+ isMeasuring: _angular_core.Signal<boolean>;
1233
1249
  /** Whether the middle crumbs are currently hidden behind the overflow control. */
1234
1250
  isCollapsed: _angular_core.Signal<boolean>;
1235
1251
  /** The slots to render: every crumb, or first + overflow + last once collapsed. */
1236
1252
  renderedItems: _angular_core.Signal<BreadcrumbRenderItem[]>;
1237
1253
  constructor();
1254
+ /**
1255
+ * Takes one pair of host measurements as the trail's state: that it has been measured, and — if the full
1256
+ * trail didn't fit — how wide it wants to be. Zero width means the element isn't laid out yet (or sits in
1257
+ * something hidden), which is not a measurement of anything.
1258
+ */
1259
+ private recordMeasurement;
1238
1260
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<BreadcrumbDirective, never>;
1239
1261
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<BreadcrumbDirective, "[etBreadcrumb]", ["etBreadcrumb"], { "collapse": { "alias": "collapse"; "required": false; "isSignal": true; }; "labels": { "alias": "labels"; "required": false; "isSignal": true; }; "crumbs": { "alias": "crumbs"; "required": false; "isSignal": true; }; }, {}, ["declaredCrumbs", "separatorTemplate"], never, true, never>;
1240
1262
  }
@@ -1475,6 +1497,30 @@ declare const CALENDAR_ERROR_CODES: {
1475
1497
  readonly CELL_OUTSIDE_CALENDAR: 2901;
1476
1498
  };
1477
1499
 
1500
+ /**
1501
+ * The strings the calendar renders or announces itself. Month and weekday **names** are not here — those
1502
+ * come from the `DATE_LOCALE` date-fns locale, which is what a localized app provides.
1503
+ */
1504
+ type CalendarLabels = {
1505
+ /** Accessible label for the control that steps back a month. */
1506
+ previousMonth: string;
1507
+ /** Accessible label for the control that steps forward a month. */
1508
+ nextMonth: string;
1509
+ };
1510
+ /** The built-in English labels. */
1511
+ declare const DEFAULT_CALENDAR_LABELS: CalendarLabels;
1512
+ /**
1513
+ * Localize the calendar's strings for everything below this injector, and read the set in effect here as a
1514
+ * signal. Partial — whatever you leave out keeps its {@link DEFAULT_CALENDAR_LABELS} value. See {@link createLabels}
1515
+ * for the shape, which every domain in this library shares.
1516
+ *
1517
+ * @example
1518
+ * provideCalendarLabels({ previousMonth: 'Vorheriger Monat', nextMonth: 'Nächster Monat' });
1519
+ */
1520
+ declare const provideCalendarLabels: (labels: _ethlete_core.LabelsSource<CalendarLabels>) => _angular_core.Provider;
1521
+ declare const injectCalendarLabels: () => _angular_core.Signal<CalendarLabels>;
1522
+ declare const CALENDAR_LABELS: _angular_core.InjectionToken<_ethlete_core.LabelsSource<CalendarLabels>>;
1523
+
1478
1524
  type CalendarWeekStartsOn = 0 | 1 | 2 | 3 | 4 | 5 | 6;
1479
1525
 
1480
1526
  type CalendarMode = 'single' | 'range';
@@ -1599,9 +1645,14 @@ declare class CalendarGridDirective {
1599
1645
  }
1600
1646
 
1601
1647
  declare class CalendarComponent {
1648
+ private calendarLabels;
1602
1649
  protected calendar: CalendarDirective;
1603
- previousMonthLabel: _angular_core.InputSignal<string>;
1604
- nextMonthLabel: _angular_core.InputSignal<string>;
1650
+ previousMonthLabel: _angular_core.InputSignal<string | null>;
1651
+ nextMonthLabel: _angular_core.InputSignal<string | null>;
1652
+ /** The string in effect: this instance's `previousMonthLabel`, else the domain's label set. */
1653
+ protected resolvedPreviousMonthLabel: _angular_core.Signal<string>;
1654
+ /** The string in effect: this instance's `nextMonthLabel`, else the domain's label set. */
1655
+ protected resolvedNextMonthLabel: _angular_core.Signal<string>;
1605
1656
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<CalendarComponent, never>;
1606
1657
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<CalendarComponent, "et-calendar", never, { "previousMonthLabel": { "alias": "previousMonthLabel"; "required": false; "isSignal": true; }; "nextMonthLabel": { "alias": "nextMonthLabel"; "required": false; "isSignal": true; }; }, {}, never, never, true, [{ directive: typeof CalendarDirective; inputs: { "mode": "mode"; "min": "min"; "max": "max"; "dateFilter": "dateFilter"; "firstDayOfWeek": "firstDayOfWeek"; "locale": "locale"; "value": "value"; "rangeValue": "rangeValue"; "activeMonth": "activeMonth"; }; outputs: { "valueChange": "valueChange"; "rangeValueChange": "rangeValueChange"; "activeMonthChange": "activeMonthChange"; }; }]>;
1607
1658
  }
@@ -1644,17 +1695,17 @@ type CarouselLabels = {
1644
1695
  };
1645
1696
  /** The built-in English labels. */
1646
1697
  declare const DEFAULT_CAROUSEL_LABELS: CarouselLabels;
1647
- /** The label set every carousel in this injector uses. @default DEFAULT_CAROUSEL_LABELS */
1648
- declare const CAROUSEL_LABELS: InjectionToken<CarouselLabels>;
1649
1698
  /**
1650
- * Localize the carousel's strings for everything below this injector. Partial — whatever you leave out
1651
- * keeps its {@link DEFAULT_CAROUSEL_LABELS} value.
1699
+ * Localize the carousel's strings for everything below this injector, and read the set in effect here
1700
+ * as a signal. Partial — whatever you leave out keeps its {@link DEFAULT_CAROUSEL_LABELS} value. See
1701
+ * {@link createLabels} for the shape, which every domain in this library shares.
1652
1702
  *
1653
1703
  * @example
1654
1704
  * provideCarouselLabels({ previous: 'Vorheriges Bild', next: 'Nächstes Bild' });
1655
1705
  */
1656
- declare const provideCarouselLabels: (labels: Partial<CarouselLabels>) => Provider;
1657
- declare const injectCarouselLabels: () => CarouselLabels;
1706
+ declare const provideCarouselLabels: (labels: _ethlete_core.LabelsSource<CarouselLabels>) => _angular_core.Provider;
1707
+ declare const injectCarouselLabels: () => _angular_core.Signal<CarouselLabels>;
1708
+ declare const CAROUSEL_LABELS: _angular_core.InjectionToken<_ethlete_core.LabelsSource<CarouselLabels>>;
1658
1709
 
1659
1710
  declare class ScrollableActiveChildDirective {
1660
1711
  private scrollable;
@@ -1735,7 +1786,7 @@ declare class ScrollableDirective {
1735
1786
  scrollMode: _angular_core.InputSignalWithTransform<ScrollableScrollMode, _ethlete_core.BreakpointInput<ScrollableScrollMode>>;
1736
1787
  scrollOrigin: _angular_core.InputSignal<ScrollableScrollOrigin>;
1737
1788
  scrollMargin: _angular_core.InputSignalWithTransform<number, unknown>;
1738
- renderScrollbars: _angular_core.InputSignal<boolean>;
1789
+ renderScrollbars: _angular_core.InputSignalWithTransform<boolean, unknown>;
1739
1790
  /** @internal */
1740
1791
  scrollContainerRef: _angular_core.WritableSignal<ElementRef<HTMLElement> | null>;
1741
1792
  private childIntersectionsActivated;
@@ -1848,7 +1899,7 @@ declare class ScrollableDarkenDirective {
1848
1899
 
1849
1900
  declare class ScrollableDragDirective {
1850
1901
  private scrollable;
1851
- enabled: _angular_core.InputSignal<boolean>;
1902
+ enabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
1852
1903
  cursorDragScrollState: {
1853
1904
  isDragging: _angular_core.Signal<boolean>;
1854
1905
  currentDragAmount: _angular_core.Signal<{
@@ -1866,7 +1917,7 @@ declare const SCROLLABLE_ERROR_CODES: {
1866
1917
  };
1867
1918
 
1868
1919
  declare class ScrollableIgnoreChildDirective {
1869
- enabled: _angular_core.InputSignal<boolean>;
1920
+ enabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
1870
1921
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ScrollableIgnoreChildDirective, never>;
1871
1922
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ScrollableIgnoreChildDirective, "[etScrollableIgnoreChild]", never, { "enabled": { "alias": "enabled"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1872
1923
  }
@@ -1913,7 +1964,7 @@ declare class ScrollableNavigationDirective {
1913
1964
  declare class ScrollableSnapDirective {
1914
1965
  private scrollable;
1915
1966
  private document;
1916
- enabled: _angular_core.InputSignal<boolean>;
1967
+ enabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
1917
1968
  snapOrigin: _angular_core.InputSignal<ScrollableScrollOrigin>;
1918
1969
  /**
1919
1970
  * Whether a pointer is being held on the track right now.
@@ -2514,6 +2565,25 @@ declare class CarouselComponent {
2514
2565
  /** The carousel, its slide template, and the headless directives to build your own out of a scrollable. */
2515
2566
  declare const CAROUSEL_IMPORTS: readonly [typeof CarouselComponent, typeof CarouselSlideDirective, typeof CarouselItemDirective, typeof CarouselDirective, typeof CarouselAutoplayDirective, typeof CarouselPreviousDirective, typeof CarouselNextDirective, typeof CarouselPlayToggleDirective];
2516
2567
 
2568
+ /** The strings a chip renders itself. Its content is yours; the remove button is the chip's own. */
2569
+ type ChipLabels = {
2570
+ /** Accessible label for a removable chip's remove button. */
2571
+ remove: string;
2572
+ };
2573
+ /** The built-in English labels. */
2574
+ declare const DEFAULT_CHIP_LABELS: ChipLabels;
2575
+ /**
2576
+ * Localize a chip's strings for everything below this injector, and read the set in effect here as a
2577
+ * signal. Partial — whatever you leave out keeps its {@link DEFAULT_CHIP_LABELS} value. See {@link createLabels}
2578
+ * for the shape, which every domain in this library shares.
2579
+ *
2580
+ * @example
2581
+ * provideChipLabels({ remove: 'Entfernen' });
2582
+ */
2583
+ declare const provideChipLabels: (labels: _ethlete_core.LabelsSource<ChipLabels>) => _angular_core.Provider;
2584
+ declare const injectChipLabels: () => _angular_core.Signal<ChipLabels>;
2585
+ declare const CHIP_LABELS: _angular_core.InjectionToken<_ethlete_core.LabelsSource<ChipLabels>>;
2586
+
2517
2587
  declare const CHIP_ERROR_CODES: {
2518
2588
  readonly REMOVE_OUTSIDE_CHIP: 1100;
2519
2589
  };
@@ -2529,9 +2599,12 @@ declare class ChipDirective {
2529
2599
  }
2530
2600
 
2531
2601
  declare class ChipRemoveDirective {
2602
+ private chipLabels;
2532
2603
  protected chip: ChipDirective | null;
2533
2604
  private elementRef;
2534
- removeLabel: _angular_core.InputSignal<string>;
2605
+ removeLabel: _angular_core.InputSignal<string | null>;
2606
+ /** The string in effect: this instance's `removeLabel`, else the domain's label set. */
2607
+ resolvedRemoveLabel: _angular_core.Signal<string>;
2535
2608
  protected readonly IS_BUTTON: boolean;
2536
2609
  constructor();
2537
2610
  protected handleClick(event: Event): void;
@@ -2547,6 +2620,452 @@ declare class ChipComponent {
2547
2620
 
2548
2621
  declare const CHIP_IMPORTS: readonly [typeof ChipComponent, typeof ChipDirective, typeof ChipRemoveDirective];
2549
2622
 
2623
+ /**
2624
+ * What the overlay closes with. `didUpdate: false` for a dismissal — the draft is thrown away and the page's
2625
+ * filters are untouched.
2626
+ */
2627
+ type FilterOverlayResult<TValue = unknown> = {
2628
+ didUpdate: false;
2629
+ } | {
2630
+ didUpdate: true;
2631
+ value: TValue;
2632
+ };
2633
+ /**
2634
+ * A live count of what the draft filters would return, so the submit button can say "Show 42 results" instead of
2635
+ * "Apply" and the reader can tell before committing.
2636
+ *
2637
+ * Built by {@link filterOverlayPreviewFromQuery} for the usual case; hand-write it when the count comes from
2638
+ * somewhere other than a single query (a local collection, an aggregate of several endpoints).
2639
+ */
2640
+ type FilterOverlayPreview = {
2641
+ /** A count is in flight. */
2642
+ loading: Signal<boolean>;
2643
+ /** The count could not be established. */
2644
+ hasError: Signal<boolean>;
2645
+ /** How many results the draft would produce, or `null` while that is unknown. */
2646
+ totalHits: Signal<number | null>;
2647
+ };
2648
+ /** What the submit button says and whether it can be pressed. */
2649
+ type FilterOverlaySubmitButton = {
2650
+ label: string;
2651
+ disabled: boolean;
2652
+ };
2653
+ /** Everything the default submit-button resolver has to go on. */
2654
+ type FilterOverlaySubmitState = {
2655
+ /** `null` when the overlay has no preview at all — then there is no count to wait for. */
2656
+ totalHits: number | null;
2657
+ loading: boolean;
2658
+ hasError: boolean;
2659
+ hasPreview: boolean;
2660
+ /** Counts above this are reported as "more than N", since an exact number stops being useful. */
2661
+ maxCountedHits: number;
2662
+ };
2663
+
2664
+ /**
2665
+ * Every string the filter overlay's submit button can show. The counted ones are functions, since the number is
2666
+ * the point.
2667
+ */
2668
+ type FilterOverlayLabels = {
2669
+ /** While a count is in flight. */
2670
+ loading: string;
2671
+ /** When the count could not be established. */
2672
+ error: string;
2673
+ /** When the draft filters would return nothing. */
2674
+ empty: string;
2675
+ /** Exactly one result — worth its own string, because "Show 1 results" reads badly. */
2676
+ one: string;
2677
+ /** A known count. */
2678
+ many: (totalHits: number) => string;
2679
+ /** More results than are worth counting exactly. */
2680
+ more: (maxCountedHits: number) => string;
2681
+ /** When the overlay has no preview, so there is no count to report. */
2682
+ apply: string;
2683
+ /** The reset control. */
2684
+ reset: string;
2685
+ };
2686
+ /** The built-in English labels. */
2687
+ declare const DEFAULT_FILTER_OVERLAY_LABELS: FilterOverlayLabels;
2688
+ /** The built-in German labels, used when the current locale is a German one. */
2689
+ declare const GERMAN_FILTER_OVERLAY_LABELS: FilterOverlayLabels;
2690
+ /** The label set for a locale. Anything other than English and German needs {@link provideFilterOverlayLabels}. */
2691
+ declare const filterOverlayLabelsForLocale: (locale: string) => FilterOverlayLabels;
2692
+ /**
2693
+ * Localize the filter overlay's strings below this injector, and read the set in effect here as a signal.
2694
+ * Partial — what you leave out keeps the value the current locale gives it. See {@link createLabels} for the
2695
+ * shape, which every domain in this library shares.
2696
+ *
2697
+ * @example
2698
+ * provideFilterOverlayLabels({ apply: 'Voir les résultats', reset: 'Réinitialiser' });
2699
+ */
2700
+ declare const provideFilterOverlayLabels: (labels: _ethlete_core.LabelsSource<FilterOverlayLabels>) => _angular_core.Provider;
2701
+ declare const injectFilterOverlayLabels: () => _angular_core.Signal<FilterOverlayLabels>;
2702
+ declare const FILTER_OVERLAY_LABELS: _angular_core.InjectionToken<_ethlete_core.LabelsSource<FilterOverlayLabels>>;
2703
+ /**
2704
+ * The submit button, worked out from the preview.
2705
+ *
2706
+ * The button is deliberately the place the count appears: it is what the reader is about to press, so putting
2707
+ * the consequence on it ("Show 42 results") lets them decide without applying first. It disables itself while a
2708
+ * count is pending, when the count failed, and when the answer is zero — applying a filter that returns nothing
2709
+ * is never what someone meant to do.
2710
+ *
2711
+ * An overlay with no preview has nothing to wait for and simply reads "Show results". cdk's version returned the
2712
+ * *loading* state in that case, which left the button permanently disabled.
2713
+ */
2714
+ declare const resolveFilterOverlaySubmitButton: (state: FilterOverlaySubmitState, labels: FilterOverlayLabels) => FilterOverlaySubmitButton;
2715
+
2716
+ type FilterOverlayConfig<TFields extends QueryFormFields> = {
2717
+ /**
2718
+ * The page's filter state. The overlay never edits it directly — it edits a detached branch and writes the
2719
+ * branch back on submit, which is what makes dismissing the overlay a discard.
2720
+ */
2721
+ queryForm: QueryFormSignals<TFields>;
2722
+ /**
2723
+ * A live count of what the draft would return, driving the submit button. Optional; without it the button just
2724
+ * says "Show results". Use {@link filterOverlayPreviewFromQuery} for the single-query case.
2725
+ */
2726
+ preview?: (draftValue: Signal<QueryFormModel<TFields>>) => FilterOverlayPreview;
2727
+ /**
2728
+ * Counts above this are reported as "more than N" rather than exactly. Past a few hundred the precise number
2729
+ * stops telling the reader anything they can act on. @default 250
2730
+ */
2731
+ maxCountedHits?: number;
2732
+ /** Full control over the submit button's label and disabled state, replacing the built-in resolver. */
2733
+ submitButton?: (state: FilterOverlaySubmitState, labels: FilterOverlayLabels) => FilterOverlaySubmitButton;
2734
+ };
2735
+ /**
2736
+ * The draft's editing surface — a query form branch, described by its **value** shape rather than by its field
2737
+ * map.
2738
+ *
2739
+ * That is deliberate and worth explaining: `QueryFieldDef<T>` is contravariant in `T` (it can hold a
2740
+ * `valueToQueryParam: (value: T) => unknown`), so a concrete field map does *not* satisfy
2741
+ * `Record<string, QueryFieldDef<unknown>>`. Inference copes, but an explicit type argument —
2742
+ * `injectFilterOverlay<typeof MY_FIELDS>()` — cannot be written at all. Naming the value shape sidesteps it, and
2743
+ * is what a consumer actually cares about. Structurally identical to `QueryFormBranch`.
2744
+ */
2745
+ type FilterOverlayDraft<TValue> = {
2746
+ /** The bindable signal-forms field tree: `draft.fields.search`. */
2747
+ readonly fields: FieldTree<TValue>;
2748
+ /** The draft's live value. */
2749
+ readonly value: Signal<TValue>;
2750
+ /** How many of the draft's *filters* are set — search, sort and pagination excluded. */
2751
+ readonly activeFilterCount: Signal<number>;
2752
+ setValue(value: TValue): void;
2753
+ patchValue(value: Partial<TValue>): void;
2754
+ resetFieldToDefault(key: keyof TValue): void;
2755
+ resetAllFieldsToDefault(): void;
2756
+ };
2757
+ /** The value shape of a query form, for naming a {@link FilterOverlay} without naming its field map. */
2758
+ type FilterOverlayValueOf<TForm> = TForm extends {
2759
+ value: Signal<infer TValue>;
2760
+ } ? TValue : never;
2761
+ type FilterOverlay<TValue = unknown> = {
2762
+ /**
2763
+ * The draft being edited — bind its `fields` to your controls. A detached clone of the page's query form: its
2764
+ * own value, no URL writes, no reset graph, so nothing the reader does here affects the page until they submit.
2765
+ */
2766
+ draft: FilterOverlayDraft<TValue>;
2767
+ /** The live count, if the overlay was configured with one. */
2768
+ preview: FilterOverlayPreview | null;
2769
+ /** What the submit button should say, and whether it can be pressed. */
2770
+ submitButton: Signal<FilterOverlaySubmitButton>;
2771
+ /** The strings in effect, after locale and any overrides. */
2772
+ labels: Signal<FilterOverlayLabels>;
2773
+ /** How many filters the draft has set, for a badge on the overlay's own controls. */
2774
+ activeFilterCount: Signal<number>;
2775
+ /** Whether the draft differs from the filters actually applied — what "unsaved changes" means here. */
2776
+ hasChanges: Signal<boolean>;
2777
+ /**
2778
+ * Whether every field in the draft is still at its default, i.e. there is nothing for `reset()` to do.
2779
+ *
2780
+ * Not the same as `activeFilterCount() === 0`: the query form deliberately leaves navigation state (search,
2781
+ * page, sort) out of that count, so a reader who has typed a search has nothing to show in a badge but plenty
2782
+ * to reset.
2783
+ */
2784
+ isPristine: Signal<boolean>;
2785
+ /** Write the draft back to the page's filters and close. */
2786
+ submit: () => void;
2787
+ /** Put every filter back to its default, without closing. */
2788
+ reset: () => void;
2789
+ /** Close without applying anything. */
2790
+ discard: () => void;
2791
+ };
2792
+ /** The filter overlay provided for the current overlay component. Inject with `{ optional: true }` in a control
2793
+ * that may also be used outside one. */
2794
+ declare const FILTER_OVERLAY_TOKEN: InjectionToken<FilterOverlay<unknown>>;
2795
+ /**
2796
+ * Provides the filter overlay for an overlay component: a draft of the page's filters that the reader edits, a
2797
+ * live count of what those filters would return, and an explicit apply.
2798
+ *
2799
+ * The model is **edit a copy, then commit** — dismissing the overlay discards, which is what lets a filter panel
2800
+ * be closed with Escape without consequence. It is cdk's `FilterOverlayService` rebuilt on the signals query
2801
+ * form: no reactive-forms `FormGroup` to clone, no legacy query types, and `reset()` needs no configured defaults
2802
+ * because the query form already knows them.
2803
+ *
2804
+ * @example
2805
+ * export const FILTERS_OVERLAY = defineOverlay({ component: TeamFiltersComponent, … });
2806
+ *
2807
+ * @Component({
2808
+ * providers: [
2809
+ * provideFilterOverlay({
2810
+ * queryForm: injectTeamFilters(),
2811
+ * preview: filterOverlayPreviewFromQuery({
2812
+ * queryCreator: searchTeams,
2813
+ * args: (value) => ({ queryParams: { ...value, limit: 1 } }),
2814
+ * }),
2815
+ * }),
2816
+ * ],
2817
+ * })
2818
+ * export class TeamFiltersComponent {
2819
+ * protected filters = injectFilterOverlay();
2820
+ * }
2821
+ */
2822
+ declare const provideFilterOverlay: <TFields extends QueryFormFields>(config: FilterOverlayConfig<TFields>) => Provider[];
2823
+ /**
2824
+ * The filter overlay provided above this component, typed to your filters' **value** shape:
2825
+ *
2826
+ * ```ts
2827
+ * const createTeamFilters = () => createQueryForm({ fields: TEAM_FILTER_FIELDS });
2828
+ * type TeamFilterValue = FilterOverlayValueOf<ReturnType<typeof createTeamFilters>>;
2829
+ *
2830
+ * protected filters = injectFilterOverlay<TeamFilterValue>();
2831
+ * ```
2832
+ */
2833
+ declare const injectFilterOverlay: <TValue = unknown>() => FilterOverlay<TValue>;
2834
+
2835
+ declare const FILTER_OVERLAY_ERROR_CODES: {
2836
+ readonly MISSING_FILTER_OVERLAY: 4200;
2837
+ };
2838
+
2839
+ /**
2840
+ * The usual live preview: one query, re-executed as the draft filters change, whose response says how many
2841
+ * results they would return.
2842
+ *
2843
+ * A factory of a factory, because the query has to be created in the overlay's injection context — which only
2844
+ * exists once the overlay is open. Pass the result as the config's `preview`; the filter overlay calls it with
2845
+ * its draft value.
2846
+ *
2847
+ * Debouncing is the query form's job, not this one's: the branch's value is already the debounced one where a
2848
+ * field asked for it, so typing in a search box does not fire a request per keystroke.
2849
+ *
2850
+ * @example
2851
+ * providers: [
2852
+ * provideFilterOverlay({
2853
+ * queryForm: filters,
2854
+ * preview: filterOverlayPreviewFromQuery({
2855
+ * queryCreator: searchTeams,
2856
+ * args: (value) => ({ queryParams: { ...value, limit: 1 } }),
2857
+ * toTotalHits: (response) => response.totalHits,
2858
+ * }),
2859
+ * }),
2860
+ * ]
2861
+ */
2862
+ declare const filterOverlayPreviewFromQuery: <TCreator extends AnyQueryCreator, TValue>(config: {
2863
+ /** The query creator to run. Created once, then re-executed as the draft changes. */
2864
+ queryCreator: TCreator;
2865
+ /**
2866
+ * Builds the request args from the draft value. Return `null` to skip the request — for a draft that is not
2867
+ * yet worth counting. Ask for as few rows as the endpoint allows: only the total is used.
2868
+ */
2869
+ args: (value: TValue) => RequestArgs<QueryArgsOf<TCreator>> | null;
2870
+ /** Pulls the total out of the response. @default `response.totalHits` */
2871
+ toTotalHits?: (response: ResponseType<QueryArgsOf<TCreator>>) => number;
2872
+ }) => (draftValue: Signal<TValue>) => FilterOverlayPreview;
2873
+
2874
+ /**
2875
+ * The submit button. Takes its label and disabled state from the live preview, so the button reads "Show 42
2876
+ * results" rather than "Apply" and disables itself while the count is pending or zero.
2877
+ *
2878
+ * Put it on a real `<button>` — it is the primary action of a form and should behave like one.
2879
+ *
2880
+ * @example
2881
+ * <button etFilterOverlaySubmit et-button></button>
2882
+ */
2883
+ declare class FilterOverlaySubmitDirective {
2884
+ protected filterOverlay: _ethlete_components.FilterOverlay<unknown> | null;
2885
+ protected isDisabled: _angular_core.Signal<boolean>;
2886
+ /** The label the button should show. Rendered by `<et-filter-overlay-submit-label>`, or read it yourself. */
2887
+ label: _angular_core.Signal<string>;
2888
+ constructor();
2889
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FilterOverlaySubmitDirective, never>;
2890
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<FilterOverlaySubmitDirective, "button[etFilterOverlaySubmit]", ["etFilterOverlaySubmit"], {}, {}, never, never, true, never>;
2891
+ }
2892
+ /**
2893
+ * The reset control: puts every filter in the draft back to its default without closing the overlay, so the
2894
+ * reader can start again without losing the panel.
2895
+ *
2896
+ * @example
2897
+ * <button etFilterOverlayReset et-button variant="transparent">Reset</button>
2898
+ */
2899
+ declare class FilterOverlayResetDirective {
2900
+ protected filterOverlay: _ethlete_components.FilterOverlay<unknown> | null;
2901
+ /**
2902
+ * Nothing to reset when every field is already at its default. Deliberately not `activeFilterCount() === 0`:
2903
+ * the query form leaves search and pagination out of that count, so a typed search would otherwise leave the
2904
+ * reset button disabled with something still to clear.
2905
+ */
2906
+ protected isDisabled: _angular_core.Signal<boolean>;
2907
+ constructor();
2908
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FilterOverlayResetDirective, never>;
2909
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<FilterOverlayResetDirective, "button[etFilterOverlayReset]", ["etFilterOverlayReset"], {}, {}, never, never, true, never>;
2910
+ }
2911
+
2912
+ declare const FILTER_OVERLAY_IMPORTS: readonly [typeof FilterOverlaySubmitDirective, typeof FilterOverlayResetDirective];
2913
+
2914
+ declare const FLOATING_ACTION_ERROR_CODES: {
2915
+ readonly PART_OUTSIDE_FLOATING_ACTION: 4100;
2916
+ readonly MISSING_ANCHOR: 4101;
2917
+ };
2918
+
2919
+ /**
2920
+ * The trigger's home in the document flow — the element that stays put and keeps its space when the trigger
2921
+ * detaches.
2922
+ *
2923
+ * It has to be a separate element from the trigger, and that is the whole trick: once the trigger is
2924
+ * `position: fixed` it is *always* on screen, so observing it would immediately say "come back", then "go
2925
+ * away", forever. The anchor never moves, so its visibility is a stable question. It is also what stops the
2926
+ * layout jumping when the trigger leaves the flow.
2927
+ *
2928
+ * @example
2929
+ * <div etFloatingActionAnchor>
2930
+ * <button etFloatingActionTrigger (click)="openFilters()">Filter</button>
2931
+ * </div>
2932
+ */
2933
+ declare class FloatingActionAnchorDirective {
2934
+ /** @internal Where the anchor sits relative to the viewport — the input to the whole state machine. */
2935
+ intersection: _angular_core.Signal<_ethlete_core.IntersectionObserverEntryWithDetails[]>;
2936
+ constructor();
2937
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FloatingActionAnchorDirective, never>;
2938
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<FloatingActionAnchorDirective, "[etFloatingActionAnchor]", ["etFloatingActionAnchor"], {}, {}, never, never, true, never>;
2939
+ }
2940
+ /**
2941
+ * The button (or link) itself. Carries the class the stylesheet moves, and nothing else — it stays the same
2942
+ * element in the same place in the DOM whether it is inline or floating, so the tab order never changes and a
2943
+ * screen reader never sees it appear or disappear.
2944
+ *
2945
+ * @example
2946
+ * <button etFloatingActionTrigger (click)="openFilters()">Filter</button>
2947
+ */
2948
+ declare class FloatingActionTriggerDirective {
2949
+ elementRef: ElementRef<HTMLElement>;
2950
+ constructor();
2951
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FloatingActionTriggerDirective, never>;
2952
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<FloatingActionTriggerDirective, "[etFloatingActionTrigger]", ["etFloatingActionTrigger"], {}, {}, never, never, true, never>;
2953
+ }
2954
+ /**
2955
+ * The region the trigger acts on — the results list a filter button filters, the form a save bar saves.
2956
+ *
2957
+ * Optional, and what it buys is knowing when to *stop* offering the action: once this has scrolled past, the
2958
+ * reader is somewhere else on the page and a pinned "Filter" button is just clutter. Without it the trigger
2959
+ * floats for the rest of the page.
2960
+ *
2961
+ * @example
2962
+ * <ul etFloatingActionScope>…</ul>
2963
+ */
2964
+ declare class FloatingActionScopeDirective {
2965
+ /** @internal Whether the region is still in play. */
2966
+ intersection: _angular_core.Signal<_ethlete_core.IntersectionObserverEntryWithDetails[]>;
2967
+ constructor();
2968
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FloatingActionScopeDirective, never>;
2969
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<FloatingActionScopeDirective, "[etFloatingActionScope]", ["etFloatingActionScope"], {}, {}, never, never, true, never>;
2970
+ }
2971
+ /**
2972
+ * Where `scrollToTop()` scrolls to. Optional — without it the floating action's own element is the target,
2973
+ * which is usually what you want.
2974
+ *
2975
+ * Put it somewhere else when the thing to return to isn't the top of the container: a filter panel that should
2976
+ * scroll back to the first result rather than to the page heading above it.
2977
+ *
2978
+ * @example
2979
+ * <h2 etFloatingActionTop>Results</h2>
2980
+ */
2981
+ declare class FloatingActionTopDirective {
2982
+ elementRef: ElementRef<HTMLElement>;
2983
+ constructor();
2984
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FloatingActionTopDirective, never>;
2985
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<FloatingActionTopDirective, "[etFloatingActionTop]", ["etFloatingActionTop"], {}, {}, never, never, true, never>;
2986
+ }
2987
+
2988
+ /**
2989
+ * Where the trigger is right now.
2990
+ *
2991
+ * - `inline` — its anchor is on screen, so it sits in the flow where it was written.
2992
+ * - `floating` — the anchor has scrolled away but the region it acts on is still in play, so the trigger
2993
+ * detaches and pins itself to the corner.
2994
+ * - `hidden` — the region has scrolled away too. There is nothing left to act on, so the trigger goes.
2995
+ */
2996
+ declare const FLOATING_ACTION_STATES: {
2997
+ readonly INLINE: "inline";
2998
+ readonly FLOATING: "floating";
2999
+ readonly HIDDEN: "hidden";
3000
+ };
3001
+ type FloatingActionState = (typeof FLOATING_ACTION_STATES)[keyof typeof FLOATING_ACTION_STATES];
3002
+
3003
+ /**
3004
+ * Keeps an action reachable after the reader has scrolled past it: the trigger sits in the flow where it was
3005
+ * written, and pins itself to a corner of the viewport once its place in the page has scrolled away. A filter
3006
+ * button above a long list, a "save changes" bar, a back-to-top.
3007
+ *
3008
+ * Ported from cdk's `rich-filter`, which was never about filtering — it renders no filter UI and imports nothing
3009
+ * from `@ethlete/query`. This is that scroll-coordination pattern under a name that says what it does.
3010
+ *
3011
+ * **Why not CSS?** `position: sticky` can keep an element at an edge, but it cannot move it to a corner of the
3012
+ * viewport, and it has no way to express "and the region this acts on is still on screen" — which is the part
3013
+ * that stops a pinned button following the reader onto unrelated content. So the state comes from two
3014
+ * intersection observers and CSS reacts to it.
3015
+ *
3016
+ * @example
3017
+ * <div etFloatingAction>
3018
+ * <div etFloatingActionAnchor>
3019
+ * <button etFloatingActionTrigger (click)="openFilters()">Filter</button>
3020
+ * </div>
3021
+ *
3022
+ * <ul etFloatingActionScope>
3023
+ * @for (result of results(); track result.id) { <li>…</li> }
3024
+ * </ul>
3025
+ * </div>
3026
+ */
3027
+ declare class FloatingActionDirective {
3028
+ private elementRef;
3029
+ private styleManager;
3030
+ /**
3031
+ * Keep the trigger in the flow, whatever the scroll position. The escape hatch for turning the behaviour off
3032
+ * per breakpoint or per route without unwinding the markup — a desktop layout with the filters already in a
3033
+ * sidebar has nothing to float. @default false
3034
+ */
3035
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
3036
+ /** @internal Set by `etFloatingActionAnchor`. Its visibility is what drives the state. */
3037
+ anchor: _angular_core.WritableSignal<FloatingActionAnchorDirective | null>;
3038
+ /** @internal Set by `etFloatingActionTrigger`. */
3039
+ trigger: _angular_core.WritableSignal<FloatingActionTriggerDirective | null>;
3040
+ /** @internal Set by `etFloatingActionScope`; optional, and what bounds the action to a region. */
3041
+ scope: _angular_core.WritableSignal<FloatingActionScopeDirective | null>;
3042
+ /** @internal Set by `etFloatingActionTop`; optional override for `scrollToTop()`. */
3043
+ top: _angular_core.WritableSignal<FloatingActionTopDirective | null>;
3044
+ /**
3045
+ * Where the trigger is: in the flow, pinned to the corner, or gone.
3046
+ *
3047
+ * Read off *above*, not merely "not visible": scrolling **down** past the anchor is what should pin the
3048
+ * trigger, while an anchor still below the fold has simply not been reached and must stay put. The same goes
3049
+ * for the scope — once it is above, the reader has left the region behind.
3050
+ */
3051
+ state: _angular_core.Signal<FloatingActionState>;
3052
+ /** Whether the trigger is currently pinned to the viewport. */
3053
+ isFloating: _angular_core.Signal<boolean>;
3054
+ constructor();
3055
+ /**
3056
+ * Scroll back to the top of the region — what a filter button does after applying filters, so the reader sees
3057
+ * the new first result rather than wherever they happened to be. Targets `[etFloatingActionTop]` if there is
3058
+ * one, otherwise this element.
3059
+ */
3060
+ scrollToTop(options?: ScrollIntoViewOptions): void;
3061
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FloatingActionDirective, never>;
3062
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<FloatingActionDirective, "[etFloatingAction]", ["etFloatingAction"], { "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
3063
+ }
3064
+
3065
+ declare const FLOATING_ACTION_IMPORTS: readonly [typeof FloatingActionDirective, typeof FloatingActionAnchorDirective, typeof FloatingActionTriggerDirective, typeof FloatingActionScopeDirective, typeof FloatingActionTopDirective];
3066
+
3067
+ declare const FLOATING_ACTION_TOKEN: InjectionToken<FloatingActionDirective>;
3068
+
2550
3069
  declare const CASCADER_ERROR_CODES: {
2551
3070
  readonly MISSING_TRIGGER: 3300;
2552
3071
  readonly MISSING_SURFACE: 3301;
@@ -2615,8 +3134,11 @@ type FormFieldControl = {
2615
3134
  hasValue?: Signal<boolean>;
2616
3135
  /** True while the committed text can't be parsed (date/time/duration typed entry). */
2617
3136
  parseError?: Signal<boolean>;
2618
- /** User-facing message shown when `parseError` is set and there is no validation error. */
2619
- parseErrorMessage?: Signal<string>;
3137
+ /**
3138
+ * User-facing message shown when `parseError` is set and there is no validation error — the control's
3139
+ * own `parseErrorMessage` input if it has one, else `DATE_TIME_LABELS`.
3140
+ */
3141
+ resolvedParseErrorMessage?: Signal<string>;
2620
3142
  /**
2621
3143
  * True when the control carries an author-supplied accessible name (its own `aria-label` /
2622
3144
  * `aria-labelledby`) independent of a projected `<et-label>`. The field's dev-time labelling
@@ -2624,19 +3146,46 @@ type FormFieldControl = {
2624
3146
  * `<et-label>` for labelling leave this unset.
2625
3147
  */
2626
3148
  hasCustomAccessibleName?: Signal<boolean>;
3149
+ /**
3150
+ * The control's current value. `et-counter` derives the length it displays from this — a string's
3151
+ * `length`, an array's/set's element count, or whatever the counter's `lengthOf` says.
3152
+ */
3153
+ value?: Signal<unknown>;
3154
+ /**
3155
+ * The bound field's `maxLength()` limit. Signal forms binds this automatically into any control
3156
+ * that declares a `maxLength` input, so `et-counter` gets its limit from the schema without the
3157
+ * consumer repeating it. Note the controls deliberately do **not** forward it to the native
3158
+ * `maxlength` attribute — hard-truncating input would stop the validator from ever reporting the
3159
+ * over-limit error the counter is there to make visible.
3160
+ */
3161
+ maxLength?: Signal<number | undefined>;
3162
+ /**
3163
+ * True while an async validator is in flight for the bound field — bound automatically by signal
3164
+ * forms into any control declaring a `pending` input. Surfaces as the field's busy state.
3165
+ */
3166
+ pending?: Signal<boolean>;
2627
3167
  activate(): void;
2628
3168
  };
2629
3169
  type HintComponentBase = object;
3170
+ /** A projected `et-counter`. The field only needs to know one is present to make room for it. */
3171
+ type CounterComponentBase = object;
2630
3172
  declare const FORM_FIELD_TOKEN: InjectionToken<FormFieldDirectiveBase>;
2631
3173
  type FormFieldDirectiveBase = {
2632
3174
  registerControl(control: FormFieldControl): void;
2633
3175
  unregisterControl(control: FormFieldControl): void;
2634
3176
  registerHint(hint: HintComponentBase): void;
2635
3177
  unregisterHint(hint: HintComponentBase): void;
3178
+ registerCounter(counter: CounterComponentBase): void;
3179
+ unregisterCounter(counter: CounterComponentBase): void;
2636
3180
  unregisterLabel(label: LabelDirectiveBase): void;
2637
3181
  registeredControl: WritableSignal<FormFieldControl | null>;
2638
3182
  registeredHint: WritableSignal<HintComponentBase | null>;
3183
+ registeredCounter: WritableSignal<CounterComponentBase | null>;
2639
3184
  registeredLabel: WritableSignal<LabelDirectiveBase | null>;
3185
+ /** The registered control's value, for the counter to measure. */
3186
+ controlValue: Signal<unknown>;
3187
+ /** The bound field's schema `maxLength()`, when it has one. */
3188
+ controlMaxLength: Signal<number | undefined>;
2640
3189
  /** The field's visible control frame — the box overlay-based controls anchor their panels to. */
2641
3190
  controlFrameElement: WritableSignal<HTMLElement | null>;
2642
3191
  activate(): void;
@@ -2651,6 +3200,8 @@ declare class FormFieldDirective implements FormFieldDirectiveBase {
2651
3200
  /** @internal */
2652
3201
  registeredHint: _angular_core.WritableSignal<object | null>;
2653
3202
  /** @internal */
3203
+ registeredCounter: _angular_core.WritableSignal<object | null>;
3204
+ /** @internal */
2654
3205
  registeredLabel: _angular_core.WritableSignal<LabelDirectiveBase | null>;
2655
3206
  /** Set by the form-field component; read by overlay-based controls (e.g. the select) as their anchor. */
2656
3207
  controlFrameElement: _angular_core.WritableSignal<HTMLElement | null>;
@@ -2664,6 +3215,12 @@ declare class FormFieldDirective implements FormFieldDirectiveBase {
2664
3215
  /** The control's parse-error message (shown when there's a parse error but no validation error). */
2665
3216
  parseErrorMessage: _angular_core.Signal<string | null>;
2666
3217
  controlType: _angular_core.Signal<_ethlete_components.FormFieldControlType>;
3218
+ /** The registered control's value — the counter measures this. */
3219
+ controlValue: _angular_core.Signal<unknown>;
3220
+ /** The bound field's schema `maxLength()`, when signal forms bound one into the control. */
3221
+ controlMaxLength: _angular_core.Signal<number | undefined>;
3222
+ /** Whether an async validator is currently in flight for the bound field. */
3223
+ isPending: _angular_core.Signal<boolean>;
2667
3224
  focused: _angular_core.Signal<boolean>;
2668
3225
  /** Whether the registered control's popup (picker/select/cascader panel) is open. */
2669
3226
  expanded: _angular_core.Signal<boolean>;
@@ -2685,6 +3242,10 @@ declare class FormFieldDirective implements FormFieldDirectiveBase {
2685
3242
  /** @internal */
2686
3243
  unregisterHint(hint: HintComponentBase): void;
2687
3244
  /** @internal */
3245
+ registerCounter(counter: CounterComponentBase): void;
3246
+ /** @internal */
3247
+ unregisterCounter(counter: CounterComponentBase): void;
3248
+ /** @internal */
2688
3249
  unregisterLabel(label: LabelDirectiveBase): void;
2689
3250
  activate(): void;
2690
3251
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FormFieldDirective, never>;
@@ -2933,9 +3494,17 @@ type OverlayStrategyBreakpoint = {
2933
3494
  /** Overlay strategy to be applied when the breakpoint is active. */
2934
3495
  strategy: OverlayStrategy;
2935
3496
  };
3497
+ /** A drag direction expressed in physical terms. Unaffected by the writing direction. */
3498
+ type OverlayDragToDismissPhysicalDirection = 'to-top' | 'to-bottom' | 'to-left' | 'to-right';
3499
+ /**
3500
+ * A drag direction. The logical values (`to-inline-start`/`to-inline-end`) are resolved to their
3501
+ * physical counterpart when the gesture is set up, using the overlay container's computed
3502
+ * `direction` — so they follow the writing direction like the logical position strategies do.
3503
+ */
3504
+ type OverlayDragToDismissDirection = OverlayDragToDismissPhysicalDirection | 'to-inline-start' | 'to-inline-end';
2936
3505
  type OverlayDragToDismissConfig = {
2937
3506
  /** Direction in which the overlay can be dragged. */
2938
- direction: 'to-top' | 'to-bottom' | 'to-left' | 'to-right';
3507
+ direction: OverlayDragToDismissDirection;
2939
3508
  /**
2940
3509
  * The minimum distance in pixels that the user must swipe to dismiss the overlay.
2941
3510
  *
@@ -2945,9 +3514,27 @@ type OverlayDragToDismissConfig = {
2945
3514
  /**
2946
3515
  * The minimum velocity in pixels per second that the user must swipe to dismiss the overlay.
2947
3516
  *
3517
+ * Doubles as the flick threshold when `snapPoints` are set: a release at or above it advances one
3518
+ * snap point in the direction of the flick.
3519
+ *
2948
3520
  * @default 150 // 150px/s
2949
3521
  */
2950
3522
  minVelocityToDismiss?: number;
3523
+ /**
3524
+ * Resting positions the overlay can be dragged between, as fractions of its own size along the
3525
+ * dismiss axis — `0` is fully open, `0.5` is dragged halfway out. The docked position is always
3526
+ * available whether or not it is listed, and values outside `[0, 1)` are ignored.
3527
+ *
3528
+ * With snap points set, a flick advances one point in its own direction and a slow release settles
3529
+ * at the nearest one; either running past the last point dismisses the overlay. Leaving this unset
3530
+ * keeps the plain two-state behavior driven by `minDistanceToDismiss`/`minVelocityToDismiss`.
3531
+ *
3532
+ * The overlay stays its full size at every snap point — only its offset changes. Content that
3533
+ * should reflow or scroll differently at a partial position is the consumer's concern.
3534
+ *
3535
+ * @default undefined // no intermediate resting positions
3536
+ */
3537
+ snapPoints?: number[];
2951
3538
  };
2952
3539
  type OverlayBreakpointConfig = {
2953
3540
  /** Min-width of the overlay. If a number is provided, assumes pixel units. */
@@ -3073,13 +3660,13 @@ declare class OverlayDirective {
3073
3660
  mode: _angular_core.InputSignal<OverlayMode>;
3074
3661
  role: _angular_core.InputSignal<OverlayRole | undefined>;
3075
3662
  open: _angular_core.ModelSignal<boolean>;
3076
- disabled: _angular_core.InputSignal<boolean>;
3077
- disableClose: _angular_core.InputSignal<boolean>;
3663
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
3664
+ disableClose: _angular_core.InputSignalWithTransform<boolean, unknown>;
3078
3665
  autoFocus: _angular_core.InputSignal<string | false | undefined>;
3079
- restoreFocus: _angular_core.InputSignal<boolean>;
3666
+ restoreFocus: _angular_core.InputSignalWithTransform<boolean, unknown>;
3080
3667
  hasBackdrop: _angular_core.InputSignal<boolean | undefined>;
3081
- closeOnEscape: _angular_core.InputSignal<boolean>;
3082
- closeOnOutsidePointer: _angular_core.InputSignal<boolean>;
3668
+ closeOnEscape: _angular_core.InputSignalWithTransform<boolean, unknown>;
3669
+ closeOnOutsidePointer: _angular_core.InputSignalWithTransform<boolean, unknown>;
3083
3670
  hostClass: _angular_core.InputSignal<string | string[] | undefined>;
3084
3671
  backdropClass: _angular_core.InputSignal<string | string[] | undefined>;
3085
3672
  panelClass: _angular_core.InputSignal<string | string[] | undefined>;
@@ -3087,11 +3674,11 @@ declare class OverlayDirective {
3087
3674
  fallbackPlacements: _angular_core.InputSignal<Placement[] | undefined>;
3088
3675
  offset: _angular_core.InputSignal<OffsetOptions | null>;
3089
3676
  viewportPadding: _angular_core.InputSignal<Padding | null>;
3090
- autoResize: _angular_core.InputSignal<boolean>;
3091
- shift: _angular_core.InputSignal<boolean>;
3092
- autoHide: _angular_core.InputSignal<boolean>;
3093
- autoCloseIfReferenceHidden: _angular_core.InputSignal<boolean>;
3094
- mirrorWidth: _angular_core.InputSignal<boolean>;
3677
+ autoResize: _angular_core.InputSignalWithTransform<boolean, unknown>;
3678
+ shift: _angular_core.InputSignalWithTransform<boolean, unknown>;
3679
+ autoHide: _angular_core.InputSignalWithTransform<boolean, unknown>;
3680
+ autoCloseIfReferenceHidden: _angular_core.InputSignalWithTransform<boolean, unknown>;
3681
+ mirrorWidth: _angular_core.InputSignalWithTransform<boolean, unknown>;
3095
3682
  /** @internal */
3096
3683
  registeredAnchor: _angular_core.WritableSignal<OverlayAnchorDirective | null>;
3097
3684
  /** @internal */
@@ -3254,6 +3841,7 @@ declare const registerSingleton: <T>(target: WritableSignal<T | null> | null | u
3254
3841
  * only surfaces inherited inputs/outputs from a decorated base.
3255
3842
  */
3256
3843
  declare abstract class TextFieldControlDirective implements FormFieldControl {
3844
+ private formFieldLabels;
3257
3845
  private formField;
3258
3846
  touched: _angular_core.ModelSignal<boolean>;
3259
3847
  /**
@@ -3264,14 +3852,28 @@ declare abstract class TextFieldControlDirective implements FormFieldControl {
3264
3852
  */
3265
3853
  mixed: _angular_core.ModelSignal<boolean>;
3266
3854
  /** Placeholder text shown while `mixed` is set — overrides the consumer placeholder. */
3267
- mixedLabel: _angular_core.InputSignal<string>;
3268
- disabled: _angular_core.InputSignal<boolean>;
3269
- readonly: _angular_core.InputSignal<boolean>;
3270
- hidden: _angular_core.InputSignal<boolean>;
3271
- invalid: _angular_core.InputSignal<boolean>;
3855
+ mixedLabel: _angular_core.InputSignal<string | null>;
3856
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
3857
+ readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
3858
+ hidden: _angular_core.InputSignalWithTransform<boolean, unknown>;
3859
+ invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
3272
3860
  errors: _angular_core.InputSignal<readonly ValidationError.WithOptionalFieldTree[]>;
3273
3861
  required: _angular_core.InputSignalWithTransform<boolean, unknown>;
3274
3862
  name: _angular_core.InputSignal<string>;
3863
+ /**
3864
+ * The bound field's `maxLength()` limit, bound automatically by signal forms because this input
3865
+ * exists — so `<et-counter />` needs no `[max]` for a schema-validated field.
3866
+ *
3867
+ * Deliberately **not** forwarded to the native `maxlength` attribute: hard-truncating typed input
3868
+ * would stop the validator from ever reporting the over-limit error the counter exists to surface.
3869
+ * Set `maxlength` yourself on the control if you want the browser to clamp instead.
3870
+ */
3871
+ maxLength: _angular_core.InputSignal<number | undefined>;
3872
+ /**
3873
+ * True while an async validator is in flight for the bound field — bound automatically by signal
3874
+ * forms because this input exists. The field shell surfaces it as its busy state.
3875
+ */
3876
+ pending: _angular_core.InputSignalWithTransform<boolean, unknown>;
3275
3877
  /**
3276
3878
  * Author-supplied accessible name, forwarded onto the native control. Use this (or an
3277
3879
  * `<et-label>`) when the field has no visible label — a placeholder is not an accessible name.
@@ -3282,6 +3884,8 @@ declare abstract class TextFieldControlDirective implements FormFieldControl {
3282
3884
  * id of a projected `<et-label>`.
3283
3885
  */
3284
3886
  ariaLabelledby: _angular_core.InputSignal<string | null>;
3887
+ /** The string in effect: this instance's `mixedLabel`, else `FORM_FIELD_LABELS`. */
3888
+ resolvedMixedLabel: Signal<string>;
3285
3889
  shouldDisplayError: Signal<boolean>;
3286
3890
  describedBy: _angular_core.WritableSignal<string | null>;
3287
3891
  focused: _angular_core.WritableSignal<boolean>;
@@ -3299,7 +3903,7 @@ declare abstract class TextFieldControlDirective implements FormFieldControl {
3299
3903
  constructor();
3300
3904
  activate(): void;
3301
3905
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TextFieldControlDirective, never>;
3302
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<TextFieldControlDirective, never, never, { "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "mixed": { "alias": "mixed"; "required": false; "isSignal": true; }; "mixedLabel": { "alias": "mixedLabel"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "hidden": { "alias": "hidden"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; "ariaLabelledby": { "alias": "aria-labelledby"; "required": false; "isSignal": true; }; }, { "touched": "touchedChange"; "mixed": "mixedChange"; }, never, never, true, never>;
3906
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<TextFieldControlDirective, never, never, { "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "mixed": { "alias": "mixed"; "required": false; "isSignal": true; }; "mixedLabel": { "alias": "mixedLabel"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "hidden": { "alias": "hidden"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "maxLength": { "alias": "maxLength"; "required": false; "isSignal": true; }; "pending": { "alias": "pending"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; "ariaLabelledby": { "alias": "aria-labelledby"; "required": false; "isSignal": true; }; }, { "touched": "touchedChange"; "mixed": "mixedChange"; }, never, never, true, never>;
3303
3907
  }
3304
3908
 
3305
3909
  /** A single entry in a cascader's hierarchy. `T` is the consumer's value type. */
@@ -3414,6 +4018,7 @@ type CascaderSearchLike = {
3414
4018
  appendCharacter(character: string): void;
3415
4019
  };
3416
4020
  declare class CascaderDirective<T = unknown> implements FormValueControl<T | T[] | null>, FormFieldControl {
4021
+ private formFieldLabels;
3417
4022
  private formField;
3418
4023
  private destroyRef;
3419
4024
  private document;
@@ -3424,17 +4029,17 @@ declare class CascaderDirective<T = unknown> implements FormValueControl<T | T[]
3424
4029
  mixed: _angular_core.ModelSignal<boolean>;
3425
4030
  touched: _angular_core.ModelSignal<boolean>;
3426
4031
  open: _angular_core.ModelSignal<boolean>;
3427
- disabled: _angular_core.InputSignal<boolean>;
3428
- readonly: _angular_core.InputSignal<boolean>;
4032
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
4033
+ readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
3429
4034
  /** Multi-select: node activations toggle values instead of committing-and-closing. */
3430
4035
  multiple: _angular_core.InputSignalWithTransform<boolean, unknown>;
3431
- invalid: _angular_core.InputSignal<boolean>;
4036
+ invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
3432
4037
  errors: _angular_core.InputSignal<readonly ValidationError.WithOptionalFieldTree[]>;
3433
- required: _angular_core.InputSignal<boolean>;
4038
+ required: _angular_core.InputSignalWithTransform<boolean, unknown>;
3434
4039
  name: _angular_core.InputSignal<string>;
3435
4040
  placeholder: _angular_core.InputSignal<string>;
3436
4041
  /** Trigger text shown while `mixed` is set. */
3437
- mixedLabel: _angular_core.InputSignal<string>;
4042
+ mixedLabel: _angular_core.InputSignal<string | null>;
3438
4043
  /** The hierarchical source browsed by the cascader. Required. */
3439
4044
  dataSource: _angular_core.InputSignal<CascaderDataSource<T> | null>;
3440
4045
  /** Whether only leaves (`'leaf'`, default) or any node (`'any'`) can be committed as the value. */
@@ -3448,7 +4053,7 @@ declare class CascaderDirective<T = unknown> implements FormValueControl<T | T[]
3448
4053
  */
3449
4054
  toErrorMessage: _angular_core.InputSignal<(error: unknown) => string>;
3450
4055
  /** Whether the overlay panel mirrors the anchor's width (off — columns size themselves). */
3451
- mirrorPanelWidth: _angular_core.InputSignal<boolean>;
4056
+ mirrorPanelWidth: _angular_core.InputSignalWithTransform<boolean, unknown>;
3452
4057
  /**
3453
4058
  * How many columns the browse view shows side by side before older levels collapse into the
3454
4059
  * breadcrumb row (min 1). Deep hierarchies would otherwise grow the panel a column-width per
@@ -3457,6 +4062,8 @@ declare class CascaderDirective<T = unknown> implements FormValueControl<T | T[]
3457
4062
  maxVisibleColumns: _angular_core.InputSignalWithTransform<number, number>;
3458
4063
  afterOpen: _angular_core.OutputEmitterRef<void>;
3459
4064
  afterClose: _angular_core.OutputEmitterRef<void>;
4065
+ /** The string in effect: this instance's `mixedLabel`, else `FORM_FIELD_LABELS`. */
4066
+ resolvedMixedLabel: Signal<string>;
3460
4067
  shouldDisplayError: Signal<boolean>;
3461
4068
  /** The committed values, normalized to an array (one entry in single mode, empty for no value). */
3462
4069
  values: Signal<T[]>;
@@ -3650,6 +4257,7 @@ type CascaderNodeSignal<T> = Signal<CascaderNode<T> | null>;
3650
4257
 
3651
4258
  /** One level of the hierarchy — a `role="group"` of tree items. Nodes read their level from it. */
3652
4259
  declare class CascaderColumnDirective {
4260
+ private cascaderLabels;
3653
4261
  cascader: CascaderDirective<any> | null;
3654
4262
  private destroyRef;
3655
4263
  /** The column's zero-based level — column 0 shows the root. */
@@ -3826,6 +4434,37 @@ type CascaderFromQueryConfig<TCreator extends AnyQueryCreator, TValue, TSearchCr
3826
4434
  */
3827
4435
  declare const cascaderFromQuery: <TCreator extends AnyQueryCreator, TValue, TSearchCreator extends AnyQueryCreator = TCreator>(config: CascaderFromQueryConfig<TCreator, TValue, TSearchCreator>) => CascaderDataSource<TValue>;
3828
4436
 
4437
+ /** The strings the cascader's panel renders itself — its search field and the step back up a level. */
4438
+ type CascaderLabels = {
4439
+ /** Shown while a level or a search is being fetched. */
4440
+ loading: string;
4441
+ /** Shown when a search matched nothing. */
4442
+ noMatches: string;
4443
+ /** Shown when a level has no options. */
4444
+ noOptions: string;
4445
+ /** The action that re-runs a failed search or level fetch. */
4446
+ retry: string;
4447
+ /** Heading for the root column, which has no parent option to name it. */
4448
+ options: string;
4449
+ /** Accessible label for the control that returns to the parent level. */
4450
+ back: string;
4451
+ /** Placeholder for the panel's search field. */
4452
+ search: string;
4453
+ };
4454
+ /** The built-in English labels. */
4455
+ declare const DEFAULT_CASCADER_LABELS: CascaderLabels;
4456
+ /**
4457
+ * Localize the cascader's strings for everything below this injector, and read the set in effect here as a
4458
+ * signal. Partial — whatever you leave out keeps its {@link DEFAULT_CASCADER_LABELS} value. See {@link createLabels}
4459
+ * for the shape, which every domain in this library shares.
4460
+ *
4461
+ * @example
4462
+ * provideCascaderLabels({ back: 'Zurück', search: 'Suchen' });
4463
+ */
4464
+ declare const provideCascaderLabels: (labels: _ethlete_core.LabelsSource<CascaderLabels>) => _angular_core.Provider;
4465
+ declare const injectCascaderLabels: () => _angular_core.Signal<CascaderLabels>;
4466
+ declare const CASCADER_LABELS: _angular_core.InjectionToken<_ethlete_core.LabelsSource<CascaderLabels>>;
4467
+
3829
4468
  /**
3830
4469
  * The overlay-hosted panel surface: re-applies color/surface context (the pane is detached
3831
4470
  * from the trigger's DOM), tracks whether focus is inside (gating the roving-focus moves),
@@ -3850,14 +4489,22 @@ declare class CascaderPanelComponent {
3850
4489
  }
3851
4490
 
3852
4491
  declare class CascaderComponent {
4492
+ protected cascaderLabels: _angular_core.Signal<_ethlete_components.CascaderLabels>;
4493
+ private formFieldLabels;
3853
4494
  protected cascader: CascaderDirective<unknown>;
3854
4495
  protected errorColorTheme: _ethlete_core.ColorTheme;
3855
4496
  /** Shows a clear (×) control while a value is selected. */
3856
- clearable: _angular_core.InputSignal<boolean>;
3857
- clearLabel: _angular_core.InputSignal<string>;
3858
- backLabel: _angular_core.InputSignal<string>;
4497
+ clearable: _angular_core.InputSignalWithTransform<boolean, unknown>;
4498
+ clearLabel: _angular_core.InputSignal<string | null>;
4499
+ backLabel: _angular_core.InputSignal<string | null>;
3859
4500
  /** Placeholder of the panel's search input (shown when the data source has a `search` hook). */
3860
- searchPlaceholder: _angular_core.InputSignal<string>;
4501
+ searchPlaceholder: _angular_core.InputSignal<string | null>;
4502
+ /** The string in effect: this instance's `clearLabel`, else `FORM_FIELD_LABELS`. */
4503
+ protected resolvedClearLabel: _angular_core.Signal<string>;
4504
+ /** The string in effect: this instance's `backLabel`, else the domain's label set. */
4505
+ protected resolvedBackLabel: _angular_core.Signal<string>;
4506
+ /** The string in effect: this instance's `searchPlaceholder`, else the domain's label set. */
4507
+ protected resolvedSearchPlaceholder: _angular_core.Signal<string>;
3861
4508
  protected showClear: _angular_core.Signal<boolean>;
3862
4509
  protected handleClearClick(event: Event): void;
3863
4510
  protected resultDisabled(path: CascaderNode<unknown>[]): boolean;
@@ -3881,12 +4528,12 @@ declare class CheckboxDirective implements FormCheckboxControl, FormFieldControl
3881
4528
  checked: _angular_core.ModelSignal<boolean>;
3882
4529
  indeterminate: _angular_core.ModelSignal<boolean>;
3883
4530
  touched: _angular_core.ModelSignal<boolean>;
3884
- disabled: _angular_core.InputSignal<boolean>;
4531
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
3885
4532
  /** View-only: keeps the normal look and focusability but blocks toggling (unlike `disabled`). */
3886
- readonly: _angular_core.InputSignal<boolean>;
3887
- invalid: _angular_core.InputSignal<boolean>;
4533
+ readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
4534
+ invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
3888
4535
  errors: _angular_core.InputSignal<readonly ValidationError.WithOptionalFieldTree[]>;
3889
- required: _angular_core.InputSignal<boolean>;
4536
+ required: _angular_core.InputSignalWithTransform<boolean, unknown>;
3890
4537
  name: _angular_core.InputSignal<string>;
3891
4538
  ariaChecked: _angular_core.Signal<boolean | "mixed">;
3892
4539
  shouldDisplayError: _angular_core.Signal<boolean>;
@@ -3942,6 +4589,12 @@ declare const FORM_FIELD_SIZES: {
3942
4589
  };
3943
4590
  type FormFieldSize = (typeof FORM_FIELD_SIZES)[keyof typeof FORM_FIELD_SIZES];
3944
4591
 
4592
+ /** How a choice field presents itself. See {@link ChoiceFieldComponent.variant}. */
4593
+ declare const CHOICE_FIELD_VARIANTS: {
4594
+ readonly PLAIN: "plain";
4595
+ readonly CARD: "card";
4596
+ };
4597
+ type ChoiceFieldVariant = (typeof CHOICE_FIELD_VARIANTS)[keyof typeof CHOICE_FIELD_VARIANTS];
3945
4598
  declare class ChoiceFieldComponent {
3946
4599
  support: {
3947
4600
  errorColorTheme: _ethlete_core.ColorTheme;
@@ -3961,6 +4614,12 @@ declare class ChoiceFieldComponent {
3961
4614
  supportHeight: _angular_core.Signal<number>;
3962
4615
  };
3963
4616
  size: _angular_core.InputSignal<FormFieldSize>;
4617
+ /**
4618
+ * `'card'` turns the row into a full-width clickable panel with the label leading and the control trailing — for
4619
+ * a short list of consequential options where each wants room for a hint. Works for whichever control is
4620
+ * projected, so a checkbox and a switch get the same preset. @default 'plain'
4621
+ */
4622
+ variant: _angular_core.InputSignal<ChoiceFieldVariant>;
3964
4623
  private errorContentRef;
3965
4624
  private hintContentRef;
3966
4625
  private errorAnimatableRef;
@@ -3970,7 +4629,7 @@ declare class ChoiceFieldComponent {
3970
4629
  };
3971
4630
  constructor();
3972
4631
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ChoiceFieldComponent, never>;
3973
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<ChoiceFieldComponent, "et-choice-field", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; }, {}, never, ["*", "et-label", "et-hint"], true, [{ directive: typeof FormFieldDirective; inputs: {}; outputs: {}; }, { directive: typeof _ethlete_core.ProvideColorDirective; inputs: { "etProvideColor": "color"; }; outputs: {}; }]>;
4632
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ChoiceFieldComponent, "et-choice-field", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; }, {}, never, ["*", "et-label", "et-hint"], true, [{ directive: typeof FormFieldDirective; inputs: {}; outputs: {}; }, { directive: typeof _ethlete_core.ProvideColorDirective; inputs: { "etProvideColor": "color"; }; outputs: {}; }]>;
3974
4633
  }
3975
4634
 
3976
4635
  declare class HintComponent implements HintComponentBase {
@@ -4031,7 +4690,7 @@ declare class ColorInputComponent {
4031
4690
  */
4032
4691
  protected blockWhenReadonly(event: Event): void;
4033
4692
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ColorInputComponent, never>;
4034
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<ColorInputComponent, "et-color-input", never, {}, {}, never, never, true, [{ directive: typeof ColorInputDirective; inputs: { "value": "value"; "mixed": "mixed"; "mixedLabel": "mixedLabel"; "disabled": "disabled"; "readonly": "readonly"; "hidden": "hidden"; "invalid": "invalid"; "errors": "errors"; "required": "required"; "name": "name"; "aria-label": "aria-label"; "aria-labelledby": "aria-labelledby"; }; outputs: { "valueChange": "valueChange"; "mixedChange": "mixedChange"; "touchedChange": "touchedChange"; }; }, { directive: typeof _ethlete_core.ColorInteractiveDirective; inputs: {}; outputs: {}; }]>;
4693
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ColorInputComponent, "et-color-input", never, {}, {}, never, never, true, [{ directive: typeof ColorInputDirective; inputs: { "value": "value"; "mixed": "mixed"; "mixedLabel": "mixedLabel"; "disabled": "disabled"; "readonly": "readonly"; "hidden": "hidden"; "invalid": "invalid"; "errors": "errors"; "required": "required"; "name": "name"; "maxLength": "maxLength"; "pending": "pending"; "aria-label": "aria-label"; "aria-labelledby": "aria-labelledby"; }; outputs: { "valueChange": "valueChange"; "mixedChange": "mixedChange"; "touchedChange": "touchedChange"; }; }, { directive: typeof _ethlete_core.ColorInteractiveDirective; inputs: {}; outputs: {}; }]>;
4035
4694
  }
4036
4695
 
4037
4696
  declare const COLOR_INPUT_IMPORTS: readonly [typeof ColorInputComponent, typeof ColorInputDirective];
@@ -4119,6 +4778,7 @@ type DatePickerInputFieldBase = {
4119
4778
  * decorated base.
4120
4779
  */
4121
4780
  declare abstract class DatePickerInputDirective implements FormValueControl<string | null>, FormFieldControl, DatePickerHost {
4781
+ private formFieldLabels;
4122
4782
  private formField;
4123
4783
  private document;
4124
4784
  defaultLocale: Locale | null;
@@ -4141,11 +4801,11 @@ declare abstract class DatePickerInputDirective implements FormValueControl<stri
4141
4801
  /** View state for a field whose source values disagree (bulk edit). The raw form value stays untouched. */
4142
4802
  mixed: _angular_core.ModelSignal<boolean>;
4143
4803
  touched: _angular_core.ModelSignal<boolean>;
4144
- disabled: _angular_core.InputSignal<boolean>;
4145
- readonly: _angular_core.InputSignal<boolean>;
4146
- invalid: _angular_core.InputSignal<boolean>;
4804
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
4805
+ readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
4806
+ invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
4147
4807
  errors: _angular_core.InputSignal<readonly ValidationError.WithOptionalFieldTree[]>;
4148
- required: _angular_core.InputSignal<boolean>;
4808
+ required: _angular_core.InputSignalWithTransform<boolean, unknown>;
4149
4809
  name: _angular_core.InputSignal<string>;
4150
4810
  placeholder: _angular_core.InputSignal<string>;
4151
4811
  /**
@@ -4153,7 +4813,7 @@ declare abstract class DatePickerInputDirective implements FormValueControl<stri
4153
4813
  * date field cannot render arbitrary text, so the field stays empty and the
4154
4814
  * label shows through the placeholder slot; it never enters the form value.
4155
4815
  */
4156
- mixedLabel: _angular_core.InputSignal<string>;
4816
+ mixedLabel: _angular_core.InputSignal<string | null>;
4157
4817
  /** date-fns format of the string value. Defaults to the control's format token. */
4158
4818
  valueFormat: _angular_core.InputSignal<string | undefined>;
4159
4819
  locale: _angular_core.InputSignal<Locale | null>;
@@ -4167,6 +4827,8 @@ declare abstract class DatePickerInputDirective implements FormValueControl<stri
4167
4827
  */
4168
4828
  mask: _angular_core.InputSignalWithTransform<boolean, unknown>;
4169
4829
  pickerOpen: _angular_core.ModelSignal<boolean>;
4830
+ /** The string in effect: this instance's `mixedLabel`, else `FORM_FIELD_LABELS`. */
4831
+ resolvedMixedLabel: Signal<string>;
4170
4832
  effectiveValueFormat: Signal<string>;
4171
4833
  effectiveLocale: Signal<Locale | null>;
4172
4834
  /** Uncommitted field text — kept visible when it fails to parse. */
@@ -4254,15 +4916,18 @@ declare abstract class DatePickerInputFieldDirective implements InputMaskHost {
4254
4916
  * only ever sees `Date` objects.
4255
4917
  */
4256
4918
  declare class DateInputDirective extends DatePickerInputDirective implements FormValueControl<string | null> {
4919
+ private dateTimeLabels;
4257
4920
  defaultValueFormat: string;
4258
4921
  /** Message the form field shows when typed text can't be parsed as a date. */
4259
- parseErrorMessage: _angular_core.InputSignal<string>;
4922
+ parseErrorMessage: _angular_core.InputSignal<string | null>;
4260
4923
  /** date-fns format shown in (and parsed from) the field. Locale-aware by default. */
4261
4924
  displayFormat: _angular_core.InputSignal<string>;
4262
4925
  /** Forwarded to the picker calendar. (`min`/`max` are reserved by signal forms.) */
4263
4926
  minDate: _angular_core.InputSignal<Date | null>;
4264
4927
  maxDate: _angular_core.InputSignal<Date | null>;
4265
4928
  dateFilter: _angular_core.InputSignal<((date: Date) => boolean) | null>;
4929
+ /** The string in effect: this instance's `parseErrorMessage`, else the domain's label set. */
4930
+ resolvedParseErrorMessage: _angular_core.Signal<string>;
4266
4931
  controlType: _angular_core.WritableSignal<"date-input">;
4267
4932
  /** The current value as a `Date` (what the picker calendar binds to). */
4268
4933
  date: _angular_core.Signal<Date | null>;
@@ -4294,11 +4959,17 @@ declare class DateInputFieldDirective extends DatePickerInputFieldDirective {
4294
4959
  }
4295
4960
 
4296
4961
  declare class DateInputComponent {
4962
+ private dateTimeLabels;
4963
+ private formFieldLabels;
4297
4964
  protected dateInput: DateInputDirective;
4298
- pickerTriggerLabel: _angular_core.InputSignal<string>;
4965
+ pickerTriggerLabel: _angular_core.InputSignal<string | null>;
4299
4966
  /** Shows a clear (×) control while a value or pending text is set and the field is in use. */
4300
- clearable: _angular_core.InputSignal<boolean>;
4301
- clearLabel: _angular_core.InputSignal<string>;
4967
+ clearable: _angular_core.InputSignalWithTransform<boolean, unknown>;
4968
+ clearLabel: _angular_core.InputSignal<string | null>;
4969
+ /** The string in effect: this instance's `pickerTriggerLabel`, else the domain's label set. */
4970
+ protected resolvedPickerTriggerLabel: _angular_core.Signal<string>;
4971
+ /** The string in effect: this instance's `clearLabel`, else `FORM_FIELD_LABELS`. */
4972
+ protected resolvedClearLabel: _angular_core.Signal<string>;
4302
4973
  protected showClear: _angular_core.Signal<boolean>;
4303
4974
  protected handleClearClick(event: Event): void;
4304
4975
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DateInputComponent, never>;
@@ -4326,9 +4997,12 @@ declare class DatePickerTriggerDirective {
4326
4997
  declare const DATE_INPUT_IMPORTS: readonly [typeof DateInputComponent, typeof DateInputDirective, typeof DateInputFieldDirective, typeof DatePickerTriggerDirective, typeof DatePickerSurfaceDirective];
4327
4998
 
4328
4999
  declare class DatePickerPanelComponent {
5000
+ private dateTimeLabels;
4329
5001
  /** Accessible name of the picker dialog — set per control (date / time / range / date-time). */
4330
- dialogLabel: _angular_core.InputSignal<string>;
5002
+ dialogLabel: _angular_core.InputSignal<string | null>;
4331
5003
  private panelBody;
5004
+ /** The string in effect: this instance's `dialogLabel`, else the domain's label set. */
5005
+ protected resolvedDialogLabel: _angular_core.Signal<string>;
4332
5006
  constructor();
4333
5007
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DatePickerPanelComponent, never>;
4334
5008
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DatePickerPanelComponent, "et-date-picker-panel", never, { "dialogLabel": { "alias": "dialogLabel"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, [{ directive: typeof _ethlete_core.ProvideColorDirective; inputs: {}; outputs: {}; }, { directive: typeof _ethlete_core.AutoSurfaceDirective; inputs: {}; outputs: {}; }]>;
@@ -4350,6 +5024,8 @@ type DateRangeSide = 'start' | 'end';
4350
5024
  * against `displayFormat` on blur/Enter, exactly like the single date input.
4351
5025
  */
4352
5026
  declare class DateRangeInputDirective implements FormValueControl<DateRangeValue>, FormFieldControl, DatePickerHost {
5027
+ private dateTimeLabels;
5028
+ private formFieldLabels;
4353
5029
  private formField;
4354
5030
  private destroyRef;
4355
5031
  private document;
@@ -4363,11 +5039,11 @@ declare class DateRangeInputDirective implements FormValueControl<DateRangeValue
4363
5039
  */
4364
5040
  mixed: _angular_core.ModelSignal<boolean>;
4365
5041
  touched: _angular_core.ModelSignal<boolean>;
4366
- disabled: _angular_core.InputSignal<boolean>;
4367
- readonly: _angular_core.InputSignal<boolean>;
4368
- invalid: _angular_core.InputSignal<boolean>;
5042
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
5043
+ readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
5044
+ invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
4369
5045
  errors: _angular_core.InputSignal<readonly ValidationError.WithOptionalFieldTree[]>;
4370
- required: _angular_core.InputSignal<boolean>;
5046
+ required: _angular_core.InputSignalWithTransform<boolean, unknown>;
4371
5047
  name: _angular_core.InputSignal<string>;
4372
5048
  startPlaceholder: _angular_core.InputSignal<string>;
4373
5049
  endPlaceholder: _angular_core.InputSignal<string>;
@@ -4376,9 +5052,9 @@ declare class DateRangeInputDirective implements FormValueControl<DateRangeValue
4376
5052
  * date field cannot render arbitrary text, so the fields stay empty and the label
4377
5053
  * shows through the placeholder slot; it never enters the form value.
4378
5054
  */
4379
- mixedLabel: _angular_core.InputSignal<string>;
5055
+ mixedLabel: _angular_core.InputSignal<string | null>;
4380
5056
  /** Message the form field shows when either side's typed text can't be parsed as a date. */
4381
- parseErrorMessage: _angular_core.InputSignal<string>;
5057
+ parseErrorMessage: _angular_core.InputSignal<string | null>;
4382
5058
  /** date-fns format of the string values. Defaults to the `DATE_FORMAT` token. */
4383
5059
  valueFormat: _angular_core.InputSignal<string | undefined>;
4384
5060
  /** date-fns format shown in (and parsed from) the fields. Locale-aware by default. */
@@ -4398,6 +5074,10 @@ declare class DateRangeInputDirective implements FormValueControl<DateRangeValue
4398
5074
  maxDate: _angular_core.InputSignal<Date | null>;
4399
5075
  dateFilter: _angular_core.InputSignal<((date: Date) => boolean) | null>;
4400
5076
  pickerOpen: _angular_core.ModelSignal<boolean>;
5077
+ /** The string in effect: this instance's `mixedLabel`, else `FORM_FIELD_LABELS`. */
5078
+ resolvedMixedLabel: Signal<string>;
5079
+ /** The string in effect: this instance's `parseErrorMessage`, else the domain's label set. */
5080
+ resolvedParseErrorMessage: Signal<string>;
4401
5081
  effectiveValueFormat: Signal<string>;
4402
5082
  effectiveLocale: Signal<Locale | null>;
4403
5083
  /** The side the focused field edits — the picker previews from here too. */
@@ -4505,13 +5185,23 @@ declare class DateRangeInputFieldDirective implements InputMaskHost {
4505
5185
  }
4506
5186
 
4507
5187
  declare class DateRangeInputComponent {
5188
+ private dateTimeLabels;
5189
+ private formFieldLabels;
4508
5190
  protected rangeInput: DateRangeInputDirective;
4509
- startAriaLabel: _angular_core.InputSignal<string>;
4510
- endAriaLabel: _angular_core.InputSignal<string>;
4511
- pickerTriggerLabel: _angular_core.InputSignal<string>;
5191
+ startAriaLabel: _angular_core.InputSignal<string | null>;
5192
+ endAriaLabel: _angular_core.InputSignal<string | null>;
5193
+ pickerTriggerLabel: _angular_core.InputSignal<string | null>;
4512
5194
  /** Shows a clear (×) control while a value is set and the field is in use. */
4513
- clearable: _angular_core.InputSignal<boolean>;
4514
- clearLabel: _angular_core.InputSignal<string>;
5195
+ clearable: _angular_core.InputSignalWithTransform<boolean, unknown>;
5196
+ clearLabel: _angular_core.InputSignal<string | null>;
5197
+ /** The string in effect: this instance's `startAriaLabel`, else the domain's label set. */
5198
+ protected resolvedStartAriaLabel: _angular_core.Signal<string>;
5199
+ /** The string in effect: this instance's `endAriaLabel`, else the domain's label set. */
5200
+ protected resolvedEndAriaLabel: _angular_core.Signal<string>;
5201
+ /** The string in effect: this instance's `pickerTriggerLabel`, else the domain's label set. */
5202
+ protected resolvedPickerTriggerLabel: _angular_core.Signal<string>;
5203
+ /** The string in effect: this instance's `clearLabel`, else `FORM_FIELD_LABELS`. */
5204
+ protected resolvedClearLabel: _angular_core.Signal<string>;
4515
5205
  protected showClear: _angular_core.Signal<boolean>;
4516
5206
  protected handleClearClick(event: Event): void;
4517
5207
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DateRangeInputComponent, never>;
@@ -4530,6 +5220,12 @@ declare const TIME_FORMAT: InjectionToken<string>;
4530
5220
  /**
4531
5221
  * The date-fns `Locale` used for display formatting and calendar labels.
4532
5222
  * `null` falls back to date-fns' built-in default (en-US).
5223
+ *
5224
+ * This is the one piece of localization that cannot follow `provideLocale()` automatically: a date-fns
5225
+ * locale is a module with its own formatting rules, not something derivable from a `'de'` tag, and
5226
+ * importing every locale to look one up would put all of them in the bundle. So an app that sets
5227
+ * `provideLocale('de')` must also `provideDateLocale(de)` — {@link injectDateLocale} warns in dev mode
5228
+ * when it hasn't.
4533
5229
  */
4534
5230
  declare const DATE_LOCALE: InjectionToken<Locale | null>;
4535
5231
  declare const provideDateFormat: (format: string) => Provider;
@@ -4553,15 +5249,18 @@ declare const DATE_TIME_INPUT_ERROR_CODES: {
4553
5249
  * and time picker only ever see `Date` objects.
4554
5250
  */
4555
5251
  declare class DateTimeInputDirective extends DatePickerInputDirective implements FormValueControl<string | null> {
5252
+ private dateTimeLabels;
4556
5253
  defaultValueFormat: string;
4557
5254
  /** Message the form field shows when typed text can't be parsed as a date & time. */
4558
- parseErrorMessage: _angular_core.InputSignal<string>;
5255
+ parseErrorMessage: _angular_core.InputSignal<string | null>;
4559
5256
  /** Combined date-fns format shown in (and parsed from) the field. Locale-aware by default. */
4560
5257
  displayFormat: _angular_core.InputSignal<string>;
4561
5258
  /** Forwarded to the picker calendar. (`min`/`max` are reserved by signal forms.) */
4562
5259
  minDate: _angular_core.InputSignal<Date | null>;
4563
5260
  maxDate: _angular_core.InputSignal<Date | null>;
4564
5261
  dateFilter: _angular_core.InputSignal<((date: Date) => boolean) | null>;
5262
+ /** The string in effect: this instance's `parseErrorMessage`, else the domain's label set. */
5263
+ resolvedParseErrorMessage: _angular_core.Signal<string>;
4565
5264
  controlType: _angular_core.WritableSignal<"date-time-input">;
4566
5265
  /** The current value as a `Date` (what the picker calendar and time picker bind to). */
4567
5266
  dateTime: _angular_core.Signal<Date | null>;
@@ -4604,16 +5303,26 @@ declare class DateTimeInputFieldDirective extends DatePickerInputFieldDirective
4604
5303
  }
4605
5304
 
4606
5305
  declare class DateTimeInputComponent {
5306
+ private dateTimeLabels;
5307
+ private formFieldLabels;
4607
5308
  protected dateTimeInput: DateTimeInputDirective;
4608
- pickerTriggerLabel: _angular_core.InputSignal<string>;
4609
- minuteStep: _angular_core.InputSignal<number>;
4610
- secondStep: _angular_core.InputSignal<number>;
5309
+ pickerTriggerLabel: _angular_core.InputSignal<string | null>;
5310
+ minuteStep: _angular_core.InputSignalWithTransform<number, unknown>;
5311
+ secondStep: _angular_core.InputSignalWithTransform<number, unknown>;
4611
5312
  /** Labels of the pane tabs shown when the picker mounts as a bottom sheet. */
4612
- dateTabLabel: _angular_core.InputSignal<string>;
4613
- timeTabLabel: _angular_core.InputSignal<string>;
5313
+ dateTabLabel: _angular_core.InputSignal<string | null>;
5314
+ timeTabLabel: _angular_core.InputSignal<string | null>;
4614
5315
  /** Shows a clear (×) control while a value or pending text is set and the field is in use. */
4615
- clearable: _angular_core.InputSignal<boolean>;
4616
- clearLabel: _angular_core.InputSignal<string>;
5316
+ clearable: _angular_core.InputSignalWithTransform<boolean, unknown>;
5317
+ clearLabel: _angular_core.InputSignal<string | null>;
5318
+ /** The string in effect: this instance's `pickerTriggerLabel`, else the domain's label set. */
5319
+ protected resolvedPickerTriggerLabel: _angular_core.Signal<string>;
5320
+ /** The string in effect: this instance's `dateTabLabel`, else the domain's label set. */
5321
+ protected resolvedDateTabLabel: _angular_core.Signal<string>;
5322
+ /** The string in effect: this instance's `timeTabLabel`, else the domain's label set. */
5323
+ protected resolvedTimeTabLabel: _angular_core.Signal<string>;
5324
+ /** The string in effect: this instance's `clearLabel`, else `FORM_FIELD_LABELS`. */
5325
+ protected resolvedClearLabel: _angular_core.Signal<string>;
4617
5326
  protected showClear: _angular_core.Signal<boolean>;
4618
5327
  /** Which pane the bottom-sheet tabs show (both panes render side by side on desktop). */
4619
5328
  protected activePane: _angular_core.WritableSignal<"time" | "date">;
@@ -4632,6 +5341,55 @@ declare class DateTimeInputComponent {
4632
5341
 
4633
5342
  declare const DATE_TIME_INPUT_IMPORTS: readonly [typeof DateTimeInputComponent, typeof DateTimeInputDirective, typeof DateTimeInputFieldDirective, typeof DatePickerTriggerDirective, typeof DatePickerSurfaceDirective];
4634
5343
 
5344
+ /**
5345
+ * Every string the date/time inputs render or announce themselves — the picker triggers, the two halves
5346
+ * of a range, the date/time tabs, and the parse errors a typed value can produce.
5347
+ *
5348
+ * Month and weekday **names** are not here: they come from the `DATE_LOCALE` date-fns locale, which is
5349
+ * the other half of localizing these controls. See the localization guide.
5350
+ */
5351
+ type DateTimeLabels = {
5352
+ /** Accessible label for the control that opens a date picker. */
5353
+ openCalendar: string;
5354
+ /** Accessible label for the control that opens a time picker. */
5355
+ openTimePicker: string;
5356
+ /** Accessible label for the control that opens a combined date & time picker. */
5357
+ openDateTimePicker: string;
5358
+ /** Accessible label for the picker's dialog. */
5359
+ chooseDate: string;
5360
+ /** Accessible label for a range's start field. */
5361
+ startDate: string;
5362
+ /** Accessible label for a range's end field. */
5363
+ endDate: string;
5364
+ /** The date & time picker's tab showing the calendar. */
5365
+ dateTab: string;
5366
+ /** The date & time picker's tab showing the clock. */
5367
+ timeTab: string;
5368
+ /** Validation message for text that isn't a date. */
5369
+ invalidDate: string;
5370
+ /** Validation message for text that isn't a time. */
5371
+ invalidTime: string;
5372
+ /** Validation message for text that isn't a date and time. */
5373
+ invalidDateTime: string;
5374
+ /** Validation message for text that isn't a date range. */
5375
+ invalidDateRange: string;
5376
+ /** Validation message for text that isn't a duration. */
5377
+ invalidDuration: string;
5378
+ };
5379
+ /** The built-in English labels. */
5380
+ declare const DEFAULT_DATE_TIME_LABELS: DateTimeLabels;
5381
+ /**
5382
+ * Localize the date/time inputs' strings for everything below this injector, and read the set in effect
5383
+ * here as a signal. Partial — whatever you leave out keeps its {@link DEFAULT_DATE_TIME_LABELS} value.
5384
+ * See {@link createLabels} for the shape, which every domain in this library shares.
5385
+ *
5386
+ * @example
5387
+ * provideDateTimeLabels({ openCalendar: 'Kalender öffnen', invalidDate: 'Bitte ein gültiges Datum eingeben' });
5388
+ */
5389
+ declare const provideDateTimeLabels: (labels: _ethlete_core.LabelsSource<DateTimeLabels>) => _angular_core.Provider;
5390
+ declare const injectDateTimeLabels: () => _angular_core.Signal<DateTimeLabels>;
5391
+ declare const DATE_TIME_LABELS: _angular_core.InjectionToken<_ethlete_core.LabelsSource<DateTimeLabels>>;
5392
+
4635
5393
  declare const DURATION_INPUT_ERROR_CODES: {
4636
5394
  readonly FIELD_OUTSIDE_DURATION_INPUT: 3050;
4637
5395
  };
@@ -4643,6 +5401,8 @@ declare const DURATION_INPUT_ERROR_CODES: {
4643
5401
  * blur/Enter against a configurable segment layout (`130` → `1:30` under `mm:ss`).
4644
5402
  */
4645
5403
  declare class DurationInputDirective implements FormValueControl<number | null>, FormFieldControl {
5404
+ private dateTimeLabels;
5405
+ private formFieldLabels;
4646
5406
  private formField;
4647
5407
  private destroyRef;
4648
5408
  /** Total elapsed milliseconds, or `null` while empty/unparseable. */
@@ -4650,22 +5410,26 @@ declare class DurationInputDirective implements FormValueControl<number | null>,
4650
5410
  /** View state for a field whose source values disagree (bulk edit). The raw form value stays untouched. */
4651
5411
  mixed: _angular_core.ModelSignal<boolean>;
4652
5412
  touched: _angular_core.ModelSignal<boolean>;
4653
- disabled: _angular_core.InputSignal<boolean>;
4654
- readonly: _angular_core.InputSignal<boolean>;
4655
- invalid: _angular_core.InputSignal<boolean>;
5413
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
5414
+ readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
5415
+ invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
4656
5416
  errors: _angular_core.InputSignal<readonly ValidationError.WithOptionalFieldTree[]>;
4657
- required: _angular_core.InputSignal<boolean>;
5417
+ required: _angular_core.InputSignalWithTransform<boolean, unknown>;
4658
5418
  name: _angular_core.InputSignal<string>;
4659
5419
  placeholder: _angular_core.InputSignal<string>;
4660
5420
  /**
4661
5421
  * Field placeholder shown while `mixed` is set. Presentation only — the field stays
4662
5422
  * empty and the label shows through the placeholder slot; it never enters the form value.
4663
5423
  */
4664
- mixedLabel: _angular_core.InputSignal<string>;
5424
+ mixedLabel: _angular_core.InputSignal<string | null>;
4665
5425
  /** Message the form field shows when typed text can't be parsed as a duration. */
4666
- parseErrorMessage: _angular_core.InputSignal<string>;
5426
+ parseErrorMessage: _angular_core.InputSignal<string | null>;
4667
5427
  /** The segment layout: `h`/`m`/`s`/`S` token runs plus separators. @default `'mm:ss'` */
4668
5428
  durationFormat: _angular_core.InputSignal<string>;
5429
+ /** The string in effect: this instance's `mixedLabel`, else `FORM_FIELD_LABELS`. */
5430
+ resolvedMixedLabel: _angular_core.Signal<string>;
5431
+ /** The string in effect: this instance's `parseErrorMessage`, else the domain's label set. */
5432
+ resolvedParseErrorMessage: _angular_core.Signal<string>;
4669
5433
  spec: _angular_core.Signal<_ethlete_components.DurationFormatSpec>;
4670
5434
  /** The committed value formatted for display — masked (empty) while mixed. */
4671
5435
  displayValue: _angular_core.Signal<string>;
@@ -4740,10 +5504,13 @@ declare const formatDuration: (ms: number | null, spec: DurationFormatSpec) => s
4740
5504
  declare const parseDuration: (value: string, spec: DurationFormatSpec) => number | null;
4741
5505
 
4742
5506
  declare class DurationInputComponent {
5507
+ private formFieldLabels;
4743
5508
  protected durationInput: DurationInputDirective;
4744
5509
  /** Shows a clear (×) control while a value or pending text is set and the field is in use. */
4745
- clearable: _angular_core.InputSignal<boolean>;
4746
- clearLabel: _angular_core.InputSignal<string>;
5510
+ clearable: _angular_core.InputSignalWithTransform<boolean, unknown>;
5511
+ clearLabel: _angular_core.InputSignal<string | null>;
5512
+ /** The string in effect: this instance's `clearLabel`, else `FORM_FIELD_LABELS`. */
5513
+ protected resolvedClearLabel: _angular_core.Signal<string>;
4747
5514
  protected showClear: _angular_core.Signal<boolean>;
4748
5515
  protected handleClearClick(event: Event): void;
4749
5516
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DurationInputComponent, never>;
@@ -4760,11 +5527,14 @@ declare const DURATION_INPUT_IMPORTS: readonly [typeof DurationInputComponent, t
4760
5527
  * the time picker itself only ever sees `Date` objects.
4761
5528
  */
4762
5529
  declare class TimeInputDirective extends DatePickerInputDirective implements FormValueControl<string | null> {
5530
+ private dateTimeLabels;
4763
5531
  defaultValueFormat: string;
4764
5532
  /** Message the form field shows when typed text can't be parsed as a time. */
4765
- parseErrorMessage: _angular_core.InputSignal<string>;
5533
+ parseErrorMessage: _angular_core.InputSignal<string | null>;
4766
5534
  /** date-fns format shown in (and parsed from) the field. Locale-aware by default. */
4767
5535
  displayFormat: _angular_core.InputSignal<string>;
5536
+ /** The string in effect: this instance's `parseErrorMessage`, else the domain's label set. */
5537
+ resolvedParseErrorMessage: _angular_core.Signal<string>;
4768
5538
  controlType: _angular_core.WritableSignal<"time-input">;
4769
5539
  private referenceDate;
4770
5540
  /** The current value as a `Date` (what the picker binds to). */
@@ -4804,13 +5574,19 @@ declare const TIME_INPUT_ERROR_CODES: {
4804
5574
  };
4805
5575
 
4806
5576
  declare class TimeInputComponent {
5577
+ private dateTimeLabels;
5578
+ private formFieldLabels;
4807
5579
  protected timeInput: TimeInputDirective;
4808
- pickerTriggerLabel: _angular_core.InputSignal<string>;
4809
- minuteStep: _angular_core.InputSignal<number>;
4810
- secondStep: _angular_core.InputSignal<number>;
5580
+ pickerTriggerLabel: _angular_core.InputSignal<string | null>;
5581
+ minuteStep: _angular_core.InputSignalWithTransform<number, unknown>;
5582
+ secondStep: _angular_core.InputSignalWithTransform<number, unknown>;
4811
5583
  /** Shows a clear (×) control while a value or pending text is set and the field is in use. */
4812
- clearable: _angular_core.InputSignal<boolean>;
4813
- clearLabel: _angular_core.InputSignal<string>;
5584
+ clearable: _angular_core.InputSignalWithTransform<boolean, unknown>;
5585
+ clearLabel: _angular_core.InputSignal<string | null>;
5586
+ /** The string in effect: this instance's `pickerTriggerLabel`, else the domain's label set. */
5587
+ protected resolvedPickerTriggerLabel: _angular_core.Signal<string>;
5588
+ /** The string in effect: this instance's `clearLabel`, else `FORM_FIELD_LABELS`. */
5589
+ protected resolvedClearLabel: _angular_core.Signal<string>;
4814
5590
  protected showClear: _angular_core.Signal<boolean>;
4815
5591
  protected handleClearClick(event: Event): void;
4816
5592
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TimeInputComponent, never>;
@@ -4824,6 +5600,41 @@ declare class DescriptionComponent {
4824
5600
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DescriptionComponent, "et-description", never, {}, {}, never, ["*"], true, never>;
4825
5601
  }
4826
5602
 
5603
+ /**
5604
+ * Every string the dropzone renders or announces itself: the drop prompt, each entry's actions, and the
5605
+ * fallback wording for an upload that failed without saying why.
5606
+ *
5607
+ * The prompt is also replaceable as content (`<et-dropzone>` projects anything you put inside it), which
5608
+ * is the route to take when you want different markup rather than different words.
5609
+ */
5610
+ type DropzoneLabels = {
5611
+ /** The drop-target prompt, shown when nothing is projected into the dropzone. */
5612
+ prompt: string;
5613
+ /** The retry action on a failed entry. */
5614
+ retry: string;
5615
+ /** Accessible label prefix for an entry's remove action — the file name is appended. */
5616
+ remove: string;
5617
+ /** Accessible label for the replace action, shown in single-file mode. */
5618
+ replaceFile: string;
5619
+ /** How a failure with no server message is worded: `"photo.png" failed to upload.` */
5620
+ uploadFailed: string;
5621
+ /** Announced while uploads are in flight. */
5622
+ uploading: (count: number) => string;
5623
+ };
5624
+ /** The built-in English labels. */
5625
+ declare const DEFAULT_DROPZONE_LABELS: DropzoneLabels;
5626
+ /**
5627
+ * Localize the dropzone's strings for everything below this injector, and read the set in effect here as a
5628
+ * signal. Partial — whatever you leave out keeps its {@link DEFAULT_DROPZONE_LABELS} value. See {@link createLabels}
5629
+ * for the shape, which every domain in this library shares.
5630
+ *
5631
+ * @example
5632
+ * provideDropzoneLabels({ prompt: 'Datei hierher ziehen oder klicken', retry: 'Erneut versuchen' });
5633
+ */
5634
+ declare const provideDropzoneLabels: (labels: _ethlete_core.LabelsSource<DropzoneLabels>) => _angular_core.Provider;
5635
+ declare const injectDropzoneLabels: () => _angular_core.Signal<DropzoneLabels>;
5636
+ declare const DROPZONE_LABELS: _angular_core.InjectionToken<_ethlete_core.LabelsSource<DropzoneLabels>>;
5637
+
4827
5638
  /**
4828
5639
  * Display information for a value that is already part of the form control
4829
5640
  * (e.g. media uploaded in a previous session inside an edit form).
@@ -5109,15 +5920,15 @@ declare class DropzoneDirective<TValue = unknown> implements FormValueControl<TV
5109
5920
  private injector;
5110
5921
  value: _angular_core.ModelSignal<TValue | TValue[] | null>;
5111
5922
  touched: _angular_core.ModelSignal<boolean>;
5112
- disabled: _angular_core.InputSignal<boolean>;
5113
- invalid: _angular_core.InputSignal<boolean>;
5923
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
5924
+ invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
5114
5925
  errors: _angular_core.InputSignal<readonly ValidationError.WithOptionalFieldTree[]>;
5115
- required: _angular_core.InputSignal<boolean>;
5926
+ required: _angular_core.InputSignalWithTransform<boolean, unknown>;
5116
5927
  name: _angular_core.InputSignal<string>;
5117
5928
  /** The upload workflow configuration. Create it via `createDropzoneUpload()`. */
5118
5929
  upload: _angular_core.InputSignal<AnyDropzoneUploadConfig<TValue>>;
5119
5930
  /** Whether multiple files can be uploaded. The control value becomes an array. */
5120
- multiple: _angular_core.InputSignal<boolean>;
5931
+ multiple: _angular_core.InputSignalWithTransform<boolean, unknown>;
5121
5932
  /** Emits all files of a selection that were rejected, with the reason per file. */
5122
5933
  filesReject: _angular_core.OutputEmitterRef<DropzoneFileRejection[]>;
5123
5934
  /** Emits when the upload of an entry succeeded (after the control value was updated). */
@@ -5176,6 +5987,7 @@ declare class DropzoneDirective<TValue = unknown> implements FormValueControl<TV
5176
5987
  }
5177
5988
 
5178
5989
  declare class DropzoneComponent {
5990
+ private dropzoneLabels;
5179
5991
  protected dropzoneDir: DropzoneDirective<any>;
5180
5992
  support: {
5181
5993
  errorColorTheme: _ethlete_core.ColorTheme;
@@ -5198,13 +6010,13 @@ declare class DropzoneComponent {
5198
6010
  private renderer;
5199
6011
  private prefersReducedMotion;
5200
6012
  /** Label of the retry button shown for failed uploads. */
5201
- retryLabel: _angular_core.InputSignal<string>;
6013
+ retryLabel: _angular_core.InputSignal<string | null>;
5202
6014
  /** Accessible label prefix of the remove button. The entry name is appended. */
5203
- removeLabel: _angular_core.InputSignal<string>;
6015
+ removeLabel: _angular_core.InputSignal<string | null>;
5204
6016
  /** Accessible label of the replace button shown in single mode. */
5205
- replaceLabel: _angular_core.InputSignal<string>;
6017
+ replaceLabel: _angular_core.InputSignal<string | null>;
5206
6018
  /** Fallback error message shown when the upload error has no message. */
5207
- uploadErrorLabel: _angular_core.InputSignal<string>;
6019
+ uploadErrorLabel: _angular_core.InputSignal<string | null>;
5208
6020
  /** Overrides the built-in per-entry upload failure message (e.g. for i18n). */
5209
6021
  uploadErrorMessage: _angular_core.InputSignal<((entry: DropzoneEntry) => string) | null>;
5210
6022
  private fileInput;
@@ -5214,6 +6026,14 @@ declare class DropzoneComponent {
5214
6026
  private errorAnimatableRef;
5215
6027
  private hintAnimatableRef;
5216
6028
  private entryElements;
6029
+ /** The string in effect: this instance's `retryLabel`, else the domain's label set. */
6030
+ protected resolvedRetryLabel: _angular_core.Signal<string>;
6031
+ /** The string in effect: this instance's `removeLabel`, else the domain's label set. */
6032
+ protected resolvedRemoveLabel: _angular_core.Signal<string>;
6033
+ /** The string in effect: this instance's `replaceLabel`, else the domain's label set. */
6034
+ protected resolvedReplaceLabel: _angular_core.Signal<string>;
6035
+ /** The string in effect: this instance's `uploadErrorLabel`, else the domain's label set. */
6036
+ resolvedUploadErrorLabel: _angular_core.Signal<string>;
5217
6037
  private removingEntryIds;
5218
6038
  private filePickerOpen;
5219
6039
  canAnimate: {
@@ -5249,6 +6069,38 @@ declare const DROPZONE_ERROR_CODES: {
5249
6069
  readonly VALUE_MODE_MISMATCH: 2402;
5250
6070
  };
5251
6071
 
6072
+ /**
6073
+ * The `x / N` character counter in a form field's support region.
6074
+ *
6075
+ * It sits at the inline-end of the support row and is **persistent** — unlike the hint, it does not
6076
+ * swap out when an error appears, because a reader who just crossed the limit needs to see both the
6077
+ * error and the count that caused it.
6078
+ *
6079
+ * The limit comes from `[max]` if given, otherwise from the bound field's schema `maxLength()`
6080
+ * (signal forms binds that into the control automatically). With neither, the counter renders the
6081
+ * bare count.
6082
+ */
6083
+ declare class CounterComponent implements CounterComponentBase {
6084
+ private formField;
6085
+ /**
6086
+ * The limit to count towards. Wins over the schema's `maxLength()` — use it for a control whose
6087
+ * length isn't schema-validated, or to count towards a softer limit than the one that validates.
6088
+ */
6089
+ max: _angular_core.InputSignal<number | undefined>;
6090
+ /** Measures the control's value. Override for a value type the default can't count. */
6091
+ lengthOf: _angular_core.InputSignal<(value: unknown) => number>;
6092
+ /** The limit actually in effect: the explicit `[max]`, else the bound field's `maxLength()`. */
6093
+ resolvedMax: _angular_core.Signal<number | undefined>;
6094
+ /** The current length of the control's value. */
6095
+ current: _angular_core.Signal<number>;
6096
+ isOverLimit: _angular_core.Signal<boolean>;
6097
+ protected limitSuffix: _angular_core.Signal<string>;
6098
+ protected announcement: _angular_core.Signal<string | null>;
6099
+ constructor();
6100
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CounterComponent, never>;
6101
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CounterComponent, "et-counter", never, { "max": { "alias": "max"; "required": false; "isSignal": true; }; "lengthOf": { "alias": "lengthOf"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
6102
+ }
6103
+
5252
6104
  /**
5253
6105
  * Resolves the text shown for a validation error. Return `null` to fall back to the error's own
5254
6106
  * `message`. Lets an app centralize/localize error texts by `kind` (e.g. `required`, `minLength`,
@@ -5265,6 +6117,34 @@ declare class FormErrorComponent {
5265
6117
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<FormErrorComponent, "et-form-error", never, { "error": { "alias": "error"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
5266
6118
  }
5267
6119
 
6120
+ /**
6121
+ * The strings every form control shows, rather than any one control's own. Both are answers a control
6122
+ * gives about its *value*, which is why they recur: a bulk edit masks disagreeing values the same way in
6123
+ * a text field and in a slider, and a clearable control offers to empty itself the same way everywhere.
6124
+ *
6125
+ * One set for all of them on purpose — translating "Clear" once should be enough. The per-control inputs
6126
+ * (`clearLabel`, `mixedLabel`) still win where a specific instance needs different wording.
6127
+ */
6128
+ type FormFieldLabels = {
6129
+ /** Placeholder standing in for values that disagree across a bulk edit (`mixed`). */
6130
+ mixed: string;
6131
+ /** Accessible label for a control's clear-value button. */
6132
+ clear: string;
6133
+ };
6134
+ /** The built-in English labels. */
6135
+ declare const DEFAULT_FORM_FIELD_LABELS: FormFieldLabels;
6136
+ /**
6137
+ * Localize the strings shared by every form control below this injector, and read the set in effect here
6138
+ * as a signal. Partial — whatever you leave out keeps its {@link DEFAULT_FORM_FIELD_LABELS} value. See
6139
+ * {@link createLabels} for the shape, which every domain in this library shares.
6140
+ *
6141
+ * @example
6142
+ * provideFormFieldLabels({ mixed: 'Gemischt', clear: 'Leeren' });
6143
+ */
6144
+ declare const provideFormFieldLabels: (labels: _ethlete_core.LabelsSource<FormFieldLabels>) => _angular_core.Provider;
6145
+ declare const injectFormFieldLabels: () => _angular_core.Signal<FormFieldLabels>;
6146
+ declare const FORM_FIELD_LABELS: _angular_core.InjectionToken<_ethlete_core.LabelsSource<FormFieldLabels>>;
6147
+
5268
6148
  declare class FormFieldComponent {
5269
6149
  private provideColor;
5270
6150
  private provideSurface;
@@ -5276,14 +6156,23 @@ declare class FormFieldComponent {
5276
6156
  fill: _angular_core.InputSignal<FormFieldFill>;
5277
6157
  labelMode: _angular_core.InputSignal<FormFieldLabelMode>;
5278
6158
  size: _angular_core.InputSignal<FormFieldSize>;
6159
+ /**
6160
+ * Forces the busy state on. The field already shows it while an async validator is in flight for
6161
+ * the bound field; use this for work the form doesn't know about (saving, a lookup of your own).
6162
+ */
6163
+ busy: _angular_core.InputSignalWithTransform<boolean, unknown>;
5279
6164
  protected errorContent: _angular_core.Signal<ElementRef<HTMLElement> | undefined>;
5280
6165
  protected hintContent: _angular_core.Signal<ElementRef<HTMLElement> | undefined>;
6166
+ counterContent: _angular_core.Signal<ElementRef<HTMLElement> | undefined>;
5281
6167
  private controlFrame;
5282
6168
  prefixEl: _angular_core.Signal<ElementRef<HTMLElement> | undefined>;
5283
6169
  protected errorAnimatable: _angular_core.Signal<AnimatableDirective | undefined>;
5284
6170
  protected hintAnimatable: _angular_core.Signal<AnimatableDirective | undefined>;
6171
+ /** Whether the field is showing its busy affordance — a pending async validator, or `[busy]`. */
6172
+ isBusy: _angular_core.Signal<boolean>;
5285
6173
  private errorDimensions;
5286
6174
  private hintDimensions;
6175
+ private counterDimensions;
5287
6176
  private prefixDimensions;
5288
6177
  private supportPresentation;
5289
6178
  private resolvedSurface;
@@ -5310,7 +6199,7 @@ declare class FormFieldComponent {
5310
6199
  constructor();
5311
6200
  protected handleFramePointerDown(event: MouseEvent): void;
5312
6201
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FormFieldComponent, never>;
5313
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<FormFieldComponent, "et-form-field", never, { "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "fill": { "alias": "fill"; "required": false; "isSignal": true; }; "labelMode": { "alias": "labelMode"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, {}, never, ["[etInputPrefix]", "et-label", "*", "[etInputSuffix]", "et-hint"], true, [{ directive: typeof FormFieldDirective; inputs: {}; outputs: {}; }, { directive: typeof _ethlete_core.ProvideColorDirective; inputs: { "etProvideColor": "color"; }; outputs: {}; }, { directive: typeof _ethlete_core.ProvideSurfaceDirective; inputs: { "etProvideSurface": "surface"; }; outputs: {}; }, { directive: typeof _ethlete_core.ColorInteractiveHasFocusDirective; inputs: {}; outputs: {}; }]>;
6202
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FormFieldComponent, "et-form-field", never, { "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "fill": { "alias": "fill"; "required": false; "isSignal": true; }; "labelMode": { "alias": "labelMode"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "busy": { "alias": "busy"; "required": false; "isSignal": true; }; }, {}, never, ["[etInputPrefix]", "et-label", "*", "[etInputSuffix]", "et-hint", "et-counter"], true, [{ directive: typeof FormFieldDirective; inputs: {}; outputs: {}; }, { directive: typeof _ethlete_core.ProvideColorDirective; inputs: { "etProvideColor": "color"; }; outputs: {}; }, { directive: typeof _ethlete_core.ProvideSurfaceDirective; inputs: { "etProvideSurface": "surface"; }; outputs: {}; }, { directive: typeof _ethlete_core.ColorInteractiveHasFocusDirective; inputs: {}; outputs: {}; }]>;
5314
6203
  }
5315
6204
 
5316
6205
  declare class InputPrefixDirective {
@@ -5323,7 +6212,7 @@ declare class InputSuffixDirective {
5323
6212
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<InputSuffixDirective, "[etInputSuffix]", never, {}, {}, never, never, true, never>;
5324
6213
  }
5325
6214
 
5326
- declare const FORM_FIELD_IMPORTS: readonly [typeof FormFieldComponent, typeof FormFieldDirective, typeof LabelDirective, typeof HintComponent, typeof InputPrefixDirective, typeof InputSuffixDirective];
6215
+ declare const FORM_FIELD_IMPORTS: readonly [typeof FormFieldComponent, typeof FormFieldDirective, typeof LabelDirective, typeof HintComponent, typeof CounterComponent, typeof InputPrefixDirective, typeof InputSuffixDirective];
5327
6216
 
5328
6217
  declare const INPUT_TEXT_ALIGNMENTS: {
5329
6218
  readonly START: "start";
@@ -5471,53 +6360,96 @@ declare class PasswordInputDirective extends TextFieldControlDirective implement
5471
6360
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<PasswordInputDirective, "[etPasswordInput]", ["etPasswordInput"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "autocomplete": { "alias": "autocomplete"; "required": false; "isSignal": true; }; "revealed": { "alias": "revealed"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "revealed": "revealedChange"; }, never, never, true, never>;
5472
6361
  }
5473
6362
 
6363
+ /**
6364
+ * The strings the text-field family's own controls render — the number input's steppers and the password
6365
+ * input's reveal toggle. The field's label, hint and errors are yours; these are the parts the control
6366
+ * adds by itself.
6367
+ */
6368
+ type InputLabels = {
6369
+ /** Accessible label for the number input's step-up control. */
6370
+ increment: string;
6371
+ /** Accessible label for the number input's step-down control. */
6372
+ decrement: string;
6373
+ /** Accessible label for the password input's control while the value is masked. */
6374
+ showPassword: string;
6375
+ /** Accessible label for the password input's control while the value is visible. */
6376
+ hidePassword: string;
6377
+ /** The password input's warning that Caps Lock is on. */
6378
+ capsLockOn: string;
6379
+ };
6380
+ /** The built-in English labels. */
6381
+ declare const DEFAULT_INPUT_LABELS: InputLabels;
6382
+ /**
6383
+ * Localize the text field family's strings for everything below this injector, and read the set in effect here as a
6384
+ * signal. Partial — whatever you leave out keeps its {@link DEFAULT_INPUT_LABELS} value. See {@link createLabels}
6385
+ * for the shape, which every domain in this library shares.
6386
+ *
6387
+ * @example
6388
+ * provideInputLabels({ increment: 'Erhöhen', decrement: 'Verringern' });
6389
+ */
6390
+ declare const provideInputLabels: (labels: _ethlete_core.LabelsSource<InputLabels>) => _angular_core.Provider;
6391
+ declare const injectInputLabels: () => _angular_core.Signal<InputLabels>;
6392
+ declare const INPUT_LABELS: _angular_core.InjectionToken<_ethlete_core.LabelsSource<InputLabels>>;
6393
+
5474
6394
  declare class InputComponent {
5475
6395
  protected inputDir: InputDirective;
5476
6396
  private nativeInput;
5477
6397
  constructor();
5478
6398
  syncNativeValue(event: Event): void;
5479
6399
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<InputComponent, never>;
5480
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<InputComponent, "et-input", never, {}, {}, never, never, true, [{ directive: typeof InputDirective; inputs: { "type": "type"; "placeholder": "placeholder"; "autocomplete": "autocomplete"; "textAlign": "textAlign"; "value": "value"; "mixed": "mixed"; "mixedLabel": "mixedLabel"; "disabled": "disabled"; "readonly": "readonly"; "hidden": "hidden"; "invalid": "invalid"; "errors": "errors"; "required": "required"; "name": "name"; "aria-label": "aria-label"; "aria-labelledby": "aria-labelledby"; }; outputs: { "valueChange": "valueChange"; "mixedChange": "mixedChange"; "touchedChange": "touchedChange"; }; }, { directive: typeof _ethlete_core.ColorInteractiveDirective; inputs: {}; outputs: {}; }]>;
6400
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<InputComponent, "et-input", never, {}, {}, never, never, true, [{ directive: typeof InputDirective; inputs: { "type": "type"; "placeholder": "placeholder"; "autocomplete": "autocomplete"; "textAlign": "textAlign"; "value": "value"; "mixed": "mixed"; "mixedLabel": "mixedLabel"; "disabled": "disabled"; "readonly": "readonly"; "hidden": "hidden"; "invalid": "invalid"; "errors": "errors"; "required": "required"; "name": "name"; "maxLength": "maxLength"; "pending": "pending"; "aria-label": "aria-label"; "aria-labelledby": "aria-labelledby"; }; outputs: { "valueChange": "valueChange"; "mixedChange": "mixedChange"; "touchedChange": "touchedChange"; }; }, { directive: typeof _ethlete_core.ColorInteractiveDirective; inputs: {}; outputs: {}; }]>;
5481
6401
  }
5482
6402
 
5483
6403
  declare class NumberInputComponent {
6404
+ private inputLabels;
5484
6405
  protected numberInputDir: NumberInputDirective;
5485
6406
  private destroyRef;
5486
6407
  private document;
5487
6408
  /** Renders −/+ stepper buttons with press-and-hold auto-repeat. */
5488
6409
  stepper: _angular_core.InputSignalWithTransform<boolean, unknown>;
5489
6410
  /** Accessible name of the increment stepper button. */
5490
- incrementLabel: _angular_core.InputSignal<string>;
6411
+ incrementLabel: _angular_core.InputSignal<string | null>;
5491
6412
  /** Accessible name of the decrement stepper button. */
5492
- decrementLabel: _angular_core.InputSignal<string>;
6413
+ decrementLabel: _angular_core.InputSignal<string | null>;
5493
6414
  private nativeInput;
6415
+ /** The string in effect: this instance's `incrementLabel`, else the domain's label set. */
6416
+ protected resolvedIncrementLabel: _angular_core.Signal<string>;
6417
+ /** The string in effect: this instance's `decrementLabel`, else the domain's label set. */
6418
+ protected resolvedDecrementLabel: _angular_core.Signal<string>;
5494
6419
  private repeatSub;
5495
6420
  constructor();
5496
6421
  syncNativeValue(event: Event): void;
5497
6422
  protected startStepRepeat(event: PointerEvent, direction: 1 | -1): void;
5498
6423
  protected stopStepRepeat(): void;
5499
6424
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NumberInputComponent, never>;
5500
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<NumberInputComponent, "et-number-input", never, { "stepper": { "alias": "stepper"; "required": false; "isSignal": true; }; "incrementLabel": { "alias": "incrementLabel"; "required": false; "isSignal": true; }; "decrementLabel": { "alias": "decrementLabel"; "required": false; "isSignal": true; }; }, {}, never, never, true, [{ directive: typeof NumberInputDirective; inputs: { "min": "min"; "max": "max"; "step": "step"; "placeholder": "placeholder"; "autocomplete": "autocomplete"; "textAlign": "textAlign"; "value": "value"; "mixed": "mixed"; "mixedLabel": "mixedLabel"; "disabled": "disabled"; "readonly": "readonly"; "hidden": "hidden"; "invalid": "invalid"; "errors": "errors"; "required": "required"; "name": "name"; "aria-label": "aria-label"; "aria-labelledby": "aria-labelledby"; }; outputs: { "valueChange": "valueChange"; "mixedChange": "mixedChange"; "touchedChange": "touchedChange"; }; }, { directive: typeof _ethlete_core.ColorInteractiveDirective; inputs: {}; outputs: {}; }]>;
6425
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NumberInputComponent, "et-number-input", never, { "stepper": { "alias": "stepper"; "required": false; "isSignal": true; }; "incrementLabel": { "alias": "incrementLabel"; "required": false; "isSignal": true; }; "decrementLabel": { "alias": "decrementLabel"; "required": false; "isSignal": true; }; }, {}, never, never, true, [{ directive: typeof NumberInputDirective; inputs: { "min": "min"; "max": "max"; "step": "step"; "placeholder": "placeholder"; "autocomplete": "autocomplete"; "textAlign": "textAlign"; "value": "value"; "mixed": "mixed"; "mixedLabel": "mixedLabel"; "disabled": "disabled"; "readonly": "readonly"; "hidden": "hidden"; "invalid": "invalid"; "errors": "errors"; "required": "required"; "name": "name"; "maxLength": "maxLength"; "pending": "pending"; "aria-label": "aria-label"; "aria-labelledby": "aria-labelledby"; }; outputs: { "valueChange": "valueChange"; "mixedChange": "mixedChange"; "touchedChange": "touchedChange"; }; }, { directive: typeof _ethlete_core.ColorInteractiveDirective; inputs: {}; outputs: {}; }]>;
5501
6426
  }
5502
6427
 
5503
6428
  declare class PasswordInputComponent {
6429
+ private inputLabels;
5504
6430
  protected passwordDir: PasswordInputDirective;
5505
6431
  /** Whether the reveal (show/hide) toggle renders. */
5506
- revealable: _angular_core.InputSignal<boolean>;
6432
+ revealable: _angular_core.InputSignalWithTransform<boolean, unknown>;
5507
6433
  /** Accessible name of the reveal toggle while the value is hidden (the "show" action). */
5508
- revealLabel: _angular_core.InputSignal<string>;
6434
+ revealLabel: _angular_core.InputSignal<string | null>;
5509
6435
  /** Accessible name of the reveal toggle while the value is shown (the "hide" action). */
5510
- hideLabel: _angular_core.InputSignal<string>;
6436
+ hideLabel: _angular_core.InputSignal<string | null>;
5511
6437
  /** Show a warning indicator while the field is focused and Caps Lock is on. */
5512
- capsLockWarning: _angular_core.InputSignal<boolean>;
6438
+ capsLockWarning: _angular_core.InputSignalWithTransform<boolean, unknown>;
5513
6439
  /** Accessible text of the Caps Lock warning. */
5514
- capsLockLabel: _angular_core.InputSignal<string>;
6440
+ capsLockLabel: _angular_core.InputSignal<string | null>;
5515
6441
  private nativeInput;
6442
+ /** The string in effect: this instance's `revealLabel`, else the domain's label set. */
6443
+ protected resolvedRevealLabel: _angular_core.Signal<string>;
6444
+ /** The string in effect: this instance's `hideLabel`, else the domain's label set. */
6445
+ protected resolvedHideLabel: _angular_core.Signal<string>;
6446
+ /** The string in effect: this instance's `capsLockLabel`, else the domain's label set. */
6447
+ protected resolvedCapsLockLabel: _angular_core.Signal<string>;
5516
6448
  constructor();
5517
6449
  protected showCapsLockWarning(): boolean;
5518
6450
  syncNativeValue(event: Event): void;
5519
6451
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<PasswordInputComponent, never>;
5520
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<PasswordInputComponent, "et-password-input", never, { "revealable": { "alias": "revealable"; "required": false; "isSignal": true; }; "revealLabel": { "alias": "revealLabel"; "required": false; "isSignal": true; }; "hideLabel": { "alias": "hideLabel"; "required": false; "isSignal": true; }; "capsLockWarning": { "alias": "capsLockWarning"; "required": false; "isSignal": true; }; "capsLockLabel": { "alias": "capsLockLabel"; "required": false; "isSignal": true; }; }, {}, never, never, true, [{ directive: typeof PasswordInputDirective; inputs: { "placeholder": "placeholder"; "autocomplete": "autocomplete"; "value": "value"; "mixed": "mixed"; "mixedLabel": "mixedLabel"; "revealed": "revealed"; "disabled": "disabled"; "readonly": "readonly"; "hidden": "hidden"; "invalid": "invalid"; "errors": "errors"; "required": "required"; "name": "name"; "aria-label": "aria-label"; "aria-labelledby": "aria-labelledby"; }; outputs: { "valueChange": "valueChange"; "mixedChange": "mixedChange"; "touchedChange": "touchedChange"; "revealedChange": "revealedChange"; }; }, { directive: typeof _ethlete_core.ColorInteractiveDirective; inputs: {}; outputs: {}; }]>;
6452
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PasswordInputComponent, "et-password-input", never, { "revealable": { "alias": "revealable"; "required": false; "isSignal": true; }; "revealLabel": { "alias": "revealLabel"; "required": false; "isSignal": true; }; "hideLabel": { "alias": "hideLabel"; "required": false; "isSignal": true; }; "capsLockWarning": { "alias": "capsLockWarning"; "required": false; "isSignal": true; }; "capsLockLabel": { "alias": "capsLockLabel"; "required": false; "isSignal": true; }; }, {}, never, never, true, [{ directive: typeof PasswordInputDirective; inputs: { "placeholder": "placeholder"; "autocomplete": "autocomplete"; "value": "value"; "mixed": "mixed"; "mixedLabel": "mixedLabel"; "revealed": "revealed"; "disabled": "disabled"; "readonly": "readonly"; "hidden": "hidden"; "invalid": "invalid"; "errors": "errors"; "required": "required"; "name": "name"; "maxLength": "maxLength"; "pending": "pending"; "aria-label": "aria-label"; "aria-labelledby": "aria-labelledby"; }; outputs: { "valueChange": "valueChange"; "mixedChange": "mixedChange"; "touchedChange": "touchedChange"; "revealedChange": "revealedChange"; }; }, { directive: typeof _ethlete_core.ColorInteractiveDirective; inputs: {}; outputs: {}; }]>;
5521
6453
  }
5522
6454
 
5523
6455
  declare const INPUT_IMPORTS: readonly [typeof InputComponent, typeof InputDirective];
@@ -5681,11 +6613,11 @@ type MultiLanguageRichTextEditorValue = Record<string, string>;
5681
6613
  declare class MultiLanguageRichTextEditorDirective implements FormValueControl<MultiLanguageRichTextEditorValue> {
5682
6614
  value: _angular_core.ModelSignal<MultiLanguageRichTextEditorValue>;
5683
6615
  touched: _angular_core.ModelSignal<boolean>;
5684
- disabled: _angular_core.InputSignal<boolean>;
5685
- readonly: _angular_core.InputSignal<boolean>;
5686
- invalid: _angular_core.InputSignal<boolean>;
6616
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
6617
+ readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
6618
+ invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
5687
6619
  errors: _angular_core.InputSignal<readonly ValidationError.WithOptionalFieldTree[]>;
5688
- required: _angular_core.InputSignal<boolean>;
6620
+ required: _angular_core.InputSignalWithTransform<boolean, unknown>;
5689
6621
  name: _angular_core.InputSignal<string>;
5690
6622
  /** The languages to offer, in switcher order. Consumer-provided — no languages are hard-wired. */
5691
6623
  languages: _angular_core.InputSignal<readonly MultiLanguageRichTextEditorLanguage[]>;
@@ -5855,7 +6787,11 @@ declare class RichTextEditorTriggersDirective {
5855
6787
  private overlayManager;
5856
6788
  private destroyRef;
5857
6789
  triggers: _angular_core.InputSignal<readonly RichTextEditorTrigger[]>;
5858
- emptyLabel: _angular_core.InputSignal<string>;
6790
+ /** Shown by the popup when a query matches nothing. `null` (the default) uses the editor's
6791
+ * `noResults` label. */
6792
+ emptyLabel: _angular_core.InputSignal<string | null>;
6793
+ /** The string in effect: this instance's `emptyLabel`, else the editor's label set. */
6794
+ private resolvedEmptyLabel;
5859
6795
  private readonly listboxId;
5860
6796
  private activeMatch;
5861
6797
  private activeIndex;
@@ -5909,6 +6845,144 @@ type RichTextMarkStates = {
5909
6845
  tableCell: boolean;
5910
6846
  };
5911
6847
 
6848
+ /**
6849
+ * Every string the rich text editor renders or announces itself. Defaults are English
6850
+ * ({@link DEFAULT_RICH_TEXT_EDITOR_LABELS}); override them app-wide with
6851
+ * {@link provideRichTextEditorLabels} or per instance via `et-rich-text-editor`'s `labels` input.
6852
+ *
6853
+ * Almost all of it is accessible labels: the toolbar's buttons show icons, so their name is the only
6854
+ * thing a screen reader has to go on.
6855
+ *
6856
+ * The **tool** keys (`bold` … `table`) are named after their tool tokens, which is how the toolbar looks
6857
+ * a button's name up. A tool your app registers through `RICH_TEXT_EDITOR_TOOL` keeps the `label` on its
6858
+ * own definition instead — you wrote that string, so it is already in your language.
6859
+ */
6860
+ type RichTextEditorLabels = {
6861
+ /** Accessible label for the toolbar. */
6862
+ toolbar: string;
6863
+ /** Accessible label for the toolbar that follows a selection (`floatingToolbar`). */
6864
+ selectionToolbar: string;
6865
+ /** Accessible name for the block-style menu's trigger, given the current style's own label. */
6866
+ textStyle: (currentStyle: string) => string;
6867
+ /** Block-style menu entry: a normal paragraph. */
6868
+ paragraph: string;
6869
+ /** Block-style menu entry for a heading level. */
6870
+ heading: (level: number) => string;
6871
+ /** Accessible label for the link editor popover. */
6872
+ linkEditor: string;
6873
+ /** The link editor's heading while the caret sits on an existing link. */
6874
+ linkEditorEdit: string;
6875
+ /** The link editor's heading while adding a new link. */
6876
+ linkEditorAdd: string;
6877
+ /** Accessible label for the link editor's close button. */
6878
+ linkEditorClose: string;
6879
+ /** Label for the link editor's text field. */
6880
+ linkTextLabel: string;
6881
+ /** Placeholder for the link editor's text field. */
6882
+ linkTextPlaceholder: string;
6883
+ /** Label for the link editor's URL field. */
6884
+ linkUrlLabel: string;
6885
+ /** Placeholder for the link editor's URL field. */
6886
+ linkUrlPlaceholder: string;
6887
+ /** The link editor's "open in a new tab" checkbox. */
6888
+ linkNewTab: string;
6889
+ /** The link editor's action that strips the link, shown only for an existing one. */
6890
+ linkRemove: string;
6891
+ /** The link editor's confirm action while adding a link. */
6892
+ linkAdd: string;
6893
+ /** The link editor's confirm action while editing an existing link. */
6894
+ linkUpdate: string;
6895
+ /** The token palette's trigger. */
6896
+ insertToken: string;
6897
+ /** Shown by a token popup or palette that has nothing to offer. */
6898
+ noResults: string;
6899
+ /** Accessible label for a cell in the table tool's size picker, e.g. `'3 by 4'`. */
6900
+ tableSize: (rows: number, columns: number) => string;
6901
+ /** The size picker's readout while a size is hovered, e.g. `'3 × 4'`. */
6902
+ tableSizePreview: (rows: number, columns: number) => string;
6903
+ /** The size picker's readout before any size is hovered. */
6904
+ tableInsert: string;
6905
+ /** Table menu entry: add a header row to a table that has none. */
6906
+ tableInsertHeaderRow: string;
6907
+ /** Table menu entry: insert a row above the caret's. */
6908
+ tableInsertRowAbove: string;
6909
+ /** Table menu entry: insert a row below the caret's. */
6910
+ tableInsertRowBelow: string;
6911
+ /** Table menu entry: insert a column left of the caret's. */
6912
+ tableInsertColumnLeft: string;
6913
+ /** Table menu entry: insert a column right of the caret's. */
6914
+ tableInsertColumnRight: string;
6915
+ /** Table menu entry: delete the caret's row. */
6916
+ tableDeleteRow: string;
6917
+ /** Table menu entry: delete the caret's column. */
6918
+ tableDeleteColumn: string;
6919
+ /** Table menu entry: delete the whole table. */
6920
+ tableDeleteTable: string;
6921
+ /** Toolbar tool: bold. */
6922
+ bold: string;
6923
+ /** Toolbar tool: italic. */
6924
+ italic: string;
6925
+ /** Toolbar tool: strikethrough. */
6926
+ strike: string;
6927
+ /** Toolbar tool: underline. */
6928
+ underline: string;
6929
+ /** Toolbar tool: inline code. */
6930
+ code: string;
6931
+ /** Toolbar tool: bulleted list. */
6932
+ bulletedList: string;
6933
+ /** Toolbar tool: numbered list. */
6934
+ numberedList: string;
6935
+ /** Toolbar tool: link. */
6936
+ link: string;
6937
+ /** Toolbar tool: the opt-in alignment menu. */
6938
+ align: string;
6939
+ /** Accessible label for the alignment menu's trigger. */
6940
+ alignTrigger: string;
6941
+ /** Alignment menu entry: align left. */
6942
+ alignLeft: string;
6943
+ /** Alignment menu entry: center. */
6944
+ alignCenter: string;
6945
+ /** Alignment menu entry: align right. */
6946
+ alignRight: string;
6947
+ /** Alignment menu entry: justify. */
6948
+ alignJustify: string;
6949
+ /** Toolbar tool: the opt-in table menu, and its trigger. */
6950
+ table: string;
6951
+ /** Toolbar tool: the multi-language editor's language switcher. */
6952
+ language: string;
6953
+ /** Accessible name for the language switcher's trigger, given the active language's own name. */
6954
+ languageTrigger: (currentLanguage: string) => string;
6955
+ };
6956
+ /** The built-in English labels. */
6957
+ declare const DEFAULT_RICH_TEXT_EDITOR_LABELS: RichTextEditorLabels;
6958
+ /**
6959
+ * Localize the rich text editor's strings for everything below this injector, and read the set in
6960
+ * effect here as a signal. Partial — whatever you leave out keeps its
6961
+ * {@link DEFAULT_RICH_TEXT_EDITOR_LABELS} value. See {@link createLabels} for the shape, which every
6962
+ * domain in this library shares.
6963
+ *
6964
+ * @example
6965
+ * provideRichTextEditorLabels({
6966
+ * toolbar: 'Textformatierung',
6967
+ * bold: 'Fett',
6968
+ * heading: (level) => `Überschrift ${level}`,
6969
+ * });
6970
+ */
6971
+ declare const provideRichTextEditorLabels: (labels: _ethlete_core.LabelsSource<RichTextEditorLabels>) => _angular_core.Provider;
6972
+ declare const injectRichTextEditorLabels: () => _angular_core.Signal<RichTextEditorLabels>;
6973
+ declare const RICH_TEXT_EDITOR_LABELS: _angular_core.InjectionToken<_ethlete_core.LabelsSource<RichTextEditorLabels>>;
6974
+ /**
6975
+ * A toolbar button's accessible name: the label set's entry for its tool token, or the `label` on the
6976
+ * definition itself for a tool this library doesn't ship (an app's own tool, already in its language).
6977
+ *
6978
+ * The cast is the price of an extensible token: tool tokens are open strings, so no index signature can
6979
+ * describe "the built-in ones happen to be keys of {@link RichTextEditorLabels}".
6980
+ */
6981
+ declare const richTextEditorToolLabel: (labels: RichTextEditorLabels, tool: {
6982
+ token: string;
6983
+ label: string;
6984
+ }) => string;
6985
+
5912
6986
  /**
5913
6987
  * The formatting controls the rich text editor can render in its toolbar. `'divider'` renders a
5914
6988
  * visual separator and `'heading'` renders the block-style menu; every other token renders a toggle
@@ -5954,7 +7028,13 @@ declare const injectRichTextEditorTools: {
5954
7028
  */
5955
7029
  declare const provideRichTextEditorTools: (tools: readonly RichTextEditorTool[]) => _angular_core.Provider[];
5956
7030
 
5957
- /** Icon + label + wiring for a single toggle-button tool. */
7031
+ /**
7032
+ * Icon + label + wiring for a single toggle-button tool.
7033
+ *
7034
+ * `label` is only the fallback: what the toolbar renders comes from `RICH_TEXT_EDITOR_LABELS`, keyed by
7035
+ * the tool's token — which is why the built-in tables below read their labels from that set's defaults
7036
+ * rather than repeating them.
7037
+ */
5958
7038
  type RichTextEditorToolButton = {
5959
7039
  icon: string;
5960
7040
  label: string;
@@ -6039,6 +7119,7 @@ declare class RichTextEditorDirective implements FormValueControl<string>, FormF
6039
7119
  private document;
6040
7120
  private renderer;
6041
7121
  private toolsConfig;
7122
+ private injectedLabels;
6042
7123
  /** @internal */
6043
7124
  editorDom: {
6044
7125
  root: _angular_core.WritableSignal<HTMLElement | null>;
@@ -6075,12 +7156,12 @@ declare class RichTextEditorDirective implements FormValueControl<string>, FormF
6075
7156
  };
6076
7157
  value: _angular_core.ModelSignal<string>;
6077
7158
  touched: _angular_core.ModelSignal<boolean>;
6078
- disabled: _angular_core.InputSignal<boolean>;
6079
- readonly: _angular_core.InputSignal<boolean>;
6080
- hidden: _angular_core.InputSignal<boolean>;
6081
- invalid: _angular_core.InputSignal<boolean>;
7159
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
7160
+ readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
7161
+ hidden: _angular_core.InputSignalWithTransform<boolean, unknown>;
7162
+ invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
6082
7163
  errors: _angular_core.InputSignal<readonly ValidationError.WithOptionalFieldTree[]>;
6083
- required: _angular_core.InputSignal<boolean>;
7164
+ required: _angular_core.InputSignalWithTransform<boolean, unknown>;
6084
7165
  name: _angular_core.InputSignal<string>;
6085
7166
  placeholder: _angular_core.InputSignal<string>;
6086
7167
  /** Which formatting tools the toolbar renders, and in what order. Falls back to the value from
@@ -6089,9 +7170,20 @@ declare class RichTextEditorDirective implements FormValueControl<string>, FormF
6089
7170
  /** Markdown autoformat while typing: `- `, `1. ` and `# `–`### ` at a line start convert into
6090
7171
  * lists/headings, and closing `**bold**`, `*italic*`, `` `code` ``, `~~strike~~`, `__`/`_` runs
6091
7172
  * convert into their marks. Registered token-trigger characters never autoformat. */
6092
- autoformat: _angular_core.InputSignal<boolean>;
7173
+ autoformat: _angular_core.InputSignalWithTransform<boolean, unknown>;
7174
+ /**
7175
+ * Per-instance overrides for the editor's strings, merged over the injected `RICH_TEXT_EDITOR_LABELS`.
7176
+ * Prefer `provideRichTextEditorLabels` for app-wide localization; use this for a one-off wording.
7177
+ */
7178
+ labels: _angular_core.InputSignal<Partial<RichTextEditorLabels> | null>;
6093
7179
  /** Resolved toolbar tools: the `tools` input if set, otherwise the provided/default config. */
6094
7180
  resolvedTools: _angular_core.Signal<readonly RichTextEditorTool[]>;
7181
+ /**
7182
+ * The strings in effect here: the injected label set with this instance's `labels` applied. Every part
7183
+ * of the editor reads it through this — the toolbars, the link editor and the opt-in tools all reach
7184
+ * the editor already.
7185
+ */
7186
+ resolvedLabels: _angular_core.Signal<RichTextEditorLabels>;
6095
7187
  /**
6096
7188
  * @internal Codec that (de)serializes `{{type:id}}` token chips. Installed by
6097
7189
  * `[etRichTextEditorTriggers]` or a render-only provider; `null` when the building-block
@@ -6210,7 +7302,7 @@ declare class RichTextEditorDirective implements FormValueControl<string>, FormF
6210
7302
  private reflectMarks;
6211
7303
  private runCommand;
6212
7304
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RichTextEditorDirective, never>;
6213
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RichTextEditorDirective, "[etRichTextEditor]", ["etRichTextEditor"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "hidden": { "alias": "hidden"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "tools": { "alias": "tools"; "required": false; "isSignal": true; }; "autoformat": { "alias": "autoformat"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; }, never, never, true, never>;
7305
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RichTextEditorDirective, "[etRichTextEditor]", ["etRichTextEditor"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "hidden": { "alias": "hidden"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "tools": { "alias": "tools"; "required": false; "isSignal": true; }; "autoformat": { "alias": "autoformat"; "required": false; "isSignal": true; }; "labels": { "alias": "labels"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; }, never, never, true, never>;
6214
7306
  }
6215
7307
 
6216
7308
  declare class RichTextEditorFloatingToolbarComponent {
@@ -6233,9 +7325,15 @@ declare class RichTextEditorFloatingToolbarComponent {
6233
7325
  readonly DIVIDER: "divider";
6234
7326
  };
6235
7327
  protected readonly TOOL_BUTTONS: Partial<Record<_ethlete_components.RichTextEditorTool, _ethlete_components.RichTextEditorToolButton>>;
7328
+ /** The editor's strings — the same set, since this toolbar is part of that editor. */
7329
+ protected labels: _angular_core.Signal<_ethlete_components.RichTextEditorLabels>;
6236
7330
  /** The inline marks from the editor's configured tools — headings/lists stay in the static toolbar. */
6237
7331
  protected inlineTools: _angular_core.Signal<_ethlete_components.RichTextEditorTool[]>;
6238
7332
  constructor();
7333
+ /** A tool button's accessible name, from the label set. */
7334
+ protected toolLabel(token: string, tool: {
7335
+ label: string;
7336
+ }): string;
6239
7337
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RichTextEditorFloatingToolbarComponent, never>;
6240
7338
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<RichTextEditorFloatingToolbarComponent, "et-rich-text-editor-floating-toolbar", never, { "editor": { "alias": "editor"; "required": true; "isSignal": true; }; }, {}, never, never, true, [{ directive: typeof _ethlete_core.ProvideColorDirective; inputs: {}; outputs: {}; }, { directive: typeof _ethlete_core.AutoSurfaceDirective; inputs: {}; outputs: {}; }]>;
6241
7339
  }
@@ -6249,25 +7347,27 @@ type RichTextEditorLinkEditorValue = {
6249
7347
  declare class RichTextEditorLinkEditorComponent {
6250
7348
  private ownColorProvider;
6251
7349
  private contextColorProvider;
7350
+ /** The editor's strings, handed in by `[etRichTextEditorLinkEditor]` — the popover renders detached. */
7351
+ labels: _angular_core.InputSignal<RichTextEditorLabels>;
6252
7352
  href: _angular_core.InputSignal<string>;
6253
7353
  text: _angular_core.InputSignal<string>;
6254
- newTab: _angular_core.InputSignal<boolean>;
7354
+ newTab: _angular_core.InputSignalWithTransform<boolean, unknown>;
6255
7355
  /** Whether the caret sits on an existing link (shows the Remove action + "Update"/"Add" wording). */
6256
- exists: _angular_core.InputSignal<boolean>;
7356
+ exists: _angular_core.InputSignalWithTransform<boolean, unknown>;
6257
7357
  saveLink: _angular_core.OutputEmitterRef<RichTextEditorLinkEditorValue>;
6258
7358
  removeLink: _angular_core.OutputEmitterRef<void>;
6259
7359
  dismiss: _angular_core.OutputEmitterRef<void>;
6260
7360
  protected urlValue: _angular_core.WritableSignal<string>;
6261
7361
  protected textValue: _angular_core.WritableSignal<string>;
6262
7362
  protected newTabValue: _angular_core.WritableSignal<boolean>;
6263
- protected title: _angular_core.Signal<"Edit link" | "Add link">;
7363
+ protected title: _angular_core.Signal<string>;
6264
7364
  constructor();
6265
7365
  protected save(): void;
6266
7366
  /** Applying re-focuses the editor before the browser processes the Enter keydown's default
6267
7367
  * action, which would then insert a line break into the editor — so the default is prevented. */
6268
7368
  protected saveOnEnter(event: Event): void;
6269
7369
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RichTextEditorLinkEditorComponent, never>;
6270
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<RichTextEditorLinkEditorComponent, "et-rich-text-editor-link-editor", never, { "href": { "alias": "href"; "required": false; "isSignal": true; }; "text": { "alias": "text"; "required": false; "isSignal": true; }; "newTab": { "alias": "newTab"; "required": false; "isSignal": true; }; "exists": { "alias": "exists"; "required": false; "isSignal": true; }; }, { "saveLink": "saveLink"; "removeLink": "removeLink"; "dismiss": "dismiss"; }, never, never, true, [{ directive: typeof _ethlete_core.ProvideColorDirective; inputs: {}; outputs: {}; }, { directive: typeof _ethlete_core.AutoSurfaceDirective; inputs: {}; outputs: {}; }]>;
7370
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<RichTextEditorLinkEditorComponent, "et-rich-text-editor-link-editor", never, { "labels": { "alias": "labels"; "required": true; "isSignal": true; }; "href": { "alias": "href"; "required": false; "isSignal": true; }; "text": { "alias": "text"; "required": false; "isSignal": true; }; "newTab": { "alias": "newTab"; "required": false; "isSignal": true; }; "exists": { "alias": "exists"; "required": false; "isSignal": true; }; }, { "saveLink": "saveLink"; "removeLink": "removeLink"; "dismiss": "dismiss"; }, never, never, true, [{ directive: typeof _ethlete_core.ProvideColorDirective; inputs: {}; outputs: {}; }, { directive: typeof _ethlete_core.AutoSurfaceDirective; inputs: {}; outputs: {}; }]>;
6271
7371
  }
6272
7372
 
6273
7373
  /**
@@ -6306,10 +7406,12 @@ declare class RichTextEditorTokenPaletteComponent {
6306
7406
  editor: _angular_core.InputSignal<RichTextEditorDirective>;
6307
7407
  /** The triggers whose items become chip buttons. Use the same array as the editor's triggers. */
6308
7408
  triggers: _angular_core.InputSignal<readonly RichTextEditorTrigger[]>;
6309
- /** Accessible name for the palette group. */
6310
- label: _angular_core.InputSignal<string>;
7409
+ /** Accessible name for the palette group. `null` (the default) uses the editor's `insertToken` label. */
7410
+ label: _angular_core.InputSignal<string | null>;
6311
7411
  /** Focus the editor after inserting so the user can keep typing. */
6312
- focusEditorOnInsert: _angular_core.InputSignal<boolean>;
7412
+ focusEditorOnInsert: _angular_core.InputSignalWithTransform<boolean, unknown>;
7413
+ /** The name in effect: this instance's `label`, else the editor's label set. */
7414
+ protected resolvedLabel: _angular_core.Signal<string>;
6313
7415
  private groups;
6314
7416
  /** Only groups that actually have items to offer — empty (e.g. search-only) triggers are dropped. */
6315
7417
  protected visibleGroups: _angular_core.Signal<RichTextEditorTokenPaletteGroup[]>;
@@ -6341,7 +7443,7 @@ declare class RichTextEditorTokenPopupComponent {
6341
7443
  private contextColorProvider;
6342
7444
  items: _angular_core.InputSignal<RichTextEditorTriggerItem[]>;
6343
7445
  activeIndex: _angular_core.InputSignal<number>;
6344
- loading: _angular_core.InputSignal<boolean>;
7446
+ loading: _angular_core.InputSignalWithTransform<boolean, unknown>;
6345
7447
  error: _angular_core.InputSignal<string | null>;
6346
7448
  emptyLabel: _angular_core.InputSignal<string>;
6347
7449
  listboxId: _angular_core.InputSignal<string>;
@@ -6353,7 +7455,7 @@ declare class RichTextEditorTokenPopupComponent {
6353
7455
  constructor();
6354
7456
  private resolveErrorTheme;
6355
7457
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RichTextEditorTokenPopupComponent, never>;
6356
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<RichTextEditorTokenPopupComponent, "et-rich-text-editor-token-popup", never, { "items": { "alias": "items"; "required": true; "isSignal": true; }; "activeIndex": { "alias": "activeIndex"; "required": true; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "emptyLabel": { "alias": "emptyLabel"; "required": false; "isSignal": true; }; "listboxId": { "alias": "listboxId"; "required": true; "isSignal": true; }; }, { "selectItem": "selectItem"; "activateItem": "activateItem"; }, never, never, true, [{ directive: typeof _ethlete_core.ProvideColorDirective; inputs: {}; outputs: {}; }, { directive: typeof _ethlete_core.AutoSurfaceDirective; inputs: {}; outputs: {}; }]>;
7458
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<RichTextEditorTokenPopupComponent, "et-rich-text-editor-token-popup", never, { "items": { "alias": "items"; "required": true; "isSignal": true; }; "activeIndex": { "alias": "activeIndex"; "required": true; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "emptyLabel": { "alias": "emptyLabel"; "required": true; "isSignal": true; }; "listboxId": { "alias": "listboxId"; "required": true; "isSignal": true; }; }, { "selectItem": "selectItem"; "activateItem": "activateItem"; }, never, never, true, [{ directive: typeof _ethlete_core.ProvideColorDirective; inputs: {}; outputs: {}; }, { directive: typeof _ethlete_core.AutoSurfaceDirective; inputs: {}; outputs: {}; }]>;
6357
7459
  }
6358
7460
 
6359
7461
  /**
@@ -6391,11 +7493,13 @@ declare class RichTextEditorAlignToolComponent {
6391
7493
  /** On touch, open the menu without stealing focus so the keyboard (and docked toolbar) stay put. */
6392
7494
  protected hasTouchInput: _angular_core.Signal<boolean>;
6393
7495
  editor: _angular_core.InputSignal<RichTextEditorDirective>;
6394
- protected readonly OPTIONS: {
7496
+ /** The editor's strings — the tool is part of that editor's toolbar. */
7497
+ protected labels: _angular_core.Signal<_ethlete_components.RichTextEditorLabels>;
7498
+ protected options: _angular_core.Signal<{
6395
7499
  value: TextAlign;
6396
7500
  label: string;
6397
7501
  icon: string;
6398
- }[];
7502
+ }[]>;
6399
7503
  /** Alignment of the caret's block/cell — kept live so the trigger icon and menu stay in sync. */
6400
7504
  protected current: _angular_core.WritableSignal<"left" | "right" | "center" | "justify">;
6401
7505
  protected currentIcon: _angular_core.Signal<string>;
@@ -6539,13 +7643,13 @@ declare class MenuDirective {
6539
7643
  offset: _angular_core.InputSignal<OffsetOptions | "auto" | null>;
6540
7644
  viewportPadding: _angular_core.InputSignal<Padding | null>;
6541
7645
  /** Render an arrow pointing at the trigger. Trigger-anchored root menus only — submenus and context menus never render one. */
6542
- arrow: _angular_core.InputSignal<boolean>;
7646
+ arrow: _angular_core.InputSignalWithTransform<boolean, unknown>;
6543
7647
  arrowPadding: _angular_core.InputSignal<Padding | null>;
6544
- autoFocus: _angular_core.InputSignal<boolean>;
6545
- hoverOpen: _angular_core.InputSignal<boolean>;
6546
- hoverOpenDelay: _angular_core.InputSignal<number>;
6547
- hoverCloseDelay: _angular_core.InputSignal<number>;
6548
- disabled: _angular_core.InputSignal<boolean>;
7648
+ autoFocus: _angular_core.InputSignalWithTransform<boolean, unknown>;
7649
+ hoverOpen: _angular_core.InputSignalWithTransform<boolean, unknown>;
7650
+ hoverOpenDelay: _angular_core.InputSignalWithTransform<number, unknown>;
7651
+ hoverCloseDelay: _angular_core.InputSignalWithTransform<number, unknown>;
7652
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
6549
7653
  open: _angular_core.ModelSignal<boolean>;
6550
7654
  root: MenuDirective;
6551
7655
  depth: number;
@@ -6709,10 +7813,10 @@ declare class MenuSelectionGroupDirective implements MenuSelectionGroupDirective
6709
7813
  value: _angular_core.ModelSignal<unknown>;
6710
7814
  touched: _angular_core.ModelSignal<boolean>;
6711
7815
  multipleInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
6712
- disabled: _angular_core.InputSignal<boolean>;
6713
- invalid: _angular_core.InputSignal<boolean>;
7816
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
7817
+ invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
6714
7818
  errors: _angular_core.InputSignal<readonly ValidationError.WithOptionalFieldTree[]>;
6715
- required: _angular_core.InputSignal<boolean>;
7819
+ required: _angular_core.InputSignalWithTransform<boolean, unknown>;
6716
7820
  name: _angular_core.InputSignal<string>;
6717
7821
  multiple: _angular_core.Signal<boolean>;
6718
7822
  items: _angular_core.WritableSignal<MenuSelectionGroupItem[]>;
@@ -6740,10 +7844,10 @@ declare class MenuSelectionItemDirective {
6740
7844
  checked: _angular_core.ModelSignal<boolean>;
6741
7845
  indeterminate: _angular_core.ModelSignal<boolean>;
6742
7846
  touched: _angular_core.ModelSignal<boolean>;
6743
- disabled: _angular_core.InputSignal<boolean>;
6744
- invalid: _angular_core.InputSignal<boolean>;
7847
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
7848
+ invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
6745
7849
  errors: _angular_core.InputSignal<readonly ValidationError.WithOptionalFieldTree[]>;
6746
- required: _angular_core.InputSignal<boolean>;
7850
+ required: _angular_core.InputSignalWithTransform<boolean, unknown>;
6747
7851
  name: _angular_core.InputSignal<string>;
6748
7852
  kind: _angular_core.Signal<MenuSelectionItemKind>;
6749
7853
  ariaChecked: _angular_core.Signal<boolean | "mixed">;
@@ -6863,6 +7967,8 @@ declare class RichTextEditorTableToolComponent {
6863
7967
  editor: _angular_core.InputSignal<RichTextEditorDirective>;
6864
7968
  protected menu: _angular_core.Signal<MenuDirective>;
6865
7969
  protected pickerGrid: _angular_core.Signal<ElementRef<HTMLElement> | undefined>;
7970
+ /** The editor's strings — the tool is part of that editor's toolbar. */
7971
+ protected labels: _angular_core.Signal<_ethlete_components.RichTextEditorLabels>;
6866
7972
  private ops;
6867
7973
  protected readonly pickerRows: number[];
6868
7974
  protected readonly pickerCols: number[];
@@ -7004,11 +8110,14 @@ declare class RichTextEditorComponent {
7004
8110
  readonly TABLE: "table";
7005
8111
  readonly DIVIDER: "divider";
7006
8112
  };
7007
- protected readonly HEADING_OPTIONS: readonly {
7008
- level: number | null;
8113
+ /** The strings in effect, owned by the directive so the opt-in tools read the same set. */
8114
+ protected labels: _angular_core.Signal<_ethlete_components.RichTextEditorLabels>;
8115
+ /** The block-style menu's entries, named by the label set rather than by the option table. */
8116
+ protected headingOptions: _angular_core.Signal<{
7009
8117
  label: string;
8118
+ level: number | null;
7010
8119
  icon: string;
7011
- }[];
8120
+ }[]>;
7012
8121
  private registeredTools;
7013
8122
  /** Every renderable tool by token: the static base buttons plus any opt-in tools provided via DI. */
7014
8123
  protected toolDefs: _angular_core.Signal<Map<string, RichTextEditorToolDefinition>>;
@@ -7025,6 +8134,8 @@ declare class RichTextEditorComponent {
7025
8134
  /** The toolbar button currently holding the single roving tab stop (ARIA toolbar pattern). */
7026
8135
  private toolbarTabStop;
7027
8136
  constructor();
8137
+ /** A tool button's accessible name, from the label set where this library owns the tool. */
8138
+ protected toolLabel(tool: RichTextEditorToolDefinition): string;
7028
8139
  protected syncValueFromDom(): void;
7029
8140
  /**
7030
8141
  * The toolbar is a single tab stop (ARIA toolbar pattern): Tab enters on one button, the arrow
@@ -7056,7 +8167,7 @@ declare class RichTextEditorComponent {
7056
8167
  * editor opened from the docked toolbar (which takes focus into an overlay) keeps the bar up. */
7057
8168
  private trackEditingActive;
7058
8169
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RichTextEditorComponent, never>;
7059
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<RichTextEditorComponent, "et-rich-text-editor", never, {}, {}, never, never, true, [{ directive: typeof RichTextEditorDirective; inputs: { "value": "value"; "disabled": "disabled"; "readonly": "readonly"; "hidden": "hidden"; "invalid": "invalid"; "errors": "errors"; "required": "required"; "name": "name"; "placeholder": "placeholder"; "tools": "tools"; "autoformat": "autoformat"; }; outputs: { "valueChange": "valueChange"; "touchedChange": "touchedChange"; }; }, { directive: typeof RichTextEditorFloatingToolbarDirective; inputs: {}; outputs: {}; }, { directive: typeof RichTextEditorLinkEditorDirective; inputs: {}; outputs: {}; }]>;
8170
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<RichTextEditorComponent, "et-rich-text-editor", never, {}, {}, never, never, true, [{ directive: typeof RichTextEditorDirective; inputs: { "value": "value"; "disabled": "disabled"; "readonly": "readonly"; "hidden": "hidden"; "invalid": "invalid"; "errors": "errors"; "required": "required"; "name": "name"; "placeholder": "placeholder"; "tools": "tools"; "autoformat": "autoformat"; "labels": "labels"; }; outputs: { "valueChange": "valueChange"; "touchedChange": "touchedChange"; }; }, { directive: typeof RichTextEditorFloatingToolbarDirective; inputs: {}; outputs: {}; }, { directive: typeof RichTextEditorLinkEditorDirective; inputs: {}; outputs: {}; }]>;
7060
8171
  }
7061
8172
 
7062
8173
  declare const RICH_TEXT_EDITOR_IMPORTS: readonly [typeof RichTextEditorComponent, typeof RichTextEditorDirective];
@@ -7064,7 +8175,7 @@ declare const RICH_TEXT_EDITOR_IMPORTS: readonly [typeof RichTextEditorComponent
7064
8175
  declare class MultiLanguageRichTextEditorComponent {
7065
8176
  protected dir: MultiLanguageRichTextEditorDirective;
7066
8177
  placeholder: _angular_core.InputSignal<string>;
7067
- autoformat: _angular_core.InputSignal<boolean>;
8178
+ autoformat: _angular_core.InputSignalWithTransform<boolean, unknown>;
7068
8179
  /** Formatting tools for the embedded editor (the language switcher is prepended automatically).
7069
8180
  * `null` uses the default toolbar. */
7070
8181
  tools: _angular_core.InputSignal<readonly RichTextEditorTool[] | null>;
@@ -7081,6 +8192,8 @@ declare class MultiLanguageRichTextEditorLanguageToolComponent {
7081
8192
  /** On touch, open the menu without stealing focus so the keyboard (and docked toolbar) stay put. */
7082
8193
  protected hasTouchInput: _angular_core.Signal<boolean>;
7083
8194
  editor: _angular_core.InputSignal<RichTextEditorDirective>;
8195
+ /** The editor's strings — the switcher is part of that editor's toolbar. */
8196
+ protected labels: _angular_core.Signal<_ethlete_components.RichTextEditorLabels>;
7084
8197
  protected languages: _angular_core.Signal<readonly _ethlete_components.MultiLanguageRichTextEditorLanguage[]>;
7085
8198
  protected activeCode: _angular_core.Signal<string>;
7086
8199
  protected activeLabel: _angular_core.Signal<string>;
@@ -7111,18 +8224,18 @@ declare class OtpInputDirective implements FormValueControl<string>, FormFieldCo
7111
8224
  private destroyRef;
7112
8225
  value: _angular_core.ModelSignal<string>;
7113
8226
  touched: _angular_core.ModelSignal<boolean>;
7114
- disabled: _angular_core.InputSignal<boolean>;
7115
- readonly: _angular_core.InputSignal<boolean>;
7116
- invalid: _angular_core.InputSignal<boolean>;
8227
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
8228
+ readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
8229
+ invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
7117
8230
  errors: _angular_core.InputSignal<readonly ValidationError.WithOptionalFieldTree[]>;
7118
- required: _angular_core.InputSignal<boolean>;
8231
+ required: _angular_core.InputSignalWithTransform<boolean, unknown>;
7119
8232
  name: _angular_core.InputSignal<string>;
7120
8233
  /** Number of characters/segments. */
7121
- length: _angular_core.InputSignal<number>;
8234
+ length: _angular_core.InputSignalWithTransform<number, unknown>;
7122
8235
  /** Which characters are accepted — anything else is stripped (also from pastes). */
7123
8236
  charset: _angular_core.InputSignal<OtpInputCharset>;
7124
8237
  /** Renders dots instead of the typed characters (PIN entry). */
7125
- masked: _angular_core.InputSignal<boolean>;
8238
+ masked: _angular_core.InputSignalWithTransform<boolean, unknown>;
7126
8239
  /** Emits once each time the value reaches the full length. */
7127
8240
  complete: _angular_core.OutputEmitterRef<string>;
7128
8241
  shouldDisplayError: _angular_core.Signal<boolean>;
@@ -7251,6 +8364,7 @@ declare class PhoneInputFlagDirective {
7251
8364
  }
7252
8365
 
7253
8366
  declare class PhoneInputDirective implements FormValueControl<string>, FormFieldControl {
8367
+ private formFieldLabels;
7254
8368
  private formField;
7255
8369
  private destroyRef;
7256
8370
  /** Normalized `+<dialCode><national digits>` — empty string while nothing is entered. */
@@ -7258,18 +8372,20 @@ declare class PhoneInputDirective implements FormValueControl<string>, FormField
7258
8372
  /** View state for a field whose source values disagree. The raw form value stays untouched. */
7259
8373
  mixed: _angular_core.ModelSignal<boolean>;
7260
8374
  touched: _angular_core.ModelSignal<boolean>;
7261
- disabled: _angular_core.InputSignal<boolean>;
7262
- readonly: _angular_core.InputSignal<boolean>;
7263
- invalid: _angular_core.InputSignal<boolean>;
8375
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
8376
+ readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
8377
+ invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
7264
8378
  errors: _angular_core.InputSignal<readonly ValidationError.WithOptionalFieldTree[]>;
7265
- required: _angular_core.InputSignal<boolean>;
8379
+ required: _angular_core.InputSignalWithTransform<boolean, unknown>;
7266
8380
  name: _angular_core.InputSignal<string>;
7267
8381
  placeholder: _angular_core.InputSignal<string>;
7268
8382
  /** Field placeholder shown while `mixed` is set. */
7269
- mixedLabel: _angular_core.InputSignal<string>;
8383
+ mixedLabel: _angular_core.InputSignal<string | null>;
7270
8384
  defaultCountry: _angular_core.InputSignal<string>;
7271
8385
  /** ISO codes listed on top of the country dropdown. */
7272
8386
  preferredCountries: _angular_core.InputSignal<string[]>;
8387
+ /** The string in effect: this instance's `mixedLabel`, else `FORM_FIELD_LABELS`. */
8388
+ resolvedMixedLabel: _angular_core.Signal<string>;
7273
8389
  shouldDisplayError: _angular_core.Signal<boolean>;
7274
8390
  hasValue: _angular_core.Signal<boolean>;
7275
8391
  /** The placeholder the tel field currently shows — `mixedLabel` while mixed. */
@@ -7342,14 +8458,46 @@ declare const PHONE_INPUT_ERROR_CODES: {
7342
8458
  readonly FLAG_TEMPLATE_OUTSIDE_PHONE_INPUT: 2801;
7343
8459
  };
7344
8460
 
8461
+ /**
8462
+ * The strings the phone input renders itself. The country *names* are not here — they come from
8463
+ * `Intl.DisplayNames` for the current locale, so they are already translated.
8464
+ */
8465
+ type PhoneInputLabels = {
8466
+ /** Accessible label for the country-code selector. */
8467
+ selectCountry: string;
8468
+ /** Placeholder for the country list's search field. */
8469
+ searchCountries: string;
8470
+ /** Shown when a country search matched nothing. */
8471
+ noCountries: string;
8472
+ };
8473
+ /** The built-in English labels. */
8474
+ declare const DEFAULT_PHONE_INPUT_LABELS: PhoneInputLabels;
8475
+ /**
8476
+ * Localize the phone input's strings for everything below this injector, and read the set in effect here as a
8477
+ * signal. Partial — whatever you leave out keeps its {@link DEFAULT_PHONE_INPUT_LABELS} value. See {@link createLabels}
8478
+ * for the shape, which every domain in this library shares.
8479
+ *
8480
+ * @example
8481
+ * providePhoneInputLabels({ selectCountry: 'Land auswählen' });
8482
+ */
8483
+ declare const providePhoneInputLabels: (labels: _ethlete_core.LabelsSource<PhoneInputLabels>) => _angular_core.Provider;
8484
+ declare const injectPhoneInputLabels: () => _angular_core.Signal<PhoneInputLabels>;
8485
+ declare const PHONE_INPUT_LABELS: _angular_core.InjectionToken<_ethlete_core.LabelsSource<PhoneInputLabels>>;
8486
+
7345
8487
  declare class PhoneInputComponent {
8488
+ protected phoneInputLabels: _angular_core.Signal<_ethlete_components.PhoneInputLabels>;
8489
+ private formFieldLabels;
7346
8490
  protected phone: PhoneInputDirective;
7347
8491
  private locale;
7348
8492
  /** Accessible name of the country-picker trigger — its only visible content is the flag + dial code. */
7349
- countryLabel: _angular_core.InputSignal<string>;
8493
+ countryLabel: _angular_core.InputSignal<string | null>;
7350
8494
  /** Shows a clear (×) control while a number is set and the field is in use. */
7351
- clearable: _angular_core.InputSignal<boolean>;
7352
- clearLabel: _angular_core.InputSignal<string>;
8495
+ clearable: _angular_core.InputSignalWithTransform<boolean, unknown>;
8496
+ clearLabel: _angular_core.InputSignal<string | null>;
8497
+ /** The string in effect: this instance's `countryLabel`, else the domain's label set. */
8498
+ protected resolvedCountryLabel: _angular_core.Signal<string>;
8499
+ /** The string in effect: this instance's `clearLabel`, else `FORM_FIELD_LABELS`. */
8500
+ protected resolvedClearLabel: _angular_core.Signal<string>;
7353
8501
  protected showClear: _angular_core.Signal<boolean>;
7354
8502
  protected countries: _angular_core.Signal<{
7355
8503
  name: string;
@@ -7369,6 +8517,7 @@ declare const PHONE_INPUT_IMPORTS: readonly [typeof PhoneInputComponent, typeof
7369
8517
 
7370
8518
  type RatingIconState = 'full' | 'half' | 'empty';
7371
8519
  declare class RatingDirective implements FormValueControl<number | null>, FormFieldControl {
8520
+ private formFieldLabels;
7372
8521
  private formField;
7373
8522
  private destroyRef;
7374
8523
  private elementRef;
@@ -7376,20 +8525,22 @@ declare class RatingDirective implements FormValueControl<number | null>, FormFi
7376
8525
  /** View state for a field whose source values disagree. The raw form value stays untouched. */
7377
8526
  mixed: _angular_core.ModelSignal<boolean>;
7378
8527
  /** `aria-valuetext` announced while `mixed` is set. */
7379
- mixedLabel: _angular_core.InputSignal<string>;
8528
+ mixedLabel: _angular_core.InputSignal<string | null>;
7380
8529
  touched: _angular_core.ModelSignal<boolean>;
7381
- disabled: _angular_core.InputSignal<boolean>;
7382
- readonly: _angular_core.InputSignal<boolean>;
7383
- invalid: _angular_core.InputSignal<boolean>;
8530
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
8531
+ readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
8532
+ invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
7384
8533
  errors: _angular_core.InputSignal<readonly ValidationError.WithOptionalFieldTree[]>;
7385
- required: _angular_core.InputSignal<boolean>;
8534
+ required: _angular_core.InputSignalWithTransform<boolean, unknown>;
7386
8535
  name: _angular_core.InputSignal<string>;
7387
8536
  /**
7388
8537
  * Typed `number | undefined` because signal forms reserves `max` on value controls —
7389
8538
  * a schema `max(...)` validator binds straight into this input.
7390
8539
  */
7391
8540
  max: _angular_core.InputSignal<number | undefined>;
7392
- allowHalf: _angular_core.InputSignal<boolean>;
8541
+ allowHalf: _angular_core.InputSignalWithTransform<boolean, unknown>;
8542
+ /** The string in effect: this instance's `mixedLabel`, else `FORM_FIELD_LABELS`. */
8543
+ resolvedMixedLabel: _angular_core.Signal<string>;
7393
8544
  effectiveMax: _angular_core.Signal<number>;
7394
8545
  step: _angular_core.Signal<1 | 0.5>;
7395
8546
  /** The value previewed under the pointer, set by the rendered icons. */
@@ -7732,6 +8883,7 @@ type SelectAsyncOptions = {
7732
8883
  hasMore: Signal<boolean>;
7733
8884
  };
7734
8885
  declare class SelectDirective implements FormValueControl<unknown>, FormFieldControl {
8886
+ private formFieldLabels;
7735
8887
  private formField;
7736
8888
  private destroyRef;
7737
8889
  private document;
@@ -7742,14 +8894,14 @@ declare class SelectDirective implements FormValueControl<unknown>, FormFieldCon
7742
8894
  open: _angular_core.ModelSignal<boolean>;
7743
8895
  multiple: _angular_core.InputSignalWithTransform<boolean, unknown>;
7744
8896
  disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
7745
- readonly: _angular_core.InputSignal<boolean>;
7746
- invalid: _angular_core.InputSignal<boolean>;
8897
+ readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
8898
+ invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
7747
8899
  errors: _angular_core.InputSignal<readonly ValidationError.WithOptionalFieldTree[]>;
7748
- required: _angular_core.InputSignal<boolean>;
8900
+ required: _angular_core.InputSignalWithTransform<boolean, unknown>;
7749
8901
  name: _angular_core.InputSignal<string>;
7750
8902
  placeholder: _angular_core.InputSignal<string>;
7751
8903
  /** Trigger text shown while `mixed` is set. */
7752
- mixedLabel: _angular_core.InputSignal<string>;
8904
+ mixedLabel: _angular_core.InputSignal<string | null>;
7753
8905
  /**
7754
8906
  * Data-driven options: the select owns the option rows instead of the consumer projecting
7755
8907
  * `et-select-option`s, and windows their rendering (virtualization) — only rows near the
@@ -7761,7 +8913,7 @@ declare class SelectDirective implements FormValueControl<unknown>, FormFieldCon
7761
8913
  options: _angular_core.InputSignal<readonly SelectOptionData[] | null>;
7762
8914
  filterModeInput: _angular_core.InputSignal<SelectFilterMode>;
7763
8915
  /** Enter with a search query that matches no option commits the raw query string as the value. */
7764
- allowCustomValues: _angular_core.InputSignal<boolean>;
8916
+ allowCustomValues: _angular_core.InputSignalWithTransform<boolean, unknown>;
7765
8917
  /**
7766
8918
  * Single characters that commit the pending search query as a custom value the moment they
7767
8919
  * are typed (e.g. `[',']`), and split pasted text in multi mode. Only with `allowCustomValues`.
@@ -7773,17 +8925,17 @@ declare class SelectDirective implements FormValueControl<unknown>, FormFieldCon
7773
8925
  * Commits a pending search query as a custom value when the panel closes (Tab, outside
7774
8926
  * click) instead of discarding it. An Escape close never commits — it clears the query first.
7775
8927
  */
7776
- commitCustomValueOnClose: _angular_core.InputSignal<boolean>;
8928
+ commitCustomValueOnClose: _angular_core.InputSignalWithTransform<boolean, unknown>;
7777
8929
  /** Maximum number of selected values (multi select) — further adds are ignored. */
7778
8930
  maxSelection: _angular_core.InputSignal<number | undefined>;
7779
8931
  /** Renders an "Add new" row in `et-select`'s panel — clicking it emits `addNew`. */
7780
8932
  allowAddNew: _angular_core.InputSignalWithTransform<boolean, unknown>;
7781
8933
  /** Async option state — rendered by `et-select` as a loading row inside the panel. */
7782
- loadingInput: _angular_core.InputSignal<boolean>;
8934
+ loadingInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
7783
8935
  /** Async option state — rendered by `et-select` as an error row inside the panel. */
7784
8936
  errorInput: _angular_core.InputSignal<string | null>;
7785
8937
  /** Async option state — `et-select` renders a load-more control emitting `loadMore`. */
7786
- hasMoreItemsInput: _angular_core.InputSignal<boolean>;
8938
+ hasMoreItemsInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
7787
8939
  /** Whether the panel mirrors the anchor's width. Off for compact triggers (e.g. a country picker). */
7788
8940
  mirrorPanelWidth: _angular_core.InputSignalWithTransform<boolean, unknown>;
7789
8941
  /**
@@ -7810,6 +8962,8 @@ declare class SelectDirective implements FormValueControl<unknown>, FormFieldCon
7810
8962
  * value selection.
7811
8963
  */
7812
8964
  pickOption: _angular_core.OutputEmitterRef<unknown>;
8965
+ /** The string in effect: this instance's `mixedLabel`, else `FORM_FIELD_LABELS`. */
8966
+ resolvedMixedLabel: Signal<string>;
7813
8967
  /**
7814
8968
  * An async option source pushed in by `[etSelectOptions]` (from `selectOptionsFromQuery` /
7815
8969
  * `selectOptionsFromV2Query`). While set it overrides the `loading`/`error`/`hasMoreItems`
@@ -8245,6 +9399,36 @@ declare const SELECT_ERROR_CODES: {
8245
9399
  readonly OPTIONS_OUTSIDE_SELECT: 1013;
8246
9400
  };
8247
9401
 
9402
+ /**
9403
+ * The strings the select's panel renders itself. The options are yours; these are the panel's own
9404
+ * affordances — paging through an async option list, and the create-a-value flow (`customValues`).
9405
+ */
9406
+ type SelectLabels = {
9407
+ /** Shown while the option list is being fetched. */
9408
+ loading: string;
9409
+ /** Shown when the option list came back empty. */
9410
+ empty: string;
9411
+ /** The "fetch the next page of options" control in an async panel. */
9412
+ loadMore: string;
9413
+ /** The panel's entry that starts creating a value that isn't in the list. */
9414
+ addNew: string;
9415
+ /** The confirm action of the create-a-value flow. */
9416
+ create: string;
9417
+ };
9418
+ /** The built-in English labels. */
9419
+ declare const DEFAULT_SELECT_LABELS: SelectLabels;
9420
+ /**
9421
+ * Localize the select's strings for everything below this injector, and read the set in effect here as a
9422
+ * signal. Partial — whatever you leave out keeps its {@link DEFAULT_SELECT_LABELS} value. See {@link createLabels}
9423
+ * for the shape, which every domain in this library shares.
9424
+ *
9425
+ * @example
9426
+ * provideSelectLabels({ loadMore: 'Mehr laden', create: 'Erstellen' });
9427
+ */
9428
+ declare const provideSelectLabels: (labels: _ethlete_core.LabelsSource<SelectLabels>) => _angular_core.Provider;
9429
+ declare const injectSelectLabels: () => _angular_core.Signal<SelectLabels>;
9430
+ declare const SELECT_LABELS: _angular_core.InjectionToken<_ethlete_core.LabelsSource<SelectLabels>>;
9431
+
8248
9432
  declare class SelectOptionGroupComponent {
8249
9433
  protected group: SelectOptionGroupDirective;
8250
9434
  protected readonly labelId: string;
@@ -8359,15 +9543,25 @@ declare class SelectVirtualOptionComponent {
8359
9543
  }
8360
9544
 
8361
9545
  declare class SelectComponent {
9546
+ protected selectLabels: _angular_core.Signal<_ethlete_components.SelectLabels>;
9547
+ private formFieldLabels;
8362
9548
  protected select: SelectDirective;
8363
9549
  protected errorColorTheme: _ethlete_core.ColorTheme;
8364
- loadMoreLabel: _angular_core.InputSignal<string>;
8365
- addNewLabel: _angular_core.InputSignal<string>;
9550
+ loadMoreLabel: _angular_core.InputSignal<string | null>;
9551
+ addNewLabel: _angular_core.InputSignal<string | null>;
8366
9552
  /** Leading text of the "Create …" row rendered for `customValueCandidate`. */
8367
- createLabel: _angular_core.InputSignal<string>;
9553
+ createLabel: _angular_core.InputSignal<string | null>;
8368
9554
  /** Shows a clear (×) control while a value is selected. */
8369
9555
  clearable: _angular_core.InputSignalWithTransform<boolean, unknown>;
8370
- clearLabel: _angular_core.InputSignal<string>;
9556
+ clearLabel: _angular_core.InputSignal<string | null>;
9557
+ /** The string in effect: this instance's `loadMoreLabel`, else the domain's label set. */
9558
+ protected resolvedLoadMoreLabel: _angular_core.Signal<string>;
9559
+ /** The string in effect: this instance's `addNewLabel`, else the domain's label set. */
9560
+ protected resolvedAddNewLabel: _angular_core.Signal<string>;
9561
+ /** The string in effect: this instance's `createLabel`, else the domain's label set. */
9562
+ protected resolvedCreateLabel: _angular_core.Signal<string>;
9563
+ /** The string in effect: this instance's `clearLabel`, else `FORM_FIELD_LABELS`. */
9564
+ protected resolvedClearLabel: _angular_core.Signal<string>;
8371
9565
  protected mixedLabelId: string;
8372
9566
  protected showClear: _angular_core.Signal<boolean>;
8373
9567
  hasSearch: _angular_core.Signal<boolean>;
@@ -8417,12 +9611,12 @@ declare class SelectionListDirective implements SelectionListDirectiveBase, Form
8417
9611
  mixed: _angular_core.ModelSignal<boolean>;
8418
9612
  touched: _angular_core.ModelSignal<boolean>;
8419
9613
  multipleInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
8420
- disabled: _angular_core.InputSignal<boolean>;
9614
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
8421
9615
  /** View-only: options keep their normal look and focusability but cannot be (de)selected. */
8422
- readonly: _angular_core.InputSignal<boolean>;
8423
- invalid: _angular_core.InputSignal<boolean>;
9616
+ readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
9617
+ invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
8424
9618
  errors: _angular_core.InputSignal<readonly ValidationError.WithOptionalFieldTree[]>;
8425
- required: _angular_core.InputSignal<boolean>;
9619
+ required: _angular_core.InputSignalWithTransform<boolean, unknown>;
8426
9620
  name: _angular_core.InputSignal<string>;
8427
9621
  multiple: _angular_core.Signal<boolean>;
8428
9622
  selection: SelectionState<unknown, SelectionListItem>;
@@ -8503,13 +9697,25 @@ declare class SelectionOptionDirective {
8503
9697
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<SelectionOptionDirective, "[etSelectionOption]", never, { "value": { "alias": "value"; "required": true; "isSignal": true; }; "checked": { "alias": "checked"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "checked": "checkedChange"; }, never, never, true, never>;
8504
9698
  }
8505
9699
 
9700
+ /** How a checkbox option presents itself. See {@link CheckboxOptionComponent.variant}. */
9701
+ declare const CHECKBOX_OPTION_VARIANTS: {
9702
+ readonly PLAIN: "plain";
9703
+ readonly CARD: "card";
9704
+ };
9705
+ type CheckboxOptionVariant = (typeof CHECKBOX_OPTION_VARIANTS)[keyof typeof CHECKBOX_OPTION_VARIANTS];
8506
9706
  declare class CheckboxOptionComponent {
8507
9707
  optionDirective: SelectionOptionDirective;
9708
+ /**
9709
+ * `'card'` turns the option into a full-width clickable panel with the label leading and the control trailing —
9710
+ * for a small set of consequential choices where each deserves room for a description. `'plain'` is the ordinary
9711
+ * control-then-label row. @default 'plain'
9712
+ */
9713
+ variant: _angular_core.InputSignal<CheckboxOptionVariant>;
8508
9714
  canAnimate: {
8509
9715
  state: _angular_core.Signal<boolean>;
8510
9716
  };
8511
9717
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<CheckboxOptionComponent, never>;
8512
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<CheckboxOptionComponent, "et-checkbox-option", never, {}, {}, never, ["*", "et-description"], true, [{ directive: typeof SelectionOptionDirective; inputs: { "value": "value"; "checked": "checked"; "disabled": "disabled"; }; outputs: { "checkedChange": "checkedChange"; }; }, { directive: typeof _ethlete_core.ColorInteractiveDirective; inputs: {}; outputs: {}; }]>;
9718
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CheckboxOptionComponent, "et-checkbox-option", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; }, {}, never, ["*", "et-description"], true, [{ directive: typeof SelectionOptionDirective; inputs: { "value": "value"; "checked": "checked"; "disabled": "disabled"; }; outputs: { "checkedChange": "checkedChange"; }; }, { directive: typeof _ethlete_core.ColorInteractiveDirective; inputs: {}; outputs: {}; }]>;
8513
9719
  }
8514
9720
 
8515
9721
  declare class RadioGroupComponent {
@@ -8543,15 +9749,33 @@ declare class RadioGroupComponent {
8543
9749
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<RadioGroupComponent, "et-radio-group", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; }, {}, never, ["*", "et-hint"], true, [{ directive: typeof FormFieldDirective; inputs: {}; outputs: {}; }, { directive: typeof SelectionListDirective; inputs: { "value": "value"; "mixed": "mixed"; "touched": "touched"; "disabled": "disabled"; "readonly": "readonly"; "invalid": "invalid"; "errors": "errors"; "required": "required"; "name": "name"; }; outputs: { "valueChange": "valueChange"; "mixedChange": "mixedChange"; "touchedChange": "touchedChange"; }; }, { directive: typeof _ethlete_core.ProvideColorDirective; inputs: { "etProvideColor": "color"; }; outputs: {}; }]>;
8544
9750
  }
8545
9751
 
9752
+ /** How a radio presents itself. See {@link RadioComponent.variant}. */
9753
+ declare const RADIO_VARIANTS: {
9754
+ readonly PLAIN: "plain";
9755
+ readonly CARD: "card";
9756
+ };
9757
+ type RadioVariant = (typeof RADIO_VARIANTS)[keyof typeof RADIO_VARIANTS];
8546
9758
  declare class RadioComponent {
8547
9759
  optionDirective: SelectionOptionDirective;
9760
+ /**
9761
+ * `'card'` turns the option into a full-width clickable panel with the label leading and the control trailing —
9762
+ * for a small set of consequential choices (a plan, a shipping speed) where each deserves room for a
9763
+ * description. `'plain'` is the ordinary control-then-label row. @default 'plain'
9764
+ */
9765
+ variant: _angular_core.InputSignal<RadioVariant>;
8548
9766
  canAnimate: {
8549
9767
  state: _angular_core.Signal<boolean>;
8550
9768
  };
8551
9769
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RadioComponent, never>;
8552
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<RadioComponent, "et-radio", never, {}, {}, never, ["*", "et-description"], true, [{ directive: typeof SelectionOptionDirective; inputs: { "value": "value"; "checked": "checked"; "disabled": "disabled"; }; outputs: { "checkedChange": "checkedChange"; }; }, { directive: typeof _ethlete_core.ColorInteractiveDirective; inputs: {}; outputs: {}; }]>;
9770
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<RadioComponent, "et-radio", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; }, {}, never, ["*", "et-description"], true, [{ directive: typeof SelectionOptionDirective; inputs: { "value": "value"; "checked": "checked"; "disabled": "disabled"; }; outputs: { "checkedChange": "checkedChange"; }; }, { directive: typeof _ethlete_core.ColorInteractiveDirective; inputs: {}; outputs: {}; }]>;
8553
9771
  }
8554
9772
 
9773
+ /** How a segmented button group presents its selection. See {@link SegmentedButtonGroupComponent.variant}. */
9774
+ declare const SEGMENTED_BUTTON_GROUP_VARIANTS: {
9775
+ readonly PILL: "pill";
9776
+ readonly TABS: "tabs";
9777
+ };
9778
+ type SegmentedButtonGroupVariant = (typeof SEGMENTED_BUTTON_GROUP_VARIANTS)[keyof typeof SEGMENTED_BUTTON_GROUP_VARIANTS];
8555
9779
  declare class SegmentedButtonGroupComponent {
8556
9780
  support: {
8557
9781
  errorColorTheme: _ethlete_core.ColorTheme;
@@ -8571,6 +9795,15 @@ declare class SegmentedButtonGroupComponent {
8571
9795
  supportHeight: _angular_core.Signal<number>;
8572
9796
  };
8573
9797
  size: _angular_core.InputSignal<FormFieldSize>;
9798
+ /**
9799
+ * How the selection is drawn. `'pill'` fills the selected segment; `'tabs'` underlines it instead, for a group
9800
+ * that reads as a set of views rather than a set of values.
9801
+ *
9802
+ * It is still a **selection control**, not navigation — it binds to a form field and announces itself as a radio
9803
+ * group. If the segments correspond to routes, or to panels of content that should be linkable, reach for
9804
+ * [tabs](/components/tabs) instead; this variant is for a filter that happens to look like tabs. @default 'pill'
9805
+ */
9806
+ variant: _angular_core.InputSignal<SegmentedButtonGroupVariant>;
8574
9807
  private errorContentRef;
8575
9808
  private hintContentRef;
8576
9809
  private errorAnimatableRef;
@@ -8582,7 +9815,7 @@ declare class SegmentedButtonGroupComponent {
8582
9815
  };
8583
9816
  constructor();
8584
9817
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SegmentedButtonGroupComponent, never>;
8585
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SegmentedButtonGroupComponent, "et-segmented-button-group", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; }, {}, never, ["et-label", ".et-segmented-button-group-label", "*", "et-hint"], true, [{ directive: typeof FormFieldDirective; inputs: {}; outputs: {}; }, { directive: typeof SelectionListDirective; inputs: { "value": "value"; "mixed": "mixed"; "touched": "touched"; "disabled": "disabled"; "readonly": "readonly"; "invalid": "invalid"; "errors": "errors"; "required": "required"; "name": "name"; }; outputs: { "valueChange": "valueChange"; "mixedChange": "mixedChange"; "touchedChange": "touchedChange"; }; }, { directive: typeof _ethlete_core.ProvideColorDirective; inputs: { "etProvideColor": "color"; }; outputs: {}; }]>;
9818
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SegmentedButtonGroupComponent, "et-segmented-button-group", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; }, {}, never, ["et-label", ".et-segmented-button-group-label", "*", "et-hint"], true, [{ directive: typeof FormFieldDirective; inputs: {}; outputs: {}; }, { directive: typeof SelectionListDirective; inputs: { "value": "value"; "mixed": "mixed"; "touched": "touched"; "disabled": "disabled"; "readonly": "readonly"; "invalid": "invalid"; "errors": "errors"; "required": "required"; "name": "name"; }; outputs: { "valueChange": "valueChange"; "mixedChange": "mixedChange"; "touchedChange": "touchedChange"; }; }, { directive: typeof _ethlete_core.ProvideColorDirective; inputs: { "etProvideColor": "color"; }; outputs: {}; }]>;
8586
9819
  }
8587
9820
 
8588
9821
  declare class SegmentedButtonComponent {
@@ -8622,8 +9855,8 @@ type SliderHostBase = {
8622
9855
  step: Signal<number>;
8623
9856
  /** Bulk-edit view state — while set, thumbs park at the track start and hide their value from ARIA. */
8624
9857
  mixed: Signal<boolean>;
8625
- /** `aria-valuetext` the thumbs announce while `mixed` is set. */
8626
- mixedLabel: Signal<string>;
9858
+ /** `aria-valuetext` the thumbs announce while `mixed` is set, after `SLIDER_LABELS` is applied. */
9859
+ resolvedMixedLabel: Signal<string>;
8627
9860
  disabled: Signal<boolean>;
8628
9861
  readonly: Signal<boolean>;
8629
9862
  interactive: Signal<boolean>;
@@ -8654,25 +9887,28 @@ declare const SLIDER_TOKEN: InjectionToken<SliderHostBase>;
8654
9887
 
8655
9888
  type RangeSliderValue = [number, number];
8656
9889
  declare class RangeSliderDirective implements FormValueControl<RangeSliderValue>, FormFieldControl, SliderHostBase {
9890
+ private formFieldLabels;
8657
9891
  private formField;
8658
9892
  private destroyRef;
8659
9893
  value: _angular_core.ModelSignal<RangeSliderValue>;
8660
9894
  /** View state for a field whose source values disagree. The raw form value stays untouched. */
8661
9895
  mixed: _angular_core.ModelSignal<boolean>;
8662
9896
  /** `aria-valuetext` both thumbs announce while `mixed` is set. */
8663
- mixedLabel: _angular_core.InputSignal<string>;
9897
+ mixedLabel: _angular_core.InputSignal<string | null>;
8664
9898
  touched: _angular_core.ModelSignal<boolean>;
8665
- disabled: _angular_core.InputSignal<boolean>;
8666
- readonly: _angular_core.InputSignal<boolean>;
8667
- invalid: _angular_core.InputSignal<boolean>;
9899
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
9900
+ readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
9901
+ invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
8668
9902
  errors: _angular_core.InputSignal<readonly ValidationError.WithOptionalFieldTree[]>;
8669
- required: _angular_core.InputSignal<boolean>;
9903
+ required: _angular_core.InputSignalWithTransform<boolean, unknown>;
8670
9904
  name: _angular_core.InputSignal<string>;
8671
- minValue: _angular_core.InputSignal<number>;
8672
- maxValue: _angular_core.InputSignal<number>;
8673
- step: _angular_core.InputSignal<number>;
9905
+ minValue: _angular_core.InputSignalWithTransform<number, unknown>;
9906
+ maxValue: _angular_core.InputSignalWithTransform<number, unknown>;
9907
+ step: _angular_core.InputSignalWithTransform<number, unknown>;
8674
9908
  /** Minimum gap kept between the two thumbs — should be a multiple of `step`. */
8675
- minDistance: _angular_core.InputSignal<number>;
9909
+ minDistance: _angular_core.InputSignalWithTransform<number, unknown>;
9910
+ /** The string in effect: this instance's `mixedLabel`, else `FORM_FIELD_LABELS`. */
9911
+ resolvedMixedLabel: _angular_core.Signal<string>;
8676
9912
  effectiveMin: _angular_core.Signal<number>;
8677
9913
  effectiveMax: _angular_core.Signal<number>;
8678
9914
  interactive: _angular_core.Signal<boolean>;
@@ -8758,23 +9994,26 @@ declare class SliderTrackDirective {
8758
9994
  }
8759
9995
 
8760
9996
  declare class SliderDirective implements FormValueControl<number>, FormFieldControl, SliderHostBase {
9997
+ private formFieldLabels;
8761
9998
  private formField;
8762
9999
  private destroyRef;
8763
10000
  value: _angular_core.ModelSignal<number>;
8764
10001
  /** View state for a field whose source values disagree. The raw form value stays untouched. */
8765
10002
  mixed: _angular_core.ModelSignal<boolean>;
8766
10003
  /** `aria-valuetext` the thumb announces while `mixed` is set. */
8767
- mixedLabel: _angular_core.InputSignal<string>;
10004
+ mixedLabel: _angular_core.InputSignal<string | null>;
8768
10005
  touched: _angular_core.ModelSignal<boolean>;
8769
- disabled: _angular_core.InputSignal<boolean>;
8770
- readonly: _angular_core.InputSignal<boolean>;
8771
- invalid: _angular_core.InputSignal<boolean>;
10006
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
10007
+ readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
10008
+ invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
8772
10009
  errors: _angular_core.InputSignal<readonly ValidationError.WithOptionalFieldTree[]>;
8773
- required: _angular_core.InputSignal<boolean>;
10010
+ required: _angular_core.InputSignalWithTransform<boolean, unknown>;
8774
10011
  name: _angular_core.InputSignal<string>;
8775
10012
  min: _angular_core.InputSignal<number | undefined>;
8776
10013
  max: _angular_core.InputSignal<number | undefined>;
8777
- step: _angular_core.InputSignal<number>;
10014
+ step: _angular_core.InputSignalWithTransform<number, unknown>;
10015
+ /** The string in effect: this instance's `mixedLabel`, else `FORM_FIELD_LABELS`. */
10016
+ resolvedMixedLabel: _angular_core.Signal<string>;
8778
10017
  effectiveMin: _angular_core.Signal<number>;
8779
10018
  effectiveMax: _angular_core.Signal<number>;
8780
10019
  interactive: _angular_core.Signal<boolean>;
@@ -8808,6 +10047,7 @@ declare class SliderDirective implements FormValueControl<number>, FormFieldCont
8808
10047
  }
8809
10048
 
8810
10049
  declare class RangeSliderComponent {
10050
+ private sliderLabels;
8811
10051
  support: {
8812
10052
  errorColorTheme: _ethlete_core.ColorTheme;
8813
10053
  formFieldDir: FormFieldDirective;
@@ -8827,13 +10067,17 @@ declare class RangeSliderComponent {
8827
10067
  };
8828
10068
  protected slider: RangeSliderDirective;
8829
10069
  /** Accessible name of the start thumb. */
8830
- startLabel: _angular_core.InputSignal<string>;
10070
+ startLabel: _angular_core.InputSignal<string | null>;
8831
10071
  /** Accessible name of the end thumb. */
8832
- endLabel: _angular_core.InputSignal<string>;
10072
+ endLabel: _angular_core.InputSignal<string | null>;
8833
10073
  private errorContentRef;
8834
10074
  private hintContentRef;
8835
10075
  private errorAnimatableRef;
8836
10076
  private hintAnimatableRef;
10077
+ /** The string in effect: this instance's `startLabel`, else the domain's label set. */
10078
+ protected resolvedStartLabel: _angular_core.Signal<string>;
10079
+ /** The string in effect: this instance's `endLabel`, else the domain's label set. */
10080
+ protected resolvedEndLabel: _angular_core.Signal<string>;
8837
10081
  canAnimate: {
8838
10082
  state: _angular_core.Signal<boolean>;
8839
10083
  };
@@ -8850,6 +10094,30 @@ declare const SLIDER_ERROR_CODES: {
8850
10094
  readonly THUMB_COUNT_MISMATCH: 3103;
8851
10095
  };
8852
10096
 
10097
+ /**
10098
+ * The strings a slider announces. A range slider has two thumbs and no visible text, so naming them is
10099
+ * the only way a screen reader can tell them apart.
10100
+ */
10101
+ type SliderLabels = {
10102
+ /** Accessible label for a range slider's lower thumb. */
10103
+ minimum: string;
10104
+ /** Accessible label for a range slider's upper thumb. */
10105
+ maximum: string;
10106
+ };
10107
+ /** The built-in English labels. */
10108
+ declare const DEFAULT_SLIDER_LABELS: SliderLabels;
10109
+ /**
10110
+ * Localize a slider's strings for everything below this injector, and read the set in effect here as a
10111
+ * signal. Partial — whatever you leave out keeps its {@link DEFAULT_SLIDER_LABELS} value. See {@link createLabels}
10112
+ * for the shape, which every domain in this library shares.
10113
+ *
10114
+ * @example
10115
+ * provideSliderLabels({ minimum: 'Minimum', maximum: 'Maximum' });
10116
+ */
10117
+ declare const provideSliderLabels: (labels: _ethlete_core.LabelsSource<SliderLabels>) => _angular_core.Provider;
10118
+ declare const injectSliderLabels: () => _angular_core.Signal<SliderLabels>;
10119
+ declare const SLIDER_LABELS: _angular_core.InjectionToken<_ethlete_core.LabelsSource<SliderLabels>>;
10120
+
8853
10121
  declare class SliderComponent {
8854
10122
  support: {
8855
10123
  errorColorTheme: _ethlete_core.ColorTheme;
@@ -8898,10 +10166,10 @@ declare class SwitchDirective implements FormFieldControl {
8898
10166
  touched: _angular_core.ModelSignal<boolean>;
8899
10167
  disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
8900
10168
  /** View-only: keeps the normal look and focusability but blocks toggling (unlike `disabled`). */
8901
- readonly: _angular_core.InputSignal<boolean>;
8902
- invalid: _angular_core.InputSignal<boolean>;
10169
+ readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
10170
+ invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
8903
10171
  errors: _angular_core.InputSignal<readonly ValidationError.WithOptionalFieldTree[]>;
8904
- required: _angular_core.InputSignal<boolean>;
10172
+ required: _angular_core.InputSignalWithTransform<boolean, unknown>;
8905
10173
  name: _angular_core.InputSignal<string>;
8906
10174
  shouldDisplayError: _angular_core.Signal<boolean>;
8907
10175
  describedBy: _angular_core.WritableSignal<string | null>;
@@ -8925,30 +10193,45 @@ declare class SwitchComponent {
8925
10193
  declare const SWITCH_IMPORTS: readonly [typeof SwitchComponent, typeof SwitchDirective];
8926
10194
 
8927
10195
  declare class TagInputDirective implements FormValueControl<string[]>, FormFieldControl {
10196
+ private formFieldLabels;
8928
10197
  private formField;
8929
10198
  private destroyRef;
8930
10199
  value: _angular_core.ModelSignal<string[]>;
8931
10200
  /** View state for a field whose source values disagree. The raw form value stays untouched. */
8932
10201
  mixed: _angular_core.ModelSignal<boolean>;
8933
10202
  touched: _angular_core.ModelSignal<boolean>;
8934
- disabled: _angular_core.InputSignal<boolean>;
8935
- readonly: _angular_core.InputSignal<boolean>;
8936
- invalid: _angular_core.InputSignal<boolean>;
10203
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
10204
+ readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
10205
+ invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
8937
10206
  errors: _angular_core.InputSignal<readonly ValidationError.WithOptionalFieldTree[]>;
8938
- required: _angular_core.InputSignal<boolean>;
10207
+ required: _angular_core.InputSignalWithTransform<boolean, unknown>;
8939
10208
  name: _angular_core.InputSignal<string>;
10209
+ /**
10210
+ * The bound field's `maxLength()` limit — for an array value that is the maximum number of tags.
10211
+ * Signal forms binds it automatically because this input exists, so `<et-counter />` picks the
10212
+ * limit up from the schema. Display only: the tag input does not refuse tags past it, so the
10213
+ * validator is still the thing that reports the violation.
10214
+ */
10215
+ maxLength: _angular_core.InputSignal<number | undefined>;
10216
+ /**
10217
+ * True while an async validator is in flight for the bound field — bound automatically by signal
10218
+ * forms because this input exists. The field shell surfaces it as its busy state.
10219
+ */
10220
+ pending: _angular_core.InputSignalWithTransform<boolean, unknown>;
8940
10221
  placeholder: _angular_core.InputSignal<string>;
8941
10222
  /** Field placeholder shown while `mixed` is set. */
8942
- mixedLabel: _angular_core.InputSignal<string>;
10223
+ mixedLabel: _angular_core.InputSignal<string | null>;
8943
10224
  /**
8944
10225
  * What commits the pending text as a tag: multi-character entries are key names
8945
10226
  * (`'Enter'`), single characters commit as soon as they are typed (and split pastes).
8946
10227
  */
8947
10228
  separators: _angular_core.InputSignal<string[]>;
8948
- allowDuplicates: _angular_core.InputSignal<boolean>;
10229
+ allowDuplicates: _angular_core.InputSignalWithTransform<boolean, unknown>;
8949
10230
  /** Maps raw text to the stored tag — return `null` to reject. Defaults to trimming. */
8950
10231
  normalizeTag: _angular_core.InputSignal<(raw: string) => string | null>;
8951
10232
  maxTags: _angular_core.InputSignal<number | undefined>;
10233
+ /** The string in effect: this instance's `mixedLabel`, else `FORM_FIELD_LABELS`. */
10234
+ resolvedMixedLabel: _angular_core.Signal<string>;
8952
10235
  shouldDisplayError: _angular_core.Signal<boolean>;
8953
10236
  /** The raw value normalized to the tags the control currently shows. Mixed has no effective tags. */
8954
10237
  effectiveValues: _angular_core.Signal<readonly string[]>;
@@ -8981,7 +10264,7 @@ declare class TagInputDirective implements FormValueControl<string[]>, FormField
8981
10264
  removeAt(index: number): void;
8982
10265
  removeLast(): void;
8983
10266
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TagInputDirective, never>;
8984
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<TagInputDirective, "[etTagInput]", ["etTagInput"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "mixed": { "alias": "mixed"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "mixedLabel": { "alias": "mixedLabel"; "required": false; "isSignal": true; }; "separators": { "alias": "separators"; "required": false; "isSignal": true; }; "allowDuplicates": { "alias": "allowDuplicates"; "required": false; "isSignal": true; }; "normalizeTag": { "alias": "normalizeTag"; "required": false; "isSignal": true; }; "maxTags": { "alias": "maxTags"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "mixed": "mixedChange"; "touched": "touchedChange"; }, never, never, true, never>;
10267
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<TagInputDirective, "[etTagInput]", ["etTagInput"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "mixed": { "alias": "mixed"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "maxLength": { "alias": "maxLength"; "required": false; "isSignal": true; }; "pending": { "alias": "pending"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "mixedLabel": { "alias": "mixedLabel"; "required": false; "isSignal": true; }; "separators": { "alias": "separators"; "required": false; "isSignal": true; }; "allowDuplicates": { "alias": "allowDuplicates"; "required": false; "isSignal": true; }; "normalizeTag": { "alias": "normalizeTag"; "required": false; "isSignal": true; }; "maxTags": { "alias": "maxTags"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "mixed": "mixedChange"; "touched": "touchedChange"; }, never, never, true, never>;
8985
10268
  }
8986
10269
 
8987
10270
  /** The text field of a tag input — commits its text as a tag on separators and blur. */
@@ -9010,7 +10293,7 @@ declare const TAG_INPUT_ERROR_CODES: {
9010
10293
  declare class TagInputComponent {
9011
10294
  protected tagInput: TagInputDirective;
9012
10295
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TagInputComponent, never>;
9013
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TagInputComponent, "et-tag-input", never, {}, {}, never, never, true, [{ directive: typeof TagInputDirective; inputs: { "value": "value"; "mixed": "mixed"; "touched": "touched"; "disabled": "disabled"; "readonly": "readonly"; "invalid": "invalid"; "errors": "errors"; "required": "required"; "name": "name"; "placeholder": "placeholder"; "mixedLabel": "mixedLabel"; "separators": "separators"; "allowDuplicates": "allowDuplicates"; "normalizeTag": "normalizeTag"; "maxTags": "maxTags"; }; outputs: { "valueChange": "valueChange"; "mixedChange": "mixedChange"; "touchedChange": "touchedChange"; }; }, { directive: typeof _ethlete_core.ColorInteractiveDirective; inputs: {}; outputs: {}; }]>;
10296
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TagInputComponent, "et-tag-input", never, {}, {}, never, never, true, [{ directive: typeof TagInputDirective; inputs: { "value": "value"; "mixed": "mixed"; "touched": "touched"; "disabled": "disabled"; "readonly": "readonly"; "invalid": "invalid"; "errors": "errors"; "required": "required"; "name": "name"; "maxLength": "maxLength"; "pending": "pending"; "placeholder": "placeholder"; "mixedLabel": "mixedLabel"; "separators": "separators"; "allowDuplicates": "allowDuplicates"; "normalizeTag": "normalizeTag"; "maxTags": "maxTags"; }; outputs: { "valueChange": "valueChange"; "mixedChange": "mixedChange"; "touchedChange": "touchedChange"; }; }, { directive: typeof _ethlete_core.ColorInteractiveDirective; inputs: {}; outputs: {}; }]>;
9014
10297
  }
9015
10298
 
9016
10299
  declare const TAG_INPUT_IMPORTS: readonly [typeof TagInputComponent, typeof TagInputDirective, typeof TagInputFieldDirective];
@@ -9025,8 +10308,8 @@ declare class TextareaDirective extends TextFieldControlDirective implements For
9025
10308
  value: _angular_core.ModelSignal<string>;
9026
10309
  placeholder: _angular_core.InputSignal<string>;
9027
10310
  autocomplete: _angular_core.InputSignal<string>;
9028
- rows: _angular_core.InputSignal<number>;
9029
- autosize: _angular_core.InputSignal<boolean>;
10311
+ rows: _angular_core.InputSignalWithTransform<number, unknown>;
10312
+ autosize: _angular_core.InputSignalWithTransform<boolean, unknown>;
9030
10313
  minRows: _angular_core.InputSignal<number | null>;
9031
10314
  maxRows: _angular_core.InputSignal<number | null>;
9032
10315
  /** Only applied when `autosize` is off; an autosizing textarea is never manually resizable. */
@@ -9063,7 +10346,7 @@ declare class TextareaComponent {
9063
10346
  constructor();
9064
10347
  syncNativeValue(event: Event): void;
9065
10348
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TextareaComponent, never>;
9066
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TextareaComponent, "et-textarea", never, {}, {}, never, never, true, [{ directive: typeof TextareaDirective; inputs: { "placeholder": "placeholder"; "autocomplete": "autocomplete"; "rows": "rows"; "autosize": "autosize"; "minRows": "minRows"; "maxRows": "maxRows"; "resize": "resize"; "value": "value"; "mixed": "mixed"; "mixedLabel": "mixedLabel"; "disabled": "disabled"; "readonly": "readonly"; "hidden": "hidden"; "invalid": "invalid"; "errors": "errors"; "required": "required"; "name": "name"; "aria-label": "aria-label"; "aria-labelledby": "aria-labelledby"; }; outputs: { "valueChange": "valueChange"; "mixedChange": "mixedChange"; "touchedChange": "touchedChange"; }; }, { directive: typeof _ethlete_core.ColorInteractiveDirective; inputs: {}; outputs: {}; }]>;
10349
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TextareaComponent, "et-textarea", never, {}, {}, never, never, true, [{ directive: typeof TextareaDirective; inputs: { "placeholder": "placeholder"; "autocomplete": "autocomplete"; "rows": "rows"; "autosize": "autosize"; "minRows": "minRows"; "maxRows": "maxRows"; "resize": "resize"; "value": "value"; "mixed": "mixed"; "mixedLabel": "mixedLabel"; "disabled": "disabled"; "readonly": "readonly"; "hidden": "hidden"; "invalid": "invalid"; "errors": "errors"; "required": "required"; "name": "name"; "maxLength": "maxLength"; "pending": "pending"; "aria-label": "aria-label"; "aria-labelledby": "aria-labelledby"; }; outputs: { "valueChange": "valueChange"; "mixedChange": "mixedChange"; "touchedChange": "touchedChange"; }; }, { directive: typeof _ethlete_core.ColorInteractiveDirective; inputs: {}; outputs: {}; }]>;
9067
10350
  }
9068
10351
 
9069
10352
  declare const TEXTAREA_IMPORTS: readonly [typeof TextareaComponent, typeof TextareaDirective];
@@ -9151,8 +10434,8 @@ declare class GridDirective {
9151
10434
  private gridConfig;
9152
10435
  private reducedMotion;
9153
10436
  breakpoints: _angular_core.InputSignal<GridBreakpointConfig[]>;
9154
- rowHeight: _angular_core.InputSignal<number>;
9155
- gap: _angular_core.InputSignal<number>;
10437
+ rowHeight: _angular_core.InputSignalWithTransform<number, unknown>;
10438
+ gap: _angular_core.InputSignalWithTransform<number, unknown>;
9156
10439
  initialItems: _angular_core.InputSignal<GridItemConfig[]>;
9157
10440
  readOnly: _angular_core.InputSignalWithTransform<boolean, unknown>;
9158
10441
  layoutChange: _angular_core.OutputEmitterRef<GridSerializedState>;
@@ -9548,10 +10831,6 @@ declare const GRID_TOKEN: InjectionToken<GridDirective>;
9548
10831
 
9549
10832
  type GridConfig = {
9550
10833
  registrations: GridComponentRegistration[];
9551
- interactiveAriaLabel: string;
9552
- readonlyAriaLabel: string;
9553
- removeActionAriaLabel: string;
9554
- transformer: (text: string, locale: string) => string;
9555
10834
  actionsComponent?: GridItemActionsComponent | null;
9556
10835
  };
9557
10836
  declare const provideGridConfig: (valueOverride?: Partial<GridConfig> | undefined) => _angular_core.Provider[];
@@ -9586,7 +10865,7 @@ declare const fromGridPosition: (pos: GridItemPosition) => {
9586
10865
  declare class GridComponent {
9587
10866
  grid: GridDirective;
9588
10867
  private gridConfig;
9589
- private locale;
10868
+ private labels;
9590
10869
  protected actionsComponent: _angular_core.Signal<_ethlete_components.GridItemActionsComponent | null>;
9591
10870
  protected registeredItems: _angular_core.Signal<{
9592
10871
  item: _ethlete_components.GridItemConfig;
@@ -9626,8 +10905,7 @@ declare class GridItemToolbarComponent {
9626
10905
 
9627
10906
  declare class GridItemDefaultActionsComponent {
9628
10907
  private grid;
9629
- private gridConfig;
9630
- private locale;
10908
+ private labels;
9631
10909
  itemId: _angular_core.InputSignal<string>;
9632
10910
  data: _angular_core.InputSignal<unknown>;
9633
10911
  protected removeAriaLabel: _angular_core.Signal<string>;
@@ -9687,6 +10965,36 @@ declare const GRID_ERROR_CODES: {
9687
10965
  readonly UNKNOWN_ITEM_TYPE: 1904;
9688
10966
  };
9689
10967
 
10968
+ /**
10969
+ * Every string the grid announces. It renders no text of its own — the items are yours — so these are
10970
+ * all accessible labels.
10971
+ *
10972
+ * They used to live on `GridConfig` next to a `transformer(text, locale)` hook, which asked an app to
10973
+ * translate *by matching the English string*. `GridConfig` keeps the registrations and the actions
10974
+ * component; the wording lives here, like every other label in this library.
10975
+ */
10976
+ type GridLabels = {
10977
+ /** Accessible label for a grid whose items can be moved and resized. */
10978
+ interactiveGrid: string;
10979
+ /** Accessible label for a read-only grid. */
10980
+ readonlyGrid: string;
10981
+ /** Accessible label for an item's remove action. */
10982
+ removeItem: string;
10983
+ };
10984
+ /** The built-in English labels. */
10985
+ declare const DEFAULT_GRID_LABELS: GridLabels;
10986
+ /**
10987
+ * Localize the grid's accessible labels for everything below this injector, and read the set in effect
10988
+ * here as a signal. Partial — whatever you leave out keeps its {@link DEFAULT_GRID_LABELS} value. See
10989
+ * {@link createLabels} for the shape, which every domain in this library shares.
10990
+ *
10991
+ * @example
10992
+ * provideGridLabels({ readonlyGrid: 'Raster', removeItem: 'Element entfernen' });
10993
+ */
10994
+ declare const provideGridLabels: (labels: _ethlete_core.LabelsSource<GridLabels>) => _angular_core.Provider;
10995
+ declare const injectGridLabels: () => _angular_core.Signal<GridLabels>;
10996
+ declare const GRID_LABELS: _angular_core.InjectionToken<_ethlete_core.LabelsSource<GridLabels>>;
10997
+
9690
10998
  declare const GRID_IMPORTS: readonly [typeof GridComponent, typeof GridItemComponent, typeof GridItemToolbarComponent, typeof GridItemDefaultActionsComponent, typeof GridDebugComponent];
9691
10999
 
9692
11000
  type IconDefinition = {
@@ -9748,7 +11056,7 @@ declare const provideIcons: (...icons: IconDefinition[]) => {
9748
11056
  * Keep this in sync when adding or removing a built-in `et-*` icon under
9749
11057
  * `libs/components/src/lib/icon/headless/`.
9750
11058
  */
9751
- declare const ET_BUILT_IN_ICON_NAMES: readonly ["et-align-center", "et-align-justify", "et-align-left", "et-align-right", "et-arrow-out-up-right", "et-arrow-right", "et-arrow-up", "et-arrows-left-right", "et-bold", "et-calendar", "et-check", "et-chevron", "et-clipboard-check", "et-clock", "et-code", "et-ellipsis-vertical", "et-eye", "et-eye-slash", "et-file", "et-filter", "et-floppy-disk", "et-focus-frame", "et-grid-2x2", "et-heading-1", "et-heading-2", "et-heading-3", "et-italic", "et-link", "et-list-bulleted", "et-list-numbered", "et-lock", "et-minus", "et-paragraph", "et-pause", "et-pencil", "et-play", "et-plus", "et-rotate-right", "et-star", "et-strikethrough", "et-table", "et-times", "et-triangle-exclamation", "et-underline", "et-upload"];
11059
+ declare const ET_BUILT_IN_ICON_NAMES: readonly ["et-align-center", "et-align-justify", "et-align-left", "et-align-right", "et-arrow-out-up-right", "et-arrow-right", "et-arrow-up", "et-arrows-left-right", "et-bold", "et-calendar", "et-check", "et-chevron", "et-clipboard-check", "et-clock", "et-code", "et-ellipsis", "et-ellipsis-vertical", "et-eye", "et-eye-slash", "et-file", "et-filter", "et-floppy-disk", "et-focus-frame", "et-grid-2x2", "et-heading-1", "et-heading-2", "et-heading-3", "et-italic", "et-link", "et-list-bulleted", "et-list-numbered", "et-lock", "et-minus", "et-paragraph", "et-pause", "et-pencil", "et-play", "et-plus", "et-rotate-right", "et-star", "et-strikethrough", "et-table", "et-times", "et-triangle-exclamation", "et-underline", "et-upload"];
9752
11060
  /** Union of the SDK's built-in icon names — see {@link ET_BUILT_IN_ICON_NAMES}. */
9753
11061
  type EtBuiltInIconName = (typeof ET_BUILT_IN_ICON_NAMES)[number];
9754
11062
  /**
@@ -9822,6 +11130,9 @@ declare const CLOCK_ICON: IconDefinition;
9822
11130
 
9823
11131
  declare const CODE_ICON: IconDefinition;
9824
11132
 
11133
+ /** Horizontal three-dot glyph — the breadcrumb's "show the hidden levels" trigger. */
11134
+ declare const ELLIPSIS_ICON: IconDefinition;
11135
+
9825
11136
  /** Vertical three-dot "more actions" glyph — the table's column menu trigger. */
9826
11137
  declare const ELLIPSIS_VERTICAL_ICON: IconDefinition;
9827
11138
 
@@ -9913,6 +11224,7 @@ declare const UPLOAD_ICON: IconDefinition;
9913
11224
  declare const ICON_IMPORTS: readonly [typeof IconDirective];
9914
11225
 
9915
11226
  declare class BrandLoaderComponent {
11227
+ protected labels: _angular_core.Signal<_ethlete_components.LoaderLabels>;
9916
11228
  readonly PATH = "M15.905 6.21401C15.7794 6.8902 16.2818 7.51877 16.9517 7.51877H23.8598L22.9201 12.3378H15.6817C15.1048 12.3378 14.6071 12.7569 14.5001 13.3378C14.4861 13.4188 14.4768 13.4997 14.4768 13.5811C14.4768 14.2426 15.0071 14.8092 15.6817 14.8092H23.9435L22.9201 19.9997H6.79183L7.2198 17.814H7.64313C7.94085 17.814 8.20601 17.6907 8.40139 17.495C8.59212 17.2954 8.71307 17.0235 8.71307 16.7235C8.71307 16.1188 8.23858 15.6331 7.64778 15.6288H2.73534C2.14919 15.6288 1.67004 15.1426 1.67004 14.5378C1.67004 14.2383 1.791 13.9621 1.98172 13.7664C2.17711 13.5711 2.44227 13.4473 2.73534 13.4473H8.07111L8.96428 8.88115H9.39226C9.68533 8.88115 9.95049 8.75686 10.1459 8.5621C10.3366 8.3621 10.4576 8.08591 10.4576 7.78543C10.4576 7.18543 9.9784 6.69543 9.39226 6.69543H4.48447C3.89367 6.69543 3.41452 6.20448 3.41452 5.60496C3.41452 5.30448 3.53547 5.02877 3.7262 4.82829C3.92158 4.63353 4.19139 4.50924 4.48447 4.50924H10.2436C10.5366 4.50924 10.8064 4.3902 10.9972 4.1902C11.1879 3.99496 11.3089 3.72401 11.3089 3.41877C11.3089 2.81401 10.8344 2.32829 10.2436 2.32829H1.06994C0.479149 2.32829 0 1.83829 0 1.23305C0 0.933054 0.12095 0.656864 0.31168 0.461626C0.507061 0.266864 0.776873 0.142578 1.06994 0.142578H26.4369L25.4135 5.33305H16.9517C16.4446 5.33305 16.0027 5.70496 15.905 6.21401Z";
9917
11229
  readonly OUTLINE_PATH = "M1.07 0.14 L26.44 0.14 L25.41 5.33 L16.95 5.33 C16.44 5.33 16.0 5.70 15.91 6.21 C15.78 6.89 16.28 7.52 16.95 7.52 L23.86 7.52 L22.92 12.34 L15.68 12.34 C15.10 12.34 14.61 12.76 14.50 13.34 C14.49 13.42 14.48 13.50 14.48 13.58 C14.48 14.24 15.01 14.81 15.68 14.81 L23.94 14.81 L22.92 20.0 L6.79 20.0 L7.22 17.81 L7.64 17.81 C7.94 17.81 8.21 17.69 8.40 17.50 C8.59 17.30 8.71 17.02 8.71 16.72 C8.71 16.12 8.24 15.63 7.65 15.63 L2.74 15.63 C2.15 15.63 1.67 15.14 1.67 14.54 C1.67 14.24 1.79 13.96 1.98 13.77 C2.18 13.57 2.44 13.45 2.74 13.45 L8.07 13.45 L8.96 8.88 L9.39 8.88 C9.69 8.88 9.95 8.76 10.15 8.56 C10.34 8.36 10.46 8.09 10.46 7.79 C10.46 7.19 9.98 6.70 9.39 6.70 L4.48 6.70 C3.89 6.70 3.41 6.20 3.41 5.60 C3.41 5.30 3.54 5.03 3.73 4.83 C3.92 4.63 4.19 4.51 4.48 4.51 L10.24 4.51 C10.54 4.51 10.81 4.39 10.997 4.19 C11.188 3.99 11.31 3.72 11.31 3.42 C11.31 2.81 10.83 2.33 10.24 2.33 L1.07 2.33 C0.48 2.33 0 1.84 0 1.23 C0 0.93 0.12 0.66 0.31 0.46 C0.51 0.27 0.78 0.14 1.07 0.14 Z";
9918
11230
  readonly SHAPE_CLIP_ID: string;
@@ -9920,34 +11232,277 @@ declare class BrandLoaderComponent {
9920
11232
  readonly FILL_CLIP_ID: string;
9921
11233
  fillClip: string;
9922
11234
  constructor();
9923
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<BrandLoaderComponent, never>;
9924
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<BrandLoaderComponent, "et-brand-loader", never, {}, {}, never, never, true, never>;
11235
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BrandLoaderComponent, never>;
11236
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<BrandLoaderComponent, "et-brand-loader", never, {}, {}, never, never, true, never>;
11237
+ }
11238
+
11239
+ /**
11240
+ * What a busy indicator announces. A spinner, a brand loader and a skeleton are all shapes with no
11241
+ * text, so this is the only thing a screen reader has to go on.
11242
+ *
11243
+ * One set for all of them on purpose: an app that translates "Loading" should not have to say so once
11244
+ * per component. `et-skeleton`'s `loadingAllyText` still overrides it per instance where something more
11245
+ * specific reads better ("Loading results").
11246
+ */
11247
+ type LoaderLabels = {
11248
+ /** Announced by an indeterminate loader — the spinner, the brand loader, a stream's loading overlay. */
11249
+ loading: string;
11250
+ /** Announced in place of a skeleton's shapes, which are `aria-hidden`. */
11251
+ loadingContent: string;
11252
+ };
11253
+ /** The built-in English labels. */
11254
+ declare const DEFAULT_LOADER_LABELS: LoaderLabels;
11255
+ /**
11256
+ * Localize what loaders announce for everything below this injector, and read the set in effect here as
11257
+ * a signal. Partial — whatever you leave out keeps its {@link DEFAULT_LOADER_LABELS} value. See
11258
+ * {@link createLabels} for the shape, which every domain in this library shares.
11259
+ *
11260
+ * @example
11261
+ * provideLoaderLabels({ loading: 'Lädt', loadingContent: 'Lädt…' });
11262
+ */
11263
+ declare const provideLoaderLabels: (labels: _ethlete_core.LabelsSource<LoaderLabels>) => _angular_core.Provider;
11264
+ declare const injectLoaderLabels: () => _angular_core.Signal<LoaderLabels>;
11265
+ declare const LOADER_LABELS: _angular_core.InjectionToken<_ethlete_core.LabelsSource<LoaderLabels>>;
11266
+
11267
+ declare class ProgressBarComponent {
11268
+ value: _angular_core.InputSignalWithTransform<number, unknown>;
11269
+ indeterminate: _angular_core.InputSignalWithTransform<boolean, unknown>;
11270
+ clampedValue: _angular_core.Signal<number>;
11271
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ProgressBarComponent, never>;
11272
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ProgressBarComponent, "et-progress-bar", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "indeterminate": { "alias": "indeterminate"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
11273
+ }
11274
+
11275
+ declare class SpinnerComponent {
11276
+ diameter: _angular_core.InputSignalWithTransform<number, unknown>;
11277
+ strokeWidth: _angular_core.InputSignalWithTransform<number, unknown>;
11278
+ track: _angular_core.InputSignalWithTransform<boolean, unknown>;
11279
+ value: _angular_core.InputSignalWithTransform<number, unknown>;
11280
+ determinate: _angular_core.InputSignalWithTransform<boolean, unknown>;
11281
+ circleRadius: _angular_core.Signal<number>;
11282
+ normalizedStrokeWidth: _angular_core.Signal<number>;
11283
+ viewBox: _angular_core.Signal<string>;
11284
+ strokeCircumference: _angular_core.Signal<number>;
11285
+ circleStrokeWidth: _angular_core.Signal<number>;
11286
+ clampedValue: _angular_core.Signal<number>;
11287
+ determinateDashOffset: _angular_core.Signal<number>;
11288
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SpinnerComponent, never>;
11289
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SpinnerComponent, "et-spinner", never, { "diameter": { "alias": "diameter"; "required": false; "isSignal": true; }; "strokeWidth": { "alias": "strokeWidth"; "required": false; "isSignal": true; }; "track": { "alias": "track"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "determinate": { "alias": "determinate"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
11290
+ }
11291
+
11292
+ /**
11293
+ * One item in a masonry. It measures itself — continuously, via its own `ResizeObserver` — and takes the
11294
+ * width and position the masonry works out from those measurements.
11295
+ *
11296
+ * Continuous measurement is what makes late content behave: an image that arrives after layout, a card that
11297
+ * reflows when a translation swaps in, a description that expands on click. cdk measured each item once and
11298
+ * kept the number, so any of those left the item overlapping its neighbour until the next resize.
11299
+ *
11300
+ * The element is yours, which is what lets a masonry be a real list — `<ul etMasonry>` with `<li
11301
+ * etMasonryItem>` children needs no ARIA roles at all.
11302
+ *
11303
+ * @example
11304
+ * <li etMasonryItem>…</li>
11305
+ */
11306
+ declare class MasonryItemDirective {
11307
+ /** @internal The masonry sorts its items by document position, which needs their elements. */
11308
+ elementRef: ElementRef<HTMLElement>;
11309
+ private masonry;
11310
+ private dimensions;
11311
+ /**
11312
+ * The item's measured border box.
11313
+ *
11314
+ * `rect()` rather than the integer `offset` sizes: a column width is rarely a whole number of pixels (the
11315
+ * remainder is shared out between the columns), and rounding every item's height would drift the columns
11316
+ * apart by a pixel per item stacked.
11317
+ */
11318
+ private measured;
11319
+ /** How tall the item is right now — what the masonry packs with. */
11320
+ blockSize: _angular_core.Signal<number>;
11321
+ /**
11322
+ * How wide the item is right now. The masonry compares this against the column width to know whether the
11323
+ * item has re-measured since the columns changed — a stale width means a stale height too, and both arrive
11324
+ * together when the observer fires.
11325
+ */
11326
+ inlineSize: _angular_core.Signal<number>;
11327
+ /** The width the masonry has assigned, or `null` before its container has been measured. */
11328
+ columnInlineSize: _angular_core.Signal<number | null>;
11329
+ /**
11330
+ * Whether the item has reported its size *at the width the masonry gave it*. Until it has, its height is
11331
+ * the height it had at some other width, so the placement derived from it would be wrong. The observer
11332
+ * delivers both sizes together, which is what makes the width a reliable proxy for "this height is current".
11333
+ */
11334
+ isMeasured: _angular_core.Signal<boolean>;
11335
+ /** Where the masonry has put this item, or `null` before it has. */
11336
+ placement: _angular_core.Signal<_ethlete_components.MasonryPlacement | null>;
11337
+ /** Whether the item's placement is current, i.e. derived from a height measured at its present width. */
11338
+ isPlaced: _angular_core.Signal<boolean>;
11339
+ /**
11340
+ * Whether the item has a place on screen — **sticky**: it fades in on its first placement and then stays
11341
+ * visible. That the reveal latches is the point. Every column width change un-measures every item for a
11342
+ * frame (its recorded width is the old one until the observer reports), and a reveal tied to the live
11343
+ * measurement would therefore fade the whole masonry out and back in on every frame of a window drag.
11344
+ *
11345
+ * Before the first placement there is nothing to show but a pile of items in the container's start corner,
11346
+ * which is what the initial transparency is for.
11347
+ */
11348
+ private hasBeenPlaced;
11349
+ isPositioned: _angular_core.Signal<unknown>;
11350
+ private isMoveArmed;
11351
+ /**
11352
+ * Whether this item may animate a move. It must not animate the first one: before it has a placement its
11353
+ * offsets are zero, so an armed transition would slide it in from the container's start corner — and an item
11354
+ * appended to a feed would slide in from there too. So the transition is armed a frame *after* the item is
11355
+ * placed, by which point the browser has painted it where it belongs and there is nothing to animate from.
11356
+ */
11357
+ canMove: _angular_core.Signal<boolean>;
11358
+ constructor();
11359
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MasonryItemDirective, never>;
11360
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<MasonryItemDirective, "[etMasonryItem]", ["etMasonryItem"], {}, {}, never, never, true, never>;
11361
+ }
11362
+
11363
+ /** Where one item sits: which column it landed in, and its offset from the container's start corner. */
11364
+ type MasonryPlacement = {
11365
+ column: number;
11366
+ /** Offset along the inline axis (left in LTR, right in RTL — CSS resolves the side). */
11367
+ inlineOffset: number;
11368
+ /** Offset along the block axis, i.e. how tall the column was when this item was placed. */
11369
+ blockOffset: number;
11370
+ };
11371
+ /** The column grid a masonry has settled on for its current width. */
11372
+ type MasonryColumns = {
11373
+ /** `0` means the container has not been measured yet, so nothing can be placed. */
11374
+ count: number;
11375
+ inlineSize: number;
11376
+ };
11377
+ /** The result of one packing pass. */
11378
+ type MasonryPacking = {
11379
+ /** Index-aligned with the block sizes handed in. */
11380
+ placements: MasonryPlacement[];
11381
+ /** How tall each column ended up, gap included — the state the greedy pass carries along. */
11382
+ columnBlockSizes: number[];
11383
+ /** How tall the container has to be to hold every column. */
11384
+ blockSize: number;
11385
+ };
11386
+
11387
+ /**
11388
+ * Packs variable-height items into columns, each item going to whichever column is currently shortest — the
11389
+ * layout a photo feed wants, where cropping every card to a common height would be the alternative.
11390
+ *
11391
+ * It measures and positions, because CSS still can't: native masonry (`display: grid-lanes`, CSS Grid Level
11392
+ * 3) is not Baseline as of this writing, and CSS `columns` fills column by column, so the reading order of a
11393
+ * feed would no longer be its visual order. See `plans/cdk-port/07-masonry.md` for the full verdict. Items
11394
+ * are therefore absolutely positioned from their measured sizes, which keeps DOM order and reading order the
11395
+ * same and means a reflow never relayouts the page around it.
11396
+ *
11397
+ * The measuring is per item and continuous (a `ResizeObserver` each), so a card whose image loads late, or
11398
+ * whose text reflows, moves the ones below it — the one thing cdk's one-shot `getBoundingClientRect()`
11399
+ * snapshots could not do.
11400
+ *
11401
+ * @example
11402
+ * <ul etMasonry [columnWidth]="240" [gap]="16">
11403
+ * @for (photo of photos(); track photo.id) {
11404
+ * <li etMasonryItem><img [src]="photo.url" alt="" /></li>
11405
+ * }
11406
+ * </ul>
11407
+ */
11408
+ declare class MasonryDirective {
11409
+ private elementRef;
11410
+ private styleManager;
11411
+ /**
11412
+ * The narrowest a column may be, in px — a minimum rather than a target. As many columns as fit at that
11413
+ * width are used (gaps included), and the leftover space is shared out between them, so the columns always
11414
+ * fill the container. That is `repeat(auto-fill, minmax(X, 1fr))`, expressed as a number because the
11415
+ * packing needs it as one.
11416
+ *
11417
+ * Accepts a per-breakpoint map (`{ xs: 150, md: 240 }`) for a layout that wants coarser columns on a phone
11418
+ * than the container width alone would give. @default 250
11419
+ */
11420
+ columnWidth: _angular_core.InputSignalWithTransform<number, string | _ethlete_core.BreakpointInput<number>>;
11421
+ /**
11422
+ * The space between columns and between stacked items, in px. Also accepts a per-breakpoint map. It is a
11423
+ * number rather than CSS `gap` because the items are positioned, not laid out — CSS never sees the
11424
+ * columns. @default 16
11425
+ */
11426
+ gap: _angular_core.InputSignalWithTransform<number, string | _ethlete_core.BreakpointInput<number>>;
11427
+ private dimensions;
11428
+ private registeredItems;
11429
+ /**
11430
+ * @internal The items in DOM order, which for masonry *is* the placement order: registration order follows
11431
+ * creation order, and a `@for` that re-orders its items would otherwise pack them by the order they were
11432
+ * born in rather than the order they are read in.
11433
+ */
11434
+ items: _angular_core.Signal<MasonryItemDirective[]>;
11435
+ /**
11436
+ * How wide the container is. Only the inline size is taken from the observed dimensions, deliberately: this
11437
+ * directive *sets* the container's height, so a signal carrying both would see its own write and lay out
11438
+ * again. Reading one number out of it means the recompute stops at an unchanged value instead.
11439
+ */
11440
+ containerInlineSize: _angular_core.Signal<number>;
11441
+ /** The column grid in effect: how many, and how wide. `count: 0` until the container has been measured. */
11442
+ columns: _angular_core.Signal<_ethlete_components.MasonryColumns>;
11443
+ /**
11444
+ * The columns items have already been given, and the column count they were given for. Rebalancing is a
11445
+ * *geometry* decision, not a content one: see `repack()`.
11446
+ */
11447
+ private columnAssignments;
11448
+ /**
11449
+ * Every item's position, derived rather than assigned. The whole layout is one `computed` over the item
11450
+ * sizes, the column grid and the gap — so there is no invalidation to get right, no imperative pass over
11451
+ * the DOM, and appending to a feed re-derives the existing placements *identically* because the packing is
11452
+ * prefix-stable. What cdk did with a partial-invalidation mode, Angular's binding dedupe does here: an
11453
+ * item whose placement is unchanged is not written to again.
11454
+ */
11455
+ private layout;
11456
+ /** How tall the container is, i.e. the tallest column. */
11457
+ blockSize: _angular_core.Signal<number>;
11458
+ /**
11459
+ * Whether the layout matches what is on screen: the container has been measured, and every item has
11460
+ * reported its size at the current column width.
11461
+ *
11462
+ * This is the signal to gate an infinite scroll on — fetching the next page while the current one is still
11463
+ * settling appends items against sizes that are about to change, which is what cdk needed its
11464
+ * `injectInfinityQueryResponseDelay` handshake for. That provider only ever existed for the legacy query
11465
+ * client, so this is the generic replacement: `disabled: !masonry.isSettled()` on the trigger, whatever the
11466
+ * client.
11467
+ */
11468
+ isSettled: _angular_core.Signal<boolean>;
11469
+ /**
11470
+ * Whether the container itself has changed width in the last moment — a window drag, a panel opening, a
11471
+ * sidebar collapsing. Items snap to their new columns while it is true instead of animating: the columns
11472
+ * change every frame of a drag, so a move transition would be restarted every frame and the items would
11473
+ * trail behind the layout they belong to.
11474
+ */
11475
+ isResizing: _angular_core.Signal<boolean>;
11476
+ constructor();
11477
+ /** @internal Where an item sits, or `null` before the first measurement. */
11478
+ placementOf(item: MasonryItemDirective): MasonryPlacement | null;
11479
+ /**
11480
+ * Re-balance the columns from scratch, as if the items had just arrived.
11481
+ *
11482
+ * Items keep the column they were first given for as long as the column count holds, because the
11483
+ * alternative is a grid that reshuffles itself whenever any one card changes height — expanding a
11484
+ * description would move cards two columns away. The cost is that heights which change a lot *after* the
11485
+ * first layout leave the columns less even than a fresh pack would, so this is the escape hatch: call it
11486
+ * after replacing the content wholesale, and the packing balances again. A resize that changes the column
11487
+ * count rebalances on its own.
11488
+ */
11489
+ repack(): void;
11490
+ /** @internal Called by an item while it exists. */
11491
+ registerItem(item: MasonryItemDirective): void;
11492
+ /** @internal */
11493
+ unregisterItem(item: MasonryItemDirective): void;
11494
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MasonryDirective, never>;
11495
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<MasonryDirective, "[etMasonry]", ["etMasonry"], { "columnWidth": { "alias": "columnWidth"; "required": false; "isSignal": true; }; "gap": { "alias": "gap"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
9925
11496
  }
9926
11497
 
9927
- declare class ProgressBarComponent {
9928
- value: _angular_core.InputSignalWithTransform<number, unknown>;
9929
- indeterminate: _angular_core.InputSignalWithTransform<boolean, unknown>;
9930
- clampedValue: _angular_core.Signal<number>;
9931
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<ProgressBarComponent, never>;
9932
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<ProgressBarComponent, "et-progress-bar", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "indeterminate": { "alias": "indeterminate"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
9933
- }
11498
+ declare const MASONRY_TOKEN: InjectionToken<MasonryDirective>;
9934
11499
 
9935
- declare class SpinnerComponent {
9936
- diameter: _angular_core.InputSignalWithTransform<number, unknown>;
9937
- strokeWidth: _angular_core.InputSignalWithTransform<number, unknown>;
9938
- track: _angular_core.InputSignalWithTransform<boolean, unknown>;
9939
- value: _angular_core.InputSignalWithTransform<number, unknown>;
9940
- determinate: _angular_core.InputSignalWithTransform<boolean, unknown>;
9941
- circleRadius: _angular_core.Signal<number>;
9942
- normalizedStrokeWidth: _angular_core.Signal<number>;
9943
- viewBox: _angular_core.Signal<string>;
9944
- strokeCircumference: _angular_core.Signal<number>;
9945
- circleStrokeWidth: _angular_core.Signal<number>;
9946
- clampedValue: _angular_core.Signal<number>;
9947
- determinateDashOffset: _angular_core.Signal<number>;
9948
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<SpinnerComponent, never>;
9949
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SpinnerComponent, "et-spinner", never, { "diameter": { "alias": "diameter"; "required": false; "isSignal": true; }; "strokeWidth": { "alias": "strokeWidth"; "required": false; "isSignal": true; }; "track": { "alias": "track"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "determinate": { "alias": "determinate"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
9950
- }
11500
+ declare const MASONRY_ERROR_CODES: {
11501
+ readonly PART_OUTSIDE_MASONRY: 3900;
11502
+ readonly MISSING_ITEMS: 3901;
11503
+ };
11504
+
11505
+ declare const MASONRY_IMPORTS: readonly [typeof MasonryDirective, typeof MasonryItemDirective];
9951
11506
 
9952
11507
  declare class NotificationActionDirective {
9953
11508
  private notification;
@@ -10093,11 +11648,6 @@ type NotificationManagerConfig = {
10093
11648
  * Uses the notification's status color when not set.
10094
11649
  */
10095
11650
  controlsColor?: string;
10096
- /**
10097
- * Accessible label for the dismiss button.
10098
- * @default 'Dismiss'
10099
- */
10100
- dismissLabel: string;
10101
11651
  };
10102
11652
  declare const DEFAULT_NOTIFICATION_MANAGER_CONFIG: NotificationManagerConfig;
10103
11653
  declare const provideNotificationManagerConfig: (valueOverride?: Partial<NotificationManagerConfig> | undefined) => _angular_core.Provider[];
@@ -10114,6 +11664,25 @@ declare const NOTIFICATION_ERROR_CODES: {
10114
11664
  readonly DISMISS_OUTSIDE_NOTIFICATION: 1701;
10115
11665
  };
10116
11666
 
11667
+ /** The strings a notification renders itself. Its message and actions are yours; dismissal is its own. */
11668
+ type NotificationLabels = {
11669
+ /** Accessible label for a notification's dismiss button. */
11670
+ dismiss: string;
11671
+ };
11672
+ /** The built-in English labels. */
11673
+ declare const DEFAULT_NOTIFICATION_LABELS: NotificationLabels;
11674
+ /**
11675
+ * Localize a notification's strings for everything below this injector, and read the set in effect here as a
11676
+ * signal. Partial — whatever you leave out keeps its {@link DEFAULT_NOTIFICATION_LABELS} value. See {@link createLabels}
11677
+ * for the shape, which every domain in this library shares.
11678
+ *
11679
+ * @example
11680
+ * provideNotificationLabels({ dismiss: 'Schließen' });
11681
+ */
11682
+ declare const provideNotificationLabels: (labels: _ethlete_core.LabelsSource<NotificationLabels>) => _angular_core.Provider;
11683
+ declare const injectNotificationLabels: () => _angular_core.Signal<NotificationLabels>;
11684
+ declare const NOTIFICATION_LABELS: _angular_core.InjectionToken<_ethlete_core.LabelsSource<NotificationLabels>>;
11685
+
10117
11686
  type NotificationEntry = {
10118
11687
  id: string;
10119
11688
  config: NotificationConfig;
@@ -10165,6 +11734,7 @@ declare class NotificationComponent {
10165
11734
  private provideTheme;
10166
11735
  private provideSurface;
10167
11736
  private managerConfig;
11737
+ private labels;
10168
11738
  private surfaceThemes;
10169
11739
  private surfaceContextTracker;
10170
11740
  private resolvedColor;
@@ -10289,7 +11859,7 @@ declare class OverlayContainerComponent {
10289
11859
  };
10290
11860
  component: _angular_core.InputSignal<Type<object>>;
10291
11861
  componentBindings: _angular_core.InputSignal<Binding[] | undefined>;
10292
- renderArrow: _angular_core.InputSignal<boolean>;
11862
+ renderArrow: _angular_core.InputSignalWithTransform<boolean, unknown>;
10293
11863
  private contentOutlet;
10294
11864
  animatedLifecycle: _angular_core.WritableSignal<AnimatedLifecycleDirective>;
10295
11865
  contentComponentRef: _angular_core.WritableSignal<ComponentRef<object> | null>;
@@ -10392,6 +11962,7 @@ declare const OVERLAY_ERROR_CODES: {
10392
11962
  readonly NESTED_OVERLAY_MAIN: 1206;
10393
11963
  readonly REF_OUTSIDE_OVERLAY: 1207;
10394
11964
  readonly MISSING_OVERLAY_MAIN: 1208;
11965
+ readonly MISSING_ANIMATION_ORIGIN: 1209;
10395
11966
  };
10396
11967
 
10397
11968
  declare const OVERLAY_FOOTER_TOKEN: InjectionToken<OverlayFooterDirective>;
@@ -11062,11 +12633,24 @@ declare const injectLeftSheetStrategy: {
11062
12633
  };
11063
12634
  declare const leftSheetOverlayStrategy: (config?: Partial<OverlayBreakpointConfig>) => (() => OverlayStrategyBreakpoint[]);
11064
12635
 
12636
+ /** The momentum a dismissing gesture had when the pointer let go, so the exit can carry it. */
12637
+ type DragDismissMomentum = {
12638
+ /** Release speed along the dismiss axis in px/s. Always positive. */
12639
+ speed: number;
12640
+ /** How far the overlay still has to travel to clear its docked edge, in px. */
12641
+ remainingDistance: number;
12642
+ };
11065
12643
  type DragToDismissContext = {
11066
12644
  element: HTMLElement;
11067
12645
  overlayRef: OverlayRef<object, unknown>;
11068
12646
  config: OverlayDragToDismissConfig;
11069
12647
  renderer: AngularRenderer;
12648
+ /**
12649
+ * Called immediately before the gesture closes the overlay, with the momentum of the release. The
12650
+ * sheet strategy uses it to give the leave transition the speed of the swipe instead of a fixed
12651
+ * duration — see `createSheetStrategy`.
12652
+ */
12653
+ onDismiss?: (momentum: DragDismissMomentum) => void;
11070
12654
  };
11071
12655
  type DragToDismissRef = {
11072
12656
  unsubscribe: () => void;
@@ -11216,11 +12800,10 @@ type PaginationLabels = {
11216
12800
  };
11217
12801
  /** The built-in English labels. */
11218
12802
  declare const DEFAULT_PAGINATION_LABELS: PaginationLabels;
11219
- /** The label set every paginator in this injector uses. @default DEFAULT_PAGINATION_LABELS */
11220
- declare const PAGINATION_LABELS: InjectionToken<PaginationLabels>;
11221
12803
  /**
11222
- * Localize the paginator's strings for everything below this injector. Partial — whatever you leave
11223
- * out keeps its {@link DEFAULT_PAGINATION_LABELS} value.
12804
+ * Localize the paginator's strings for everything below this injector, and read the set in effect
12805
+ * here as a signal. Partial — whatever you leave out keeps its {@link DEFAULT_PAGINATION_LABELS}
12806
+ * value. See {@link createLabels} for the shape, which every domain in this library shares.
11224
12807
  *
11225
12808
  * @example
11226
12809
  * providePaginationLabels({
@@ -11230,8 +12813,9 @@ declare const PAGINATION_LABELS: InjectionToken<PaginationLabels>;
11230
12813
  * range: ({ start, end, totalItems }) => `Zeige ${start}–${end} von ${totalItems}`,
11231
12814
  * });
11232
12815
  */
11233
- declare const providePaginationLabels: (labels: Partial<PaginationLabels>) => Provider;
11234
- declare const injectPaginationLabels: () => PaginationLabels;
12816
+ declare const providePaginationLabels: (labels: _ethlete_core.LabelsSource<PaginationLabels>) => _angular_core.Provider;
12817
+ declare const injectPaginationLabels: () => _angular_core.Signal<PaginationLabels>;
12818
+ declare const PAGINATION_LABELS: _angular_core.InjectionToken<_ethlete_core.LabelsSource<PaginationLabels>>;
11235
12819
 
11236
12820
  /** The kind of control a {@link PaginationItem} represents. */
11237
12821
  type PaginationItemType = 'first' | 'previous' | 'page' | 'ellipsis' | 'next' | 'last';
@@ -11282,15 +12866,15 @@ declare class PaginationDirective {
11282
12866
  /** The active page (1-based). Two-way bindable. */
11283
12867
  page: _angular_core.ModelSignal<number>;
11284
12868
  /** Total number of pages. */
11285
- totalPages: _angular_core.InputSignal<number>;
12869
+ totalPages: _angular_core.InputSignalWithTransform<number, unknown>;
11286
12870
  /** Pages shown on each side of the current page. @default 1 */
11287
- siblingCount: _angular_core.InputSignal<number>;
12871
+ siblingCount: _angular_core.InputSignalWithTransform<number, unknown>;
11288
12872
  /** Pages shown at each edge before an ellipsis. @default 1 */
11289
- boundaryCount: _angular_core.InputSignal<number>;
12873
+ boundaryCount: _angular_core.InputSignalWithTransform<number, unknown>;
11290
12874
  /** Omit the first/last jump controls. @default false */
11291
- hideFirstLast: _angular_core.InputSignal<boolean>;
12875
+ hideFirstLast: _angular_core.InputSignalWithTransform<boolean, unknown>;
11292
12876
  /** Omit the previous/next controls. @default false */
11293
- hidePreviousNext: _angular_core.InputSignal<boolean>;
12877
+ hidePreviousNext: _angular_core.InputSignalWithTransform<boolean, unknown>;
11294
12878
  /**
11295
12879
  * Accessible label for the navigation landmark. `null` (the default) uses the resolved
11296
12880
  * {@link PaginationLabels}' `navigation` label — set this only to distinguish one paginator from
@@ -11384,7 +12968,7 @@ declare class PaginationComponent {
11384
12968
  /** Items per page, used to compute the readout range. */
11385
12969
  pageSize: _angular_core.InputSignal<number | null>;
11386
12970
  /** Show a jump-to-page number field (useful for very large page counts). @default false */
11387
- showJumpTo: _angular_core.InputSignal<boolean>;
12971
+ showJumpTo: _angular_core.InputSignalWithTransform<boolean, unknown>;
11388
12972
  private listEl;
11389
12973
  private itemEls;
11390
12974
  private hostDimensions;
@@ -11484,6 +13068,227 @@ declare class PaginationSeoDirective {
11484
13068
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<PaginationSeoDirective, "[etPaginationSeo]", never, { "urlForPage": { "alias": "etPaginationSeo"; "required": false; "isSignal": true; }; "pageTitle": { "alias": "pageTitle"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
11485
13069
  }
11486
13070
 
13071
+ /**
13072
+ * One candidate set for a `<picture>`, i.e. one `<source>` element.
13073
+ *
13074
+ * @see https://web.dev/learn/design/responsive-images
13075
+ */
13076
+ type PictureSource = {
13077
+ /**
13078
+ * The image's mime type, e.g. `image/webp`. Inferred from the URL when omitted; a URL it can't be
13079
+ * inferred from logs an error in dev mode rather than throwing, since the browser copes without it.
13080
+ */
13081
+ type?: string | null;
13082
+ /**
13083
+ * A single URL, or a comma-separated candidate list with descriptors.
13084
+ *
13085
+ * With **width** descriptors (`400w`) you must also give `sizes`, or the browser has no way to know how
13086
+ * much of the viewport the image will occupy. With **density** descriptors (`2x`) you must not — the
13087
+ * browser picks by device pixel ratio. The two forms can't be mixed in one srcset.
13088
+ *
13089
+ * @example 'https://example.com/hero.jpg'
13090
+ * @example 'https://example.com/hero.jpg 1x, https://example.com/hero@2x.jpg 2x'
13091
+ * @example 'https://example.com/hero-400.jpg 400w, https://example.com/hero-800.jpg 800w'
13092
+ */
13093
+ srcset: string;
13094
+ /**
13095
+ * How much space the image will take, so the browser can pick a candidate before it has laid the page
13096
+ * out. Only meaningful alongside width descriptors. Falls back to the picture's own `sizes`.
13097
+ *
13098
+ * @example '100vw'
13099
+ * @example '(min-width: 800px) 50vw, 100vw'
13100
+ */
13101
+ sizes?: string | null;
13102
+ /**
13103
+ * The media query this source applies to — this is what makes art direction possible, as opposed to
13104
+ * merely picking a resolution.
13105
+ *
13106
+ * @example '(min-width: 800px)'
13107
+ * @example '(orientation: portrait)'
13108
+ */
13109
+ media?: string | null;
13110
+ };
13111
+ type PictureConfig = {
13112
+ /**
13113
+ * Prefixed onto every relative `srcset` entry, so sources can be authored as API paths. Absolute URLs
13114
+ * and `data:` URIs are left alone.
13115
+ */
13116
+ baseUrl?: string;
13117
+ };
13118
+ /** Where the `<img>` has got to. `'loading'` until the browser reports either way. */
13119
+ declare const PICTURE_STATES: {
13120
+ readonly LOADING: "loading";
13121
+ readonly LOADED: "loaded";
13122
+ readonly ERROR: "error";
13123
+ };
13124
+ type PictureState = (typeof PICTURE_STATES)[keyof typeof PICTURE_STATES];
13125
+
13126
+ /**
13127
+ * App- or route-wide picture defaults. Provide it where the media host is known — usually the app config, or
13128
+ * a route that talks to a different CDN.
13129
+ *
13130
+ * @example
13131
+ * providers: [providePictureConfig({ baseUrl: 'https://cdn.example.com' })]
13132
+ */
13133
+ declare const providePictureConfig: (valueOverride?: Partial<PictureConfig> | undefined) => _angular_core.Provider[];
13134
+ declare const injectPictureConfig: {
13135
+ (): PictureConfig;
13136
+ (options: _angular_core.InjectOptions & {
13137
+ optional?: false;
13138
+ }): PictureConfig;
13139
+ (options: _angular_core.InjectOptions): PictureConfig | null;
13140
+ };
13141
+
13142
+ /**
13143
+ * What to show while the image is still loading — a blurred `data:` URI, a solid block, a
13144
+ * [skeleton](/components/skeleton). Optional; without it the space simply stays empty.
13145
+ *
13146
+ * @example
13147
+ * <ng-template etPicturePlaceholder><et-skeleton-item shape="rect" /></ng-template>
13148
+ */
13149
+ declare class PicturePlaceholderDirective {
13150
+ templateRef: TemplateRef<void>;
13151
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PicturePlaceholderDirective, never>;
13152
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<PicturePlaceholderDirective, "ng-template[etPicturePlaceholder]", never, {}, {}, never, never, true, never>;
13153
+ }
13154
+ /**
13155
+ * What to show when the image fails to load. Optional — without it a broken image renders as the browser's
13156
+ * broken-image icon, which is rarely what a page wants.
13157
+ *
13158
+ * @example
13159
+ * <ng-template etPictureError><p>This image is unavailable.</p></ng-template>
13160
+ */
13161
+ declare class PictureErrorDirective {
13162
+ templateRef: TemplateRef<void>;
13163
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PictureErrorDirective, never>;
13164
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<PictureErrorDirective, "ng-template[etPictureError]", never, {}, {}, never, never, true, never>;
13165
+ }
13166
+
13167
+ /**
13168
+ * A responsive image: `<figure><picture><source…><img></picture><figcaption></figure>` from a list of sources.
13169
+ *
13170
+ * Two different jobs share the one element, and it is worth knowing which one you are doing. Several
13171
+ * candidates in a **single** source's `srcset` is *resolution switching* — the same picture at several sizes,
13172
+ * and the browser picks. Several **sources** with `media` queries is *art direction* — a different crop for a
13173
+ * phone than for a desktop, which no `srcset` can express. `type` on a source is a third axis: offer AVIF
13174
+ * before JPEG and a browser that can't decode it skips to the next without downloading anything.
13175
+ *
13176
+ * Reserve the space the image will occupy — `width`/`height`, or `aspectRatio` when only the ratio is known —
13177
+ * or the page will shift when it loads.
13178
+ *
13179
+ * @example
13180
+ * <et-picture
13181
+ * [sources]="[
13182
+ * { srcset: 'hero-wide.avif', media: '(min-width: 800px)' },
13183
+ * { srcset: 'hero-tall.avif' },
13184
+ * ]"
13185
+ * defaultSrc="hero.jpg"
13186
+ * alt="The stadium at kickoff"
13187
+ * [aspectRatio]="16 / 9"
13188
+ * />
13189
+ */
13190
+ declare class PictureComponent {
13191
+ private config;
13192
+ /**
13193
+ * The `<source>` candidates, in the order the browser should consider them — first match wins, so put the
13194
+ * most specific `media` and the most modern `type` first. A plain string is shorthand for
13195
+ * `{ srcset: theString }`.
13196
+ */
13197
+ sources: _angular_core.InputSignal<(string | PictureSource)[]>;
13198
+ /**
13199
+ * The `<img>` behind the sources: what a browser loads when no `<source>` matched, and the element every
13200
+ * `<picture>` needs — a `<picture>` with no `<img>` renders nothing at all. Give it the most compatible
13201
+ * format you have.
13202
+ */
13203
+ defaultSrc: _angular_core.InputSignal<string | PictureSource | null>;
13204
+ /**
13205
+ * The image's alternative text. **Required**, because an image without it is invisible to a screen reader
13206
+ * and unaccounted for by a linter — pass `''` for a decorative image, which is a deliberate statement that
13207
+ * it carries no information.
13208
+ */
13209
+ alt: _angular_core.InputSignal<string>;
13210
+ /** A visible caption, rendered as `<figcaption>` after the image. Omit for an image that needs none. */
13211
+ figcaption: _angular_core.InputSignal<string | null>;
13212
+ /**
13213
+ * Load this image eagerly and at high priority, instead of lazily. For the one image that is the largest
13214
+ * thing in the initial viewport (a hero, a header) — it is usually the page's Largest Contentful Paint, and
13215
+ * lazy-loading it delays the metric it defines. Never for images below the fold. @default false
13216
+ */
13217
+ priority: _angular_core.InputSignalWithTransform<boolean, unknown>;
13218
+ /**
13219
+ * The image's intrinsic width in px, set as the `width` attribute. Together with `height` this reserves the
13220
+ * space before the image arrives, which is what stops the page shifting.
13221
+ */
13222
+ width: _angular_core.InputSignalWithTransform<number | null, unknown>;
13223
+ /** The image's intrinsic height in px, set as the `height` attribute. */
13224
+ height: _angular_core.InputSignalWithTransform<number | null, unknown>;
13225
+ /**
13226
+ * The ratio to hold the image's box at, e.g. `16 / 9`. The alternative to `width`/`height` for a responsive
13227
+ * image whose rendered size is decided by CSS: one number reserves the space in a layout where the pixel
13228
+ * dimensions are not known in advance.
13229
+ */
13230
+ aspectRatio: _angular_core.InputSignal<string | number | null>;
13231
+ /**
13232
+ * How much space the image will occupy, for sources using width descriptors. Takes the attribute's own
13233
+ * comma-separated form, or an array of its parts, which is easier to read.
13234
+ *
13235
+ * @example [sizes]="['(min-width: 800px) 50vw', '100vw']"
13236
+ */
13237
+ sizes: _angular_core.InputSignalWithTransform<string | null, string | string[] | null | undefined>;
13238
+ /** The image finished loading. */
13239
+ imgLoad: _angular_core.OutputEmitterRef<void>;
13240
+ /** The image failed to load — a dead URL, a network error, an undecodable file. */
13241
+ imgError: _angular_core.OutputEmitterRef<void>;
13242
+ protected placeholder: _angular_core.Signal<PicturePlaceholderDirective | undefined>;
13243
+ protected errorSlot: _angular_core.Signal<PictureErrorDirective | undefined>;
13244
+ protected resolvedSources: _angular_core.Signal<PictureSource[]>;
13245
+ protected resolvedDefaultSource: _angular_core.Signal<PictureSource | null>;
13246
+ /** The `src` for the fallback `<img>`, which needs a single URL rather than a candidate list. */
13247
+ protected defaultSrcUrl: _angular_core.Signal<string | null>;
13248
+ /**
13249
+ * Reset by the source it describes: a picture pointed at a new URL is loading again, and a state that
13250
+ * stayed `'loaded'` would leave the placeholder hidden for the second image.
13251
+ */
13252
+ private loadState;
13253
+ /**
13254
+ * Where the image has got to, as a signal rather than only a pair of events — so a template can react to it
13255
+ * without keeping its own copy. Also on the host as `data-state`, for styling.
13256
+ */
13257
+ state: _angular_core.Signal<PictureState>;
13258
+ protected markLoaded(): void;
13259
+ protected markFailed(): void;
13260
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PictureComponent, never>;
13261
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PictureComponent, "et-picture", never, { "sources": { "alias": "sources"; "required": false; "isSignal": true; }; "defaultSrc": { "alias": "defaultSrc"; "required": false; "isSignal": true; }; "alt": { "alias": "alt"; "required": true; "isSignal": true; }; "figcaption": { "alias": "figcaption"; "required": false; "isSignal": true; }; "priority": { "alias": "priority"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "aspectRatio": { "alias": "aspectRatio"; "required": false; "isSignal": true; }; "sizes": { "alias": "sizes"; "required": false; "isSignal": true; }; }, { "imgLoad": "imgLoad"; "imgError": "imgError"; }, ["placeholder", "errorSlot"], never, true, never>;
13262
+ }
13263
+
13264
+ declare const PICTURE_IMPORTS: readonly [typeof PictureComponent, typeof PicturePlaceholderDirective, typeof PictureErrorDirective];
13265
+
13266
+ /**
13267
+ * The first URL out of a srcset, for the `<img src>` fallback a `<picture>` still needs — a browser that
13268
+ * matches no `<source>` (or doesn't support `<picture>` at all) loads the `img`.
13269
+ *
13270
+ * Descriptors are stripped, and a `data:` URI is returned whole rather than split on its commas — base64
13271
+ * payloads contain them, so treating one as a candidate list would truncate the image.
13272
+ */
13273
+ declare const extractFirstImageUrl: (source: string | PictureSource | null) => string | null;
13274
+ /**
13275
+ * A source in its full form, with the mime type filled in from the URL where it wasn't given. The type is
13276
+ * what lets a browser skip a `<source>` it can't decode without downloading it, so it is worth inferring —
13277
+ * but a URL that carries no extension (a signed CDN URL, an API endpoint) can't be inferred from, which
13278
+ * warns in dev rather than throwing: the browser will simply try the source.
13279
+ */
13280
+ declare const normalizePictureSource: (source: string | PictureSource) => PictureSource;
13281
+ /** `sizes` as the attribute wants it. An array is the readable way to author one, so both forms are taken. */
13282
+ declare const normalizePictureSizes: (sizes: string | string[] | null | undefined) => string | null;
13283
+ /**
13284
+ * A source with the configured `baseUrl` applied, so sources can be authored as the paths an API returns.
13285
+ *
13286
+ * Applied **per candidate**, which is what makes a relative multi-candidate srcset work: cdk prefixed the
13287
+ * srcset as one string, so `'a.jpg 1x, b.jpg 2x'` left the second candidate unresolved. A `data:` URI is
13288
+ * passed through whole — its base64 payload contains commas, so it is not a candidate list.
13289
+ */
13290
+ declare const withPictureBaseUrl: (source: PictureSource, config: PictureConfig | null) => PictureSource;
13291
+
11487
13292
  type JsonKind = 'string' | 'number' | 'boolean' | 'null' | 'undefined' | 'array' | 'object';
11488
13293
  /**
11489
13294
  * A recursive, collapsible, searchable JSON tree used by the query devtools value explorer. Renders
@@ -11493,7 +13298,7 @@ type JsonKind = 'string' | 'number' | 'boolean' | 'null' | 'undefined' | 'array'
11493
13298
  declare class QueryDevtoolsJsonComponent {
11494
13299
  value: _angular_core.InputSignal<unknown>;
11495
13300
  nodeKey: _angular_core.InputSignal<string | null>;
11496
- depth: _angular_core.InputSignal<number>;
13301
+ depth: _angular_core.InputSignalWithTransform<number, unknown>;
11497
13302
  /** Lowercased search term; when set, the tree auto-expands and matches are highlighted. */
11498
13303
  search: _angular_core.InputSignal<string>;
11499
13304
  /** Full path of this node from the explorer root, used as the key for persisted expansion. */
@@ -11513,13 +13318,22 @@ declare class QueryDevtoolsJsonComponent {
11513
13318
  private localExpanded;
11514
13319
  protected expanded: _angular_core.Signal<boolean>;
11515
13320
  protected effectiveExpanded: _angular_core.Signal<boolean>;
13321
+ protected copied: _angular_core.WritableSignal<boolean>;
13322
+ private copiedReset$;
13323
+ protected copyLabel: _angular_core.Signal<string>;
11516
13324
  protected preview: _angular_core.Signal<string>;
11517
13325
  protected display: _angular_core.Signal<string>;
11518
13326
  protected keyHit: _angular_core.Signal<boolean>;
11519
13327
  protected valueHit: _angular_core.Signal<boolean>;
13328
+ constructor();
11520
13329
  protected childPath(key: string): string;
11521
13330
  protected toggle(): void;
13331
+ /**
13332
+ * Containers copy their whole subtree as JSON; leaves copy something pasteable — a raw string
13333
+ * without the display quotes, so an id or url can go straight into a search box.
13334
+ */
11522
13335
  protected copyValue(): void;
13336
+ private flagCopied;
11523
13337
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<QueryDevtoolsJsonComponent, never>;
11524
13338
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<QueryDevtoolsJsonComponent, "et-query-devtools-json", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "nodeKey": { "alias": "nodeKey"; "required": false; "isSignal": true; }; "depth": { "alias": "depth"; "required": false; "isSignal": true; }; "search": { "alias": "search"; "required": false; "isSignal": true; }; "path": { "alias": "path"; "required": false; "isSignal": true; }; "expandedPaths": { "alias": "expandedPaths"; "required": false; "isSignal": true; }; "collapsedPaths": { "alias": "collapsedPaths"; "required": false; "isSignal": true; }; "toggleFn": { "alias": "toggleFn"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
11525
13339
  }
@@ -11532,6 +13346,7 @@ declare class QueryDevtoolsJsonComponent {
11532
13346
  */
11533
13347
  declare class QueryDevtoolsToggleComponent {
11534
13348
  openChange: _angular_core.OutputEmitterRef<void>;
13349
+ protected shortcut: string;
11535
13350
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<QueryDevtoolsToggleComponent, never>;
11536
13351
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<QueryDevtoolsToggleComponent, "et-query-devtools-toggle", never, {}, { "openChange": "openChange"; }, never, never, true, never>;
11537
13352
  }
@@ -11586,6 +13401,7 @@ declare class QueryDevtoolsComponent {
11586
13401
  id: "events";
11587
13402
  label: string;
11588
13403
  })[];
13404
+ protected readonly shortcut: string;
11589
13405
  protected open: _angular_core.WritableSignal<boolean>;
11590
13406
  protected panelHeight: _angular_core.WritableSignal<number>;
11591
13407
  protected resizing: _angular_core.WritableSignal<boolean>;
@@ -11743,6 +13559,257 @@ declare class QueryDevtoolsComponent {
11743
13559
 
11744
13560
  declare const QUERY_DEVTOOLS_IMPORTS: readonly [typeof QueryDevtoolsComponent];
11745
13561
 
13562
+ /**
13563
+ * What the directive needs from a query in order to retry it: something executable. Both query clients satisfy
13564
+ * it — the current client's `Query` directly, and a legacy one through
13565
+ * [`legacyQueryErrorSource`](./query-error-legacy).
13566
+ *
13567
+ * Typed structurally rather than against `Query<TArgs>` so this component never has to name a client's types,
13568
+ * which is what kept cdk's version pinned to the legacy one.
13569
+ */
13570
+ type QueryErrorRetryTarget = {
13571
+ execute: (executeArgs?: {
13572
+ options?: {
13573
+ allowCache?: boolean;
13574
+ };
13575
+ }) => unknown;
13576
+ };
13577
+ /** A query error, ready to render. */
13578
+ type QueryErrorView = {
13579
+ /** The heading — from the status code, since that is the one thing every error has. */
13580
+ title: string;
13581
+ /** Every message the response carried, or one derived from the status code when it carried none. */
13582
+ messages: string[];
13583
+ /** Whether to render the messages as a list. True for a violation list, i.e. more than one message. */
13584
+ isList: boolean;
13585
+ /** Whether the failure is one the retry policy considers worth repeating. */
13586
+ canRetry: boolean;
13587
+ /** How long the retry policy would wait, in ms. `0` when it wouldn't retry at all. */
13588
+ retryDelay: number;
13589
+ /** The HTTP status, or `0` for a failure that never reached a server. */
13590
+ status: number;
13591
+ };
13592
+
13593
+ /** What a slot template is handed: the error, already worked out. */
13594
+ type QueryErrorSlotContext = {
13595
+ $implicit: QueryErrorView;
13596
+ error: QueryErrorView;
13597
+ };
13598
+ /**
13599
+ * Replaces the title. The error is in scope, so a title can key off the status — "You are signed out" reads
13600
+ * better for a 401 than the generic table entry does.
13601
+ *
13602
+ * @example
13603
+ * <ng-template etQueryErrorTitle let-error>
13604
+ * {{ error.status === 401 ? 'You are signed out' : error.title }}
13605
+ * </ng-template>
13606
+ */
13607
+ declare class QueryErrorTitleDirective {
13608
+ templateRef: TemplateRef<QueryErrorSlotContext>;
13609
+ constructor();
13610
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<QueryErrorTitleDirective, never>;
13611
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<QueryErrorTitleDirective, "ng-template[etQueryErrorTitle]", never, {}, {}, never, never, true, never>;
13612
+ }
13613
+ /**
13614
+ * Replaces the actions row, retry button included. For adding a "contact support" link, or for a recovery that
13615
+ * isn't a retry — the retry itself stays available as `queryError.retry()`.
13616
+ *
13617
+ * @example
13618
+ * <ng-template etQueryErrorActions>
13619
+ * <button (click)="queryError.retry()" et-button>Try again</button>
13620
+ * <a routerLink="/support">Contact support</a>
13621
+ * </ng-template>
13622
+ */
13623
+ declare class QueryErrorActionsDirective {
13624
+ templateRef: TemplateRef<QueryErrorSlotContext>;
13625
+ constructor();
13626
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<QueryErrorActionsDirective, never>;
13627
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<QueryErrorActionsDirective, "ng-template[etQueryErrorActions]", never, {}, {}, never, never, true, never>;
13628
+ }
13629
+
13630
+ /**
13631
+ * Every string a query error renders. Two of them are functions of the HTTP status, because that is the only
13632
+ * thing there is to go on when a response carries no message of its own.
13633
+ *
13634
+ * Defaults come from `@ethlete/query`'s status tables, in English or German depending on
13635
+ * [`injectLocale()`](/core/providers) — so a localized app needs no configuration here at all. Override
13636
+ * app-wide with {@link provideQueryErrorLabels}, or per instance via the `labels` input.
13637
+ */
13638
+ type QueryErrorLabels = {
13639
+ /** The heading for a status code, e.g. `'Not found'`. */
13640
+ title: (status: number) => string;
13641
+ /**
13642
+ * The message for a status code. Used when the response carried none of its own, and as the replacement when
13643
+ * the response's only message merely repeats the title.
13644
+ */
13645
+ message: (status: number) => string;
13646
+ /** The retry button's label. */
13647
+ retry: string;
13648
+ };
13649
+ /** The built-in English labels. */
13650
+ declare const DEFAULT_QUERY_ERROR_LABELS: QueryErrorLabels;
13651
+ /** The built-in German labels, used when the current locale is a German one. */
13652
+ declare const GERMAN_QUERY_ERROR_LABELS: QueryErrorLabels;
13653
+ /**
13654
+ * The label set for a locale. Only English and German ship with the SDK, since those are the only status
13655
+ * tables `@ethlete/query` carries; any other locale needs {@link provideQueryErrorLabels}.
13656
+ */
13657
+ declare const queryErrorLabelsForLocale: (locale: string) => QueryErrorLabels;
13658
+ /**
13659
+ * Localize a query error's strings for everything below this injector, and read the set in effect here as a
13660
+ * signal. Partial — whatever you leave out keeps the value the current locale gives it, so this is also how you
13661
+ * localize into a third language while keeping English or German as the base. See {@link createLabels} for the
13662
+ * shape, which every domain in this library shares.
13663
+ *
13664
+ * @example
13665
+ * provideQueryErrorLabels({ retry: 'Réessayer', title: () => 'Une erreur est survenue' });
13666
+ */
13667
+ declare const provideQueryErrorLabels: (labels: _ethlete_core.LabelsSource<QueryErrorLabels>) => _angular_core.Provider;
13668
+ declare const injectQueryErrorLabels: () => _angular_core.Signal<QueryErrorLabels>;
13669
+ declare const QUERY_ERROR_LABELS: _angular_core.InjectionToken<_ethlete_core.LabelsSource<QueryErrorLabels>>;
13670
+
13671
+ /**
13672
+ * Turns a failed query into something renderable: a title, the messages, and whether retrying is worth
13673
+ * offering. All state, no markup — `<et-query-error>` is this with the chrome on top.
13674
+ *
13675
+ * The classification work is not here, deliberately. `@ethlete/query` already normalizes every error shape it
13676
+ * knows (class-validator arrays, Symfony violation lists, a bare `{ message }`, a plain string) into
13677
+ * `QueryErrorResponse` before it reaches `query.error()`, and it attaches the retry policy's verdict as
13678
+ * `retryState`. cdk re-did all of that by hand against the legacy client; this reads what the client already
13679
+ * worked out, which is why it is client-agnostic.
13680
+ *
13681
+ * @example
13682
+ * @if (usersQuery.error(); as error) {
13683
+ * <div etQueryError [error]="error" [query]="usersQuery">…</div>
13684
+ * }
13685
+ */
13686
+ declare class QueryErrorDirective {
13687
+ private injectedLabels;
13688
+ /**
13689
+ * The failed query's error, i.e. `query.error()`. `null` renders nothing, so this can be bound
13690
+ * unconditionally.
13691
+ */
13692
+ error: _angular_core.InputSignal<QueryErrorResponse | null>;
13693
+ /**
13694
+ * The query to re-run when the reader retries. Optional: without it the retry button still renders (when the
13695
+ * error is retryable) and only emits `retry`, which is the hook for a legacy query or any other recovery.
13696
+ */
13697
+ query: _angular_core.InputSignal<QueryErrorRetryTarget | null>;
13698
+ /**
13699
+ * Show the retry button even for an error the retry policy considers final — a 404 will not fix itself, and
13700
+ * offering to try again invites the reader to waste their time. Turn it on for a query whose failure really
13701
+ * can be transient in a way the policy can't see. @default false
13702
+ */
13703
+ alwaysAllowRetry: _angular_core.InputSignalWithTransform<boolean, unknown>;
13704
+ /** Per-instance label overrides, merged over the locale's set and any `provideQueryErrorLabels`. */
13705
+ labels: _angular_core.InputSignal<Partial<QueryErrorLabels> | null>;
13706
+ /**
13707
+ * The reader asked to retry. Fires whether or not `query` is set, and after the query has been re-executed
13708
+ * when it is — so it doubles as "retried" for analytics.
13709
+ */
13710
+ retryRequest: _angular_core.OutputEmitterRef<void>;
13711
+ /** @internal Set by `etQueryErrorTitle`; replaces the default heading. */
13712
+ titleSlot: _angular_core.WritableSignal<TemplateRef<QueryErrorSlotContext> | null>;
13713
+ /** @internal Set by `etQueryErrorActions`; replaces the whole actions row. */
13714
+ actionsSlot: _angular_core.WritableSignal<TemplateRef<QueryErrorSlotContext> | null>;
13715
+ /** The strings in effect: the locale's set, with the injected and per-instance overrides applied. */
13716
+ resolvedLabels: _angular_core.Signal<QueryErrorLabels>;
13717
+ /** The error as something to render, or `null` when there is no error. */
13718
+ view: _angular_core.Signal<QueryErrorView | null>;
13719
+ /** Whether to offer a retry — false when there is no error at all. */
13720
+ canRetry: _angular_core.Signal<boolean>;
13721
+ /**
13722
+ * Re-run the query and tell the world. Bypasses the cache: a retry exists because the last answer was
13723
+ * unusable, so serving it again from memory would make the button do nothing.
13724
+ */
13725
+ retry(): void;
13726
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<QueryErrorDirective, never>;
13727
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<QueryErrorDirective, "[etQueryError]", ["etQueryError"], { "error": { "alias": "error"; "required": true; "isSignal": true; }; "query": { "alias": "query"; "required": false; "isSignal": true; }; "alwaysAllowRetry": { "alias": "alwaysAllowRetry"; "required": false; "isSignal": true; }; "labels": { "alias": "labels"; "required": false; "isSignal": true; }; }, { "retryRequest": "retryRequest"; }, never, never, true, never>;
13728
+ }
13729
+
13730
+ declare const QUERY_ERROR_TOKEN: InjectionToken<QueryErrorDirective>;
13731
+
13732
+ declare const QUERY_ERROR_ERROR_CODES: {
13733
+ readonly PART_OUTSIDE_QUERY_ERROR: 4000;
13734
+ };
13735
+
13736
+ /**
13737
+ * A legacy `RequestError` as the current client's `QueryErrorResponse`.
13738
+ *
13739
+ * Nearly free, because a legacy error carries the raw `HttpErrorResponse` it came from — so the current
13740
+ * client's own normalizer does the classifying, and a legacy error is described by exactly the same code, and
13741
+ * judged by the same retry policy, as a current one. That is the point of the adapter: no second
13742
+ * classification path to keep in step.
13743
+ */
13744
+ declare const queryErrorResponseFromLegacyError: (error: RequestError) => QueryErrorResponse;
13745
+ type LegacyQueryErrorSource = {
13746
+ /** Bind to `<et-query-error [error]="…">`. */
13747
+ error: Signal<QueryErrorResponse | null>;
13748
+ /** Re-runs the legacy query, bypassing its cache. */
13749
+ retry: () => void;
13750
+ /** Bind to `<et-query-error [query]="…">` to have the retry button call `retry` for you. */
13751
+ retryTarget: QueryErrorRetryTarget;
13752
+ };
13753
+ /**
13754
+ * Bridges a legacy query into `<et-query-error>`, so an app still on the V2 client gets the components-lib
13755
+ * error UI without the component ever naming a legacy type.
13756
+ *
13757
+ * A separate adapter rather than a union-typed input — the same split as the select and table query adapters —
13758
+ * so the component's API describes one client, and this file is the only thing to delete when the last legacy
13759
+ * query is gone.
13760
+ *
13761
+ * The error is passed in rather than read off the query because legacy query state is an `Observable`, not a
13762
+ * signal: how you get from `state$` to a signal is the app's choice (`toSignal`, a store, an `async` pipe
13763
+ * feeding an input), and this adapter should not make it for you.
13764
+ *
13765
+ * @example
13766
+ * private legacyUsers = legacyQueryErrorSource({
13767
+ * error: toSignal(this.usersQuery.state$.pipe(map((s) => (isQueryStateFailure(s) ? s.error : null)))),
13768
+ * query: () => this.usersQuery,
13769
+ * });
13770
+ *
13771
+ * // template:
13772
+ * @if (legacyUsers.error(); as error) {
13773
+ * <et-query-error [error]="error" [query]="legacyUsers.retryTarget" />
13774
+ * }
13775
+ */
13776
+ declare const legacyQueryErrorSource: (config: {
13777
+ error: () => RequestError | null | undefined;
13778
+ query?: () => AnyV2Query | AnyLegacyQuery | AnyQueryCollection | null | undefined;
13779
+ }) => LegacyQueryErrorSource;
13780
+
13781
+ /**
13782
+ * The default rendering of a failed query: a heading from the status, the message (or the violation list), and a
13783
+ * retry button when the failure is one worth repeating.
13784
+ *
13785
+ * Render it conditionally on the error, which is also what makes the `role="alert"` announce:
13786
+ *
13787
+ * @example
13788
+ * @if (usersQuery.error(); as error) {
13789
+ * <et-query-error [error]="error" [query]="usersQuery" />
13790
+ * }
13791
+ *
13792
+ * Both the title and the whole actions row are replaceable via `etQueryErrorTitle` / `etQueryErrorActions`, so
13793
+ * an app can key the wording off the status or add a support link without forking the component.
13794
+ */
13795
+ declare class QueryErrorComponent {
13796
+ /** @internal Read from the template; also the handle for a consumer reaching in with `viewChild`. */
13797
+ queryError: QueryErrorDirective;
13798
+ private provideColor;
13799
+ private errorTheme;
13800
+ /**
13801
+ * The colour theme for the panel and its retry button. Defaults to the app's `type: 'error'` theme, which is
13802
+ * what makes an error look like one — override for a failure that shouldn't read as alarming (a cancelled
13803
+ * request, an empty search).
13804
+ */
13805
+ color: _angular_core.InputSignal<string | ColorTheme | null>;
13806
+ constructor();
13807
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<QueryErrorComponent, never>;
13808
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<QueryErrorComponent, "et-query-error", never, { "color": { "alias": "color"; "required": false; "isSignal": true; }; }, {}, never, never, true, [{ directive: typeof QueryErrorDirective; inputs: { "error": "error"; "query": "query"; "alwaysAllowRetry": "alwaysAllowRetry"; "labels": "labels"; }; outputs: { "retryRequest": "retryRequest"; }; }, { directive: typeof _ethlete_core.ProvideColorDirective; inputs: {}; outputs: {}; }]>;
13809
+ }
13810
+
13811
+ declare const QUERY_ERROR_IMPORTS: readonly [typeof QueryErrorComponent, typeof QueryErrorDirective, typeof QueryErrorTitleDirective, typeof QueryErrorActionsDirective];
13812
+
11746
13813
  /** The common placeholder shapes. Anything else is your own CSS on the item. */
11747
13814
  type SkeletonShape = 'text' | 'rect' | 'circle';
11748
13815
  /**
@@ -11797,17 +13864,21 @@ declare class SkeletonTextComponent {
11797
13864
  * </et-skeleton>
11798
13865
  */
11799
13866
  declare class SkeletonComponent {
13867
+ private labels;
11800
13868
  /**
11801
13869
  * What a screen reader announces in place of the shapes, which are `aria-hidden` — they carry no
11802
- * information, and reading "loading" once is the whole message.
13870
+ * information, and reading "loading" once is the whole message. `null` (the default) uses
13871
+ * `LOADER_LABELS`' `loadingContent`; set it for something more specific ("Loading results").
11803
13872
  */
11804
- loadingAllyText: _angular_core.InputSignal<string>;
13873
+ loadingAllyText: _angular_core.InputSignal<string | null>;
11805
13874
  /**
11806
13875
  * Run the shimmer. Off leaves a static placeholder — the same shapes without motion, which is what
11807
13876
  * you want inside something that already animates (an opening panel), or on a very long list.
11808
13877
  * Independent of `prefers-reduced-motion`, which drops the shimmer regardless. @default true
11809
13878
  */
11810
13879
  animated: _angular_core.InputSignalWithTransform<boolean, unknown>;
13880
+ /** The announcement in effect: this instance's `loadingAllyText`, else `LOADER_LABELS`. */
13881
+ protected resolvedLoadingAllyText: _angular_core.Signal<string>;
11811
13882
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SkeletonComponent, never>;
11812
13883
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<SkeletonComponent, "et-skeleton", never, { "loadingAllyText": { "alias": "loadingAllyText"; "required": false; "isSignal": true; }; "animated": { "alias": "animated"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
11813
13884
  }
@@ -11835,22 +13906,11 @@ declare class StreamConsentDirective {
11835
13906
  }
11836
13907
 
11837
13908
  type StreamConsentConfig = {
11838
- /** The heading displayed in the consent placeholder. */
11839
- heading: string;
11840
- /** The description text displayed below the heading. */
11841
- description: string;
11842
- /** The label for the accept button. */
11843
- acceptLabel: string;
11844
13909
  /**
11845
13910
  * The color theme name to apply on the accept button.
11846
13911
  * When set, applies `[etProvideColor]` on the button element.
11847
13912
  */
11848
13913
  acceptButtonColor: string | null;
11849
- /**
11850
- * A function to transform text based on the current locale.
11851
- * Use `provideLocale()` to update the locale dynamically.
11852
- */
11853
- transformer: (text: string, locale: string) => string;
11854
13914
  };
11855
13915
  declare const provideStreamConsentConfig: (valueOverride?: Partial<StreamConsentConfig> | undefined) => _angular_core.Provider[];
11856
13916
  declare const injectStreamConsentConfig: {
@@ -11864,7 +13924,7 @@ declare const injectStreamConsentConfig: {
11864
13924
  declare class StreamConsentComponent {
11865
13925
  private parentSurfaceProvider;
11866
13926
  private config;
11867
- private locale;
13927
+ private labels;
11868
13928
  private surfaceThemes;
11869
13929
  protected readonly HEADING_ID: string;
11870
13930
  cardSurface: _angular_core.Signal<string | null>;
@@ -11889,22 +13949,11 @@ declare class StreamPlayerErrorDirective {
11889
13949
  }
11890
13950
 
11891
13951
  type StreamPlayerErrorConfig = {
11892
- /** The heading displayed in the error overlay. */
11893
- heading: string;
11894
- /** The description text displayed below the heading. */
11895
- description: string;
11896
- /** The label for the retry button. */
11897
- retryLabel: string;
11898
13952
  /**
11899
13953
  * The color theme name to apply on the retry button.
11900
13954
  * When set, applies `[color]` on the button element.
11901
13955
  */
11902
13956
  retryButtonColor: string | null;
11903
- /**
11904
- * A function to transform text based on the current locale.
11905
- * Use `provideLocale()` to update the locale dynamically.
11906
- */
11907
- transformer: (text: string, locale: string) => string;
11908
13957
  };
11909
13958
  declare const provideStreamPlayerErrorConfig: (valueOverride?: Partial<StreamPlayerErrorConfig> | undefined) => _angular_core.Provider[];
11910
13959
  declare const injectStreamPlayerErrorConfig: {
@@ -11919,7 +13968,7 @@ declare class StreamPlayerErrorComponent {
11919
13968
  private errorDirective;
11920
13969
  private parentSurfaceProvider;
11921
13970
  private config;
11922
- private locale;
13971
+ private labels;
11923
13972
  private surfaceThemes;
11924
13973
  cardSurface: _angular_core.Signal<string | null>;
11925
13974
  heading: _angular_core.Signal<string>;
@@ -11947,6 +13996,7 @@ declare const injectStreamPlayerLoadingConfig: {
11947
13996
  };
11948
13997
 
11949
13998
  declare class StreamPlayerLoadingComponent {
13999
+ protected labels: _angular_core.Signal<_ethlete_components.StreamLabels>;
11950
14000
  protected config: _ethlete_components.StreamPlayerLoadingConfig;
11951
14001
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StreamPlayerLoadingComponent, never>;
11952
14002
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<StreamPlayerLoadingComponent, "et-stream-player-loading", never, {}, {}, never, never, true, never>;
@@ -12177,6 +14227,7 @@ declare class PipBackDirective {
12177
14227
  private chrome;
12178
14228
  private tokenEntry;
12179
14229
  private pipManager;
14230
+ protected labels: _angular_core.Signal<_ethlete_components.StreamLabels>;
12180
14231
  entry: _angular_core.InputSignal<StreamPipEntry | undefined>;
12181
14232
  back(event: Event): void;
12182
14233
  private resolveEntry;
@@ -12357,6 +14408,7 @@ declare class PipCloseDirective {
12357
14408
  private pipWindow;
12358
14409
  private tokenEntry;
12359
14410
  private pipManager;
14411
+ protected labels: _angular_core.Signal<_ethlete_components.StreamLabels>;
12360
14412
  entry: _angular_core.InputSignal<StreamPipEntry | undefined>;
12361
14413
  close(event: Event): void;
12362
14414
  private resolveEntry;
@@ -12431,20 +14483,11 @@ declare class PipPlayerComponent {
12431
14483
  }
12432
14484
 
12433
14485
  type PipSlotPlaceholderConfig = {
12434
- /** The message displayed in the placeholder overlay. */
12435
- message: string;
12436
- /** The label for the "back to player" button. */
12437
- backLabel: string;
12438
14486
  /**
12439
14487
  * The color theme name to apply on the back button.
12440
14488
  * When set, applies `[color]` on the button element.
12441
14489
  */
12442
14490
  backButtonColor: string | null;
12443
- /**
12444
- * A function to transform text based on the current locale.
12445
- * Use `provideLocale()` to update the locale dynamically.
12446
- */
12447
- transformer: (text: string, locale: string) => string;
12448
14491
  };
12449
14492
  declare const providePipSlotPlaceholderConfig: (valueOverride?: Partial<PipSlotPlaceholderConfig> | undefined) => _angular_core.Provider[];
12450
14493
  declare const injectPipSlotPlaceholderConfig: {
@@ -12460,7 +14503,7 @@ declare class PipSlotPlaceholderComponent {
12460
14503
  private parentSurfaceProvider;
12461
14504
  private pipManager;
12462
14505
  private config;
12463
- private locale;
14506
+ private labels;
12464
14507
  private surfaceThemes;
12465
14508
  private bringBackDir;
12466
14509
  cardSurface: _angular_core.Signal<string | null>;
@@ -12580,6 +14623,7 @@ declare const STREAM_PLAYER_TOKEN: InjectionToken<StreamPlayer>;
12580
14623
 
12581
14624
  declare const DAILYMOTION_PLAYER_TOKEN: InjectionToken<DailymotionPlayerDirective>;
12582
14625
  declare class DailymotionPlayerDirective implements StreamPlayer {
14626
+ private streamLabels;
12583
14627
  private platformId;
12584
14628
  private params;
12585
14629
  private el;
@@ -12695,6 +14739,7 @@ declare class KickPlayerParamsDirective implements StreamPlayerParams {
12695
14739
 
12696
14740
  declare const KICK_PLAYER_TOKEN: InjectionToken<KickPlayerDirective>;
12697
14741
  declare class KickPlayerDirective implements StreamPlayer {
14742
+ private streamLabels;
12698
14743
  private platformId;
12699
14744
  private document;
12700
14745
  private params;
@@ -12740,6 +14785,7 @@ declare class SoopPlayerParamsDirective implements StreamPlayerParams {
12740
14785
 
12741
14786
  declare const SOOP_PLAYER_TOKEN: InjectionToken<SoopPlayerDirective>;
12742
14787
  declare class SoopPlayerDirective implements StreamPlayer {
14788
+ private streamLabels;
12743
14789
  private platformId;
12744
14790
  private params;
12745
14791
  private el;
@@ -12784,6 +14830,7 @@ declare class TikTokPlayerParamsDirective implements StreamPlayerParams {
12784
14830
 
12785
14831
  declare const TIKTOK_PLAYER_TOKEN: InjectionToken<TikTokPlayerDirective>;
12786
14832
  declare class TikTokPlayerDirective implements StreamPlayer {
14833
+ private streamLabels;
12787
14834
  private platformId;
12788
14835
  private params;
12789
14836
  private el;
@@ -13216,6 +15263,61 @@ declare const createStreamConfig: (valueOverride?: Partial<StreamConfig>) => {
13216
15263
  };
13217
15264
  declare const provideStreamConfig: (valueOverride?: Partial<StreamConfig>) => _angular_core.Provider[];
13218
15265
 
15266
+ /**
15267
+ * Every string the stream player's own chrome renders: the consent gate, the failure overlay, the
15268
+ * picture-in-picture placeholder and the PiP window's controls.
15269
+ *
15270
+ * These used to live on the `StreamConsentConfig` / `StreamPlayerErrorConfig` /
15271
+ * `PipSlotPlaceholderConfig` objects next to a `transformer(text, locale)` hook, which asked an app to
15272
+ * translate *by matching the English string*. They are labels, so they live where every other label in
15273
+ * this library lives; those configs keep only what is genuinely configuration (the button colors).
15274
+ */
15275
+ type StreamLabels = {
15276
+ /** Announced by the loading overlay while a player is starting up. */
15277
+ loading: string;
15278
+ /**
15279
+ * `title` for an embedded player's iframe, given the platform's own name — announced in place of the
15280
+ * frame's contents. The brand name is not translated; the wording around it is.
15281
+ */
15282
+ playerFrame: (platform: string) => string;
15283
+ /** The consent gate's heading. */
15284
+ consentHeading: string;
15285
+ /** The consent gate's explanation. */
15286
+ consentDescription: string;
15287
+ /** The consent gate's accept button. */
15288
+ consentAccept: string;
15289
+ /** The failure overlay's heading. */
15290
+ errorHeading: string;
15291
+ /** The failure overlay's explanation. */
15292
+ errorDescription: string;
15293
+ /** The failure overlay's retry button. */
15294
+ errorRetry: string;
15295
+ /** The placeholder shown where a player would be while it plays in picture-in-picture. */
15296
+ pipPlaceholderMessage: string;
15297
+ /** The placeholder's button that pulls the stream back into the page. */
15298
+ pipPlaceholderBack: string;
15299
+ /** Accessible label for the PiP window's close button. */
15300
+ pipClose: string;
15301
+ /** Accessible label for the PiP window's control that focuses the stream's page. */
15302
+ pipFocus: string;
15303
+ };
15304
+ /** The built-in English labels. */
15305
+ declare const DEFAULT_STREAM_LABELS: StreamLabels;
15306
+ /**
15307
+ * Localize the stream chrome's strings for everything below this injector, and read the set in effect
15308
+ * here as a signal. Partial — whatever you leave out keeps its {@link DEFAULT_STREAM_LABELS} value. See
15309
+ * {@link createLabels} for the shape, which every domain in this library shares.
15310
+ *
15311
+ * @example
15312
+ * provideStreamLabels({
15313
+ * consentHeading: 'Inhalt blockiert',
15314
+ * consentAccept: 'Erlauben und abspielen',
15315
+ * });
15316
+ */
15317
+ declare const provideStreamLabels: (labels: _ethlete_core.LabelsSource<StreamLabels>) => _angular_core.Provider;
15318
+ declare const injectStreamLabels: () => _angular_core.Signal<StreamLabels>;
15319
+ declare const STREAM_LABELS: _angular_core.InjectionToken<_ethlete_core.LabelsSource<StreamLabels>>;
15320
+
13219
15321
  declare const provideStreamManager: () => _angular_core.Provider[];
13220
15322
  declare const injectStreamManager: {
13221
15323
  (): StreamManager;
@@ -13363,17 +15465,17 @@ type TableLabels = {
13363
15465
  /** The built-in English labels. */
13364
15466
  declare const DEFAULT_TABLE_LABELS: TableLabels;
13365
15467
  /**
13366
- * A label set, or a function building one for the **active locale** — called again whenever
13367
- * `injectLocale()`'s `currentLocale` changes, so a locale switch re-renders the table's wording
13368
- * without reloading. This is the seam an app's i18n library plugs into (same idea as `TitleConfig`'s
13369
- * locale-aware `transformer`).
15468
+ * A label set, or a function building one for the **active locale**. See {@link LabelsSource}.
15469
+ *
15470
+ * @deprecated Use {@link LabelsSource}`<`{@link TableLabels}`>` — the shape is shared by every domain
15471
+ * in this library now.
13370
15472
  */
13371
- type TableLabelsSource = Partial<TableLabels> | ((locale: string) => Partial<TableLabels>);
13372
- /** What {@link provideTableLabels} stores. Read it through {@link injectTableLabels}, not directly. */
13373
- declare const TABLE_LABELS: InjectionToken<TableLabelsSource>;
15473
+ type TableLabelsSource = LabelsSource<TableLabels>;
13374
15474
  /**
13375
- * Localize the table's strings for everything below this injector. Partial — whatever you leave out
13376
- * keeps its {@link DEFAULT_TABLE_LABELS} value.
15475
+ * Localize the table's strings for everything below this injector, and read the set in effect here as
15476
+ * a signal: the defaults with the provided set (or the set its factory builds for the current locale)
15477
+ * layered on top. Partial — whatever you leave out keeps its {@link DEFAULT_TABLE_LABELS} value. See
15478
+ * {@link createLabels} for the shape, which every domain in this library shares.
13377
15479
  *
13378
15480
  * @example
13379
15481
  * // fixed wording
@@ -13391,13 +15493,9 @@ declare const TABLE_LABELS: InjectionToken<TableLabelsSource>;
13391
15493
  * sortAction: (header, next) => translate(`table.sort.${next ?? 'clear'}`, locale, { header }),
13392
15494
  * }));
13393
15495
  */
13394
- declare const provideTableLabels: (labels: TableLabelsSource) => Provider;
13395
- /**
13396
- * The label set in effect here, as a signal: the defaults with the provided set (or the set its
13397
- * factory builds for the current locale) layered on top. A signal because the locale can change at
13398
- * runtime — read it in the template/computed, never destructure it once.
13399
- */
13400
- declare const injectTableLabels: () => Signal<TableLabels>;
15496
+ declare const provideTableLabels: (labels: LabelsSource<TableLabels>) => _angular_core.Provider;
15497
+ declare const injectTableLabels: () => _angular_core.Signal<TableLabels>;
15498
+ declare const TABLE_LABELS: _angular_core.InjectionToken<LabelsSource<TableLabels>>;
13401
15499
 
13402
15500
  /** Horizontal alignment of a column's header and cells. */
13403
15501
  type TableColumnAlign = 'start' | 'center' | 'end';
@@ -14263,7 +16361,7 @@ declare class TableComponent<T> {
14263
16361
  */
14264
16362
  loading: _angular_core.InputSignalWithTransform<boolean, unknown>;
14265
16363
  /** How many placeholder rows to draw while loading with no rows yet. @default 5 */
14266
- loadingRows: _angular_core.InputSignal<number>;
16364
+ loadingRows: _angular_core.InputSignalWithTransform<number, unknown>;
14267
16365
  /**
14268
16366
  * The load's failure, if any — anything non-nullish counts (an `HttpErrorResponse`, a message, a
14269
16367
  * flag), so it takes a query's `error` signal as-is. Set, it replaces the body with the error
@@ -14307,7 +16405,7 @@ declare class TableComponent<T> {
14307
16405
  */
14308
16406
  sort: _angular_core.ModelSignal<TableSort[]>;
14309
16407
  /** Allow more than one column to be sorted at once. @default false */
14310
- multiSort: _angular_core.InputSignal<boolean>;
16408
+ multiSort: _angular_core.InputSignalWithTransform<boolean, unknown>;
14311
16409
  /**
14312
16410
  * `'client'` sorts the rows in the browser via {@link sortRows}; `'server'`
14313
16411
  * leaves rows untouched so the backend can sort.
@@ -15456,7 +17554,7 @@ declare class TabBarTriggerDirective {
15456
17554
  private elementRef;
15457
17555
  private scrollable;
15458
17556
  protected tabBar: _ethlete_components.TabBarDirective | null;
15459
- disabled: _angular_core.InputSignal<boolean>;
17557
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
15460
17558
  readonly ID: string;
15461
17559
  justActivated: _angular_core.WritableSignal<boolean>;
15462
17560
  isSelected: _angular_core.Signal<boolean>;
@@ -15503,7 +17601,7 @@ declare class TabBarDirective {
15503
17601
  orientation: _angular_core.InputSignal<TabBarOrientation>;
15504
17602
  fit: _angular_core.InputSignal<TabBarFit>;
15505
17603
  variant: _angular_core.InputSignal<TabBarVariant>;
15506
- divider: _angular_core.InputSignal<boolean>;
17604
+ divider: _angular_core.InputSignalWithTransform<boolean, unknown>;
15507
17605
  /** @internal */
15508
17606
  triggers: _angular_core.WritableSignal<TabBarTriggerDirective[]>;
15509
17607
  /** @internal */
@@ -15624,7 +17722,7 @@ declare class TabPanelDirective {
15624
17722
  declare class TabGroupDirective {
15625
17723
  tabBar: TabBarDirective;
15626
17724
  private elementRef;
15627
- preserveContent: _angular_core.InputSignal<boolean>;
17725
+ preserveContent: _angular_core.InputSignalWithTransform<boolean, unknown>;
15628
17726
  selectedIndex: _angular_core.ModelSignal<number>;
15629
17727
  sessionMemoryKey: _angular_core.InputSignal<string | null>;
15630
17728
  private sessionMemoryAvailable;
@@ -15666,7 +17764,7 @@ declare class TabComponent {
15666
17764
  private tabGroup;
15667
17765
  label: _angular_core.InputSignal<string>;
15668
17766
  icon: _angular_core.InputSignal<string | null>;
15669
- disabled: _angular_core.InputSignal<boolean>;
17767
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
15670
17768
  customLabel: _angular_core.Signal<TabLabelDirective | undefined>;
15671
17769
  /** @internal */
15672
17770
  implicitLabelRef: _angular_core.Signal<TemplateRef<unknown>>;
@@ -15721,19 +17819,28 @@ type TimePickerColumn = {
15721
17819
  * only — string parsing/formatting belongs to the input directives.
15722
17820
  */
15723
17821
  declare class TimePickerDirective {
17822
+ private timePickerLabels;
15724
17823
  private defaultFormat;
15725
17824
  private defaultLocale;
15726
17825
  /** date-fns time format the column layout derives from. Defaults to the `TIME_FORMAT` token. */
15727
17826
  format: _angular_core.InputSignal<string | undefined>;
15728
17827
  locale: _angular_core.InputSignal<Locale | null>;
15729
- minuteStep: _angular_core.InputSignal<number>;
15730
- secondStep: _angular_core.InputSignal<number>;
15731
- hoursLabel: _angular_core.InputSignal<string>;
15732
- minutesLabel: _angular_core.InputSignal<string>;
15733
- secondsLabel: _angular_core.InputSignal<string>;
15734
- periodLabel: _angular_core.InputSignal<string>;
17828
+ minuteStep: _angular_core.InputSignalWithTransform<number, unknown>;
17829
+ secondStep: _angular_core.InputSignalWithTransform<number, unknown>;
17830
+ hoursLabel: _angular_core.InputSignal<string | null>;
17831
+ minutesLabel: _angular_core.InputSignal<string | null>;
17832
+ secondsLabel: _angular_core.InputSignal<string | null>;
17833
+ periodLabel: _angular_core.InputSignal<string | null>;
15735
17834
  /** The selected time of day, carried on a `Date`. Stays `null` until a part is picked. */
15736
17835
  value: _angular_core.ModelSignal<Date | null>;
17836
+ /** The string in effect: this instance's `hoursLabel`, else the domain's label set. */
17837
+ resolvedHoursLabel: _angular_core.Signal<string>;
17838
+ /** The string in effect: this instance's `minutesLabel`, else the domain's label set. */
17839
+ resolvedMinutesLabel: _angular_core.Signal<string>;
17840
+ /** The string in effect: this instance's `secondsLabel`, else the domain's label set. */
17841
+ resolvedSecondsLabel: _angular_core.Signal<string>;
17842
+ /** The string in effect: this instance's `periodLabel`, else the domain's label set. */
17843
+ resolvedPeriodLabel: _angular_core.Signal<string>;
15737
17844
  private now;
15738
17845
  effectiveFormat: _angular_core.Signal<string>;
15739
17846
  effectiveLocale: _angular_core.Signal<Locale | null>;
@@ -15812,6 +17919,31 @@ declare const TIME_PICKER_ERROR_CODES: {
15812
17919
  readonly OPTION_OUTSIDE_COLUMN: 3021;
15813
17920
  };
15814
17921
 
17922
+ /** The strings the time picker's columns announce — each is a listbox of numbers with no visible label. */
17923
+ type TimePickerLabels = {
17924
+ /** Accessible label for the hours column. */
17925
+ hours: string;
17926
+ /** Accessible label for the minutes column. */
17927
+ minutes: string;
17928
+ /** Accessible label for the seconds column. */
17929
+ seconds: string;
17930
+ /** Accessible label for the AM/PM column. */
17931
+ period: string;
17932
+ };
17933
+ /** The built-in English labels. */
17934
+ declare const DEFAULT_TIME_PICKER_LABELS: TimePickerLabels;
17935
+ /**
17936
+ * Localize the time picker's strings for everything below this injector, and read the set in effect here as a
17937
+ * signal. Partial — whatever you leave out keeps its {@link DEFAULT_TIME_PICKER_LABELS} value. See {@link createLabels}
17938
+ * for the shape, which every domain in this library shares.
17939
+ *
17940
+ * @example
17941
+ * provideTimePickerLabels({ hours: 'Stunden', minutes: 'Minuten' });
17942
+ */
17943
+ declare const provideTimePickerLabels: (labels: _ethlete_core.LabelsSource<TimePickerLabels>) => _angular_core.Provider;
17944
+ declare const injectTimePickerLabels: () => _angular_core.Signal<TimePickerLabels>;
17945
+ declare const TIME_PICKER_LABELS: _angular_core.InjectionToken<_ethlete_core.LabelsSource<TimePickerLabels>>;
17946
+
15815
17947
  declare class TimePickerComponent {
15816
17948
  protected timePicker: TimePickerDirective;
15817
17949
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TimePickerComponent, never>;
@@ -15832,9 +17964,15 @@ declare class ToggletipDirective {
15832
17964
  placement: _angular_core.InputSignal<Placement>;
15833
17965
  fallbackPlacements: _angular_core.InputSignal<Placement[] | undefined>;
15834
17966
  offset: _angular_core.InputSignal<OffsetOptions | null>;
17967
+ /**
17968
+ * How close the arrow may get to the panel's corners. Must clear the panel's border radius
17969
+ * (`--_et-toggletip-radius`, 16px) or the arrow's base rides into the rounded corner — which is what
17970
+ * happens on aligned placements (`bottom-end`, `left-start`, …) and whenever `shift` pushes a panel
17971
+ * off center near a viewport edge.
17972
+ */
15835
17973
  arrowPadding: _angular_core.InputSignal<Padding | null>;
15836
17974
  viewportPadding: _angular_core.InputSignal<Padding | null>;
15837
- disabled: _angular_core.InputSignal<boolean>;
17975
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
15838
17976
  open: _angular_core.ModelSignal<boolean>;
15839
17977
  /** @internal */
15840
17978
  overlayRef: _angular_core.WritableSignal<OverlayRef<ToggletipComponent, unknown> | null>;
@@ -15926,10 +18064,16 @@ declare class TooltipDirective {
15926
18064
  placement: _angular_core.InputSignal<Placement>;
15927
18065
  fallbackPlacements: _angular_core.InputSignal<Placement[] | undefined>;
15928
18066
  offset: _angular_core.InputSignal<OffsetOptions | null>;
18067
+ /**
18068
+ * How close the arrow may get to the panel's corners. Must clear the panel's border radius
18069
+ * (`--_et-tooltip-radius`, 16px) or the arrow's base rides into the rounded corner — which is what
18070
+ * happens on aligned placements (`bottom-end`, `left-start`, …) and whenever `shift` pushes a panel
18071
+ * off center near a viewport edge.
18072
+ */
15929
18073
  arrowPadding: _angular_core.InputSignal<Padding | null>;
15930
18074
  viewportPadding: _angular_core.InputSignal<Padding | null>;
15931
18075
  showDelay: _angular_core.InputSignal<number>;
15932
- disabled: _angular_core.InputSignal<boolean>;
18076
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
15933
18077
  /** @internal */
15934
18078
  overlayRef: _angular_core.WritableSignal<OverlayRef<TooltipComponent, unknown> | null>;
15935
18079
  private hasHover;
@@ -15941,6 +18085,12 @@ declare class TooltipDirective {
15941
18085
  show(): void;
15942
18086
  hide(): void;
15943
18087
  private setupHoverBehavior;
18088
+ /**
18089
+ * A tooltip can outlive the hover that opened it — a `pointercancel`, a scroll that moves the
18090
+ * trigger out from under the pointer, or a browser that synthesizes an enter with no matching
18091
+ * leave. A press anywhere else is unambiguous, so treat it as a dismissal.
18092
+ */
18093
+ private dismissOnOutsidePointer;
15944
18094
  private setupFocusBehavior;
15945
18095
  private syncHostDescription;
15946
18096
  private syncDescriptionElement;
@@ -15955,5 +18105,5 @@ declare const TOOLTIP_ERROR_CODES: {
15955
18105
 
15956
18106
  declare const TOOLTIP_IMPORTS: readonly [typeof TooltipDirective, typeof TooltipComponent];
15957
18107
 
15958
- export { ACCORDION_ERROR_CODES, ACCORDION_GROUP_TOKEN, ACCORDION_IMPORTS, ACCORDION_TOKEN, ALIGN_CENTER_ICON, ALIGN_JUSTIFY_ICON, ALIGN_LEFT_ICON, ALIGN_RIGHT_ICON, ARROWS_LEFT_RIGHT_ICON, ARROW_OUT_UP_RIGHT_ICON, ARROW_RIGHT_ICON, ARROW_UP_ICON, AccordionComponent, AccordionContentDirective, AccordionDirective, AccordionGroupComponent, AccordionGroupDirective, AccordionHintDirective, AccordionLabelDirective, AccordionPanelDirective, AccordionTriggerDirective, BOLD_ICON, BRACKET_DATA_LAYOUT, BRACKET_ERROR_CODES, BRACKET_IMPORTS, BRACKET_ROUND_MIRROR_TYPE, BRACKET_SWISS_GROUP_COLOR_TYPE, BREADCRUMB_ERROR_CODES, BREADCRUMB_IMPORTS, BREADCRUMB_LABELS, BREADCRUMB_SEGMENT_TOKEN, BREADCRUMB_TOKEN, BUTTON_ICON_ALIGNMENTS, BUTTON_IMPORTS, BUTTON_SIZES, BUTTON_SPINNER_CONFIG, BUTTON_TYPES, BUTTON_VARIANTS, BracketComponent, BracketDefaultContinueComponent, BracketDefaultMatchComponent, BracketDefaultRoundHeaderComponent, BracketMap, BrandLoaderComponent, BreadcrumbComponent, BreadcrumbDirective, BreadcrumbItemDirective, BreadcrumbItemTemplateDirective, BreadcrumbOutletComponent, BreadcrumbSegmentDirective, BreadcrumbSeparatorDirective, ButtonComponent, ButtonDirective, ButtonStylesDirective, CALENDAR_ERROR_CODES, CALENDAR_ICON, CALENDAR_IMPORTS, CAROUSEL_AUTOPLAY_TOKEN, CAROUSEL_ERROR_CODES, CAROUSEL_IMPORTS, CAROUSEL_LABELS, CAROUSEL_SLIDE_ALIGNMENTS, CAROUSEL_TOKEN, CAROUSEL_TRANSITIONS, CAROUSEL_TRANSITION_DRIVERS, CASCADER_ERROR_CODES, CASCADER_IMPORTS, CASCADER_SELECTABLE_LEVELS, CHECKBOX_IMPORTS, CHECK_ICON, CHEVRON_ICON, CHIP_ERROR_CODES, CHIP_IMPORTS, CHOICE_FIELD_IMPORTS, CLIPBOARD_CHECK_ICON, CLOCK_ICON, CODE_ICON, COLOR_INPUT_IMPORTS, COMMON_BRACKET_ROUND_TYPE, CalendarCellDirective, CalendarComponent, CalendarDirective, CalendarGridDirective, CarouselAutoplayDirective, CarouselComponent, CarouselDirective, CarouselItemDirective, CarouselNextDirective, CarouselPlayToggleDirective, CarouselPreviousDirective, CarouselSlideDirective, CascaderColumnDirective, CascaderComponent, CascaderDirective, CascaderNodeDirective, CascaderPanelComponent, CascaderSearchDirective, CascaderSearchOptionDirective, CascaderSurfaceDirective, CascaderTriggerDirective, CheckboxComponent, CheckboxDirective, CheckboxGroupComponent, CheckboxOptionComponent, ChipComponent, ChipDirective, ChipRemoveDirective, ChoiceFieldComponent, ColorInputComponent, ColorInputDirective, DAILYMOTION_PLAYER_TOKEN, DATE_FORMAT, DATE_INPUT_ERROR_CODES, DATE_INPUT_IMPORTS, DATE_LOCALE, DATE_PICKER_HOST, DATE_RANGE_INPUT_ERROR_CODES, DATE_RANGE_INPUT_IMPORTS, DATE_TIME_INPUT_ERROR_CODES, DATE_TIME_INPUT_IMPORTS, DEFAULT_BREADCRUMB_LABELS, DEFAULT_BREAKPOINTS, DEFAULT_CAROUSEL_LABELS, DEFAULT_ICON_VARIANT, DEFAULT_NOTIFICATION_MANAGER_CONFIG, DEFAULT_PAGINATION_LABELS, DEFAULT_PIP_WINDOW_CONFIG, DEFAULT_RICH_TEXT_EDITOR_TOOLS, DEFAULT_STREAM_PLAYER_STATE, DEFAULT_TABLE_LABELS, DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE, DROPZONE_ENTRY_STATUSES, DROPZONE_ERROR_CODES, DROPZONE_FILES_ERROR_KIND, DROPZONE_FILE_CONSTRAINTS, DROPZONE_FILE_REJECTION_REASONS, DROPZONE_IMPORTS, DURATION_INPUT_ERROR_CODES, DURATION_INPUT_IMPORTS, DailymotionPlayerComponent, DailymotionPlayerDirective, DailymotionPlayerParamsDirective, DailymotionPlayerSlotComponent, DateInputComponent, DateInputDirective, DateInputFieldDirective, DatePickerPanelComponent, DatePickerSurfaceDirective, DatePickerTriggerDirective, DateRangeInputComponent, DateRangeInputDirective, DateRangeInputFieldDirective, DateTimeInputComponent, DateTimeInputDirective, DateTimeInputFieldDirective, DescriptionComponent, DropzoneComponent, DropzoneDirective, DurationInputComponent, DurationInputDirective, DurationInputFieldDirective, ELLIPSIS_VERTICAL_ICON, ET_BUILT_IN_ICON_NAMES, EYE_ICON, EYE_SLASH_ICON, FACEBOOK_PLAYER_TOKEN, FILE_ICON, FILTER_ICON, FLOPPY_DISK_ICON, FOCUS_FRAME_ICON, FORM_ERROR_MESSAGE_RESOLVER, FORM_FIELD_APPEARANCES, FORM_FIELD_CONTROL_TYPES, FORM_FIELD_ERROR_CODES, FORM_FIELD_FILLS, FORM_FIELD_IMPORTS, FORM_FIELD_LABEL_MODES, FORM_FIELD_SIZES, FORM_FIELD_TOKEN, FabComponent, FacebookPlayerComponent, FacebookPlayerDirective, FacebookPlayerParamsDirective, FacebookPlayerSlotComponent, FocusRingDirective, FormErrorComponent, FormFieldComponent, FormFieldDirective, GRID_2X2_ICON, GRID_ERROR_CODES, GRID_IMPORTS, GRID_TOKEN, GROUP_BRACKET_ROUND_TYPE, GridComponent, GridDebugComponent, GridDirective, GridDragDirective, GridItemComponent, GridItemDefaultActionsComponent, GridItemDirective, GridItemRef, GridItemToolbarComponent, GridResizeDirective, HEADING_1_ICON, HEADING_2_ICON, HEADING_3_ICON, HintComponent, ICONS_TOKEN, ICON_DIRECTIVE_TOKEN, ICON_ERROR_CODES, ICON_IMPORTS, ICON_OVERRIDES_TOKEN, INITIAL_SUPPORT_PRESENTATION_STATE, INPUT_IMPORTS, INPUT_MASK_HOST, INPUT_TEXT_ALIGNMENTS, INPUT_TYPES, INTERACTIVE_TAGS, ITALIC_ICON, IconButtonComponent, IconDirective, InputComponent, InputDirective, InputMaskDirective, InputPrefixDirective, InputSuffixDirective, KICK_PLAYER_TOKEN, KickPlayerComponent, KickPlayerDirective, KickPlayerParamsDirective, KickPlayerSlotComponent, LINK_ICON, LIST_BULLETED_ICON, LIST_NUMBERED_ICON, LOCK_ICON, LabelDirective, MASKED_INPUT_ERROR_CODES, MASKED_INPUT_IMPORTS, MASK_VALUE_MODES, MENU_ERROR_CODES, MENU_IMPORTS, MENU_ITEM_VARIANTS, MENU_SELECTION_GROUP_MULTIPLE, MENU_SELECTION_GROUP_TOKEN, MENU_SELECTION_ITEM_KIND, MINUS_ICON, MULTI_LANGUAGE_RICH_TEXT_EDITOR_ERROR_CODES, MULTI_LANGUAGE_RICH_TEXT_EDITOR_IMPORTS, MenuCheckboxGroupComponent, MenuCheckboxItemComponent, MenuComponent, MenuContextTriggerDirective, MenuDirective, MenuGroupLabelComponent, MenuItemComponent, MenuItemDirective, MenuItemShortcutComponent, MenuPanelDirective, MenuRadioGroupComponent, MenuRadioItemComponent, MenuSearchDirective, MenuSelectionGroupDirective, MenuSelectionItemDirective, MenuSeparatorComponent, MenuSurfaceDirective, MenuTriggerDirective, MultiLanguageRichTextEditorComponent, MultiLanguageRichTextEditorDirective, MultiLanguageRichTextEditorLanguageToolComponent, NAV_TABS_TOKEN, NAV_TAB_IMPORTS, NOTIFICATION_ERROR_CODES, NOTIFICATION_IMPORTS, NOTIFICATION_STACK_CONTEXT_TOKEN, NOTIFICATION_STATUS, NUMBER_INPUT_IMPORTS, NavTabLinkComponent, NavTabLinkDirective, NavTabsComponent, NavTabsDirective, NavTabsOutletComponent, NavTabsOutletDirective, NotificationActionDirective, NotificationComponent, NotificationDirective, NotificationDismissDirective, NotificationItemDirective, NotificationStackDirective, NumberInputComponent, NumberInputDirective, OTP_INPUT_IMPORTS, OVERLAY_BACK_OR_CLOSE_TOKEN, OVERLAY_BODY_TOKEN, OVERLAY_CONFIG_CLASS_KEYS, OVERLAY_CONTENT_IMPORTS, OVERLAY_ERROR_CODES, OVERLAY_FOOTER_TOKEN, OVERLAY_HEADER_TEMPLATE_TOKEN, OVERLAY_HEADER_TOKEN, OVERLAY_IMPORTS, OVERLAY_MAIN_TOKEN, OVERLAY_QUERY_PARAM_INPUT_NAME, OVERLAY_REF, OVERLAY_ROUTER_CONFIG_TOKEN, OVERLAY_ROUTER_LINK_TOKEN, OVERLAY_ROUTER_OUTLET_DISABLED_TEMPLATE_TOKEN, OVERLAY_ROUTER_OUTLET_TOKEN, OVERLAY_ROUTER_TOKEN, OVERLAY_SHARED_ROUTE_TEMPLATE_TOKEN, OtpInputComponent, OtpInputDirective, OverlayAnchorDirective, OverlayBackOrCloseDirective, OverlayBodyComponent, OverlayCloseDirective, OverlayContainerComponent, OverlayDirective, OverlayFooterDirective, OverlayHeaderDirective, OverlayHeaderTemplateDirective, OverlayMainDirective, OverlayOriginCloneComponent, OverlayRouteHeaderTemplateOutletComponent, OverlayRouterLinkDirective, OverlayRouterOutletComponent, OverlayRouterOutletDisabledTemplateDirective, OverlaySharedRouteTemplateDirective, OverlaySharedRouteTemplateOutletComponent, OverlaySidebarComponent, OverlaySidebarPageComponent, OverlaySurfaceDirective, OverlayTitleDirective, OverlayTriggerDirective, PAGINATION_IMPORTS, PAGINATION_LABELS, PARAGRAPH_ICON, PASSWORD_INPUT_IMPORTS, PAUSE_ICON, PENCIL_ICON, PHONE_COUNTRIES, PHONE_INPUT_ERROR_CODES, PHONE_INPUT_IMPORTS, PIP_CHROME_REF_TOKEN, PIP_ENTRY_TOKEN, PIP_WINDOW_ASPECT_RATIO_TOKEN, PLAY_ICON, PLUS_ICON, PaginationComponent, PaginationDirective, PaginationSeoDirective, PasswordInputComponent, PasswordInputDirective, PhoneInputComponent, PhoneInputDirective, PhoneInputFieldDirective, PhoneInputFlagDirective, PipBackDirective, PipBringBackDirective, PipCellDirective, PipCloseDirective, PipCollapseOverlayDirective, PipGridToggleDirective, PipPlayerComponent, PipSlotPlaceholderComponent, PipStageDirective, PipTitleBarDirective, PipTitleBarTemplateDirective, PipWindowComponent, PipWindowParamsDirective, ProgressBarComponent, QUERY_DEVTOOLS_IMPORTS, QueryDevtoolsComponent, QueryDevtoolsJsonComponent, QueryDevtoolsToggleComponent, QueryParamOverlayLinkDirective, RATING_IMPORTS, RICH_TEXT_EDITOR_HEADING_OPTIONS, RICH_TEXT_EDITOR_IMPORTS, RICH_TEXT_EDITOR_INLINE_TOOLS, RICH_TEXT_EDITOR_LANGUAGE_TOOL, RICH_TEXT_EDITOR_TOKEN_CODEC, RICH_TEXT_EDITOR_TOKEN_PALETTE_IMPORTS, RICH_TEXT_EDITOR_TOOL, RICH_TEXT_EDITOR_TOOLS, RICH_TEXT_EDITOR_TOOL_BUTTONS, RICH_TEXT_EDITOR_TRIGGERS_IMPORTS, ROTATE_RIGHT_ICON, RadioComponent, RadioGroupComponent, RangeSliderComponent, RangeSliderDirective, RatingComponent, RatingDirective, RatingIconDirective, RichTextEditorAlignToolComponent, RichTextEditorComponent, RichTextEditorDirective, RichTextEditorFloatingToolbarComponent, RichTextEditorFloatingToolbarDirective, RichTextEditorLinkEditorComponent, RichTextEditorLinkEditorDirective, RichTextEditorTableToolComponent, RichTextEditorTokenPaletteComponent, RichTextEditorTokenPopupComponent, RichTextEditorTriggersDirective, SCROLLABLE_ERROR_CODES, SCROLLABLE_IMPORTS, SELECTION_LIST_MULTIPLE, SELECTION_LIST_TOKEN, SELECT_ERROR_CODES, SELECT_FILTER_MODES, SELECT_IMPORTS, SIDEBAR_OVERLAY_CONFIG, SIDEBAR_OVERLAY_TOKEN, SINGLE_ELIMINATION_BRACKET_ROUND_TYPE, SKELETON_IMPORTS, SLIDER_ERROR_CODES, SLIDER_IMPORTS, SLIDER_TOKEN, SNAP_HYSTERESIS, SOOP_PLAYER_TOKEN, SPLIT_BUTTON_ERROR_CODES, STAR_ICON, STREAM_CONSENT_TOKEN, STREAM_IMPORTS, STREAM_PLAYER_COMPONENT_TOKEN, STREAM_PLAYER_ERROR_CONTEXT_TOKEN, STREAM_PLAYER_ERROR_TOKEN, STREAM_PLAYER_PARAMS_TOKEN, STREAM_PLAYER_SLOT_TOKEN, STREAM_PLAYER_TOKEN, STREAM_SLOT_PLAYER_ID_TOKEN, STREAM_USER_CONSENT_PROVIDER_TOKEN, STRIKETHROUGH_ICON, SUPPORT_CONTENT_STATE, SUPPORT_TRANSITION_DIRECTION, SWISS_ADVANCE_WINS, SWISS_BRACKET_ROUND_TYPE, SWISS_ELIMINATE_LOSSES, SWITCH_IMPORTS, ScrollableActiveChildDirective, ScrollableButtonsDirective, ScrollableComponent, ScrollableDarkenDirective, ScrollableDirective, ScrollableDragDirective, ScrollableIgnoreChildDirective, ScrollableLoadingTemplateDirective, ScrollableMasksDirective, ScrollableNavigationDirective, ScrollableSnapDirective, SegmentedButtonComponent, SegmentedButtonGroupComponent, SelectComponent, SelectDirective, SelectEmptyDirective, SelectErrorDirective, SelectListboxDirective, SelectLoadingDirective, SelectOptionComponent, SelectOptionDirective, SelectOptionGroupComponent, SelectOptionGroupDirective, SelectOptionTemplateDirective, SelectOptionsDirective, SelectPanelComponent, SelectSearchDirective, SelectSurfaceDirective, SelectTriggerDirective, SelectValueDirective, SelectViewportDirective, SelectVirtualOptionComponent, SelectVirtualOptionDirective, SelectionListControlDirective, SelectionListDirective, SelectionOptionDirective, SkeletonComponent, SkeletonItemComponent, SkeletonTextComponent, SliderComponent, SliderDirective, SliderThumbDirective, SliderThumbLabelDirective, SliderTrackDirective, SoopPlayerComponent, SoopPlayerDirective, SoopPlayerParamsDirective, SoopPlayerSlotComponent, SpinnerComponent, SplitButtonActionDirective, SplitButtonComponent, SplitButtonDirective, SplitButtonTriggerDirective, StreamConsentAcceptDirective, StreamConsentComponent, StreamConsentDirective, StreamPipChromeComponent, StreamPlayerErrorComponent, StreamPlayerErrorDirective, StreamPlayerLoadingComponent, StreamPlayerSlotDirective, SwitchComponent, SwitchDirective, TABLE_CELL_ERROR_TOOLTIP_IMPORTS, TABLE_COLUMN_CHOOSER_IMPORTS, TABLE_COLUMN_MENU_IMPORTS, TABLE_ERROR_CODES, TABLE_FEATURE_HOST, TABLE_FILTER_IMPORTS, TABLE_ICON, TABLE_IMPORTS, TABLE_LABELS, TABLE_REORDER_IMPORTS, TABLE_RESIZE_IMPORTS, TABLE_SELECTION_IMPORTS, TABLE_STATE_PERSISTENCE_IMPORTS, TABLE_VIRTUAL_SCROLL_IMPORTS, TAB_BAR_FITS, TAB_BAR_ORIENTATIONS, TAB_BAR_TOKEN, TAB_BAR_TRIGGER_TOKEN, TAB_BAR_VARIANTS, TAB_ERROR_CODES, TAB_GROUP_TOKEN, TAB_IMPORTS, TAB_PANEL_TOKEN, TAB_SIZES, TAG_INPUT_ERROR_CODES, TAG_INPUT_IMPORTS, TEXTAREA_IMPORTS, TEXTAREA_RESIZE_MODES, TEXT_ALIGNS, TIKTOK_PLAYER_TOKEN, TIMES_ICON, TIME_FORMAT, TIME_INPUT_ERROR_CODES, TIME_INPUT_IMPORTS, TIME_PICKER_ERROR_CODES, TIME_PICKER_IMPORTS, TOGGLETIP_ERROR_CODES, TOGGLETIP_IMPORTS, TOOLTIP_ERROR_CODES, TOOLTIP_IMPORTS, TOURNAMENT_MODE, TRIANGLE_EXCLAMATION_ICON, TWITCH_PLAYER_TOKEN, TabBarDirective, TabBarTriggerDirective, TabBarUnderlineDirective, TabComponent, TabGroupComponent, TabGroupDirective, TabLabelDirective, TabPanelDirective, TabTriggerDirective, TableCellDirective, TableCellErrorMarkComponent, TableCellErrorTooltipDirective, TableCellSkeletonDirective, TableColumnChooserComponent, TableColumnMenuDirective, TableColumnMenuTriggerComponent, TableComponent, TableDetailStylesComponent, TableExpanderCellComponent, TableFilterOptionDirective, TableFilterTriggerComponent, TableFiltersDirective, TableFooterCellDirective, TableFooterDirective, TableHeaderCellDirective, TableReorderDirective, TableReorderOverlayComponent, TableResizeDirective, TableResizeGripComponent, TableSelectAllCellComponent, TableSelectCellComponent, TableSelectionDirective, TableStatePersistenceDirective, TableVirtualScrollDirective, TableVirtualScrollStylesComponent, TagInputComponent, TagInputDirective, TagInputFieldDirective, TextButtonComponent, TextFieldControlDirective, TextareaComponent, TextareaDirective, TikTokPlayerComponent, TikTokPlayerDirective, TikTokPlayerParamsDirective, TikTokPlayerSlotComponent, TimeInputComponent, TimeInputDirective, TimeInputFieldDirective, TimePickerColumnDirective, TimePickerComponent, TimePickerDirective, TimePickerOptionDirective, ToggletipCloseDirective, ToggletipComponent, ToggletipDirective, ToggletipTriggerDirective, TooltipComponent, TooltipDirective, TwitchPlayerComponent, TwitchPlayerDirective, TwitchPlayerParamsDirective, TwitchPlayerSlotComponent, UNDERLINE_ICON, UNIT_MS, UPLOAD_ICON, VIMEO_PLAYER_TOKEN, VimeoPlayerComponent, VimeoPlayerDirective, VimeoPlayerParamsDirective, VimeoPlayerSlotComponent, WINDOW_CONTROL_BUTTON_KINDS, WINDOW_CONTROL_BUTTON_SIZES, WindowControlButtonComponent, YOUTUBE_PLAYER_SLOT_TOKEN, YOUTUBE_PLAYER_TOKEN, YoutubePlayerComponent, YoutubePlayerDirective, YoutubePlayerParamsDirective, YoutubePlayerSlotComponent, YoutubePlayerSlotDirective, abortFullscreenAnimation, anchoredDialogOverlayStrategy, anchoredOverlayStrategy, autoPlace, bottomSheetOverlayStrategy, buildAnchoredRuntimePositionStrategy, canHaveChildren, canRenderLayoutInTournamentMode, cascaderFromQuery, centeredOverlayStrategy, clampPosition, clampResizeRect, cleanupFullscreenAnimation, cleanupFullscreenAnimationStyles, compactLayout, computeGeometry, computeGridHeight, createAnchoredPanelController, createAutoScroller, createBracket, createBracketBase, createCardMask, createCurrencyMask, createDefaultDropzoneArgs, createDropzoneUpload, createExistingDropzoneEntry, createFileDropzoneEntry, createGridAdapter, createIbanMask, createMatchesMapBase, createNewMatchParticipantBase, createNotificationRef, createOverlayOpener, createOverlayRef, createOverlayStrategyController, createOverlayUnsavedChangesGuard, createParticipantsMapBase, createPipChromeAnimations, createPipChromeState, createRichTextEditorTrigger, createRichTextEditorTriggerWithQuery, createRoundsMapBase, createStreamConfig, createStreamPlayerSlot, createTableRowsSource, createTableStateStorage, createV2DropzoneUpload, defaultCompareWith, defaultDropzoneRejectionMessage, defineOverlay, defineQueryParamOverlay, deriveDurationFormatSpec, deserializeGridLayout, deserializeTableState, dialogOverlayStrategy, disposeDropzoneEntry, dropzoneFiles, enableDragToDismiss, filterRows, findCollision, findNextRelevantHtmlElement, findScrollableAncestor, formatDuration, formatFileSize, fromGridPosition, fullScreenDialogOverlayStrategy, generateBracketDataForEthlete, generateBracketRoundSwissGroupMaps, generateMatchPosition, generateMatchRelationPositions, generateMatchRelationsNew, generateRoundRelationsNew, generateRoundTypeFromEthleteRoundType, generateTournamentModeFormEthleteRounds, getAvailableSwissGroupsForRound, getClosestOverlay, getOriginCoordinatesAndDimensions, getSwissGroupColorType, hysteresisRound, iconRegistryKey, indexOfNode, injectAnchoredDialogStrategy, injectAnchoredDialogStrategyDefaults, injectBottomSheetStrategy, injectBottomSheetStrategyDefaults, injectBracketConfig, injectBreadcrumbLabels, injectBreadcrumbManager, injectCarouselLabels, injectDateFormat, injectDateLocale, injectDialogStrategy, injectDialogStrategyDefaults, injectFormSupport, injectFullscreenDialogStrategy, injectFullscreenDialogStrategyDefaults, injectGridConfig, injectLeftSheetStrategy, injectLeftSheetStrategyDefaults, injectNotificationManager, injectNotificationManagerConfig, injectOverlayManager, injectOverlayRouter, injectOverlayScrollBlocker, injectOverlaySurfaceContext, injectPaginationLabels, injectPipChromeManager, injectPipManager, injectPipSlotPlaceholderConfig, injectRichTextEditorTools, injectRightSheetStrategy, injectRightSheetStrategyDefaults, injectSidebarOverlay, injectStreamConfig, injectStreamConsentConfig, injectStreamManager, injectStreamPlayerErrorConfig, injectStreamPlayerLoadingConfig, injectStreamScriptLoader, injectStreamUserConsentProvider, injectTableFeatureHost, injectTableLabels, injectTimeFormat, injectTopSheetStrategy, injectTopSheetStrategyDefaults, isFileAccepted, isHtmlElement, isInteractiveElement, isPointerEvent, isTargetInsideOverlayTree, isTouchEvent, itemsCollide, leftSheetOverlayStrategy, mapLayoutToBreakpoint, matchCountryByDialCode, mergeOverlayBreakpointConfigs, mergeOverlayConfigs, nodesEqual, paginate, parseDuration, phoneCountryFlag, phoneCountryName, pixelRectsEqual, positionToPixelRect, positionsEqual, projectDragCell, provideAnchoredDialogStrategy, provideAnchoredDialogStrategyDefaults, provideBottomSheetStrategy, provideBottomSheetStrategyDefaults, provideBracketConfig, provideBreadcrumbLabels, provideBreadcrumbManager, provideCarouselLabels, provideDateFormat, provideDateLocale, provideDialogStrategy, provideDialogStrategyDefaults, provideFormErrorMessageResolver, provideFormSupport, provideFullscreenDialogStrategy, provideFullscreenDialogStrategyDefaults, provideGridConfig, provideIconOverrides, provideIcons, provideLeftSheetStrategy, provideLeftSheetStrategyDefaults, provideNotificationManager, provideNotificationManagerConfig, provideNotificationManagerInstance, provideOverlay, provideOverlayManager, provideOverlayRouter, provideOverlayRouterConfig, provideOverlayRouterService, provideOverlayScrollBlocker, providePaginationLabels, providePipChromeManager, providePipManager, providePipSlotPlaceholderConfig, provideRichTextEditorAlignmentTool, provideRichTextEditorLanguageTool, provideRichTextEditorTableTool, provideRichTextEditorTokenRendering, provideRichTextEditorTools, provideRightSheetStrategy, provideRightSheetStrategyDefaults, provideSidebarOverlay, provideSidebarOverlayConfig, provideSidebarOverlayService, provideStreamConfig, provideStreamConsentConfig, provideStreamManager, provideStreamPlayerErrorConfig, provideStreamPlayerLoadingConfig, provideTableLabels, provideTimeFormat, provideTopSheetStrategy, provideTopSheetStrategyDefaults, reconcileColumnOrder, reconcileColumnWidths, reconcileHiddenColumns, reduceSupportPresentation, registerSingleton, requiredLanguages, resizeSpanBounds, resolveBreakpoint, resolveClosestOverlay, resolveCollisions, rightSheetOverlayStrategy, rowsToPixelHeight, selectOptionsFromQuery, selectOptionsFromV2Query, serializeGridLayout, serializeTableState, snapResizeSpan, sortRows, spanHeight, spanWidth, startFullscreenEnterAnimation, startFullscreenLeaveAnimation, stripTrunkZero, supportPresentationIncludesState, tableFeatureConfig, tableRowsFromQuery, tableRowsFromV2Query, toChildrenObservable, toGridPosition, toPathObservable, toSearchObservable, topSheetOverlayStrategy, transformingBottomSheetToDialogOverlayStrategy, transformingFullScreenDialogToDialogOverlayStrategy, transformingFullScreenDialogToRightSheetOverlayStrategy, wireFormSupport };
15959
- export type { AccordionHeadingLevel, AnchoredDialogOverlayStrategyOptions, AnchoredOverlayStrategyOptions, AnchoredPanelCloseInfo, AnchoredPanelOverlayRef, AnchoredPanelSurfaceLike, AnchoredPositionOptions, AnyDropzoneUploadConfig, AnyTableColumn, AutoPlaceOptions, AutoScrollPointer, AutoScroller, Bracket, BracketBase, BracketConfig, BracketDataLayout, BracketDataSource, BracketMatch, BracketMatchBase, BracketMatchFactor, BracketMatchId, BracketMatchParticipant, BracketMatchParticipantBase, BracketMatchParticipantWithRelationsBase, BracketMatchPosition, BracketMatchRelation, BracketMatchRelationNothingToOne, BracketMatchRelationOneToNothing, BracketMatchRelationOneToOne, BracketMatchRelationTwoToNothing, BracketMatchRelationTwoToOne, BracketMatchShortId, BracketMatchSource, BracketMatchStatus, BracketMatchWithRelationsBase, BracketParticipant, BracketParticipantBase, BracketParticipantMatch, BracketParticipantWithRelationsBase, BracketRound, BracketRoundBase, BracketRoundId, BracketRoundMapWithSwissData, BracketRoundMirrorType, BracketRoundPosition, BracketRoundRelation, BracketRoundRelationNothingToOne, BracketRoundRelationOneToNothing, BracketRoundRelationOneToOne, BracketRoundRelationTwoToNothing, BracketRoundRelationTwoToOne, BracketRoundShortId, BracketRoundSource, BracketRoundSwissData, BracketRoundSwissGroup, BracketRoundSwissGroupId, BracketRoundSwissGroupMap, BracketRoundType, BracketRoundWithRelationsBase, BracketSwissColors, BracketSwissConfig, BracketSwissGroupColorType, BreadcrumbCrumb, BreadcrumbLabels, BreadcrumbRenderItem, BreadcrumbSegment, ButtonIconAlignment, ButtonSize, CalendarCell, CalendarMode, CalendarRange, CalendarWeekday, CarouselAutoplayPauseReason, CarouselLabels, CarouselResolvedTransitionDriver, CarouselSlideAlign, CarouselSlideContext, CarouselSlideTemplateRef, CarouselTransition, CarouselTransitionDriver, CascaderColumnState, CascaderCompareWith, CascaderDataSource, CascaderFromQueryConfig, CascaderFromQuerySearchConfig, CascaderNode, CascaderNodeSignal, CascaderSearchState, CascaderSelectableLevels, CascaderSurfaceContext, CenteredOverlayStrategyOptions, ClampPositionOptions, CommonBracketRoundType, CompactLayoutOptions, CreateAnchoredPanelControllerOptions, CreateExistingDropzoneEntryOptions, CreateFileDropzoneEntryOptions, CreateOverlayUnsavedChangesGuardConfig, CreateTableRowsSourceOptions, CurrencyMaskOptions, DatePickerHost, DatePickerSurfaceBase, DatePickerSurfaceContext, DatePickerTriggerBase, DateRangeSide, DateRangeValue, DoubleEliminationBracketRoundType, DragToDismissContext, DragToDismissRef, DropzoneEntry, DropzoneEntrySource, DropzoneEntryStatus, DropzoneExistingFileInfo, DropzoneFileConstraints, DropzoneFileRejection, DropzoneFileRejectionReason, DropzoneFileValidationChannel, DropzoneUploadConfig, DropzoneUploadError, DropzoneUploadHandle, DropzoneUploadHandleOptions, DropzoneUploadState, DurationFormatSpec, DurationSegment, DurationUnit, EtBuiltInIconName, EthleteIconNameRegistry, EthleteIconVariantRegistry, FacebookVideoPlayer, FacebookWindow, FilterRowsConfig, FindCollisionOptions, FormErrorMessageResolver, FormFieldAppearance, FormFieldControl, FormFieldControlType, FormFieldDirectiveBase, FormFieldFill, FormFieldLabelMode, FormFieldSize, FormSupport, FullscreenAnimationCancellable, FullscreenAnimationDeps, FullscreenAnimationState, GenerateBracketDataOptions, GridAdapter, GridBreakpointConfig, GridBreakpointName, GridComponentRegistration, GridConfig, GridGeometry, GridItemActionsComponent, GridItemConfig, GridItemConstraints, GridItemPosition, GridLayoutEntry, GridSerializedState, GroupBracketRoundType, HintComponentBase, IconDefinition, IconOverride, InputMaskHost, InputTextAlignment, LabelDirectiveBase, MapLayoutOptions, MaskSpec, MaskValueMode, MatchParticipantId, MatchParticipantShortId, MatchParticipantSide, MatchPositionMaps, MenuAnchorPoint, MenuCloseReason, MenuItemActivationEvent, MenuItemActivationSource, MenuItemVariant, MenuOpenSource, MenuSelectionGroupDirectiveBase, MenuSelectionGroupItem, MenuSelectionItemKind, MenuSurfaceContext, MultiLanguageRichTextEditorLanguage, MultiLanguageRichTextEditorValue, NotificationAction, NotificationConfig, NotificationEntry, NotificationManager, NotificationManagerConfig, NotificationRef, NotificationStackContext, NotificationStatus, OtpInputCharset, OverlayAutoFocusTarget, OverlayBodyDividerType, OverlayBreakpointConfig, OverlayCloseGuard, OverlayConfig, OverlayDefinition, OverlayDefinitionConfig, OverlayDragToDismissConfig, OverlayLifecycleConfig, OverlayManager, OverlayMode, OverlayOpenConfig, OverlayOpener, OverlayOpenerConfig, OverlayRef, OverlayRole, OverlayRoute, OverlayRouter, OverlayRouterConfig, OverlayRouterNavigateConfig, OverlayRouterNavigationDirection, OverlayRouterResolvedPath, OverlayRouterTransitionType, OverlayStrategy, OverlayStrategyBreakpoint, OverlayStrategyContext, OverlayStrategyController, OverlayStrategyControllerMountConfig, OverlaySurfaceContext, OverlayTreeContainmentOptions, OverlayUnsavedChangesDismissSources, OverlayUnsavedChangesGuardRef, PaginateOptions, PaginationItem, PaginationItemType, PaginationLabels, PaginationRangeContext, PaginationRenderAs, ParticipantMatchResult, PhoneCountry, PhoneInputFlagContext, PhoneInputFlagCountry, PipCellData, PipChromeAnimations, PipChromeRef, PipChromeState, PipManager, PipSlotPlaceholderConfig, PixelRect, QueryParamOverlayDefinition, QueryParamOverlayDefinitionConfig, QueryParamOverlayHost, QueryParamOverlayOpener, QueryParamOverlayValue, RangeSliderValue, RatingIconContext, RatingIconState, ReconcilableColumn, ReduceSupportPresentationInput, RegisteredIconName, RegisteredIconVariant, RequiredLanguagesOptions, ResizeSpanBounds, ResolveClosestOverlayOptions, ResolveCollisionsOptions, ResolvedDropzoneUploadConfig, RichTextEditorLinkEditorValue, RichTextEditorQueryTriggerConfig, RichTextEditorTool, RichTextEditorToolButton, RichTextEditorToolDefinition, RichTextEditorToolsConfig, RichTextEditorTrigger, RichTextEditorTriggerItem, RichTextEditorTriggerItemResolver, RichTextEditorTriggerItemSource, RichTextEditorTriggerType, RowFloors, ScrollableActiveChildRef, ScrollableButtonPosition, ScrollableDirection, ScrollableIntersectionChange, ScrollableItemSize, ScrollableLoadingTemplatePosition, ScrollableLoadingTemplateRef, ScrollableMaskVariant, ScrollableNavigation, ScrollableNavigationItem, ScrollableScrollMode, ScrollableScrollOrigin, ScrollableScrollState, SelectAsyncOptions, SelectErrorContext, SelectFilterMode, SelectItem, SelectOptionData, SelectOptionGroupItem, SelectOptionTemplateContext, SelectOptionsFromQuery, SelectOptionsFromQueryConfig, SelectOptionsFromV2QueryConfig, SelectSelectedEntry, SelectSurfaceContext, SelectValueContext, SelectionListDirectiveBase, SelectionListItem, SerializeOptions, SidebarOverlay, SidebarOverlayConfig, SingleEliminationBracketRoundType, SkeletonShape, SliderHostBase, SliderThumbBase, SliderThumbLabelBase, SliderThumbLabelContext, SortRowsConfig, StreamConfig, StreamConsentConfig, StreamManager, StreamPipEntry, StreamPipWindowConfig, StreamPlayer, StreamPlayerCapabilities, StreamPlayerEntry, StreamPlayerErrorConfig, StreamPlayerErrorContext, StreamPlayerId, StreamPlayerLoadingConfig, StreamPlayerParams, StreamPlayerSlotHandle, StreamPlayerSlotOptions, StreamPlayerState, StreamScriptLoader, StreamSlotEntry, SupportContentState, SupportPresentationState, SupportTransitionDirection, SwissBracketRoundType, TabBarFit, TabBarOrientation, TabBarVariant, TabSize, TableCellContext, TableCellErrorMark, TableCellErrorTooltipConfig, TableCellSkeletonContext, TableCellState, TableCellStateValue, TableColumn, TableColumnAlign, TableColumnDef, TableColumnMenuConfig, TableColumnMeta, TableColumnState, TableColumnTemplate, TableColumnVisibilityHost, TableColumns, TableEmptyContext, TableErrorContext, TableExpandedRowContext, TableFeatureConfig, TableFeatureHost, TableFilter, TableFilterOption, TableFilterOptionContext, TableFilterOptionsProvider, TableFilterSelection, TableFiltersConfig, TableFooterContext, TableHeaderAdornment, TableHeaderContext, TableHeaderGroup, TableLabels, TableLabelsSource, TableLayer, TableLeadCellComponent, TableLeadColumn, TableReorderConfig, TableResizeConfig, TableRowKey, TableRowWindow, TableRowsDriver, TableRowsFromQuery, TableRowsFromQueryConfig, TableRowsFromV2QueryConfig, TableRowsQueryState, TableRowsSource, TableSelectionConfig, TableSort, TableSortDirection, TableSortValue, TableState, TableStatePersistenceConfig, TableStateSlice, TableStateStorage, TableStateStorageKind, TableStateStorageOptions, TableTemplateSlot, TableVirtualScrollConfig, TextAlign, TextareaResizeMode, TimePickerColumn, TimePickerOption, TimePickerUnit, ToggletipContent, TooltipContent, TournamentMode, TwitchEmbed, TwitchEmbedConstructor, TwitchEmbedPlayer, TwitchPlayerParams, TwitchWindow, V2DropzonePrepareArgsOf, V2DropzoneUploadConfig, V2PrepareArgsOf, ViewportTransformData, VimeoDurationChangeEvent, VimeoPlaybackEvent, VimeoPlayer, VimeoPlayerOptions, VimeoWindow, WindowControlButtonKind, WindowControlButtonSize, YtPlayer, YtPlayerConfig, YtPlayerErrorEvent, YtPlayerEvent, YtPlayerStateChangeEvent, YtPlayerVars, YtWindow };
18108
+ export { ACCORDION_ERROR_CODES, ACCORDION_GROUP_TOKEN, ACCORDION_IMPORTS, ACCORDION_TOKEN, ALIGN_CENTER_ICON, ALIGN_JUSTIFY_ICON, ALIGN_LEFT_ICON, ALIGN_RIGHT_ICON, ARROWS_LEFT_RIGHT_ICON, ARROW_OUT_UP_RIGHT_ICON, ARROW_RIGHT_ICON, ARROW_UP_ICON, AccordionComponent, AccordionContentDirective, AccordionDirective, AccordionGroupComponent, AccordionGroupDirective, AccordionHintDirective, AccordionLabelDirective, AccordionPanelDirective, AccordionTriggerDirective, BOLD_ICON, BRACKET_DATA_LAYOUT, BRACKET_ERROR_CODES, BRACKET_IMPORTS, BRACKET_ROUND_MIRROR_TYPE, BRACKET_SWISS_GROUP_COLOR_TYPE, BREADCRUMB_ERROR_CODES, BREADCRUMB_IMPORTS, BREADCRUMB_LABELS, BREADCRUMB_SEGMENT_TOKEN, BREADCRUMB_TOKEN, BUTTON_ICON_ALIGNMENTS, BUTTON_IMPORTS, BUTTON_SIZES, BUTTON_SPINNER_CONFIG, BUTTON_TYPES, BUTTON_VARIANTS, BracketComponent, BracketDefaultContinueComponent, BracketDefaultMatchComponent, BracketDefaultRoundHeaderComponent, BracketMap, BrandLoaderComponent, BreadcrumbComponent, BreadcrumbDirective, BreadcrumbItemDirective, BreadcrumbItemTemplateDirective, BreadcrumbOutletComponent, BreadcrumbSegmentDirective, BreadcrumbSeparatorDirective, ButtonComponent, ButtonDirective, ButtonStylesDirective, CALENDAR_ERROR_CODES, CALENDAR_ICON, CALENDAR_IMPORTS, CALENDAR_LABELS, CAROUSEL_AUTOPLAY_TOKEN, CAROUSEL_ERROR_CODES, CAROUSEL_IMPORTS, CAROUSEL_LABELS, CAROUSEL_SLIDE_ALIGNMENTS, CAROUSEL_TOKEN, CAROUSEL_TRANSITIONS, CAROUSEL_TRANSITION_DRIVERS, CASCADER_ERROR_CODES, CASCADER_IMPORTS, CASCADER_LABELS, CASCADER_SELECTABLE_LEVELS, CHECKBOX_IMPORTS, CHECKBOX_OPTION_VARIANTS, CHECK_ICON, CHEVRON_ICON, CHIP_ERROR_CODES, CHIP_IMPORTS, CHIP_LABELS, CHOICE_FIELD_IMPORTS, CHOICE_FIELD_VARIANTS, CLIPBOARD_CHECK_ICON, CLOCK_ICON, CODE_ICON, COLOR_INPUT_IMPORTS, COMMON_BRACKET_ROUND_TYPE, CalendarCellDirective, CalendarComponent, CalendarDirective, CalendarGridDirective, CarouselAutoplayDirective, CarouselComponent, CarouselDirective, CarouselItemDirective, CarouselNextDirective, CarouselPlayToggleDirective, CarouselPreviousDirective, CarouselSlideDirective, CascaderColumnDirective, CascaderComponent, CascaderDirective, CascaderNodeDirective, CascaderPanelComponent, CascaderSearchDirective, CascaderSearchOptionDirective, CascaderSurfaceDirective, CascaderTriggerDirective, CheckboxComponent, CheckboxDirective, CheckboxGroupComponent, CheckboxOptionComponent, ChipComponent, ChipDirective, ChipRemoveDirective, ChoiceFieldComponent, ColorInputComponent, ColorInputDirective, CounterComponent, DAILYMOTION_PLAYER_TOKEN, DATE_FORMAT, DATE_INPUT_ERROR_CODES, DATE_INPUT_IMPORTS, DATE_LOCALE, DATE_PICKER_HOST, DATE_RANGE_INPUT_ERROR_CODES, DATE_RANGE_INPUT_IMPORTS, DATE_TIME_INPUT_ERROR_CODES, DATE_TIME_INPUT_IMPORTS, DATE_TIME_LABELS, DEFAULT_BREADCRUMB_LABELS, DEFAULT_BREAKPOINTS, DEFAULT_CALENDAR_LABELS, DEFAULT_CAROUSEL_LABELS, DEFAULT_CASCADER_LABELS, DEFAULT_CHIP_LABELS, DEFAULT_DATE_TIME_LABELS, DEFAULT_DROPZONE_LABELS, DEFAULT_FILTER_OVERLAY_LABELS, DEFAULT_FORM_FIELD_LABELS, DEFAULT_GRID_LABELS, DEFAULT_ICON_VARIANT, DEFAULT_INPUT_LABELS, DEFAULT_LOADER_LABELS, DEFAULT_NOTIFICATION_LABELS, DEFAULT_NOTIFICATION_MANAGER_CONFIG, DEFAULT_PAGINATION_LABELS, DEFAULT_PHONE_INPUT_LABELS, DEFAULT_PIP_WINDOW_CONFIG, DEFAULT_QUERY_ERROR_LABELS, DEFAULT_RICH_TEXT_EDITOR_LABELS, DEFAULT_RICH_TEXT_EDITOR_TOOLS, DEFAULT_SELECT_LABELS, DEFAULT_SLIDER_LABELS, DEFAULT_STREAM_LABELS, DEFAULT_STREAM_PLAYER_STATE, DEFAULT_TABLE_LABELS, DEFAULT_TIME_PICKER_LABELS, DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE, DROPZONE_ENTRY_STATUSES, DROPZONE_ERROR_CODES, DROPZONE_FILES_ERROR_KIND, DROPZONE_FILE_CONSTRAINTS, DROPZONE_FILE_REJECTION_REASONS, DROPZONE_IMPORTS, DROPZONE_LABELS, DURATION_INPUT_ERROR_CODES, DURATION_INPUT_IMPORTS, DailymotionPlayerComponent, DailymotionPlayerDirective, DailymotionPlayerParamsDirective, DailymotionPlayerSlotComponent, DateInputComponent, DateInputDirective, DateInputFieldDirective, DatePickerPanelComponent, DatePickerSurfaceDirective, DatePickerTriggerDirective, DateRangeInputComponent, DateRangeInputDirective, DateRangeInputFieldDirective, DateTimeInputComponent, DateTimeInputDirective, DateTimeInputFieldDirective, DescriptionComponent, DropzoneComponent, DropzoneDirective, DurationInputComponent, DurationInputDirective, DurationInputFieldDirective, ELLIPSIS_ICON, ELLIPSIS_VERTICAL_ICON, ET_BUILT_IN_ICON_NAMES, EYE_ICON, EYE_SLASH_ICON, FACEBOOK_PLAYER_TOKEN, FILE_ICON, FILTER_ICON, FILTER_OVERLAY_ERROR_CODES, FILTER_OVERLAY_IMPORTS, FILTER_OVERLAY_LABELS, FILTER_OVERLAY_TOKEN, FLOATING_ACTION_ERROR_CODES, FLOATING_ACTION_IMPORTS, FLOATING_ACTION_STATES, FLOATING_ACTION_TOKEN, FLOPPY_DISK_ICON, FOCUS_FRAME_ICON, FORM_ERROR_MESSAGE_RESOLVER, FORM_FIELD_APPEARANCES, FORM_FIELD_CONTROL_TYPES, FORM_FIELD_ERROR_CODES, FORM_FIELD_FILLS, FORM_FIELD_IMPORTS, FORM_FIELD_LABELS, FORM_FIELD_LABEL_MODES, FORM_FIELD_SIZES, FORM_FIELD_TOKEN, FabComponent, FacebookPlayerComponent, FacebookPlayerDirective, FacebookPlayerParamsDirective, FacebookPlayerSlotComponent, FilterOverlayResetDirective, FilterOverlaySubmitDirective, FloatingActionAnchorDirective, FloatingActionDirective, FloatingActionScopeDirective, FloatingActionTopDirective, FloatingActionTriggerDirective, FocusRingDirective, FormErrorComponent, FormFieldComponent, FormFieldDirective, GERMAN_FILTER_OVERLAY_LABELS, GERMAN_QUERY_ERROR_LABELS, GRID_2X2_ICON, GRID_ERROR_CODES, GRID_IMPORTS, GRID_LABELS, GRID_TOKEN, GROUP_BRACKET_ROUND_TYPE, GridComponent, GridDebugComponent, GridDirective, GridDragDirective, GridItemComponent, GridItemDefaultActionsComponent, GridItemDirective, GridItemRef, GridItemToolbarComponent, GridResizeDirective, HEADING_1_ICON, HEADING_2_ICON, HEADING_3_ICON, HintComponent, ICONS_TOKEN, ICON_DIRECTIVE_TOKEN, ICON_ERROR_CODES, ICON_IMPORTS, ICON_OVERRIDES_TOKEN, INITIAL_SUPPORT_PRESENTATION_STATE, INPUT_IMPORTS, INPUT_LABELS, INPUT_MASK_HOST, INPUT_TEXT_ALIGNMENTS, INPUT_TYPES, INTERACTIVE_TAGS, ITALIC_ICON, IconButtonComponent, IconDirective, InputComponent, InputDirective, InputMaskDirective, InputPrefixDirective, InputSuffixDirective, KICK_PLAYER_TOKEN, KickPlayerComponent, KickPlayerDirective, KickPlayerParamsDirective, KickPlayerSlotComponent, LINK_ICON, LIST_BULLETED_ICON, LIST_NUMBERED_ICON, LOADER_LABELS, LOCK_ICON, LabelDirective, MASKED_INPUT_ERROR_CODES, MASKED_INPUT_IMPORTS, MASK_VALUE_MODES, MASONRY_ERROR_CODES, MASONRY_IMPORTS, MASONRY_TOKEN, MENU_ERROR_CODES, MENU_IMPORTS, MENU_ITEM_VARIANTS, MENU_SELECTION_GROUP_MULTIPLE, MENU_SELECTION_GROUP_TOKEN, MENU_SELECTION_ITEM_KIND, MINUS_ICON, MULTI_LANGUAGE_RICH_TEXT_EDITOR_ERROR_CODES, MULTI_LANGUAGE_RICH_TEXT_EDITOR_IMPORTS, MasonryDirective, MasonryItemDirective, MenuCheckboxGroupComponent, MenuCheckboxItemComponent, MenuComponent, MenuContextTriggerDirective, MenuDirective, MenuGroupLabelComponent, MenuItemComponent, MenuItemDirective, MenuItemShortcutComponent, MenuPanelDirective, MenuRadioGroupComponent, MenuRadioItemComponent, MenuSearchDirective, MenuSelectionGroupDirective, MenuSelectionItemDirective, MenuSeparatorComponent, MenuSurfaceDirective, MenuTriggerDirective, MultiLanguageRichTextEditorComponent, MultiLanguageRichTextEditorDirective, MultiLanguageRichTextEditorLanguageToolComponent, NAV_TABS_TOKEN, NAV_TAB_IMPORTS, NOTIFICATION_ERROR_CODES, NOTIFICATION_IMPORTS, NOTIFICATION_LABELS, NOTIFICATION_STACK_CONTEXT_TOKEN, NOTIFICATION_STATUS, NUMBER_INPUT_IMPORTS, NavTabLinkComponent, NavTabLinkDirective, NavTabsComponent, NavTabsDirective, NavTabsOutletComponent, NavTabsOutletDirective, NotificationActionDirective, NotificationComponent, NotificationDirective, NotificationDismissDirective, NotificationItemDirective, NotificationStackDirective, NumberInputComponent, NumberInputDirective, OTP_INPUT_IMPORTS, OVERLAY_BACK_OR_CLOSE_TOKEN, OVERLAY_BODY_TOKEN, OVERLAY_CONFIG_CLASS_KEYS, OVERLAY_CONTENT_IMPORTS, OVERLAY_ERROR_CODES, OVERLAY_FOOTER_TOKEN, OVERLAY_HEADER_TEMPLATE_TOKEN, OVERLAY_HEADER_TOKEN, OVERLAY_IMPORTS, OVERLAY_MAIN_TOKEN, OVERLAY_QUERY_PARAM_INPUT_NAME, OVERLAY_REF, OVERLAY_ROUTER_CONFIG_TOKEN, OVERLAY_ROUTER_LINK_TOKEN, OVERLAY_ROUTER_OUTLET_DISABLED_TEMPLATE_TOKEN, OVERLAY_ROUTER_OUTLET_TOKEN, OVERLAY_ROUTER_TOKEN, OVERLAY_SHARED_ROUTE_TEMPLATE_TOKEN, OtpInputComponent, OtpInputDirective, OverlayAnchorDirective, OverlayBackOrCloseDirective, OverlayBodyComponent, OverlayCloseDirective, OverlayContainerComponent, OverlayDirective, OverlayFooterDirective, OverlayHeaderDirective, OverlayHeaderTemplateDirective, OverlayMainDirective, OverlayOriginCloneComponent, OverlayRouteHeaderTemplateOutletComponent, OverlayRouterLinkDirective, OverlayRouterOutletComponent, OverlayRouterOutletDisabledTemplateDirective, OverlaySharedRouteTemplateDirective, OverlaySharedRouteTemplateOutletComponent, OverlaySidebarComponent, OverlaySidebarPageComponent, OverlaySurfaceDirective, OverlayTitleDirective, OverlayTriggerDirective, PAGINATION_IMPORTS, PAGINATION_LABELS, PARAGRAPH_ICON, PASSWORD_INPUT_IMPORTS, PAUSE_ICON, PENCIL_ICON, PHONE_COUNTRIES, PHONE_INPUT_ERROR_CODES, PHONE_INPUT_IMPORTS, PHONE_INPUT_LABELS, PICTURE_IMPORTS, PICTURE_STATES, PIP_CHROME_REF_TOKEN, PIP_ENTRY_TOKEN, PIP_WINDOW_ASPECT_RATIO_TOKEN, PLAY_ICON, PLUS_ICON, PaginationComponent, PaginationDirective, PaginationSeoDirective, PasswordInputComponent, PasswordInputDirective, PhoneInputComponent, PhoneInputDirective, PhoneInputFieldDirective, PhoneInputFlagDirective, PictureComponent, PictureErrorDirective, PicturePlaceholderDirective, PipBackDirective, PipBringBackDirective, PipCellDirective, PipCloseDirective, PipCollapseOverlayDirective, PipGridToggleDirective, PipPlayerComponent, PipSlotPlaceholderComponent, PipStageDirective, PipTitleBarDirective, PipTitleBarTemplateDirective, PipWindowComponent, PipWindowParamsDirective, ProgressBarComponent, QUERY_DEVTOOLS_IMPORTS, QUERY_ERROR_ERROR_CODES, QUERY_ERROR_IMPORTS, QUERY_ERROR_LABELS, QUERY_ERROR_TOKEN, QueryDevtoolsComponent, QueryDevtoolsJsonComponent, QueryDevtoolsToggleComponent, QueryErrorActionsDirective, QueryErrorComponent, QueryErrorDirective, QueryErrorTitleDirective, QueryParamOverlayLinkDirective, RADIO_VARIANTS, RATING_IMPORTS, RICH_TEXT_EDITOR_HEADING_OPTIONS, RICH_TEXT_EDITOR_IMPORTS, RICH_TEXT_EDITOR_INLINE_TOOLS, RICH_TEXT_EDITOR_LABELS, RICH_TEXT_EDITOR_LANGUAGE_TOOL, RICH_TEXT_EDITOR_TOKEN_CODEC, RICH_TEXT_EDITOR_TOKEN_PALETTE_IMPORTS, RICH_TEXT_EDITOR_TOOL, RICH_TEXT_EDITOR_TOOLS, RICH_TEXT_EDITOR_TOOL_BUTTONS, RICH_TEXT_EDITOR_TRIGGERS_IMPORTS, ROTATE_RIGHT_ICON, RadioComponent, RadioGroupComponent, RangeSliderComponent, RangeSliderDirective, RatingComponent, RatingDirective, RatingIconDirective, RichTextEditorAlignToolComponent, RichTextEditorComponent, RichTextEditorDirective, RichTextEditorFloatingToolbarComponent, RichTextEditorFloatingToolbarDirective, RichTextEditorLinkEditorComponent, RichTextEditorLinkEditorDirective, RichTextEditorTableToolComponent, RichTextEditorTokenPaletteComponent, RichTextEditorTokenPopupComponent, RichTextEditorTriggersDirective, SCROLLABLE_ERROR_CODES, SCROLLABLE_IMPORTS, SEGMENTED_BUTTON_GROUP_VARIANTS, SELECTION_LIST_MULTIPLE, SELECTION_LIST_TOKEN, SELECT_ERROR_CODES, SELECT_FILTER_MODES, SELECT_IMPORTS, SELECT_LABELS, SIDEBAR_OVERLAY_CONFIG, SIDEBAR_OVERLAY_TOKEN, SINGLE_ELIMINATION_BRACKET_ROUND_TYPE, SKELETON_IMPORTS, SLIDER_ERROR_CODES, SLIDER_IMPORTS, SLIDER_LABELS, SLIDER_TOKEN, SNAP_HYSTERESIS, SOOP_PLAYER_TOKEN, SPLIT_BUTTON_ERROR_CODES, STAR_ICON, STREAM_CONSENT_TOKEN, STREAM_IMPORTS, STREAM_LABELS, STREAM_PLAYER_COMPONENT_TOKEN, STREAM_PLAYER_ERROR_CONTEXT_TOKEN, STREAM_PLAYER_ERROR_TOKEN, STREAM_PLAYER_PARAMS_TOKEN, STREAM_PLAYER_SLOT_TOKEN, STREAM_PLAYER_TOKEN, STREAM_SLOT_PLAYER_ID_TOKEN, STREAM_USER_CONSENT_PROVIDER_TOKEN, STRIKETHROUGH_ICON, SUPPORT_CONTENT_STATE, SUPPORT_TRANSITION_DIRECTION, SWISS_ADVANCE_WINS, SWISS_BRACKET_ROUND_TYPE, SWISS_ELIMINATE_LOSSES, SWITCH_IMPORTS, ScrollableActiveChildDirective, ScrollableButtonsDirective, ScrollableComponent, ScrollableDarkenDirective, ScrollableDirective, ScrollableDragDirective, ScrollableIgnoreChildDirective, ScrollableLoadingTemplateDirective, ScrollableMasksDirective, ScrollableNavigationDirective, ScrollableSnapDirective, SegmentedButtonComponent, SegmentedButtonGroupComponent, SelectComponent, SelectDirective, SelectEmptyDirective, SelectErrorDirective, SelectListboxDirective, SelectLoadingDirective, SelectOptionComponent, SelectOptionDirective, SelectOptionGroupComponent, SelectOptionGroupDirective, SelectOptionTemplateDirective, SelectOptionsDirective, SelectPanelComponent, SelectSearchDirective, SelectSurfaceDirective, SelectTriggerDirective, SelectValueDirective, SelectViewportDirective, SelectVirtualOptionComponent, SelectVirtualOptionDirective, SelectionListControlDirective, SelectionListDirective, SelectionOptionDirective, SkeletonComponent, SkeletonItemComponent, SkeletonTextComponent, SliderComponent, SliderDirective, SliderThumbDirective, SliderThumbLabelDirective, SliderTrackDirective, SoopPlayerComponent, SoopPlayerDirective, SoopPlayerParamsDirective, SoopPlayerSlotComponent, SpinnerComponent, SplitButtonActionDirective, SplitButtonComponent, SplitButtonDirective, SplitButtonTriggerDirective, StreamConsentAcceptDirective, StreamConsentComponent, StreamConsentDirective, StreamPipChromeComponent, StreamPlayerErrorComponent, StreamPlayerErrorDirective, StreamPlayerLoadingComponent, StreamPlayerSlotDirective, SwitchComponent, SwitchDirective, TABLE_CELL_ERROR_TOOLTIP_IMPORTS, TABLE_COLUMN_CHOOSER_IMPORTS, TABLE_COLUMN_MENU_IMPORTS, TABLE_ERROR_CODES, TABLE_FEATURE_HOST, TABLE_FILTER_IMPORTS, TABLE_ICON, TABLE_IMPORTS, TABLE_LABELS, TABLE_REORDER_IMPORTS, TABLE_RESIZE_IMPORTS, TABLE_SELECTION_IMPORTS, TABLE_STATE_PERSISTENCE_IMPORTS, TABLE_VIRTUAL_SCROLL_IMPORTS, TAB_BAR_FITS, TAB_BAR_ORIENTATIONS, TAB_BAR_TOKEN, TAB_BAR_TRIGGER_TOKEN, TAB_BAR_VARIANTS, TAB_ERROR_CODES, TAB_GROUP_TOKEN, TAB_IMPORTS, TAB_PANEL_TOKEN, TAB_SIZES, TAG_INPUT_ERROR_CODES, TAG_INPUT_IMPORTS, TEXTAREA_IMPORTS, TEXTAREA_RESIZE_MODES, TEXT_ALIGNS, TIKTOK_PLAYER_TOKEN, TIMES_ICON, TIME_FORMAT, TIME_INPUT_ERROR_CODES, TIME_INPUT_IMPORTS, TIME_PICKER_ERROR_CODES, TIME_PICKER_IMPORTS, TIME_PICKER_LABELS, TOGGLETIP_ERROR_CODES, TOGGLETIP_IMPORTS, TOOLTIP_ERROR_CODES, TOOLTIP_IMPORTS, TOURNAMENT_MODE, TRIANGLE_EXCLAMATION_ICON, TWITCH_PLAYER_TOKEN, TabBarDirective, TabBarTriggerDirective, TabBarUnderlineDirective, TabComponent, TabGroupComponent, TabGroupDirective, TabLabelDirective, TabPanelDirective, TabTriggerDirective, TableCellDirective, TableCellErrorMarkComponent, TableCellErrorTooltipDirective, TableCellSkeletonDirective, TableColumnChooserComponent, TableColumnMenuDirective, TableColumnMenuTriggerComponent, TableComponent, TableDetailStylesComponent, TableExpanderCellComponent, TableFilterOptionDirective, TableFilterTriggerComponent, TableFiltersDirective, TableFooterCellDirective, TableFooterDirective, TableHeaderCellDirective, TableReorderDirective, TableReorderOverlayComponent, TableResizeDirective, TableResizeGripComponent, TableSelectAllCellComponent, TableSelectCellComponent, TableSelectionDirective, TableStatePersistenceDirective, TableVirtualScrollDirective, TableVirtualScrollStylesComponent, TagInputComponent, TagInputDirective, TagInputFieldDirective, TextButtonComponent, TextFieldControlDirective, TextareaComponent, TextareaDirective, TikTokPlayerComponent, TikTokPlayerDirective, TikTokPlayerParamsDirective, TikTokPlayerSlotComponent, TimeInputComponent, TimeInputDirective, TimeInputFieldDirective, TimePickerColumnDirective, TimePickerComponent, TimePickerDirective, TimePickerOptionDirective, ToggletipCloseDirective, ToggletipComponent, ToggletipDirective, ToggletipTriggerDirective, TooltipComponent, TooltipDirective, TwitchPlayerComponent, TwitchPlayerDirective, TwitchPlayerParamsDirective, TwitchPlayerSlotComponent, UNDERLINE_ICON, UNIT_MS, UPLOAD_ICON, VIMEO_PLAYER_TOKEN, VimeoPlayerComponent, VimeoPlayerDirective, VimeoPlayerParamsDirective, VimeoPlayerSlotComponent, WINDOW_CONTROL_BUTTON_KINDS, WINDOW_CONTROL_BUTTON_SIZES, WindowControlButtonComponent, YOUTUBE_PLAYER_SLOT_TOKEN, YOUTUBE_PLAYER_TOKEN, YoutubePlayerComponent, YoutubePlayerDirective, YoutubePlayerParamsDirective, YoutubePlayerSlotComponent, YoutubePlayerSlotDirective, abortFullscreenAnimation, anchoredDialogOverlayStrategy, anchoredOverlayStrategy, autoPlace, bottomSheetOverlayStrategy, buildAnchoredRuntimePositionStrategy, canHaveChildren, canRenderLayoutInTournamentMode, cascaderFromQuery, centeredOverlayStrategy, clampPosition, clampResizeRect, cleanupFullscreenAnimation, cleanupFullscreenAnimationStyles, compactLayout, computeGeometry, computeGridHeight, createAnchoredPanelController, createAutoScroller, createBracket, createBracketBase, createCardMask, createCurrencyMask, createDefaultDropzoneArgs, createDropzoneUpload, createExistingDropzoneEntry, createFileDropzoneEntry, createGridAdapter, createIbanMask, createMatchesMapBase, createNewMatchParticipantBase, createNotificationRef, createOverlayOpener, createOverlayRef, createOverlayStrategyController, createOverlayUnsavedChangesGuard, createParticipantsMapBase, createPipChromeAnimations, createPipChromeState, createRichTextEditorTrigger, createRichTextEditorTriggerWithQuery, createRoundsMapBase, createStreamConfig, createStreamPlayerSlot, createTableRowsSource, createTableStateStorage, createV2DropzoneUpload, defaultCompareWith, defaultDropzoneRejectionMessage, defineOverlay, defineQueryParamOverlay, deriveDurationFormatSpec, deserializeGridLayout, deserializeTableState, dialogOverlayStrategy, disposeDropzoneEntry, dropzoneFiles, enableDragToDismiss, extractFirstImageUrl, filterOverlayLabelsForLocale, filterOverlayPreviewFromQuery, filterRows, findCollision, findNextRelevantHtmlElement, findScrollableAncestor, formatDuration, formatFileSize, fromGridPosition, fullScreenDialogOverlayStrategy, generateBracketDataForEthlete, generateBracketRoundSwissGroupMaps, generateMatchPosition, generateMatchRelationPositions, generateMatchRelationsNew, generateRoundRelationsNew, generateRoundTypeFromEthleteRoundType, generateTournamentModeFormEthleteRounds, getAvailableSwissGroupsForRound, getClosestOverlay, getOriginCoordinatesAndDimensions, getSwissGroupColorType, hysteresisRound, iconRegistryKey, indexOfNode, injectAnchoredDialogStrategy, injectAnchoredDialogStrategyDefaults, injectBottomSheetStrategy, injectBottomSheetStrategyDefaults, injectBracketConfig, injectBreadcrumbLabels, injectBreadcrumbManager, injectCalendarLabels, injectCarouselLabels, injectCascaderLabels, injectChipLabels, injectDateFormat, injectDateLocale, injectDateTimeLabels, injectDialogStrategy, injectDialogStrategyDefaults, injectDropzoneLabels, injectFilterOverlay, injectFilterOverlayLabels, injectFormFieldLabels, injectFormSupport, injectFullscreenDialogStrategy, injectFullscreenDialogStrategyDefaults, injectGridConfig, injectGridLabels, injectInputLabels, injectLeftSheetStrategy, injectLeftSheetStrategyDefaults, injectLoaderLabels, injectNotificationLabels, injectNotificationManager, injectNotificationManagerConfig, injectOverlayManager, injectOverlayRouter, injectOverlayScrollBlocker, injectOverlaySurfaceContext, injectPaginationLabels, injectPhoneInputLabels, injectPictureConfig, injectPipChromeManager, injectPipManager, injectPipSlotPlaceholderConfig, injectQueryErrorLabels, injectRichTextEditorLabels, injectRichTextEditorTools, injectRightSheetStrategy, injectRightSheetStrategyDefaults, injectSelectLabels, injectSidebarOverlay, injectSliderLabels, injectStreamConfig, injectStreamConsentConfig, injectStreamLabels, injectStreamManager, injectStreamPlayerErrorConfig, injectStreamPlayerLoadingConfig, injectStreamScriptLoader, injectStreamUserConsentProvider, injectTableFeatureHost, injectTableLabels, injectTimeFormat, injectTimePickerLabels, injectTopSheetStrategy, injectTopSheetStrategyDefaults, isFileAccepted, isHtmlElement, isInteractiveElement, isPointerEvent, isTargetInsideOverlayTree, isTouchEvent, itemsCollide, leftSheetOverlayStrategy, legacyQueryErrorSource, mapLayoutToBreakpoint, matchCountryByDialCode, mergeOverlayBreakpointConfigs, mergeOverlayConfigs, nodesEqual, normalizePictureSizes, normalizePictureSource, paginate, parseDuration, phoneCountryFlag, phoneCountryName, pixelRectsEqual, positionToPixelRect, positionsEqual, projectDragCell, provideAnchoredDialogStrategy, provideAnchoredDialogStrategyDefaults, provideBottomSheetStrategy, provideBottomSheetStrategyDefaults, provideBracketConfig, provideBreadcrumbLabels, provideBreadcrumbManager, provideCalendarLabels, provideCarouselLabels, provideCascaderLabels, provideChipLabels, provideDateFormat, provideDateLocale, provideDateTimeLabels, provideDialogStrategy, provideDialogStrategyDefaults, provideDropzoneLabels, provideFilterOverlay, provideFilterOverlayLabels, provideFormErrorMessageResolver, provideFormFieldLabels, provideFormSupport, provideFullscreenDialogStrategy, provideFullscreenDialogStrategyDefaults, provideGridConfig, provideGridLabels, provideIconOverrides, provideIcons, provideInputLabels, provideLeftSheetStrategy, provideLeftSheetStrategyDefaults, provideLoaderLabels, provideNotificationLabels, provideNotificationManager, provideNotificationManagerConfig, provideNotificationManagerInstance, provideOverlay, provideOverlayManager, provideOverlayRouter, provideOverlayRouterConfig, provideOverlayRouterService, provideOverlayScrollBlocker, providePaginationLabels, providePhoneInputLabels, providePictureConfig, providePipChromeManager, providePipManager, providePipSlotPlaceholderConfig, provideQueryErrorLabels, provideRichTextEditorAlignmentTool, provideRichTextEditorLabels, provideRichTextEditorLanguageTool, provideRichTextEditorTableTool, provideRichTextEditorTokenRendering, provideRichTextEditorTools, provideRightSheetStrategy, provideRightSheetStrategyDefaults, provideSelectLabels, provideSidebarOverlay, provideSidebarOverlayConfig, provideSidebarOverlayService, provideSliderLabels, provideStreamConfig, provideStreamConsentConfig, provideStreamLabels, provideStreamManager, provideStreamPlayerErrorConfig, provideStreamPlayerLoadingConfig, provideTableLabels, provideTimeFormat, provideTimePickerLabels, provideTopSheetStrategy, provideTopSheetStrategyDefaults, queryErrorLabelsForLocale, queryErrorResponseFromLegacyError, reconcileColumnOrder, reconcileColumnWidths, reconcileHiddenColumns, reduceSupportPresentation, registerSingleton, requiredLanguages, resizeSpanBounds, resolveBreakpoint, resolveClosestOverlay, resolveCollisions, resolveFilterOverlaySubmitButton, richTextEditorToolLabel, rightSheetOverlayStrategy, rowsToPixelHeight, selectOptionsFromQuery, selectOptionsFromV2Query, serializeGridLayout, serializeTableState, snapResizeSpan, sortRows, spanHeight, spanWidth, startFullscreenEnterAnimation, startFullscreenLeaveAnimation, stripTrunkZero, supportPresentationIncludesState, tableFeatureConfig, tableRowsFromQuery, tableRowsFromV2Query, toChildrenObservable, toGridPosition, toPathObservable, toSearchObservable, topSheetOverlayStrategy, transformingBottomSheetToDialogOverlayStrategy, transformingFullScreenDialogToDialogOverlayStrategy, transformingFullScreenDialogToRightSheetOverlayStrategy, wireFormSupport, withPictureBaseUrl };
18109
+ export type { AccordionHeadingLevel, AnchoredDialogOverlayStrategyOptions, AnchoredOverlayStrategyOptions, AnchoredPanelCloseInfo, AnchoredPanelOverlayRef, AnchoredPanelSurfaceLike, AnchoredPositionOptions, AnyDropzoneUploadConfig, AnyTableColumn, AutoPlaceOptions, AutoScrollPointer, AutoScroller, Bracket, BracketBase, BracketConfig, BracketDataLayout, BracketDataSource, BracketMatch, BracketMatchBase, BracketMatchFactor, BracketMatchId, BracketMatchParticipant, BracketMatchParticipantBase, BracketMatchParticipantWithRelationsBase, BracketMatchPosition, BracketMatchRelation, BracketMatchRelationNothingToOne, BracketMatchRelationOneToNothing, BracketMatchRelationOneToOne, BracketMatchRelationTwoToNothing, BracketMatchRelationTwoToOne, BracketMatchShortId, BracketMatchSource, BracketMatchStatus, BracketMatchWithRelationsBase, BracketParticipant, BracketParticipantBase, BracketParticipantMatch, BracketParticipantWithRelationsBase, BracketRound, BracketRoundBase, BracketRoundId, BracketRoundMapWithSwissData, BracketRoundMirrorType, BracketRoundPosition, BracketRoundRelation, BracketRoundRelationNothingToOne, BracketRoundRelationOneToNothing, BracketRoundRelationOneToOne, BracketRoundRelationTwoToNothing, BracketRoundRelationTwoToOne, BracketRoundShortId, BracketRoundSource, BracketRoundSwissData, BracketRoundSwissGroup, BracketRoundSwissGroupId, BracketRoundSwissGroupMap, BracketRoundType, BracketRoundWithRelationsBase, BracketSwissColors, BracketSwissConfig, BracketSwissGroupColorType, BreadcrumbCrumb, BreadcrumbLabels, BreadcrumbRenderItem, BreadcrumbSegment, ButtonIconAlignment, ButtonSize, CalendarCell, CalendarLabels, CalendarMode, CalendarRange, CalendarWeekday, CarouselAutoplayPauseReason, CarouselLabels, CarouselResolvedTransitionDriver, CarouselSlideAlign, CarouselSlideContext, CarouselSlideTemplateRef, CarouselTransition, CarouselTransitionDriver, CascaderColumnState, CascaderCompareWith, CascaderDataSource, CascaderFromQueryConfig, CascaderFromQuerySearchConfig, CascaderLabels, CascaderNode, CascaderNodeSignal, CascaderSearchState, CascaderSelectableLevels, CascaderSurfaceContext, CenteredOverlayStrategyOptions, CheckboxOptionVariant, ChipLabels, ChoiceFieldVariant, ClampPositionOptions, CommonBracketRoundType, CompactLayoutOptions, CounterComponentBase, CreateAnchoredPanelControllerOptions, CreateExistingDropzoneEntryOptions, CreateFileDropzoneEntryOptions, CreateOverlayUnsavedChangesGuardConfig, CreateTableRowsSourceOptions, CurrencyMaskOptions, DatePickerHost, DatePickerSurfaceBase, DatePickerSurfaceContext, DatePickerTriggerBase, DateRangeSide, DateRangeValue, DateTimeLabels, DoubleEliminationBracketRoundType, DragDismissMomentum, DragToDismissContext, DragToDismissRef, DropzoneEntry, DropzoneEntrySource, DropzoneEntryStatus, DropzoneExistingFileInfo, DropzoneFileConstraints, DropzoneFileRejection, DropzoneFileRejectionReason, DropzoneFileValidationChannel, DropzoneLabels, DropzoneUploadConfig, DropzoneUploadError, DropzoneUploadHandle, DropzoneUploadHandleOptions, DropzoneUploadState, DurationFormatSpec, DurationSegment, DurationUnit, EtBuiltInIconName, EthleteIconNameRegistry, EthleteIconVariantRegistry, FacebookVideoPlayer, FacebookWindow, FilterOverlay, FilterOverlayConfig, FilterOverlayDraft, FilterOverlayLabels, FilterOverlayPreview, FilterOverlayResult, FilterOverlaySubmitButton, FilterOverlaySubmitState, FilterOverlayValueOf, FilterRowsConfig, FindCollisionOptions, FloatingActionState, FormErrorMessageResolver, FormFieldAppearance, FormFieldControl, FormFieldControlType, FormFieldDirectiveBase, FormFieldFill, FormFieldLabelMode, FormFieldLabels, FormFieldSize, FormSupport, FullscreenAnimationCancellable, FullscreenAnimationDeps, FullscreenAnimationState, GenerateBracketDataOptions, GridAdapter, GridBreakpointConfig, GridBreakpointName, GridComponentRegistration, GridConfig, GridGeometry, GridItemActionsComponent, GridItemConfig, GridItemConstraints, GridItemPosition, GridLabels, GridLayoutEntry, GridSerializedState, GroupBracketRoundType, HintComponentBase, IconDefinition, IconOverride, InputLabels, InputMaskHost, InputTextAlignment, LabelDirectiveBase, LegacyQueryErrorSource, LoaderLabels, MapLayoutOptions, MaskSpec, MaskValueMode, MasonryColumns, MasonryPacking, MasonryPlacement, MatchParticipantId, MatchParticipantShortId, MatchParticipantSide, MatchPositionMaps, MenuAnchorPoint, MenuCloseReason, MenuItemActivationEvent, MenuItemActivationSource, MenuItemVariant, MenuOpenSource, MenuSelectionGroupDirectiveBase, MenuSelectionGroupItem, MenuSelectionItemKind, MenuSurfaceContext, MultiLanguageRichTextEditorLanguage, MultiLanguageRichTextEditorValue, NotificationAction, NotificationConfig, NotificationEntry, NotificationLabels, NotificationManager, NotificationManagerConfig, NotificationRef, NotificationStackContext, NotificationStatus, OtpInputCharset, OverlayAutoFocusTarget, OverlayBodyDividerType, OverlayBreakpointConfig, OverlayCloseGuard, OverlayConfig, OverlayDefinition, OverlayDefinitionConfig, OverlayDragToDismissConfig, OverlayDragToDismissDirection, OverlayDragToDismissPhysicalDirection, OverlayLifecycleConfig, OverlayManager, OverlayMode, OverlayOpenConfig, OverlayOpener, OverlayOpenerConfig, OverlayRef, OverlayRole, OverlayRoute, OverlayRouter, OverlayRouterConfig, OverlayRouterNavigateConfig, OverlayRouterNavigationDirection, OverlayRouterResolvedPath, OverlayRouterTransitionType, OverlayStrategy, OverlayStrategyBreakpoint, OverlayStrategyContext, OverlayStrategyController, OverlayStrategyControllerMountConfig, OverlaySurfaceContext, OverlayTreeContainmentOptions, OverlayUnsavedChangesDismissSources, OverlayUnsavedChangesGuardRef, PaginateOptions, PaginationItem, PaginationItemType, PaginationLabels, PaginationRangeContext, PaginationRenderAs, ParticipantMatchResult, PhoneCountry, PhoneInputFlagContext, PhoneInputFlagCountry, PhoneInputLabels, PictureConfig, PictureSource, PictureState, PipCellData, PipChromeAnimations, PipChromeRef, PipChromeState, PipManager, PipSlotPlaceholderConfig, PixelRect, QueryErrorLabels, QueryErrorRetryTarget, QueryErrorSlotContext, QueryErrorView, QueryParamOverlayDefinition, QueryParamOverlayDefinitionConfig, QueryParamOverlayHost, QueryParamOverlayOpener, QueryParamOverlayValue, RadioVariant, RangeSliderValue, RatingIconContext, RatingIconState, ReconcilableColumn, ReduceSupportPresentationInput, RegisteredIconName, RegisteredIconVariant, RequiredLanguagesOptions, ResizeSpanBounds, ResolveClosestOverlayOptions, ResolveCollisionsOptions, ResolvedDropzoneUploadConfig, RichTextEditorLabels, RichTextEditorLinkEditorValue, RichTextEditorQueryTriggerConfig, RichTextEditorTool, RichTextEditorToolButton, RichTextEditorToolDefinition, RichTextEditorToolsConfig, RichTextEditorTrigger, RichTextEditorTriggerItem, RichTextEditorTriggerItemResolver, RichTextEditorTriggerItemSource, RichTextEditorTriggerType, RowFloors, ScrollableActiveChildRef, ScrollableButtonPosition, ScrollableDirection, ScrollableIntersectionChange, ScrollableItemSize, ScrollableLoadingTemplatePosition, ScrollableLoadingTemplateRef, ScrollableMaskVariant, ScrollableNavigation, ScrollableNavigationItem, ScrollableScrollMode, ScrollableScrollOrigin, ScrollableScrollState, SegmentedButtonGroupVariant, SelectAsyncOptions, SelectErrorContext, SelectFilterMode, SelectItem, SelectLabels, SelectOptionData, SelectOptionGroupItem, SelectOptionTemplateContext, SelectOptionsFromQuery, SelectOptionsFromQueryConfig, SelectOptionsFromV2QueryConfig, SelectSelectedEntry, SelectSurfaceContext, SelectValueContext, SelectionListDirectiveBase, SelectionListItem, SerializeOptions, SidebarOverlay, SidebarOverlayConfig, SingleEliminationBracketRoundType, SkeletonShape, SliderHostBase, SliderLabels, SliderThumbBase, SliderThumbLabelBase, SliderThumbLabelContext, SortRowsConfig, StreamConfig, StreamConsentConfig, StreamLabels, StreamManager, StreamPipEntry, StreamPipWindowConfig, StreamPlayer, StreamPlayerCapabilities, StreamPlayerEntry, StreamPlayerErrorConfig, StreamPlayerErrorContext, StreamPlayerId, StreamPlayerLoadingConfig, StreamPlayerParams, StreamPlayerSlotHandle, StreamPlayerSlotOptions, StreamPlayerState, StreamScriptLoader, StreamSlotEntry, SupportContentState, SupportPresentationState, SupportTransitionDirection, SwissBracketRoundType, TabBarFit, TabBarOrientation, TabBarVariant, TabSize, TableCellContext, TableCellErrorMark, TableCellErrorTooltipConfig, TableCellSkeletonContext, TableCellState, TableCellStateValue, TableColumn, TableColumnAlign, TableColumnDef, TableColumnMenuConfig, TableColumnMeta, TableColumnState, TableColumnTemplate, TableColumnVisibilityHost, TableColumns, TableEmptyContext, TableErrorContext, TableExpandedRowContext, TableFeatureConfig, TableFeatureHost, TableFilter, TableFilterOption, TableFilterOptionContext, TableFilterOptionsProvider, TableFilterSelection, TableFiltersConfig, TableFooterContext, TableHeaderAdornment, TableHeaderContext, TableHeaderGroup, TableLabels, TableLabelsSource, TableLayer, TableLeadCellComponent, TableLeadColumn, TableReorderConfig, TableResizeConfig, TableRowKey, TableRowWindow, TableRowsDriver, TableRowsFromQuery, TableRowsFromQueryConfig, TableRowsFromV2QueryConfig, TableRowsQueryState, TableRowsSource, TableSelectionConfig, TableSort, TableSortDirection, TableSortValue, TableState, TableStatePersistenceConfig, TableStateSlice, TableStateStorage, TableStateStorageKind, TableStateStorageOptions, TableTemplateSlot, TableVirtualScrollConfig, TextAlign, TextareaResizeMode, TimePickerColumn, TimePickerLabels, TimePickerOption, TimePickerUnit, ToggletipContent, TooltipContent, TournamentMode, TwitchEmbed, TwitchEmbedConstructor, TwitchEmbedPlayer, TwitchPlayerParams, TwitchWindow, V2DropzonePrepareArgsOf, V2DropzoneUploadConfig, V2PrepareArgsOf, ViewportTransformData, VimeoDurationChangeEvent, VimeoPlaybackEvent, VimeoPlayer, VimeoPlayerOptions, VimeoWindow, WindowControlButtonKind, WindowControlButtonSize, YtPlayer, YtPlayerConfig, YtPlayerErrorEvent, YtPlayerEvent, YtPlayerStateChangeEvent, YtPlayerVars, YtWindow };