@tedi-design-system/angular 8.2.0-rc.6 → 9.0.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tedi-design-system/angular",
3
- "version": "8.2.0-rc.6",
3
+ "version": "9.0.0-rc.1",
4
4
  "type": "module",
5
5
  "main": "community.mjs",
6
6
  "module": "fesm2022/tedi-design-system-angular.mjs",
package/tedi/index.d.ts CHANGED
@@ -2212,56 +2212,6 @@ declare class CollapseButtonComponent {
2212
2212
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<CollapseButtonComponent, "button[tedi-collapse-button]", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "openText": { "alias": "openText"; "required": false; "isSignal": true; }; "closeText": { "alias": "closeText"; "required": false; "isSignal": true; }; "hideText": { "alias": "hideText"; "required": false; "isSignal": true; }; "arrowType": { "alias": "arrowType"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "inverted": { "alias": "inverted"; "required": false; "isSignal": true; }; "underline": { "alias": "underline"; "required": false; "isSignal": true; }; "ariaControls": { "alias": "ariaControls"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; }, { "openChange": "openChange"; }, never, never, true, never>;
2213
2213
  }
2214
2214
 
2215
- type ArrowType = CollapseButtonArrowType;
2216
- type CollapseSize = CollapseButtonSize;
2217
- declare class CollapseComponent implements AfterViewInit {
2218
- /**
2219
- * The title/header element for the collapsible section.
2220
- * Rendered inside the toggle button.
2221
- */
2222
- openText: _angular_core.InputSignal<string | undefined>;
2223
- /**
2224
- * Text shown on the toggle button when the content is expanded.
2225
- */
2226
- closeText: _angular_core.InputSignal<string | undefined>;
2227
- /**
2228
- * Whether the collapse should be initially open.
2229
- * @default false
2230
- */
2231
- defaultOpen: _angular_core.InputSignal<boolean>;
2232
- /**
2233
- * To show or hide the openText and closeText.
2234
- * @default "false"
2235
- */
2236
- hideCollapseText: _angular_core.InputSignal<boolean>;
2237
- /**
2238
- * Option for toggling different arrow styles.
2239
- * @default "default"
2240
- */
2241
- arrowType: _angular_core.InputSignal<CollapseButtonArrowType>;
2242
- /**
2243
- * Visual size of the toggle button.
2244
- * @default "default"
2245
- */
2246
- size: _angular_core.InputSignal<CollapseButtonSize>;
2247
- /**
2248
- * Inverted color palette — flips the link / icon colors to their
2249
- * inverted-surface equivalents (white text + icon), for use on top of dark
2250
- * backgrounds. Pairs with both the text and icon-only variants; the
2251
- * secondary-arrow style has no inverted form in the design and the flag is
2252
- * ignored when `arrowType === 'secondary'`.
2253
- * @default false
2254
- */
2255
- inverted: _angular_core.InputSignal<boolean>;
2256
- collapseContentId: string;
2257
- isOpen: _angular_core.WritableSignal<boolean>;
2258
- protected readonly isInvertedActive: _angular_core.Signal<boolean>;
2259
- toggleCollapse(): void;
2260
- ngAfterViewInit(): void;
2261
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<CollapseComponent, never>;
2262
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<CollapseComponent, "tedi-collapse", never, { "openText": { "alias": "openText"; "required": false; "isSignal": true; }; "closeText": { "alias": "closeText"; "required": false; "isSignal": true; }; "defaultOpen": { "alias": "defaultOpen"; "required": false; "isSignal": true; }; "hideCollapseText": { "alias": "hideCollapseText"; "required": false; "isSignal": true; }; "arrowType": { "alias": "arrowType"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "inverted": { "alias": "inverted"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
2263
- }
2264
-
2265
2215
  type ClosingButtonSize = "default" | "small";
2266
2216
  type ClosingButtonIconSize = 18 | 24;
2267
2217
  declare class ClosingButtonComponent {
@@ -2848,6 +2798,108 @@ declare class CardHeaderComponent extends CardContentComponent {
2848
2798
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<CardHeaderComponent, "tedi-card-header", never, {}, {}, never, ["*"], true, never>;
2849
2799
  }
2850
2800
 
2801
+ type ArrowType = CollapseButtonArrowType;
2802
+ type CollapseSize = CollapseButtonSize;
2803
+ declare class CollapseComponent implements AfterViewInit {
2804
+ /**
2805
+ * The title/header element for the collapsible section.
2806
+ * Rendered inside the toggle button.
2807
+ */
2808
+ openText: _angular_core.InputSignal<string | undefined>;
2809
+ /**
2810
+ * Text shown on the toggle button when the content is expanded.
2811
+ */
2812
+ closeText: _angular_core.InputSignal<string | undefined>;
2813
+ /**
2814
+ * Whether the collapse should be initially open.
2815
+ * @default false
2816
+ */
2817
+ defaultOpen: _angular_core.InputSignal<boolean>;
2818
+ /**
2819
+ * To show or hide the openText and closeText.
2820
+ * @default "false"
2821
+ */
2822
+ hideCollapseText: _angular_core.InputSignal<boolean>;
2823
+ /**
2824
+ * Option for toggling different arrow styles.
2825
+ * @default "default"
2826
+ */
2827
+ arrowType: _angular_core.InputSignal<CollapseButtonArrowType>;
2828
+ /**
2829
+ * Visual size of the toggle button.
2830
+ * @default "default"
2831
+ */
2832
+ size: _angular_core.InputSignal<CollapseButtonSize>;
2833
+ /**
2834
+ * Inverted color palette — flips the link / icon colors to their
2835
+ * inverted-surface equivalents (white text + icon), for use on top of dark
2836
+ * backgrounds. Pairs with both the text and icon-only variants; the
2837
+ * secondary-arrow style has no inverted form in the design and the flag is
2838
+ * ignored when `arrowType === 'secondary'`.
2839
+ * @default false
2840
+ */
2841
+ inverted: _angular_core.InputSignal<boolean>;
2842
+ collapseContentId: string;
2843
+ isOpen: _angular_core.WritableSignal<boolean>;
2844
+ protected readonly isInvertedActive: _angular_core.Signal<boolean>;
2845
+ toggleCollapse(): void;
2846
+ ngAfterViewInit(): void;
2847
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CollapseComponent, never>;
2848
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CollapseComponent, "tedi-collapse", never, { "openText": { "alias": "openText"; "required": false; "isSignal": true; }; "closeText": { "alias": "closeText"; "required": false; "isSignal": true; }; "defaultOpen": { "alias": "defaultOpen"; "required": false; "isSignal": true; }; "hideCollapseText": { "alias": "hideCollapseText"; "required": false; "isSignal": true; }; "arrowType": { "alias": "arrowType"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "inverted": { "alias": "inverted"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
2849
+ }
2850
+
2851
+ type EmptyStateType = "separate" | "attached" | "inside";
2852
+ type EmptyStateSize = "default" | "small";
2853
+ /**
2854
+ * Communicates that there is nothing to display — empty search results, an
2855
+ * unpopulated list, a freshly-created workspace — and optionally guides the
2856
+ * user toward the next step via action buttons or a link.
2857
+ *
2858
+ * Description is projected via `<ng-content>`. Actions are projected via
2859
+ * `<ng-content select="[tedi-empty-state-actions]">`.
2860
+ */
2861
+ declare class EmptyStateComponent {
2862
+ /**
2863
+ * Container variant — matches the Figma "Types" section.
2864
+ * - `'separate'` (default) — full border + radius, stands on its own.
2865
+ * - `'attached'` — top border omitted so the block sits flush beneath a
2866
+ * preceding card or table (same width + same bottom-radius).
2867
+ * - `'inside'` — no border, no radius; intended to be placed inside another
2868
+ * container such as a `<tedi-card>` or `<tedi-table>`.
2869
+ * @default separate
2870
+ */
2871
+ readonly type: _angular_core.InputSignal<EmptyStateType>;
2872
+ /**
2873
+ * Padding scale. `default` = 24px, `small` = 16px.
2874
+ * @default default
2875
+ */
2876
+ readonly size: _angular_core.InputSignal<EmptyStateSize>;
2877
+ /**
2878
+ * Material icon name rendered above the text block. Pass `null` to hide.
2879
+ * @default spa
2880
+ */
2881
+ readonly icon: _angular_core.InputSignal<string | null>;
2882
+ /**
2883
+ * Color of the icon. Defaults to brand so the empty state reads as a
2884
+ * "fresh canvas" cue rather than a destructive state.
2885
+ * @default brand
2886
+ */
2887
+ readonly iconColor: _angular_core.InputSignal<IconColor>;
2888
+ /**
2889
+ * Size of the icon, in pixels.
2890
+ * @default 36
2891
+ */
2892
+ readonly iconSize: _angular_core.InputSignal<IconSize>;
2893
+ /**
2894
+ * Optional heading rendered above the description — appears as an `<h3>` in
2895
+ * brand-primary text color.
2896
+ */
2897
+ readonly heading: _angular_core.InputSignal<string | undefined>;
2898
+ protected readonly hostClasses: _angular_core.Signal<string>;
2899
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EmptyStateComponent, never>;
2900
+ 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>;
2901
+ }
2902
+
2851
2903
  declare class HeadingWithIconComponent {
2852
2904
  /**
2853
2905
  * Name of the Material Icon
@@ -2895,6 +2947,40 @@ declare class HeadingWithIconComponent {
2895
2947
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<HeadingWithIconComponent, "tedi-heading-with-icon", never, { "icon": { "alias": "icon"; "required": true; "isSignal": true; }; "element": { "alias": "element"; "required": false; "isSignal": true; }; "modifiers": { "alias": "modifiers"; "required": false; "isSignal": true; }; "headingColor": { "alias": "headingColor"; "required": false; "isSignal": true; }; "iconColor": { "alias": "iconColor"; "required": false; "isSignal": true; }; "iconSize": { "alias": "iconSize"; "required": false; "isSignal": true; }; "iconVariant": { "alias": "iconVariant"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
2896
2948
  }
2897
2949
 
2950
+ type LabelSize = "small" | "default";
2951
+ type LabelColor = "primary" | "secondary";
2952
+ type LabelVisuallyHidden = boolean | "reserve-space";
2953
+ declare class LabelComponent {
2954
+ private readonly field;
2955
+ /**
2956
+ * Size of the label. Falls back to the size of a wrapping `tedi-form-field`,
2957
+ * so the label and the control scale together without being set twice.
2958
+ * @default default
2959
+ */
2960
+ size: _angular_core.InputSignal<LabelSize | undefined>;
2961
+ readonly resolvedSize: _angular_core.Signal<LabelSize>;
2962
+ /**
2963
+ * Whether label is required.
2964
+ * @default false
2965
+ */
2966
+ required: _angular_core.InputSignal<boolean>;
2967
+ /**
2968
+ * Color of the label.
2969
+ * @default secondary
2970
+ */
2971
+ color: _angular_core.InputSignal<LabelColor>;
2972
+ /**
2973
+ * Hides the label visually while keeping it in the accessibility tree, so the
2974
+ * control it names stays named. `"reserve-space"` also keeps the label's line
2975
+ * of layout, to align the field with labelled siblings in the same row.
2976
+ * @default false
2977
+ */
2978
+ visuallyHidden: _angular_core.InputSignal<LabelVisuallyHidden>;
2979
+ classes: _angular_core.Signal<string>;
2980
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LabelComponent, never>;
2981
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<LabelComponent, "[tedi-label]", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "visuallyHidden": { "alias": "visuallyHidden"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
2982
+ }
2983
+
2898
2984
  type BulletColor = "primary" | "secondary" | "tertiary" | "brand" | "brand-dark" | "success" | "warning" | "warning-dark" | "danger" | "white";
2899
2985
  declare class ListComponent {
2900
2986
  /**
@@ -6277,6 +6363,23 @@ interface FormFieldControl<T = unknown> {
6277
6363
  * `aria-describedby`; nothing is pushed when the control stands alone.
6278
6364
  */
6279
6365
  setDescribedBy?(ids: string[]): void;
6366
+ /**
6367
+ * Set by controls that render their own clear button — date and time put one in
6368
+ * their action row beside the picker button, which cannot leave the control
6369
+ * because the overlay anchors to it. The field then skips its generic clear
6370
+ * button so a single `clearable` never yields two.
6371
+ */
6372
+ readonly ownsClearButton?: boolean;
6373
+ /**
6374
+ * Whether the control is read-only. The field hides its clear button while it
6375
+ * is, since the user cannot edit the value; a programmatic `reset()` still works.
6376
+ */
6377
+ readOnly?: Signal<boolean>;
6378
+ /**
6379
+ * Set to `false` by controls that never take a clear button — a textarea, per
6380
+ * the design. The field then skips its button whatever `clearable` says.
6381
+ */
6382
+ readonly clearButton?: false;
6280
6383
  }
6281
6384
  /**
6282
6385
  * Injection token used by `tedi-form-field` to obtain
@@ -6296,6 +6399,8 @@ interface FieldContext {
6296
6399
  valid: Signal<boolean>;
6297
6400
  /** From an input group that disables everything inside it. */
6298
6401
  disabled: Signal<boolean>;
6402
+ /** Whether the field shows a clear button — controls read it instead of declaring their own. */
6403
+ clearable: Signal<boolean>;
6299
6404
  }
6300
6405
  declare const TEDI_FIELD_CONTEXT: InjectionToken<FieldContext>;
6301
6406
 
@@ -6381,6 +6486,12 @@ declare class DateFieldComponent implements OnInit, ControlValueAccessor, FormFi
6381
6486
  * set here.
6382
6487
  */
6383
6488
  readonly size: _angular_core.InputSignal<DateFieldSize | undefined>;
6489
+ /**
6490
+ * Whether the clear button shows once the field has a value. Falls back to the
6491
+ * wrapping `tedi-form-field`'s `clearable` when not set here — set it on the
6492
+ * wrapper, and use this only for a standalone field.
6493
+ */
6494
+ readonly clearable: _angular_core.InputSignalWithTransform<boolean | undefined, unknown>;
6384
6495
  /**
6385
6496
  * Forces the error state on, or off, regardless of the reactive-forms state.
6386
6497
  * Leave unset to let the control derive it.
@@ -6542,6 +6653,10 @@ declare class DateFieldComponent implements OnInit, ControlValueAccessor, FormFi
6542
6653
  readonly valid: _angular_core.Signal<boolean>;
6543
6654
  readonly childContext: FieldContext;
6544
6655
  ngOnInit(): void;
6656
+ /** The clear button sits in the date input's action row, beside the calendar. */
6657
+ readonly ownsClearButton = true;
6658
+ /** Own `clearable` wins, then the wrapping `tedi-form-field`'s. */
6659
+ readonly clearableResolved: _angular_core.Signal<boolean>;
6545
6660
  readonly resolvedDisabledMatchers: _angular_core.Signal<Matcher[]>;
6546
6661
  readonly useNativePickerResolved: _angular_core.Signal<boolean>;
6547
6662
  readonly useNativePickerEffective: _angular_core.Signal<boolean>;
@@ -6616,7 +6731,7 @@ declare class DateFieldComponent implements OnInit, ControlValueAccessor, FormFi
6616
6731
  private toIsoDate;
6617
6732
  private queryNativeInput;
6618
6733
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DateFieldComponent, never>;
6619
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DateFieldComponent, "tedi-date-field", never, { "inputId": { "alias": "inputId"; "required": true; "isSignal": true; }; "name": { "alias": "name"; "required": false; "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; }; "invalidInput": { "alias": "invalid"; "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; }; "minYear": { "alias": "minYear"; "required": false; "isSignal": true; }; "maxYear": { "alias": "maxYear"; "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; }; "hideOnScroll": { "alias": "hideOnScroll"; "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>;
6734
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DateFieldComponent, "tedi-date-field", never, { "inputId": { "alias": "inputId"; "required": true; "isSignal": true; }; "name": { "alias": "name"; "required": false; "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; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "invalidInput": { "alias": "invalid"; "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; }; "minYear": { "alias": "minYear"; "required": false; "isSignal": true; }; "maxYear": { "alias": "maxYear"; "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; }; "hideOnScroll": { "alias": "hideOnScroll"; "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>;
6620
6735
  }
6621
6736
 
6622
6737
  declare class DatePickerCalendarGridComponent {
@@ -6839,40 +6954,6 @@ declare class FeedbackTextComponent {
6839
6954
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<FeedbackTextComponent, "tedi-feedback-text", never, { "id": { "alias": "id"; "required": false; "isSignal": true; }; "text": { "alias": "text"; "required": true; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
6840
6955
  }
6841
6956
 
6842
- type LabelSize = "small" | "default";
6843
- type LabelColor = "primary" | "secondary";
6844
- type LabelVisuallyHidden = boolean | "reserve-space";
6845
- declare class LabelComponent {
6846
- private readonly field;
6847
- /**
6848
- * Size of the label. Falls back to the size of a wrapping `tedi-form-field`,
6849
- * so the label and the control scale together without being set twice.
6850
- * @default default
6851
- */
6852
- size: _angular_core.InputSignal<LabelSize | undefined>;
6853
- readonly resolvedSize: _angular_core.Signal<LabelSize>;
6854
- /**
6855
- * Whether label is required.
6856
- * @default false
6857
- */
6858
- required: _angular_core.InputSignal<boolean>;
6859
- /**
6860
- * Color of the label.
6861
- * @default secondary
6862
- */
6863
- color: _angular_core.InputSignal<LabelColor>;
6864
- /**
6865
- * Hides the label visually while keeping it in the accessibility tree, so the
6866
- * control it names stays named. `"reserve-space"` also keeps the label's line
6867
- * of layout, to align the field with labelled siblings in the same row.
6868
- * @default false
6869
- */
6870
- visuallyHidden: _angular_core.InputSignal<LabelVisuallyHidden>;
6871
- classes: _angular_core.Signal<string>;
6872
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<LabelComponent, never>;
6873
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<LabelComponent, "[tedi-label]", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "visuallyHidden": { "alias": "visuallyHidden"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
6874
- }
6875
-
6876
6957
  declare class LabelRowComponent {
6877
6958
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<LabelRowComponent, never>;
6878
6959
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<LabelRowComponent, "tedi-label-row", never, {}, {}, never, ["*"], true, never>;
@@ -6989,10 +7070,18 @@ declare class FormFieldComponent implements FieldContext {
6989
7070
  */
6990
7071
  icon: _angular_core.InputSignal<string | FormFieldIcon | undefined>;
6991
7072
  /**
6992
- * Whether the field shows a clear button once the control holds a value.
7073
+ * Whether the field shows a clear button once the control holds a value. The
7074
+ * single source of truth for every control inside it — date and time fields
7075
+ * read it too instead of declaring their own input. A textarea never gets one.
7076
+ * @default true
7077
+ */
7078
+ clearable: _angular_core.InputSignalWithTransform<boolean, unknown>;
7079
+ /**
7080
+ * Show the clear button only while the filled field is hovered or focused.
7081
+ * Requires `clearable`.
6993
7082
  * @default false
6994
7083
  */
6995
- clearable: _angular_core.InputSignal<boolean>;
7084
+ showClearOnInteraction: _angular_core.InputSignal<boolean>;
6996
7085
  /**
6997
7086
  * Custom CSS classes for the field box.
6998
7087
  *
@@ -7016,6 +7105,12 @@ declare class FormFieldComponent implements FieldContext {
7016
7105
  * itself and no box is rendered at all.
7017
7106
  */
7018
7107
  readonly hasBox: _angular_core.Signal<boolean>;
7108
+ /**
7109
+ * Whether the field renders its own clear button. Controls that render one
7110
+ * themselves opt out, so `clearable` drives them without producing two, and
7111
+ * a control that cannot be reset, or never takes one, gets none.
7112
+ */
7113
+ readonly renderClearButton: _angular_core.Signal<boolean>;
7019
7114
  readonly ownsSurface: _angular_core.Signal<boolean>;
7020
7115
  readonly disabled: _angular_core.Signal<boolean>;
7021
7116
  readonly invalid: _angular_core.Signal<boolean>;
@@ -7047,11 +7142,12 @@ declare class FormFieldComponent implements FieldContext {
7047
7142
  "tedi-form-field--valid": boolean;
7048
7143
  "tedi-form-field--invalid": boolean;
7049
7144
  "tedi-form-field--disabled": boolean;
7145
+ "tedi-form-field--clear-on-interaction": boolean;
7050
7146
  "tedi-form-field--small": boolean;
7051
7147
  "tedi-form-field--large": boolean;
7052
7148
  }>;
7053
7149
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FormFieldComponent, never>;
7054
- 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; }; "characterLimit": { "alias": "characterLimit"; "required": false; "isSignal": true; }; }, {}, ["control", "feedback"], ["label[tedi-label], tedi-label-row", "*", "tedi-feedback-text", "[tediFormFieldExtra]"], true, never>;
7150
+ 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; }; "showClearOnInteraction": { "alias": "showClearOnInteraction"; "required": false; "isSignal": true; }; "inputClass": { "alias": "inputClass"; "required": false; "isSignal": true; }; "characterLimit": { "alias": "characterLimit"; "required": false; "isSignal": true; }; }, {}, ["control", "feedback"], ["label[tedi-label], tedi-label-row", "*", "tedi-feedback-text", "[tediFormFieldExtra]"], true, never>;
7055
7151
  }
7056
7152
 
7057
7153
  /**
@@ -7174,6 +7270,12 @@ declare class SearchComponent<T = unknown> implements ControlValueAccessor {
7174
7270
  * @default true
7175
7271
  */
7176
7272
  clearable: _angular_core.InputSignal<boolean>;
7273
+ /**
7274
+ * Show the clear button only while the filled search field is hovered or focused.
7275
+ * Requires `clearable`.
7276
+ * @default false
7277
+ */
7278
+ showClearOnInteraction: _angular_core.InputSignal<boolean>;
7177
7279
  /**
7178
7280
  * Icon shown inside the input. Ignored when `button` is set.
7179
7281
  * @default "search"
@@ -7379,7 +7481,7 @@ declare class SearchComponent<T = unknown> implements ControlValueAccessor {
7379
7481
  private panelElement;
7380
7482
  private resetActiveOption;
7381
7483
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SearchComponent<any>, never>;
7382
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SearchComponent<any>, "tedi-search", never, { "inputId": { "alias": "inputId"; "required": true; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "searchIcon": { "alias": "searchIcon"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "button": { "alias": "button"; "required": false; "isSignal": true; }; "feedbackText": { "alias": "feedbackText"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "suggestions": { "alias": "suggestions"; "required": false; "isSignal": true; }; "bindLabel": { "alias": "bindLabel"; "required": false; "isSignal": true; }; "bindDescription": { "alias": "bindDescription"; "required": false; "isSignal": true; }; "bindDisabled": { "alias": "bindDisabled"; "required": false; "isSignal": true; }; "minQueryLength": { "alias": "minQueryLength"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "hideOnScroll": { "alias": "hideOnScroll"; "required": false; "isSignal": true; }; "panelOpen": { "alias": "panelOpen"; "required": false; "isSignal": true; }; "noResultsText": { "alias": "noResultsText"; "required": false; "isSignal": true; }; "loadingText": { "alias": "loadingText"; "required": false; "isSignal": true; }; "resultsCountText": { "alias": "resultsCountText"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "panelOpen": "panelOpenChange"; "searchEvent": "searchEvent"; "clear": "clear"; "suggestionSelect": "suggestionSelect"; }, ["suggestionTemplate", "footerTemplate"], never, true, never>;
7484
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SearchComponent<any>, "tedi-search", never, { "inputId": { "alias": "inputId"; "required": true; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "showClearOnInteraction": { "alias": "showClearOnInteraction"; "required": false; "isSignal": true; }; "searchIcon": { "alias": "searchIcon"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "button": { "alias": "button"; "required": false; "isSignal": true; }; "feedbackText": { "alias": "feedbackText"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "suggestions": { "alias": "suggestions"; "required": false; "isSignal": true; }; "bindLabel": { "alias": "bindLabel"; "required": false; "isSignal": true; }; "bindDescription": { "alias": "bindDescription"; "required": false; "isSignal": true; }; "bindDisabled": { "alias": "bindDisabled"; "required": false; "isSignal": true; }; "minQueryLength": { "alias": "minQueryLength"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "hideOnScroll": { "alias": "hideOnScroll"; "required": false; "isSignal": true; }; "panelOpen": { "alias": "panelOpen"; "required": false; "isSignal": true; }; "noResultsText": { "alias": "noResultsText"; "required": false; "isSignal": true; }; "loadingText": { "alias": "loadingText"; "required": false; "isSignal": true; }; "resultsCountText": { "alias": "resultsCountText"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "panelOpen": "panelOpenChange"; "searchEvent": "searchEvent"; "clear": "clear"; "suggestionSelect": "suggestionSelect"; }, ["suggestionTemplate", "footerTemplate"], never, true, never>;
7383
7485
  }
7384
7486
 
7385
7487
  declare class SearchSuggestionComponent implements Highlightable {
@@ -7594,6 +7696,12 @@ declare class SelectComponent<T = unknown> implements AfterContentChecked, After
7594
7696
  * @default false
7595
7697
  */
7596
7698
  clearable: _angular_core.InputSignal<boolean>;
7699
+ /**
7700
+ * Show the clear button only while the filled select is hovered or focused.
7701
+ * Requires `clearable`.
7702
+ * @default false
7703
+ */
7704
+ showClearOnInteraction: _angular_core.InputSignal<boolean>;
7597
7705
  /**
7598
7706
  * Element reference used to determine dropdown width.
7599
7707
  * When null, dropdown width matches the host element.
@@ -7963,7 +8071,7 @@ declare class SelectComponent<T = unknown> implements AfterContentChecked, After
7963
8071
  registerOnTouched(fn: () => void): void;
7964
8072
  setDisabledState(isDisabled: boolean): void;
7965
8073
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SelectComponent<any>, never>;
7966
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SelectComponent<any>, "tedi-select", never, { "inputId": { "alias": "inputId"; "required": true; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "tooltip": { "alias": "tooltip"; "required": false; "isSignal": true; }; "ariaLabelledby": { "alias": "ariaLabelledby"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "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; }; "value": { "alias": "value"; "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; }; "ellipsis": { "alias": "ellipsis"; "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; }; "hideOnScroll": { "alias": "hideOnScroll"; "required": false; "isSignal": true; }; "dropdownType": { "alias": "dropdownType"; "required": false; "isSignal": true; }; "virtualScroll": { "alias": "virtualScroll"; "required": false; "isSignal": true; }; "virtualItemSize": { "alias": "virtualItemSize"; "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", "tooltipTemplate"], never, true, never>;
8074
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SelectComponent<any>, "tedi-select", never, { "inputId": { "alias": "inputId"; "required": true; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "tooltip": { "alias": "tooltip"; "required": false; "isSignal": true; }; "ariaLabelledby": { "alias": "ariaLabelledby"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "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; }; "showClearOnInteraction": { "alias": "showClearOnInteraction"; "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; }; "value": { "alias": "value"; "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; }; "ellipsis": { "alias": "ellipsis"; "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; }; "hideOnScroll": { "alias": "hideOnScroll"; "required": false; "isSignal": true; }; "dropdownType": { "alias": "dropdownType"; "required": false; "isSignal": true; }; "virtualScroll": { "alias": "virtualScroll"; "required": false; "isSignal": true; }; "virtualItemSize": { "alias": "virtualItemSize"; "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", "tooltipTemplate"], never, true, never>;
7967
8075
  }
7968
8076
 
7969
8077
  type SliderHideLabel = boolean | "keep-space";
@@ -8299,6 +8407,9 @@ declare class TextFieldComponent implements OnInit, ControlValueAccessor, FormFi
8299
8407
  * Combined with the reactive-forms disabled state and any input-group state.
8300
8408
  */
8301
8409
  readonly disabledInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
8410
+ readonly readOnlyAttribute: _angular_core.InputSignalWithTransform<boolean, unknown>;
8411
+ readonly readOnlyProperty: _angular_core.InputSignalWithTransform<boolean, unknown>;
8412
+ readonly readOnly: _angular_core.Signal<boolean>;
8302
8413
  readonly disabled: _angular_core.Signal<boolean>;
8303
8414
  private readonly derived;
8304
8415
  readonly describedBy: _tedi_design_system_angular_tedi.ControlDescribedBy;
@@ -8324,7 +8435,7 @@ declare class TextFieldComponent implements OnInit, ControlValueAccessor, FormFi
8324
8435
  focus(): void;
8325
8436
  reset(): void;
8326
8437
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TextFieldComponent, never>;
8327
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TextFieldComponent, "input[tedi-text-field]", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "invalidInput": { "alias": "invalid"; "required": false; "isSignal": true; }; "arrowsHidden": { "alias": "arrowsHidden"; "required": false; "isSignal": true; }; "disabledInput": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "clear": "clear"; }, never, never, true, never>;
8438
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TextFieldComponent, "input[tedi-text-field]", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "invalidInput": { "alias": "invalid"; "required": false; "isSignal": true; }; "arrowsHidden": { "alias": "arrowsHidden"; "required": false; "isSignal": true; }; "disabledInput": { "alias": "disabled"; "required": false; "isSignal": true; }; "readOnlyAttribute": { "alias": "readonly"; "required": false; "isSignal": true; }; "readOnlyProperty": { "alias": "readOnly"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "clear": "clear"; }, never, never, true, never>;
8328
8439
  }
8329
8440
 
8330
8441
  type TextareaSize = Exclude<InputSize, "large">;
@@ -8407,6 +8518,11 @@ declare class TextareaComponent implements OnInit, ControlValueAccessor, FormFie
8407
8518
  */
8408
8519
  readonly minHeightStyle: _angular_core.Signal<string>;
8409
8520
  readonly maxHeightStyle: _angular_core.Signal<string>;
8521
+ readonly readOnlyAttribute: _angular_core.InputSignalWithTransform<boolean, unknown>;
8522
+ readonly readOnlyProperty: _angular_core.InputSignalWithTransform<boolean, unknown>;
8523
+ readonly readOnly: _angular_core.Signal<boolean>;
8524
+ /** Textareas take no clear button, even inside a `clearable` form field. */
8525
+ readonly clearButton = false;
8410
8526
  readonly disabled: _angular_core.Signal<boolean>;
8411
8527
  private readonly derived;
8412
8528
  readonly describedBy: _tedi_design_system_angular_tedi.ControlDescribedBy;
@@ -8429,7 +8545,7 @@ declare class TextareaComponent implements OnInit, ControlValueAccessor, FormFie
8429
8545
  focus(): void;
8430
8546
  reset(): void;
8431
8547
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TextareaComponent, never>;
8432
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TextareaComponent, "textarea[tedi-textarea]", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "invalidInput": { "alias": "invalid"; "required": false; "isSignal": true; }; "resizable": { "alias": "resizable"; "required": false; "isSignal": true; }; "autoGrow": { "alias": "autoGrow"; "required": false; "isSignal": true; }; "minRows": { "alias": "minRows"; "required": false; "isSignal": true; }; "maxRows": { "alias": "maxRows"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "maxHeight": { "alias": "maxHeight"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
8548
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TextareaComponent, "textarea[tedi-textarea]", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "invalidInput": { "alias": "invalid"; "required": false; "isSignal": true; }; "resizable": { "alias": "resizable"; "required": false; "isSignal": true; }; "autoGrow": { "alias": "autoGrow"; "required": false; "isSignal": true; }; "minRows": { "alias": "minRows"; "required": false; "isSignal": true; }; "maxRows": { "alias": "maxRows"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "maxHeight": { "alias": "maxHeight"; "required": false; "isSignal": true; }; "readOnlyAttribute": { "alias": "readonly"; "required": false; "isSignal": true; }; "readOnlyProperty": { "alias": "readOnly"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
8433
8549
  }
8434
8550
 
8435
8551
  type TimePickerVariant = "scroll" | "slots" | "dropdown";
@@ -8604,8 +8720,12 @@ declare class TimeFieldComponent implements OnInit, ControlValueAccessor, FormFi
8604
8720
  * set here.
8605
8721
  */
8606
8722
  readonly size: _angular_core.InputSignal<"small" | "default" | undefined>;
8607
- /** Show a clear button when the field has a value. */
8608
- readonly clearable: _angular_core.InputSignal<boolean>;
8723
+ /**
8724
+ * Whether the clear button shows once the field has a value. Falls back to the
8725
+ * wrapping `tedi-form-field`'s `clearable` when not set here — set it on the
8726
+ * wrapper, and use this only for a standalone field.
8727
+ */
8728
+ readonly clearable: _angular_core.InputSignalWithTransform<boolean | undefined, unknown>;
8609
8729
  /** Picker variant. `none` renders just the input with no picker UI — typed input is still normalized on blur. */
8610
8730
  readonly pickerVariant: _angular_core.InputSignal<TimeFieldPickerVariant>;
8611
8731
  /**
@@ -8652,6 +8772,10 @@ declare class TimeFieldComponent implements OnInit, ControlValueAccessor, FormFi
8652
8772
  ngOnInit(): void;
8653
8773
  readonly hasValue: _angular_core.Signal<boolean>;
8654
8774
  readonly showClear: _angular_core.Signal<boolean>;
8775
+ /** The clear button sits in the time field's action row, beside the picker. */
8776
+ readonly ownsClearButton = true;
8777
+ /** Own `clearable` wins, then the wrapping `tedi-form-field`'s. */
8778
+ readonly clearableResolved: _angular_core.Signal<boolean>;
8655
8779
  readonly useNativePickerResolved: _angular_core.Signal<boolean>;
8656
8780
  readonly hasPicker: _angular_core.Signal<boolean>;
8657
8781
  readonly hasNativePicker: _angular_core.Signal<boolean>;
@@ -8888,58 +9012,6 @@ declare class AttachmentActionsComponent {
8888
9012
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<AttachmentActionsComponent, "tedi-attachment-actions", never, { "padded": { "alias": "padded"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
8889
9013
  }
8890
9014
 
8891
- type EmptyStateType = "separate" | "attached" | "inside";
8892
- type EmptyStateSize = "default" | "small";
8893
- /**
8894
- * Communicates that there is nothing to display — empty search results, an
8895
- * unpopulated list, a freshly-created workspace — and optionally guides the
8896
- * user toward the next step via action buttons or a link.
8897
- *
8898
- * Description is projected via `<ng-content>`. Actions are projected via
8899
- * `<ng-content select="[tedi-empty-state-actions]">`.
8900
- */
8901
- declare class EmptyStateComponent {
8902
- /**
8903
- * Container variant — matches the Figma "Types" section.
8904
- * - `'separate'` (default) — full border + radius, stands on its own.
8905
- * - `'attached'` — top border omitted so the block sits flush beneath a
8906
- * preceding card or table (same width + same bottom-radius).
8907
- * - `'inside'` — no border, no radius; intended to be placed inside another
8908
- * container such as a `<tedi-card>` or `<tedi-table>`.
8909
- * @default separate
8910
- */
8911
- readonly type: _angular_core.InputSignal<EmptyStateType>;
8912
- /**
8913
- * Padding scale. `default` = 24px, `small` = 16px.
8914
- * @default default
8915
- */
8916
- readonly size: _angular_core.InputSignal<EmptyStateSize>;
8917
- /**
8918
- * Material icon name rendered above the text block. Pass `null` to hide.
8919
- * @default spa
8920
- */
8921
- readonly icon: _angular_core.InputSignal<string | null>;
8922
- /**
8923
- * Color of the icon. Defaults to brand so the empty state reads as a
8924
- * "fresh canvas" cue rather than a destructive state.
8925
- * @default brand
8926
- */
8927
- readonly iconColor: _angular_core.InputSignal<IconColor>;
8928
- /**
8929
- * Size of the icon, in pixels.
8930
- * @default 36
8931
- */
8932
- readonly iconSize: _angular_core.InputSignal<IconSize>;
8933
- /**
8934
- * Optional heading rendered above the description — appears as an `<h3>` in
8935
- * brand-primary text color.
8936
- */
8937
- readonly heading: _angular_core.InputSignal<string | undefined>;
8938
- protected readonly hostClasses: _angular_core.Signal<string>;
8939
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<EmptyStateComponent, never>;
8940
- 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>;
8941
- }
8942
-
8943
9015
  type ColWidth = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12;
8944
9016
  type JustifySelf = "start" | "end" | "center" | "stretch";
8945
9017
  type AlignSelf = "start" | "end" | "center" | "stretch";