@tedi-design-system/angular 6.5.0-rc.9 → 7.0.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/tedi/index.d.ts CHANGED
@@ -1,20 +1,20 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { AfterContentChecked, InputSignal, Signal, PipeTransform, AfterViewInit, ElementRef, TemplateRef, OnDestroy, Injector, InjectionToken, WritableSignal, OnInit, AfterContentInit, AfterViewChecked, QueryList, EnvironmentProviders } from '@angular/core';
2
+ import { AfterContentChecked, AfterViewInit, InputSignal, Signal, PipeTransform, ElementRef, TemplateRef, OnDestroy, Injector, InjectionToken, WritableSignal, OnInit, AfterViewChecked, AfterContentInit, QueryList, EnvironmentProviders } from '@angular/core';
3
3
  import * as _tedi_design_system_angular_tedi from '@tedi-design-system/angular/tedi';
4
+ import { ControlValueAccessor, NgControl } from '@angular/forms';
4
5
  import * as _tanstack_table_core from '@tanstack/table-core';
5
6
  import { CdkDragDrop } from '@angular/cdk/drag-drop';
6
- import { Table, VisibilityState, ColumnOrderState, ColumnSizingState, RowSelectionState, ExpandedState, ColumnFiltersState, SortingState, PaginationState, ColumnDef, CellContext, Column, Row } from '@tanstack/angular-table';
7
- import { NgxFloatUiContentComponent, NgxFloatUiPlacements } from 'ngx-float-ui';
8
- import { ControlValueAccessor, NgControl } from '@angular/forms';
9
- import { ConnectedPosition, CdkConnectedOverlay } from '@angular/cdk/overlay';
7
+ import { Table, VisibilityState, ColumnOrderState, ColumnSizingState, RowSelectionState, ExpandedState, ColumnFiltersState, SortingState, PaginationState, ColumnDef, CellContext, Row, Column } from '@tanstack/angular-table';
8
+ import * as _angular_cdk_overlay from '@angular/cdk/overlay';
9
+ import { ConnectedOverlayPositionChange, ConnectedPosition, CdkOverlayOrigin, CdkConnectedOverlay } from '@angular/cdk/overlay';
10
+ import { _IdGenerator } from '@angular/cdk/a11y';
10
11
  import { CdkListbox } from '@angular/cdk/listbox';
11
12
  import { Observable } from 'rxjs';
12
13
  import { DialogRef } from '@angular/cdk/dialog';
13
14
  import { ComponentType } from '@angular/cdk/portal';
14
15
  import * as i1 from '@angular/cdk/scrolling';
15
- import { _IdGenerator } from '@angular/cdk/a11y';
16
16
 
17
- type IconSize = 8 | 12 | 16 | 18 | 24 | 36 | 48 | "inherit";
17
+ type IconSize = 8 | 12 | 16 | 18 | 22 | 24 | 36 | 48 | "inherit";
18
18
  type IconVariant = "filled" | "outlined";
19
19
  type IconType = "outlined" | "sharp" | "rounded";
20
20
  type IconColor = "primary" | "secondary" | "tertiary" | "brand" | "brand-dark" | "success" | "warning" | "warning-dark" | "danger" | "white" | "inherit";
