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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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;
@@ -3346,6 +4411,13 @@ declare class DropdownItemComponent {
3346
4411
  readonly value: _angular_core.InputSignal<string | undefined>;
3347
4412
  /** Is item disabled? */
3348
4413
  readonly disabled: _angular_core.InputSignal<boolean>;
4414
+ /**
4415
+ * Whether the item's label clips overflowing content (for text ellipsis).
4416
+ * Set `false` when projecting content with decorations that intentionally
4417
+ * sit outside the line box, e.g. status indicator.
4418
+ * @default true
4419
+ */
4420
+ readonly clipContent: _angular_core.InputSignal<boolean>;
3349
4421
  /**
3350
4422
  * Whether selecting this item closes the dropdown. Set `false` for items
3351
4423
  * that should keep the dropdown open after selection (e.g. multi-select
@@ -3367,10 +4439,11 @@ declare class DropdownItemComponent {
3367
4439
  isSelected(): boolean;
3368
4440
  focus(): void;
3369
4441
  onClick(): void;
4442
+ onMousedown(event: MouseEvent): void;
3370
4443
  onKeydown(event: KeyboardEvent): void;
3371
4444
  private onItemSelect;
3372
4445
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DropdownItemComponent, never>;
3373
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DropdownItemComponent, "li[tedi-dropdown-item]", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "closeOnSelect": { "alias": "closeOnSelect"; "required": false; "isSignal": true; }; }, { "itemSelect": "itemSelect"; }, ["customItemValue"], ["tedi-dropdown-item-value", "*"], true, never>;
4446
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DropdownItemComponent, "li[tedi-dropdown-item]", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "clipContent": { "alias": "clipContent"; "required": false; "isSignal": true; }; "closeOnSelect": { "alias": "closeOnSelect"; "required": false; "isSignal": true; }; }, { "itemSelect": "itemSelect"; }, ["customItemValue"], ["tedi-dropdown-item-value", "*"], true, never>;
3374
4447
  }
3375
4448
 
3376
4449
  type DropdownRole = "menu" | "listbox";
@@ -3380,6 +4453,7 @@ declare class DropdownContentComponent {
3380
4453
  * @default menu
3381
4454
  */
3382
4455
  readonly dropdownRole: _angular_core.InputSignal<DropdownRole>;
4456
+ readonly host: ElementRef<HTMLElement>;
3383
4457
  private readonly dropdownApi;
3384
4458
  readonly containerId: _angular_core.Signal<string>;
3385
4459
  readonly items: _angular_core.Signal<readonly DropdownItemComponent[]>;
@@ -3387,26 +4461,25 @@ declare class DropdownContentComponent {
3387
4461
  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
4462
  }
3389
4463
 
3390
- type DropdownPosition = `${NgxFloatUiPlacements}`;
3391
- declare class DropdownComponent implements AfterContentChecked, OnDestroy {
4464
+ type DropdownPosition = OverlayPosition;
4465
+ declare class DropdownComponent implements OnDestroy {
3392
4466
  /** Current value of dropdown (used with listbox) */
3393
4467
  readonly value: _angular_core.ModelSignal<string | undefined>;
3394
4468
  /**
3395
4469
  * The position of the dropdown relative to the trigger element.
3396
4470
  * @default bottom-start
3397
4471
  */
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">;
4472
+ readonly position: _angular_core.InputSignal<OverlayPosition>;
3399
4473
  /**
3400
4474
  * Should position to opposite direction when overflowing screen?
3401
4475
  * @default true
3402
4476
  */
3403
4477
  readonly preventOverflow: _angular_core.InputSignal<boolean>;
3404
4478
  /**
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 ""
4479
+ * Gap in px between the trigger and the dropdown panel.
4480
+ * @default 4
3408
4481
  */
3409
- readonly appendTo: _angular_core.InputSignal<string>;
4482
+ readonly offset: _angular_core.InputSignal<number>;
3410
4483
  /**
3411
4484
  * Does the dropdown hide when the page scrolls?
3412
4485
  * @default false
@@ -3414,23 +4487,32 @@ declare class DropdownComponent implements AfterContentChecked, OnDestroy {
3414
4487
  readonly hideOnScroll: _angular_core.InputSignal<boolean>;
3415
4488
  readonly dropdownTrigger: _angular_core.Signal<DropdownTriggerDirective>;
3416
4489
  readonly dropdownContent: _angular_core.Signal<DropdownContentComponent>;
3417
- readonly floatUiComponent: _angular_core.Signal<NgxFloatUiContentComponent>;
3418
4490
  private readonly activeIndex;
3419
4491
  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>;
4492
+ readonly isOpen: _angular_core.WritableSignal<boolean>;
4493
+ readonly triggerWidth: _angular_core.WritableSignal<number | null>;
4494
+ readonly overlayOrigin: _angular_core.Signal<_angular_cdk_overlay.CdkOverlayOrigin>;
4495
+ readonly overlayPositions: _angular_core.Signal<{
4496
+ offsetX: number | undefined;
4497
+ offsetY: number | undefined;
4498
+ originX: "start" | "center" | "end";
4499
+ originY: "top" | "center" | "bottom";
4500
+ overlayX: "start" | "center" | "end";
4501
+ overlayY: "top" | "center" | "bottom";
4502
+ weight?: number;
4503
+ panelClass?: string | string[];
4504
+ }[]>;
4505
+ readonly triggerWidthVar: _angular_core.Signal<string | null>;
3423
4506
  private readonly platformId;
3424
4507
  private readonly document;
3425
4508
  private readonly renderer;
3426
4509
  private scrollListener?;
3427
4510
  constructor();
3428
4511
  ngOnDestroy(): void;
3429
- ngAfterContentChecked(): void;
3430
- showDropdown(): void;
4512
+ showDropdown(initialFocus?: "selected" | "first" | "last"): void;
3431
4513
  hideDropdown(): void;
3432
4514
  toggleDropdown(): void;
3433
- handleOutsideClick: (event: Event) => void;
4515
+ onOutsideClick(): void;
3434
4516
  handleFocusOut: (event: FocusEvent) => void;
3435
4517
  tabOutOfDropdown(shiftKey: boolean): void;
3436
4518
  focusFirstItem(): void;
@@ -3446,7 +4528,7 @@ declare class DropdownComponent implements AfterContentChecked, OnDestroy {
3446
4528
  private getNextEnabledIndex;
3447
4529
  private getPrevEnabledIndex;
3448
4530
  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>;
4531
+ 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
4532
  }
3451
4533
 
3452
4534
  type FilterVariant = "primary" | "secondary";
@@ -3537,12 +4619,6 @@ declare class FilterComponent implements ControlValueAccessor {
3537
4619
  * @default false
3538
4620
  */
3539
4621
  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
4622
  /**
3547
4623
  * Whether the filter is disabled. Also set automatically when used with a disabled FormControl
3548
4624
  * or when nested in a disabled FilterGroup.
@@ -3614,7 +4690,7 @@ declare class FilterComponent implements ControlValueAccessor {
3614
4690
  private setActiveOption;
3615
4691
  private getTabStops;
3616
4692
  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>;
4693
+ 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
4694
  }
3619
4695
 
3620
4696
  declare class FilterContentDirective {
@@ -3930,6 +5006,402 @@ declare class RadioCardGroupComponent {
3930
5006
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<RadioCardGroupComponent, "tedi-radio-card-group", never, { "grouped": { "alias": "grouped"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
3931
5007
  }
3932
5008
 
5009
+ type EllipsisPosition = "start" | "end";
5010
+ declare class EllipsisComponent {
5011
+ /** Maximum number of lines before truncating. End (multi-line) only. */
5012
+ readonly lineClamp: _angular_core.InputSignal<number>;
5013
+ /** Whether truncated content shows a hover/focus tooltip with full text. */
5014
+ readonly tooltip: _angular_core.InputSignal<boolean>;
5015
+ /** Ellipsis position. 'start' = leading, single-line. 'end' = trailing, multi-line. */
5016
+ readonly position: _angular_core.InputSignal<EllipsisPosition>;
5017
+ readonly content: _angular_core.Signal<ElementRef<HTMLElement> | undefined>;
5018
+ readonly isEllipsed: _angular_core.WritableSignal<boolean>;
5019
+ readonly fullText: _angular_core.WritableSignal<string>;
5020
+ constructor();
5021
+ readonly contentClasses: _angular_core.Signal<string>;
5022
+ readonly clampStyle: _angular_core.Signal<string | null>;
5023
+ private updateEllipsedState;
5024
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EllipsisComponent, never>;
5025
+ 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>;
5026
+ }
5027
+
5028
+ type TagType = "primary" | "secondary" | "danger";
5029
+ type TagEllipsis = "start" | "end" | false;
5030
+ declare class TagComponent {
5031
+ readonly idGenerator: _IdGenerator;
5032
+ readonly uniqueId: string;
5033
+ /**
5034
+ * Whether the tag is in loading state.
5035
+ * When true, a spinner will be displayed inside the tag.
5036
+ * @default false
5037
+ */
5038
+ loading: _angular_core.InputSignal<boolean>;
5039
+ /**
5040
+ * Whether the tag can be closed.
5041
+ * When true, a close button will be displayed that emits the 'closed' event when clicked.
5042
+ * @default false
5043
+ */
5044
+ closable: _angular_core.InputSignal<boolean>;
5045
+ /**
5046
+ * The visual style of the tag.
5047
+ * Possible values: 'primary', 'secondary', 'danger'
5048
+ * @default "primary"
5049
+ */
5050
+ type: _angular_core.InputSignal<TagType>;
5051
+ /**
5052
+ * Which end the label truncates from when it doesn't fit. `false` (default)
5053
+ * never truncates — the label wraps and the tag keeps its full width. `end`
5054
+ * shows an ellipsis at the end (`Long label…`); `start` shows it at the start
5055
+ * (`…label`), which keeps the most significant part of values like dates
5056
+ * visible. Truncation only kicks in when the tag is width-constrained, and the
5057
+ * full label is revealed in a tooltip on hover/focus.
5058
+ * @default false
5059
+ */
5060
+ ellipsis: _angular_core.InputSignal<TagEllipsis>;
5061
+ /**
5062
+ * Event emitted when the close button is clicked.
5063
+ */
5064
+ closed: _angular_core.OutputEmitterRef<Event>;
5065
+ classes: _angular_core.Signal<string>;
5066
+ ellipsisPosition: _angular_core.Signal<EllipsisPosition>;
5067
+ handleClose(event: Event): void;
5068
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TagComponent, never>;
5069
+ 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>;
5070
+ }
5071
+
5072
+ interface DateInputTag {
5073
+ id: string;
5074
+ label: string;
5075
+ }
5076
+ declare class DateInputComponent implements AfterViewChecked {
5077
+ readonly inputId: _angular_core.InputSignal<string>;
5078
+ readonly value: _angular_core.InputSignal<string>;
5079
+ readonly tags: _angular_core.InputSignal<readonly DateInputTag[]>;
5080
+ readonly mode: _angular_core.InputSignal<DateFieldMode>;
5081
+ /**
5082
+ * Multiple mode: when `true` (default) the tags wrap to multiple rows and the
5083
+ * field grows in height. When `false` the tags stay on a single row and the
5084
+ * overflow collapses into a "+N" counter tag.
5085
+ */
5086
+ readonly multiRow: _angular_core.InputSignal<boolean>;
5087
+ /** Which end the tag labels truncate from when they don't fit (`false` = no truncation). */
5088
+ readonly ellipsis: _angular_core.InputSignal<TagEllipsis>;
5089
+ /** Whether the tags show a remove (close) button. */
5090
+ readonly removable: _angular_core.InputSignal<boolean>;
5091
+ readonly placeholder: _angular_core.InputSignal<string>;
5092
+ readonly disabled: _angular_core.InputSignal<boolean>;
5093
+ readonly readOnly: _angular_core.InputSignal<boolean>;
5094
+ readonly required: _angular_core.InputSignal<boolean>;
5095
+ readonly iconActive: _angular_core.InputSignal<boolean>;
5096
+ readonly iconDisabled: _angular_core.InputSignal<boolean>;
5097
+ readonly useNativePicker: _angular_core.InputSignal<boolean>;
5098
+ readonly nativeIsoValue: _angular_core.InputSignal<string>;
5099
+ readonly clearable: _angular_core.InputSignal<boolean>;
5100
+ readonly inputChange: _angular_core.OutputEmitterRef<string>;
5101
+ readonly iconClick: _angular_core.OutputEmitterRef<void>;
5102
+ readonly tagRemove: _angular_core.OutputEmitterRef<string>;
5103
+ readonly clear: _angular_core.OutputEmitterRef<void>;
5104
+ private readonly translationService;
5105
+ private readonly ngZone;
5106
+ private readonly inputElement;
5107
+ private readonly fieldElement;
5108
+ private readonly tagElements;
5109
+ /** Number of tags that fit on a single row; `null` until measured. */
5110
+ readonly visibleTagsCount: _angular_core.WritableSignal<number | null>;
5111
+ constructor();
5112
+ ngAfterViewChecked(): void;
5113
+ onResize(): void;
5114
+ readonly hasTags: _angular_core.Signal<boolean>;
5115
+ readonly visibleTags: _angular_core.Signal<readonly DateInputTag[]>;
5116
+ readonly hiddenTagsCount: _angular_core.Signal<number>;
5117
+ readonly inputType: _angular_core.Signal<"date" | "text">;
5118
+ readonly inputValue: _angular_core.Signal<string>;
5119
+ readonly showClear: _angular_core.Signal<boolean>;
5120
+ readonly iconAriaLabel: _angular_core.Signal<string>;
5121
+ readonly clearAriaLabel: _angular_core.Signal<string>;
5122
+ handleInput(event: Event): void;
5123
+ handleIconClick(): void;
5124
+ handleTagRemove(id: string): void;
5125
+ handleClear(): void;
5126
+ private calculateVisibleTags;
5127
+ private getAvailableTagWidth;
5128
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DateInputComponent, never>;
5129
+ 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>;
5130
+ }
5131
+
5132
+ /**
5133
+ * Interface implemented by controls that can be used inside `tedi-form-field`.
5134
+ * Allows the form field container to interact with the underlying control.
5135
+ */
5136
+ interface FormFieldControl<T = unknown> {
5137
+ /**
5138
+ * Current value of the control.
5139
+ */
5140
+ value: Signal<T>;
5141
+ /**
5142
+ * Whether the control is disabled.
5143
+ */
5144
+ disabled: Signal<boolean>;
5145
+ /** Reactive invalid state (driven by FormField) */
5146
+ invalid: Signal<boolean>;
5147
+ /** Called by FormField to update invalid state */
5148
+ setInvalidState(isInvalid: boolean): void;
5149
+ /**
5150
+ * Optional method used by the form field clear button.
5151
+ * If implemented, the form field can trigger clearing the value.
5152
+ */
5153
+ clearField?(): void;
5154
+ }
5155
+ /**
5156
+ * Injection token used by `tedi-form-field` to obtain
5157
+ * the associated control instance.
5158
+ */
5159
+ declare const TEDI_FORM_FIELD_CONTROL: InjectionToken<FormFieldControl<unknown>>;
5160
+
5161
+ type DateFieldValue = Date | Date[] | DateRange | null;
5162
+ type DateFieldFormatter = (value: DateFieldValue) => string;
5163
+ type DateFieldParser = (value: string) => DateFieldValue | undefined;
5164
+ type DayAvailabilityInput = Date[] | ((d: Date) => boolean) | undefined;
5165
+ type MonthPredicate = (month: Date) => boolean;
5166
+ type YearPredicate = (year: Date) => boolean;
5167
+ type DateFieldCalendarTrigger = "input" | "button";
5168
+ type DateFieldModalInput = boolean | "sm" | "md" | "lg" | "xl";
5169
+ type DateFieldUseNativePicker = boolean | "sm" | "md" | "lg" | "xl";
5170
+ type DateFieldSize = "default" | "small";
5171
+ declare class DateFieldComponent implements ControlValueAccessor, FormFieldControl<DateFieldValue> {
5172
+ /**
5173
+ * Unique ID for label association and accessibility. Bind the sibling
5174
+ * `<label tedi-label [for]>` to the same value.
5175
+ */
5176
+ readonly inputId: _angular_core.InputSignal<string>;
5177
+ /**
5178
+ * The selected value (two-way / `ControlValueAccessor`). Shape follows `mode`:
5179
+ * `single` → `Date | null`, `multiple` → `Date[]`, `range` → `{ from, to }`.
5180
+ */
5181
+ readonly value: _angular_core.ModelSignal<DateFieldValue>;
5182
+ /**
5183
+ * Selection mode. `single` selects one date, `multiple` toggles dates in an
5184
+ * array (rendered as tags), `range` builds a `{ from, to }` range across two
5185
+ * clicks.
5186
+ */
5187
+ readonly mode: _angular_core.InputSignal<DateFieldMode>;
5188
+ /**
5189
+ * `multiple` mode tag layout. `true` (default) wraps tags across rows and
5190
+ * grows the field height; `false` keeps a single row and collapses overflow
5191
+ * into a "+N" counter.
5192
+ */
5193
+ readonly multiRow: _angular_core.InputSignal<boolean>;
5194
+ /**
5195
+ * Which end the `multiple`-mode tags truncate from when a label doesn't fit.
5196
+ * `false` (default) never truncates; `end` → `05.06…`; `start` → `…06.2026`
5197
+ * (keeps the year visible).
5198
+ */
5199
+ readonly tagEllipsis: _angular_core.InputSignal<TagEllipsis>;
5200
+ /**
5201
+ * Whether `multiple`-mode tags show a remove button. `true` (default) lets
5202
+ * users remove a selected date by closing its tag; `false` renders them as
5203
+ * read-only chips.
5204
+ */
5205
+ readonly isTagRemovable: _angular_core.InputSignal<boolean>;
5206
+ /** Placeholder rendered in the input when there is no value. */
5207
+ readonly placeholder: _angular_core.InputSignal<string>;
5208
+ /**
5209
+ * Disables specific days via matchers (does not disable the whole field).
5210
+ * Accepts a `Date`, `Date[]`, `{ before }`, `{ after }`, `{ from, to? }`,
5211
+ * `{ dayOfWeek: number[] }`, or a `(date) => boolean` predicate (single or
5212
+ * array). Named `disabledMatchers` (not `disabled`) so it doesn't clash with
5213
+ * `FormControlDirective`'s boolean `disabled` when used with `[formControl]`.
5214
+ */
5215
+ readonly disabledMatchers: _angular_core.InputSignal<Matcher | Matcher[] | undefined>;
5216
+ /** Disables the field entirely — text input, icon button, and calendar. */
5217
+ readonly inputDisabled: _angular_core.InputSignal<boolean>;
5218
+ /**
5219
+ * Blocks typing into the input but leaves the calendar interactive — useful
5220
+ * for guided picking.
5221
+ */
5222
+ readonly readOnly: _angular_core.InputSignal<boolean>;
5223
+ /**
5224
+ * Marks the input as required (sets the native `required` attribute). In
5225
+ * `multiple` mode it also prevents clearing the last selected date. The
5226
+ * asterisk indicator lives on the sibling `<label tedi-label [required]>` —
5227
+ * bind it there too, since DateField owns no label.
5228
+ */
5229
+ readonly required: _angular_core.InputSignal<boolean>;
5230
+ /** Field size — matches the surrounding `tedi-form-field`. */
5231
+ readonly size: _angular_core.InputSignal<DateFieldSize>;
5232
+ /** Disables all dates before this date (inclusive boundary stays enabled). */
5233
+ readonly minDate: _angular_core.InputSignal<Date | undefined>;
5234
+ /** Disables all dates after this date (inclusive boundary stays enabled). */
5235
+ readonly maxDate: _angular_core.InputSignal<Date | undefined>;
5236
+ /** Disable all dates before today. */
5237
+ readonly disablePast: _angular_core.InputSignal<boolean>;
5238
+ /** Disable all dates after today. */
5239
+ readonly disableFuture: _angular_core.InputSignal<boolean>;
5240
+ /**
5241
+ * Predicate `(month) => boolean` returning `true` to disable a whole month in
5242
+ * the calendar's month navigation/grid. Leave `undefined` to disable nothing.
5243
+ */
5244
+ readonly shouldDisableMonth: _angular_core.InputSignal<MonthPredicate | undefined>;
5245
+ /**
5246
+ * Predicate `(year) => boolean` returning `true` to disable a whole year in
5247
+ * the calendar's year navigation/grid. Leave `undefined` to disable nothing.
5248
+ */
5249
+ readonly shouldDisableYear: _angular_core.InputSignal<YearPredicate | undefined>;
5250
+ /**
5251
+ * Whitelist of selectable days — an explicit `Date[]` or a predicate
5252
+ * `(date) => boolean`. Every other day is disabled.
5253
+ */
5254
+ readonly availableDays: _angular_core.InputSignal<DayAvailabilityInput>;
5255
+ /**
5256
+ * Blacklist of unavailable days — a `Date[]` or a predicate `(date) => boolean`.
5257
+ * Takes precedence over `availableDays`.
5258
+ */
5259
+ readonly unavailableDays: _angular_core.InputSignal<DayAvailabilityInput>;
5260
+ /**
5261
+ * Lowest level the user can commit to. `days` shows the day grid as the final
5262
+ * step; `months` and `years` commit at that level instead.
5263
+ */
5264
+ readonly selectionLevel: _angular_core.InputSignal<CalendarView>;
5265
+ /**
5266
+ * How the calendar header exposes month/year picking. `dropdown` shows two
5267
+ * dropdowns; `grid` drills into a month/year grid when the header label is
5268
+ * clicked.
5269
+ */
5270
+ readonly monthYearSelectType: _angular_core.InputSignal<"dropdown" | "grid">;
5271
+ /**
5272
+ * Month the calendar opens on when there is no value. Ignored once a value is
5273
+ * set (the calendar anchors to the selected date).
5274
+ */
5275
+ readonly initialMonth: _angular_core.InputSignal<Date | undefined>;
5276
+ /**
5277
+ * BCP-47 locale for weekday/month names, the first day of the week, and the
5278
+ * default `formatDate`/`parseDate` behaviour.
5279
+ */
5280
+ readonly localeCode: _angular_core.InputSignal<string>;
5281
+ /**
5282
+ * Whether to close the picker after a selection. Defaults to `true` in
5283
+ * `single` mode and `false` in `multiple`/`range` when left `undefined`.
5284
+ */
5285
+ readonly closeOnSelect: _angular_core.InputSignal<boolean | undefined>;
5286
+ /**
5287
+ * Render the trailing/leading days from the adjacent month inside the current
5288
+ * month's grid.
5289
+ */
5290
+ readonly showOutsideDays: _angular_core.InputSignal<boolean>;
5291
+ /** Render an ISO week-number column on the left of the day grid. */
5292
+ readonly showWeekNumbers: _angular_core.InputSignal<boolean>;
5293
+ /**
5294
+ * Number of month grids shown side by side. Accepts a `BreakpointInput<number>`:
5295
+ * a plain number (e.g. `2`) applies at every breakpoint; pass a per-breakpoint
5296
+ * object (e.g. `{ xs: 1, lg: 2 }`) to narrow it on small screens.
5297
+ */
5298
+ readonly numberOfMonths: _angular_core.InputSignalWithTransform<BreakpointObject<number>, BreakpointInput<number>>;
5299
+ /**
5300
+ * Enables the calendar picker UI. When resolved to `false`, hides the icon
5301
+ * button and disables the popover/modal — the user can only type a date.
5302
+ * Accepts a `BreakpointInput<boolean>` for per-breakpoint behaviour.
5303
+ */
5304
+ readonly enableCalendar: _angular_core.InputSignalWithTransform<BreakpointObject<boolean>, BreakpointInput<boolean>>;
5305
+ /**
5306
+ * What opens the calendar. `button` opens it from the icon button; `input`
5307
+ * also opens it when the text input is clicked (and blocks typing). Accepts a
5308
+ * `BreakpointInput` for per-breakpoint behaviour.
5309
+ */
5310
+ readonly calendarTrigger: _angular_core.InputSignalWithTransform<BreakpointObject<DateFieldCalendarTrigger>, BreakpointInput<DateFieldCalendarTrigger>>;
5311
+ /**
5312
+ * Use the OS native date picker instead of the custom popover (single mode only).
5313
+ * `true` always, `false` never, breakpoint name → native below that breakpoint
5314
+ * (custom popover from that breakpoint up).
5315
+ */
5316
+ readonly useNativePicker: _angular_core.InputSignal<DateFieldUseNativePicker>;
5317
+ /** Open the calendar in a modal: `true` always, `false` never, breakpoint name → modal below that breakpoint. */
5318
+ readonly modal: _angular_core.InputSignal<DateFieldModalInput>;
5319
+ /** Make the modal fullscreen: `true` always, `false` never, breakpoint name → fullscreen below that breakpoint. Only applies when the calendar actually opens as a modal. */
5320
+ readonly fullscreen: _angular_core.InputSignal<_tedi_design_system_angular_tedi.BreakpointFlag>;
5321
+ /**
5322
+ * Custom formatter for the input's display string. Overrides the locale-aware
5323
+ * default. Receives the `DateFieldValue` and returns a string.
5324
+ */
5325
+ readonly formatDate: _angular_core.InputSignal<DateFieldFormatter | undefined>;
5326
+ /**
5327
+ * Custom parser for turning typed input into a value. Overrides the
5328
+ * locale-aware default. Receives the raw string and returns a `DateFieldValue`,
5329
+ * or `undefined` when the input can't be parsed.
5330
+ */
5331
+ readonly parseDate: _angular_core.InputSignal<DateFieldParser | undefined>;
5332
+ /** Emitted whenever the picker (popover/modal) open state changes. */
5333
+ readonly openChange: _angular_core.OutputEmitterRef<boolean>;
5334
+ private readonly breakpointService;
5335
+ private readonly modalService;
5336
+ private readonly hostEl;
5337
+ readonly calendar: _angular_core.Signal<CalendarComponent | undefined>;
5338
+ readonly dateInput: _angular_core.Signal<DateInputComponent>;
5339
+ readonly currentMonth: _angular_core.WritableSignal<Date>;
5340
+ readonly overlayOpen: _angular_core.WritableSignal<boolean>;
5341
+ private readonly openedBy;
5342
+ readonly overlayPositions: _angular_core.Signal<ConnectedPosition[]>;
5343
+ private readonly cvaDisabled;
5344
+ private readonly formInvalid;
5345
+ private modalRef;
5346
+ private onChange;
5347
+ private onTouched;
5348
+ readonly fieldDisabled: _angular_core.Signal<boolean>;
5349
+ readonly disabled: _angular_core.Signal<boolean>;
5350
+ readonly invalid: _angular_core.Signal<boolean>;
5351
+ readonly resolvedDisabledMatchers: _angular_core.Signal<Matcher[]>;
5352
+ readonly useNativePickerResolved: _angular_core.Signal<boolean>;
5353
+ readonly useNativePickerEffective: _angular_core.Signal<boolean>;
5354
+ readonly numberOfMonthsResolved: _angular_core.Signal<number>;
5355
+ readonly enableCalendarResolved: _angular_core.Signal<boolean>;
5356
+ readonly calendarTriggerResolved: _angular_core.Signal<DateFieldCalendarTrigger>;
5357
+ readonly modalEnabled: _angular_core.Signal<boolean>;
5358
+ readonly closeOnSelectEffective: _angular_core.Signal<boolean>;
5359
+ readonly showCalendar: _angular_core.Signal<boolean>;
5360
+ readonly useModal: _angular_core.Signal<boolean>;
5361
+ readonly usePopover: _angular_core.Signal<boolean>;
5362
+ readonly nativeIsoValue: _angular_core.Signal<string>;
5363
+ readonly effectivePlaceholder: _angular_core.Signal<string>;
5364
+ readonly displayValue: _angular_core.Signal<string>;
5365
+ readonly tagsForMultipleMode: _angular_core.Signal<DateInputTag[]>;
5366
+ readonly canClear: _angular_core.Signal<boolean>;
5367
+ readonly inputIsTrigger: _angular_core.Signal<boolean>;
5368
+ private initialOpenEmit;
5369
+ constructor();
5370
+ writeValue(value: DateFieldValue): void;
5371
+ registerOnChange(fn: (value: DateFieldValue) => void): void;
5372
+ registerOnTouched(fn: () => void): void;
5373
+ setDisabledState(isDisabled: boolean): void;
5374
+ setInvalidState(isInvalid: boolean): void;
5375
+ clearField(): void;
5376
+ handleClear(): void;
5377
+ handleIconClick(): void;
5378
+ private togglePicker;
5379
+ handleInputChange(value: string): void;
5380
+ handleTagRemove(id: string): void;
5381
+ handleInputClick(event: Event): void;
5382
+ handleCalendarSelect(): void;
5383
+ handleCurrentMonthChange(month: Date): void;
5384
+ closeOverlay(): void;
5385
+ handleOverlayOutsideClick(event: MouseEvent): void;
5386
+ handleOverlayAttached(): void;
5387
+ handleOverlayKeydown(event: KeyboardEvent): void;
5388
+ private focusIconButton;
5389
+ private openNativePicker;
5390
+ private openModal;
5391
+ private handleNativeInputChange;
5392
+ private handleSingleParseInput;
5393
+ private parsedValueIsDisabled;
5394
+ private commitValue;
5395
+ private defaultFormat;
5396
+ private deriveAnchor;
5397
+ private resolveBreakpointInput;
5398
+ private startOfToday;
5399
+ private toIsoDate;
5400
+ private queryNativeInput;
5401
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DateFieldComponent, never>;
5402
+ 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>;
5403
+ }
5404
+
3933
5405
  declare class DatePickerCalendarGridComponent {
3934
5406
  private readonly gridElement;
3935
5407
  /** Grid element unique ID for ARIA */
@@ -3994,8 +5466,20 @@ declare class DatePickerComponent implements OnInit, ControlValueAccessor {
3994
5466
  readonly selected: _angular_core.ModelSignal<Date | null>;
3995
5467
  /** Currently shown month */
3996
5468
  readonly month: _angular_core.ModelSignal<Date>;
3997
- /** Disabled dates that cannot be selected. */
5469
+ /**
5470
+ * Disabled dates that cannot be selected.
5471
+ *
5472
+ * @deprecated Use `disabledMatchers` instead. This input shares the public
5473
+ * binding name `disabled` with `FormControlDirective`, so binding `[disabled]`
5474
+ * on a date-picker that also uses `[formControl]` raises a template type error
5475
+ * (`Type 'DatePickerMatcher[]' is not assignable to type 'boolean'`).
5476
+ */
3998
5477
  readonly disabled: _angular_core.InputSignal<DatePickerMatcher | DatePickerMatcher[] | null>;
5478
+ /**
5479
+ * Disabled dates that cannot be selected (`Date`, `Date[]`, `{ before }`,
5480
+ * `{ after }`, `{ from, to? }`, or a `(date) => boolean` predicate).
5481
+ */
5482
+ readonly disabledMatchers: _angular_core.InputSignal<DatePickerMatcher | DatePickerMatcher[] | null>;
3999
5483
  /** Shows or hides the calendar navigation controls (previous/next month buttons). */
4000
5484
  readonly showNavigation: _angular_core.InputSignal<boolean>;
4001
5485
  /** Month selector mode: none | label | grid | dropdown */
@@ -4095,7 +5579,7 @@ declare class DatePickerComponent implements OnInit, ControlValueAccessor {
4095
5579
  */
4096
5580
  private findNextEnabledDate;
4097
5581
  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>;
5582
+ 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
5583
  }
4100
5584
 
4101
5585
  type FeedbackTextType = "hint" | "valid" | "error";
@@ -4297,35 +5781,6 @@ declare class SelectValueTemplateDirective<T = unknown> {
4297
5781
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<SelectValueTemplateDirective<any>, "[tediSelectValue]", never, {}, {}, never, never, true, never>;
4298
5782
  }
4299
5783
 
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
5784
  type InputSize = "small" | "large" | "default";
4330
5785
  type InputState = "valid" | "error" | "default";
4331
5786
  type ValidationState = "invalid" | "valid" | "neutral";
@@ -4379,7 +5834,7 @@ declare class FormFieldComponent implements AfterContentInit {
4379
5834
  }>;
4380
5835
  clear(): void;
4381
5836
  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>;
5837
+ 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
5838
  }
4384
5839
 
4385
5840
  type SelectInputSize = Exclude<InputSize, "large">;
@@ -4446,7 +5901,7 @@ declare class SelectComponent<T = unknown> implements AfterContentChecked, After
4446
5901
  * inward instead of overflowing.
4447
5902
  * @default "start"
4448
5903
  */
4449
- dropdownAlign: _angular_core.InputSignal<"end" | "start">;
5904
+ dropdownAlign: _angular_core.InputSignal<"start" | "end">;
4450
5905
  /**
4451
5906
  * Configuration for the feedback text displayed below the select.
4452
5907
  */
@@ -4500,6 +5955,12 @@ declare class SelectComponent<T = unknown> implements AfterContentChecked, After
4500
5955
  * @default false
4501
5956
  */
4502
5957
  multiRow: _angular_core.InputSignal<boolean>;
5958
+ /**
5959
+ * Which end a selected tag's label truncates from when it doesn't fit.
5960
+ * `false` (default) never truncates; `end` → `label…`; `start` → `…label`.
5961
+ * @default false
5962
+ */
5963
+ tagEllipsis: _angular_core.InputSignal<TagEllipsis>;
4503
5964
  /**
4504
5965
  * Function used to compare option values for equality.
4505
5966
  * Used to determine which options are selected.
@@ -4656,7 +6117,7 @@ declare class SelectComponent<T = unknown> implements AfterContentChecked, After
4656
6117
  registerOnTouched(fn: () => void): void;
4657
6118
  setDisabledState(isDisabled: boolean): void;
4658
6119
  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>;
6120
+ 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
6121
  }
4661
6122
 
4662
6123
  type ToggleVariant = "primary" | "colored";
@@ -4737,6 +6198,7 @@ declare class TextFieldComponent implements ControlValueAccessor, FormFieldContr
4737
6198
  private formDisabled;
4738
6199
  private onChange;
4739
6200
  private onTouched;
6201
+ constructor();
4740
6202
  private setValue;
4741
6203
  writeValue(value: string | null): void;
4742
6204
  registerOnChange(fn: (value: string) => void): void;
@@ -4952,7 +6414,7 @@ declare class TimeFieldComponent implements ControlValueAccessor, FormFieldContr
4952
6414
  readonly hasPicker: _angular_core.Signal<boolean>;
4953
6415
  readonly hasNativePicker: _angular_core.Signal<boolean>;
4954
6416
  readonly customPickerVariant: _angular_core.Signal<TimePickerVariant>;
4955
- readonly inputType: _angular_core.Signal<"time" | "text">;
6417
+ readonly inputType: _angular_core.Signal<"text" | "time">;
4956
6418
  readonly inputIsTrigger: _angular_core.Signal<boolean>;
4957
6419
  readonly useMobileModal: _angular_core.Signal<boolean>;
4958
6420
  readonly usePopover: _angular_core.Signal<boolean>;
@@ -4983,48 +6445,216 @@ declare class TimeFieldComponent implements ControlValueAccessor, FormFieldContr
4983
6445
  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
6446
  }
4985
6447
 
4986
- type EmptyStateType = "separate" | "attached" | "inside";
4987
- type EmptyStateSize = "default" | "small";
6448
+ type ProgressBarSize = "default" | "small";
6449
+ type ProgressBarLabelPosition = "top" | "horizontal";
6450
+ type ProgressBarValuePosition = "horizontal" | "bottom";
4988
6451
  /**
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]">`.
6452
+ * The subset of inputs that can be overridden per breakpoint via the
6453
+ * `xs`–`xxl` inputs. Every field is optional only the ones you set override
6454
+ * the base value at that breakpoint.
4995
6455
  */
4996
- declare class EmptyStateComponent {
6456
+ type ProgressBarInputs = {
6457
+ /** Overrides {@link ProgressBarComponent.size}. */
6458
+ size?: ProgressBarSize;
6459
+ /** Overrides {@link ProgressBarComponent.labelPosition}. */
6460
+ labelPosition?: ProgressBarLabelPosition;
6461
+ /** Overrides {@link ProgressBarComponent.showValue}. */
6462
+ showValue?: boolean;
6463
+ /** Overrides {@link ProgressBarComponent.valuePosition}. */
6464
+ valuePosition?: ProgressBarValuePosition;
6465
+ /** Overrides {@link ProgressBarComponent.valueLabel}. */
6466
+ valueLabel?: string;
6467
+ };
6468
+ declare class ProgressBarComponent {
4997
6469
  /**
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
6470
+ * Optional id for the underlying `<progress>` element. Useful when an
6471
+ * external `<label for=…>` should bind to it.
5005
6472
  */
5006
- readonly type: _angular_core.InputSignal<EmptyStateType>;
6473
+ progressId: _angular_core.InputSignal<string | undefined>;
5007
6474
  /**
5008
- * Padding scale. `default` = 24px, `small` = 16px.
5009
- * @default default
6475
+ * Progress value between 0 and 100. Values are clamped.
6476
+ * @default 0
5010
6477
  */
5011
- readonly size: _angular_core.InputSignal<EmptyStateSize>;
6478
+ value: _angular_core.InputSignalWithTransform<number, number>;
5012
6479
  /**
5013
- * Material icon name rendered above the text block. Pass `null` to hide.
5014
- * @default spa
6480
+ * Size of the bar. `small` renders a 4px bar height instead of the
6481
+ * default 8px.
6482
+ * @default default
5015
6483
  */
5016
- readonly icon: _angular_core.InputSignal<string | null>;
6484
+ size: _angular_core.InputSignal<ProgressBarSize>;
5017
6485
  /**
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
6486
+ * Optional title rendered above (default) or to the left of the bar.
5021
6487
  */
5022
- readonly iconColor: _angular_core.InputSignal<IconColor>;
6488
+ label: _angular_core.InputSignal<string | undefined>;
5023
6489
  /**
5024
- * Size of the icon, in pixels.
5025
- * @default 36
6490
+ * Where to place the label relative to the bar.
6491
+ * Has no effect when `label` is not set.
6492
+ * @default top
5026
6493
  */
5027
- readonly iconSize: _angular_core.InputSignal<IconSize>;
6494
+ labelPosition: _angular_core.InputSignal<ProgressBarLabelPosition>;
6495
+ /**
6496
+ * Render a red `*` after the label to indicate a required field.
6497
+ * Has no effect when `label` is not set.
6498
+ * @default false
6499
+ */
6500
+ required: _angular_core.InputSignalWithTransform<boolean, unknown>;
6501
+ /**
6502
+ * Show or hide the percentage value.
6503
+ * @default true
6504
+ */
6505
+ showValue: _angular_core.InputSignalWithTransform<boolean, unknown>;
6506
+ /**
6507
+ * Where to place the percentage value.
6508
+ * - `horizontal` – next to the bar.
6509
+ * - `bottom` – on the hint row beneath the bar.
6510
+ * @default horizontal
6511
+ */
6512
+ valuePosition: _angular_core.InputSignal<ProgressBarValuePosition>;
6513
+ /**
6514
+ * Override the rendered value text. Defaults to `"{value}%"`.
6515
+ *
6516
+ * Use this when the progress represents something other than a percentage —
6517
+ * e.g. `value=20` with `valueLabel="1/5"` shows the bar at 20% but renders
6518
+ * the label as "1/5". `value` still drives the bar fill; the label is also
6519
+ * exposed to assistive technology via `aria-valuetext`.
6520
+ */
6521
+ valueLabel: _angular_core.InputSignal<string | undefined>;
6522
+ /**
6523
+ * Accessible label for the progress bar. Falls back to `label()` when omitted.
6524
+ */
6525
+ ariaLabel: _angular_core.InputSignal<string | undefined>;
6526
+ /** Overrides applied from the `xs` breakpoint (≥ 0px) and up. */
6527
+ xs: _angular_core.InputSignal<ProgressBarInputs | undefined>;
6528
+ /** Overrides applied from the `sm` breakpoint (≥ 576px) and up. */
6529
+ sm: _angular_core.InputSignal<ProgressBarInputs | undefined>;
6530
+ /** Overrides applied from the `md` breakpoint (≥ 768px) and up. */
6531
+ md: _angular_core.InputSignal<ProgressBarInputs | undefined>;
6532
+ /** Overrides applied from the `lg` breakpoint (≥ 992px) and up. */
6533
+ lg: _angular_core.InputSignal<ProgressBarInputs | undefined>;
6534
+ /** Overrides applied from the `xl` breakpoint (≥ 1200px) and up. */
6535
+ xl: _angular_core.InputSignal<ProgressBarInputs | undefined>;
6536
+ /** Overrides applied from the `xxl` breakpoint (≥ 1400px) and up. */
6537
+ xxl: _angular_core.InputSignal<ProgressBarInputs | undefined>;
6538
+ private breakpointService;
6539
+ protected currentProps: _angular_core.Signal<ProgressBarInputs>;
6540
+ protected formattedValue: _angular_core.Signal<string>;
6541
+ protected accessibleLabel: _angular_core.Signal<string | undefined>;
6542
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ProgressBarComponent, never>;
6543
+ 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>;
6544
+ }
6545
+
6546
+ type AttachmentDirection = "horizontal" | "vertical";
6547
+ declare class AttachmentComponent {
6548
+ protected projectedProgress: _angular_core.Signal<ProgressBarComponent | undefined>;
6549
+ private breakpointService;
6550
+ /**
6551
+ * File name to display.
6552
+ */
6553
+ name: _angular_core.InputSignal<string>;
6554
+ /**
6555
+ * Pre-formatted file size string (e.g. `"0.9 MB"`). Consumer formats the
6556
+ * value; the component renders it as-is to the right of the name.
6557
+ */
6558
+ fileSize: _angular_core.InputSignal<string | undefined>;
6559
+ /**
6560
+ * Leading file-type icon shown before the file name. Pass a Material Symbol
6561
+ * name (e.g. `"description"`, `"picture_as_pdf"`, `"imagesmode"`).
6562
+ */
6563
+ icon: _angular_core.InputSignal<string | undefined>;
6564
+ /**
6565
+ * Error feedback message. When set, the attachment switches to its error
6566
+ * visual: red card background, error icon next to the name, and the
6567
+ * message rendered as feedback text below the card. Implies `invalid`.
6568
+ */
6569
+ error: _angular_core.InputSignal<string | undefined>;
6570
+ /**
6571
+ * Mark the attachment as invalid. Switches to the error visual (red card
6572
+ * background, error icon next to the name) but does **not** render any
6573
+ * feedback text below the card. Use when the validation message is
6574
+ * shown elsewhere (e.g. as an aggregate error on the parent control).
6575
+ * Implied automatically when `error` is set.
6576
+ * @default false
6577
+ */
6578
+ invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
6579
+ /**
6580
+ * Content layout direction.
6581
+ * - `horizontal` – name/size and progress sit on a single row beside the
6582
+ * actions (the default desktop layout).
6583
+ * - `vertical` – name, size and progress stack in a column with the actions
6584
+ * pinned top-right. Useful in narrow containers (mobile, sidebars).
6585
+ *
6586
+ * When `undefined`, the direction is auto-derived from the viewport: it
6587
+ * switches to `vertical` below the `verticalBelow` breakpoint.
6588
+ */
6589
+ direction: _angular_core.InputSignal<AttachmentDirection | undefined>;
6590
+ /**
6591
+ * Viewport breakpoint below which the layout auto-switches to `vertical`
6592
+ * when `direction` is not set explicitly.
6593
+ * @default "sm"
6594
+ */
6595
+ verticalBelow: _angular_core.InputSignal<"xs" | "sm" | "md" | "lg" | "xl" | "xxl">;
6596
+ private _autoVertical;
6597
+ protected isVertical: _angular_core.Signal<boolean>;
6598
+ protected hasErrorVisual: _angular_core.Signal<boolean>;
6599
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AttachmentComponent, never>;
6600
+ 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>;
6601
+ }
6602
+
6603
+ declare class AttachmentActionsComponent {
6604
+ /**
6605
+ * Adds a 12px gap between the actions and 8px inline padding to the group.
6606
+ * Enable for labeled (text) buttons, whose neutral variant has no horizontal
6607
+ * padding of its own and would otherwise touch the card edge. Leave off for
6608
+ * icon-only buttons, which sit flush.
6609
+ * @default false
6610
+ */
6611
+ padded: _angular_core.InputSignalWithTransform<boolean, unknown>;
6612
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AttachmentActionsComponent, never>;
6613
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AttachmentActionsComponent, "tedi-attachment-actions", never, { "padded": { "alias": "padded"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
6614
+ }
6615
+
6616
+ type EmptyStateType = "separate" | "attached" | "inside";
6617
+ type EmptyStateSize = "default" | "small";
6618
+ /**
6619
+ * Communicates that there is nothing to display — empty search results, an
6620
+ * unpopulated list, a freshly-created workspace — and optionally guides the
6621
+ * user toward the next step via action buttons or a link.
6622
+ *
6623
+ * Description is projected via `<ng-content>`. Actions are projected via
6624
+ * `<ng-content select="[tedi-empty-state-actions]">`.
6625
+ */
6626
+ declare class EmptyStateComponent {
6627
+ /**
6628
+ * Container variant — matches the Figma "Types" section.
6629
+ * - `'separate'` (default) — full border + radius, stands on its own.
6630
+ * - `'attached'` — top border omitted so the block sits flush beneath a
6631
+ * preceding card or table (same width + same bottom-radius).
6632
+ * - `'inside'` — no border, no radius; intended to be placed inside another
6633
+ * container such as a `<tedi-card>` or `<tedi-table>`.
6634
+ * @default separate
6635
+ */
6636
+ readonly type: _angular_core.InputSignal<EmptyStateType>;
6637
+ /**
6638
+ * Padding scale. `default` = 24px, `small` = 16px.
6639
+ * @default default
6640
+ */
6641
+ readonly size: _angular_core.InputSignal<EmptyStateSize>;
6642
+ /**
6643
+ * Material icon name rendered above the text block. Pass `null` to hide.
6644
+ * @default spa
6645
+ */
6646
+ readonly icon: _angular_core.InputSignal<string | null>;
6647
+ /**
6648
+ * Color of the icon. Defaults to brand so the empty state reads as a
6649
+ * "fresh canvas" cue rather than a destructive state.
6650
+ * @default brand
6651
+ */
6652
+ readonly iconColor: _angular_core.InputSignal<IconColor>;
6653
+ /**
6654
+ * Size of the icon, in pixels.
6655
+ * @default 36
6656
+ */
6657
+ readonly iconSize: _angular_core.InputSignal<IconSize>;
5028
6658
  /**
5029
6659
  * Optional heading rendered above the description — appears as an `<h3>` in
5030
6660
  * brand-primary text color.
@@ -5035,25 +6665,6 @@ declare class EmptyStateComponent {
5035
6665
  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
6666
  }
5037
6667
 
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
6668
  type ColWidth = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12;
5058
6669
  type JustifySelf = "start" | "end" | "center" | "stretch";
5059
6670
  type AlignSelf = "start" | "end" | "center" | "stretch";
@@ -5230,28 +6841,55 @@ declare class SeparatorComponent {
5230
6841
  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
6842
  }
5232
6843
 
6844
+ /**
6845
+ * Marks content that is pinned to the bottom of a timeline item's timings
6846
+ * column on desktop and rendered after the item content on mobile.
6847
+ *
6848
+ * Usage: `<p *tediTimelineTimingsBottom>Muudetud 08.02.2024</p>`
6849
+ */
6850
+ declare class TimelineTimingsBottomDirective {
6851
+ templateRef: TemplateRef<any>;
6852
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TimelineTimingsBottomDirective, never>;
6853
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<TimelineTimingsBottomDirective, "[tediTimelineTimingsBottom]", never, {}, {}, never, never, true, never>;
6854
+ }
6855
+
5233
6856
  type TimelineItemState = "current" | "past" | "future";
5234
6857
  declare class TimelineItemComponent implements OnInit, OnDestroy {
5235
6858
  /** Item timings */
5236
6859
  timings: _angular_core.InputSignal<string[]>;
5237
6860
  timeline: TimelineComponent | null;
6861
+ protected isMobile: _angular_core.Signal<boolean>;
6862
+ protected timingsBottom: _angular_core.Signal<TimelineTimingsBottomDirective | undefined>;
5238
6863
  ngOnInit(): void;
5239
6864
  ngOnDestroy(): void;
5240
6865
  isLast: _angular_core.Signal<boolean>;
5241
6866
  state: _angular_core.Signal<TimelineItemState>;
5242
6867
  color: _angular_core.Signal<SeparatorColor>;
5243
6868
  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>;
6869
+ 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
6870
  }
5246
6871
 
6872
+ type TimelineVariant = "default" | "card";
6873
+ type TimelineCardPadding = CardPaddingNumber;
5247
6874
  declare class TimelineComponent {
5248
6875
  /** Index of active item */
5249
6876
  activeIndex: _angular_core.InputSignal<number | undefined>;
6877
+ /**
6878
+ * Visual variant. "card" wraps the timeline in the borders and paddings
6879
+ * of a card.
6880
+ * @default default
6881
+ */
6882
+ variant: _angular_core.InputSignal<TimelineVariant>;
6883
+ /**
6884
+ * Item padding in rems for the card variant.
6885
+ * @default 1
6886
+ */
6887
+ cardPadding: _angular_core.InputSignal<CardPaddingNumber | undefined>;
5250
6888
  items: _angular_core.WritableSignal<TimelineItemComponent[]>;
5251
6889
  registerItem(item: TimelineItemComponent): void;
5252
6890
  unregisterItem(item: TimelineItemComponent): void;
5253
6891
  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>;
6892
+ 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
6893
  }
5256
6894
 
5257
6895
  declare class TimelineDescriptionComponent {
@@ -5341,7 +6979,7 @@ declare class FooterBottomComponent implements AfterContentInit {
5341
6979
 
5342
6980
  declare class HeaderComponent {
5343
6981
  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>;
6982
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<HeaderComponent, "header[tedi-header]", never, {}, {}, never, ["button[tedi-sidenav-toggle]", "*", "tedi-header-bottom"], true, never>;
5345
6983
  }
5346
6984
 
5347
6985
  declare class HeaderActionsComponent {
@@ -5349,9 +6987,40 @@ declare class HeaderActionsComponent {
5349
6987
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<HeaderActionsComponent, "tedi-header-actions", never, {}, {}, never, ["*"], true, never>;
5350
6988
  }
5351
6989
 
6990
+ /**
6991
+ * Mobile-only secondary row rendered below the main header bar.
6992
+ *
6993
+ * Typical use: a compact search bar or mobile-specific navigation that only
6994
+ * appears below the `md` breakpoint. Above `md` the component is hidden via
6995
+ * CSS, so consumers can include it unconditionally — desktop users won't see it.
6996
+ *
6997
+ * @example
6998
+ * <header tedi-header>
6999
+ * <!-- main content -->
7000
+ * <tedi-header-bottom>
7001
+ * <tedi-header-search mobileVariant="inline">
7002
+ * <tedi-search inputId="search" placeholder="Search..." />
7003
+ * </tedi-header-search>
7004
+ * </tedi-header-bottom>
7005
+ * </header>
7006
+ */
7007
+ declare class HeaderBottomComponent {
7008
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<HeaderBottomComponent, never>;
7009
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<HeaderBottomComponent, "tedi-header-bottom", never, {}, {}, never, ["*"], true, never>;
7010
+ }
7011
+
7012
+ type HeaderContentAlignment = "flex-start" | "center" | "space-between";
5352
7013
  declare class HeaderContentComponent {
7014
+ /**
7015
+ * Controls the horizontal alignment of the projected content (`justify-content`).
7016
+ * Useful when the center area mixes nav links with another component (e.g. a
7017
+ * `<tedi-header-search>`) and you want to push them apart or align them to one edge.
7018
+ * @default "center"
7019
+ */
7020
+ readonly alignment: _angular_core.InputSignal<HeaderContentAlignment>;
7021
+ protected readonly classes: _angular_core.Signal<string>;
5353
7022
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<HeaderContentComponent, never>;
5354
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<HeaderContentComponent, "tedi-header-content", never, {}, {}, never, ["*"], true, never>;
7023
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<HeaderContentComponent, "tedi-header-content", never, { "alignment": { "alias": "alignment"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
5355
7024
  }
5356
7025
 
5357
7026
  type HeaderLanguage = {
@@ -5368,7 +7037,7 @@ declare class HeaderLanguageComponent {
5368
7037
  * This is event emitter for changing language
5369
7038
  */
5370
7039
  languageChange: _angular_core.OutputEmitterRef<Language>;
5371
- popover?: PopoverComponent;
7040
+ readonly popover: _angular_core.Signal<PopoverComponent | undefined>;
5372
7041
  translationService: TediTranslationService;
5373
7042
  languageKeys: _angular_core.Signal<Language[]>;
5374
7043
  handleChangeLang(lang: Language): void;
@@ -5376,82 +7045,507 @@ declare class HeaderLanguageComponent {
5376
7045
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<HeaderLanguageComponent, "tedi-header-language", never, { "languages": { "alias": "languages"; "required": true; "isSignal": true; }; }, { "languageChange": "languageChange"; }, never, never, true, never>;
5377
7046
  }
5378
7047
 
5379
- declare class HeaderLoginComponent {
7048
+ type HeaderLoginSize = "default" | "small";
7049
+ /**
7050
+ * Subset of `HeaderLoginComponent` inputs that can be overridden per breakpoint
7051
+ * via the `[xs]` / `[sm]` / `[md]` / `[lg]` / `[xl]` / `[xxl]` inputs. Mirrors
7052
+ * React's `HeaderLoginBreakpointProps`.
7053
+ */
7054
+ type HeaderLoginInputs = {
7055
+ size: HeaderLoginSize | undefined;
7056
+ label: string;
7057
+ };
7058
+ declare class HeaderLoginComponent implements BreakpointInputs<HeaderLoginInputs> {
5380
7059
  breakpointService: BreakpointService;
5381
7060
  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>;
7061
+ private isMobile;
7062
+ /**
7063
+ * Visual size of the login button.
7064
+ * - `'small'` renders a compact icon-and-caption button (the
7065
+ * `<tedi-header-mobile-button>` variant).
7066
+ * - `'default'` renders a primary button or anchor with text only.
7067
+ *
7068
+ * When left unset, the size is chosen automatically based on the viewport:
7069
+ * `'small'` below the `md` breakpoint, `'default'` from `md` up. Pass an
7070
+ * explicit value to force a variant regardless of viewport.
7071
+ */
7072
+ size: _angular_core.InputSignal<HeaderLoginSize | undefined>;
7073
+ /**
7074
+ * Custom label text for the login button. When provided, used as-is — not
7075
+ * translated. When omitted or empty, falls back to the `header.login.mobile`
7076
+ * translation key for the compact variant and `header.login` for the full
7077
+ * variant.
7078
+ */
7079
+ label: _angular_core.InputSignal<string>;
7080
+ /**
7081
+ * If provided, the login button renders as an `<a>` navigating to this URL.
7082
+ * Otherwise renders as a `<button>`.
7083
+ */
7084
+ href: _angular_core.InputSignal<string | undefined>;
7085
+ xs: _angular_core.InputSignal<HeaderLoginInputs | undefined>;
7086
+ sm: _angular_core.InputSignal<HeaderLoginInputs | undefined>;
7087
+ md: _angular_core.InputSignal<HeaderLoginInputs | undefined>;
7088
+ lg: _angular_core.InputSignal<HeaderLoginInputs | undefined>;
7089
+ xl: _angular_core.InputSignal<HeaderLoginInputs | undefined>;
7090
+ xxl: _angular_core.InputSignal<HeaderLoginInputs | undefined>;
7091
+ protected readonly breakpointInputs: _angular_core.Signal<HeaderLoginInputs>;
7092
+ isSmall: _angular_core.Signal<boolean>;
7093
+ resolvedLabel: _angular_core.Signal<string>;
5386
7094
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<HeaderLoginComponent, never>;
5387
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<HeaderLoginComponent, "tedi-header-login", never, {}, {}, never, never, true, never>;
7095
+ 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
7096
  }
5389
7097
 
5390
- declare class HeaderLogoutComponent {
5391
- breakpointService: BreakpointService;
5392
- isMobile: _angular_core.Signal<boolean>;
5393
- classes: _angular_core.Signal<string>;
7098
+ declare class HeaderLogoComponent {
7099
+ /**
7100
+ * Optional link URL. When set, the logo is wrapped in an anchor element.
7101
+ */
7102
+ readonly href: _angular_core.InputSignal<string | undefined>;
7103
+ /**
7104
+ * Controls visibility of the logo. Useful for conditionally hiding the logo
7105
+ * based on application state, feature flags, or custom media queries that
7106
+ * fall between standard breakpoints (e.g. 360px). For responsive hiding at
7107
+ * standard breakpoints, prefer wrapping `<tedi-header-logo>` with `*hideAt`
7108
+ * or `*showAt`.
7109
+ * @default true
7110
+ */
7111
+ readonly showLogo: _angular_core.InputSignal<boolean>;
7112
+ private readonly darkSlot;
7113
+ private readonly themeService;
7114
+ protected readonly useDark: _angular_core.Signal<boolean>;
7115
+ protected readonly classes: _angular_core.Signal<string>;
7116
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<HeaderLogoComponent, never>;
7117
+ 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>;
7118
+ }
7119
+
7120
+ /**
7121
+ * Marks a projected child of `<tedi-header-logo>` as the dark-theme variant.
7122
+ * `HeaderLogoComponent` detects it via `contentChild` and swaps to the dark
7123
+ * slot when the active theme is `dark`.
7124
+ */
7125
+ declare class HeaderLogoDarkDirective {
7126
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<HeaderLogoDarkDirective, never>;
7127
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<HeaderLogoDarkDirective, "[tedi-header-logo-dark]", never, {}, {}, never, never, true, never>;
7128
+ }
7129
+
7130
+ type HeaderLogoutSize = "default" | "small";
7131
+ /**
7132
+ * Subset of `HeaderLogoutComponent` inputs that can be overridden per
7133
+ * breakpoint via the `[xs]` / `[sm]` / `[md]` / `[lg]` / `[xl]` / `[xxl]`
7134
+ * inputs. Mirrors React's `HeaderLogoutBreakpointProps`.
7135
+ */
7136
+ type HeaderLogoutInputs = {
7137
+ size: HeaderLogoutSize | undefined;
7138
+ label: string;
7139
+ };
7140
+ declare class HeaderLogoutComponent implements BreakpointInputs<HeaderLogoutInputs> {
7141
+ private readonly translationService;
7142
+ private readonly breakpointService;
7143
+ private isMobile;
7144
+ /**
7145
+ * Visual size of the logout button.
7146
+ * - `'small'` renders a compact icon-and-caption button (the
7147
+ * `<tedi-header-mobile-button>` variant).
7148
+ * - `'default'` renders a full-width link with inline icon and text.
7149
+ *
7150
+ * When left unset (the default), the size is chosen automatically based on
7151
+ * the viewport: `'small'` below the `md` breakpoint, `'default'` from `md`
7152
+ * up. Pass an explicit value to force a variant regardless of viewport —
7153
+ * useful inside tight containers (sidebar panel, dropdown) where the
7154
+ * desktop layout has no room.
7155
+ */
7156
+ size: _angular_core.InputSignal<HeaderLogoutSize | undefined>;
7157
+ /**
7158
+ * Custom label text for the logout button. When provided, used as-is — not
7159
+ * translated. When omitted or empty, falls back to the `header.logout.mobile`
7160
+ * translation key for the compact variant and `header.logout` for the full
7161
+ * variant.
7162
+ */
7163
+ label: _angular_core.InputSignal<string>;
7164
+ /**
7165
+ * If provided, the logout button renders as an `<a>` navigating to this URL.
7166
+ * Otherwise renders as a `<button>`.
7167
+ */
7168
+ href: _angular_core.InputSignal<string | undefined>;
7169
+ xs: _angular_core.InputSignal<HeaderLogoutInputs | undefined>;
7170
+ sm: _angular_core.InputSignal<HeaderLogoutInputs | undefined>;
7171
+ md: _angular_core.InputSignal<HeaderLogoutInputs | undefined>;
7172
+ lg: _angular_core.InputSignal<HeaderLogoutInputs | undefined>;
7173
+ xl: _angular_core.InputSignal<HeaderLogoutInputs | undefined>;
7174
+ xxl: _angular_core.InputSignal<HeaderLogoutInputs | undefined>;
7175
+ protected readonly breakpointInputs: _angular_core.Signal<HeaderLogoutInputs>;
7176
+ isSmall: _angular_core.Signal<boolean>;
7177
+ resolvedLabel: _angular_core.Signal<string>;
5394
7178
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<HeaderLogoutComponent, never>;
5395
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<HeaderLogoutComponent, "button[tedi-header-logout]", never, {}, {}, never, ["*"], true, never>;
7179
+ 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
7180
  }
5397
7181
 
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>;
7182
+ /**
7183
+ * Compact icon + label button used inside the mobile header row
7184
+ * (`<tedi-header-bottom>` or a mobile-specific section of
7185
+ * `<tedi-header-actions>`).
7186
+ *
7187
+ * Renders as an `<a>` when `href` is provided and `disabled` is false,
7188
+ * otherwise as a `<button>` — mirroring the React `HeaderMobileButton`.
7189
+ *
7190
+ * @example
7191
+ * <tedi-header-mobile-button icon="menu" label="Menu" />
7192
+ * <tedi-header-mobile-button icon="search" label="Search" href="/search" />
7193
+ * <tedi-header-mobile-button icon="notifications" label="Alerts" [selected]="true" />
7194
+ */
7195
+ declare class HeaderMobileButtonComponent {
7196
+ /** Material icon name displayed inside the button. */
7197
+ icon: _angular_core.InputSignal<string>;
7198
+ /** Label text displayed below the icon. */
7199
+ label: _angular_core.InputSignal<string | undefined>;
7200
+ /**
7201
+ * If provided (and not disabled), the button renders as an `<a>`
7202
+ * navigating to this URL. Otherwise renders as a `<button>`.
7203
+ */
7204
+ href: _angular_core.InputSignal<string | undefined>;
7205
+ /** Whether the button is in a selected state. */
7206
+ selected: _angular_core.InputSignal<boolean>;
7207
+ /** Whether the button is disabled. */
7208
+ disabled: _angular_core.InputSignal<boolean>;
7209
+ /**
7210
+ * Accessible name override forwarded to the inner `<button>`/`<a>`.
7211
+ * Useful when the visible label needs to be augmented for screen readers
7212
+ * (e.g. when the button only renders an icon).
7213
+ */
7214
+ ariaLabel: _angular_core.InputSignal<string | undefined>;
7215
+ /**
7216
+ * Forwarded to the inner `<button>` as `aria-haspopup`. Set to `'dialog'`
7217
+ * when the button opens a modal dialog, `'menu'` for menus, etc.
7218
+ *
7219
+ * Only applied when the component renders as a `<button>` (i.e. when
7220
+ * `href` is not set). A real navigation link with popup-trigger semantics
7221
+ * is confusing to assistive tech — if a popup is involved, omit `href`
7222
+ * so the component renders as a button.
7223
+ */
7224
+ ariaHasPopup: _angular_core.InputSignal<"menu" | "listbox" | "dialog" | "true" | "grid" | "false" | "tree" | undefined>;
7225
+ /**
7226
+ * Forwarded to the inner `<button>` as `aria-expanded`. Pair with
7227
+ * `ariaHasPopup` when this button toggles a dialog/menu open.
7228
+ *
7229
+ * Only applied when the component renders as a `<button>` (i.e. when
7230
+ * `href` is not set).
7231
+ */
7232
+ ariaExpanded: _angular_core.InputSignal<boolean | undefined>;
7233
+ renderAsLink: _angular_core.Signal<boolean>;
7234
+ classes: _angular_core.Signal<string>;
7235
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<HeaderMobileButtonComponent, never>;
7236
+ 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>;
7237
+ }
7238
+
7239
+ type HeaderProfileSize = "default" | "small";
7240
+ /**
7241
+ * Subset of `HeaderProfileComponent` inputs that can be overridden per
7242
+ * breakpoint via the `[xs]` / `[sm]` / `[md]` / `[lg]` / `[xl]` / `[xxl]` inputs.
7243
+ */
7244
+ type HeaderProfileInputs = {
7245
+ label: string;
7246
+ showPopover: Breakpoint;
7247
+ };
7248
+ declare class HeaderProfileComponent implements BreakpointInputs<HeaderProfileInputs>, AfterContentInit {
7249
+ /**
7250
+ * Custom label text for the profile button. Falls back to the `header.profile`
7251
+ * translation key on desktop, or `header.profile.mobile` on mobile.
7252
+ */
7253
+ label: _angular_core.InputSignal<string>;
7254
+ /**
7255
+ * Whether to display a text label next to the profile icon on non-mobile
7256
+ * viewports. When `false` the desktop trigger renders as an icon-only button
7257
+ * and the label (custom or translated) is used as the `aria-label` only.
7258
+ * When `true` the label is visible and a chevron is shown next to it.
7259
+ *
7260
+ * Has no effect on the mobile/small variant — the mobile button always
7261
+ * shows its label.
7262
+ * @default false
7263
+ */
7264
+ showLabel: _angular_core.InputSignal<boolean>;
7265
+ /**
7266
+ * Defines the breakpoint from which the profile menu is displayed as a popover.
7267
+ * Below this breakpoint, it is rendered as a modal.
7268
+ *
7269
+ * @default 'lg'
7270
+ */
7271
+ showPopover: _angular_core.InputSignal<"xs" | "sm" | "md" | "lg" | "xl" | "xxl">;
7272
+ /**
7273
+ * Removes default item styles from the mobile modal content. When `true`,
7274
+ * projected children render without the padding, border, or background that
7275
+ * `<tedi-header-profile>` normally applies to each direct child of the
7276
+ * modal. Use when the content requires custom item styling.
7277
+ *
7278
+ * Only affects the mobile/modal branch. The desktop popover uses
7279
+ * `<tedi-popover-content>`'s own styling and is unaffected.
7280
+ *
7281
+ * @default false
7282
+ */
7283
+ noStyle: _angular_core.InputSignal<boolean>;
7284
+ /**
7285
+ * Visual size of the profile button.
7286
+ * - `'small'` renders a compact icon-and-caption button (the
7287
+ * `<tedi-header-mobile-button>` variant).
7288
+ * - `'default'` renders a button with the user's name + icon.
7289
+ *
7290
+ * When left unset, the size is chosen automatically based on the viewport:
7291
+ * `'small'` below the `md` breakpoint, `'default'` from `md` up. Pass an
7292
+ * explicit value to force a variant regardless of viewport.
7293
+ */
7294
+ size: _angular_core.InputSignal<HeaderProfileSize | undefined>;
7295
+ xs: _angular_core.InputSignal<HeaderProfileInputs | undefined>;
7296
+ sm: _angular_core.InputSignal<HeaderProfileInputs | undefined>;
7297
+ md: _angular_core.InputSignal<HeaderProfileInputs | undefined>;
7298
+ lg: _angular_core.InputSignal<HeaderProfileInputs | undefined>;
7299
+ xl: _angular_core.InputSignal<HeaderProfileInputs | undefined>;
7300
+ xxl: _angular_core.InputSignal<HeaderProfileInputs | undefined>;
5403
7301
  readonly breakpointService: BreakpointService;
5404
7302
  readonly translationService: TediTranslationService;
5405
7303
  private readonly document;
5406
7304
  private readonly host;
5407
7305
  private readonly renderer;
5408
- private readonly eventListeners;
7306
+ private readonly destroyRef;
7307
+ readonly isMobile: _angular_core.Signal<boolean>;
7308
+ readonly isSmall: _angular_core.Signal<boolean>;
7309
+ protected readonly breakpointInputs: _angular_core.Signal<HeaderProfileInputs>;
7310
+ readonly resolvedLabel: _angular_core.Signal<string>;
5409
7311
  constructor();
5410
7312
  modalOpen: _angular_core.WritableSignal<boolean>;
7313
+ /**
7314
+ * Tracks which `HeaderRoleComponent` instance currently has its
7315
+ * accordion open. When a role opens, it writes its own reference here;
7316
+ * other roles watch this signal and close themselves when it changes.
7317
+ * @internal
7318
+ */
7319
+ readonly activeRole: _angular_core.WritableSignal<unknown>;
5411
7320
  readonly buttonVariant: _angular_core.Signal<ButtonVariant>;
5412
- readonly buttonClass: _angular_core.Signal<"tedi-header-profile--mobile" | null>;
5413
7321
  ngAfterContentInit(): void;
5414
7322
  handleModalOpen(): void;
5415
7323
  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>;
7324
+ 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>;
7325
+ }
7326
+
7327
+ /**
7328
+ * Marker directive applied to a projected child of `<tedi-header-role>` to mark it
7329
+ * as the title content (e.g. a `<tedi-tag>`). The directive itself adds no DOM or
7330
+ * behavior — it only exists so `HeaderRoleComponent` can detect, via `contentChild`,
7331
+ * whether a consumer has projected title content. When projected, the title slot
7332
+ * replaces the bold `role` string fallback.
7333
+ *
7334
+ * @example
7335
+ * <tedi-header-role [representatives]="..." [currentRepresentative]="...">
7336
+ * <tedi-tag tedi-header-role-title>Esindatav</tedi-tag>
7337
+ * </tedi-header-role>
7338
+ */
7339
+ declare class HeaderRoleTitleDirective {
7340
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<HeaderRoleTitleDirective, never>;
7341
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<HeaderRoleTitleDirective, "[tedi-header-role-title]", never, {}, {}, never, never, true, never>;
5417
7342
  }
5418
7343
 
7344
+ type RepresentativeIcon = {
7345
+ /** Material Icon name. */
7346
+ name: string;
7347
+ /** Size in px. Falls back to `<tedi-icon>`'s default (24) when omitted. */
7348
+ size?: IconSize;
7349
+ };
5419
7350
  type Representative = {
7351
+ /**
7352
+ * Stable identifier. Required for selection comparison and for re-syncing
7353
+ * the current representative when the `representatives` input changes.
7354
+ */
7355
+ id: string;
5420
7356
  name: string;
5421
- icon?: string;
7357
+ /**
7358
+ * Icon shown next to the representative. Accepts either a Material Icon name
7359
+ * as a string (`'person'`) for the common case, or a full
7360
+ * `RepresentativeIcon` object (`{ name: 'person', size: 18 }`) when an
7361
+ * explicit size is needed. The two forms are equivalent when only `name` is
7362
+ * relevant.
7363
+ */
7364
+ icon?: string | RepresentativeIcon;
5422
7365
  description?: string;
5423
7366
  };
7367
+ /**
7368
+ * Structural marker for custom content projected into the role selection
7369
+ * popover (desktop) or accordion (tablet/mobile).
7370
+ *
7371
+ * When present, replaces the default representative list entirely.
7372
+ *
7373
+ * Usage:
7374
+ * ```html
7375
+ * <tedi-header-role ...>
7376
+ * <ng-template tedi-header-role-content>
7377
+ * <div>Custom content here</div>
7378
+ * </ng-template>
7379
+ * </tedi-header-role>
7380
+ * ```
7381
+ */
7382
+ declare class HeaderRoleContentDirective {
7383
+ readonly templateRef: TemplateRef<any>;
7384
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<HeaderRoleContentDirective, never>;
7385
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<HeaderRoleContentDirective, "[tedi-header-role-content]", never, {}, {}, never, never, true, never>;
7386
+ }
7387
+ /**
7388
+ * Structural marker for custom "no results" content shown when the search
7389
+ * filter produces an empty representative list.
7390
+ *
7391
+ * When absent, the component falls back to a default translated string.
7392
+ *
7393
+ * Usage:
7394
+ * ```html
7395
+ * <tedi-header-role ...>
7396
+ * <ng-template tedi-header-role-no-results>
7397
+ * <tedi-empty-state description="No matches found" />
7398
+ * </ng-template>
7399
+ * </tedi-header-role>
7400
+ * ```
7401
+ */
7402
+ declare class HeaderRoleNoResultsDirective {
7403
+ readonly templateRef: TemplateRef<any>;
7404
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<HeaderRoleNoResultsDirective, never>;
7405
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<HeaderRoleNoResultsDirective, "[tedi-header-role-no-results]", never, {}, {}, never, never, true, never>;
7406
+ }
5424
7407
  declare class HeaderRoleComponent {
5425
7408
  /**
5426
- * Role text
7409
+ * Label text. Rendered as bold text in the title position when no title content is
7410
+ * projected via `[tedi-header-role-title]`. Projected content takes precedence and
7411
+ * replaces this string.
5427
7412
  */
5428
- role: _angular_core.InputSignal<string>;
7413
+ label: _angular_core.InputSignal<string>;
5429
7414
  /**
5430
7415
  * Description text
5431
7416
  */
5432
7417
  description: _angular_core.InputSignal<string>;
5433
- /** Should show input in representative list?
7418
+ /**
7419
+ * Whether the consumer projected title content (e.g. `<tedi-tag tedi-header-role-title>`)
7420
+ * via the `[tedi-header-role-title]` slot. Used by the template to know whether the
7421
+ * title position has content even when `label` is empty.
7422
+ */
7423
+ protected readonly titleContent: _angular_core.Signal<HeaderRoleTitleDirective | undefined>;
7424
+ protected readonly hasTitle: _angular_core.Signal<boolean>;
7425
+ /**
7426
+ * Projected custom content that replaces the default representative list.
7427
+ */
7428
+ protected readonly customContent: _angular_core.Signal<HeaderRoleContentDirective | undefined>;
7429
+ protected readonly hasCustomContent: _angular_core.Signal<boolean>;
7430
+ protected readonly customContentTemplate: _angular_core.Signal<TemplateRef<any> | null>;
7431
+ protected readonly noResultsContent: _angular_core.Signal<HeaderRoleNoResultsDirective | undefined>;
7432
+ protected readonly hasNoResultsContent: _angular_core.Signal<boolean>;
7433
+ protected readonly noResultsTemplate: _angular_core.Signal<TemplateRef<any> | null>;
7434
+ /**
7435
+ * Whether to display the search input above the representative list.
5434
7436
  * @default false
5435
7437
  */
5436
- showInput: _angular_core.InputSignal<boolean>;
7438
+ showSearch: _angular_core.InputSignal<boolean>;
7439
+ /**
7440
+ * Whether the search input shows a clear button.
7441
+ * @default false
7442
+ */
7443
+ searchClearable: _angular_core.InputSignal<boolean>;
7444
+ /**
7445
+ * Whether to clear the search input when a representative is selected.
7446
+ * @default true
7447
+ */
7448
+ clearSearchOnSelect: _angular_core.InputSignal<boolean>;
7449
+ /**
7450
+ * Whether the role represents an organization.
7451
+ * Affects the search input label.
7452
+ */
7453
+ isOrganization: _angular_core.InputSignal<boolean>;
7454
+ /**
7455
+ * Label for the search input when selecting a representative.
7456
+ * Falls back to i18n labels when not provided.
7457
+ */
7458
+ searchLabel: _angular_core.InputSignal<string | undefined>;
7459
+ /**
7460
+ * Label for the search input when selecting an organization representative.
7461
+ * Overrides both the default and `searchLabel` when `isOrganization` is true.
7462
+ */
7463
+ organizationSearchLabel: _angular_core.InputSignal<string | undefined>;
7464
+ /**
7465
+ * Whether to show the role selection toggle and dropdown.
7466
+ * When not set, defaults to showing the selection when there are multiple representatives.
7467
+ */
7468
+ showRoleSwitch: _angular_core.InputSignal<boolean | undefined>;
5437
7469
  /** List of representatives */
5438
7470
  representatives: _angular_core.InputSignal<Representative[]>;
5439
7471
  /** Current representative */
5440
7472
  currentRepresentative: _angular_core.ModelSignal<Representative>;
7473
+ /**
7474
+ * Emits when the role selection (mobile collapse on tablet/mobile, popover on
7475
+ * desktop) opens or closes.
7476
+ */
7477
+ readonly roleSelectionToggle: _angular_core.OutputEmitterRef<boolean>;
5441
7478
  mobileOpen: _angular_core.WritableSignal<boolean>;
5442
7479
  inputValue: _angular_core.WritableSignal<string>;
7480
+ protected readonly inputId: string;
7481
+ readonly breakpointService: BreakpointService;
7482
+ readonly isTabletView: _angular_core.Signal<boolean>;
7483
+ protected readonly hasRoleSelection: _angular_core.Signal<boolean>;
7484
+ private readonly popover;
7485
+ private readonly searchInput;
7486
+ private previousPopoverOpen;
7487
+ private readonly parentProfile;
7488
+ constructor();
5443
7489
  translationService: TediTranslationService;
5444
7490
  switchRoleText: _angular_core.Signal<string>;
5445
7491
  closeText: _angular_core.Signal<string>;
7492
+ private defaultSearchText;
7493
+ private defaultOrgSearchText;
5446
7494
  searchText: _angular_core.Signal<string>;
5447
7495
  noResultsText: _angular_core.Signal<string>;
5448
7496
  collapseText: _angular_core.Signal<string>;
5449
7497
  filteredRepresentatives: _angular_core.Signal<Representative[]>;
7498
+ closeIfOtherRoleActive(active: unknown, isOpen: boolean): void;
5450
7499
  handleMobileOpen(): void;
5451
7500
  handleSelectRepresentative(r: Representative): void;
5452
7501
  handleInputChange(event: Event): void;
7502
+ trackById: (_: number, r: Representative) => string;
7503
+ protected resolveIcon(icon: string | RepresentativeIcon | undefined): {
7504
+ name: string;
7505
+ size: IconSize;
7506
+ } | null;
5453
7507
  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>;
7508
+ 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>;
7509
+ }
7510
+
7511
+ type HeaderSearchMobileVariant = "modal" | "inline";
7512
+ interface HeaderSearchMobileLabels {
7513
+ /** Label shown on the mobile toggle button. Falls back to the `header.search` translation. */
7514
+ button?: string;
7515
+ /** Title shown in the mobile modal heading. Falls back to the `header.search` translation. */
7516
+ modalTitle?: string;
7517
+ }
7518
+ declare class HeaderSearchComponent {
7519
+ /**
7520
+ * Behavior on mobile viewports (below the `md` breakpoint).
7521
+ * - `'modal'` shows a toggle button that opens a fullscreen native dialog containing the projected content.
7522
+ * - `'inline'` renders the projected content inline at all breakpoints (no toggle, no dialog).
7523
+ * @default "modal"
7524
+ */
7525
+ readonly mobileVariant: _angular_core.InputSignal<HeaderSearchMobileVariant>;
7526
+ /**
7527
+ * Mobile-specific labels for the toggle button and the modal title.
7528
+ * When omitted, both fall back to the `header.search` translation key.
7529
+ */
7530
+ readonly mobileLabels: _angular_core.InputSignal<HeaderSearchMobileLabels>;
7531
+ /**
7532
+ * Disables the mobile toggle button. Has no effect on desktop or in the `inline` variant.
7533
+ * @default false
7534
+ */
7535
+ readonly disabled: _angular_core.InputSignal<boolean>;
7536
+ protected readonly translationService: TediTranslationService;
7537
+ protected readonly isMobile: _angular_core.Signal<boolean>;
7538
+ protected readonly modalOpen: _angular_core.WritableSignal<boolean>;
7539
+ protected readonly dialogEl: _angular_core.Signal<ElementRef<HTMLDialogElement> | undefined>;
7540
+ protected readonly buttonLabel: _angular_core.Signal<string>;
7541
+ protected readonly modalTitle: _angular_core.Signal<string>;
7542
+ protected readonly closeLabel: _angular_core.Signal<string>;
7543
+ constructor();
7544
+ protected open(): void;
7545
+ protected close(): void;
7546
+ protected onDialogClose(): void;
7547
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<HeaderSearchComponent, never>;
7548
+ 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
7549
  }
5456
7550
 
5457
7551
  declare class SideNavDropdownComponent implements AfterViewInit {
@@ -5735,9 +7829,132 @@ interface UsePaginationArgs {
5735
7829
  */
5736
7830
  declare function usePagination({ page, pageCount, boundaryCount, siblingCount, }: UsePaginationArgs): PaginationItem[];
5737
7831
 
7832
+ /**
7833
+ * Root of the Tabs compound component. Wraps `tedi-tabs-list` and
7834
+ * `tedi-tabs-content` elements and owns the active-tab state, which the list,
7835
+ * triggers and panels read by injecting this component.
7836
+ *
7837
+ * Use `defaultValue` for uncontrolled usage, or bind `[(value)]`
7838
+ * (or `[value]` + `(valueChange)`) for controlled usage.
7839
+ */
7840
+ declare class TabsComponent {
7841
+ /** Controlled active tab id. Use with `(valueChange)` or `[(value)]`. */
7842
+ readonly value: _angular_core.InputSignal<string | undefined>;
7843
+ /** Initial active tab id for uncontrolled usage. */
7844
+ readonly defaultValue: _angular_core.InputSignal<string>;
7845
+ /** Emitted when the active tab changes. */
7846
+ readonly valueChange: _angular_core.OutputEmitterRef<string>;
7847
+ /** Currently active tab id, read by the list, triggers and panels. */
7848
+ readonly activeTab: _angular_core.WritableSignal<string>;
7849
+ private initialized;
7850
+ constructor();
7851
+ /**
7852
+ * Requests activation of a tab. In uncontrolled mode the active tab updates
7853
+ * immediately; in controlled mode only `valueChange` fires and the consumer
7854
+ * is expected to update the bound value.
7855
+ */
7856
+ select(id: string): void;
7857
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TabsComponent, never>;
7858
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TabsComponent, "tedi-tabs", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "defaultValue": { "alias": "defaultValue"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; }, never, ["*"], true, never>;
7859
+ }
7860
+
7861
+ /**
7862
+ * A single tab button inside `tedi-tabs-list`. Applied to a native `<button>`
7863
+ * so it inherits native focus, disabled and activation behaviour.
7864
+ */
7865
+ declare class TabsTriggerComponent {
7866
+ private readonly tabs;
7867
+ private readonly host;
7868
+ /**
7869
+ * Unique identifier for this tab. Used as the element id and to link to the
7870
+ * corresponding `tedi-tabs-content` panel (`aria-controls="{id}-panel"`).
7871
+ */
7872
+ readonly id: _angular_core.InputSignal<string>;
7873
+ /** Icon displayed before the label. */
7874
+ readonly icon: _angular_core.InputSignal<string | undefined>;
7875
+ /** Whether the tab is disabled. */
7876
+ readonly disabled: _angular_core.InputSignal<boolean>;
7877
+ readonly isSelected: _angular_core.Signal<boolean>;
7878
+ /** Plain-text label, used as the accessible name of the overflow dropdown item. */
7879
+ get label(): string;
7880
+ get contentNodes(): Node[];
7881
+ /** Scrolls this trigger into view within a horizontally scrolling tablist. */
7882
+ scrollIntoView(): void;
7883
+ handleClick(): void;
7884
+ handleKeydown(event: KeyboardEvent): void;
7885
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TabsTriggerComponent, never>;
7886
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TabsTriggerComponent, "button[tedi-tabs-trigger]", never, { "id": { "alias": "id"; "required": true; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
7887
+ }
7888
+
7889
+ type TabsOverflowMode = "dropdown" | "scroll";
7890
+ interface OverflowItem {
7891
+ id: string;
7892
+ disabled: boolean;
7893
+ trigger: TabsTriggerComponent;
7894
+ }
7895
+ /**
7896
+ * Container for the tab triggers. Renders the `role="tablist"` element and
7897
+ * handles tab overflow either through a "More" dropdown or horizontal scroll.
7898
+ */
7899
+ declare class TabsListComponent implements AfterViewInit, OnDestroy {
7900
+ private readonly tabs;
7901
+ private readonly platformId;
7902
+ private readonly host;
7903
+ private readonly injector;
7904
+ /** Accessible label for the tablist. */
7905
+ readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
7906
+ /** Id of the element labelling the tablist. */
7907
+ readonly ariaLabelledby: _angular_core.InputSignal<string | undefined>;
7908
+ /**
7909
+ * How to handle tab overflow when tabs do not fit in the available space.
7910
+ * - `dropdown`: overflowing tabs move into a "More" dropdown (default)
7911
+ * - `scroll`: enables horizontal scrolling with a fade indicator
7912
+ */
7913
+ readonly overflowMode: _angular_core.InputSignal<TabsOverflowMode>;
7914
+ /** Label for the overflow dropdown trigger. Defaults to the `more` translation. */
7915
+ readonly dropdownLabel: _angular_core.InputSignal<string | undefined>;
7916
+ private readonly listRef;
7917
+ private readonly triggers;
7918
+ private readonly isOverflowing;
7919
+ private resizeObserver?;
7920
+ readonly canScrollStart: _angular_core.WritableSignal<boolean>;
7921
+ readonly canScrollEnd: _angular_core.WritableSignal<boolean>;
7922
+ readonly showMore: _angular_core.Signal<boolean>;
7923
+ readonly dropdownItems: _angular_core.Signal<OverflowItem[]>;
7924
+ constructor();
7925
+ ngAfterViewInit(): void;
7926
+ ngOnDestroy(): void;
7927
+ selectTab(id: string): void;
7928
+ updateScrollFade(): void;
7929
+ private checkOverflow;
7930
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TabsListComponent, never>;
7931
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TabsListComponent, "tedi-tabs-list", never, { "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; "ariaLabelledby": { "alias": "aria-labelledby"; "required": false; "isSignal": true; }; "overflowMode": { "alias": "overflowMode"; "required": false; "isSignal": true; }; "dropdownLabel": { "alias": "dropdownLabel"; "required": false; "isSignal": true; }; }, {}, ["triggers"], ["*"], true, never>;
7932
+ }
7933
+
7934
+ /**
7935
+ * A tab panel. When `id` matches a trigger, the panel is only shown while that
7936
+ * tab is active. When `id` is omitted the content is always rendered (useful
7937
+ * for router outlets).
7938
+ */
7939
+ declare class TabsContentComponent {
7940
+ private readonly tabs;
7941
+ /** Unique identifier matching the corresponding trigger id. */
7942
+ readonly id: _angular_core.InputSignal<string | undefined>;
7943
+ readonly isActive: _angular_core.Signal<boolean>;
7944
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TabsContentComponent, never>;
7945
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TabsContentComponent, "tedi-tabs-content", never, { "id": { "alias": "id"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
7946
+ }
7947
+
5738
7948
  declare class DropdownItemValueLabelComponent {
7949
+ /**
7950
+ * Whether the label clips overflowing content for text ellipsis. Set `false`
7951
+ * when the label holds content with decorations that intentionally sit
7952
+ * outside the line box (e.g. status indicator), so they are not cut off.
7953
+ * @default true
7954
+ */
7955
+ readonly clipContent: _angular_core.InputSignal<boolean>;
5739
7956
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DropdownItemValueLabelComponent, never>;
5740
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DropdownItemValueLabelComponent, "tedi-dropdown-item-value-label", never, {}, {}, never, ["*"], true, never>;
7957
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DropdownItemValueLabelComponent, "tedi-dropdown-item-value-label", never, { "clipContent": { "alias": "clipContent"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
5741
7958
  }
5742
7959
 
5743
7960
  declare class DropdownItemValueMetaComponent {
@@ -5879,6 +8096,7 @@ declare class ModalHeaderComponent {
5879
8096
 
5880
8097
  declare class TooltipTriggerComponent implements AfterContentChecked {
5881
8098
  readonly host: ElementRef<HTMLElement>;
8099
+ readonly overlayOrigin: CdkOverlayOrigin;
5882
8100
  private renderer;
5883
8101
  readonly tooltip: TooltipComponent;
5884
8102
  private interactiveElement;
@@ -5893,18 +8111,28 @@ declare class TooltipTriggerComponent implements AfterContentChecked {
5893
8111
  onFocusOut(): void;
5894
8112
  onEscape(): void;
5895
8113
  ngAfterContentChecked(): void;
8114
+ /**
8115
+ * The element that actually receives focus and ARIA semantics. When the
8116
+ * projected child is itself focusable (a `<button>`/`<a href>`) it is used
8117
+ * directly. When it is a non-focusable wrapper that renders its own
8118
+ * interactive element (e.g. a `tedi-dropdown` projecting a trigger button),
8119
+ * the first focusable descendant is used instead — otherwise focus and the
8120
+ * tooltip description would land on the non-interactive wrapper.
8121
+ */
8122
+ private resolveInteractiveElement;
8123
+ private isFocusable;
5896
8124
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TooltipTriggerComponent, never>;
5897
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TooltipTriggerComponent, "tedi-tooltip-trigger", never, {}, {}, never, ["*"], true, never>;
8125
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TooltipTriggerComponent, "tedi-tooltip-trigger", never, {}, {}, never, ["*"], true, [{ directive: typeof _angular_cdk_overlay.CdkOverlayOrigin; inputs: {}; outputs: {}; }]>;
5898
8126
  }
5899
8127
 
5900
- type TooltipPosition = `${NgxFloatUiPlacements}`;
8128
+ type TooltipPosition = OverlayPosition;
5901
8129
  type TooltipOpenWith = "hover" | "click" | "both";
5902
8130
  declare class TooltipComponent implements AfterContentChecked {
5903
8131
  /**
5904
8132
  * The position of the tooltip relative to the trigger element.
5905
8133
  * @default top
5906
8134
  */
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">;
8135
+ readonly position: _angular_core.InputSignal<OverlayPosition>;
5908
8136
  /**
5909
8137
  * Should position to opposite direction when overflowing screen?
5910
8138
  * @default true
@@ -5915,12 +8143,6 @@ declare class TooltipComponent implements AfterContentChecked {
5915
8143
  * @default both
5916
8144
  */
5917
8145
  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
8146
  /** Delay time (in ms) for closing tooltip when not hovering trigger or content.
5925
8147
  * @default 100
5926
8148
  */
@@ -5929,19 +8151,29 @@ declare class TooltipComponent implements AfterContentChecked {
5929
8151
  readonly tooltipTrigger: _angular_core.Signal<TooltipTriggerComponent>;
5930
8152
  /** Tooltip content component */
5931
8153
  readonly tooltipContent: _angular_core.Signal<ElementRef<any>>;
8154
+ private readonly connectedOverlay;
5932
8155
  readonly descriptionId: string;
5933
8156
  readonly contentText: _angular_core.WritableSignal<string>;
5934
8157
  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>;
8158
+ readonly currentPlacement: _angular_core.WritableSignal<OverlaySide>;
8159
+ readonly arrowLeft: _angular_core.WritableSignal<number | null>;
8160
+ readonly arrowTop: _angular_core.WritableSignal<number | null>;
8161
+ readonly overlayPositions: _angular_core.Signal<_angular_cdk_overlay.ConnectedPosition[]>;
8162
+ readonly overlayOrigin: _angular_core.Signal<_angular_cdk_overlay.CdkOverlayOrigin>;
8163
+ readonly isContentHovered: _angular_core.WritableSignal<boolean>;
5938
8164
  hideTimeout?: ReturnType<typeof setTimeout>;
8165
+ private readonly horizontalPush;
8166
+ constructor();
5939
8167
  showTooltip(): void;
5940
8168
  hideTooltip(): void;
5941
8169
  toggleTooltip(): void;
8170
+ onPositionChange(change: ConnectedOverlayPositionChange): void;
8171
+ onOverlayAttach(): void;
8172
+ private updateArrowPosition;
5942
8173
  ngAfterContentChecked(): void;
8174
+ private syncContentText;
5943
8175
  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>;
8176
+ 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
8177
  }
5946
8178
 
5947
8179
  type TooltipWidth = "none" | "small" | "medium" | "large";
@@ -5983,50 +8215,6 @@ declare class PopoverContentComponent {
5983
8215
  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
8216
  }
5985
8217
 
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
8218
  type StatusBadgeColor = "neutral" | "brand" | "accent" | "success" | "danger" | "warning" | "transparent";
6031
8219
  type StatusBadgeVariant = "filled" | "filled-bordered" | "bordered";
6032
8220
  type StatusBadgeSize = "default" | "large";
@@ -6080,42 +8268,6 @@ declare class StatusBadgeComponent {
6080
8268
  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
8269
  }
6082
8270
 
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
8271
  /**
6120
8272
  * A single item inside a `tedi-accordion`. Owns the item's state (expanded)
6121
8273
  * and the inputs shared by header and content (selected, showIconCard,
@@ -6205,7 +8357,7 @@ declare class AccordionItemHeaderComponent {
6205
8357
  /**
6206
8358
  * Position of the expand action relative to the header content.
6207
8359
  */
6208
- expandActionPosition: _angular_core.InputSignal<"end" | "start">;
8360
+ expandActionPosition: _angular_core.InputSignal<"start" | "end">;
6209
8361
  /**
6210
8362
  * Custom CSS classes for the accordion header.
6211
8363
  */
@@ -6239,6 +8391,14 @@ declare class HideAtDirective {
6239
8391
  private templateRef;
6240
8392
  private viewContainerRef;
6241
8393
  private breakpointService;
8394
+ private visible;
8395
+ /**
8396
+ * Attribute usage (`hideAt` on a real element) toggles `display` so the
8397
+ * element stays in the DOM and remains eligible for content projection.
8398
+ * Structural usage (`*hideAt`) creates/clears the view instead and leaves
8399
+ * `display` untouched (returns `null`).
8400
+ */
8401
+ protected hostDisplay: _angular_core.Signal<"none" | null>;
6242
8402
  constructor();
6243
8403
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<HideAtDirective, never>;
6244
8404
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<HideAtDirective, "[hideAt]", never, { "hideAt": { "alias": "hideAt"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
@@ -6249,6 +8409,14 @@ declare class ShowAtDirective {
6249
8409
  private templateRef;
6250
8410
  private viewContainerRef;
6251
8411
  private breakpointService;
8412
+ private visible;
8413
+ /**
8414
+ * Attribute usage (`showAt` on a real element) toggles `display` so the
8415
+ * element stays in the DOM and remains eligible for content projection.
8416
+ * Structural usage (`*showAt`) creates/clears the view instead and leaves
8417
+ * `display` untouched (returns `null`).
8418
+ */
8419
+ protected hostDisplay: _angular_core.Signal<"none" | null>;
6252
8420
  constructor();
6253
8421
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ShowAtDirective, never>;
6254
8422
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ShowAtDirective, "[showAt]", never, { "showAt": { "alias": "showAt"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
@@ -6291,6 +8459,52 @@ declare const TEDI_THEME_DEFAULT_TOKEN: InjectionToken<string>;
6291
8459
 
6292
8460
  declare const TEDI_TRANSLATION_DEFAULT_TOKEN: InjectionToken<Language>;
6293
8461
 
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 };
8462
+ declare function cookieSignal<T>(key: string, initialValue: T): _angular_core.WritableSignal<T>;
8463
+
8464
+ declare function getFocusableElements(container: HTMLElement): HTMLElement[];
8465
+
8466
+ /** Horizontal gap (px) between tags in a single row. */
8467
+ declare const TAG_GAP = 8;
8468
+ /** Reserved width (px) for the "+N" counter tag. */
8469
+ declare const COUNTER_TAG_WIDTH = 40;
8470
+ interface TagOverflowOptions {
8471
+ /** Gap between adjacent tags. Defaults to {@link TAG_GAP}. */
8472
+ gap?: number;
8473
+ /** Width reserved for the "+N" counter tag. Defaults to {@link COUNTER_TAG_WIDTH}. */
8474
+ counterWidth?: number;
8475
+ }
8476
+ /**
8477
+ * Given the measured widths of single-row tags and the available width, returns
8478
+ * how many tags fit before the overflow collapses into a "+N" counter.
8479
+ *
8480
+ * Space for the counter is reserved while more tags remain, so the counter
8481
+ * stays visible. At least one tag is always shown when any exist, even if it
8482
+ * overflows on its own.
8483
+ */
8484
+ declare function calculateVisibleTagCount(tagWidths: readonly number[], availableWidth: number, { gap, counterWidth }?: TagOverflowOptions): number;
8485
+
8486
+ /**
8487
+ * Checks if a string is a valid `HH:mm` time (00:00 – 23:59).
8488
+ */
8489
+ declare function isValidTime(time: string | null | undefined): boolean;
8490
+ /**
8491
+ * Normalizes common typing patterns into `HH:mm`.
8492
+ *
8493
+ * Returns:
8494
+ * - the canonical `HH:mm` string when the input can be normalized
8495
+ * - `""` when the input is empty
8496
+ * - `null` when the input is non-empty but cannot be normalized
8497
+ *
8498
+ * Examples:
8499
+ * `"9:5"` → `"09:05"`
8500
+ * `"14:5"` → `"14:05"`
8501
+ * `"2359"` → `"23:59"`
8502
+ * `"930"` → `"09:30"`
8503
+ * `"11.55"` / `"11-55"` → `"11:55"` (any non-digit treated as separator)
8504
+ * `"4:89"` / `"24:00"` → `null`
8505
+ */
8506
+ declare function normalizeTime(input: string): string | null;
8507
+
8508
+ 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, TabsComponent, TabsContentComponent, TabsListComponent, TabsTriggerComponent, 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 };
8509
+ 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, TabsOverflowMode, 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
8510
  //# sourceMappingURL=index.d.ts.map