@@ -26,10 +26,12 @@ declare class IconComponent {
26
26
  */
27
27
  name: _angular_core.InputSignal<string>;
28
28
  /**
29
- * Size of the icon in pixels.
29
+ * Size of the icon in pixels. When unset, the icon uses the contextual
30
+ * default of its host (e.g. `tedi-button`/`tedi-link`), falling back to 24.
31
+ * An explicit value always takes precedence over the contextual default.
30
32
  * @default 24
31
33
  */
32
- size: _angular_core.InputSignal<IconSize>;
34
+ size: _angular_core.InputSignal<IconSize | undefined>;
33
35
  /**
34
36
  * Color of the icon.
35
37
  * @default primary
@@ -55,13 +57,15 @@ declare class IconComponent {
55
57
  * If omitted then the icon is hidden for screen-readers.
56
58
  */
57
59
  label: _angular_core.InputSignal<string | undefined>;
60
+ iconSizeVar: _angular_core.Signal<string | null>;
61
+ iconBgPadding: _angular_core.Signal<string | null>;
58
62
  classes: _angular_core.Signal<string>;
59
63
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<IconComponent, never>;
60
64
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<IconComponent, "tedi-icon", never, { "name": { "alias": "name"; "required": true; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "background": { "alias": "background"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
61
65
  }
62
66
 
63
- type TextModifiers = "h1" | "h2" | "h3" | "h4" | "h5" | "h6" | "normal" | "small" | "bold" | "thin" | "italic" | "center" | "left" | "right" | "nowrap" | "break-all" | "break-word" | "break-spaces" | "uppercase" | "lowercase" | "capitalize" | "capitalize-first" | "inline-block" | "inline" | "line-normal" | "line-condensed" | "subtitle";
64
- type TextColor = "primary" | "secondary" | "tertiary" | "white" | "disabled" | "brand" | "success" | "warning" | "danger" | "info" | "neutral";
67
+ type TextModifiers = "h1" | "h2" | "h3" | "h4" | "h5" | "h6" | "normal" | "small" | "extra-small" | "bold" | "thin" | "italic" | "center" | "left" | "right" | "nowrap" | "break-all" | "break-word" | "break-spaces" | "uppercase" | "lowercase" | "capitalize" | "capitalize-first" | "inline-block" | "inline" | "line-normal" | "line-condensed" | "subtitle";
68
+ type TextColor = "primary" | "secondary" | "tertiary" | "white" | "disabled" | "brand" | "success" | "warning" | "danger" | "info" | "neutral" | "inherit";
65
69
  declare class TextComponent {
66
70
  /**
67
71
  * Single or multiple modifiers to change the text behavior
@@ -94,11 +98,15 @@ declare class BaseButtonDirective implements AfterContentChecked {
94
98
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<BaseButtonDirective, never, never, {}, {}, never, never, true, never>;
95
99
  }
96
100
 
97
- type ButtonVariant = "primary" | "secondary" | "neutral" | "success" | "danger" | "danger-neutral" | "primary-inverted" | "secondary-inverted" | "neutral-inverted";
101
+ type ButtonVariant = "primary" | "secondary" | "neutral" | "success" | "danger" | "danger-neutral" | "primary-inverted" | "secondary-inverted" | "neutral-inverted" | "primary-button-group" | "secondary-button-group";
98
102
  type ButtonSize = "default" | "small";
99
103
  declare class ButtonComponent {
100
104
  /**
101
105
  * Specifies the color theme of the button. The color should meet accessibility standards for color contrast.
106
+ *
107
+ * `primary-button-group` and `secondary-button-group` are intended for items inside
108
+ * `tedi-button-group`: they use the small (`button-radius-sm`) corner radius and show
109
+ * their selected state via `aria-pressed`.
102
110
  * @default primary
103
111
  */
104
112
  variant: _angular_core.InputSignal<ButtonVariant>;
@@ -112,13 +120,156 @@ declare class ButtonComponent {
112
120
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<ButtonComponent, "[tedi-button]", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, [{ directive: typeof BaseButtonDirective; inputs: {}; outputs: {}; }]>;
113
121
  }
114
122
 
123
+ /**
124
+ * Turns a `<button>` inside `tedi-button-group` into a styled, selectable item.
125
+ * Extends `tedi-button` (composes `BaseButtonDirective` and applies the
126
+ * `tedi-button` variant classes), inherits `variant`/`size` from the parent
127
+ * group (overridable per item), and derives its selected state from the group's
128
+ * `value`. The `iconLeft`/`iconRight`/`icon` inputs are auto-rendered as
129
+ * `tedi-icon` elements and reused by the mobile dropdown.
130
+ */
131
+ declare class ButtonGroupButtonDirective implements AfterViewInit {
132
+ /** Identity contributing to the group's selected value. */
133
+ readonly value: _angular_core.InputSignal<string>;
134
+ /** Visible text; used by the mobile dropdown and as the accessible name in icon-only mode. */
135
+ readonly label: _angular_core.InputSignal<string>;
136
+ /** Disables interaction via the native `disabled` attribute. */
137
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
138
+ /** Icon rendered before the label (and in the dropdown item). */
139
+ readonly iconLeft: _angular_core.InputSignal<string | undefined>;
140
+ /** Icon rendered after the label (and in the dropdown item). */
141
+ readonly iconRight: _angular_core.InputSignal<string | undefined>;
142
+ /** Icon-only mode: icon for the button, dropdown trigger and dropdown item. */
143
+ readonly icon: _angular_core.InputSignal<string | undefined>;
144
+ /** Overrides the group's `variant` for this item. */
145
+ readonly variant: _angular_core.InputSignal<ButtonVariant | undefined>;
146
+ /** Overrides the group's `size` for this item. */
147
+ readonly size: _angular_core.InputSignal<ButtonSize | undefined>;
148
+ /** Fires on user activation (click). Disabled items don't emit. */
149
+ readonly clicked: _angular_core.OutputEmitterRef<MouseEvent>;
150
+ private readonly host;
151
+ private readonly viewContainer;
152
+ private readonly renderer;
153
+ private readonly parent;
154
+ private readonly iconRefs;
155
+ readonly effectiveVariant: _angular_core.Signal<ButtonVariant>;
156
+ readonly effectiveSize: _angular_core.Signal<ButtonSize>;
157
+ readonly selected: _angular_core.Signal<boolean>;
158
+ protected readonly hostClasses: _angular_core.Signal<string>;
159
+ constructor();
160
+ ngAfterViewInit(): void;
161
+ /** Wraps the projected text in a padded span so the gap to an adjacent icon
162
+ * comes from the label (the icon itself stays flush), matching the design. */
163
+ private wrapLabel;
164
+ private syncIcon;
165
+ protected onClick(event: MouseEvent): void;
166
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ButtonGroupButtonDirective, never>;
167
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ButtonGroupButtonDirective, "button[tedi-button-group-button]", never, { "value": { "alias": "value"; "required": true; "isSignal": true; }; "label": { "alias": "label"; "required": true; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "iconLeft": { "alias": "iconLeft"; "required": false; "isSignal": true; }; "iconRight": { "alias": "iconRight"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, { "clicked": "clicked"; }, never, never, true, [{ directive: typeof BaseButtonDirective; inputs: {}; outputs: {}; }]>;
168
+ }
169
+
170
+ type ButtonGroupDropdownLabelMode = "selected" | "static";
171
+ declare class ButtonGroupComponent {
172
+ /**
173
+ * Variant applied to every item button (each item may override via its own
174
+ * `variant`). Accepts the full `ButtonVariant` union. Only the
175
+ * `*-button-group` variants get the connected/segmented strip geometry; other
176
+ * variants keep their own radius and show their active colors when selected.
177
+ * @default primary-button-group
178
+ */
179
+ readonly variant: _angular_core.InputSignal<ButtonVariant>;
180
+ /**
181
+ * Size applied to every item button.
182
+ * @default default
183
+ */
184
+ readonly size: _angular_core.InputSignal<ButtonSize>;
185
+ /**
186
+ * When true, multiple items can be toggled on and `value` is a string array.
187
+ * @default false
188
+ */
189
+ readonly multiple: _angular_core.InputSignalWithTransform<boolean, unknown>;
190
+ /**
191
+ * Selected value(s). A single `string` (or `undefined`) in single mode, a
192
+ * `string[]` in `multiple` mode. Two-way bindable via `[(value)]`.
193
+ */
194
+ readonly value: _angular_core.ModelSignal<string | string[] | undefined>;
195
+ /**
196
+ * When true, items share the available horizontal space equally.
197
+ * @default false
198
+ */
199
+ readonly stretch: _angular_core.InputSignalWithTransform<boolean, unknown>;
200
+ /** Accessible name for the group. Required if no visible heading labels it. */
201
+ readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
202
+ /**
203
+ * When true, the strip collapses into a dropdown below `mobileBreakpoint`.
204
+ * @default false
205
+ */
206
+ readonly enableMobileDropdown: _angular_core.InputSignalWithTransform<boolean, unknown>;
207
+ /**
208
+ * Viewport breakpoint at which the strip switches to a dropdown.
209
+ * @default md
210
+ */
211
+ readonly mobileBreakpoint: _angular_core.InputSignal<"xs" | "sm" | "md" | "lg" | "xl" | "xxl">;
212
+ /** Label for the dropdown trigger. Falls back to the `buttonGroup.menu` translation. */
213
+ readonly dropdownLabel: _angular_core.InputSignal<string | undefined>;
214
+ /**
215
+ * Source for the dropdown trigger label.
216
+ * - `static` (default) — always show `dropdownLabel`.
217
+ * - `selected` — show the selected item's label (single mode only).
218
+ * @default static
219
+ */
220
+ readonly dropdownLabelMode: _angular_core.InputSignal<ButtonGroupDropdownLabelMode>;
221
+ /** Emits the value of the item the user toggled. */
222
+ readonly selectionChange: _angular_core.OutputEmitterRef<string>;
223
+ protected readonly items: _angular_core.Signal<readonly any[]>;
224
+ private readonly breakpointService;
225
+ private readonly translations;
226
+ private readonly isBelowMobile;
227
+ protected readonly isDropdownMode: _angular_core.Signal<boolean>;
228
+ /** Trigger variant derived from the group `variant` (button-group variants map
229
+ * to their plain counterpart; any other variant is used as-is). */
230
+ readonly triggerVariant: _angular_core.Signal<ButtonVariant>;
231
+ /** Whether the group uses a *-button-group variant (drives the trigger radius). */
232
+ protected readonly isButtonGroupVariant: _angular_core.Signal<boolean>;
233
+ protected readonly selectedItem: _angular_core.Signal<any>;
234
+ protected readonly triggerLabel: _angular_core.Signal<any>;
235
+ protected readonly triggerIcon: _angular_core.Signal<any>;
236
+ protected readonly hostClasses: _angular_core.Signal<string>;
237
+ isSelected(value: string): boolean;
238
+ toggle(value: string): void;
239
+ protected onDropdownItemSelect(item: ButtonGroupButtonDirective): void;
240
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ButtonGroupComponent, never>;
241
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ButtonGroupComponent, "tedi-button-group", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "stretch": { "alias": "stretch"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "enableMobileDropdown": { "alias": "enableMobileDropdown"; "required": false; "isSignal": true; }; "mobileBreakpoint": { "alias": "mobileBreakpoint"; "required": false; "isSignal": true; }; "dropdownLabel": { "alias": "dropdownLabel"; "required": false; "isSignal": true; }; "dropdownLabelMode": { "alias": "dropdownLabelMode"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "selectionChange": "selectionChange"; }, ["items"], ["*"], true, never>;
242
+ }
243
+
244
+ /**
245
+ * Interactive wrapper around a `tedi-card`. Apply to an anchor (with `href`
246
+ * or `routerLink`) for navigation or to a button for actions — the host
247
+ * element provides the interaction semantics and applies the hover, active,
248
+ * focus and disabled states to the card and its blocks inside.
249
+ *
250
+ * Only a projected `tedi-card` is rendered — other content is ignored. The
251
+ * card may use any card sub-components (content, rows, icon cells). Do not
252
+ * place other interactive elements inside.
253
+ */
254
+ declare class CardButtonComponent {
255
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CardButtonComponent, never>;
256
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CardButtonComponent, "a[tedi-card-button], button[tedi-card-button]", never, {}, {}, never, ["tedi-card"], true, never>;
257
+ }
258
+
259
+ /**
260
+ * Grid breakpoints in `rem`, mirroring `$grid-breakpoints` in
261
+ * `@tedi-design-system/core`. `rem` is used (instead of `px`) so breakpoints
262
+ * resolve against the browser's base font size and scale with the user's font
263
+ * preference — keeping these JS breakpoints aligned with the rem-based CSS
264
+ * tokens at any zoom / font-size setting.
265
+ */
115
266
  declare const BREAKPOINTS: {
116
267
  readonly xs: 0;
117
- readonly sm: 576;
118
- readonly md: 768;
119
- readonly lg: 992;
120
- readonly xl: 1200;
121
- readonly xxl: 1400;
268
+ readonly sm: 36;
269
+ readonly md: 48;
270
+ readonly lg: 62;
271
+ readonly xl: 75;
272
+ readonly xxl: 87.5;
122
273
  };
123
274
  type Breakpoint = keyof typeof BREAKPOINTS;
124
275
  type BreakpointInputs<TInputs> = {
@@ -262,6 +413,13 @@ declare const translationsMap: {
262
413
  en: string;
263
414
  ru: string;
264
415
  };
416
+ "header.role-search.organization": {
417
+ description: string;
418
+ components: string[];
419
+ et: string;
420
+ en: string;
421
+ ru: string;
422
+ };
265
423
  "header.role-no-representatives": {
266
424
  description: string;
267
425
  components: string[];
@@ -276,7 +434,7 @@ declare const translationsMap: {
276
434
  en: string;
277
435
  ru: string;
278
436
  };
279
- "header.login-mobile": {
437
+ "header.login.mobile": {
280
438
  description: string;
281
439
  components: string[];
282
440
  et: string;
@@ -290,6 +448,13 @@ declare const translationsMap: {
290
448
  en: string;
291
449
  ru: string;
292
450
  };
451
+ "header.logout.mobile": {
452
+ description: string;
453
+ components: string[];
454
+ et: string;
455
+ en: string;
456
+ ru: string;
457
+ };
293
458
  "header.logo": {
294
459
  description: string;
295
460
  components: string[];
@@ -304,6 +469,20 @@ declare const translationsMap: {
304
469
  en: string;
305
470
  ru: string;
306
471
  };
472
+ "header.profile.mobile": {
473
+ description: string;
474
+ components: string[];
475
+ et: string;
476
+ en: string;
477
+ ru: string;
478
+ };
479
+ "header.search": {
480
+ description: string;
481
+ components: string[];
482
+ et: string;
483
+ en: string;
484
+ ru: string;
485
+ };
307
486
  "file-upload.add": {
308
487
  description: string;
309
488
  components: string[];
@@ -374,6 +553,13 @@ declare const translationsMap: {
374
553
  en: string;
375
554
  ru: string;
376
555
  };
556
+ "file-attachment.uploading": {
557
+ description: string;
558
+ components: string[];
559
+ et: string;
560
+ en: string;
561
+ ru: string;
562
+ };
377
563
  "modal.close": {
378
564
  description: string;
379
565
  components: string[];
@@ -871,6 +1057,13 @@ declare const translationsMap: {
871
1057
  en: (value: string, isOpen: boolean) => string;
872
1058
  ru: (value: string, isOpen: boolean) => string;
873
1059
  };
1060
+ "buttonGroup.menu": {
1061
+ description: string;
1062
+ components: string[];
1063
+ et: string;
1064
+ en: string;
1065
+ ru: string;
1066
+ };
874
1067
  carousel: {
875
1068
  description: string;
876
1069
  components: string[];
@@ -1172,6 +1365,13 @@ declare const translationsMap: {
1172
1365
  en: string;
1173
1366
  ru: string;
1174
1367
  };
1368
+ "date-picker.today": {
1369
+ description: string;
1370
+ components: string[];
1371
+ et: string;
1372
+ en: string;
1373
+ ru: string;
1374
+ };
1175
1375
  "date-picker.go-next-month": {
1176
1376
  description: string;
1177
1377
  components: string[];
@@ -1179,6 +1379,41 @@ declare const translationsMap: {
1179
1379
  en: string;
1180
1380
  ru: string;
1181
1381
  };
1382
+ "date-picker.calendar-nav": {
1383
+ description: string;
1384
+ components: string[];
1385
+ et: string;
1386
+ en: string;
1387
+ ru: string;
1388
+ };
1389
+ "date-picker.choose-month": {
1390
+ description: string;
1391
+ components: string[];
1392
+ et: string;
1393
+ en: string;
1394
+ ru: string;
1395
+ };
1396
+ "date-picker.choose-year": {
1397
+ description: string;
1398
+ components: string[];
1399
+ et: string;
1400
+ en: string;
1401
+ ru: string;
1402
+ };
1403
+ "date-picker.week-number": {
1404
+ description: string;
1405
+ components: string[];
1406
+ et: (n: number) => string;
1407
+ en: (n: number) => string;
1408
+ ru: (n: number) => string;
1409
+ };
1410
+ "date-picker.week-number-header": {
1411
+ description: string;
1412
+ components: string[];
1413
+ et: string;
1414
+ en: string;
1415
+ ru: string;
1416
+ };
1182
1417
  "date-picker.go-prev-month": {
1183
1418
  description: string;
1184
1419
  components: string[];
@@ -1228,6 +1463,41 @@ declare const translationsMap: {
1228
1463
  en: string;
1229
1464
  ru: string;
1230
1465
  };
1466
+ "date-field.remove-chip": {
1467
+ description: string;
1468
+ components: string[];
1469
+ et: (label: string) => string;
1470
+ en: (label: string) => string;
1471
+ ru: (label: string) => string;
1472
+ };
1473
+ "date-field.calendar-dialog": {
1474
+ description: string;
1475
+ components: string[];
1476
+ et: string;
1477
+ en: string;
1478
+ ru: string;
1479
+ };
1480
+ "date-field.modal-title": {
1481
+ description: string;
1482
+ components: string[];
1483
+ et: string;
1484
+ en: string;
1485
+ ru: string;
1486
+ };
1487
+ "date-field.confirm": {
1488
+ description: string;
1489
+ components: string[];
1490
+ et: string;
1491
+ en: string;
1492
+ ru: string;
1493
+ };
1494
+ "date-field.cancel": {
1495
+ description: string;
1496
+ components: string[];
1497
+ et: string;
1498
+ en: string;
1499
+ ru: string;
1500
+ };
1231
1501
  "time-picker.hours": {
1232
1502
  description: string;
1233
1503
  components: string[];
@@ -1371,6 +1641,9 @@ declare class AlertComponent {
1371
1641
  icon: _angular_core.InputSignal<string>;
1372
1642
  /**
1373
1643
  * If true, a close button will be displayed.
1644
+ *
1645
+ * Ignored when a `[tedi-alert-action]` element is projected — the action
1646
+ * slot wins, and is responsible for any close affordance it wants to expose.
1374
1647
  * @default false
1375
1648
  */
1376
1649
  showClose: _angular_core.InputSignal<boolean>;
@@ -1417,7 +1690,7 @@ declare class AlertComponent {
1417
1690
  }>;
1418
1691
  handleClose(): void;
1419
1692
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AlertComponent, never>;
1420
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AlertComponent, "tedi-alert", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "showClose": { "alias": "showClose"; "required": false; "isSignal": true; }; "role": { "alias": "role"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "titleElement": { "alias": "titleElement"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; "closeDelay": { "alias": "closeDelay"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "closeClick": "closeClick"; }, never, ["*"], true, never>;
1693
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AlertComponent, "tedi-alert", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "showClose": { "alias": "showClose"; "required": false; "isSignal": true; }; "role": { "alias": "role"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "titleElement": { "alias": "titleElement"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; "closeDelay": { "alias": "closeDelay"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "closeClick": "closeClick"; }, never, ["[tedi-alert-action]", "*"], true, never>;
1421
1694
  }
1422
1695
 
1423
1696
  declare const TOAST_DEFAULT_DURATION = 6000;
@@ -1775,14 +2048,228 @@ declare class ClosingButtonComponent {
1775
2048
  * @default 24
1776
2049
  */
1777
2050
  iconSize: _angular_core.InputSignal<ClosingButtonIconSize>;
2051
+ /**
2052
+ * Material Symbols icon rendered inside the button. Override for other
2053
+ * closing-like actions such as delete/remove (e.g. `delete`). When
2054
+ * overriding, also provide a matching `ariaLabel` — the default label
2055
+ * is "close".
2056
+ * @default close
2057
+ */
2058
+ icon: _angular_core.InputSignal<string>;
1778
2059
  /**
1779
2060
  * ARIA label to override default label "close"
1780
2061
  */
1781
2062
  readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
2063
+ /**
2064
+ * Render the label as a native `title` attribute (browser tooltip on
2065
+ * hover). Set to `false` when the button is wrapped in a `tedi-tooltip`
2066
+ * so the native tooltip does not double the custom one. The `aria-label`
2067
+ * is kept either way.
2068
+ * @default true
2069
+ */
2070
+ showTitle: _angular_core.InputSignalWithTransform<boolean, unknown>;
1782
2071
  private translationService;
1783
2072
  private readonly _defaultLabel;
1784
2073
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ClosingButtonComponent, never>;
1785
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<ClosingButtonComponent, "button[tedi-closing-button]", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "iconSize": { "alias": "iconSize"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
2074
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ClosingButtonComponent, "button[tedi-closing-button]", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "iconSize": { "alias": "iconSize"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "showTitle": { "alias": "showTitle"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
2075
+ }
2076
+
2077
+ type CardBorderPlacement = "top" | "left";
2078
+ type CardBackground = "primary" | "secondary" | "tertiary" | "accent" | "brand-primary" | "brand-secondary" | "brand-tertiary" | "brand-quaternary" | "danger-primary" | "danger-secondary" | "success-primary" | "success-secondary" | "info-primary" | "info-secondary" | "warning-primary" | "warning-secondary" | "neutral-primary" | "neutral-secondary";
2079
+ type CardBorderType = `${CardBorderPlacement}-${CardBackground}` | CardBackground;
2080
+ type CardPaddingNumber = 0 | 0.25 | 0.5 | 0.75 | 1 | 1.25 | 1.5 | 2 | 2.5 | 3;
2081
+ type CardPadding = CardPaddingNumber | {
2082
+ vertical: CardPaddingNumber;
2083
+ horizontal: CardPaddingNumber;
2084
+ } | {
2085
+ top?: CardPaddingNumber;
2086
+ right?: CardPaddingNumber;
2087
+ bottom?: CardPaddingNumber;
2088
+ left?: CardPaddingNumber;
2089
+ };
2090
+ type CardBorderRadius = false | {
2091
+ top?: boolean;
2092
+ right?: boolean;
2093
+ bottom?: boolean;
2094
+ left?: boolean;
2095
+ topLeft?: boolean;
2096
+ topRight?: boolean;
2097
+ bottomRight?: boolean;
2098
+ bottomLeft?: boolean;
2099
+ };
2100
+ type CardResolvedCorners = {
2101
+ topLeft: boolean;
2102
+ topRight: boolean;
2103
+ bottomRight: boolean;
2104
+ bottomLeft: boolean;
2105
+ };
2106
+ declare function getCardBorderPlacementColor(border?: CardBorderType): [CardBorderPlacement | undefined, CardBackground | undefined];
2107
+ declare function getPaddingCssVariables(padding: CardPadding): Record<string, string>;
2108
+ declare function resolveCardBorderRadius(config?: CardBorderRadius): CardResolvedCorners;
2109
+
2110
+ type CardInputs = {
2111
+ background?: CardBackground;
2112
+ padding?: CardPadding;
2113
+ borderRadius?: CardBorderRadius;
2114
+ borderless?: boolean;
2115
+ border?: CardBorderType;
2116
+ };
2117
+ /**
2118
+ * Card is a container for grouping related content. Compose it from
2119
+ * `tedi-card-header`, `tedi-card-content` and `tedi-card-notification` blocks.
2120
+ * `background` and `padding` set here act as defaults for all child blocks.
2121
+ */
2122
+ declare class CardComponent implements BreakpointInputs<CardInputs> {
2123
+ /**
2124
+ * Default background color for child content blocks.
2125
+ */
2126
+ background: _angular_core.InputSignal<CardBackground | undefined>;
2127
+ /**
2128
+ * Default padding for child content blocks.
2129
+ * Value is either a predefined number in rems or an object of
2130
+ * vertical/horizontal or top/right/bottom/left number values in rems.
2131
+ */
2132
+ padding: _angular_core.InputSignal<CardPadding | undefined>;
2133
+ /**
2134
+ * Controls card border radius.
2135
+ * Accepts `false` to remove all radius or an object to control
2136
+ * sides or individual corners. Corner values take precedence over sides.
2137
+ */
2138
+ borderRadius: _angular_core.InputSignal<CardBorderRadius | undefined>;
2139
+ /**
2140
+ * Removes border from card.
2141
+ * @default false
2142
+ */
2143
+ borderless: _angular_core.InputSignal<boolean | undefined>;
2144
+ /**
2145
+ * Type of border. Plain background value colors the whole border,
2146
+ * `top-` or `left-` prefixed value draws a thick accent border on that side.
2147
+ */
2148
+ border: _angular_core.InputSignal<CardBorderType | undefined>;
2149
+ xs: _angular_core.InputSignal<CardInputs | undefined>;
2150
+ sm: _angular_core.InputSignal<CardInputs | undefined>;
2151
+ md: _angular_core.InputSignal<CardInputs | undefined>;
2152
+ lg: _angular_core.InputSignal<CardInputs | undefined>;
2153
+ xl: _angular_core.InputSignal<CardInputs | undefined>;
2154
+ xxl: _angular_core.InputSignal<CardInputs | undefined>;
2155
+ private breakpointService;
2156
+ breakpointInputs: _angular_core.Signal<CardInputs>;
2157
+ classes: _angular_core.Signal<string>;
2158
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CardComponent, never>;
2159
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CardComponent, "tedi-card", never, { "background": { "alias": "background"; "required": false; "isSignal": true; }; "padding": { "alias": "padding"; "required": false; "isSignal": true; }; "borderRadius": { "alias": "borderRadius"; "required": false; "isSignal": true; }; "borderless": { "alias": "borderless"; "required": false; "isSignal": true; }; "border": { "alias": "border"; "required": false; "isSignal": true; }; "xs": { "alias": "xs"; "required": false; "isSignal": true; }; "sm": { "alias": "sm"; "required": false; "isSignal": true; }; "md": { "alias": "md"; "required": false; "isSignal": true; }; "lg": { "alias": "lg"; "required": false; "isSignal": true; }; "xl": { "alias": "xl"; "required": false; "isSignal": true; }; "xxl": { "alias": "xxl"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
2160
+ }
2161
+
2162
+ type CardContentInputs = {
2163
+ background?: CardBackground;
2164
+ padding?: CardPadding;
2165
+ backgroundImage?: string;
2166
+ backgroundPosition?: string;
2167
+ backgroundSize?: string;
2168
+ backgroundRepeat?: string;
2169
+ autoWidth?: boolean;
2170
+ };
2171
+ /**
2172
+ * Content block of a card. Inherits unset `background` and `padding`
2173
+ * from the parent `tedi-card`.
2174
+ */
2175
+ declare class CardContentComponent implements BreakpointInputs<CardContentInputs> {
2176
+ /**
2177
+ * Background color.
2178
+ * @default primary
2179
+ */
2180
+ background: _angular_core.InputSignal<CardBackground | undefined>;
2181
+ /**
2182
+ * Content padding.
2183
+ * Value is either a predefined number in rems or an object of
2184
+ * vertical/horizontal or top/right/bottom/left number values in rems.
2185
+ * @default 1
2186
+ */
2187
+ padding: _angular_core.InputSignal<CardPadding | undefined>;
2188
+ /**
2189
+ * Background image url.
2190
+ */
2191
+ backgroundImage: _angular_core.InputSignal<string | undefined>;
2192
+ /**
2193
+ * Background position for the image.
2194
+ */
2195
+ backgroundPosition: _angular_core.InputSignal<string | undefined>;
2196
+ /**
2197
+ * Background size for the image.
2198
+ */
2199
+ backgroundSize: _angular_core.InputSignal<string | undefined>;
2200
+ /**
2201
+ * Background repeat for the image.
2202
+ */
2203
+ backgroundRepeat: _angular_core.InputSignal<string | undefined>;
2204
+ /**
2205
+ * Takes only as much width as its content needs instead of growing.
2206
+ * Useful for icon or date cells inside `tedi-card-row`.
2207
+ * @default false
2208
+ */
2209
+ autoWidth: _angular_core.InputSignal<boolean | undefined>;
2210
+ xs: _angular_core.InputSignal<CardContentInputs | undefined>;
2211
+ sm: _angular_core.InputSignal<CardContentInputs | undefined>;
2212
+ md: _angular_core.InputSignal<CardContentInputs | undefined>;
2213
+ lg: _angular_core.InputSignal<CardContentInputs | undefined>;
2214
+ xl: _angular_core.InputSignal<CardContentInputs | undefined>;
2215
+ xxl: _angular_core.InputSignal<CardContentInputs | undefined>;
2216
+ protected blockClass: string;
2217
+ protected defaultBackground: CardBackground;
2218
+ private breakpointService;
2219
+ private card;
2220
+ breakpointInputs: _angular_core.Signal<CardContentInputs>;
2221
+ classes: _angular_core.Signal<string>;
2222
+ styles: _angular_core.Signal<Record<string, string>>;
2223
+ protected inheritedBackground(): CardBackground | undefined;
2224
+ protected defaultPadding(): CardPadding;
2225
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CardContentComponent, never>;
2226
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CardContentComponent, "tedi-card-content", never, { "background": { "alias": "background"; "required": false; "isSignal": true; }; "padding": { "alias": "padding"; "required": false; "isSignal": true; }; "backgroundImage": { "alias": "backgroundImage"; "required": false; "isSignal": true; }; "backgroundPosition": { "alias": "backgroundPosition"; "required": false; "isSignal": true; }; "backgroundSize": { "alias": "backgroundSize"; "required": false; "isSignal": true; }; "backgroundRepeat": { "alias": "backgroundRepeat"; "required": false; "isSignal": true; }; "autoWidth": { "alias": "autoWidth"; "required": false; "isSignal": true; }; "xs": { "alias": "xs"; "required": false; "isSignal": true; }; "sm": { "alias": "sm"; "required": false; "isSignal": true; }; "md": { "alias": "md"; "required": false; "isSignal": true; }; "lg": { "alias": "lg"; "required": false; "isSignal": true; }; "xl": { "alias": "xl"; "required": false; "isSignal": true; }; "xxl": { "alias": "xxl"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
2227
+ }
2228
+
2229
+ type CardIconType = "default" | "brand";
2230
+ type CardIconSize = "default" | "small";
2231
+ /**
2232
+ * Icon cell for a card row. The projected icon is aligned to the top of the
2233
+ * cell and inherits the cell color. Pair the small size with a 16px icon.
2234
+ */
2235
+ declare class CardIconComponent extends CardContentComponent {
2236
+ /**
2237
+ * Visual type of the icon cell.
2238
+ * @default default
2239
+ */
2240
+ type: _angular_core.InputSignal<CardIconType>;
2241
+ /**
2242
+ * Size of the icon cell.
2243
+ * @default default
2244
+ */
2245
+ size: _angular_core.InputSignal<CardIconSize>;
2246
+ protected blockClass: string;
2247
+ protected inheritedBackground(): CardBackground | undefined;
2248
+ protected defaultPadding(): CardPadding;
2249
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CardIconComponent, never>;
2250
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CardIconComponent, "tedi-card-icon", never, { "type": { "alias": "type"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
2251
+ }
2252
+
2253
+ /**
2254
+ * Lays out card content cells horizontally inside a card.
2255
+ * Place a `tedi-separator` between cells (vertical, `size="auto"`) or
2256
+ * between rows (horizontal) to draw dividers.
2257
+ */
2258
+ declare class CardRowComponent {
2259
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CardRowComponent, never>;
2260
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CardRowComponent, "tedi-card-row", never, {}, {}, never, ["*"], true, never>;
2261
+ }
2262
+
2263
+ /**
2264
+ * Header block of a card. Same API as `tedi-card-content`, but defaults to
2265
+ * the brand-primary background and does not inherit background from the card.
2266
+ */
2267
+ declare class CardHeaderComponent extends CardContentComponent {
2268
+ protected blockClass: string;
2269
+ protected defaultBackground: CardBackground;
2270
+ protected inheritedBackground(): CardBackground | undefined;
2271
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CardHeaderComponent, never>;
2272
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CardHeaderComponent, "tedi-card-header", never, {}, {}, never, ["*"], true, never>;
1786
2273
  }
1787
2274
 
1788
2275
  type BulletColor = "primary" | "secondary" | "tertiary" | "brand" | "brand-dark" | "success" | "warning" | "warning-dark" | "danger" | "white";
@@ -1969,50 +2456,481 @@ declare class CarouselNavigationComponent {
1969
2456
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<CarouselNavigationComponent, "tedi-carousel-navigation", never, {}, {}, never, never, true, never>;
1970
2457
  }
1971
2458
 
1972
- type PaginationBackground = "white" | "transparent";
1973
2459
  /**
1974
- * Visibility toggle for the results / page-size / pager / arrow slots.
1975
- * - `true` always hidden
1976
- * - `false` (default) — always visible
1977
- * - `'sm'` / `'md'` / `'lg'` / `'xl'` / `'xxl'` — hidden below that breakpoint
2460
+ * A date range with an inclusive start (`from`) and optional inclusive end (`to`).
2461
+ * When `to` is undefined the range degenerates to the single day `from`.
2462
+ */
2463
+ type DateRange = {
2464
+ from: Date;
2465
+ to?: Date;
2466
+ };
2467
+ /**
2468
+ * Formats a Date object to dd.MM.yyyy string format.
1978
2469
  *
1979
- * Mirrors the `boolean | breakpoint` pattern used by `tedi-modal`'s
1980
- * `fullscreen` input.
2470
+ * Thin wrapper around `formatLocaleDate(date, 'et-EE')` kept for back-compat.
2471
+ * New code should call `formatLocaleDate` directly with the desired locale.
1981
2472
  */
1982
- type PaginationVisibility = boolean | "sm" | "md" | "lg" | "xl" | "xxl";
2473
+ declare function formatDate(date: Date): string;
1983
2474
  /**
1984
- * Where the divider sits relative to the pagination row.
1985
- * - `'top'` (default) border on top, matches single-row layouts under content
1986
- * - `'bottom'` — border on bottom, for above-content placements
1987
- * - `'none'` no divider, useful when the surrounding container already has one
2475
+ * Parses a dd.MM.yyyy string to a Date object.
2476
+ * Returns null if the string is invalid.
2477
+ *
2478
+ * Thin wrapper around `parseLocaleDate(str, 'et-EE')` kept for back-compat.
2479
+ * Note: `parseLocaleDate` returns `Date | undefined`; this wrapper normalizes
2480
+ * undefined to null so existing callers asserting `=== null` still work.
1988
2481
  */
1989
- type PaginationDividerPosition = "top" | "bottom" | "none";
1990
- type PaginationItemType = "page" | "previous" | "next" | "ellipsis";
2482
+ declare function parseDate(str: string): Date | null;
1991
2483
  /**
1992
- * A labelled page-size option. Use it alongside plain numbers in
1993
- * `pageSizeOptions` when the visible text should differ from the value —
1994
- * most commonly a "Show all" entry: `{ value: totalItems, label: 'Show all' }`.
1995
- * The label is rendered as-is, so supply it already translated.
2484
+ * Checks if two dates represent the same calendar day.
1996
2485
  */
1997
- interface PaginationPageSizeOption {
1998
- value: number;
1999
- label: string;
2000
- }
2001
- interface PaginationItem {
2002
- type: PaginationItemType;
2003
- page: number | null;
2004
- selected: boolean;
2005
- disabled: boolean;
2006
- }
2007
- interface PaginationLabels {
2008
- /** Accessible label for the nav wrapper. @default 'Pagination' */
2009
- ariaLabel: string;
2010
- /** Previous button label (icon-only, used as aria-label). @default 'Previous page' */
2011
- previous: string;
2012
- /** Next button label (icon-only, used as aria-label). @default 'Next page' */
2013
- next: string;
2014
- /** aria-label for a numeric page button. @default (page) => 'Go to page {page}' */
2015
- pageAriaLabel: (page: number) => string;
2486
+ declare function isSameDay(a: Date, b: Date): boolean;
2487
+ /**
2488
+ * Checks if date a is before date b (day-level, time ignored).
2489
+ */
2490
+ declare function isBeforeDay(a: Date, b: Date): boolean;
2491
+ /**
2492
+ * Checks if date a is after date b (day-level, time ignored).
2493
+ */
2494
+ declare function isAfterDay(a: Date, b: Date): boolean;
2495
+ /**
2496
+ * Returns the ISO week number for a given date.
2497
+ */
2498
+ declare function getISOWeek(date: Date): number;
2499
+ /**
2500
+ * Returns a new Date offset by `n` days from `date`. `n` may be negative.
2501
+ */
2502
+ declare function addDays(date: Date, n: number): Date;
2503
+ /**
2504
+ * Returns a new Date offset by `n` months from `date`. Clamps the day to the
2505
+ * last day of the target month (e.g. Jan 31 + 1 month → Feb 28/29).
2506
+ */
2507
+ declare function addMonths(date: Date, n: number): Date;
2508
+ /**
2509
+ * Returns a new Date offset by `n` years from `date`. Clamps Feb 29 to Feb 28
2510
+ * in non-leap target years.
2511
+ */
2512
+ declare function addYears(date: Date, n: number): Date;
2513
+ /**
2514
+ * Returns the first day of the month for `date` at 00:00 local time.
2515
+ */
2516
+ declare function startOfMonth(date: Date): Date;
2517
+ /**
2518
+ * Returns the last day of the month for `date` at 00:00 local time.
2519
+ */
2520
+ declare function endOfMonth(date: Date): Date;
2521
+ /**
2522
+ * Returns the first day of the week containing `date`, given a locale's
2523
+ * first day of week (0=Sun..6=Sat).
2524
+ */
2525
+ declare function startOfWeek(date: Date, firstDayOfWeek: number): Date;
2526
+ /**
2527
+ * Returns the number of days in the given month/year. `monthIndex` is 0-based.
2528
+ */
2529
+ declare function getDaysInMonth(year: number, monthIndex: number): number;
2530
+ /**
2531
+ * Checks if two dates fall in the same calendar month and year.
2532
+ */
2533
+ declare function isSameMonth(a: Date, b: Date): boolean;
2534
+ /**
2535
+ * Checks if two dates fall in the same calendar year.
2536
+ */
2537
+ declare function isSameYear(a: Date, b: Date): boolean;
2538
+ /**
2539
+ * Returns the locale's first day of week as a JS day index (0=Sun..6=Sat).
2540
+ *
2541
+ * Reads `Intl.Locale(localeCode).getWeekInfo()` when available, falling back
2542
+ * to 1 (Monday) when unavailable. Intl returns 1-7 (1=Mon..7=Sun); this
2543
+ * function converts to JS's 0-6 convention.
2544
+ */
2545
+ declare function getFirstDayOfWeek(localeCode: string): number;
2546
+ /**
2547
+ * Returns 12 month names (January..December) in the requested locale and format.
2548
+ */
2549
+ declare function getMonthNames(localeCode: string, format: "long" | "short"): string[];
2550
+ /**
2551
+ * Returns 7 weekday names starting at `firstDayOfWeek` (0=Sun..6=Sat) in the
2552
+ * requested locale and format.
2553
+ */
2554
+ declare function getWeekdayNames(localeCode: string, format: "long" | "short" | "narrow", firstDayOfWeek: number): string[];
2555
+ /**
2556
+ * Formats a Date according to the given locale's short numeric form.
2557
+ * For `et-EE` produces `dd.MM.yyyy`; for `en-US` `MM/dd/yyyy`; for `en-GB`
2558
+ * `dd/MM/yyyy`; etc.
2559
+ */
2560
+ declare function formatLocaleDate(date: Date, localeCode: string): string;
2561
+ /**
2562
+ * Formats a Date as a long-form, locale-aware string suitable for
2563
+ * `aria-label` use — e.g. for `en-US` produces "Friday, May 16, 2026" and for
2564
+ * `et-EE` "reede, 16. mai 2026". Matches react-day-picker's `labelDay` shape.
2565
+ */
2566
+ declare function formatLocaleDateLong(date: Date, localeCode: string): string;
2567
+ /**
2568
+ * Formats a Date as a locale-aware "Month Year" string — e.g. "May 2026" for
2569
+ * `en-US` and "mai 2026" for `et-EE`. Used as the aria-label for the day
2570
+ * grid and inside the calendar header's aria-live region so screen readers
2571
+ * announce the visible month/year on navigation.
2572
+ */
2573
+ declare function formatMonthYear(date: Date, localeCode: string): string;
2574
+ /**
2575
+ * Builds a locale-aware manual-entry hint such as `pp.kk.aaaa` (et-EE),
2576
+ * `dd.mm.yyyy` (en) or `дд.мм.гггг` (ru). Field order and separators are
2577
+ * derived from `Intl.DateTimeFormat` (so they always match what the field
2578
+ * formats and parses), while the letter tokens are localized per language.
2579
+ * Falls back to English tokens for unknown languages.
2580
+ */
2581
+ declare function formatLocaleDateHint(localeCode: string): string;
2582
+ /**
2583
+ * Parses a locale-formatted date string back into a Date.
2584
+ *
2585
+ * Algorithm (mirrors React's defaultParseDate):
2586
+ * 1. Format a reference date with distinct y/m/d digits via Intl.DateTimeFormat.
2587
+ * 2. Walk `formatToParts` to discover the field order and the literal
2588
+ * separators the locale uses.
2589
+ * 3. Build a regex from that ordering using field-aware digit ranges
2590
+ * (day/month: 1-2 digits, year: 2 or 4 digits) and the actual escaped
2591
+ * separators. 3-digit years are rejected.
2592
+ * 4. Match the (trimmed) input; reject if no match.
2593
+ * 5. Validate ranges and check the constructed Date round-trips (so e.g.
2594
+ * Feb 30 is rejected).
2595
+ *
2596
+ * Returns `undefined` on any failure — silent, caller decides UX.
2597
+ */
2598
+ declare function parseLocaleDate(value: string, localeCode: string): Date | undefined;
2599
+ /**
2600
+ * Returns true if `date` falls within the inclusive `[from, to]` range
2601
+ * (day-level). When `to` is undefined, only `from` matters (same-day check).
2602
+ */
2603
+ declare function isDateInRange(date: Date, range: DateRange): boolean;
2604
+ /**
2605
+ * Toggles a date in an array of dates (day-level). If a same-day entry exists
2606
+ * it is removed; otherwise the date is appended. Returns a new array.
2607
+ */
2608
+ declare function toggleDateInArray(dates: Date[], date: Date): Date[];
2609
+ /**
2610
+ * Builds a 6×7 grid of Date cells for the calendar day view.
2611
+ *
2612
+ * - The first weekday of the month is found, then we walk back to
2613
+ * `firstDayOfWeek` to fill leading cells.
2614
+ * - Cells outside the current month are real Date objects when
2615
+ * `showOutsideDays` is true, otherwise `null`.
2616
+ * - Always returns 6 rows × 7 cells (42 cells total).
2617
+ */
2618
+ declare function buildMonthGrid(month: Date, firstDayOfWeek: number, showOutsideDays: boolean): (Date | null)[][];
2619
+
2620
+ type DateBefore = {
2621
+ before: Date;
2622
+ };
2623
+ type DateAfter = {
2624
+ after: Date;
2625
+ };
2626
+ type DateInterval = {
2627
+ before: Date;
2628
+ after: Date;
2629
+ };
2630
+ type DayOfWeek = {
2631
+ dayOfWeek: number[];
2632
+ };
2633
+ type Matcher = boolean | Date | Date[] | DateBefore | DateAfter | DateInterval | DateRange | DayOfWeek | ((date: Date) => boolean);
2634
+ /**
2635
+ * Returns whether `date` matches the given matcher.
2636
+ *
2637
+ * Semantics mirror react-day-picker:
2638
+ * - `boolean` — returned as-is.
2639
+ * - `Date` — true if same day.
2640
+ * - `Date[]` — true if any entry is the same day.
2641
+ * - `{ before }` — true if date is strictly before `before` (day-level).
2642
+ * - `{ after }` — true if date is strictly after `after` (day-level).
2643
+ * - `{ before, after }` — true if date is OUTSIDE the interval `(after, before)`
2644
+ * (i.e. `date <= after || date >= before`, day-level).
2645
+ * - `{ from, to? }` — true if date is within `[from, to]` inclusive (day-level).
2646
+ * If `to` is omitted, only `from` matters.
2647
+ * - `{ dayOfWeek }` — true if `date.getDay()` is in the array.
2648
+ * - function — called with the date.
2649
+ */
2650
+ declare function matchDate(date: Date, matcher: Matcher): boolean;
2651
+ /**
2652
+ * Returns true if any matcher in the list matches the given date.
2653
+ * An empty array returns false.
2654
+ */
2655
+ declare function matchAny(date: Date, matchers: Matcher[]): boolean;
2656
+
2657
+ type StatusIndicatorType = "success" | "danger" | "warning" | "inactive";
2658
+ type StatusIndicatorSize = "sm" | "lg";
2659
+ type StatusIndicatorPosition = "default" | "top-right";
2660
+ declare class StatusIndicatorComponent {
2661
+ /**
2662
+ * Accessible label for the indicator. When provided, the indicator is
2663
+ * exposed to assistive technology with `role="img"`. When omitted, the
2664
+ * indicator is treated as decorative (`aria-hidden="true"`).
2665
+ */
2666
+ readonly label: _angular_core.InputSignal<string | undefined>;
2667
+ /**
2668
+ * The status type, which determines the indicator color.
2669
+ * @default success
2670
+ */
2671
+ readonly type: _angular_core.InputSignal<StatusIndicatorType>;
2672
+ /**
2673
+ * The size of the indicator.
2674
+ * @default sm
2675
+ */
2676
+ readonly size: _angular_core.InputSignal<StatusIndicatorSize>;
2677
+ /**
2678
+ * Whether the indicator has a white border ring.
2679
+ * @default false
2680
+ */
2681
+ readonly hasBorder: _angular_core.InputSignal<boolean>;
2682
+ /**
2683
+ * Controls positioning of the indicator.
2684
+ * - `'default'` — inline, no absolute positioning
2685
+ * - `'top-right'` — absolutely positioned at the top-right corner of the parent
2686
+ * @default default
2687
+ */
2688
+ readonly position: _angular_core.InputSignal<StatusIndicatorPosition>;
2689
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StatusIndicatorComponent, never>;
2690
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StatusIndicatorComponent, "tedi-status-indicator", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "hasBorder": { "alias": "hasBorder"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
2691
+ }
2692
+
2693
+ type CalendarView = "days" | "months" | "years";
2694
+ type DateFieldMode = "single" | "multiple" | "range";
2695
+
2696
+ interface DayStatus {
2697
+ type: StatusIndicatorType;
2698
+ /**
2699
+ * Accessible label for the status. Surfaced on the day button's `aria-label`
2700
+ * so screen readers announce the date together with its status — required to
2701
+ * meet WCAG 1.1.1 / 1.4.1 since the indicator dot alone is decorative.
2702
+ */
2703
+ label: string;
2704
+ }
2705
+ type DayStatusFn = (date: Date) => DayStatus | null | undefined;
2706
+
2707
+ type CalendarValue = Date | Date[] | DateRange | null;
2708
+ type DayPredicate = (date: Date) => boolean;
2709
+ type DayAvailabilityInput$1 = Date[] | DayPredicate | undefined;
2710
+ type MonthPredicate$1 = (month: Date) => boolean;
2711
+ type YearPredicate$1 = (year: Date) => boolean;
2712
+ declare class CalendarComponent implements ControlValueAccessor {
2713
+ /**
2714
+ * Active view (two-way). `days` shows the day grid, `months` the month grid,
2715
+ * `years` the year grid. Driven by `selectionLevel` and the header navigation,
2716
+ * but can be set directly to open the calendar on a specific level.
2717
+ */
2718
+ readonly view: _angular_core.ModelSignal<CalendarView>;
2719
+ /**
2720
+ * The first (left-most) month shown (two-way). Drives which month grid is
2721
+ * rendered and is updated by header navigation and keyboard paging. For
2722
+ * multi-month layouts the additional months follow this one.
2723
+ */
2724
+ readonly currentMonth: _angular_core.ModelSignal<Date>;
2725
+ /**
2726
+ * The selected value (two-way / `ControlValueAccessor`). Shape follows `mode`:
2727
+ * `single` → `Date | null`, `multiple` → `Date[]`, `range` → `{ from, to }`.
2728
+ */
2729
+ readonly value: _angular_core.ModelSignal<CalendarValue>;
2730
+ /**
2731
+ * Selection mode. `single` selects one date, `multiple` toggles dates in an
2732
+ * array, `range` builds a `{ from, to }` range across two clicks.
2733
+ */
2734
+ readonly mode: _angular_core.InputSignal<DateFieldMode>;
2735
+ /**
2736
+ * Lowest level the user can commit to. `days` shows the day grid as the final
2737
+ * step; `months` and `years` commit at that level instead.
2738
+ */
2739
+ readonly selectionLevel: _angular_core.InputSignal<CalendarView>;
2740
+ /**
2741
+ * BCP-47 locale used for weekday/month names and the first day of the week.
2742
+ */
2743
+ readonly localeCode: _angular_core.InputSignal<string>;
2744
+ /**
2745
+ * Render the trailing/leading days from the adjacent month inside the current
2746
+ * month's grid.
2747
+ */
2748
+ readonly showOutsideDays: _angular_core.InputSignal<boolean>;
2749
+ /** Render the ISO week-number column at the start of each row. */
2750
+ readonly showWeekNumbers: _angular_core.InputSignal<boolean>;
2751
+ /** Show the previous/next navigation chevrons in the header. */
2752
+ readonly showNavigation: _angular_core.InputSignal<boolean>;
2753
+ /**
2754
+ * Render the calendar with its own outer border and rounded corners. Disable
2755
+ * when embedding inside a surface that already has a border (e.g. the
2756
+ * DateField overlay).
2757
+ */
2758
+ readonly bordered: _angular_core.InputSignal<boolean>;
2759
+ /**
2760
+ * Matchers that mark dates as disabled. Each matcher can be a `Date`, `Date[]`,
2761
+ * `{ before }`, `{ after }`, `{ before, after }`, `{ from, to? }`,
2762
+ * `{ dayOfWeek: number[] }`, or a `(date) => boolean` predicate.
2763
+ */
2764
+ readonly disabledMatchers: _angular_core.InputSignal<Matcher[]>;
2765
+ /**
2766
+ * Whitelist of selectable days — an explicit `Date[]` or a predicate
2767
+ * `(date) => boolean`. Days outside the whitelist are disabled.
2768
+ */
2769
+ readonly availableDays: _angular_core.InputSignal<DayAvailabilityInput$1>;
2770
+ /**
2771
+ * Blacklist of unavailable days — a `Date[]` or a predicate `(date) => boolean`.
2772
+ * Takes precedence over `availableDays`.
2773
+ */
2774
+ readonly unavailableDays: _angular_core.InputSignal<DayAvailabilityInput$1>;
2775
+ /**
2776
+ * Function `(date) => { type, label } | null | undefined` that overlays a
2777
+ * `tedi-status-indicator` dot on specific days. The `label` is surfaced on the
2778
+ * day button's `aria-label` for screen readers.
2779
+ */
2780
+ readonly dayStatus: _angular_core.InputSignal<DayStatusFn | undefined>;
2781
+ /**
2782
+ * How the header exposes month/year picking. `dropdown` shows two dropdowns;
2783
+ * `grid` switches the body to a month or year grid when the header label is
2784
+ * clicked; `static` renders just the label — only the prev/next chevrons can
2785
+ * change the month.
2786
+ */
2787
+ readonly monthYearSelectType: _angular_core.InputSignal<"static" | "dropdown" | "grid">;
2788
+ /**
2789
+ * When `mode='multiple'`, prevents clearing the last selected date — at least
2790
+ * one date must remain selected.
2791
+ */
2792
+ readonly required: _angular_core.InputSignal<boolean>;
2793
+ /**
2794
+ * How many consecutive months to render side by side. Useful for range
2795
+ * selection. The visible count is capped to what fits the viewport width.
2796
+ */
2797
+ readonly numberOfMonths: _angular_core.InputSignal<number>;
2798
+ /**
2799
+ * Disables all interactions. Combines with the reactive-forms disabled state.
2800
+ */
2801
+ readonly inputDisabled: _angular_core.InputSignal<boolean>;
2802
+ /**
2803
+ * Predicate `(month) => boolean` returning `true` to disable a whole month
2804
+ * (header navigation and the month grid). Leave `undefined` to disable nothing.
2805
+ */
2806
+ readonly shouldDisableMonth: _angular_core.InputSignal<MonthPredicate$1 | undefined>;
2807
+ /**
2808
+ * Predicate `(year) => boolean` returning `true` to disable a whole year
2809
+ * (header navigation and the year grid). Leave `undefined` to disable nothing.
2810
+ */
2811
+ readonly shouldDisableYear: _angular_core.InputSignal<YearPredicate$1 | undefined>;
2812
+ /**
2813
+ * Earliest year offered in the year grid/dropdown. Defaults to 10 years before
2814
+ * the current year when `null`.
2815
+ */
2816
+ readonly minYear: _angular_core.InputSignal<number | null>;
2817
+ /**
2818
+ * Latest year offered in the year grid/dropdown. Defaults to 10 years after
2819
+ * the current year when `null`.
2820
+ */
2821
+ readonly maxYear: _angular_core.InputSignal<number | null>;
2822
+ /**
2823
+ * Emitted whenever a value is committed. `date` is the new full value (shape
2824
+ * follows `mode`); `day` is the specific day/month/year that was clicked.
2825
+ */
2826
+ readonly select: _angular_core.OutputEmitterRef<{
2827
+ date: CalendarValue;
2828
+ day: Date;
2829
+ }>;
2830
+ private readonly hostEl;
2831
+ private readonly injector;
2832
+ private readonly destroyRef;
2833
+ readonly yearPageSize = 12;
2834
+ private readonly cvaDisabled;
2835
+ private readonly internalYearPageStart;
2836
+ readonly hoveredDay: _angular_core.WritableSignal<Date | null>;
2837
+ private readonly viewportWidth;
2838
+ private onChange;
2839
+ private onTouched;
2840
+ constructor();
2841
+ private static readonly VIEWPORT_MARGIN_PX;
2842
+ private updateFitColumns;
2843
+ readonly effectiveDisabled: _angular_core.Signal<boolean>;
2844
+ readonly firstDayOfWeek: _angular_core.Signal<number>;
2845
+ readonly monthDates: _angular_core.Signal<Date[]>;
2846
+ readonly resolvedMinYear: _angular_core.Signal<number>;
2847
+ readonly resolvedMaxYear: _angular_core.Signal<number>;
2848
+ readonly yearPageStart: _angular_core.Signal<number>;
2849
+ readonly selectedSingle: _angular_core.Signal<Date | null>;
2850
+ readonly computedDisabledMatchers: _angular_core.Signal<Matcher[]>;
2851
+ readonly effectiveIsMonthDisabled: _angular_core.Signal<MonthPredicate$1>;
2852
+ readonly effectiveIsYearDisabled: _angular_core.Signal<YearPredicate$1>;
2853
+ writeValue(value: CalendarValue): void;
2854
+ registerOnChange(fn: (value: CalendarValue) => void): void;
2855
+ registerOnTouched(fn: () => void): void;
2856
+ setDisabledState(disabled: boolean): void;
2857
+ handlePrev(): void;
2858
+ handleNext(): void;
2859
+ handleHeaderMonthChange(monthStartDate: Date, index?: number): void;
2860
+ handleHeaderYearChange(yearStartDate: Date, index?: number): void;
2861
+ handleHeaderViewChange(nextView: CalendarView): void;
2862
+ handleDaySelect(day: Date): void;
2863
+ handleMonthSelect(monthStartDate: Date): void;
2864
+ handleYearSelect(yearStartDate: Date): void;
2865
+ private applyModeSelection;
2866
+ handleKeydown(event: KeyboardEvent): void;
2867
+ private handleDaysKeydown;
2868
+ private computeDayKeyTarget;
2869
+ private skipDisabledDays;
2870
+ private adjustCurrentMonthForFocus;
2871
+ private handleMonthsKeydown;
2872
+ private handleYearsKeydown;
2873
+ private focusGridIndex;
2874
+ private queryGridButtons;
2875
+ /**
2876
+ * Moves focus to the calendar's active cell — the roving-tabindex day in the
2877
+ * day view, or the first enabled control in the month/year views. Used by
2878
+ * popover hosts (e.g. date-field) to pull focus into the calendar when it
2879
+ * opens, since the CDK overlay is detached from the trigger in DOM order.
2880
+ */
2881
+ focusActiveCell(): void;
2882
+ private focusDayCell;
2883
+ private commit;
2884
+ private partialRange;
2885
+ private deriveAnchor;
2886
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CalendarComponent, never>;
2887
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CalendarComponent, "tedi-calendar", never, { "view": { "alias": "view"; "required": false; "isSignal": true; }; "currentMonth": { "alias": "currentMonth"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "selectionLevel": { "alias": "selectionLevel"; "required": false; "isSignal": true; }; "localeCode": { "alias": "localeCode"; "required": false; "isSignal": true; }; "showOutsideDays": { "alias": "showOutsideDays"; "required": false; "isSignal": true; }; "showWeekNumbers": { "alias": "showWeekNumbers"; "required": false; "isSignal": true; }; "showNavigation": { "alias": "showNavigation"; "required": false; "isSignal": true; }; "bordered": { "alias": "bordered"; "required": false; "isSignal": true; }; "disabledMatchers": { "alias": "disabledMatchers"; "required": false; "isSignal": true; }; "availableDays": { "alias": "availableDays"; "required": false; "isSignal": true; }; "unavailableDays": { "alias": "unavailableDays"; "required": false; "isSignal": true; }; "dayStatus": { "alias": "dayStatus"; "required": false; "isSignal": true; }; "monthYearSelectType": { "alias": "monthYearSelectType"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "numberOfMonths": { "alias": "numberOfMonths"; "required": false; "isSignal": true; }; "inputDisabled": { "alias": "inputDisabled"; "required": false; "isSignal": true; }; "shouldDisableMonth": { "alias": "shouldDisableMonth"; "required": false; "isSignal": true; }; "shouldDisableYear": { "alias": "shouldDisableYear"; "required": false; "isSignal": true; }; "minYear": { "alias": "minYear"; "required": false; "isSignal": true; }; "maxYear": { "alias": "maxYear"; "required": false; "isSignal": true; }; }, { "view": "viewChange"; "currentMonth": "currentMonthChange"; "value": "valueChange"; "select": "select"; }, never, ["[tediCalendarFooter]"], true, never>;
2888
+ }
2889
+
2890
+ type PaginationBackground = "white" | "transparent";
2891
+ /**
2892
+ * Visibility toggle for the results / page-size / pager / arrow slots.
2893
+ * - `true` — always hidden
2894
+ * - `false` (default) — always visible
2895
+ * - `'sm'` / `'md'` / `'lg'` / `'xl'` / `'xxl'` — hidden below that breakpoint
2896
+ *
2897
+ * Mirrors the `boolean | breakpoint` pattern used by `tedi-modal`'s
2898
+ * `fullscreen` input.
2899
+ */
2900
+ type PaginationVisibility = boolean | "sm" | "md" | "lg" | "xl" | "xxl";
2901
+ /**
2902
+ * Where the divider sits relative to the pagination row.
2903
+ * - `'top'` (default) — border on top, matches single-row layouts under content
2904
+ * - `'bottom'` — border on bottom, for above-content placements
2905
+ * - `'none'` — no divider, useful when the surrounding container already has one
2906
+ */
2907
+ type PaginationDividerPosition = "top" | "bottom" | "none";
2908
+ type PaginationItemType = "page" | "previous" | "next" | "ellipsis";
2909
+ /**
2910
+ * A labelled page-size option. Use it alongside plain numbers in
2911
+ * `pageSizeOptions` when the visible text should differ from the value —
2912
+ * most commonly a "Show all" entry: `{ value: totalItems, label: 'Show all' }`.
2913
+ * The label is rendered as-is, so supply it already translated.
2914
+ */
2915
+ interface PaginationPageSizeOption {
2916
+ value: number;
2917
+ label: string;
2918
+ }
2919
+ interface PaginationItem {
2920
+ type: PaginationItemType;
2921
+ page: number | null;
2922
+ selected: boolean;
2923
+ disabled: boolean;
2924
+ }
2925
+ interface PaginationLabels {
2926
+ /** Accessible label for the nav wrapper. @default 'Pagination' */
2927
+ ariaLabel: string;
2928
+ /** Previous button label (icon-only, used as aria-label). @default 'Previous page' */
2929
+ previous: string;
2930
+ /** Next button label (icon-only, used as aria-label). @default 'Next page' */
2931
+ next: string;
2932
+ /** aria-label for a numeric page button. @default (page) => 'Go to page {page}' */
2933
+ pageAriaLabel: (page: number) => string;
2016
2934
  /** aria-label for the currently active page. @default (page) => 'Current page, page {page}' */
2017
2935
  currentPageAriaLabel: (page: number) => string;
2018
2936
  /** Rendered to the left of the nav when `totalItems` is set. @default (count) => '{count} results' */
@@ -2027,6 +2945,30 @@ interface PaginationLabels {
2027
2945
  pageSizeTitle: string;
2028
2946
  }
2029
2947
 
2948
+ type OverlayPosition = "top" | "top-start" | "top-end" | "bottom" | "bottom-start" | "bottom-end" | "left" | "left-start" | "left-end" | "right" | "right-start" | "right-end" | "auto" | "auto-start" | "auto-end";
2949
+ declare function toConnectedPositions(placement: OverlayPosition, preventOverflow: boolean, extraOffset?: number): ConnectedPosition[];
2950
+ /** The side of the trigger an overlay resolved to after positioning. */
2951
+ type OverlaySide = "top" | "bottom" | "left" | "right";
2952
+ declare function getPlacementFromPositionChange(change: ConnectedOverlayPositionChange): OverlaySide;
2953
+ interface ArrowOffset {
2954
+ left: number | null;
2955
+ top: number | null;
2956
+ }
2957
+ /**
2958
+ * Manages horizontal-only push and resize recalculation for CDK overlays.
2959
+ */
2960
+ declare class HorizontalPushHandler {
2961
+ private readonly getOverlayEl;
2962
+ private readonly onAfterPush?;
2963
+ private resizeCleanup?;
2964
+ private rafId?;
2965
+ constructor(getOverlayEl: () => HTMLElement | undefined, onAfterPush?: (() => void) | undefined);
2966
+ apply(): void;
2967
+ attach(): void;
2968
+ detach(): void;
2969
+ }
2970
+ declare function calculateArrowOffset(placement: OverlaySide, triggerEl: HTMLElement, overlayEl: HTMLElement, arrowSize: number, padding?: number): ArrowOffset;
2971
+
2030
2972
  declare class PopoverTriggerDirective {
2031
2973
  /**
2032
2974
  * Should add underline class to trigger element?
@@ -2035,85 +2977,98 @@ declare class PopoverTriggerDirective {
2035
2977
  readonly underline: _angular_core.InputSignal<boolean>;
2036
2978
  readonly host: ElementRef<HTMLElement>;
2037
2979
  readonly popover: PopoverComponent;
2980
+ readonly overlayOrigin: CdkOverlayOrigin;
2038
2981
  onClick(): void;
2039
2982
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<PopoverTriggerDirective, never>;
2040
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<PopoverTriggerDirective, "[tedi-popover-trigger]", never, { "underline": { "alias": "underline"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
2983
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<PopoverTriggerDirective, "[tedi-popover-trigger]", never, { "underline": { "alias": "underline"; "required": false; "isSignal": true; }; }, {}, never, never, true, [{ directive: typeof _angular_cdk_overlay.CdkOverlayOrigin; inputs: {}; outputs: {}; }]>;
2041
2984
  }
2042
2985
 
2043
- type PopoverPosition = `${NgxFloatUiPlacements}`;
2044
- declare class PopoverComponent implements AfterContentChecked {
2986
+ type PopoverPosition = OverlayPosition;
2987
+ declare class PopoverComponent {
2045
2988
  /**
2046
2989
  * The position of the popover relative to the trigger element.
2047
2990
  * @default top
2048
2991
  */
2049
- position: _angular_core.InputSignal<"left" | "right" | "top" | "bottom" | "auto" | "auto-start" | "auto-end" | "top-start" | "bottom-start" | "left-start" | "right-start" | "top-end" | "bottom-end" | "left-end" | "right-end">;
2992
+ readonly position: _angular_core.InputSignal<OverlayPosition>;
2050
2993
  /**
2051
2994
  * Should position flip to opposite direction when overflowing screen?
2052
2995
  * @default false
2053
2996
  */
2054
- preventOverflow: _angular_core.InputSignal<boolean>;
2997
+ readonly preventOverflow: _angular_core.InputSignal<boolean>;
2055
2998
  /**
2056
2999
  * Is dismissible by clicking outside of content?
2057
3000
  * @default true
2058
3001
  */
2059
- dismissible: _angular_core.InputSignal<boolean>;
3002
+ readonly dismissible: _angular_core.InputSignal<boolean>;
2060
3003
  /**
2061
3004
  * Does popover content hide on scroll?
2062
3005
  * @default false
2063
3006
  */
2064
- hideOnScroll: _angular_core.InputSignal<boolean>;
3007
+ readonly hideOnScroll: _angular_core.InputSignal<boolean>;
2065
3008
  /**
2066
3009
  * Does popover have illustrative border on the arrow side?
2067
3010
  * @default false
2068
3011
  */
2069
- withBorder: _angular_core.InputSignal<boolean>;
3012
+ readonly withBorder: _angular_core.InputSignal<boolean>;
2070
3013
  /**
2071
3014
  * Should show arrow?
2072
3015
  */
2073
- withArrow: _angular_core.InputSignal<boolean>;
3016
+ readonly withArrow: _angular_core.InputSignal<boolean>;
2074
3017
  /**
2075
3018
  * Lock scrolling on rest of the page?
2076
3019
  * @default false
2077
3020
  */
2078
- lockScroll: _angular_core.InputSignal<boolean>;
2079
- /**
2080
- * Append floating element to given selector.
2081
- * Use 'body' to append at the end of DOM or empty string to append next to trigger element.
2082
- * @default "body"
2083
- */
2084
- readonly appendTo: _angular_core.InputSignal<string>;
3021
+ readonly lockScroll: _angular_core.InputSignal<boolean>;
2085
3022
  /** Delay time (in ms) for closing popover when not hovering trigger or content.
2086
3023
  * @default 100
2087
3024
  */
2088
3025
  readonly timeoutDelay: _angular_core.InputSignal<number>;
2089
3026
  private readonly document;
2090
3027
  private readonly renderer;
2091
- readonly floatUiComponent: _angular_core.Signal<NgxFloatUiContentComponent>;
3028
+ private readonly connectedOverlay;
2092
3029
  readonly popoverTrigger: _angular_core.Signal<PopoverTriggerDirective>;
2093
3030
  private readonly popoverContent;
3031
+ readonly isOpen: _angular_core.WritableSignal<boolean>;
3032
+ readonly currentPlacement: _angular_core.WritableSignal<OverlaySide>;
2094
3033
  readonly containerId: _angular_core.WritableSignal<string>;
2095
3034
  readonly isContentHovered: _angular_core.WritableSignal<boolean>;
3035
+ readonly arrowLeft: _angular_core.WritableSignal<number | null>;
3036
+ readonly arrowTop: _angular_core.WritableSignal<number | null>;
3037
+ readonly overlayOrigin: _angular_core.Signal<_angular_cdk_overlay.CdkOverlayOrigin>;
3038
+ private readonly arrowOffset;
3039
+ readonly overlayPositions: _angular_core.Signal<_angular_cdk_overlay.ConnectedPosition[]>;
3040
+ readonly panelClasses: _angular_core.Signal<string>;
3041
+ readonly ariaLabelledBy: _angular_core.Signal<string>;
2096
3042
  hideTimeout?: ReturnType<typeof setTimeout>;
3043
+ /** Whether this popover locked body scroll when it opened — read on close
3044
+ * so a mid-open change to the lockScroll input can't leave the lock stuck. */
3045
+ private lockedScrollAtOpen;
2097
3046
  private keydownListener?;
2098
3047
  private scrollListener?;
2099
3048
  private focusinListener?;
2100
3049
  private mousedownListener?;
2101
- ngAfterContentChecked(): void;
3050
+ private readonly horizontalPush;
3051
+ constructor();
2102
3052
  showPopover(): void;
3053
+ onOverlayAttach(): void;
3054
+ onPositionChange(change: ConnectedOverlayPositionChange): void;
2103
3055
  hidePopover(focusTrigger?: boolean): void;
2104
3056
  togglePopover(): void;
2105
- readonly floatUiContainerClass: _angular_core.Signal<string>;
3057
+ private updateArrowPosition;
2106
3058
  private setupKeyboardNavigation;
2107
3059
  private cleanupKeyboardNavigation;
2108
3060
  private setupScrollListener;
2109
3061
  private cleanupScrollListener;
2110
3062
  private setupDismissListeners;
2111
3063
  private cleanupDismissListeners;
3064
+ /** Focusable elements on the page, excluding the popover's own overlay —
3065
+ * those are detached on close, so focusing them would drop focus to body. */
3066
+ private getPageFocusableElements;
2112
3067
  private focusElementAfterTrigger;
2113
3068
  private focusElementBeforeTrigger;
2114
3069
  private handleClosePopoverEvent;
2115
3070
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<PopoverComponent, never>;
2116
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<PopoverComponent, "tedi-popover", never, { "position": { "alias": "position"; "required": false; "isSignal": true; }; "preventOverflow": { "alias": "preventOverflow"; "required": false; "isSignal": true; }; "dismissible": { "alias": "dismissible"; "required": false; "isSignal": true; }; "hideOnScroll": { "alias": "hideOnScroll"; "required": false; "isSignal": true; }; "withBorder": { "alias": "withBorder"; "required": false; "isSignal": true; }; "withArrow": { "alias": "withArrow"; "required": false; "isSignal": true; }; "lockScroll": { "alias": "lockScroll"; "required": false; "isSignal": true; }; "appendTo": { "alias": "appendTo"; "required": false; "isSignal": true; }; "timeoutDelay": { "alias": "timeoutDelay"; "required": false; "isSignal": true; }; }, {}, ["popoverTrigger", "popoverContent"], ["[tedi-popover-trigger]", "tedi-popover-content"], true, never>;
3071
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PopoverComponent, "tedi-popover", never, { "position": { "alias": "position"; "required": false; "isSignal": true; }; "preventOverflow": { "alias": "preventOverflow"; "required": false; "isSignal": true; }; "dismissible": { "alias": "dismissible"; "required": false; "isSignal": true; }; "hideOnScroll": { "alias": "hideOnScroll"; "required": false; "isSignal": true; }; "withBorder": { "alias": "withBorder"; "required": false; "isSignal": true; }; "withArrow": { "alias": "withArrow"; "required": false; "isSignal": true; }; "lockScroll": { "alias": "lockScroll"; "required": false; "isSignal": true; }; "timeoutDelay": { "alias": "timeoutDelay"; "required": false; "isSignal": true; }; }, {}, ["popoverTrigger", "popoverContent"], ["[tedi-popover-trigger]", "tedi-popover-content"], true, never>;
2117
3072
  }
2118
3073
 
2119
3074
  /**
@@ -2325,6 +3280,12 @@ type ComponentInputs<TComponent> = {
2325
3280
  };
2326
3281
 
2327
3282
  type TableSize = "medium" | "small";
3283
+ /**
3284
+ * The auto-injected control columns, in the order they may appear. Used by the
3285
+ * table's `controlColumnOrder` input to let consumers reorder them (e.g. place
3286
+ * the selection checkbox before the expand chevron).
3287
+ */
3288
+ type TableControlColumn = "drag" | "select" | "expand";
2328
3289
  /** Phases of keyboard-driven column reordering. */
2329
3290
  type ColumnReorderPhase = "idle" | "picked-up" | "moving";
2330
3291
  /**
@@ -2461,6 +3422,19 @@ type TediColumnDef<TData, TValue = unknown> = ColumnDef<TData, TValue> & {
2461
3422
  * entirely (covered by a previous spanning cell). Defaults to `1`.
2462
3423
  */
2463
3424
  rowSpan?: number | ((info: CellContext<TData, TValue>) => number);
3425
+ /**
3426
+ * Row grouping for this column: consecutive rendered rows with an equal key
3427
+ * are merged into a single spanning cell (computed internally against the
3428
+ * live, post-filter / sort / pagination row model — no manual
3429
+ * `groupRowSpan` wiring).
3430
+ *
3431
+ * - A function `(row) => key` groups this column by its own key.
3432
+ * - `true` reuses the table-level `groupRowsBy` key (shared grouping that
3433
+ * also drives the control columns, group selection, and group borders).
3434
+ *
3435
+ * Takes precedence over `rowSpan` when both are set.
3436
+ */
3437
+ groupBy?: boolean | ((row: Row<TData>) => unknown);
2464
3438
  /**
2465
3439
  * Opts the column into the built-in sort affordance. When `true` and the
2466
3440
  * column's `header` is a string, the table renders a clickable sort button
@@ -2689,6 +3663,38 @@ declare class TediTableComponent<TData> {
2689
3663
  * @default undefined
2690
3664
  */
2691
3665
  readonly getSubRows: _angular_core.InputSignal<((row: TData) => TData[] | undefined) | undefined>;
3666
+ /**
3667
+ * Table-level row grouping key. When set, consecutive rendered rows with an
3668
+ * equal key form a group, and:
3669
+ * - the control columns (select / expand / drag) span each group — one
3670
+ * checkbox and one chevron per group instead of per row,
3671
+ * - row selection operates per group (see `enableRowSelection`),
3672
+ * - group boundaries drive `rowGroupDividers`.
3673
+ *
3674
+ * Data columns opt into spanning the same groups with `groupBy: true`; a
3675
+ * column can also group independently with its own `groupBy: (row) => key`.
3676
+ * @default undefined
3677
+ */
3678
+ readonly groupRowsBy: _angular_core.InputSignal<((row: Row<TData>) => unknown) | undefined>;
3679
+ /**
3680
+ * How row dividers are drawn when the table is grouped via `groupRowsBy`:
3681
+ * - `"all"` (default) — a divider under every row, as usual.
3682
+ * - `"between"` — dividers only at group boundaries; rows within a group
3683
+ * read as one block.
3684
+ * - `"none"` — no row dividers.
3685
+ *
3686
+ * No effect when `groupRowsBy` is not set.
3687
+ * @default "all"
3688
+ */
3689
+ readonly rowGroupDividers: _angular_core.InputSignal<"none" | "all" | "between">;
3690
+ /**
3691
+ * Order of the auto-injected control columns (drag handle, selection
3692
+ * checkbox, expand chevron). Only the controls that are actually enabled
3693
+ * render; any enabled control omitted from this list is appended at the end.
3694
+ * Use it to e.g. place the checkbox before the expand chevron.
3695
+ * @default ["drag", "select", "expand"]
3696
+ */
3697
+ readonly controlColumnOrder: _angular_core.InputSignal<TableControlColumn[]>;
2692
3698
  /**
2693
3699
  * Enables pagination and configures the bottom paginator slot. This is also
2694
3700
  * the source of truth for `pageSize` / `pageSizeOptions` — the top slot
@@ -2884,6 +3890,20 @@ declare class TediTableComponent<TData> {
2884
3890
  */
2885
3891
  private readonly hasFilterableColumns;
2886
3892
  private readonly augmentedColumns;
3893
+ /**
3894
+ * Per-column group spans (`columnId → (rowId → span)`), computed from the
3895
+ * live row model for every column that opts into grouping via `groupBy`.
3896
+ * A `groupBy: true` column reuses the table-level `groupRowsBy` key.
3897
+ */
3898
+ protected readonly groupSpansByColumn: Signal<Map<string, Map<string, number>>>;
3899
+ /**
3900
+ * Table-level row groups keyed by `groupRowsBy`: maps every row id to the
3901
+ * full set of rows in its (consecutive) group. Empty when the table is not
3902
+ * grouped. Drives group selection and group dividers.
3903
+ */
3904
+ protected readonly rowGroups: Signal<Map<string, Row<TData>[]>>;
3905
+ /** Row ids that start a group — used to draw dividers at group boundaries. */
3906
+ protected readonly groupStartRowIds: Signal<Set<string>>;
2887
3907
  private buildStateChangeHandlers;
2888
3908
  private readonly defaultPagination;
2889
3909
  private buildResolvedState;
@@ -2917,7 +3937,12 @@ declare class TediTableComponent<TData> {
2917
3937
  protected readonly isSomePageRowsSelected: Signal<boolean>;
2918
3938
  constructor();
2919
3939
  private applyPatch;
2920
- protected handleRowClick(row: Row<TData>): void;
3940
+ protected handleRowClick(event: Event, row: Row<TData>): void;
3941
+ /**
3942
+ * True when the click originated on an interactive control between the event
3943
+ * target and the row element (exclusive), so row-level handlers can bow out.
3944
+ */
3945
+ private isInteractiveTarget;
2921
3946
  private hasTextSelection;
2922
3947
  /** Accessible name for an interactive row, from `rowAriaLabel`. `null` when
2923
3948
  * the row is not interactive or no resolver is provided. */
@@ -2952,6 +3977,22 @@ declare class TediTableComponent<TData> {
2952
3977
  protected columnMaxWidth(column: {
2953
3978
  id: string;
2954
3979
  }): number | null;
3980
+ /**
3981
+ * Columns frozen by `stickyFirstColumn`, keyed by id: the leading control
3982
+ * columns (select / expand / drag) plus the first content column, pinned
3983
+ * together as one block. `left` is the cumulative offset; `start` / `edge`
3984
+ * mark the block's left and right edges (the right edge draws the divider).
3985
+ * Empty when `stickyFirstColumn` is off.
3986
+ */
3987
+ protected readonly stickyLeftColumns: Signal<Map<string, {
3988
+ left: number;
3989
+ start: boolean;
3990
+ edge: boolean;
3991
+ }>>;
3992
+ /** Sticky `left` (px) for a frozen column; `null` when the column isn't frozen. */
3993
+ protected stickyLeft(id: string): number | null;
3994
+ /** Sticky-column class fragment for a cell (`""` when not frozen). */
3995
+ protected stickyLeftClass(id: string): string;
2955
3996
  protected handleRowKeydown(event: KeyboardEvent, row: Row<TData>): void;
2956
3997
  protected handleRowDrop(event: CdkDragDrop<TData[]>): void;
2957
3998
  /** Stable id for a row's reorder handle button — used to restore keyboard
@@ -3036,7 +4077,18 @@ declare class TediTableComponent<TData> {
3036
4077
  /** Visible label shown while a row is expanded (`close` action). */
3037
4078
  protected readonly expandButtonCloseText: Signal<string | undefined>;
3038
4079
  protected handleSelectAll(checked: boolean): void;
4080
+ /**
4081
+ * Selectable rows that a single checkbox controls. For a real group (>1
4082
+ * member) that's the whole group; otherwise it's the row itself — which
4083
+ * keeps TanStack's parent→sub-row cascade (`row.toggleSelected`) intact for
4084
+ * `getSubRows` parents that happen to be singleton groups.
4085
+ */
4086
+ private selectionGroup;
3039
4087
  protected handleSelectRow(row: Row<TData>, checked: boolean): void;
4088
+ /** Whether the (group) checkbox for `row` should render as checked. */
4089
+ protected isRowSelected(row: Row<TData>): boolean;
4090
+ /** Whether the (group) checkbox for `row` should render as indeterminate. */
4091
+ protected isRowIndeterminate(row: Row<TData>): boolean;
3040
4092
  protected handleExpandToggle(row: Row<TData>): void;
3041
4093
  protected handleExpandKeydown(event: KeyboardEvent): void;
3042
4094
  protected handleColumnFilter(column: ReturnType<Table<TData>["getAllLeafColumns"]>[number], value: string): void;
@@ -3143,11 +4195,12 @@ declare class TediTableComponent<TData> {
3143
4195
  */
3144
4196
  protected resolveRowSpan(cell: {
3145
4197
  column: {
4198
+ id: string;
3146
4199
  columnDef: TediColumnDef<TData>;
3147
4200
  };
3148
4201
  }, cellContext: CellContext<TData, unknown>): number | null;
3149
4202
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TediTableComponent<any>, never>;
3150
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TediTableComponent<any>, "tedi-table", never, { "id": { "alias": "id"; "required": false; "isSignal": true; }; "data": { "alias": "data"; "required": true; "isSignal": true; }; "columns": { "alias": "columns"; "required": true; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "caption": { "alias": "caption"; "required": false; "isSignal": true; }; "striped": { "alias": "striped"; "required": false; "isSignal": true; }; "verticalBorders": { "alias": "verticalBorders"; "required": false; "isSignal": true; }; "borderless": { "alias": "borderless"; "required": false; "isSignal": true; }; "stickyFirstColumn": { "alias": "stickyFirstColumn"; "required": false; "isSignal": true; }; "stickyHeader": { "alias": "stickyHeader"; "required": false; "isSignal": true; }; "fixedLayout": { "alias": "fixedLayout"; "required": false; "isSignal": true; }; "maxHeight": { "alias": "maxHeight"; "required": false; "isSignal": true; }; "activeRowId": { "alias": "activeRowId"; "required": false; "isSignal": true; }; "selectedRowHighlight": { "alias": "selectedRowHighlight"; "required": false; "isSignal": true; }; "rowHover": { "alias": "rowHover"; "required": false; "isSignal": true; }; "enableRowSelection": { "alias": "enableRowSelection"; "required": false; "isSignal": true; }; "selectionMode": { "alias": "selectionMode"; "required": false; "isSignal": true; }; "enableColumnFilters": { "alias": "enableColumnFilters"; "required": false; "isSignal": true; }; "renderSubComponent": { "alias": "renderSubComponent"; "required": false; "isSignal": true; }; "getRowCanExpand": { "alias": "getRowCanExpand"; "required": false; "isSignal": true; }; "expandTrigger": { "alias": "expandTrigger"; "required": false; "isSignal": true; }; "expandButtonVariant": { "alias": "expandButtonVariant"; "required": false; "isSignal": true; }; "expandButtonLabel": { "alias": "expandButtonLabel"; "required": false; "isSignal": true; }; "getSubRows": { "alias": "getSubRows"; "required": false; "isSignal": true; }; "pagination": { "alias": "pagination"; "required": false; "isSignal": true; }; "paginationTop": { "alias": "paginationTop"; "required": false; "isSignal": true; }; "manualPagination": { "alias": "manualPagination"; "required": false; "isSignal": true; }; "manualSorting": { "alias": "manualSorting"; "required": false; "isSignal": true; }; "manualFiltering": { "alias": "manualFiltering"; "required": false; "isSignal": true; }; "pageCount": { "alias": "pageCount"; "required": false; "isSignal": true; }; "rowCount": { "alias": "rowCount"; "required": false; "isSignal": true; }; "state": { "alias": "state"; "required": false; "isSignal": true; }; "defaultState": { "alias": "defaultState"; "required": false; "isSignal": true; }; "persist": { "alias": "persist"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "placeholderRole": { "alias": "placeholderRole"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "rowAriaLabel": { "alias": "rowAriaLabel"; "required": false; "isSignal": true; }; "reorderableRows": { "alias": "reorderableRows"; "required": false; "isSignal": true; }; "reorderableColumns": { "alias": "reorderableColumns"; "required": false; "isSignal": true; }; }, { "stateChange": "stateChange"; "rowClick": "rowClick"; "rowDrop": "rowDrop"; }, ["customResultsTemplateRef"], ["tedi-table-toolbar", "tedi-table-columns-menu"], true, never>;
4203
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TediTableComponent<any>, "tedi-table", never, { "id": { "alias": "id"; "required": false; "isSignal": true; }; "data": { "alias": "data"; "required": true; "isSignal": true; }; "columns": { "alias": "columns"; "required": true; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "caption": { "alias": "caption"; "required": false; "isSignal": true; }; "striped": { "alias": "striped"; "required": false; "isSignal": true; }; "verticalBorders": { "alias": "verticalBorders"; "required": false; "isSignal": true; }; "borderless": { "alias": "borderless"; "required": false; "isSignal": true; }; "stickyFirstColumn": { "alias": "stickyFirstColumn"; "required": false; "isSignal": true; }; "stickyHeader": { "alias": "stickyHeader"; "required": false; "isSignal": true; }; "fixedLayout": { "alias": "fixedLayout"; "required": false; "isSignal": true; }; "maxHeight": { "alias": "maxHeight"; "required": false; "isSignal": true; }; "activeRowId": { "alias": "activeRowId"; "required": false; "isSignal": true; }; "selectedRowHighlight": { "alias": "selectedRowHighlight"; "required": false; "isSignal": true; }; "rowHover": { "alias": "rowHover"; "required": false; "isSignal": true; }; "enableRowSelection": { "alias": "enableRowSelection"; "required": false; "isSignal": true; }; "selectionMode": { "alias": "selectionMode"; "required": false; "isSignal": true; }; "enableColumnFilters": { "alias": "enableColumnFilters"; "required": false; "isSignal": true; }; "renderSubComponent": { "alias": "renderSubComponent"; "required": false; "isSignal": true; }; "getRowCanExpand": { "alias": "getRowCanExpand"; "required": false; "isSignal": true; }; "expandTrigger": { "alias": "expandTrigger"; "required": false; "isSignal": true; }; "expandButtonVariant": { "alias": "expandButtonVariant"; "required": false; "isSignal": true; }; "expandButtonLabel": { "alias": "expandButtonLabel"; "required": false; "isSignal": true; }; "getSubRows": { "alias": "getSubRows"; "required": false; "isSignal": true; }; "groupRowsBy": { "alias": "groupRowsBy"; "required": false; "isSignal": true; }; "rowGroupDividers": { "alias": "rowGroupDividers"; "required": false; "isSignal": true; }; "controlColumnOrder": { "alias": "controlColumnOrder"; "required": false; "isSignal": true; }; "pagination": { "alias": "pagination"; "required": false; "isSignal": true; }; "paginationTop": { "alias": "paginationTop"; "required": false; "isSignal": true; }; "manualPagination": { "alias": "manualPagination"; "required": false; "isSignal": true; }; "manualSorting": { "alias": "manualSorting"; "required": false; "isSignal": true; }; "manualFiltering": { "alias": "manualFiltering"; "required": false; "isSignal": true; }; "pageCount": { "alias": "pageCount"; "required": false; "isSignal": true; }; "rowCount": { "alias": "rowCount"; "required": false; "isSignal": true; }; "state": { "alias": "state"; "required": false; "isSignal": true; }; "defaultState": { "alias": "defaultState"; "required": false; "isSignal": true; }; "persist": { "alias": "persist"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "placeholderRole": { "alias": "placeholderRole"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "rowAriaLabel": { "alias": "rowAriaLabel"; "required": false; "isSignal": true; }; "reorderableRows": { "alias": "reorderableRows"; "required": false; "isSignal": true; }; "reorderableColumns": { "alias": "reorderableColumns"; "required": false; "isSignal": true; }; }, { "stateChange": "stateChange"; "rowClick": "rowClick"; "rowDrop": "rowDrop"; }, ["customResultsTemplateRef"], ["tedi-table-toolbar", "tedi-table-columns-menu"], true, never>;
3151
4204
  }
3152
4205
 
3153
4206
  declare const TEDI_TABLE_CONTEXT: InjectionToken<TediTableContextValue<unknown>>;
@@ -3177,12 +4230,23 @@ declare function createTablePersistence(options: {
3177
4230
  onStateChange?: (state: TableState) => void;
3178
4231
  }): TablePersistenceController;
3179
4232
 
4233
+ /**
4234
+ * Collapse consecutive rows with an equal key into row spans, keyed by row id.
4235
+ * The first row of each run maps to the run length (`N`); the rows it covers
4236
+ * map to `0`. Pass the **rendered** row set (typically
4237
+ * `table.getRowModel().rows`) so spans operate post-filter / sort / pagination.
4238
+ */
4239
+ declare function computeGroupSpans<TData>(rows: Row<TData>[], keyFn: (row: Row<TData>) => unknown): Map<string, number>;
3180
4240
  /**
3181
4241
  * Build a `rowSpan` callback that auto-collapses consecutive equal keys.
3182
4242
  * Returns `N > 1` for the first row in a run and `0` for the covered rows.
3183
4243
  * Pass the **same** array of rows the table is rendering — typically
3184
4244
  * `table.getRowModel().rows` — so spans operate on the post-filter / sort /
3185
4245
  * pagination row set.
4246
+ *
4247
+ * Prefer the column-level `groupBy` option, which computes this internally
4248
+ * against the live row model; reach for this helper only when you need a
4249
+ * standalone `rowSpan` callback.
3186
4250
  */
3187
4251
  declare function groupRowSpan<TData>(rows: Row<TData>[], keyFn: (row: Row<TData>) => unknown): (info: CellContext<TData, unknown>) => number;
3188
4252
 
@@ -3248,6 +4312,7 @@ declare class DropdownTriggerDirective implements AfterViewInit {
3248
4312
  readonly ariaHaspopup: _angular_core.InputSignal<DropdownTriggerAriaHasPopup>;
3249
4313
  readonly host: ElementRef<HTMLElement>;
3250
4314
  readonly dropdown: DropdownComponent;
4315
+ readonly overlayOrigin: CdkOverlayOrigin;
3251
4316
  private readonly renderer;
3252
4317
  /**
3253
4318
  * The element that actually receives focus and ARIA semantics. When the directive
@@ -3270,13 +4335,13 @@ declare class DropdownTriggerDirective implements AfterViewInit {
3270
4335
  private openAndFocusFirst;
3271
4336
  private openAndFocusLast;
3272
4337
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DropdownTriggerDirective, never>;
3273
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<DropdownTriggerDirective, "[tedi-dropdown-trigger]", never, { "ariaHaspopup": { "alias": "ariaHaspopup"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
4338
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<DropdownTriggerDirective, "[tedi-dropdown-trigger]", never, { "ariaHaspopup": { "alias": "ariaHaspopup"; "required": false; "isSignal": true; }; }, {}, never, never, true, [{ directive: typeof _angular_cdk_overlay.CdkOverlayOrigin; inputs: {}; outputs: {}; }]>;
3274
4339
  }
3275
4340
 
3276
4341
  interface DropdownApi {
3277
4342
  /** Current value of the dropdown. Used to track the selected option in listbox mode. */
3278
4343
  value: WritableSignal<string | undefined>;
3279
- /** ID of the float-ui container element. Used to link trigger and content for accessibility. */
4344
+ /** ID of the overlay container element. Used to link trigger and content for accessibility. */
3280
4345
  containerId: WritableSignal<string>;
3281
4346
  /** Move focus to the next enabled item after the given element. */
3282
4347
  focusNextItem(fromEl: HTMLLIElement): void;
@@ -3380,6 +4445,7 @@ declare class DropdownContentComponent {
3380
4445
  * @default menu
3381
4446
  */
3382
4447
  readonly dropdownRole: _angular_core.InputSignal<DropdownRole>;
4448
+ readonly host: ElementRef<HTMLElement>;
3383
4449
  private readonly dropdownApi;
3384
4450
  readonly containerId: _angular_core.Signal<string>;
3385
4451
  readonly items: _angular_core.Signal<readonly DropdownItemComponent[]>;
@@ -3387,26 +4453,25 @@ declare class DropdownContentComponent {
3387
4453
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DropdownContentComponent, "tedi-dropdown-content", never, { "dropdownRole": { "alias": "dropdownRole"; "required": false; "isSignal": true; }; }, {}, ["items"], ["*", "li[tedi-dropdown-item]"], true, never>;
3388
4454
  }
3389
4455
 
3390
- type DropdownPosition = `${NgxFloatUiPlacements}`;
3391
- declare class DropdownComponent implements AfterContentChecked, OnDestroy {
4456
+ type DropdownPosition = OverlayPosition;
4457
+ declare class DropdownComponent implements OnDestroy {
3392
4458
  /** Current value of dropdown (used with listbox) */
3393
4459
  readonly value: _angular_core.ModelSignal<string | undefined>;
3394
4460
  /**
3395
4461
  * The position of the dropdown relative to the trigger element.
3396
4462
  * @default bottom-start
3397
4463
  */
3398
- readonly position: _angular_core.InputSignal<"left" | "right" | "top" | "bottom" | "auto" | "auto-start" | "auto-end" | "top-start" | "bottom-start" | "left-start" | "right-start" | "top-end" | "bottom-end" | "left-end" | "right-end">;
4464
+ readonly position: _angular_core.InputSignal<OverlayPosition>;
3399
4465
  /**
3400
4466
  * Should position to opposite direction when overflowing screen?
3401
4467
  * @default true
3402
4468
  */
3403
4469
  readonly preventOverflow: _angular_core.InputSignal<boolean>;
3404
4470
  /**
3405
- * Append floating element to given selector.
3406
- * Use 'body' to append at the end of DOM or empty string to append next to trigger element.
3407
- * @default ""
4471
+ * Gap in px between the trigger and the dropdown panel.
4472
+ * @default 4
3408
4473
  */
3409
- readonly appendTo: _angular_core.InputSignal<string>;
4474
+ readonly offset: _angular_core.InputSignal<number>;
3410
4475
  /**
3411
4476
  * Does the dropdown hide when the page scrolls?
3412
4477
  * @default false
@@ -3414,23 +4479,32 @@ declare class DropdownComponent implements AfterContentChecked, OnDestroy {
3414
4479
  readonly hideOnScroll: _angular_core.InputSignal<boolean>;
3415
4480
  readonly dropdownTrigger: _angular_core.Signal<DropdownTriggerDirective>;
3416
4481
  readonly dropdownContent: _angular_core.Signal<DropdownContentComponent>;
3417
- readonly floatUiComponent: _angular_core.Signal<NgxFloatUiContentComponent>;
3418
4482
  private readonly activeIndex;
3419
4483
  readonly containerId: _angular_core.WritableSignal<string>;
3420
- readonly isContentHovered: _angular_core.WritableSignal<boolean>;
3421
- readonly floatUiDisplay: _angular_core.WritableSignal<"inline" | "block">;
3422
- readonly opened: _angular_core.Signal<boolean>;
4484
+ readonly isOpen: _angular_core.WritableSignal<boolean>;
4485
+ readonly triggerWidth: _angular_core.WritableSignal<number | null>;
4486
+ readonly overlayOrigin: _angular_core.Signal<_angular_cdk_overlay.CdkOverlayOrigin>;
4487
+ readonly overlayPositions: _angular_core.Signal<{
4488
+ offsetX: number | undefined;
4489
+ offsetY: number | undefined;
4490
+ originX: "start" | "center" | "end";
4491
+ originY: "top" | "center" | "bottom";
4492
+ overlayX: "start" | "center" | "end";
4493
+ overlayY: "top" | "center" | "bottom";
4494
+ weight?: number;
4495
+ panelClass?: string | string[];
4496
+ }[]>;
4497
+ readonly triggerWidthVar: _angular_core.Signal<string | null>;
3423
4498
  private readonly platformId;
3424
4499
  private readonly document;
3425
4500
  private readonly renderer;
3426
4501
  private scrollListener?;
3427
4502
  constructor();
3428
4503
  ngOnDestroy(): void;
3429
- ngAfterContentChecked(): void;
3430
- showDropdown(): void;
4504
+ showDropdown(initialFocus?: "selected" | "first" | "last"): void;
3431
4505
  hideDropdown(): void;
3432
4506
  toggleDropdown(): void;
3433
- handleOutsideClick: (event: Event) => void;
4507
+ onOutsideClick(): void;
3434
4508
  handleFocusOut: (event: FocusEvent) => void;
3435
4509
  tabOutOfDropdown(shiftKey: boolean): void;
3436
4510
  focusFirstItem(): void;
@@ -3446,7 +4520,7 @@ declare class DropdownComponent implements AfterContentChecked, OnDestroy {
3446
4520
  private getNextEnabledIndex;
3447
4521
  private getPrevEnabledIndex;
3448
4522
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DropdownComponent, never>;
3449
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DropdownComponent, "tedi-dropdown", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; "preventOverflow": { "alias": "preventOverflow"; "required": false; "isSignal": true; }; "appendTo": { "alias": "appendTo"; "required": false; "isSignal": true; }; "hideOnScroll": { "alias": "hideOnScroll"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, ["dropdownTrigger", "dropdownContent"], ["[tedi-dropdown-trigger]", "tedi-dropdown-content"], true, never>;
4523
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DropdownComponent, "tedi-dropdown", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; "preventOverflow": { "alias": "preventOverflow"; "required": false; "isSignal": true; }; "offset": { "alias": "offset"; "required": false; "isSignal": true; }; "hideOnScroll": { "alias": "hideOnScroll"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, ["dropdownTrigger", "dropdownContent"], ["[tedi-dropdown-trigger]", "tedi-dropdown-content"], true, never>;
3450
4524
  }
3451
4525
 
3452
4526
  type FilterVariant = "primary" | "secondary";
@@ -3537,12 +4611,6 @@ declare class FilterComponent implements ControlValueAccessor {
3537
4611
  * @default false
3538
4612
  */
3539
4613
  readonly preserveLabel: _angular_core.InputSignal<boolean>;
3540
- /**
3541
- * Append dropdown to given selector.
3542
- * Use 'body' to append at the end of DOM or empty string to append next to trigger.
3543
- * @default ""
3544
- */
3545
- readonly appendTo: _angular_core.InputSignal<string>;
3546
4614
  /**
3547
4615
  * Whether the filter is disabled. Also set automatically when used with a disabled FormControl
3548
4616
  * or when nested in a disabled FilterGroup.
@@ -3614,7 +4682,7 @@ declare class FilterComponent implements ControlValueAccessor {
3614
4682
  private setActiveOption;
3615
4683
  private getTabStops;
3616
4684
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FilterComponent, never>;
3617
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<FilterComponent, "tedi-filter", never, { "text": { "alias": "text"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "allowMultiple": { "alias": "allowMultiple"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "showSearch": { "alias": "showSearch"; "required": false; "isSignal": true; }; "searchClearable": { "alias": "searchClearable"; "required": false; "isSignal": true; }; "clearSearchOnSelect": { "alias": "clearSearchOnSelect"; "required": false; "isSignal": true; }; "showSelectAll": { "alias": "showSelectAll"; "required": false; "isSignal": true; }; "showClear": { "alias": "showClear"; "required": false; "isSignal": true; }; "selectAllLabel": { "alias": "selectAllLabel"; "required": false; "isSignal": true; }; "clearLabel": { "alias": "clearLabel"; "required": false; "isSignal": true; }; "preserveLabel": { "alias": "preserveLabel"; "required": false; "isSignal": true; }; "appendTo": { "alias": "appendTo"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "selected": "selectedChange"; "value": "valueChange"; "cleared": "cleared"; }, ["customContent", "filterPrepend"], ["[tediFilterContent]", "[tediFilterPrepend]", "[tediFilterAppend]"], true, never>;
4685
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FilterComponent, "tedi-filter", never, { "text": { "alias": "text"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "allowMultiple": { "alias": "allowMultiple"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "showSearch": { "alias": "showSearch"; "required": false; "isSignal": true; }; "searchClearable": { "alias": "searchClearable"; "required": false; "isSignal": true; }; "clearSearchOnSelect": { "alias": "clearSearchOnSelect"; "required": false; "isSignal": true; }; "showSelectAll": { "alias": "showSelectAll"; "required": false; "isSignal": true; }; "showClear": { "alias": "showClear"; "required": false; "isSignal": true; }; "selectAllLabel": { "alias": "selectAllLabel"; "required": false; "isSignal": true; }; "clearLabel": { "alias": "clearLabel"; "required": false; "isSignal": true; }; "preserveLabel": { "alias": "preserveLabel"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "selected": "selectedChange"; "value": "valueChange"; "cleared": "cleared"; }, ["customContent", "filterPrepend"], ["[tediFilterContent]", "[tediFilterPrepend]", "[tediFilterAppend]"], true, never>;
3618
4686
  }
3619
4687
 
3620
4688
  declare class FilterContentDirective {
@@ -3930,6 +4998,402 @@ declare class RadioCardGroupComponent {
3930
4998
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<RadioCardGroupComponent, "tedi-radio-card-group", never, { "grouped": { "alias": "grouped"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
3931
4999
  }
3932
5000
 
5001
+ type EllipsisPosition = "start" | "end";
5002
+ declare class EllipsisComponent {
5003
+ /** Maximum number of lines before truncating. End (multi-line) only. */
5004
+ readonly lineClamp: _angular_core.InputSignal<number>;
5005
+ /** Whether truncated content shows a hover/focus tooltip with full text. */
5006
+ readonly tooltip: _angular_core.InputSignal<boolean>;
5007
+ /** Ellipsis position. 'start' = leading, single-line. 'end' = trailing, multi-line. */
5008
+ readonly position: _angular_core.InputSignal<EllipsisPosition>;
5009
+ readonly content: _angular_core.Signal<ElementRef<HTMLElement> | undefined>;
5010
+ readonly isEllipsed: _angular_core.WritableSignal<boolean>;
5011
+ readonly fullText: _angular_core.WritableSignal<string>;
5012
+ constructor();
5013
+ readonly contentClasses: _angular_core.Signal<string>;
5014
+ readonly clampStyle: _angular_core.Signal<string | null>;
5015
+ private updateEllipsedState;
5016
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EllipsisComponent, never>;
5017
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EllipsisComponent, "tedi-ellipsis", never, { "lineClamp": { "alias": "lineClamp"; "required": false; "isSignal": true; }; "tooltip": { "alias": "tooltip"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
5018
+ }
5019
+
5020
+ type TagType = "primary" | "secondary" | "danger";
5021
+ type TagEllipsis = "start" | "end" | false;
5022
+ declare class TagComponent {
5023
+ readonly idGenerator: _IdGenerator;
5024
+ readonly uniqueId: string;
5025
+ /**
5026
+ * Whether the tag is in loading state.
5027
+ * When true, a spinner will be displayed inside the tag.
5028
+ * @default false
5029
+ */
5030
+ loading: _angular_core.InputSignal<boolean>;
5031
+ /**
5032
+ * Whether the tag can be closed.
5033
+ * When true, a close button will be displayed that emits the 'closed' event when clicked.
5034
+ * @default false
5035
+ */
5036
+ closable: _angular_core.InputSignal<boolean>;
5037
+ /**
5038
+ * The visual style of the tag.
5039
+ * Possible values: 'primary', 'secondary', 'danger'
5040
+ * @default "primary"
5041
+ */
5042
+ type: _angular_core.InputSignal<TagType>;
5043
+ /**
5044
+ * Which end the label truncates from when it doesn't fit. `false` (default)
5045
+ * never truncates — the label wraps and the tag keeps its full width. `end`
5046
+ * shows an ellipsis at the end (`Long label…`); `start` shows it at the start
5047
+ * (`…label`), which keeps the most significant part of values like dates
5048
+ * visible. Truncation only kicks in when the tag is width-constrained, and the
5049
+ * full label is revealed in a tooltip on hover/focus.
5050
+ * @default false
5051
+ */
5052
+ ellipsis: _angular_core.InputSignal<TagEllipsis>;
5053
+ /**
5054
+ * Event emitted when the close button is clicked.
5055
+ */
5056
+ closed: _angular_core.OutputEmitterRef<Event>;
5057
+ classes: _angular_core.Signal<string>;
5058
+ ellipsisPosition: _angular_core.Signal<EllipsisPosition>;
5059
+ handleClose(event: Event): void;
5060
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TagComponent, never>;
5061
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TagComponent, "tedi-tag", never, { "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "closable": { "alias": "closable"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "ellipsis": { "alias": "ellipsis"; "required": false; "isSignal": true; }; }, { "closed": "closed"; }, never, ["*"], true, never>;
5062
+ }
5063
+
5064
+ interface DateInputTag {
5065
+ id: string;
5066
+ label: string;
5067
+ }
5068
+ declare class DateInputComponent implements AfterViewChecked {
5069
+ readonly inputId: _angular_core.InputSignal<string>;
5070
+ readonly value: _angular_core.InputSignal<string>;
5071
+ readonly tags: _angular_core.InputSignal<readonly DateInputTag[]>;
5072
+ readonly mode: _angular_core.InputSignal<DateFieldMode>;
5073
+ /**
5074
+ * Multiple mode: when `true` (default) the tags wrap to multiple rows and the
5075
+ * field grows in height. When `false` the tags stay on a single row and the
5076
+ * overflow collapses into a "+N" counter tag.
5077
+ */
5078
+ readonly multiRow: _angular_core.InputSignal<boolean>;
5079
+ /** Which end the tag labels truncate from when they don't fit (`false` = no truncation). */
5080
+ readonly ellipsis: _angular_core.InputSignal<TagEllipsis>;
5081
+ /** Whether the tags show a remove (close) button. */
5082
+ readonly removable: _angular_core.InputSignal<boolean>;
5083
+ readonly placeholder: _angular_core.InputSignal<string>;
5084
+ readonly disabled: _angular_core.InputSignal<boolean>;
5085
+ readonly readOnly: _angular_core.InputSignal<boolean>;
5086
+ readonly required: _angular_core.InputSignal<boolean>;
5087
+ readonly iconActive: _angular_core.InputSignal<boolean>;
5088
+ readonly iconDisabled: _angular_core.InputSignal<boolean>;
5089
+ readonly useNativePicker: _angular_core.InputSignal<boolean>;
5090
+ readonly nativeIsoValue: _angular_core.InputSignal<string>;
5091
+ readonly clearable: _angular_core.InputSignal<boolean>;
5092
+ readonly inputChange: _angular_core.OutputEmitterRef<string>;
5093
+ readonly iconClick: _angular_core.OutputEmitterRef<void>;
5094
+ readonly tagRemove: _angular_core.OutputEmitterRef<string>;
5095
+ readonly clear: _angular_core.OutputEmitterRef<void>;
5096
+ private readonly translationService;
5097
+ private readonly ngZone;
5098
+ private readonly inputElement;
5099
+ private readonly fieldElement;
5100
+ private readonly tagElements;
5101
+ /** Number of tags that fit on a single row; `null` until measured. */
5102
+ readonly visibleTagsCount: _angular_core.WritableSignal<number | null>;
5103
+ constructor();
5104
+ ngAfterViewChecked(): void;
5105
+ onResize(): void;
5106
+ readonly hasTags: _angular_core.Signal<boolean>;
5107
+ readonly visibleTags: _angular_core.Signal<readonly DateInputTag[]>;
5108
+ readonly hiddenTagsCount: _angular_core.Signal<number>;
5109
+ readonly inputType: _angular_core.Signal<"date" | "text">;
5110
+ readonly inputValue: _angular_core.Signal<string>;
5111
+ readonly showClear: _angular_core.Signal<boolean>;
5112
+ readonly iconAriaLabel: _angular_core.Signal<string>;
5113
+ readonly clearAriaLabel: _angular_core.Signal<string>;
5114
+ handleInput(event: Event): void;
5115
+ handleIconClick(): void;
5116
+ handleTagRemove(id: string): void;
5117
+ handleClear(): void;
5118
+ private calculateVisibleTags;
5119
+ private getAvailableTagWidth;
5120
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DateInputComponent, never>;
5121
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DateInputComponent, "tedi-date-input", never, { "inputId": { "alias": "inputId"; "required": true; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "tags": { "alias": "tags"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "multiRow": { "alias": "multiRow"; "required": false; "isSignal": true; }; "ellipsis": { "alias": "ellipsis"; "required": false; "isSignal": true; }; "removable": { "alias": "removable"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readOnly": { "alias": "readOnly"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "iconActive": { "alias": "iconActive"; "required": false; "isSignal": true; }; "iconDisabled": { "alias": "iconDisabled"; "required": false; "isSignal": true; }; "useNativePicker": { "alias": "useNativePicker"; "required": false; "isSignal": true; }; "nativeIsoValue": { "alias": "nativeIsoValue"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; }, { "inputChange": "inputChange"; "iconClick": "iconClick"; "tagRemove": "tagRemove"; "clear": "clear"; }, never, never, true, never>;
5122
+ }
5123
+
5124
+ /**
5125
+ * Interface implemented by controls that can be used inside `tedi-form-field`.
5126
+ * Allows the form field container to interact with the underlying control.
5127
+ */
5128
+ interface FormFieldControl<T = unknown> {
5129
+ /**
5130
+ * Current value of the control.
5131
+ */
5132
+ value: Signal<T>;
5133
+ /**
5134
+ * Whether the control is disabled.
5135
+ */
5136
+ disabled: Signal<boolean>;
5137
+ /** Reactive invalid state (driven by FormField) */
5138
+ invalid: Signal<boolean>;
5139
+ /** Called by FormField to update invalid state */
5140
+ setInvalidState(isInvalid: boolean): void;
5141
+ /**
5142
+ * Optional method used by the form field clear button.
5143
+ * If implemented, the form field can trigger clearing the value.
5144
+ */
5145
+ clearField?(): void;
5146
+ }
5147
+ /**
5148
+ * Injection token used by `tedi-form-field` to obtain
5149
+ * the associated control instance.
5150
+ */
5151
+ declare const TEDI_FORM_FIELD_CONTROL: InjectionToken<FormFieldControl<unknown>>;
5152
+
5153
+ type DateFieldValue = Date | Date[] | DateRange | null;
5154
+ type DateFieldFormatter = (value: DateFieldValue) => string;
5155
+ type DateFieldParser = (value: string) => DateFieldValue | undefined;
5156
+ type DayAvailabilityInput = Date[] | ((d: Date) => boolean) | undefined;
5157
+ type MonthPredicate = (month: Date) => boolean;
5158
+ type YearPredicate = (year: Date) => boolean;
5159
+ type DateFieldCalendarTrigger = "input" | "button";
5160
+ type DateFieldModalInput = boolean | "sm" | "md" | "lg" | "xl";
5161
+ type DateFieldUseNativePicker = boolean | "sm" | "md" | "lg" | "xl";
5162
+ type DateFieldSize = "default" | "small";
5163
+ declare class DateFieldComponent implements ControlValueAccessor, FormFieldControl<DateFieldValue> {
5164
+ /**
5165
+ * Unique ID for label association and accessibility. Bind the sibling
5166
+ * `<label tedi-label [for]>` to the same value.
5167
+ */
5168
+ readonly inputId: _angular_core.InputSignal<string>;
5169
+ /**
5170
+ * The selected value (two-way / `ControlValueAccessor`). Shape follows `mode`:
5171
+ * `single` → `Date | null`, `multiple` → `Date[]`, `range` → `{ from, to }`.
5172
+ */
5173
+ readonly value: _angular_core.ModelSignal<DateFieldValue>;
5174
+ /**
5175
+ * Selection mode. `single` selects one date, `multiple` toggles dates in an
5176
+ * array (rendered as tags), `range` builds a `{ from, to }` range across two
5177
+ * clicks.
5178
+ */
5179
+ readonly mode: _angular_core.InputSignal<DateFieldMode>;
5180
+ /**
5181
+ * `multiple` mode tag layout. `true` (default) wraps tags across rows and
5182
+ * grows the field height; `false` keeps a single row and collapses overflow
5183
+ * into a "+N" counter.
5184
+ */
5185
+ readonly multiRow: _angular_core.InputSignal<boolean>;
5186
+ /**
5187
+ * Which end the `multiple`-mode tags truncate from when a label doesn't fit.
5188
+ * `false` (default) never truncates; `end` → `05.06…`; `start` → `…06.2026`
5189
+ * (keeps the year visible).
5190
+ */
5191
+ readonly tagEllipsis: _angular_core.InputSignal<TagEllipsis>;
5192
+ /**
5193
+ * Whether `multiple`-mode tags show a remove button. `true` (default) lets
5194
+ * users remove a selected date by closing its tag; `false` renders them as
5195
+ * read-only chips.
5196
+ */
5197
+ readonly isTagRemovable: _angular_core.InputSignal<boolean>;
5198
+ /** Placeholder rendered in the input when there is no value. */
5199
+ readonly placeholder: _angular_core.InputSignal<string>;
5200
+ /**
5201
+ * Disables specific days via matchers (does not disable the whole field).
5202
+ * Accepts a `Date`, `Date[]`, `{ before }`, `{ after }`, `{ from, to? }`,
5203
+ * `{ dayOfWeek: number[] }`, or a `(date) => boolean` predicate (single or
5204
+ * array). Named `disabledMatchers` (not `disabled`) so it doesn't clash with
5205
+ * `FormControlDirective`'s boolean `disabled` when used with `[formControl]`.
5206
+ */
5207
+ readonly disabledMatchers: _angular_core.InputSignal<Matcher | Matcher[] | undefined>;
5208
+ /** Disables the field entirely — text input, icon button, and calendar. */
5209
+ readonly inputDisabled: _angular_core.InputSignal<boolean>;
5210
+ /**
5211
+ * Blocks typing into the input but leaves the calendar interactive — useful
5212
+ * for guided picking.
5213
+ */
5214
+ readonly readOnly: _angular_core.InputSignal<boolean>;
5215
+ /**
5216
+ * Marks the input as required (sets the native `required` attribute). In
5217
+ * `multiple` mode it also prevents clearing the last selected date. The
5218
+ * asterisk indicator lives on the sibling `<label tedi-label [required]>` —
5219
+ * bind it there too, since DateField owns no label.
5220
+ */
5221
+ readonly required: _angular_core.InputSignal<boolean>;
5222
+ /** Field size — matches the surrounding `tedi-form-field`. */
5223
+ readonly size: _angular_core.InputSignal<DateFieldSize>;
5224
+ /** Disables all dates before this date (inclusive boundary stays enabled). */
5225
+ readonly minDate: _angular_core.InputSignal<Date | undefined>;
5226
+ /** Disables all dates after this date (inclusive boundary stays enabled). */
5227
+ readonly maxDate: _angular_core.InputSignal<Date | undefined>;
5228
+ /** Disable all dates before today. */
5229
+ readonly disablePast: _angular_core.InputSignal<boolean>;
5230
+ /** Disable all dates after today. */
5231
+ readonly disableFuture: _angular_core.InputSignal<boolean>;
5232
+ /**
5233
+ * Predicate `(month) => boolean` returning `true` to disable a whole month in
5234
+ * the calendar's month navigation/grid. Leave `undefined` to disable nothing.
5235
+ */
5236
+ readonly shouldDisableMonth: _angular_core.InputSignal<MonthPredicate | undefined>;
5237
+ /**
5238
+ * Predicate `(year) => boolean` returning `true` to disable a whole year in
5239
+ * the calendar's year navigation/grid. Leave `undefined` to disable nothing.
5240
+ */
5241
+ readonly shouldDisableYear: _angular_core.InputSignal<YearPredicate | undefined>;
5242
+ /**
5243
+ * Whitelist of selectable days — an explicit `Date[]` or a predicate
5244
+ * `(date) => boolean`. Every other day is disabled.
5245
+ */
5246
+ readonly availableDays: _angular_core.InputSignal<DayAvailabilityInput>;
5247
+ /**
5248
+ * Blacklist of unavailable days — a `Date[]` or a predicate `(date) => boolean`.
5249
+ * Takes precedence over `availableDays`.
5250
+ */
5251
+ readonly unavailableDays: _angular_core.InputSignal<DayAvailabilityInput>;
5252
+ /**
5253
+ * Lowest level the user can commit to. `days` shows the day grid as the final
5254
+ * step; `months` and `years` commit at that level instead.
5255
+ */
5256
+ readonly selectionLevel: _angular_core.InputSignal<CalendarView>;
5257
+ /**
5258
+ * How the calendar header exposes month/year picking. `dropdown` shows two
5259
+ * dropdowns; `grid` drills into a month/year grid when the header label is
5260
+ * clicked.
5261
+ */
5262
+ readonly monthYearSelectType: _angular_core.InputSignal<"dropdown" | "grid">;
5263
+ /**
5264
+ * Month the calendar opens on when there is no value. Ignored once a value is
5265
+ * set (the calendar anchors to the selected date).
5266
+ */
5267
+ readonly initialMonth: _angular_core.InputSignal<Date | undefined>;
5268
+ /**
5269
+ * BCP-47 locale for weekday/month names, the first day of the week, and the
5270
+ * default `formatDate`/`parseDate` behaviour.
5271
+ */
5272
+ readonly localeCode: _angular_core.InputSignal<string>;
5273
+ /**
5274
+ * Whether to close the picker after a selection. Defaults to `true` in
5275
+ * `single` mode and `false` in `multiple`/`range` when left `undefined`.
5276
+ */
5277
+ readonly closeOnSelect: _angular_core.InputSignal<boolean | undefined>;
5278
+ /**
5279
+ * Render the trailing/leading days from the adjacent month inside the current
5280
+ * month's grid.
5281
+ */
5282
+ readonly showOutsideDays: _angular_core.InputSignal<boolean>;
5283
+ /** Render an ISO week-number column on the left of the day grid. */
5284
+ readonly showWeekNumbers: _angular_core.InputSignal<boolean>;
5285
+ /**
5286
+ * Number of month grids shown side by side. Accepts a `BreakpointInput<number>`:
5287
+ * a plain number (e.g. `2`) applies at every breakpoint; pass a per-breakpoint
5288
+ * object (e.g. `{ xs: 1, lg: 2 }`) to narrow it on small screens.
5289
+ */
5290
+ readonly numberOfMonths: _angular_core.InputSignalWithTransform<BreakpointObject<number>, BreakpointInput<number>>;
5291
+ /**
5292
+ * Enables the calendar picker UI. When resolved to `false`, hides the icon
5293
+ * button and disables the popover/modal — the user can only type a date.
5294
+ * Accepts a `BreakpointInput<boolean>` for per-breakpoint behaviour.
5295
+ */
5296
+ readonly enableCalendar: _angular_core.InputSignalWithTransform<BreakpointObject<boolean>, BreakpointInput<boolean>>;
5297
+ /**
5298
+ * What opens the calendar. `button` opens it from the icon button; `input`
5299
+ * also opens it when the text input is clicked (and blocks typing). Accepts a
5300
+ * `BreakpointInput` for per-breakpoint behaviour.
5301
+ */
5302
+ readonly calendarTrigger: _angular_core.InputSignalWithTransform<BreakpointObject<DateFieldCalendarTrigger>, BreakpointInput<DateFieldCalendarTrigger>>;
5303
+ /**
5304
+ * Use the OS native date picker instead of the custom popover (single mode only).
5305
+ * `true` always, `false` never, breakpoint name → native below that breakpoint
5306
+ * (custom popover from that breakpoint up).
5307
+ */
5308
+ readonly useNativePicker: _angular_core.InputSignal<DateFieldUseNativePicker>;
5309
+ /** Open the calendar in a modal: `true` always, `false` never, breakpoint name → modal below that breakpoint. */
5310
+ readonly modal: _angular_core.InputSignal<DateFieldModalInput>;
5311
+ /** Make the modal fullscreen: `true` always, `false` never, breakpoint name → fullscreen below that breakpoint. Only applies when the calendar actually opens as a modal. */
5312
+ readonly fullscreen: _angular_core.InputSignal<_tedi_design_system_angular_tedi.BreakpointFlag>;
5313
+ /**
5314
+ * Custom formatter for the input's display string. Overrides the locale-aware
5315
+ * default. Receives the `DateFieldValue` and returns a string.
5316
+ */
5317
+ readonly formatDate: _angular_core.InputSignal<DateFieldFormatter | undefined>;
5318
+ /**
5319
+ * Custom parser for turning typed input into a value. Overrides the
5320
+ * locale-aware default. Receives the raw string and returns a `DateFieldValue`,
5321
+ * or `undefined` when the input can't be parsed.
5322
+ */
5323
+ readonly parseDate: _angular_core.InputSignal<DateFieldParser | undefined>;
5324
+ /** Emitted whenever the picker (popover/modal) open state changes. */
5325
+ readonly openChange: _angular_core.OutputEmitterRef<boolean>;
5326
+ private readonly breakpointService;
5327
+ private readonly modalService;
5328
+ private readonly hostEl;
5329
+ readonly calendar: _angular_core.Signal<CalendarComponent | undefined>;
5330
+ readonly dateInput: _angular_core.Signal<DateInputComponent>;
5331
+ readonly currentMonth: _angular_core.WritableSignal<Date>;
5332
+ readonly overlayOpen: _angular_core.WritableSignal<boolean>;
5333
+ private readonly openedBy;
5334
+ readonly overlayPositions: _angular_core.Signal<ConnectedPosition[]>;
5335
+ private readonly cvaDisabled;
5336
+ private readonly formInvalid;
5337
+ private modalRef;
5338
+ private onChange;
5339
+ private onTouched;
5340
+ readonly fieldDisabled: _angular_core.Signal<boolean>;
5341
+ readonly disabled: _angular_core.Signal<boolean>;
5342
+ readonly invalid: _angular_core.Signal<boolean>;
5343
+ readonly resolvedDisabledMatchers: _angular_core.Signal<Matcher[]>;
5344
+ readonly useNativePickerResolved: _angular_core.Signal<boolean>;
5345
+ readonly useNativePickerEffective: _angular_core.Signal<boolean>;
5346
+ readonly numberOfMonthsResolved: _angular_core.Signal<number>;
5347
+ readonly enableCalendarResolved: _angular_core.Signal<boolean>;
5348
+ readonly calendarTriggerResolved: _angular_core.Signal<DateFieldCalendarTrigger>;
5349
+ readonly modalEnabled: _angular_core.Signal<boolean>;
5350
+ readonly closeOnSelectEffective: _angular_core.Signal<boolean>;
5351
+ readonly showCalendar: _angular_core.Signal<boolean>;
5352
+ readonly useModal: _angular_core.Signal<boolean>;
5353
+ readonly usePopover: _angular_core.Signal<boolean>;
5354
+ readonly nativeIsoValue: _angular_core.Signal<string>;
5355
+ readonly effectivePlaceholder: _angular_core.Signal<string>;
5356
+ readonly displayValue: _angular_core.Signal<string>;
5357
+ readonly tagsForMultipleMode: _angular_core.Signal<DateInputTag[]>;
5358
+ readonly canClear: _angular_core.Signal<boolean>;
5359
+ readonly inputIsTrigger: _angular_core.Signal<boolean>;
5360
+ private initialOpenEmit;
5361
+ constructor();
5362
+ writeValue(value: DateFieldValue): void;
5363
+ registerOnChange(fn: (value: DateFieldValue) => void): void;
5364
+ registerOnTouched(fn: () => void): void;
5365
+ setDisabledState(isDisabled: boolean): void;
5366
+ setInvalidState(isInvalid: boolean): void;
5367
+ clearField(): void;
5368
+ handleClear(): void;
5369
+ handleIconClick(): void;
5370
+ private togglePicker;
5371
+ handleInputChange(value: string): void;
5372
+ handleTagRemove(id: string): void;
5373
+ handleInputClick(event: Event): void;
5374
+ handleCalendarSelect(): void;
5375
+ handleCurrentMonthChange(month: Date): void;
5376
+ closeOverlay(): void;
5377
+ handleOverlayOutsideClick(event: MouseEvent): void;
5378
+ handleOverlayAttached(): void;
5379
+ handleOverlayKeydown(event: KeyboardEvent): void;
5380
+ private focusIconButton;
5381
+ private openNativePicker;
5382
+ private openModal;
5383
+ private handleNativeInputChange;
5384
+ private handleSingleParseInput;
5385
+ private parsedValueIsDisabled;
5386
+ private commitValue;
5387
+ private defaultFormat;
5388
+ private deriveAnchor;
5389
+ private resolveBreakpointInput;
5390
+ private startOfToday;
5391
+ private toIsoDate;
5392
+ private queryNativeInput;
5393
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DateFieldComponent, never>;
5394
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DateFieldComponent, "tedi-date-field", never, { "inputId": { "alias": "inputId"; "required": true; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "multiRow": { "alias": "multiRow"; "required": false; "isSignal": true; }; "tagEllipsis": { "alias": "tagEllipsis"; "required": false; "isSignal": true; }; "isTagRemovable": { "alias": "isTagRemovable"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabledMatchers": { "alias": "disabledMatchers"; "required": false; "isSignal": true; }; "inputDisabled": { "alias": "inputDisabled"; "required": false; "isSignal": true; }; "readOnly": { "alias": "readOnly"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "minDate": { "alias": "minDate"; "required": false; "isSignal": true; }; "maxDate": { "alias": "maxDate"; "required": false; "isSignal": true; }; "disablePast": { "alias": "disablePast"; "required": false; "isSignal": true; }; "disableFuture": { "alias": "disableFuture"; "required": false; "isSignal": true; }; "shouldDisableMonth": { "alias": "shouldDisableMonth"; "required": false; "isSignal": true; }; "shouldDisableYear": { "alias": "shouldDisableYear"; "required": false; "isSignal": true; }; "availableDays": { "alias": "availableDays"; "required": false; "isSignal": true; }; "unavailableDays": { "alias": "unavailableDays"; "required": false; "isSignal": true; }; "selectionLevel": { "alias": "selectionLevel"; "required": false; "isSignal": true; }; "monthYearSelectType": { "alias": "monthYearSelectType"; "required": false; "isSignal": true; }; "initialMonth": { "alias": "initialMonth"; "required": false; "isSignal": true; }; "localeCode": { "alias": "localeCode"; "required": false; "isSignal": true; }; "closeOnSelect": { "alias": "closeOnSelect"; "required": false; "isSignal": true; }; "showOutsideDays": { "alias": "showOutsideDays"; "required": false; "isSignal": true; }; "showWeekNumbers": { "alias": "showWeekNumbers"; "required": false; "isSignal": true; }; "numberOfMonths": { "alias": "numberOfMonths"; "required": false; "isSignal": true; }; "enableCalendar": { "alias": "enableCalendar"; "required": false; "isSignal": true; }; "calendarTrigger": { "alias": "calendarTrigger"; "required": false; "isSignal": true; }; "useNativePicker": { "alias": "useNativePicker"; "required": false; "isSignal": true; }; "modal": { "alias": "modal"; "required": false; "isSignal": true; }; "fullscreen": { "alias": "fullscreen"; "required": false; "isSignal": true; }; "formatDate": { "alias": "formatDate"; "required": false; "isSignal": true; }; "parseDate": { "alias": "parseDate"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "openChange": "openChange"; }, never, ["[tediCalendarFooter]"], true, never>;
5395
+ }
5396
+
3933
5397
  declare class DatePickerCalendarGridComponent {
3934
5398
  private readonly gridElement;
3935
5399
  /** Grid element unique ID for ARIA */
@@ -3994,8 +5458,20 @@ declare class DatePickerComponent implements OnInit, ControlValueAccessor {
3994
5458
  readonly selected: _angular_core.ModelSignal<Date | null>;
3995
5459
  /** Currently shown month */
3996
5460
  readonly month: _angular_core.ModelSignal<Date>;
3997
- /** Disabled dates that cannot be selected. */
5461
+ /**
5462
+ * Disabled dates that cannot be selected.
5463
+ *
5464
+ * @deprecated Use `disabledMatchers` instead. This input shares the public
5465
+ * binding name `disabled` with `FormControlDirective`, so binding `[disabled]`
5466
+ * on a date-picker that also uses `[formControl]` raises a template type error
5467
+ * (`Type 'DatePickerMatcher[]' is not assignable to type 'boolean'`).
5468
+ */
3998
5469
  readonly disabled: _angular_core.InputSignal<DatePickerMatcher | DatePickerMatcher[] | null>;
5470
+ /**
5471
+ * Disabled dates that cannot be selected (`Date`, `Date[]`, `{ before }`,
5472
+ * `{ after }`, `{ from, to? }`, or a `(date) => boolean` predicate).
5473
+ */
5474
+ readonly disabledMatchers: _angular_core.InputSignal<DatePickerMatcher | DatePickerMatcher[] | null>;
3999
5475
  /** Shows or hides the calendar navigation controls (previous/next month buttons). */
4000
5476
  readonly showNavigation: _angular_core.InputSignal<boolean>;
4001
5477
  /** Month selector mode: none | label | grid | dropdown */
@@ -4095,7 +5571,7 @@ declare class DatePickerComponent implements OnInit, ControlValueAccessor {
4095
5571
  */
4096
5572
  private findNextEnabledDate;
4097
5573
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DatePickerComponent, never>;
4098
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DatePickerComponent, "tedi-date-picker", never, { "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "month": { "alias": "month"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "showNavigation": { "alias": "showNavigation"; "required": false; "isSignal": true; }; "monthMode": { "alias": "monthMode"; "required": false; "isSignal": true; }; "yearMode": { "alias": "yearMode"; "required": false; "isSignal": true; }; "startYear": { "alias": "startYear"; "required": false; "isSignal": true; }; "endYear": { "alias": "endYear"; "required": false; "isSignal": true; }; "inputId": { "alias": "inputId"; "required": false; "isSignal": true; }; "inputPlaceholder": { "alias": "inputPlaceholder"; "required": false; "isSignal": true; }; "inputState": { "alias": "inputState"; "required": false; "isSignal": true; }; "inputSize": { "alias": "inputSize"; "required": false; "isSignal": true; }; "inputDisabled": { "alias": "inputDisabled"; "required": false; "isSignal": true; }; "allowManualInput": { "alias": "allowManualInput"; "required": false; "isSignal": true; }; "showWeekNumbers": { "alias": "showWeekNumbers"; "required": false; "isSignal": true; }; "closeOnSelect": { "alias": "closeOnSelect"; "required": false; "isSignal": true; }; }, { "selected": "selectedChange"; "month": "monthChange"; }, never, never, true, never>;
5574
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DatePickerComponent, "tedi-date-picker", never, { "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "month": { "alias": "month"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "disabledMatchers": { "alias": "disabledMatchers"; "required": false; "isSignal": true; }; "showNavigation": { "alias": "showNavigation"; "required": false; "isSignal": true; }; "monthMode": { "alias": "monthMode"; "required": false; "isSignal": true; }; "yearMode": { "alias": "yearMode"; "required": false; "isSignal": true; }; "startYear": { "alias": "startYear"; "required": false; "isSignal": true; }; "endYear": { "alias": "endYear"; "required": false; "isSignal": true; }; "inputId": { "alias": "inputId"; "required": false; "isSignal": true; }; "inputPlaceholder": { "alias": "inputPlaceholder"; "required": false; "isSignal": true; }; "inputState": { "alias": "inputState"; "required": false; "isSignal": true; }; "inputSize": { "alias": "inputSize"; "required": false; "isSignal": true; }; "inputDisabled": { "alias": "inputDisabled"; "required": false; "isSignal": true; }; "allowManualInput": { "alias": "allowManualInput"; "required": false; "isSignal": true; }; "showWeekNumbers": { "alias": "showWeekNumbers"; "required": false; "isSignal": true; }; "closeOnSelect": { "alias": "closeOnSelect"; "required": false; "isSignal": true; }; }, { "selected": "selectedChange"; "month": "monthChange"; }, never, never, true, never>;
4099
5575
  }
4100
5576
 
4101
5577
  type FeedbackTextType = "hint" | "valid" | "error";
@@ -4297,35 +5773,6 @@ declare class SelectValueTemplateDirective<T = unknown> {
4297
5773
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<SelectValueTemplateDirective<any>, "[tediSelectValue]", never, {}, {}, never, never, true, never>;
4298
5774
  }
4299
5775
 
4300
- /**
4301
- * Interface implemented by controls that can be used inside `tedi-form-field`.
4302
- * Allows the form field container to interact with the underlying control.
4303
- */
4304
- interface FormFieldControl<T = unknown> {
4305
- /**
4306
- * Current value of the control.
4307
- */
4308
- value: Signal<T>;
4309
- /**
4310
- * Whether the control is disabled.
4311
- */
4312
- disabled: Signal<boolean>;
4313
- /** Reactive invalid state (driven by FormField) */
4314
- invalid: Signal<boolean>;
4315
- /** Called by FormField to update invalid state */
4316
- setInvalidState(isInvalid: boolean): void;
4317
- /**
4318
- * Optional method used by the form field clear button.
4319
- * If implemented, the form field can trigger clearing the value.
4320
- */
4321
- clearField?(): void;
4322
- }
4323
- /**
4324
- * Injection token used by `tedi-form-field` to obtain
4325
- * the associated control instance.
4326
- */
4327
- declare const TEDI_FORM_FIELD_CONTROL: InjectionToken<FormFieldControl<unknown>>;
4328
-
4329
5776
  type InputSize = "small" | "large" | "default";
4330
5777
  type InputState = "valid" | "error" | "default";
4331
5778
  type ValidationState = "invalid" | "valid" | "neutral";
@@ -4379,7 +5826,7 @@ declare class FormFieldComponent implements AfterContentInit {
4379
5826
  }>;
4380
5827
  clear(): void;
4381
5828
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FormFieldComponent, never>;
4382
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<FormFieldComponent, "tedi-form-field", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "inputClass": { "alias": "inputClass"; "required": false; "isSignal": true; }; }, {}, ["control", "ngControl", "feedback"], ["label[tedi-label]", "input[tedi-text-field], tedi-time-field", "tedi-feedback-text"], true, never>;
5829
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FormFieldComponent, "tedi-form-field", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "inputClass": { "alias": "inputClass"; "required": false; "isSignal": true; }; }, {}, ["control", "ngControl", "feedback"], ["label[tedi-label]", "input[tedi-text-field], tedi-time-field, tedi-date-field", "tedi-feedback-text", "*"], true, never>;
4383
5830
  }
4384
5831
 
4385
5832
  type SelectInputSize = Exclude<InputSize, "large">;
@@ -4446,7 +5893,7 @@ declare class SelectComponent<T = unknown> implements AfterContentChecked, After
4446
5893
  * inward instead of overflowing.
4447
5894
  * @default "start"
4448
5895
  */
4449
- dropdownAlign: _angular_core.InputSignal<"end" | "start">;
5896
+ dropdownAlign: _angular_core.InputSignal<"start" | "end">;
4450
5897
  /**
4451
5898
  * Configuration for the feedback text displayed below the select.
4452
5899
  */
@@ -4500,6 +5947,12 @@ declare class SelectComponent<T = unknown> implements AfterContentChecked, After
4500
5947
  * @default false
4501
5948
  */
4502
5949
  multiRow: _angular_core.InputSignal<boolean>;
5950
+ /**
5951
+ * Which end a selected tag's label truncates from when it doesn't fit.
5952
+ * `false` (default) never truncates; `end` → `label…`; `start` → `…label`.
5953
+ * @default false
5954
+ */
5955
+ tagEllipsis: _angular_core.InputSignal<TagEllipsis>;
4503
5956
  /**
4504
5957
  * Function used to compare option values for equality.
4505
5958
  * Used to determine which options are selected.
@@ -4656,7 +6109,7 @@ declare class SelectComponent<T = unknown> implements AfterContentChecked, After
4656
6109
  registerOnTouched(fn: () => void): void;
4657
6110
  setDisabledState(isDisabled: boolean): void;
4658
6111
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SelectComponent<any>, never>;
4659
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SelectComponent<any>, "tedi-select", never, { "inputId": { "alias": "inputId"; "required": true; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "state": { "alias": "state"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "dropdownWidthRef": { "alias": "dropdownWidthRef"; "required": false; "isSignal": true; }; "dropdownAlign": { "alias": "dropdownAlign"; "required": false; "isSignal": true; }; "feedbackText": { "alias": "feedbackText"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "bindLabel": { "alias": "bindLabel"; "required": false; "isSignal": true; }; "bindValue": { "alias": "bindValue"; "required": false; "isSignal": true; }; "allowMultiple": { "alias": "allowMultiple"; "required": false; "isSignal": true; }; "groupBy": { "alias": "groupBy"; "required": false; "isSignal": true; }; "showSelectAll": { "alias": "showSelectAll"; "required": false; "isSignal": true; }; "selectableGroups": { "alias": "selectableGroups"; "required": false; "isSignal": true; }; "isTagRemovable": { "alias": "isTagRemovable"; "required": false; "isSignal": true; }; "multiRow": { "alias": "multiRow"; "required": false; "isSignal": true; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; "disabledKey": { "alias": "disabledKey"; "required": false; "isSignal": true; }; "noOptionsMessage": { "alias": "noOptionsMessage"; "required": false; "isSignal": true; }; "maxDropdownHeight": { "alias": "maxDropdownHeight"; "required": false; "isSignal": true; }; "dropdownType": { "alias": "dropdownType"; "required": false; "isSignal": true; }; "searchable": { "alias": "searchable"; "required": false; "isSignal": true; }; "searchFn": { "alias": "searchFn"; "required": false; "isSignal": true; }; "clearSearchOnSelect": { "alias": "clearSearchOnSelect"; "required": false; "isSignal": true; }; }, { "selectionChange": "selectionChange"; "searchChange": "searchChange"; "opened": "opened"; "closed": "closed"; "cleared": "cleared"; }, ["optionTemplate", "valueTemplate"], never, true, never>;
6112
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SelectComponent<any>, "tedi-select", never, { "inputId": { "alias": "inputId"; "required": true; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "state": { "alias": "state"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "dropdownWidthRef": { "alias": "dropdownWidthRef"; "required": false; "isSignal": true; }; "dropdownAlign": { "alias": "dropdownAlign"; "required": false; "isSignal": true; }; "feedbackText": { "alias": "feedbackText"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "bindLabel": { "alias": "bindLabel"; "required": false; "isSignal": true; }; "bindValue": { "alias": "bindValue"; "required": false; "isSignal": true; }; "allowMultiple": { "alias": "allowMultiple"; "required": false; "isSignal": true; }; "groupBy": { "alias": "groupBy"; "required": false; "isSignal": true; }; "showSelectAll": { "alias": "showSelectAll"; "required": false; "isSignal": true; }; "selectableGroups": { "alias": "selectableGroups"; "required": false; "isSignal": true; }; "isTagRemovable": { "alias": "isTagRemovable"; "required": false; "isSignal": true; }; "multiRow": { "alias": "multiRow"; "required": false; "isSignal": true; }; "tagEllipsis": { "alias": "tagEllipsis"; "required": false; "isSignal": true; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; "disabledKey": { "alias": "disabledKey"; "required": false; "isSignal": true; }; "noOptionsMessage": { "alias": "noOptionsMessage"; "required": false; "isSignal": true; }; "maxDropdownHeight": { "alias": "maxDropdownHeight"; "required": false; "isSignal": true; }; "dropdownType": { "alias": "dropdownType"; "required": false; "isSignal": true; }; "searchable": { "alias": "searchable"; "required": false; "isSignal": true; }; "searchFn": { "alias": "searchFn"; "required": false; "isSignal": true; }; "clearSearchOnSelect": { "alias": "clearSearchOnSelect"; "required": false; "isSignal": true; }; }, { "selectionChange": "selectionChange"; "searchChange": "searchChange"; "opened": "opened"; "closed": "closed"; "cleared": "cleared"; }, ["optionTemplate", "valueTemplate"], never, true, never>;
4660
6113
  }
4661
6114
 
4662
6115
  type ToggleVariant = "primary" | "colored";
@@ -4737,6 +6190,7 @@ declare class TextFieldComponent implements ControlValueAccessor, FormFieldContr
4737
6190
  private formDisabled;
4738
6191
  private onChange;
4739
6192
  private onTouched;
6193
+ constructor();
4740
6194
  private setValue;
4741
6195
  writeValue(value: string | null): void;
4742
6196
  registerOnChange(fn: (value: string) => void): void;
@@ -4952,7 +6406,7 @@ declare class TimeFieldComponent implements ControlValueAccessor, FormFieldContr
4952
6406
  readonly hasPicker: _angular_core.Signal<boolean>;
4953
6407
  readonly hasNativePicker: _angular_core.Signal<boolean>;
4954
6408
  readonly customPickerVariant: _angular_core.Signal<TimePickerVariant>;
4955
- readonly inputType: _angular_core.Signal<"time" | "text">;
6409
+ readonly inputType: _angular_core.Signal<"text" | "time">;
4956
6410
  readonly inputIsTrigger: _angular_core.Signal<boolean>;
4957
6411
  readonly useMobileModal: _angular_core.Signal<boolean>;
4958
6412
  readonly usePopover: _angular_core.Signal<boolean>;
@@ -4983,51 +6437,219 @@ declare class TimeFieldComponent implements ControlValueAccessor, FormFieldContr
4983
6437
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<TimeFieldComponent, "tedi-time-field", never, { "inputId": { "alias": "inputId"; "required": true; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "invalidInput": { "alias": "invalid"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "pickerVariant": { "alias": "pickerVariant"; "required": false; "isSignal": true; }; "useNativePicker": { "alias": "useNativePicker"; "required": false; "isSignal": true; }; "pickerTrigger": { "alias": "pickerTrigger"; "required": false; "isSignal": true; }; "closeOnSelect": { "alias": "closeOnSelect"; "required": false; "isSignal": true; }; "timeSlots": { "alias": "timeSlots"; "required": false; "isSignal": true; }; "columns": { "alias": "columns"; "required": false; "isSignal": true; }; "showSlotIndicator": { "alias": "showSlotIndicator"; "required": false; "isSignal": true; }; "minuteStep": { "alias": "minuteStep"; "required": false; "isSignal": true; }; "modal": { "alias": "modal"; "required": false; "isSignal": true; }; "fullscreen": { "alias": "fullscreen"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
4984
6438
  }
4985
6439
 
4986
- type EmptyStateType = "separate" | "attached" | "inside";
4987
- type EmptyStateSize = "default" | "small";
6440
+ type ProgressBarSize = "default" | "small";
6441
+ type ProgressBarLabelPosition = "top" | "horizontal";
6442
+ type ProgressBarValuePosition = "horizontal" | "bottom";
4988
6443
  /**
4989
- * Communicates that there is nothing to display empty search results, an
4990
- * unpopulated list, a freshly-created workspaceand optionally guides the
4991
- * user toward the next step via action buttons or a link.
4992
- *
4993
- * Description is projected via `<ng-content>`. Actions are projected via
4994
- * `<ng-content select="[tedi-empty-state-actions]">`.
6444
+ * The subset of inputs that can be overridden per breakpoint via the
6445
+ * `xs`–`xxl` inputs. Every field is optional only the ones you set override
6446
+ * the base value at that breakpoint.
4995
6447
  */
4996
- declare class EmptyStateComponent {
6448
+ type ProgressBarInputs = {
6449
+ /** Overrides {@link ProgressBarComponent.size}. */
6450
+ size?: ProgressBarSize;
6451
+ /** Overrides {@link ProgressBarComponent.labelPosition}. */
6452
+ labelPosition?: ProgressBarLabelPosition;
6453
+ /** Overrides {@link ProgressBarComponent.showValue}. */
6454
+ showValue?: boolean;
6455
+ /** Overrides {@link ProgressBarComponent.valuePosition}. */
6456
+ valuePosition?: ProgressBarValuePosition;
6457
+ /** Overrides {@link ProgressBarComponent.valueLabel}. */
6458
+ valueLabel?: string;
6459
+ };
6460
+ declare class ProgressBarComponent {
4997
6461
  /**
4998
- * Container variant matches the Figma "Types" section.
4999
- * - `'separate'` (default) full border + radius, stands on its own.
5000
- * - `'attached'` — top border omitted so the block sits flush beneath a
5001
- * preceding card or table (same width + same bottom-radius).
5002
- * - `'inside'` — no border, no radius; intended to be placed inside another
5003
- * container such as a `<tedi-card>` or `<tedi-table>`.
5004
- * @default separate
6462
+ * Optional id for the underlying `<progress>` element. Useful when an
6463
+ * external `<label for=…>` should bind to it.
5005
6464
  */
5006
- readonly type: _angular_core.InputSignal<EmptyStateType>;
6465
+ progressId: _angular_core.InputSignal<string | undefined>;
5007
6466
  /**
5008
- * Padding scale. `default` = 24px, `small` = 16px.
5009
- * @default default
6467
+ * Progress value between 0 and 100. Values are clamped.
6468
+ * @default 0
5010
6469
  */
5011
- readonly size: _angular_core.InputSignal<EmptyStateSize>;
6470
+ value: _angular_core.InputSignalWithTransform<number, number>;
5012
6471
  /**
5013
- * Material icon name rendered above the text block. Pass `null` to hide.
5014
- * @default spa
6472
+ * Size of the bar. `small` renders a 4px bar height instead of the
6473
+ * default 8px.
6474
+ * @default default
5015
6475
  */
5016
- readonly icon: _angular_core.InputSignal<string | null>;
6476
+ size: _angular_core.InputSignal<ProgressBarSize>;
5017
6477
  /**
5018
- * Color of the icon. Defaults to brand so the empty state reads as a
5019
- * "fresh canvas" cue rather than a destructive state.
5020
- * @default brand
6478
+ * Optional title rendered above (default) or to the left of the bar.
5021
6479
  */
5022
- readonly iconColor: _angular_core.InputSignal<IconColor>;
6480
+ label: _angular_core.InputSignal<string | undefined>;
5023
6481
  /**
5024
- * Size of the icon, in pixels.
5025
- * @default 36
6482
+ * Where to place the label relative to the bar.
6483
+ * Has no effect when `label` is not set.
6484
+ * @default top
5026
6485
  */
5027
- readonly iconSize: _angular_core.InputSignal<IconSize>;
6486
+ labelPosition: _angular_core.InputSignal<ProgressBarLabelPosition>;
5028
6487
  /**
5029
- * Optional heading rendered above the description appears as an `<h3>` in
5030
- * brand-primary text color.
6488
+ * Render a red `*` after the label to indicate a required field.
6489
+ * Has no effect when `label` is not set.
6490
+ * @default false
6491
+ */
6492
+ required: _angular_core.InputSignalWithTransform<boolean, unknown>;
6493
+ /**
6494
+ * Show or hide the percentage value.
6495
+ * @default true
6496
+ */
6497
+ showValue: _angular_core.InputSignalWithTransform<boolean, unknown>;
6498
+ /**
6499
+ * Where to place the percentage value.
6500
+ * - `horizontal` – next to the bar.
6501
+ * - `bottom` – on the hint row beneath the bar.
6502
+ * @default horizontal
6503
+ */
6504
+ valuePosition: _angular_core.InputSignal<ProgressBarValuePosition>;
6505
+ /**
6506
+ * Override the rendered value text. Defaults to `"{value}%"`.
6507
+ *
6508
+ * Use this when the progress represents something other than a percentage —
6509
+ * e.g. `value=20` with `valueLabel="1/5"` shows the bar at 20% but renders
6510
+ * the label as "1/5". `value` still drives the bar fill; the label is also
6511
+ * exposed to assistive technology via `aria-valuetext`.
6512
+ */
6513
+ valueLabel: _angular_core.InputSignal<string | undefined>;
6514
+ /**
6515
+ * Accessible label for the progress bar. Falls back to `label()` when omitted.
6516
+ */
6517
+ ariaLabel: _angular_core.InputSignal<string | undefined>;
6518
+ /** Overrides applied from the `xs` breakpoint (≥ 0px) and up. */
6519
+ xs: _angular_core.InputSignal<ProgressBarInputs | undefined>;
6520
+ /** Overrides applied from the `sm` breakpoint (≥ 576px) and up. */
6521
+ sm: _angular_core.InputSignal<ProgressBarInputs | undefined>;
6522
+ /** Overrides applied from the `md` breakpoint (≥ 768px) and up. */
6523
+ md: _angular_core.InputSignal<ProgressBarInputs | undefined>;
6524
+ /** Overrides applied from the `lg` breakpoint (≥ 992px) and up. */
6525
+ lg: _angular_core.InputSignal<ProgressBarInputs | undefined>;
6526
+ /** Overrides applied from the `xl` breakpoint (≥ 1200px) and up. */
6527
+ xl: _angular_core.InputSignal<ProgressBarInputs | undefined>;
6528
+ /** Overrides applied from the `xxl` breakpoint (≥ 1400px) and up. */
6529
+ xxl: _angular_core.InputSignal<ProgressBarInputs | undefined>;
6530
+ private breakpointService;
6531
+ protected currentProps: _angular_core.Signal<ProgressBarInputs>;
6532
+ protected formattedValue: _angular_core.Signal<string>;
6533
+ protected accessibleLabel: _angular_core.Signal<string | undefined>;
6534
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ProgressBarComponent, never>;
6535
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ProgressBarComponent, "tedi-progress-bar", never, { "progressId": { "alias": "progressId"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "labelPosition": { "alias": "labelPosition"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "showValue": { "alias": "showValue"; "required": false; "isSignal": true; }; "valuePosition": { "alias": "valuePosition"; "required": false; "isSignal": true; }; "valueLabel": { "alias": "valueLabel"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "xs": { "alias": "xs"; "required": false; "isSignal": true; }; "sm": { "alias": "sm"; "required": false; "isSignal": true; }; "md": { "alias": "md"; "required": false; "isSignal": true; }; "lg": { "alias": "lg"; "required": false; "isSignal": true; }; "xl": { "alias": "xl"; "required": false; "isSignal": true; }; "xxl": { "alias": "xxl"; "required": false; "isSignal": true; }; }, {}, never, ["tedi-feedback-text"], true, never>;
6536
+ }
6537
+
6538
+ type AttachmentDirection = "horizontal" | "vertical";
6539
+ declare class AttachmentComponent {
6540
+ protected projectedProgress: _angular_core.Signal<ProgressBarComponent | undefined>;
6541
+ private breakpointService;
6542
+ /**
6543
+ * File name to display.
6544
+ */
6545
+ name: _angular_core.InputSignal<string>;
6546
+ /**
6547
+ * Pre-formatted file size string (e.g. `"0.9 MB"`). Consumer formats the
6548
+ * value; the component renders it as-is to the right of the name.
6549
+ */
6550
+ fileSize: _angular_core.InputSignal<string | undefined>;
6551
+ /**
6552
+ * Leading file-type icon shown before the file name. Pass a Material Symbol
6553
+ * name (e.g. `"description"`, `"picture_as_pdf"`, `"imagesmode"`).
6554
+ */
6555
+ icon: _angular_core.InputSignal<string | undefined>;
6556
+ /**
6557
+ * Error feedback message. When set, the attachment switches to its error
6558
+ * visual: red card background, error icon next to the name, and the
6559
+ * message rendered as feedback text below the card. Implies `invalid`.
6560
+ */
6561
+ error: _angular_core.InputSignal<string | undefined>;
6562
+ /**
6563
+ * Mark the attachment as invalid. Switches to the error visual (red card
6564
+ * background, error icon next to the name) but does **not** render any
6565
+ * feedback text below the card. Use when the validation message is
6566
+ * shown elsewhere (e.g. as an aggregate error on the parent control).
6567
+ * Implied automatically when `error` is set.
6568
+ * @default false
6569
+ */
6570
+ invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
6571
+ /**
6572
+ * Content layout direction.
6573
+ * - `horizontal` – name/size and progress sit on a single row beside the
6574
+ * actions (the default desktop layout).
6575
+ * - `vertical` – name, size and progress stack in a column with the actions
6576
+ * pinned top-right. Useful in narrow containers (mobile, sidebars).
6577
+ *
6578
+ * When `undefined`, the direction is auto-derived from the viewport: it
6579
+ * switches to `vertical` below the `verticalBelow` breakpoint.
6580
+ */
6581
+ direction: _angular_core.InputSignal<AttachmentDirection | undefined>;
6582
+ /**
6583
+ * Viewport breakpoint below which the layout auto-switches to `vertical`
6584
+ * when `direction` is not set explicitly.
6585
+ * @default "sm"
6586
+ */
6587
+ verticalBelow: _angular_core.InputSignal<"xs" | "sm" | "md" | "lg" | "xl" | "xxl">;
6588
+ private _autoVertical;
6589
+ protected isVertical: _angular_core.Signal<boolean>;
6590
+ protected hasErrorVisual: _angular_core.Signal<boolean>;
6591
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AttachmentComponent, never>;
6592
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AttachmentComponent, "tedi-attachment", never, { "name": { "alias": "name"; "required": true; "isSignal": true; }; "fileSize": { "alias": "fileSize"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "direction": { "alias": "direction"; "required": false; "isSignal": true; }; "verticalBelow": { "alias": "verticalBelow"; "required": false; "isSignal": true; }; }, {}, ["projectedProgress"], ["tedi-progress-bar", "tedi-attachment-actions"], true, never>;
6593
+ }
6594
+
6595
+ declare class AttachmentActionsComponent {
6596
+ /**
6597
+ * Adds a 12px gap between the actions and 8px inline padding to the group.
6598
+ * Enable for labeled (text) buttons, whose neutral variant has no horizontal
6599
+ * padding of its own and would otherwise touch the card edge. Leave off for
6600
+ * icon-only buttons, which sit flush.
6601
+ * @default false
6602
+ */
6603
+ padded: _angular_core.InputSignalWithTransform<boolean, unknown>;
6604
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AttachmentActionsComponent, never>;
6605
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AttachmentActionsComponent, "tedi-attachment-actions", never, { "padded": { "alias": "padded"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
6606
+ }
6607
+
6608
+ type EmptyStateType = "separate" | "attached" | "inside";
6609
+ type EmptyStateSize = "default" | "small";
6610
+ /**
6611
+ * Communicates that there is nothing to display — empty search results, an
6612
+ * unpopulated list, a freshly-created workspace — and optionally guides the
6613
+ * user toward the next step via action buttons or a link.
6614
+ *
6615
+ * Description is projected via `<ng-content>`. Actions are projected via
6616
+ * `<ng-content select="[tedi-empty-state-actions]">`.
6617
+ */
6618
+ declare class EmptyStateComponent {
6619
+ /**
6620
+ * Container variant — matches the Figma "Types" section.
6621
+ * - `'separate'` (default) — full border + radius, stands on its own.
6622
+ * - `'attached'` — top border omitted so the block sits flush beneath a
6623
+ * preceding card or table (same width + same bottom-radius).
6624
+ * - `'inside'` — no border, no radius; intended to be placed inside another
6625
+ * container such as a `<tedi-card>` or `<tedi-table>`.
6626
+ * @default separate
6627
+ */
6628
+ readonly type: _angular_core.InputSignal<EmptyStateType>;
6629
+ /**
6630
+ * Padding scale. `default` = 24px, `small` = 16px.
6631
+ * @default default
6632
+ */
6633
+ readonly size: _angular_core.InputSignal<EmptyStateSize>;
6634
+ /**
6635
+ * Material icon name rendered above the text block. Pass `null` to hide.
6636
+ * @default spa
6637
+ */
6638
+ readonly icon: _angular_core.InputSignal<string | null>;
6639
+ /**
6640
+ * Color of the icon. Defaults to brand so the empty state reads as a
6641
+ * "fresh canvas" cue rather than a destructive state.
6642
+ * @default brand
6643
+ */
6644
+ readonly iconColor: _angular_core.InputSignal<IconColor>;
6645
+ /**
6646
+ * Size of the icon, in pixels.
6647
+ * @default 36
6648
+ */
6649
+ readonly iconSize: _angular_core.InputSignal<IconSize>;
6650
+ /**
6651
+ * Optional heading rendered above the description — appears as an `<h3>` in
6652
+ * brand-primary text color.
5031
6653
  */
5032
6654
  readonly heading: _angular_core.InputSignal<string | undefined>;
5033
6655
  protected readonly hostClasses: _angular_core.Signal<string>;
@@ -5035,25 +6657,6 @@ declare class EmptyStateComponent {
5035
6657
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<EmptyStateComponent, "tedi-empty-state", never, { "type": { "alias": "type"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "iconColor": { "alias": "iconColor"; "required": false; "isSignal": true; }; "iconSize": { "alias": "iconSize"; "required": false; "isSignal": true; }; "heading": { "alias": "heading"; "required": false; "isSignal": true; }; }, {}, never, ["*", "[tedi-empty-state-actions]"], true, never>;
5036
6658
  }
5037
6659
 
5038
- type EllipsisPosition = "start" | "end";
5039
- declare class EllipsisComponent {
5040
- /** Maximum number of lines before truncating. End (multi-line) only. */
5041
- readonly lineClamp: _angular_core.InputSignal<number>;
5042
- /** Whether truncated content shows a hover/focus tooltip with full text. */
5043
- readonly tooltip: _angular_core.InputSignal<boolean>;
5044
- /** Ellipsis position. 'start' = leading, single-line. 'end' = trailing, multi-line. */
5045
- readonly position: _angular_core.InputSignal<EllipsisPosition>;
5046
- readonly content: _angular_core.Signal<ElementRef<HTMLElement> | undefined>;
5047
- readonly isEllipsed: _angular_core.WritableSignal<boolean>;
5048
- readonly fullText: _angular_core.WritableSignal<string>;
5049
- constructor();
5050
- readonly contentClasses: _angular_core.Signal<string>;
5051
- readonly clampStyle: _angular_core.Signal<string | null>;
5052
- private updateEllipsedState;
5053
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<EllipsisComponent, never>;
5054
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<EllipsisComponent, "tedi-ellipsis", never, { "lineClamp": { "alias": "lineClamp"; "required": false; "isSignal": true; }; "tooltip": { "alias": "tooltip"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
5055
- }
5056
-
5057
6660
  type ColWidth = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12;
5058
6661
  type JustifySelf = "start" | "end" | "center" | "stretch";
5059
6662
  type AlignSelf = "start" | "end" | "center" | "stretch";
@@ -5230,28 +6833,55 @@ declare class SeparatorComponent {
5230
6833
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<SeparatorComponent, "tedi-separator", never, { "axis": { "alias": "axis"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "dotSize": { "alias": "dotSize"; "required": false; "isSignal": true; }; "dotFilled": { "alias": "dotFilled"; "required": false; "isSignal": true; }; "thickness": { "alias": "thickness"; "required": false; "isSignal": true; }; "spacing": { "alias": "spacing"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
5231
6834
  }
5232
6835
 
6836
+ /**
6837
+ * Marks content that is pinned to the bottom of a timeline item's timings
6838
+ * column on desktop and rendered after the item content on mobile.
6839
+ *
6840
+ * Usage: `<p *tediTimelineTimingsBottom>Muudetud 08.02.2024</p>`
6841
+ */
6842
+ declare class TimelineTimingsBottomDirective {
6843
+ templateRef: TemplateRef<any>;
6844
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TimelineTimingsBottomDirective, never>;
6845
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<TimelineTimingsBottomDirective, "[tediTimelineTimingsBottom]", never, {}, {}, never, never, true, never>;
6846
+ }
6847
+
5233
6848
  type TimelineItemState = "current" | "past" | "future";
5234
6849
  declare class TimelineItemComponent implements OnInit, OnDestroy {
5235
6850
  /** Item timings */
5236
6851
  timings: _angular_core.InputSignal<string[]>;
5237
6852
  timeline: TimelineComponent | null;
6853
+ protected isMobile: _angular_core.Signal<boolean>;
6854
+ protected timingsBottom: _angular_core.Signal<TimelineTimingsBottomDirective | undefined>;
5238
6855
  ngOnInit(): void;
5239
6856
  ngOnDestroy(): void;
5240
6857
  isLast: _angular_core.Signal<boolean>;
5241
6858
  state: _angular_core.Signal<TimelineItemState>;
5242
6859
  color: _angular_core.Signal<SeparatorColor>;
5243
6860
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TimelineItemComponent, never>;
5244
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TimelineItemComponent, "tedi-timeline-item", never, { "timings": { "alias": "timings"; "required": false; "isSignal": true; }; }, {}, never, ["tedi-timeline-title", "tedi-timeline-description", "*"], true, never>;
6861
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TimelineItemComponent, "tedi-timeline-item", never, { "timings": { "alias": "timings"; "required": false; "isSignal": true; }; }, {}, ["timingsBottom"], ["tedi-timeline-title", "tedi-timeline-description", "*"], true, never>;
5245
6862
  }
5246
6863
 
6864
+ type TimelineVariant = "default" | "card";
6865
+ type TimelineCardPadding = CardPaddingNumber;
5247
6866
  declare class TimelineComponent {
5248
6867
  /** Index of active item */
5249
6868
  activeIndex: _angular_core.InputSignal<number | undefined>;
6869
+ /**
6870
+ * Visual variant. "card" wraps the timeline in the borders and paddings
6871
+ * of a card.
6872
+ * @default default
6873
+ */
6874
+ variant: _angular_core.InputSignal<TimelineVariant>;
6875
+ /**
6876
+ * Item padding in rems for the card variant.
6877
+ * @default 1
6878
+ */
6879
+ cardPadding: _angular_core.InputSignal<CardPaddingNumber | undefined>;
5250
6880
  items: _angular_core.WritableSignal<TimelineItemComponent[]>;
5251
6881
  registerItem(item: TimelineItemComponent): void;
5252
6882
  unregisterItem(item: TimelineItemComponent): void;
5253
6883
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TimelineComponent, never>;
5254
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TimelineComponent, "tedi-timeline", never, { "activeIndex": { "alias": "activeIndex"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
6884
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TimelineComponent, "tedi-timeline", never, { "activeIndex": { "alias": "activeIndex"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "cardPadding": { "alias": "cardPadding"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
5255
6885
  }
5256
6886
 
5257
6887
  declare class TimelineDescriptionComponent {
@@ -5341,7 +6971,7 @@ declare class FooterBottomComponent implements AfterContentInit {
5341
6971
 
5342
6972
  declare class HeaderComponent {
5343
6973
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<HeaderComponent, never>;
5344
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<HeaderComponent, "header[tedi-header]", never, {}, {}, never, ["button[tedi-sidenav-toggle]", "*"], true, never>;
6974
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<HeaderComponent, "header[tedi-header]", never, {}, {}, never, ["button[tedi-sidenav-toggle]", "*", "tedi-header-bottom"], true, never>;
5345
6975
  }
5346
6976
 
5347
6977
  declare class HeaderActionsComponent {
@@ -5349,9 +6979,40 @@ declare class HeaderActionsComponent {
5349
6979
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<HeaderActionsComponent, "tedi-header-actions", never, {}, {}, never, ["*"], true, never>;
5350
6980
  }
5351
6981
 
6982
+ /**
6983
+ * Mobile-only secondary row rendered below the main header bar.
6984
+ *
6985
+ * Typical use: a compact search bar or mobile-specific navigation that only
6986
+ * appears below the `md` breakpoint. Above `md` the component is hidden via
6987
+ * CSS, so consumers can include it unconditionally — desktop users won't see it.
6988
+ *
6989
+ * @example
6990
+ * <header tedi-header>
6991
+ * <!-- main content -->
6992
+ * <tedi-header-bottom>
6993
+ * <tedi-header-search mobileVariant="inline">
6994
+ * <tedi-search inputId="search" placeholder="Search..." />
6995
+ * </tedi-header-search>
6996
+ * </tedi-header-bottom>
6997
+ * </header>
6998
+ */
6999
+ declare class HeaderBottomComponent {
7000
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<HeaderBottomComponent, never>;
7001
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<HeaderBottomComponent, "tedi-header-bottom", never, {}, {}, never, ["*"], true, never>;
7002
+ }
7003
+
7004
+ type HeaderContentAlignment = "flex-start" | "center" | "space-between";
5352
7005
  declare class HeaderContentComponent {
7006
+ /**
7007
+ * Controls the horizontal alignment of the projected content (`justify-content`).
7008
+ * Useful when the center area mixes nav links with another component (e.g. a
7009
+ * `<tedi-header-search>`) and you want to push them apart or align them to one edge.
7010
+ * @default "center"
7011
+ */
7012
+ readonly alignment: _angular_core.InputSignal<HeaderContentAlignment>;
7013
+ protected readonly classes: _angular_core.Signal<string>;
5353
7014
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<HeaderContentComponent, never>;
5354
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<HeaderContentComponent, "tedi-header-content", never, {}, {}, never, ["*"], true, never>;
7015
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<HeaderContentComponent, "tedi-header-content", never, { "alignment": { "alias": "alignment"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
5355
7016
  }
5356
7017
 
5357
7018
  type HeaderLanguage = {
@@ -5368,7 +7029,7 @@ declare class HeaderLanguageComponent {
5368
7029
  * This is event emitter for changing language
5369
7030
  */
5370
7031
  languageChange: _angular_core.OutputEmitterRef<Language>;
5371
- popover?: PopoverComponent;
7032
+ readonly popover: _angular_core.Signal<PopoverComponent | undefined>;
5372
7033
  translationService: TediTranslationService;
5373
7034
  languageKeys: _angular_core.Signal<Language[]>;
5374
7035
  handleChangeLang(lang: Language): void;
@@ -5376,82 +7037,507 @@ declare class HeaderLanguageComponent {
5376
7037
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<HeaderLanguageComponent, "tedi-header-language", never, { "languages": { "alias": "languages"; "required": true; "isSignal": true; }; }, { "languageChange": "languageChange"; }, never, never, true, never>;
5377
7038
  }
5378
7039
 
5379
- declare class HeaderLoginComponent {
7040
+ type HeaderLoginSize = "default" | "small";
7041
+ /**
7042
+ * Subset of `HeaderLoginComponent` inputs that can be overridden per breakpoint
7043
+ * via the `[xs]` / `[sm]` / `[md]` / `[lg]` / `[xl]` / `[xxl]` inputs. Mirrors
7044
+ * React's `HeaderLoginBreakpointProps`.
7045
+ */
7046
+ type HeaderLoginInputs = {
7047
+ size: HeaderLoginSize | undefined;
7048
+ label: string;
7049
+ };
7050
+ declare class HeaderLoginComponent implements BreakpointInputs<HeaderLoginInputs> {
5380
7051
  breakpointService: BreakpointService;
5381
7052
  translationService: TediTranslationService;
5382
- isMobile: _angular_core.Signal<boolean>;
5383
- textDesktop: _angular_core.Signal<string>;
5384
- textMobile: _angular_core.Signal<string>;
5385
- text: _angular_core.Signal<string>;
7053
+ private isMobile;
7054
+ /**
7055
+ * Visual size of the login button.
7056
+ * - `'small'` renders a compact icon-and-caption button (the
7057
+ * `<tedi-header-mobile-button>` variant).
7058
+ * - `'default'` renders a primary button or anchor with text only.
7059
+ *
7060
+ * When left unset, the size is chosen automatically based on the viewport:
7061
+ * `'small'` below the `md` breakpoint, `'default'` from `md` up. Pass an
7062
+ * explicit value to force a variant regardless of viewport.
7063
+ */
7064
+ size: _angular_core.InputSignal<HeaderLoginSize | undefined>;
7065
+ /**
7066
+ * Custom label text for the login button. When provided, used as-is — not
7067
+ * translated. When omitted or empty, falls back to the `header.login.mobile`
7068
+ * translation key for the compact variant and `header.login` for the full
7069
+ * variant.
7070
+ */
7071
+ label: _angular_core.InputSignal<string>;
7072
+ /**
7073
+ * If provided, the login button renders as an `<a>` navigating to this URL.
7074
+ * Otherwise renders as a `<button>`.
7075
+ */
7076
+ href: _angular_core.InputSignal<string | undefined>;
7077
+ xs: _angular_core.InputSignal<HeaderLoginInputs | undefined>;
7078
+ sm: _angular_core.InputSignal<HeaderLoginInputs | undefined>;
7079
+ md: _angular_core.InputSignal<HeaderLoginInputs | undefined>;
7080
+ lg: _angular_core.InputSignal<HeaderLoginInputs | undefined>;
7081
+ xl: _angular_core.InputSignal<HeaderLoginInputs | undefined>;
7082
+ xxl: _angular_core.InputSignal<HeaderLoginInputs | undefined>;
7083
+ protected readonly breakpointInputs: _angular_core.Signal<HeaderLoginInputs>;
7084
+ isSmall: _angular_core.Signal<boolean>;
7085
+ resolvedLabel: _angular_core.Signal<string>;
5386
7086
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<HeaderLoginComponent, never>;
5387
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<HeaderLoginComponent, "tedi-header-login", never, {}, {}, never, never, true, never>;
7087
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<HeaderLoginComponent, "tedi-header-login", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "href": { "alias": "href"; "required": false; "isSignal": true; }; "xs": { "alias": "xs"; "required": false; "isSignal": true; }; "sm": { "alias": "sm"; "required": false; "isSignal": true; }; "md": { "alias": "md"; "required": false; "isSignal": true; }; "lg": { "alias": "lg"; "required": false; "isSignal": true; }; "xl": { "alias": "xl"; "required": false; "isSignal": true; }; "xxl": { "alias": "xxl"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
5388
7088
  }
5389
7089
 
5390
- declare class HeaderLogoutComponent {
5391
- breakpointService: BreakpointService;
5392
- isMobile: _angular_core.Signal<boolean>;
5393
- classes: _angular_core.Signal<string>;
7090
+ declare class HeaderLogoComponent {
7091
+ /**
7092
+ * Optional link URL. When set, the logo is wrapped in an anchor element.
7093
+ */
7094
+ readonly href: _angular_core.InputSignal<string | undefined>;
7095
+ /**
7096
+ * Controls visibility of the logo. Useful for conditionally hiding the logo
7097
+ * based on application state, feature flags, or custom media queries that
7098
+ * fall between standard breakpoints (e.g. 360px). For responsive hiding at
7099
+ * standard breakpoints, prefer wrapping `<tedi-header-logo>` with `*hideAt`
7100
+ * or `*showAt`.
7101
+ * @default true
7102
+ */
7103
+ readonly showLogo: _angular_core.InputSignal<boolean>;
7104
+ private readonly darkSlot;
7105
+ private readonly themeService;
7106
+ protected readonly useDark: _angular_core.Signal<boolean>;
7107
+ protected readonly classes: _angular_core.Signal<string>;
7108
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<HeaderLogoComponent, never>;
7109
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<HeaderLogoComponent, "tedi-header-logo", never, { "href": { "alias": "href"; "required": false; "isSignal": true; }; "showLogo": { "alias": "showLogo"; "required": false; "isSignal": true; }; }, {}, ["darkSlot"], ["*", "[tedi-header-logo-dark]"], true, never>;
7110
+ }
7111
+
7112
+ /**
7113
+ * Marks a projected child of `<tedi-header-logo>` as the dark-theme variant.
7114
+ * `HeaderLogoComponent` detects it via `contentChild` and swaps to the dark
7115
+ * slot when the active theme is `dark`.
7116
+ */
7117
+ declare class HeaderLogoDarkDirective {
7118
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<HeaderLogoDarkDirective, never>;
7119
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<HeaderLogoDarkDirective, "[tedi-header-logo-dark]", never, {}, {}, never, never, true, never>;
7120
+ }
7121
+
7122
+ type HeaderLogoutSize = "default" | "small";
7123
+ /**
7124
+ * Subset of `HeaderLogoutComponent` inputs that can be overridden per
7125
+ * breakpoint via the `[xs]` / `[sm]` / `[md]` / `[lg]` / `[xl]` / `[xxl]`
7126
+ * inputs. Mirrors React's `HeaderLogoutBreakpointProps`.
7127
+ */
7128
+ type HeaderLogoutInputs = {
7129
+ size: HeaderLogoutSize | undefined;
7130
+ label: string;
7131
+ };
7132
+ declare class HeaderLogoutComponent implements BreakpointInputs<HeaderLogoutInputs> {
7133
+ private readonly translationService;
7134
+ private readonly breakpointService;
7135
+ private isMobile;
7136
+ /**
7137
+ * Visual size of the logout button.
7138
+ * - `'small'` renders a compact icon-and-caption button (the
7139
+ * `<tedi-header-mobile-button>` variant).
7140
+ * - `'default'` renders a full-width link with inline icon and text.
7141
+ *
7142
+ * When left unset (the default), the size is chosen automatically based on
7143
+ * the viewport: `'small'` below the `md` breakpoint, `'default'` from `md`
7144
+ * up. Pass an explicit value to force a variant regardless of viewport —
7145
+ * useful inside tight containers (sidebar panel, dropdown) where the
7146
+ * desktop layout has no room.
7147
+ */
7148
+ size: _angular_core.InputSignal<HeaderLogoutSize | undefined>;
7149
+ /**
7150
+ * Custom label text for the logout button. When provided, used as-is — not
7151
+ * translated. When omitted or empty, falls back to the `header.logout.mobile`
7152
+ * translation key for the compact variant and `header.logout` for the full
7153
+ * variant.
7154
+ */
7155
+ label: _angular_core.InputSignal<string>;
7156
+ /**
7157
+ * If provided, the logout button renders as an `<a>` navigating to this URL.
7158
+ * Otherwise renders as a `<button>`.
7159
+ */
7160
+ href: _angular_core.InputSignal<string | undefined>;
7161
+ xs: _angular_core.InputSignal<HeaderLogoutInputs | undefined>;
7162
+ sm: _angular_core.InputSignal<HeaderLogoutInputs | undefined>;
7163
+ md: _angular_core.InputSignal<HeaderLogoutInputs | undefined>;
7164
+ lg: _angular_core.InputSignal<HeaderLogoutInputs | undefined>;
7165
+ xl: _angular_core.InputSignal<HeaderLogoutInputs | undefined>;
7166
+ xxl: _angular_core.InputSignal<HeaderLogoutInputs | undefined>;
7167
+ protected readonly breakpointInputs: _angular_core.Signal<HeaderLogoutInputs>;
7168
+ isSmall: _angular_core.Signal<boolean>;
7169
+ resolvedLabel: _angular_core.Signal<string>;
5394
7170
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<HeaderLogoutComponent, never>;
5395
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<HeaderLogoutComponent, "button[tedi-header-logout]", never, {}, {}, never, ["*"], true, never>;
7171
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<HeaderLogoutComponent, "tedi-header-logout", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "href": { "alias": "href"; "required": false; "isSignal": true; }; "xs": { "alias": "xs"; "required": false; "isSignal": true; }; "sm": { "alias": "sm"; "required": false; "isSignal": true; }; "md": { "alias": "md"; "required": false; "isSignal": true; }; "lg": { "alias": "lg"; "required": false; "isSignal": true; }; "xl": { "alias": "xl"; "required": false; "isSignal": true; }; "xxl": { "alias": "xxl"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
5396
7172
  }
5397
7173
 
5398
- declare class HeaderProfileComponent implements AfterContentInit {
5399
- /** Name of representative */
5400
- name: _angular_core.InputSignal<string>;
5401
- /** Breakpoint at which we show dropdown instead of modal */
5402
- showDropdown: _angular_core.InputSignal<"xs" | "sm" | "md" | "lg" | "xl" | "xxl" | undefined>;
7174
+ /**
7175
+ * Compact icon + label button used inside the mobile header row
7176
+ * (`<tedi-header-bottom>` or a mobile-specific section of
7177
+ * `<tedi-header-actions>`).
7178
+ *
7179
+ * Renders as an `<a>` when `href` is provided and `disabled` is false,
7180
+ * otherwise as a `<button>` — mirroring the React `HeaderMobileButton`.
7181
+ *
7182
+ * @example
7183
+ * <tedi-header-mobile-button icon="menu" label="Menu" />
7184
+ * <tedi-header-mobile-button icon="search" label="Search" href="/search" />
7185
+ * <tedi-header-mobile-button icon="notifications" label="Alerts" [selected]="true" />
7186
+ */
7187
+ declare class HeaderMobileButtonComponent {
7188
+ /** Material icon name displayed inside the button. */
7189
+ icon: _angular_core.InputSignal<string>;
7190
+ /** Label text displayed below the icon. */
7191
+ label: _angular_core.InputSignal<string | undefined>;
7192
+ /**
7193
+ * If provided (and not disabled), the button renders as an `<a>`
7194
+ * navigating to this URL. Otherwise renders as a `<button>`.
7195
+ */
7196
+ href: _angular_core.InputSignal<string | undefined>;
7197
+ /** Whether the button is in a selected state. */
7198
+ selected: _angular_core.InputSignal<boolean>;
7199
+ /** Whether the button is disabled. */
7200
+ disabled: _angular_core.InputSignal<boolean>;
7201
+ /**
7202
+ * Accessible name override forwarded to the inner `<button>`/`<a>`.
7203
+ * Useful when the visible label needs to be augmented for screen readers
7204
+ * (e.g. when the button only renders an icon).
7205
+ */
7206
+ ariaLabel: _angular_core.InputSignal<string | undefined>;
7207
+ /**
7208
+ * Forwarded to the inner `<button>` as `aria-haspopup`. Set to `'dialog'`
7209
+ * when the button opens a modal dialog, `'menu'` for menus, etc.
7210
+ *
7211
+ * Only applied when the component renders as a `<button>` (i.e. when
7212
+ * `href` is not set). A real navigation link with popup-trigger semantics
7213
+ * is confusing to assistive tech — if a popup is involved, omit `href`
7214
+ * so the component renders as a button.
7215
+ */
7216
+ ariaHasPopup: _angular_core.InputSignal<"menu" | "listbox" | "dialog" | "true" | "grid" | "false" | "tree" | undefined>;
7217
+ /**
7218
+ * Forwarded to the inner `<button>` as `aria-expanded`. Pair with
7219
+ * `ariaHasPopup` when this button toggles a dialog/menu open.
7220
+ *
7221
+ * Only applied when the component renders as a `<button>` (i.e. when
7222
+ * `href` is not set).
7223
+ */
7224
+ ariaExpanded: _angular_core.InputSignal<boolean | undefined>;
7225
+ renderAsLink: _angular_core.Signal<boolean>;
7226
+ classes: _angular_core.Signal<string>;
7227
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<HeaderMobileButtonComponent, never>;
7228
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<HeaderMobileButtonComponent, "tedi-header-mobile-button", never, { "icon": { "alias": "icon"; "required": true; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "href": { "alias": "href"; "required": false; "isSignal": true; }; "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "ariaHasPopup": { "alias": "ariaHasPopup"; "required": false; "isSignal": true; }; "ariaExpanded": { "alias": "ariaExpanded"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
7229
+ }
7230
+
7231
+ type HeaderProfileSize = "default" | "small";
7232
+ /**
7233
+ * Subset of `HeaderProfileComponent` inputs that can be overridden per
7234
+ * breakpoint via the `[xs]` / `[sm]` / `[md]` / `[lg]` / `[xl]` / `[xxl]` inputs.
7235
+ */
7236
+ type HeaderProfileInputs = {
7237
+ label: string;
7238
+ showPopover: Breakpoint;
7239
+ };
7240
+ declare class HeaderProfileComponent implements BreakpointInputs<HeaderProfileInputs>, AfterContentInit {
7241
+ /**
7242
+ * Custom label text for the profile button. Falls back to the `header.profile`
7243
+ * translation key on desktop, or `header.profile.mobile` on mobile.
7244
+ */
7245
+ label: _angular_core.InputSignal<string>;
7246
+ /**
7247
+ * Whether to display a text label next to the profile icon on non-mobile
7248
+ * viewports. When `false` the desktop trigger renders as an icon-only button
7249
+ * and the label (custom or translated) is used as the `aria-label` only.
7250
+ * When `true` the label is visible and a chevron is shown next to it.
7251
+ *
7252
+ * Has no effect on the mobile/small variant — the mobile button always
7253
+ * shows its label.
7254
+ * @default false
7255
+ */
7256
+ showLabel: _angular_core.InputSignal<boolean>;
7257
+ /**
7258
+ * Defines the breakpoint from which the profile menu is displayed as a popover.
7259
+ * Below this breakpoint, it is rendered as a modal.
7260
+ *
7261
+ * @default 'lg'
7262
+ */
7263
+ showPopover: _angular_core.InputSignal<"xs" | "sm" | "md" | "lg" | "xl" | "xxl">;
7264
+ /**
7265
+ * Removes default item styles from the mobile modal content. When `true`,
7266
+ * projected children render without the padding, border, or background that
7267
+ * `<tedi-header-profile>` normally applies to each direct child of the
7268
+ * modal. Use when the content requires custom item styling.
7269
+ *
7270
+ * Only affects the mobile/modal branch. The desktop popover uses
7271
+ * `<tedi-popover-content>`'s own styling and is unaffected.
7272
+ *
7273
+ * @default false
7274
+ */
7275
+ noStyle: _angular_core.InputSignal<boolean>;
7276
+ /**
7277
+ * Visual size of the profile button.
7278
+ * - `'small'` renders a compact icon-and-caption button (the
7279
+ * `<tedi-header-mobile-button>` variant).
7280
+ * - `'default'` renders a button with the user's name + icon.
7281
+ *
7282
+ * When left unset, the size is chosen automatically based on the viewport:
7283
+ * `'small'` below the `md` breakpoint, `'default'` from `md` up. Pass an
7284
+ * explicit value to force a variant regardless of viewport.
7285
+ */
7286
+ size: _angular_core.InputSignal<HeaderProfileSize | undefined>;
7287
+ xs: _angular_core.InputSignal<HeaderProfileInputs | undefined>;
7288
+ sm: _angular_core.InputSignal<HeaderProfileInputs | undefined>;
7289
+ md: _angular_core.InputSignal<HeaderProfileInputs | undefined>;
7290
+ lg: _angular_core.InputSignal<HeaderProfileInputs | undefined>;
7291
+ xl: _angular_core.InputSignal<HeaderProfileInputs | undefined>;
7292
+ xxl: _angular_core.InputSignal<HeaderProfileInputs | undefined>;
5403
7293
  readonly breakpointService: BreakpointService;
5404
7294
  readonly translationService: TediTranslationService;
5405
7295
  private readonly document;
5406
7296
  private readonly host;
5407
7297
  private readonly renderer;
5408
- private readonly eventListeners;
7298
+ private readonly destroyRef;
7299
+ readonly isMobile: _angular_core.Signal<boolean>;
7300
+ readonly isSmall: _angular_core.Signal<boolean>;
7301
+ protected readonly breakpointInputs: _angular_core.Signal<HeaderProfileInputs>;
7302
+ readonly resolvedLabel: _angular_core.Signal<string>;
5409
7303
  constructor();
5410
7304
  modalOpen: _angular_core.WritableSignal<boolean>;
7305
+ /**
7306
+ * Tracks which `HeaderRoleComponent` instance currently has its
7307
+ * accordion open. When a role opens, it writes its own reference here;
7308
+ * other roles watch this signal and close themselves when it changes.
7309
+ * @internal
7310
+ */
7311
+ readonly activeRole: _angular_core.WritableSignal<unknown>;
5411
7312
  readonly buttonVariant: _angular_core.Signal<ButtonVariant>;
5412
- readonly buttonClass: _angular_core.Signal<"tedi-header-profile--mobile" | null>;
5413
7313
  ngAfterContentInit(): void;
5414
7314
  handleModalOpen(): void;
5415
7315
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<HeaderProfileComponent, never>;
5416
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<HeaderProfileComponent, "tedi-header-profile", never, { "name": { "alias": "name"; "required": false; "isSignal": true; }; "showDropdown": { "alias": "showDropdown"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
7316
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<HeaderProfileComponent, "tedi-header-profile", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "showLabel": { "alias": "showLabel"; "required": false; "isSignal": true; }; "showPopover": { "alias": "showPopover"; "required": false; "isSignal": true; }; "noStyle": { "alias": "noStyle"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "xs": { "alias": "xs"; "required": false; "isSignal": true; }; "sm": { "alias": "sm"; "required": false; "isSignal": true; }; "md": { "alias": "md"; "required": false; "isSignal": true; }; "lg": { "alias": "lg"; "required": false; "isSignal": true; }; "xl": { "alias": "xl"; "required": false; "isSignal": true; }; "xxl": { "alias": "xxl"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
7317
+ }
7318
+
7319
+ /**
7320
+ * Marker directive applied to a projected child of `<tedi-header-role>` to mark it
7321
+ * as the title content (e.g. a `<tedi-tag>`). The directive itself adds no DOM or
7322
+ * behavior — it only exists so `HeaderRoleComponent` can detect, via `contentChild`,
7323
+ * whether a consumer has projected title content. When projected, the title slot
7324
+ * replaces the bold `role` string fallback.
7325
+ *
7326
+ * @example
7327
+ * <tedi-header-role [representatives]="..." [currentRepresentative]="...">
7328
+ * <tedi-tag tedi-header-role-title>Esindatav</tedi-tag>
7329
+ * </tedi-header-role>
7330
+ */
7331
+ declare class HeaderRoleTitleDirective {
7332
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<HeaderRoleTitleDirective, never>;
7333
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<HeaderRoleTitleDirective, "[tedi-header-role-title]", never, {}, {}, never, never, true, never>;
5417
7334
  }
5418
7335
 
7336
+ type RepresentativeIcon = {
7337
+ /** Material Icon name. */
7338
+ name: string;
7339
+ /** Size in px. Falls back to `<tedi-icon>`'s default (24) when omitted. */
7340
+ size?: IconSize;
7341
+ };
5419
7342
  type Representative = {
7343
+ /**
7344
+ * Stable identifier. Required for selection comparison and for re-syncing
7345
+ * the current representative when the `representatives` input changes.
7346
+ */
7347
+ id: string;
5420
7348
  name: string;
5421
- icon?: string;
7349
+ /**
7350
+ * Icon shown next to the representative. Accepts either a Material Icon name
7351
+ * as a string (`'person'`) for the common case, or a full
7352
+ * `RepresentativeIcon` object (`{ name: 'person', size: 18 }`) when an
7353
+ * explicit size is needed. The two forms are equivalent when only `name` is
7354
+ * relevant.
7355
+ */
7356
+ icon?: string | RepresentativeIcon;
5422
7357
  description?: string;
5423
7358
  };
7359
+ /**
7360
+ * Structural marker for custom content projected into the role selection
7361
+ * popover (desktop) or accordion (tablet/mobile).
7362
+ *
7363
+ * When present, replaces the default representative list entirely.
7364
+ *
7365
+ * Usage:
7366
+ * ```html
7367
+ * <tedi-header-role ...>
7368
+ * <ng-template tedi-header-role-content>
7369
+ * <div>Custom content here</div>
7370
+ * </ng-template>
7371
+ * </tedi-header-role>
7372
+ * ```
7373
+ */
7374
+ declare class HeaderRoleContentDirective {
7375
+ readonly templateRef: TemplateRef<any>;
7376
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<HeaderRoleContentDirective, never>;
7377
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<HeaderRoleContentDirective, "[tedi-header-role-content]", never, {}, {}, never, never, true, never>;
7378
+ }
7379
+ /**
7380
+ * Structural marker for custom "no results" content shown when the search
7381
+ * filter produces an empty representative list.
7382
+ *
7383
+ * When absent, the component falls back to a default translated string.
7384
+ *
7385
+ * Usage:
7386
+ * ```html
7387
+ * <tedi-header-role ...>
7388
+ * <ng-template tedi-header-role-no-results>
7389
+ * <tedi-empty-state description="No matches found" />
7390
+ * </ng-template>
7391
+ * </tedi-header-role>
7392
+ * ```
7393
+ */
7394
+ declare class HeaderRoleNoResultsDirective {
7395
+ readonly templateRef: TemplateRef<any>;
7396
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<HeaderRoleNoResultsDirective, never>;
7397
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<HeaderRoleNoResultsDirective, "[tedi-header-role-no-results]", never, {}, {}, never, never, true, never>;
7398
+ }
5424
7399
  declare class HeaderRoleComponent {
5425
7400
  /**
5426
- * Role text
7401
+ * Label text. Rendered as bold text in the title position when no title content is
7402
+ * projected via `[tedi-header-role-title]`. Projected content takes precedence and
7403
+ * replaces this string.
5427
7404
  */
5428
- role: _angular_core.InputSignal<string>;
7405
+ label: _angular_core.InputSignal<string>;
5429
7406
  /**
5430
7407
  * Description text
5431
7408
  */
5432
7409
  description: _angular_core.InputSignal<string>;
5433
- /** Should show input in representative list?
7410
+ /**
7411
+ * Whether the consumer projected title content (e.g. `<tedi-tag tedi-header-role-title>`)
7412
+ * via the `[tedi-header-role-title]` slot. Used by the template to know whether the
7413
+ * title position has content even when `label` is empty.
7414
+ */
7415
+ protected readonly titleContent: _angular_core.Signal<HeaderRoleTitleDirective | undefined>;
7416
+ protected readonly hasTitle: _angular_core.Signal<boolean>;
7417
+ /**
7418
+ * Projected custom content that replaces the default representative list.
7419
+ */
7420
+ protected readonly customContent: _angular_core.Signal<HeaderRoleContentDirective | undefined>;
7421
+ protected readonly hasCustomContent: _angular_core.Signal<boolean>;
7422
+ protected readonly customContentTemplate: _angular_core.Signal<TemplateRef<any> | null>;
7423
+ protected readonly noResultsContent: _angular_core.Signal<HeaderRoleNoResultsDirective | undefined>;
7424
+ protected readonly hasNoResultsContent: _angular_core.Signal<boolean>;
7425
+ protected readonly noResultsTemplate: _angular_core.Signal<TemplateRef<any> | null>;
7426
+ /**
7427
+ * Whether to display the search input above the representative list.
5434
7428
  * @default false
5435
7429
  */
5436
- showInput: _angular_core.InputSignal<boolean>;
7430
+ showSearch: _angular_core.InputSignal<boolean>;
7431
+ /**
7432
+ * Whether the search input shows a clear button.
7433
+ * @default false
7434
+ */
7435
+ searchClearable: _angular_core.InputSignal<boolean>;
7436
+ /**
7437
+ * Whether to clear the search input when a representative is selected.
7438
+ * @default true
7439
+ */
7440
+ clearSearchOnSelect: _angular_core.InputSignal<boolean>;
7441
+ /**
7442
+ * Whether the role represents an organization.
7443
+ * Affects the search input label.
7444
+ */
7445
+ isOrganization: _angular_core.InputSignal<boolean>;
7446
+ /**
7447
+ * Label for the search input when selecting a representative.
7448
+ * Falls back to i18n labels when not provided.
7449
+ */
7450
+ searchLabel: _angular_core.InputSignal<string | undefined>;
7451
+ /**
7452
+ * Label for the search input when selecting an organization representative.
7453
+ * Overrides both the default and `searchLabel` when `isOrganization` is true.
7454
+ */
7455
+ organizationSearchLabel: _angular_core.InputSignal<string | undefined>;
7456
+ /**
7457
+ * Whether to show the role selection toggle and dropdown.
7458
+ * When not set, defaults to showing the selection when there are multiple representatives.
7459
+ */
7460
+ showRoleSwitch: _angular_core.InputSignal<boolean | undefined>;
5437
7461
  /** List of representatives */
5438
7462
  representatives: _angular_core.InputSignal<Representative[]>;
5439
7463
  /** Current representative */
5440
7464
  currentRepresentative: _angular_core.ModelSignal<Representative>;
7465
+ /**
7466
+ * Emits when the role selection (mobile collapse on tablet/mobile, popover on
7467
+ * desktop) opens or closes.
7468
+ */
7469
+ readonly roleSelectionToggle: _angular_core.OutputEmitterRef<boolean>;
5441
7470
  mobileOpen: _angular_core.WritableSignal<boolean>;
5442
7471
  inputValue: _angular_core.WritableSignal<string>;
7472
+ protected readonly inputId: string;
7473
+ readonly breakpointService: BreakpointService;
7474
+ readonly isTabletView: _angular_core.Signal<boolean>;
7475
+ protected readonly hasRoleSelection: _angular_core.Signal<boolean>;
7476
+ private readonly popover;
7477
+ private readonly searchInput;
7478
+ private previousPopoverOpen;
7479
+ private readonly parentProfile;
7480
+ constructor();
5443
7481
  translationService: TediTranslationService;
5444
7482
  switchRoleText: _angular_core.Signal<string>;
5445
7483
  closeText: _angular_core.Signal<string>;
7484
+ private defaultSearchText;
7485
+ private defaultOrgSearchText;
5446
7486
  searchText: _angular_core.Signal<string>;
5447
7487
  noResultsText: _angular_core.Signal<string>;
5448
7488
  collapseText: _angular_core.Signal<string>;
5449
7489
  filteredRepresentatives: _angular_core.Signal<Representative[]>;
7490
+ closeIfOtherRoleActive(active: unknown, isOpen: boolean): void;
5450
7491
  handleMobileOpen(): void;
5451
7492
  handleSelectRepresentative(r: Representative): void;
5452
7493
  handleInputChange(event: Event): void;
7494
+ trackById: (_: number, r: Representative) => string;
7495
+ protected resolveIcon(icon: string | RepresentativeIcon | undefined): {
7496
+ name: string;
7497
+ size: IconSize;
7498
+ } | null;
5453
7499
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<HeaderRoleComponent, never>;
5454
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<HeaderRoleComponent, "tedi-header-role", never, { "role": { "alias": "role"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "showInput": { "alias": "showInput"; "required": false; "isSignal": true; }; "representatives": { "alias": "representatives"; "required": true; "isSignal": true; }; "currentRepresentative": { "alias": "currentRepresentative"; "required": true; "isSignal": true; }; }, { "currentRepresentative": "currentRepresentativeChange"; }, never, never, true, never>;
7500
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<HeaderRoleComponent, "tedi-header-role", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "showSearch": { "alias": "showSearch"; "required": false; "isSignal": true; }; "searchClearable": { "alias": "searchClearable"; "required": false; "isSignal": true; }; "clearSearchOnSelect": { "alias": "clearSearchOnSelect"; "required": false; "isSignal": true; }; "isOrganization": { "alias": "isOrganization"; "required": false; "isSignal": true; }; "searchLabel": { "alias": "searchLabel"; "required": false; "isSignal": true; }; "organizationSearchLabel": { "alias": "organizationSearchLabel"; "required": false; "isSignal": true; }; "showRoleSwitch": { "alias": "showRoleSwitch"; "required": false; "isSignal": true; }; "representatives": { "alias": "representatives"; "required": true; "isSignal": true; }; "currentRepresentative": { "alias": "currentRepresentative"; "required": true; "isSignal": true; }; }, { "currentRepresentative": "currentRepresentativeChange"; "roleSelectionToggle": "roleSelectionToggle"; }, ["titleContent", "customContent", "noResultsContent"], ["[tedi-header-role-title]"], true, never>;
7501
+ }
7502
+
7503
+ type HeaderSearchMobileVariant = "modal" | "inline";
7504
+ interface HeaderSearchMobileLabels {
7505
+ /** Label shown on the mobile toggle button. Falls back to the `header.search` translation. */
7506
+ button?: string;
7507
+ /** Title shown in the mobile modal heading. Falls back to the `header.search` translation. */
7508
+ modalTitle?: string;
7509
+ }
7510
+ declare class HeaderSearchComponent {
7511
+ /**
7512
+ * Behavior on mobile viewports (below the `md` breakpoint).
7513
+ * - `'modal'` shows a toggle button that opens a fullscreen native dialog containing the projected content.
7514
+ * - `'inline'` renders the projected content inline at all breakpoints (no toggle, no dialog).
7515
+ * @default "modal"
7516
+ */
7517
+ readonly mobileVariant: _angular_core.InputSignal<HeaderSearchMobileVariant>;
7518
+ /**
7519
+ * Mobile-specific labels for the toggle button and the modal title.
7520
+ * When omitted, both fall back to the `header.search` translation key.
7521
+ */
7522
+ readonly mobileLabels: _angular_core.InputSignal<HeaderSearchMobileLabels>;
7523
+ /**
7524
+ * Disables the mobile toggle button. Has no effect on desktop or in the `inline` variant.
7525
+ * @default false
7526
+ */
7527
+ readonly disabled: _angular_core.InputSignal<boolean>;
7528
+ protected readonly translationService: TediTranslationService;
7529
+ protected readonly isMobile: _angular_core.Signal<boolean>;
7530
+ protected readonly modalOpen: _angular_core.WritableSignal<boolean>;
7531
+ protected readonly dialogEl: _angular_core.Signal<ElementRef<HTMLDialogElement> | undefined>;
7532
+ protected readonly buttonLabel: _angular_core.Signal<string>;
7533
+ protected readonly modalTitle: _angular_core.Signal<string>;
7534
+ protected readonly closeLabel: _angular_core.Signal<string>;
7535
+ constructor();
7536
+ protected open(): void;
7537
+ protected close(): void;
7538
+ protected onDialogClose(): void;
7539
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<HeaderSearchComponent, never>;
7540
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<HeaderSearchComponent, "tedi-header-search", never, { "mobileVariant": { "alias": "mobileVariant"; "required": false; "isSignal": true; }; "mobileLabels": { "alias": "mobileLabels"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
5455
7541
  }
5456
7542
 
5457
7543
  declare class SideNavDropdownComponent implements AfterViewInit {
@@ -5879,6 +7965,7 @@ declare class ModalHeaderComponent {
5879
7965
 
5880
7966
  declare class TooltipTriggerComponent implements AfterContentChecked {
5881
7967
  readonly host: ElementRef<HTMLElement>;
7968
+ readonly overlayOrigin: CdkOverlayOrigin;
5882
7969
  private renderer;
5883
7970
  readonly tooltip: TooltipComponent;
5884
7971
  private interactiveElement;
@@ -5893,18 +7980,28 @@ declare class TooltipTriggerComponent implements AfterContentChecked {
5893
7980
  onFocusOut(): void;
5894
7981
  onEscape(): void;
5895
7982
  ngAfterContentChecked(): void;
7983
+ /**
7984
+ * The element that actually receives focus and ARIA semantics. When the
7985
+ * projected child is itself focusable (a `<button>`/`<a href>`) it is used
7986
+ * directly. When it is a non-focusable wrapper that renders its own
7987
+ * interactive element (e.g. a `tedi-dropdown` projecting a trigger button),
7988
+ * the first focusable descendant is used instead — otherwise focus and the
7989
+ * tooltip description would land on the non-interactive wrapper.
7990
+ */
7991
+ private resolveInteractiveElement;
7992
+ private isFocusable;
5896
7993
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TooltipTriggerComponent, never>;
5897
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TooltipTriggerComponent, "tedi-tooltip-trigger", never, {}, {}, never, ["*"], true, never>;
7994
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TooltipTriggerComponent, "tedi-tooltip-trigger", never, {}, {}, never, ["*"], true, [{ directive: typeof _angular_cdk_overlay.CdkOverlayOrigin; inputs: {}; outputs: {}; }]>;
5898
7995
  }
5899
7996
 
5900
- type TooltipPosition = `${NgxFloatUiPlacements}`;
7997
+ type TooltipPosition = OverlayPosition;
5901
7998
  type TooltipOpenWith = "hover" | "click" | "both";
5902
7999
  declare class TooltipComponent implements AfterContentChecked {
5903
8000
  /**
5904
8001
  * The position of the tooltip relative to the trigger element.
5905
8002
  * @default top
5906
8003
  */
5907
- readonly position: _angular_core.InputSignal<"left" | "right" | "top" | "bottom" | "auto" | "auto-start" | "auto-end" | "top-start" | "bottom-start" | "left-start" | "right-start" | "top-end" | "bottom-end" | "left-end" | "right-end">;
8004
+ readonly position: _angular_core.InputSignal<OverlayPosition>;
5908
8005
  /**
5909
8006
  * Should position to opposite direction when overflowing screen?
5910
8007
  * @default true
@@ -5915,12 +8012,6 @@ declare class TooltipComponent implements AfterContentChecked {
5915
8012
  * @default both
5916
8013
  */
5917
8014
  readonly openWith: _angular_core.InputSignal<TooltipOpenWith>;
5918
- /**
5919
- * Append floating element to given selector.
5920
- * Use 'body' to append at the end of DOM or empty string to append next to trigger element.
5921
- * @default body
5922
- */
5923
- readonly appendTo: _angular_core.InputSignal<string>;
5924
8015
  /** Delay time (in ms) for closing tooltip when not hovering trigger or content.
5925
8016
  * @default 100
5926
8017
  */
@@ -5929,19 +8020,29 @@ declare class TooltipComponent implements AfterContentChecked {
5929
8020
  readonly tooltipTrigger: _angular_core.Signal<TooltipTriggerComponent>;
5930
8021
  /** Tooltip content component */
5931
8022
  readonly tooltipContent: _angular_core.Signal<ElementRef<any>>;
8023
+ private readonly connectedOverlay;
5932
8024
  readonly descriptionId: string;
5933
8025
  readonly contentText: _angular_core.WritableSignal<string>;
5934
8026
  readonly isOpen: _angular_core.WritableSignal<boolean>;
5935
- isContentHovered: _angular_core.WritableSignal<boolean>;
5936
- floatUiDisplay: _angular_core.WritableSignal<"inline" | "block">;
5937
- floatUiComponent: _angular_core.Signal<NgxFloatUiContentComponent>;
8027
+ readonly currentPlacement: _angular_core.WritableSignal<OverlaySide>;
8028
+ readonly arrowLeft: _angular_core.WritableSignal<number | null>;
8029
+ readonly arrowTop: _angular_core.WritableSignal<number | null>;
8030
+ readonly overlayPositions: _angular_core.Signal<_angular_cdk_overlay.ConnectedPosition[]>;
8031
+ readonly overlayOrigin: _angular_core.Signal<_angular_cdk_overlay.CdkOverlayOrigin>;
8032
+ readonly isContentHovered: _angular_core.WritableSignal<boolean>;
5938
8033
  hideTimeout?: ReturnType<typeof setTimeout>;
8034
+ private readonly horizontalPush;
8035
+ constructor();
5939
8036
  showTooltip(): void;
5940
8037
  hideTooltip(): void;
5941
8038
  toggleTooltip(): void;
8039
+ onPositionChange(change: ConnectedOverlayPositionChange): void;
8040
+ onOverlayAttach(): void;
8041
+ private updateArrowPosition;
5942
8042
  ngAfterContentChecked(): void;
8043
+ private syncContentText;
5943
8044
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TooltipComponent, never>;
5944
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TooltipComponent, "tedi-tooltip", never, { "position": { "alias": "position"; "required": false; "isSignal": true; }; "preventOverflow": { "alias": "preventOverflow"; "required": false; "isSignal": true; }; "openWith": { "alias": "openWith"; "required": false; "isSignal": true; }; "appendTo": { "alias": "appendTo"; "required": false; "isSignal": true; }; "timeoutDelay": { "alias": "timeoutDelay"; "required": false; "isSignal": true; }; }, {}, ["tooltipTrigger", "tooltipContent"], ["tedi-tooltip-trigger", "tedi-tooltip-content"], true, never>;
8045
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TooltipComponent, "tedi-tooltip", never, { "position": { "alias": "position"; "required": false; "isSignal": true; }; "preventOverflow": { "alias": "preventOverflow"; "required": false; "isSignal": true; }; "openWith": { "alias": "openWith"; "required": false; "isSignal": true; }; "timeoutDelay": { "alias": "timeoutDelay"; "required": false; "isSignal": true; }; }, {}, ["tooltipTrigger", "tooltipContent"], ["tedi-tooltip-trigger", "tedi-tooltip-content"], true, never>;
5945
8046
  }
5946
8047
 
5947
8048
  type TooltipWidth = "none" | "small" | "medium" | "large";
@@ -5983,50 +8084,6 @@ declare class PopoverContentComponent {
5983
8084
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<PopoverContentComponent, "tedi-popover-content", never, { "maxWidth": { "alias": "maxWidth"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "showClose": { "alias": "showClose"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
5984
8085
  }
5985
8086
 
5986
- type TagType = "primary" | "secondary" | "danger";
5987
- type TagEllipsis = "start" | "end" | false;
5988
- declare class TagComponent {
5989
- readonly idGenerator: _IdGenerator;
5990
- readonly uniqueId: string;
5991
- /**
5992
- * Whether the tag is in loading state.
5993
- * When true, a spinner will be displayed inside the tag.
5994
- * @default false
5995
- */
5996
- loading: _angular_core.InputSignal<boolean>;
5997
- /**
5998
- * Whether the tag can be closed.
5999
- * When true, a close button will be displayed that emits the 'closed' event when clicked.
6000
- * @default false
6001
- */
6002
- closable: _angular_core.InputSignal<boolean>;
6003
- /**
6004
- * The visual style of the tag.
6005
- * Possible values: 'primary', 'secondary', 'danger'
6006
- * @default "primary"
6007
- */
6008
- type: _angular_core.InputSignal<TagType>;
6009
- /**
6010
- * Which end the label truncates from when it doesn't fit. `false` (default)
6011
- * never truncates — the label wraps and the tag keeps its full width. `end`
6012
- * shows an ellipsis at the end (`Long label…`); `start` shows it at the start
6013
- * (`…label`), which keeps the most significant part of values like dates
6014
- * visible. Truncation only kicks in when the tag is width-constrained, and the
6015
- * full label is revealed in a tooltip on hover/focus.
6016
- * @default false
6017
- */
6018
- ellipsis: _angular_core.InputSignal<TagEllipsis>;
6019
- /**
6020
- * Event emitted when the close button is clicked.
6021
- */
6022
- closed: _angular_core.OutputEmitterRef<Event>;
6023
- classes: _angular_core.Signal<string>;
6024
- ellipsisPosition: _angular_core.Signal<EllipsisPosition>;
6025
- handleClose(event: Event): void;
6026
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<TagComponent, never>;
6027
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TagComponent, "tedi-tag", never, { "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "closable": { "alias": "closable"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "ellipsis": { "alias": "ellipsis"; "required": false; "isSignal": true; }; }, { "closed": "closed"; }, never, ["*"], true, never>;
6028
- }
6029
-
6030
8087
  type StatusBadgeColor = "neutral" | "brand" | "accent" | "success" | "danger" | "warning" | "transparent";
6031
8088
  type StatusBadgeVariant = "filled" | "filled-bordered" | "bordered";
6032
8089
  type StatusBadgeSize = "default" | "large";
@@ -6080,42 +8137,6 @@ declare class StatusBadgeComponent {
6080
8137
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<StatusBadgeComponent, "tedi-status-badge", never, { "text": { "alias": "text"; "required": false; "isSignal": true; }; "class": { "alias": "class"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "role": { "alias": "role"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "status": { "alias": "status"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
6081
8138
  }
6082
8139
 
6083
- type StatusIndicatorType = "success" | "danger" | "warning" | "inactive";
6084
- type StatusIndicatorSize = "sm" | "lg";
6085
- type StatusIndicatorPosition = "default" | "top-right";
6086
- declare class StatusIndicatorComponent {
6087
- /**
6088
- * Accessible label for the indicator. When provided, the indicator is
6089
- * exposed to assistive technology with `role="img"`. When omitted, the
6090
- * indicator is treated as decorative (`aria-hidden="true"`).
6091
- */
6092
- readonly label: _angular_core.InputSignal<string | undefined>;
6093
- /**
6094
- * The status type, which determines the indicator color.
6095
- * @default success
6096
- */
6097
- readonly type: _angular_core.InputSignal<StatusIndicatorType>;
6098
- /**
6099
- * The size of the indicator.
6100
- * @default sm
6101
- */
6102
- readonly size: _angular_core.InputSignal<StatusIndicatorSize>;
6103
- /**
6104
- * Whether the indicator has a white border ring.
6105
- * @default false
6106
- */
6107
- readonly hasBorder: _angular_core.InputSignal<boolean>;
6108
- /**
6109
- * Controls positioning of the indicator.
6110
- * - `'default'` — inline, no absolute positioning
6111
- * - `'top-right'` — absolutely positioned at the top-right corner of the parent
6112
- * @default default
6113
- */
6114
- readonly position: _angular_core.InputSignal<StatusIndicatorPosition>;
6115
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<StatusIndicatorComponent, never>;
6116
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StatusIndicatorComponent, "tedi-status-indicator", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "hasBorder": { "alias": "hasBorder"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
6117
- }
6118
-
6119
8140
  /**
6120
8141
  * A single item inside a `tedi-accordion`. Owns the item's state (expanded)
6121
8142
  * and the inputs shared by header and content (selected, showIconCard,
@@ -6205,7 +8226,7 @@ declare class AccordionItemHeaderComponent {
6205
8226
  /**
6206
8227
  * Position of the expand action relative to the header content.
6207
8228
  */
6208
- expandActionPosition: _angular_core.InputSignal<"end" | "start">;
8229
+ expandActionPosition: _angular_core.InputSignal<"start" | "end">;
6209
8230
  /**
6210
8231
  * Custom CSS classes for the accordion header.
6211
8232
  */
@@ -6239,6 +8260,14 @@ declare class HideAtDirective {
6239
8260
  private templateRef;
6240
8261
  private viewContainerRef;
6241
8262
  private breakpointService;
8263
+ private visible;
8264
+ /**
8265
+ * Attribute usage (`hideAt` on a real element) toggles `display` so the
8266
+ * element stays in the DOM and remains eligible for content projection.
8267
+ * Structural usage (`*hideAt`) creates/clears the view instead and leaves
8268
+ * `display` untouched (returns `null`).
8269
+ */
8270
+ protected hostDisplay: _angular_core.Signal<"none" | null>;
6242
8271
  constructor();
6243
8272
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<HideAtDirective, never>;
6244
8273
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<HideAtDirective, "[hideAt]", never, { "hideAt": { "alias": "hideAt"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
@@ -6249,6 +8278,14 @@ declare class ShowAtDirective {
6249
8278
  private templateRef;
6250
8279
  private viewContainerRef;
6251
8280
  private breakpointService;
8281
+ private visible;
8282
+ /**
8283
+ * Attribute usage (`showAt` on a real element) toggles `display` so the
8284
+ * element stays in the DOM and remains eligible for content projection.
8285
+ * Structural usage (`*showAt`) creates/clears the view instead and leaves
8286
+ * `display` untouched (returns `null`).
8287
+ */
8288
+ protected hostDisplay: _angular_core.Signal<"none" | null>;
6252
8289
  constructor();
6253
8290
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ShowAtDirective, never>;
6254
8291
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ShowAtDirective, "[showAt]", never, { "showAt": { "alias": "showAt"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
@@ -6291,6 +8328,52 @@ declare const TEDI_THEME_DEFAULT_TOKEN: InjectionToken<string>;
6291
8328
 
6292
8329
  declare const TEDI_TRANSLATION_DEFAULT_TOKEN: InjectionToken<Language>;
6293
8330
 
6294
- export { AVAILABLE_LANGUAGES, AccordionComponent, AccordionItemComponent, AccordionItemContentComponent, AccordionItemHeaderComponent, AlertComponent, BREAKPOINTS, BaseButtonDirective, BreakpointService, ButtonComponent, CarouselComponent, CarouselContentComponent, CarouselFooterComponent, CarouselHeaderComponent, CarouselIndicatorsComponent, CarouselNavigationComponent, CarouselSlideDirective, CheckboxCardComponent, CheckboxCardGroupComponent, CheckboxComponent, CheckboxGroupComponent, ClosingButtonComponent, ColComponent, CollapseButtonComponent, CollapseComponent, DROPDOWN_API, DROPDOWN_CONTENT_API, DatePickerComponent, DropdownComponent, DropdownContentComponent, DropdownItemComponent, DropdownItemValueComponent, DropdownItemValueLabelComponent, DropdownItemValueMetaComponent, DropdownTriggerDirective, EllipsisComponent, EmptyStateComponent, FeedbackTextComponent, FilterComponent, FilterContentDirective, FilterGroupComponent, FilterPrependDirective, FooterBodyComponent, FooterBottomComponent, FooterComponent, FooterSectionComponent, FooterSideComponent, FormFieldComponent, HeaderActionsComponent, HeaderComponent, HeaderContentComponent, HeaderLanguageComponent, HeaderLoginComponent, HeaderLogoutComponent, HeaderProfileComponent, HeaderRoleComponent, HideAtDirective, HorizontalStepperComponent, HorizontalStepperItemComponent, IconComponent, InfoButtonComponent, LANGUAGE_COOKIE_NAME, LANGUAGE_FALLBACK_VALUE, LabelComponent, LinkComponent, ListComponent, MODAL_DATA, MODAL_SIZE, ModalComponent, ModalContentComponent, ModalFooterComponent, ModalHeaderComponent, ModalRef, ModalService, NumberFieldComponent, PaginationComponent, PopoverComponent, PopoverContentComponent, PopoverTriggerDirective, RadioCardComponent, RadioCardGroupComponent, RadioComponent, RadioGroupComponent, RowComponent, ScrollFadeComponent, SelectComponent, SelectOptionTemplateDirective, SelectValueTemplateDirective, SeparatorComponent, ShowAtDirective, SideNavComponent, SideNavDropdownComponent, SideNavDropdownGroupComponent, SideNavDropdownItemComponent, SideNavGroupTitleComponent, SideNavItemComponent, SideNavOverlayComponent, SideNavToggleComponent, SpecialOptionControls, SpinnerComponent, StatusBadgeComponent, StatusIndicatorComponent, TEDI_FORM_FIELD_CONTROL, TEDI_TABLE_CONTEXT, TEDI_THEME_DEFAULT_TOKEN, TEDI_TRANSLATION_DEFAULT_TOKEN, THEME_CLASS_PREFIX, THEME_COOKIE_NAME, THEME_FALLBACK_VALUE, TOAST_DEFAULT_DURATION, TagComponent, TediPaginationResultsDirective, TediTableColumnsMenuComponent, TediTableComponent, TediTableHeaderButtonComponent, TediTableToolbarComponent, TediTranslationPipe, TediTranslationService, TextComponent, TextFieldComponent, TextGroupComponent, TextGroupLabelComponent, TextGroupValueComponent, ThemeService, TimeFieldComponent, TimePickerComponent, TimelineComponent, TimelineDescriptionComponent, TimelineItemComponent, TimelineTitleComponent, ToastComponent, ToastService, ToggleComponent, TooltipComponent, TooltipContentComponent, TooltipTriggerComponent, VerticalSpacingDirective, VerticalSpacingItemDirective, breakpointInput, createTablePersistence, generateUUID, groupRowSpan, injectTediTableContext, provideTedi, usePagination };
6295
- export type { AlertRole, AlertTitleType, AlertType, AlertVariant, AlignItems, AlignSelf, ArrowType, Breakpoint, BreakpointFlag, BreakpointInput, BreakpointInputs, BreakpointInputsWithoutSignals, BreakpointObject, BulletColor, ButtonSize, ButtonVariant, CarouselIndicatorsVariant, CheckboxCardVariant, CheckboxGroupDirection, CheckboxSize, ClosingButtonIconSize, ClosingButtonSize, ColInputs, ColWidth, CollapseButtonArrowType, CollapseButtonSize, CollapseSize, Cols, ColumnReorderPhase, CompareWithFn, ComponentInputs, DatePickerDay, DatePickerInputSize, DatePickerInputState, DatePickerMatcher, DatePickerSelectorMode, DatePickerView, DropdownApi, DropdownContentApi, DropdownItemValueLayout, DropdownItemValueType, DropdownPosition, DropdownRole, DropdownTriggerAriaHasPopup, EllipsisPosition, EmptyStateSize, EmptyStateType, FeedbackTextPosition, FeedbackTextType, FilterOption, FilterSize, FilterVariant, FooterSidePlacement, FooterSidePosition, FormFieldControl, FormFieldIcon, Gap, GroupByFn, HeaderLanguage, HorizontalStepperBackground, IconBackgroundColor, IconColor, IconSize, IconType, IconVariant, InputSize, InputState, JustifyItems, JustifySelf, LabelColor, LabelSize, Language, LinkInputs, LinkSize, LinkVariant, ModalConfig, ModalFullscreen, ModalPosition, ModalScrollBehavior, ModalSize, ModalWidth, ModalWidthPreset, NumberFieldSize, PaginationBackground, PaginationDividerPosition, PaginationItem, PaginationItemType, PaginationLabels, PaginationVisibility, PopoverPosition, PopoverWidth, RadioCardVariant, RadioGroupDirection, RadioSize, Representative, RowInputs, ScrollFadePosition, ScrollFadeScrollbar, ScrollFadeSize, SelectInputSize, SelectOption, SelectOptionContext, SelectOptionGroup, SelectValueContext, SeparatorAxis, SeparatorColor, SeparatorDotSize, SeparatorSpacing, SeparatorSpacingValue, SeparatorThickness, SeparatorVariant, SideNavItemSize, SpinnerColor, SpinnerSize, StatusBadgeColor, StatusBadgeSize, StatusBadgeStatus, StatusBadgeVariant, StatusIndicatorPosition, StatusIndicatorSize, StatusIndicatorType, TEDITheme, TableColumnMeta, TableExpandTrigger, TableFilterOptions, TablePaginationOptions, TablePersistOptions, TablePersistenceController, TableSelectionMode, TableSize, TableState, TableStatePatch, TagEllipsis, TagType, TediColumnDef, TediConfig, TediTableContextValue, TediTableFilterContext, TextColor, TextGroupInputs, TextGroupType, TextModifiers, Theme, TimeFieldFullscreen, TimeFieldModal, TimeFieldPickerTrigger, TimeFieldPickerVariant, TimeFieldUseNativePicker, TimePickerVariant, ToastConfig, ToastPosition, ToastRole, ToastType, ToggleSize, ToggleType, ToggleVariant, TooltipOpenWith, TooltipPosition, TooltipWidth, UsePaginationArgs, VerticalSpacingSize };
8331
+ declare function cookieSignal<T>(key: string, initialValue: T): _angular_core.WritableSignal<T>;
8332
+
8333
+ declare function getFocusableElements(container: HTMLElement): HTMLElement[];
8334
+
8335
+ /** Horizontal gap (px) between tags in a single row. */
8336
+ declare const TAG_GAP = 8;
8337
+ /** Reserved width (px) for the "+N" counter tag. */
8338
+ declare const COUNTER_TAG_WIDTH = 40;
8339
+ interface TagOverflowOptions {
8340
+ /** Gap between adjacent tags. Defaults to {@link TAG_GAP}. */
8341
+ gap?: number;
8342
+ /** Width reserved for the "+N" counter tag. Defaults to {@link COUNTER_TAG_WIDTH}. */
8343
+ counterWidth?: number;
8344
+ }
8345
+ /**
8346
+ * Given the measured widths of single-row tags and the available width, returns
8347
+ * how many tags fit before the overflow collapses into a "+N" counter.
8348
+ *
8349
+ * Space for the counter is reserved while more tags remain, so the counter
8350
+ * stays visible. At least one tag is always shown when any exist, even if it
8351
+ * overflows on its own.
8352
+ */
8353
+ declare function calculateVisibleTagCount(tagWidths: readonly number[], availableWidth: number, { gap, counterWidth }?: TagOverflowOptions): number;
8354
+
8355
+ /**
8356
+ * Checks if a string is a valid `HH:mm` time (00:00 – 23:59).
8357
+ */
8358
+ declare function isValidTime(time: string | null | undefined): boolean;
8359
+ /**
8360
+ * Normalizes common typing patterns into `HH:mm`.
8361
+ *
8362
+ * Returns:
8363
+ * - the canonical `HH:mm` string when the input can be normalized
8364
+ * - `""` when the input is empty
8365
+ * - `null` when the input is non-empty but cannot be normalized
8366
+ *
8367
+ * Examples:
8368
+ * `"9:5"` → `"09:05"`
8369
+ * `"14:5"` → `"14:05"`
8370
+ * `"2359"` → `"23:59"`
8371
+ * `"930"` → `"09:30"`
8372
+ * `"11.55"` / `"11-55"` → `"11:55"` (any non-digit treated as separator)
8373
+ * `"4:89"` / `"24:00"` → `null`
8374
+ */
8375
+ declare function normalizeTime(input: string): string | null;
8376
+
8377
+ export { AVAILABLE_LANGUAGES, AccordionComponent, AccordionItemComponent, AccordionItemContentComponent, AccordionItemHeaderComponent, AlertComponent, AttachmentActionsComponent, AttachmentComponent, BREAKPOINTS, BaseButtonDirective, BreakpointService, ButtonComponent, ButtonGroupButtonDirective, ButtonGroupComponent, COUNTER_TAG_WIDTH, CalendarComponent, CardButtonComponent, CardComponent, CardContentComponent, CardHeaderComponent, CardIconComponent, CardRowComponent, CarouselComponent, CarouselContentComponent, CarouselFooterComponent, CarouselHeaderComponent, CarouselIndicatorsComponent, CarouselNavigationComponent, CarouselSlideDirective, CheckboxCardComponent, CheckboxCardGroupComponent, CheckboxComponent, CheckboxGroupComponent, ClosingButtonComponent, ColComponent, CollapseButtonComponent, CollapseComponent, DROPDOWN_API, DROPDOWN_CONTENT_API, DateFieldComponent, DatePickerComponent, DropdownComponent, DropdownContentComponent, DropdownItemComponent, DropdownItemValueComponent, DropdownItemValueLabelComponent, DropdownItemValueMetaComponent, DropdownTriggerDirective, EllipsisComponent, EmptyStateComponent, FeedbackTextComponent, FilterComponent, FilterContentDirective, FilterGroupComponent, FilterPrependDirective, FooterBodyComponent, FooterBottomComponent, FooterComponent, FooterSectionComponent, FooterSideComponent, FormFieldComponent, HeaderActionsComponent, HeaderBottomComponent, HeaderComponent, HeaderContentComponent, HeaderLanguageComponent, HeaderLoginComponent, HeaderLogoComponent, HeaderLogoDarkDirective, HeaderLogoutComponent, HeaderMobileButtonComponent, HeaderProfileComponent, HeaderRoleComponent, HeaderRoleContentDirective, HeaderRoleNoResultsDirective, HeaderRoleTitleDirective, HeaderSearchComponent, HideAtDirective, HorizontalPushHandler, HorizontalStepperComponent, HorizontalStepperItemComponent, IconComponent, InfoButtonComponent, LANGUAGE_COOKIE_NAME, LANGUAGE_FALLBACK_VALUE, LabelComponent, LinkComponent, ListComponent, MODAL_DATA, MODAL_SIZE, ModalComponent, ModalContentComponent, ModalFooterComponent, ModalHeaderComponent, ModalRef, ModalService, NumberFieldComponent, PaginationComponent, PopoverComponent, PopoverContentComponent, PopoverTriggerDirective, ProgressBarComponent, RadioCardComponent, RadioCardGroupComponent, RadioComponent, RadioGroupComponent, RowComponent, ScrollFadeComponent, SelectComponent, SelectOptionTemplateDirective, SelectValueTemplateDirective, SeparatorComponent, ShowAtDirective, SideNavComponent, SideNavDropdownComponent, SideNavDropdownGroupComponent, SideNavDropdownItemComponent, SideNavGroupTitleComponent, SideNavItemComponent, SideNavOverlayComponent, SideNavToggleComponent, SpecialOptionControls, SpinnerComponent, StatusBadgeComponent, StatusIndicatorComponent, TAG_GAP, TEDI_FORM_FIELD_CONTROL, TEDI_TABLE_CONTEXT, TEDI_THEME_DEFAULT_TOKEN, TEDI_TRANSLATION_DEFAULT_TOKEN, THEME_CLASS_PREFIX, THEME_COOKIE_NAME, THEME_FALLBACK_VALUE, TOAST_DEFAULT_DURATION, TagComponent, TediPaginationResultsDirective, TediTableColumnsMenuComponent, TediTableComponent, TediTableHeaderButtonComponent, TediTableToolbarComponent, TediTranslationPipe, TediTranslationService, TextComponent, TextFieldComponent, TextGroupComponent, TextGroupLabelComponent, TextGroupValueComponent, ThemeService, TimeFieldComponent, TimePickerComponent, TimelineComponent, TimelineDescriptionComponent, TimelineItemComponent, TimelineTimingsBottomDirective, TimelineTitleComponent, ToastComponent, ToastService, ToggleComponent, TooltipComponent, TooltipContentComponent, TooltipTriggerComponent, VerticalSpacingDirective, VerticalSpacingItemDirective, addDays, addMonths, addYears, breakpointInput, buildMonthGrid, calculateArrowOffset, calculateVisibleTagCount, computeGroupSpans, cookieSignal, createTablePersistence, endOfMonth, formatDate, formatLocaleDate, formatLocaleDateHint, formatLocaleDateLong, formatMonthYear, generateUUID, getCardBorderPlacementColor, getDaysInMonth, getFirstDayOfWeek, getFocusableElements, getISOWeek, getMonthNames, getPaddingCssVariables, getPlacementFromPositionChange, getWeekdayNames, groupRowSpan, injectTediTableContext, isAfterDay, isBeforeDay, isDateInRange, isSameDay, isSameMonth, isSameYear, isValidTime, matchAny, matchDate, normalizeTime, parseDate, parseLocaleDate, provideTedi, resolveCardBorderRadius, startOfMonth, startOfWeek, toConnectedPositions, toggleDateInArray, usePagination };
8378
+ export type { AlertRole, AlertTitleType, AlertType, AlertVariant, AlignItems, AlignSelf, ArrowOffset, ArrowType, AttachmentDirection, Breakpoint, BreakpointFlag, BreakpointInput, BreakpointInputs, BreakpointInputsWithoutSignals, BreakpointObject, BulletColor, ButtonGroupDropdownLabelMode, ButtonSize, ButtonVariant, CalendarView, CardBackground, CardBorderPlacement, CardBorderRadius, CardBorderType, CardContentInputs, CardIconSize, CardIconType, CardInputs, CardPadding, CardPaddingNumber, CardResolvedCorners, CarouselIndicatorsVariant, CheckboxCardVariant, CheckboxGroupDirection, CheckboxSize, ClosingButtonIconSize, ClosingButtonSize, ColInputs, ColWidth, CollapseButtonArrowType, CollapseButtonSize, CollapseSize, Cols, ColumnReorderPhase, CompareWithFn, ComponentInputs, DateAfter, DateBefore, DateFieldMode, DateInterval, DatePickerDay, DatePickerInputSize, DatePickerInputState, DatePickerMatcher, DatePickerSelectorMode, DatePickerView, DateRange, DayOfWeek, DropdownApi, DropdownContentApi, DropdownItemValueLayout, DropdownItemValueType, DropdownPosition, DropdownRole, DropdownTriggerAriaHasPopup, EllipsisPosition, EmptyStateSize, EmptyStateType, FeedbackTextPosition, FeedbackTextType, FilterOption, FilterSize, FilterVariant, FooterSidePlacement, FooterSidePosition, FormFieldControl, FormFieldIcon, Gap, GroupByFn, HeaderContentAlignment, HeaderLanguage, HeaderLoginInputs, HeaderLoginSize, HeaderLogoutInputs, HeaderLogoutSize, HeaderProfileInputs, HeaderProfileSize, HeaderSearchMobileLabels, HeaderSearchMobileVariant, HorizontalStepperBackground, IconBackgroundColor, IconColor, IconSize, IconType, IconVariant, InputSize, InputState, JustifyItems, JustifySelf, LabelColor, LabelSize, Language, LinkInputs, LinkSize, LinkVariant, Matcher, ModalConfig, ModalFullscreen, ModalPosition, ModalScrollBehavior, ModalSize, ModalWidth, ModalWidthPreset, NumberFieldSize, OverlayPosition, OverlaySide, PaginationBackground, PaginationDividerPosition, PaginationItem, PaginationItemType, PaginationLabels, PaginationVisibility, PopoverPosition, PopoverWidth, ProgressBarInputs, ProgressBarLabelPosition, ProgressBarSize, ProgressBarValuePosition, RadioCardVariant, RadioGroupDirection, RadioSize, Representative, RepresentativeIcon, RowInputs, ScrollFadePosition, ScrollFadeScrollbar, ScrollFadeSize, SelectInputSize, SelectOption, SelectOptionContext, SelectOptionGroup, SelectValueContext, SeparatorAxis, SeparatorColor, SeparatorDotSize, SeparatorSpacing, SeparatorSpacingValue, SeparatorThickness, SeparatorVariant, SideNavItemSize, SpinnerColor, SpinnerSize, StatusBadgeColor, StatusBadgeSize, StatusBadgeStatus, StatusBadgeVariant, StatusIndicatorPosition, StatusIndicatorSize, StatusIndicatorType, TEDITheme, TableColumnMeta, TableControlColumn, TableExpandTrigger, TableFilterOptions, TablePaginationOptions, TablePersistOptions, TablePersistenceController, TableSelectionMode, TableSize, TableState, TableStatePatch, TagEllipsis, TagOverflowOptions, TagType, TediColumnDef, TediConfig, TediTableContextValue, TediTableFilterContext, TextColor, TextGroupInputs, TextGroupType, TextModifiers, Theme, TimeFieldFullscreen, TimeFieldModal, TimeFieldPickerTrigger, TimeFieldPickerVariant, TimeFieldUseNativePicker, TimePickerVariant, TimelineCardPadding, TimelineVariant, ToastConfig, ToastPosition, ToastRole, ToastType, ToggleSize, ToggleType, ToggleVariant, TooltipOpenWith, TooltipPosition, TooltipWidth, UsePaginationArgs, VerticalSpacingSize };
6296
8379
  //# sourceMappingURL=index.d.ts.map