@uni-design-system/uni-angular 8.3.1 → 9.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,9 +1,9 @@
1
1
  import * as _angular_core from '@angular/core';
2
2
  import { Signal, WritableSignal, InjectionToken, ElementRef, TemplateRef, OnInit, OnDestroy, AfterViewInit } from '@angular/core';
3
3
  import * as _uni_design_system_uni_core from '@uni-design-system/uni-core';
4
- import { IconName, Variant, ContainerColorToken, PaletteConfig, GenerateColorsConfig, Radii, UniTheme, ComponentName, ComponentTheme, NullableSize, ThemeName, ThemeParseResult, TextRole, ContentColorToken, Size, Thickness, NullableStyleExpression, ColorKey, ColorToken, Typeface, Radius, OptionalSize, Border, Shadow, ZIndexableElements, Elevation, RadiiSize, TextColor, JustifyContent, StyleExpression, Orientation, CssLength, OptionalAlignSelf, OptionalAlignItems, OptionalAlignContent, OptionalJustifyContent, OptionalDisplay, OptionalPosition, OptionalOverflow, OptionalFlexDirection, OptionalTextAlign, OptionalWrap, TagTone, ColorScheme, ColorCategory, ThemeShape, ContrastCheck, Colors, GenerationInput } from '@uni-design-system/uni-core';
4
+ import { IconName, Variant, ContainerColorToken, PaletteConfig, GenerateColorsConfig, Radii, UniTheme, ComponentName, ComponentTheme, MotionToken, ThemeName, ThemeParseResult, TextRole, ContentColorToken, Size, NullableSize, Thickness, NullableStyleExpression, ColorKey, ColorToken, Typeface, Radius, Motion, OptionalSize, Border, Shadow, ZIndexableElements, OptionalAlignSelf, OptionalAlignItems, OptionalAlignContent, OptionalJustifyContent, OptionalDisplay, OptionalPosition, OptionalOverflow, OptionalFlexDirection, OptionalTextAlign, OptionalWrap, TextColor, TagTone, Elevation, RadiiSize, JustifyContent, StyleExpression, Orientation, CssLength, ColorScheme, ColorCategory, ThemeShape, ContrastCheck, Colors, GenerationInput } from '@uni-design-system/uni-core';
5
+ import { FormCheckboxControl, FormValueControl } from '@angular/forms/signals';
5
6
  import * as _uni_design_system_uni_angular from '@uni-design-system/uni-angular';
6
- import { FormValueControl, FormCheckboxControl } from '@angular/forms/signals';
7
7
  import { CSSObject } from '@emotion/css/create-instance';
8
8
 
9
9
  /**
@@ -44,6 +44,43 @@ declare const visuallyHidden: {
44
44
  declare function motionSafe<T extends object>(styles: T): {
45
45
  '@media (prefers-reduced-motion: no-preference)': T;
46
46
  };
47
+ interface Announcer {
48
+ /**
49
+ * Current live-region text. Bind it to a visually hidden element that is
50
+ * already in the DOM when the component renders — a region added at the
51
+ * moment it gains text is not reliably announced:
52
+ *
53
+ * ```html
54
+ * <span role="status" aria-live="polite" [class]="srOnly">
55
+ * {{ announcer.message() }}
56
+ * </span>
57
+ * ```
58
+ */
59
+ readonly message: Signal<string>;
60
+ /** Announce `text`, even when it repeats what was just announced. */
61
+ announce(text: string): void;
62
+ }
63
+ /**
64
+ * A polite live region's text, for the running commentary a form control owes
65
+ * a screen reader: commits, clears, refused entries, result counts — changes
66
+ * a sighted user sees but that are otherwise silent.
67
+ *
68
+ * Extracted because five controls (`uni-combobox`, `uni-tag-input`,
69
+ * `uni-time-input`, `uni-date-input`, `uni-calendar`) carried byte-identical
70
+ * copies, including the repeat trick below — the kind of subtlety that is
71
+ * quietly dropped when the sixth control hand-rolls its own.
72
+ *
73
+ * Announcing the same text twice must still be heard: assistive tech reads a
74
+ * live region when its content *changes*, so setting an identical string is a
75
+ * no-op and the second "No match." would be silent. A trailing space breaks
76
+ * the equality without changing a word of what is read. Successive repeats
77
+ * alternate between the padded and unpadded form, so nothing accumulates.
78
+ *
79
+ * Deliberately holds no DOM and no styling: the region belongs to the
80
+ * component's own template, where its placement and visually-hidden class are
81
+ * already the component's business.
82
+ */
83
+ declare function createAnnouncer(): Announcer;
47
84
 
48
85
  /**
49
86
  * Canonical date/time value shapes shared by `uni-calendar`,
@@ -162,6 +199,18 @@ interface ListboxNavigationConfig {
162
199
  * nearest enabled option; an all-disabled list never activates.
163
200
  */
164
201
  disabled?: (index: number) => boolean;
202
+ /**
203
+ * Let Home/End jump to the ends of the list. Default false.
204
+ *
205
+ * In an editable combobox those keys belong to the caret — APG reserves
206
+ * them for text editing, and a control that steals them makes the text
207
+ * un-navigable while its list is open. Opt in only where focus is *not* in
208
+ * a text field (uni-multi-select-dropdown, whose focus rides the option
209
+ * checkboxes). Nothing is lost by leaving it off: opening with ArrowUp
210
+ * already lands on the last option, ArrowDown on the first, and navigation
211
+ * wraps at both ends.
212
+ */
213
+ homeEndNavigates?: boolean;
165
214
  }
166
215
  /**
167
216
  * The keyboard and ARIA bookkeeping shared by every combobox-style popup:
@@ -172,8 +221,9 @@ interface ListboxNavigationConfig {
172
221
  * Extracted because three controls need the identical contract
173
222
  * (`uni-search-input`, `uni-tag-input`, and the multi-select upgrade), and the
174
223
  * parts that silently drift between hand-rolled copies all live here: the
175
- * wrap-around arithmetic, Home/End, and keeping the active id in sync with the
176
- * option list.
224
+ * wrap-around arithmetic and keeping the active id in sync with the option
225
+ * list. Home/End are opt-in (`homeEndNavigates`) because a text field's caret
226
+ * has the better claim on them.
177
227
  *
178
228
  * `Enter` and `Escape` are deliberately *not* handled: what they mean depends
179
229
  * on the control (submit a search, commit a typed token, clear the field), and
@@ -187,6 +237,7 @@ declare class ListboxNavigation {
187
237
  private readonly _activeIndex;
188
238
  private readonly wrap;
189
239
  private readonly isDisabled;
240
+ private readonly homeEndNavigates;
190
241
  /** Whether the popup is showing. Also false when there is nothing to show. */
191
242
  readonly open: Signal<boolean>;
192
243
  /** Index of the highlighted option, or -1 when none is active. */
@@ -201,9 +252,9 @@ declare class ListboxNavigation {
201
252
  hide(): void;
202
253
  setActive(index: number): void;
203
254
  /**
204
- * Handle ArrowDown / ArrowUp / Home / End, opening the popup if needed.
205
- * Returns true when the key was consumed, so a caller can fall through to
206
- * its own handling for everything else.
255
+ * Handle ArrowDown / ArrowUp and Home / End where `homeEndNavigates` is
256
+ * on. Opens the popup if needed. Returns true when the key was consumed, so
257
+ * a caller can fall through to its own handling for everything else.
207
258
  */
208
259
  navigate(event: KeyboardEvent): boolean;
209
260
  private nextIndex;
@@ -322,8 +373,14 @@ declare function isToggleOpen(event: Event): boolean;
322
373
  * top layer: `transition-behavior: allow-discrete` over the `hidden` keys plus
323
374
  * `display`/`overlay`, the shown state under `:popover-open`, and
324
375
  * `@starting-style` so entry transitions run from the hidden state.
376
+ *
377
+ * `display` and `overlay` must ride along or the element cannot animate into
378
+ * and out of the top layer at all — it would simply appear and vanish.
379
+ *
380
+ * `timingFunction` is omitted from the output when not given, leaving the CSS
381
+ * initial value (`ease`), so callers that never asked for one are unaffected.
325
382
  */
326
- declare function discreteOverlayTransition(durationMs: number, hidden: Record<string, string | number>, shown: Record<string, string | number>): Record<string, unknown>;
383
+ declare function discreteOverlayTransition(durationMs: number, hidden: Record<string, string | number>, shown: Record<string, string | number>, timingFunction?: string): Record<string, unknown>;
327
384
  /**
328
385
  * Returns focus to `target` when an overlay closes while focus was inside its
329
386
  * panel (or was dropped on `<body>` by the top layer closing), so keyboard
@@ -556,12 +613,13 @@ declare class ThemeService {
556
613
  component: <T>(componentName: ComponentName) => Signal<ComponentTheme<T>>;
557
614
  colors: Signal<Partial<Record<string, string>>>;
558
615
  typeFaces: Signal<Record<string, _uni_design_system_uni_core.TypeFaceDefinition>>;
559
- spacing: Signal<Partial<Record<NullableSize, string | number>>>;
616
+ spacing: Signal<_uni_design_system_uni_core.Spacing>;
560
617
  thicknesses: Signal<Partial<Record<string, string | number>>>;
561
618
  radii: Signal<Partial<Record<string, string>>>;
562
619
  borders: Signal<Partial<Record<string, string>>>;
563
620
  shadows: Signal<Partial<Record<string, string>>>;
564
621
  icons: Signal<_uni_design_system_uni_core.Icons>;
622
+ motions: Signal<Partial<Record<string, MotionToken>>>;
565
623
  constructor();
566
624
  /**
567
625
  * Activate a registered theme. Returns false — touching nothing, persisting
@@ -611,7 +669,22 @@ declare class ThemeService {
611
669
  componentStyle: (componentName: ComponentName, variant: Variant, size: Size) => Signal<{
612
670
  [x: string]: string | number | _uni_design_system_uni_core.StyleExpression;
613
671
  }>;
672
+ /**
673
+ * Resolve a spacing token to its CSS value. `'none'` resolves through the
674
+ * scale like any other token — it is `0`, not the string `'none'`, which is
675
+ * not a valid length and was silently dropped wherever it landed.
676
+ */
614
677
  getSpacing: (size: NullableSize) => string | number;
678
+ private readonly warnedSpacing;
679
+ /**
680
+ * Resolve a spacing token against the active theme.
681
+ *
682
+ * The scale is open — a theme may name steps beyond `xxs`…`xxl` — so a
683
+ * mistyped token cannot be a compile error. It would otherwise vanish
684
+ * silently, since an `undefined` CSS value is simply dropped, so say so once
685
+ * per token in dev.
686
+ */
687
+ private resolveSpacing;
615
688
  getThickness: (thickness: Thickness) => string | number;
616
689
  getContentColor: (token: ContainerColorToken, useVariant?: boolean) => string;
617
690
  colorPair: (token?: ContainerColorToken, colorVariant?: boolean) => NullableStyleExpression;
@@ -654,6 +727,12 @@ declare class ThemeService {
654
727
  colorPalette: () => Partial<Record<string, string>>;
655
728
  color(color?: ColorKey): NullableStyleExpression;
656
729
  getDashedBorder(color: ColorKey | undefined, radius: Radius | undefined): NullableStyleExpression;
730
+ /**
731
+ * Resolves a named motion primitive. Falls back to `popup` and then to a
732
+ * hard default, so a theme that predates the motion scale — or names a
733
+ * token that isn't there — still animates rather than snapping.
734
+ */
735
+ motion(token: Motion | undefined): MotionToken;
657
736
  radius(size: Radius | undefined): NullableStyleExpression;
658
737
  getRadiusLeft(size: Radius | undefined): NullableStyleExpression;
659
738
  getRadiusRight(size: Radius | undefined): NullableStyleExpression;
@@ -666,6 +745,12 @@ declare class ThemeService {
666
745
  paddingRight(size: OptionalSize): NullableStyleExpression;
667
746
  paddingTop(size: OptionalSize): NullableStyleExpression;
668
747
  paddingBottom(size: OptionalSize): NullableStyleExpression;
748
+ /**
749
+ * Inline-axis margin only — `'auto'` passes through for centering, anything
750
+ * else resolves as a spacing token. Block margins are deliberately absent
751
+ * (they collapse and fight `gap`).
752
+ */
753
+ marginInline(margin: 'auto' | OptionalSize): NullableStyleExpression;
669
754
  border(border: Border | undefined): NullableStyleExpression;
670
755
  borderTop(border: Border | undefined): NullableStyleExpression;
671
756
  borderBottom(border: Border | undefined): NullableStyleExpression;
@@ -681,6 +766,12 @@ declare class ThemeService {
681
766
  getComponentOptions: <T>(componentName: ComponentName) => _angular_core.WritableSignal<T>;
682
767
  componentOptions: (componentName: ComponentName) => Signal<unknown>;
683
768
  style(prop: string, value: string | number | undefined): NullableStyleExpression;
769
+ /**
770
+ * Like {@link style}, but only `undefined` means "unset" — so a meaningful
771
+ * `0` survives. `flex-shrink: 0` is the whole point of the input, and
772
+ * {@link style}'s truthiness check would drop it.
773
+ */
774
+ styleIfSet(prop: string, value: string | number | undefined): NullableStyleExpression;
684
775
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ThemeService, never>;
685
776
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<ThemeService>;
686
777
  }
@@ -701,221 +792,192 @@ declare class BaseComponent<T = unknown> {
701
792
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<BaseComponent<any>, "ng-component", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
702
793
  }
703
794
 
704
- /** Theme-level options for `uni-app-bar`, resolved by token name. */
705
- interface UniAppBarOptions {
706
- /** Bar surface color token (with its paired on-color). */
707
- color?: ContainerColorToken;
708
- /** Bar height in px. */
709
- height?: number;
710
- /** Rule under the bar, as a border primitive token. */
711
- divider?: Border;
712
- /** Title typography token. */
713
- typeface?: Typeface;
714
- /** Horizontal padding, as a spacing token. */
715
- padding?: OptionalSize;
716
- /** Space between bar children, as a spacing token. */
717
- gap?: OptionalSize;
718
- /** Optional elevation shadow token (e.g. 'raised'). */
719
- elevation?: Elevation;
720
- }
721
-
722
- /**
723
- * Horizontal application bar: project leading controls (menu button, logo)
724
- * with the `leading` attribute, actions with `trailing` (pushed to the far
725
- * edge), and either pass `title` or project custom center content. Surface,
726
- * divider, height, typography and spacing all resolve from `appBar` tokens.
727
- * Place it inside your page's `<header>` landmark.
728
- */
729
- declare class UniAppBarComponent extends BaseComponent<UniAppBarOptions> {
730
- /** Bar title; alternatively project your own center content. */
731
- title: _angular_core.InputSignal<string>;
732
- /** Stick the bar to the top of its scroll container. */
733
- sticky: _angular_core.InputSignal<boolean>;
734
- protected readonly className: _angular_core.Signal<string>;
735
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniAppBarComponent, never>;
736
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniAppBarComponent, "uni-app-bar", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "sticky": { "alias": "sticky"; "required": false; "isSignal": true; }; }, {}, never, ["[leading]", "*", "[trailing]"], true, never>;
795
+ interface UniCheckboxOptions {
796
+ size?: string | number;
797
+ borderRadius?: string | number;
798
+ /** Unchecked box background token. */
799
+ boxColor?: ColorKey;
800
+ focusRingGap?: string | number;
737
801
  }
738
802
 
739
- /** Theme-level options for `uni-avatar`, resolved by token name. */
740
- interface UniAvatarOptions {
741
- /** Corner radius token — `max` renders circles; `sharp` themes get squares. */
742
- borderRadius?: Radius;
743
- /** Typeface token for the initials. */
744
- typeface?: Typeface;
745
- /** Symbol shown when there is no image and no name to take initials from. */
746
- fallbackSymbol?: string;
747
- }
748
- /** Theme-level options for `uni-avatar-group`. */
749
- interface UniAvatarGroupOptions {
750
- /** How far stacked avatars overlap, as a spacing token. */
751
- overlap?: OptionalSize;
752
- /** Ring color separating stacked avatars from each other. */
753
- ringColor?: ColorKey;
754
- /** Ring width in px. */
755
- ringWidth?: number;
803
+ declare class UniCheckboxComponent extends BaseComponent<UniCheckboxOptions> implements FormCheckboxControl {
804
+ readonly checked: _angular_core.ModelSignal<boolean>;
805
+ readonly disabled: _angular_core.InputSignal<boolean>;
806
+ readonly touched: _angular_core.ModelSignal<boolean>;
807
+ readonly invalid: _angular_core.InputSignal<boolean>;
808
+ readonly dirty: _angular_core.InputSignal<boolean>;
809
+ /** Synced from required() validators by the Signal Forms [field] directive. */
810
+ readonly required: _angular_core.InputSignal<boolean>;
811
+ /**
812
+ * Id(s) of external element(s) describing this control — typically your
813
+ * app-rendered error message — exposed as aria-describedby.
814
+ */
815
+ readonly ariaDescribedBy: _angular_core.InputSignal<string>;
816
+ readonly label: _angular_core.InputSignal<string>;
817
+ /**
818
+ * Mixed state for "select all"-style parent checkboxes. Cleared
819
+ * automatically on the next user interaction, matching native behavior.
820
+ */
821
+ readonly indeterminate: _angular_core.ModelSignal<boolean>;
822
+ protected readonly showError: _angular_core.Signal<boolean>;
823
+ markAsTouched(): void;
824
+ handleChange(event: Event): void;
825
+ protected readonly checkboxLabel: _angular_core.Signal<string>;
826
+ protected readonly checkboxInput: _angular_core.Signal<string>;
827
+ getThemeColor(token: ColorToken): string;
828
+ /** The content color paired with a variant fill (on-primary, on-warn, …). */
829
+ getOnColor(variant: ColorToken): string;
830
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniCheckboxComponent, never>;
831
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniCheckboxComponent, "uni-checkbox", never, { "checked": { "alias": "checked"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "indeterminate": { "alias": "indeterminate"; "required": false; "isSignal": true; }; }, { "checked": "checkedChange"; "touched": "touchedChange"; "indeterminate": "indeterminateChange"; }, never, never, true, never>;
756
832
  }
757
833
 
758
- /**
759
- * Identity avatar with a graceful fallback chain: image → initials from
760
- * `name` → themed symbol. Coloring, radius, typeface and sizes all resolve
761
- * from `avatar` theme tokens; `variant` picks the container palette.
762
- */
763
- declare class UniAvatarComponent extends BaseComponent<UniAvatarOptions> {
764
- /** Image URL; on load error the avatar falls back to initials/symbol. */
765
- src: _angular_core.InputSignal<string>;
766
- /** Person's name: drives the initials and the accessible label. */
767
- name: _angular_core.InputSignal<string>;
768
- /** Verbatim text instead of derived initials (e.g. a group's “+3”). */
769
- text: _angular_core.InputSignal<string>;
770
- protected readonly imageFailed: _angular_core.WritableSignal<boolean>;
771
- protected readonly showImage: _angular_core.Signal<boolean>;
772
- protected readonly initials: _angular_core.Signal<string>;
773
- protected readonly label: _angular_core.Signal<string>;
774
- protected readonly className: _angular_core.Signal<string>;
775
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniAvatarComponent, never>;
776
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniAvatarComponent, "uni-avatar", never, { "src": { "alias": "src"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "text": { "alias": "text"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
834
+ /** A commit was refused (no match); the field reverted to the committed label. */
835
+ interface UniComboboxRejection {
836
+ query: string;
777
837
  }
778
-
779
838
  /**
780
- * Overlapping stack of avatars. `max` collapses the overflow into a themed
781
- * “+N” chip (itself a `uni-avatar`). Overlap and separator ring resolve from
782
- * `avatarGroup` theme tokens.
839
+ * Theme options for the `combobox` entry. Field chrome is not duplicated
840
+ * here it comes from `input` via uni-input-box; the list trio matches
841
+ * tagInput/searchInput/timeInput. Glyphs are theme icon primitives rendered
842
+ * by `uni-icon`, so they restyle with the theme's iconography.
783
843
  */
784
- declare class UniAvatarGroupComponent extends BaseComponent<UniAvatarGroupOptions> {
785
- /** Show at most this many avatars; the rest collapse into a “+N” chip. */
786
- max: _angular_core.InputSignal<number>;
787
- private readonly avatars;
788
- protected readonly surplus: _angular_core.Signal<number>;
789
- protected readonly className: _angular_core.Signal<string>;
790
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniAvatarGroupComponent, never>;
791
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniAvatarGroupComponent, "uni-avatar-group", never, { "max": { "alias": "max"; "required": false; "isSignal": true; }; }, {}, ["avatars"], ["*"], true, never>;
792
- }
793
-
794
- type ImagePosition = 'top' | 'bottom' | 'left' | 'right' | 'center' | string;
795
- declare class UniBackgroundComponent {
796
- theme: ThemeService;
797
- image: _angular_core.InputSignal<string>;
798
- imagePosition: _angular_core.InputSignal<string>;
799
- imageSize: _angular_core.InputSignal<string | number>;
800
- height: _angular_core.InputSignal<string | number>;
801
- width: _angular_core.InputSignal<string | number>;
802
- protected readonly className: _angular_core.Signal<string>;
803
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniBackgroundComponent, never>;
804
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniBackgroundComponent, "uni-background", never, { "image": { "alias": "image"; "required": false; "isSignal": true; }; "imagePosition": { "alias": "imagePosition"; "required": false; "isSignal": true; }; "imageSize": { "alias": "imageSize"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
805
- }
806
-
807
- interface UniBadgeOptions {
808
- borderRadius?: RadiiSize;
809
- }
810
-
811
- declare class UniBadgeComponent extends BaseComponent<UniBadgeOptions> {
812
- color: _angular_core.InputSignal<Variant>;
813
- useVariant: _angular_core.InputSignal<boolean>;
814
- width: _angular_core.InputSignal<number>;
815
- protected readonly className: _angular_core.Signal<string>;
816
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniBadgeComponent, never>;
817
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniBadgeComponent, "[uni-badge]", never, { "color": { "alias": "color"; "required": false; "isSignal": true; }; "useVariant": { "alias": "useVariant"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
818
- }
819
-
820
- /** One step in the trail. The last item is treated as the current page. */
821
- interface BreadcrumbItem {
822
- label: string;
823
- /** Link target. Omit for SPA routing and handle `itemClicked` instead. */
824
- href?: string;
825
- }
826
- /** Theme-level options for `uni-breadcrumb`, resolved by token name. */
827
- interface UniBreadcrumbOptions {
828
- /** Trail typography token. */
829
- typeface?: Typeface;
830
- /** Link color for ancestor items. */
831
- color?: ColorKey;
832
- /** Color of the current (last) item. */
833
- currentColor?: ColorKey;
834
- /** Material symbol drawn between items. */
835
- separatorSymbol?: string;
836
- /** Space around separators, as a spacing token. */
837
- gap?: OptionalSize;
844
+ interface UniComboboxOptions {
845
+ toggleIcon?: IconName;
846
+ clearIcon?: IconName;
847
+ selectedIcon?: IconName;
848
+ listColor?: ContainerColorToken;
849
+ listShadow?: Shadow;
850
+ listBorderRadius?: Radius;
851
+ /** Active/hover option fill; the on-color pair is derived. Must contrast
852
+ with `listColor` or keyboard navigation turns invisible. */
853
+ activeColor?: ContainerColorToken;
854
+ /** Scroll height in rows the list scrolls past this, never truncates. */
855
+ maxVisibleOptions?: number;
856
+ descriptionColor?: ContentColorToken; /** Named motion primitive for the suggestion popup's open animation.
857
+ Defaults to `popup` — the token `uni-dropdown` uses. */
858
+ motion?: Motion;
838
859
  }
839
860
 
840
861
  /**
841
- * WAI-ARIA breadcrumb: a `nav` landmark wrapping an ordered list; the last
842
- * item is the current page (`aria-current="page"`), separators are decorative.
843
- * Items with `href` render as real links; without one they render as
844
- * link-styled buttons emitting `itemClicked` wire that to your router.
862
+ * Form-bound, closed-set, single-select autocomplete: `FormValueControl<T | null>`
863
+ * over object `Options<T>`, type-to-filter, commit-on-select. Typing produces a
864
+ * draft a filter, never a value; the value changes only when an option
865
+ * commits, `clear()` runs, or the model is written from outside. Select
866
+ * semantics, not search: a real label, a chevron, no magnifier, nothing
867
+ * submits. For short lists with no need to type, prefer `uni-select` — the
868
+ * value contract is identical, so swapping is a template-only change.
845
869
  */
846
- declare class UniBreadcrumbComponent extends BaseComponent<UniBreadcrumbOptions> {
847
- /** The trail, root first; the last item is the current page. */
848
- items: _angular_core.InputSignal<BreadcrumbItem[]>;
849
- /** Landmark label distinguishing this nav from others on the page. */
850
- ariaLabel: _angular_core.InputSignal<string>;
851
- /** Emits the clicked ancestor item (also fires for `href` links). */
852
- itemClicked: _angular_core.OutputEmitterRef<BreadcrumbItem>;
853
- protected readonly className: _angular_core.Signal<string>;
854
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniBreadcrumbComponent, never>;
855
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniBreadcrumbComponent, "uni-breadcrumb", never, { "items": { "alias": "items"; "required": true; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "itemClicked": "itemClicked"; }, never, never, true, never>;
856
- }
857
-
858
- /** Theme-level options for `uni-text-button`, resolved by token name. */
859
- interface UniButtonOptions {
870
+ declare class UniComboboxComponent<T> extends BaseComponent<UniComboboxOptions> implements FormValueControl<T | null> {
871
+ readonly value: _angular_core.ModelSignal<T>;
872
+ readonly disabled: _angular_core.InputSignal<boolean>;
873
+ readonly touched: _angular_core.ModelSignal<boolean>;
874
+ readonly invalid: _angular_core.InputSignal<boolean>;
875
+ readonly dirty: _angular_core.InputSignal<boolean>;
876
+ readonly required: _angular_core.InputSignal<boolean>;
877
+ readonly ariaDescribedBy: _angular_core.InputSignal<string>;
878
+ /** Accessible name for the field, e.g. "State"; echoed on the listbox. */
879
+ label: _angular_core.InputSignal<string>;
880
+ placeholder: _angular_core.InputSignal<string>;
881
+ options: _angular_core.InputSignal<Options<T>>;
860
882
  /**
861
- * Corner radius as a radii token. The default theme uses `max` (pill);
862
- * because this is a token, the theme's radii scale including generated
863
- * shape languages (`sharp`/`modern`/`playful`) and custom primitives —
864
- * restyles every button without touching component code.
883
+ * Equality used to match `value` against option values, called as
884
+ * `compareWith(optionValue, value)`. Defaults to reference equality, which
885
+ * never matches an object value rebuilt from elsewhere (e.g. a saved record
886
+ * against options from a fresh fetch) — pass a key comparison like
887
+ * `(a, b) => a?.id === b?.id` for object values.
865
888
  */
866
- borderRadius?: RadiiSize;
867
- /**
868
- * Label typography as a typeface token. Defaults to the type scale's
869
- * `button` role (family/weight/transform); per-size `fontSize` overrides
870
- * from the theme's `sizes` still apply on top. Point it at any typeface —
871
- * including custom primitives added to the theme's typography.
872
- */
873
- typeface?: Typeface;
874
- }
875
-
876
- declare class RippleDirective {
877
- private renderer;
878
- el: ElementRef<any>;
879
- hostEl: any;
889
+ compareWith: _angular_core.InputSignal<(optionValue: T, value: T) => boolean>;
890
+ width: _angular_core.InputSignal<string | number>;
891
+ /** Show a while a value is set; an emptied field on blur also clears. */
892
+ clearable: _angular_core.InputSignal<boolean>;
893
+ /** Blur commits an exact-match draft; a non-matching draft reverts. */
894
+ commitOnBlur: _angular_core.InputSignal<boolean>;
895
+ /** i18n-able empty row, also announced when a filter matches nothing. */
896
+ emptyText: _angular_core.InputSignal<string>;
897
+ /** `false` renders `options` verbatim; narrow them app-side from `query`. */
898
+ filterLocally: _angular_core.InputSignal<boolean>;
899
+ /** Filter predicate; default is locale-lowercased label-contains. */
900
+ filterWith: _angular_core.InputSignal<(option: Option<T>, query: string) => boolean>;
901
+ debounceTime: _angular_core.InputSignal<number>;
902
+ /** Debounced draft text, for async option lists. */
903
+ query: _angular_core.OutputEmitterRef<string>;
904
+ /** An option committed. */
905
+ selected: _angular_core.OutputEmitterRef<Option<T>>;
906
+ cleared: _angular_core.OutputEmitterRef<void>;
907
+ /** A commit was refused (no match); the field reverted. */
908
+ rejected: _angular_core.OutputEmitterRef<UniComboboxRejection>;
909
+ private readonly host;
910
+ private readonly inputRef;
911
+ private readonly listRef;
912
+ /** Cancelled on destroy — a late tick would emit on a destroyed OutputRef. */
913
+ private queryTimer?;
914
+ /** Ties the popup to the field so the browser tracks it in the top layer. */
915
+ private readonly anchor;
916
+ /** `manual` where the top layer is usable, else null — see the popup helper. */
917
+ protected readonly popupAttr: "manual";
880
918
  constructor();
881
- onClick(e: MouseEvent): void;
882
- rippleClass: string;
883
- animateClass: string;
884
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<RippleDirective, never>;
885
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RippleDirective, "[uniRipple]", never, {}, {}, never, never, true, never>;
886
- }
887
-
888
- declare class UniButtonComponent extends BaseComponent<UniButtonOptions> {
889
- readonly disable: _angular_core.InputSignal<boolean>;
890
- readonly loading: _angular_core.InputSignal<boolean>;
891
- readonly fullWidth: _angular_core.InputSignal<boolean>;
892
- readonly symbolLeft: _angular_core.InputSignal<string>;
893
- readonly symbolRight: _angular_core.InputSignal<string>;
894
- spinnerBox: string;
895
- protected readonly className: _angular_core.Signal<string>;
896
- symbolSize: _angular_core.Signal<number>;
897
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniButtonComponent, never>;
898
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniButtonComponent, "button[uni-text-button], button[text-button]", never, { "disable": { "alias": "disable"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "fullWidth": { "alias": "fullWidth"; "required": false; "isSignal": true; }; "symbolLeft": { "alias": "symbolLeft"; "required": false; "isSignal": true; }; "symbolRight": { "alias": "symbolRight"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, [{ directive: typeof RippleDirective; inputs: {}; outputs: {}; }]>;
899
- }
900
-
901
- declare class UniButtonGroupComponent {
902
- private themeService;
919
+ protected readonly srOnly: string;
920
+ /** Commits, clears and refusals are otherwise silent to a screen reader. */
921
+ protected readonly announcer: _uni_design_system_uni_angular.Announcer;
922
+ /** null the field shows the committed label; a string is an uncommitted draft. */
923
+ protected readonly draft: _angular_core.WritableSignal<string>;
924
+ /**
925
+ * Popup visibility. Component-owned rather than `list.open()` — the shared
926
+ * signal gates on `count() > 0`, which would hide the "No matches" row and
927
+ * misreport `aria-expanded` over an empty filter.
928
+ */
929
+ protected readonly popupOpen: _angular_core.WritableSignal<boolean>;
930
+ /** Index in options() of the option matching value(), else -1. */
931
+ protected readonly committedIndex: _angular_core.Signal<number>;
932
+ /** A value with no matching option renders '' but is preserved — options may
933
+ still be loading; the field self-heals when they arrive. */
934
+ protected readonly committedLabel: _angular_core.Signal<string>;
935
+ protected readonly displayValue: _angular_core.Signal<string>;
936
+ /** Indices into options() surviving the filter. The draft filters; the
937
+ committed label does not — reopening always shows the full set. */
938
+ protected readonly filteredIndices: _angular_core.Signal<number[]>;
939
+ /** Shared combobox bookkeeping, in filtered-list positions — the fourth
940
+ consumer of the contract behind search-input, tag-input and time-input. */
941
+ protected readonly list: _uni_design_system_uni_angular.ListboxNavigation;
942
+ protected readonly showError: _angular_core.Signal<boolean>;
943
+ private commit;
944
+ protected clear(): void;
945
+ /**
946
+ * Draft resolution, used by Enter, Tab and blur:
947
+ * 1. an active option in the list → commit it;
948
+ * 2. else a unique exact label match (locale-case-insensitive) → commit it;
949
+ * 3. Enter only: the filter narrowed to exactly one enabled option → commit it
950
+ * (on Enter the user can see the single candidate; on blur they're gone,
951
+ * and committing a value they never saw confirmed is how forms grow
952
+ * mystery data);
953
+ * 4. else the caller keeps the list open (Enter) or reverts (Tab/blur).
954
+ */
955
+ private resolveDraft;
956
+ private revertDraft;
957
+ private reject;
958
+ protected onKeydown(event: KeyboardEvent): void;
959
+ protected onInput(): void;
960
+ /** Click-to-browse: pointer users get the select affordance. Focus alone
961
+ never opens — Tab-through forms must not spray popups. */
962
+ protected onFieldClick(): void;
963
+ protected onToggleMousedown(event: MouseEvent): void;
964
+ protected onOptionClick(optIndex: number): void;
965
+ protected onFocusOut(event: FocusEvent): void;
966
+ /** Filtered position of the committed option when visible and enabled, else -1. */
967
+ private committedFilteredPos;
968
+ private openList;
969
+ private closeList;
970
+ private scrollToActive;
971
+ private setFieldText;
903
972
  protected readonly className: _angular_core.Signal<string>;
904
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniButtonGroupComponent, never>;
905
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniButtonGroupComponent, "uni-button-group", never, {}, {}, never, ["*"], true, never>;
906
- }
907
-
908
- interface ButtonGroupConfig {
909
- tooltipPlacement?: Placement;
910
- buttonSize: Size;
911
- buttons: ButtonGroupItem[];
912
- }
913
- interface ButtonGroupItem {
914
- symbolName: string;
915
- selected?: boolean;
916
- tooltip?: string;
917
- action?: (selectedState?: boolean) => boolean | void;
918
- toggle?: WritableSignal<boolean>;
973
+ protected readonly rowClass: _angular_core.Signal<string>;
974
+ protected readonly inputClass: _angular_core.Signal<string>;
975
+ /** Pointer-only affordance: keyboard already has ArrowDown, and the input
976
+ itself announces expanded state. */
977
+ protected readonly toggleClass: _angular_core.Signal<string>;
978
+ protected readonly listClass: _angular_core.Signal<string>;
979
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniComboboxComponent<any>, never>;
980
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniComboboxComponent<any>, "uni-combobox, Combobox", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": true; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "commitOnBlur": { "alias": "commitOnBlur"; "required": false; "isSignal": true; }; "emptyText": { "alias": "emptyText"; "required": false; "isSignal": true; }; "filterLocally": { "alias": "filterLocally"; "required": false; "isSignal": true; }; "filterWith": { "alias": "filterWith"; "required": false; "isSignal": true; }; "debounceTime": { "alias": "debounceTime"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; "query": "query"; "selected": "selected"; "cleared": "cleared"; "rejected": "rejected"; }, never, never, true, never>;
919
981
  }
920
982
 
921
983
  type UniCalendarMode = 'single' | 'range';
@@ -954,96 +1016,1482 @@ interface UniCalendarOptions {
954
1016
  todayStyle?: 'outline' | 'dot';
955
1017
  }
956
1018
 
957
- /** One rendered day cell precomputed so the template stays declarative. */
958
- interface CalendarCell {
959
- date: UniDate;
960
- day: number;
961
- outside: boolean;
962
- disabled: boolean;
963
- today: boolean;
964
- selected: boolean;
965
- inBand: boolean;
966
- tabIndex: number;
967
- ariaLabel: string;
968
- markers: UniCalendarMarker[];
969
- cellClass: string;
970
- dayClass: string;
1019
+ /** Why typed text did not become a date. The raw text stays in the field. */
1020
+ interface UniDateInputRejection {
1021
+ raw: string;
1022
+ reason: 'unparseable' | 'out-of-range' | 'disabled';
971
1023
  }
972
1024
  /**
973
- * Inline month calendar: single-date or start–end range selection, day
974
- * markers (availability dots), min/max fences and disabled dates. One tab
975
- * stop with a roving-tabindex `role="grid"`; every day is a real button
976
- * named with its full date. Values are plain ISO strings (`'YYYY-MM-DD'`),
977
- * never `Date` objects, so bindings are timezone-free and serializable.
978
- * Selection and today colours come from the theme's `primary` role pair;
979
- * geometry and glyphs come from the `calendar` theme entry.
1025
+ * Theme options for the `dateInput` entry. Field chrome is not duplicated
1026
+ * here it comes from `input` via uni-input-box; these style the popup
1027
+ * affordance and panel only.
980
1028
  */
981
- declare class UniCalendarComponent extends BaseComponent<UniCalendarOptions> implements FormValueControl<UniCalendarValue> {
982
- readonly value: _angular_core.ModelSignal<UniCalendarValue>;
1029
+ interface UniDateInputOptions {
1030
+ toggleSymbol?: string;
1031
+ popupShadow?: Shadow;
1032
+ popupBorderRadius?: Radius;
1033
+ popupColor?: ContainerColorToken;
1034
+ }
1035
+
1036
+ /**
1037
+ * Date field with free-typed parsing and a popup calendar. Type `aug 20`,
1038
+ * `8/20/2026` or `2026-08-20`, or pick from the grid — the form gets the
1039
+ * same canonical `'YYYY-MM-DD'` string either way. Parsing is `Intl`-driven
1040
+ * (locale digit order and month names, never hardcoded); unreadable text
1041
+ * stays in the field, flagged, with a `rejected` event. The popup is a
1042
+ * native popover hosting the same `uni-calendar` an app could render inline.
1043
+ */
1044
+ declare class UniDateInputComponent extends BaseComponent<UniDateInputOptions> implements FormValueControl<UniDate | undefined> {
1045
+ readonly value: _angular_core.ModelSignal<string>;
983
1046
  readonly disabled: _angular_core.InputSignal<boolean>;
984
1047
  readonly touched: _angular_core.ModelSignal<boolean>;
985
1048
  readonly invalid: _angular_core.InputSignal<boolean>;
986
1049
  readonly dirty: _angular_core.InputSignal<boolean>;
987
1050
  readonly required: _angular_core.InputSignal<boolean>;
988
1051
  readonly ariaDescribedBy: _angular_core.InputSignal<string>;
989
- /** `'single'` reads/writes a `UniDate`; `'range'` a `UniDateRange`. */
990
- mode: _angular_core.InputSignal<UniCalendarMode>;
991
- /** Shown month, `'YYYY-MM'` two-way, so an app can drive "jump to June". */
992
- month: _angular_core.ModelSignal<string>;
993
- /** Earliest selectable date (inclusive). */
1052
+ /** Accessible name for the field, e.g. "Appointment date". */
1053
+ label: _angular_core.InputSignal<string>;
1054
+ /** Defaults to the locale's digit pattern, e.g. `MM/DD/YYYY`. */
1055
+ placeholder: _angular_core.InputSignal<string>;
1056
+ /** How the committed value renders, e.g. `{ dateStyle: 'long' }`. */
1057
+ displayFormat: _angular_core.InputSignal<Intl.DateTimeFormatOptions>;
1058
+ /** BCP 47 tag; defaults to the document language, then the browser's. */
1059
+ locale: _angular_core.InputSignal<string>;
1060
+ commitOnBlur: _angular_core.InputSignal<boolean>;
1061
+ /** Custom parser, replacing the built-in ISO/locale/month-name parsing. */
1062
+ parse: _angular_core.InputSignal<(raw: string, locale: string) => UniDate | null>;
1063
+ /** Renders without its own input-box chrome, for composers like uni-date-time-input. */
1064
+ embedded: _angular_core.InputSignal<boolean>;
994
1065
  minDate: _angular_core.InputSignal<string>;
995
- /** Latest selectable date (inclusive). */
996
1066
  maxDate: _angular_core.InputSignal<string>;
997
- /** Blocked days: a list of dates, or a predicate. */
998
1067
  disabledDates: _angular_core.InputSignal<string[] | ((date: UniDate) => boolean)>;
999
- /** Availability dots; `label` extends the day's accessible name. */
1000
1068
  markers: _angular_core.InputSignal<UniCalendarMarker[]>;
1001
- /** BCP 47 tag; defaults to the document language, then the browser's. */
1002
- locale: _angular_core.InputSignal<string>;
1003
- /** First day of week, 0 = Sunday; defaults from the locale's week info. */
1004
1069
  weekStart: _angular_core.InputSignal<0 | 1 | 2 | 3 | 4 | 6 | 5>;
1005
- /** Names the grid when it stands alone (otherwise the heading names it). */
1006
- ariaLabel: _angular_core.InputSignal<string>;
1007
- /** Day geometry token; `sm`/`md`/`lg` map to the theme's `calendar` sizes. */
1008
- size: _angular_core.InputSignal<Size>;
1009
- /** Each committed day, including both ends of a range. */
1010
- selected: _angular_core.OutputEmitterRef<string>;
1070
+ /** Popup shown. */
1071
+ opened: _angular_core.OutputEmitterRef<void>;
1072
+ /** Popup hidden. */
1073
+ closed: _angular_core.OutputEmitterRef<void>;
1074
+ /** A typed commit was refused; the raw text stays in the field. */
1075
+ rejected: _angular_core.OutputEmitterRef<UniDateInputRejection>;
1011
1076
  private readonly host;
1012
- protected readonly headingId: string;
1077
+ private readonly inputRef;
1078
+ private readonly toggleRef;
1079
+ private readonly popupRef;
1080
+ private readonly dropdown;
1081
+ private readonly calendar;
1013
1082
  protected readonly srOnly: string;
1014
- /** Pending range startset by the first commit, cleared by the second. */
1015
- protected readonly pendingStart: _angular_core.WritableSignal<string>;
1016
- /** Hover/focus candidate painting the preview band while a range is pending. */
1017
- protected readonly previewDate: _angular_core.WritableSignal<string>;
1018
- /** Live-region text; selections are otherwise silent for a screen reader. */
1019
- protected readonly announcement: _angular_core.WritableSignal<string>;
1083
+ /** A refused commitstyles the field and sets aria-invalid until edited. */
1084
+ protected readonly draftInvalid: _angular_core.WritableSignal<boolean>;
1085
+ /** Commits, clears and refusals are otherwise silent to a screen reader. */
1086
+ protected readonly announcer: _uni_design_system_uni_angular.Announcer;
1087
+ protected readonly toggleElement: _angular_core.Signal<any>;
1088
+ protected readonly popupOpen: _angular_core.Signal<boolean>;
1020
1089
  protected readonly resolvedLocale: _angular_core.Signal<string>;
1021
- protected readonly resolvedWeekStart: _angular_core.Signal<number>;
1022
- /**
1023
- * The month on screen: the `month` model, else the value's month, else
1024
- * today's. Falsy guards on purpose: `''` — the only typeable empty for a
1025
- * string-typed model — counts as unset, or it would reach the month math
1026
- * and blow up the grid and heading.
1027
- */
1028
- protected readonly viewMonth: _angular_core.Signal<string>;
1029
- private readonly anchorDate;
1030
- /**
1031
- * The roving-tabindex day. Re-derives when the view or value changes
1032
- * (selected day in view → today in view → first enabled day); keyboard
1033
- * navigation writes it directly.
1034
- */
1035
- protected readonly focusedDate: _angular_core.WritableSignal<string>;
1090
+ protected readonly displayText: _angular_core.Signal<string>;
1091
+ protected readonly resolvedPlaceholder: _angular_core.Signal<string>;
1036
1092
  protected readonly showError: _angular_core.Signal<boolean>;
1037
- protected readonly heading: _angular_core.Signal<string>;
1038
- protected readonly weekdays: _angular_core.Signal<_uni_design_system_uni_angular.UniWeekdayName[]>;
1039
- private readonly disabledDateSet;
1040
- private readonly markersByDate;
1041
- /** The committed range, or the pending preview band. */
1042
- private readonly rangeBand;
1043
- protected isDayDisabled(date: UniDate): boolean;
1044
- private isSelected;
1045
- /** The full render model: one precomputed cell per grid position. */
1046
- protected readonly gridWeeks: _angular_core.Signal<CalendarCell[][]>;
1093
+ protected readonly toggleLabel: _angular_core.Signal<string>;
1094
+ private fullDate;
1095
+ private isDayBlocked;
1096
+ protected setValue(date: UniDate | undefined, silent?: boolean): void;
1097
+ private refuse;
1098
+ protected commit(raw: string): boolean;
1099
+ /** Step a committed value ±1 day, skipping blocked days, stopping at fences. */
1100
+ private step;
1101
+ protected onInputKeydown(event: KeyboardEvent): void;
1102
+ protected onInput(): void;
1103
+ protected onFocusOut(event: FocusEvent): void;
1104
+ protected openPopup(): void;
1105
+ protected closePopup(): void;
1106
+ protected onPopupShowing(): void;
1107
+ protected onPopupHiding(): void;
1108
+ protected onCalendarPick(date: UniDate): void;
1109
+ /** The popup is a focus-holding dialog: Tab cycles inside it (APG pattern). */
1110
+ protected onPopupKeydown(event: KeyboardEvent): void;
1111
+ private setFieldText;
1112
+ protected readonly className: _angular_core.Signal<string>;
1113
+ protected readonly rowClass: _angular_core.Signal<string>;
1114
+ protected readonly inputClass: _angular_core.Signal<string>;
1115
+ protected readonly toggleWrapClass: _angular_core.Signal<string>;
1116
+ /** Embedded mode: the composer owns the box; keep only the flex row. */
1117
+ protected readonly embeddedClass: _angular_core.Signal<string>;
1118
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniDateInputComponent, never>;
1119
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniDateInputComponent, "uni-date-input, DateInput", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": true; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "displayFormat": { "alias": "displayFormat"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "commitOnBlur": { "alias": "commitOnBlur"; "required": false; "isSignal": true; }; "parse": { "alias": "parse"; "required": false; "isSignal": true; }; "embedded": { "alias": "embedded"; "required": false; "isSignal": true; }; "minDate": { "alias": "minDate"; "required": false; "isSignal": true; }; "maxDate": { "alias": "maxDate"; "required": false; "isSignal": true; }; "disabledDates": { "alias": "disabledDates"; "required": false; "isSignal": true; }; "markers": { "alias": "markers"; "required": false; "isSignal": true; }; "weekStart": { "alias": "weekStart"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; "opened": "opened"; "closed": "closed"; "rejected": "rejected"; }, never, never, true, never>;
1120
+ }
1121
+
1122
+ /**
1123
+ * Theme options for the `dateTimeInput` entry. Field chrome comes from
1124
+ * `input` via the single shared uni-input-box; these style the seam between
1125
+ * the two parts.
1126
+ */
1127
+ interface UniDateTimeInputOptions {
1128
+ /** Space between the date part, the divider, and the time part. */
1129
+ partGap?: NullableSize;
1130
+ dividerColor?: ColorToken;
1131
+ }
1132
+
1133
+ /**
1134
+ * One field for a date and a time: a thin composer seating a uni-date-input
1135
+ * and a uni-time-input in one input-box chrome under one label, yielding one
1136
+ * combined `'YYYY-MM-DDTHH:mm'` value. The value emits only when both parts
1137
+ * are set — a time without a day is not an answer — and clearing the date
1138
+ * clears it. With `slotsFor`, the time part stays disabled until a day is
1139
+ * chosen and offers exactly that day's slots: the scheduling flow in one
1140
+ * attribute. Two honest tab stops (it is two questions); apps needing a
1141
+ * different arrangement compose the primitives directly.
1142
+ */
1143
+ declare class UniDateTimeInputComponent extends BaseComponent<UniDateTimeInputOptions> implements FormValueControl<UniDateTime | undefined> {
1144
+ readonly value: _angular_core.ModelSignal<string>;
1145
+ readonly disabled: _angular_core.InputSignal<boolean>;
1146
+ readonly touched: _angular_core.ModelSignal<boolean>;
1147
+ readonly invalid: _angular_core.InputSignal<boolean>;
1148
+ readonly dirty: _angular_core.InputSignal<boolean>;
1149
+ readonly required: _angular_core.InputSignal<boolean>;
1150
+ readonly ariaDescribedBy: _angular_core.InputSignal<string>;
1151
+ /** Names the group; the parts are announced as "Date" and "Time" under it. */
1152
+ label: _angular_core.InputSignal<string>;
1153
+ /** Earliest allowed moment; the date and time fences are split from it. */
1154
+ minDateTime: _angular_core.InputSignal<string>;
1155
+ /** Latest allowed moment; the date and time fences are split from it. */
1156
+ maxDateTime: _angular_core.InputSignal<string>;
1157
+ disabledDates: _angular_core.InputSignal<string[] | ((date: UniDate) => boolean)>;
1158
+ markers: _angular_core.InputSignal<UniCalendarMarker[]>;
1159
+ /** Fixed time choices; superseded per-day by `slotsFor` when that is set. */
1160
+ slots: _angular_core.InputSignal<string[]>;
1161
+ minuteStep: _angular_core.InputSignal<number>;
1162
+ hour12: _angular_core.InputSignal<boolean>;
1163
+ weekStart: _angular_core.InputSignal<0 | 1 | 2 | 3 | 4 | 6 | 5>;
1164
+ locale: _angular_core.InputSignal<string>;
1165
+ /** Scheduling: the day's available times. Gates the time part on a date. */
1166
+ slotsFor: _angular_core.InputSignal<(date: UniDate) => UniTime[]>;
1167
+ private readonly host;
1168
+ /**
1169
+ * The two part-values. An external `value` write re-derives both; an
1170
+ * internal partial state (a date without a time round-trips through
1171
+ * `undefined`) must not be wiped by its own echo.
1172
+ */
1173
+ private readonly parts;
1174
+ protected readonly dateValue: _angular_core.Signal<string>;
1175
+ protected readonly timeValue: _angular_core.Signal<string>;
1176
+ protected readonly showError: _angular_core.Signal<boolean>;
1177
+ private readonly minParts;
1178
+ private readonly maxParts;
1179
+ protected readonly dateMin: _angular_core.Signal<string>;
1180
+ protected readonly dateMax: _angular_core.Signal<string>;
1181
+ protected readonly timeMin: _angular_core.Signal<string>;
1182
+ protected readonly timeMax: _angular_core.Signal<string>;
1183
+ /** The chosen day's slots when `slotsFor` is set, else the fixed list. */
1184
+ protected readonly effectiveSlots: _angular_core.Signal<string[]>;
1185
+ protected readonly timeDisabled: _angular_core.Signal<boolean>;
1186
+ protected onDatePartChange(date: UniDate | undefined): void;
1187
+ protected onTimePartChange(time: UniTime | undefined): void;
1188
+ private setParts;
1189
+ protected onHostFocusOut(event: FocusEvent): void;
1190
+ protected readonly className: _angular_core.Signal<string>;
1191
+ protected readonly groupClass: _angular_core.Signal<string>;
1192
+ protected readonly datePartClass: _angular_core.Signal<string>;
1193
+ protected readonly timePartClass: _angular_core.Signal<string>;
1194
+ protected readonly dividerClass: _angular_core.Signal<string>;
1195
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniDateTimeInputComponent, never>;
1196
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniDateTimeInputComponent, "uni-date-time-input, DateTimeInput", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": true; "isSignal": true; }; "minDateTime": { "alias": "minDateTime"; "required": false; "isSignal": true; }; "maxDateTime": { "alias": "maxDateTime"; "required": false; "isSignal": true; }; "disabledDates": { "alias": "disabledDates"; "required": false; "isSignal": true; }; "markers": { "alias": "markers"; "required": false; "isSignal": true; }; "slots": { "alias": "slots"; "required": false; "isSignal": true; }; "minuteStep": { "alias": "minuteStep"; "required": false; "isSignal": true; }; "hour12": { "alias": "hour12"; "required": false; "isSignal": true; }; "weekStart": { "alias": "weekStart"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "slotsFor": { "alias": "slotsFor"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; }, never, never, true, never>;
1197
+ }
1198
+
1199
+ interface UniInputBoxOptions {
1200
+ color: ContainerColorToken;
1201
+ disabledColor: ContainerColorToken;
1202
+ errorColor: ContainerColorToken;
1203
+ border: Border;
1204
+ errorBorder: Border;
1205
+ borderRadius: Radius;
1206
+ shadow?: Shadow;
1207
+ errorShadow?: Shadow;
1208
+ height?: string | number;
1209
+ paddingLeft: OptionalSize;
1210
+ typeface?: Typeface;
1211
+ textColor: ColorKey;
1212
+ disabledTextColor: ColorKey;
1213
+ focusOutline: string;
1214
+ focusOutlineOffset: number;
1215
+ /** Border swapped in while an inner control has focus (default: keep `border`). */
1216
+ focusBorder?: Border;
1217
+ /** Ring shown while focused, e.g. a soft `0 0 0 3px` spread shadow. */
1218
+ focusShadow?: Shadow;
1219
+ /** Background swapped in while focused (default: keep `color`). */
1220
+ focusColor?: ContainerColorToken;
1221
+ }
1222
+
1223
+ declare class UniInputBoxComponent extends BaseComponent<UniInputBoxOptions> {
1224
+ protected readonly className: string;
1225
+ disabled: _angular_core.InputSignal<boolean>;
1226
+ error: _angular_core.InputSignal<boolean>;
1227
+ minWidth: _angular_core.InputSignal<string>;
1228
+ /** Override the themed field height, e.g. `'auto'` for multi-line fields. */
1229
+ height: _angular_core.InputSignal<string | number>;
1230
+ width: _angular_core.InputSignal<string | number>;
1231
+ fullWidth: _angular_core.InputSignal<boolean>;
1232
+ grow: _angular_core.InputSignal<number>;
1233
+ protected readonly color: _angular_core.Signal<_uni_design_system_uni_core.ContainerColorToken>;
1234
+ protected readonly border: _angular_core.Signal<string>;
1235
+ protected readonly shadow: _angular_core.Signal<string>;
1236
+ protected readonly inputBoxClass: _angular_core.Signal<string>;
1237
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniInputBoxComponent, never>;
1238
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniInputBoxComponent, "uni-input-box", never, { "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "minWidth": { "alias": "minWidth"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "fullWidth": { "alias": "fullWidth"; "required": false; "isSignal": true; }; "grow": { "alias": "grow"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
1239
+ }
1240
+
1241
+ /**
1242
+ * The text-like native input types `uni-input` supports.
1243
+ *
1244
+ * Deliberately not the full native list: `checkbox`, `radio`, `file`, `range`,
1245
+ * `color`, `submit` and `hidden` are not text-like — they break both the
1246
+ * `uni-input-box` chrome and the `FormValueControl<string>` value contract —
1247
+ * and `date` / `time` / `datetime-local` have dedicated components
1248
+ * (`uni-date-input`, `uni-time-input`, `uni-date-time-input`) that handle
1249
+ * locale parsing and keyboard interaction properly.
1250
+ */
1251
+ type UniInputType = 'text' | 'email' | 'password' | 'search' | 'tel' | 'url' | 'number';
1252
+ /** Values for the native `inputmode` hint, which picks the on-screen keyboard. */
1253
+ type UniInputMode = 'none' | 'text' | 'decimal' | 'numeric' | 'tel' | 'search' | 'email' | 'url';
1254
+
1255
+ declare class UniInputComponent implements FormValueControl<string> {
1256
+ readonly value: _angular_core.ModelSignal<string>;
1257
+ readonly disabled: _angular_core.InputSignal<boolean>;
1258
+ readonly touched: _angular_core.ModelSignal<boolean>;
1259
+ readonly invalid: _angular_core.InputSignal<boolean>;
1260
+ readonly dirty: _angular_core.InputSignal<boolean>;
1261
+ /** Synced from required() validators by the Signal Forms [field] directive. */
1262
+ readonly required: _angular_core.InputSignal<boolean>;
1263
+ /**
1264
+ * Id(s) of external element(s) describing this control — typically your
1265
+ * app-rendered error message — exposed as aria-describedby.
1266
+ */
1267
+ readonly ariaDescribedBy: _angular_core.InputSignal<string>;
1268
+ label: _angular_core.InputSignal<string>;
1269
+ placeholder: _angular_core.InputSignal<string>;
1270
+ /**
1271
+ * Native input type. Text-like types only — `date`/`time` have dedicated
1272
+ * components, and non-text types break the input chrome and the string value.
1273
+ */
1274
+ type: _angular_core.InputSignal<UniInputType>;
1275
+ readonly readonly: _angular_core.InputSignal<boolean>;
1276
+ readonly name: _angular_core.InputSignal<string>;
1277
+ readonly min: _angular_core.InputSignal<number>;
1278
+ readonly max: _angular_core.InputSignal<number>;
1279
+ readonly minLength: _angular_core.InputSignal<number>;
1280
+ readonly maxLength: _angular_core.InputSignal<number>;
1281
+ /**
1282
+ * Patterns the value must match — all of them, per Signal Forms. The native
1283
+ * `pattern` attribute can only express one, so it is reflected only when
1284
+ * there is exactly one; Signal Forms validates the rest either way.
1285
+ */
1286
+ readonly pattern: _angular_core.InputSignal<readonly RegExp[]>;
1287
+ /** Granularity for `type="number"`, e.g. `0.01` or `'any'`. */
1288
+ step: _angular_core.InputSignal<string | number>;
1289
+ /** Autofill hint, e.g. `email`, `current-password`, `off`. */
1290
+ autocomplete: _angular_core.InputSignal<string>;
1291
+ /** On-screen keyboard hint; defaults to whatever `type` implies. */
1292
+ inputMode: _angular_core.InputSignal<UniInputMode>;
1293
+ /** Id of a `<datalist>` supplying suggestions. */
1294
+ list: _angular_core.InputSignal<string>;
1295
+ spellcheck: _angular_core.InputSignal<boolean>;
1296
+ /** Reflected only when unambiguous — see `pattern`. */
1297
+ protected readonly nativePattern: _angular_core.Signal<string>;
1298
+ width: _angular_core.InputSignal<string | number>;
1299
+ fullWidth: _angular_core.InputSignal<boolean>;
1300
+ grow: _angular_core.InputSignal<number>;
1301
+ protected readonly showError: _angular_core.Signal<boolean>;
1302
+ markAsTouched(): void;
1303
+ handleInput(event: Event): void;
1304
+ inputClass: string;
1305
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniInputComponent, never>;
1306
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniInputComponent, "uni-input", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": true; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "minLength": { "alias": "minLength"; "required": false; "isSignal": true; }; "maxLength": { "alias": "maxLength"; "required": false; "isSignal": true; }; "pattern": { "alias": "pattern"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "autocomplete": { "alias": "autocomplete"; "required": false; "isSignal": true; }; "inputMode": { "alias": "inputMode"; "required": false; "isSignal": true; }; "list": { "alias": "list"; "required": false; "isSignal": true; }; "spellcheck": { "alias": "spellcheck"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "fullWidth": { "alias": "fullWidth"; "required": false; "isSignal": true; }; "grow": { "alias": "grow"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; }, never, ["pre-input, [pre-input]", "post-input, [post-input]"], true, never>;
1307
+ }
1308
+
1309
+ /**
1310
+ * The base layout primitive, applied as an attribute to any element so
1311
+ * semantics stay yours: `<main box-layout [grow]="1" padding="md">`. It is a
1312
+ * directive, so it composes freely — with another layout attribute
1313
+ * (`<div stack-layout uni-text="body-1-long">`) and with a component's own host
1314
+ * element (`<uni-card box-layout padding="lg">`); Angular merges the host
1315
+ * `class` bindings rather than letting one win.
1316
+ *
1317
+ * Sizing convention (height/width/min/max/inset): a **number is px and needs
1318
+ * a binding** — `[height]="420"`; a **plain attribute is a CSS length
1319
+ * string** — `height="420px"`. Spacing/radius/color inputs take theme tokens.
1320
+ */
1321
+ declare class UniBoxDirective {
1322
+ theme: ThemeService;
1323
+ /**
1324
+ * A container color *pair*: the named surface plus its paired on-color, so a
1325
+ * box and its contents stay legible together.
1326
+ *
1327
+ * Named `containerColor`, not `color`, because it is not the CSS `color`
1328
+ * property — `uni-text` owns that name, and it maps to it directly. The two
1329
+ * directives share elements routinely (`<div row-layout uni-text>`), and one
1330
+ * `color` binding would feed both: the box would paint the surface and the
1331
+ * text would take the same token, rendering ink on identical ink.
1332
+ */
1333
+ containerColor: _angular_core.InputSignal<ContainerColorToken>;
1334
+ backgroundColor: _angular_core.InputSignal<string>;
1335
+ borderRadius: _angular_core.InputSignal<string>;
1336
+ borderRadiusLeft: _angular_core.InputSignal<string>;
1337
+ borderRadiusRight: _angular_core.InputSignal<string>;
1338
+ borderRadiusTop: _angular_core.InputSignal<string>;
1339
+ borderRadiusBottom: _angular_core.InputSignal<string>;
1340
+ padding: _angular_core.InputSignal<OptionalSize>;
1341
+ paddingHorizontal: _angular_core.InputSignal<OptionalSize>;
1342
+ paddingVertical: _angular_core.InputSignal<OptionalSize>;
1343
+ paddingLeft: _angular_core.InputSignal<OptionalSize>;
1344
+ paddingRight: _angular_core.InputSignal<OptionalSize>;
1345
+ paddingTop: _angular_core.InputSignal<OptionalSize>;
1346
+ paddingBottom: _angular_core.InputSignal<OptionalSize>;
1347
+ border: _angular_core.InputSignal<string>;
1348
+ borderTop: _angular_core.InputSignal<string>;
1349
+ borderBottom: _angular_core.InputSignal<string>;
1350
+ borderLeft: _angular_core.InputSignal<string>;
1351
+ borderRight: _angular_core.InputSignal<string>;
1352
+ dashBorder: _angular_core.InputSignal<boolean>;
1353
+ alignSelf: _angular_core.InputSignal<OptionalAlignSelf>;
1354
+ alignItems: _angular_core.InputSignal<OptionalAlignItems>;
1355
+ alignContent: _angular_core.InputSignal<OptionalAlignContent>;
1356
+ justifyContent: _angular_core.InputSignal<OptionalJustifyContent>;
1357
+ grow: _angular_core.InputSignal<number>;
1358
+ /**
1359
+ * The `flex` shorthand. `[flex]="1"` is `flex: 1` — grow, shrink and a zero
1360
+ * basis — which `grow` alone cannot express, since it leaves
1361
+ * `flex-basis: auto`. Wins over `grow` when both are set.
1362
+ */
1363
+ flex: _angular_core.InputSignal<string | number>;
1364
+ shrink: _angular_core.InputSignal<number>;
1365
+ basis: _angular_core.InputSignal<string | number>;
1366
+ /**
1367
+ * Inline-axis margin. `marginInline="auto"` centers a `maxWidth` container —
1368
+ * the one thing flex centering cannot do without an extra wrapper. Only the
1369
+ * inline axis is exposed: block margins collapse and fight `gap`, which is
1370
+ * why the primitives carry no margin otherwise.
1371
+ */
1372
+ marginInline: _angular_core.InputSignal<"auto" | NullableSize>;
1373
+ display: _angular_core.InputSignal<OptionalDisplay>;
1374
+ position: _angular_core.InputSignal<OptionalPosition>;
1375
+ inset: _angular_core.InputSignal<string | number>;
1376
+ /** Number = px via binding (`[height]="420"`); string = CSS length (`height="420px"`). */
1377
+ height: _angular_core.InputSignal<string | number>;
1378
+ minHeight: _angular_core.InputSignal<string | number>;
1379
+ maxHeight: _angular_core.InputSignal<string | number>;
1380
+ /** Number = px via binding (`[width]="420"`); string = CSS length (`width="50%"`). */
1381
+ width: _angular_core.InputSignal<string | number>;
1382
+ minWidth: _angular_core.InputSignal<string | number>;
1383
+ maxWidth: _angular_core.InputSignal<string | number>;
1384
+ ignoreDir: _angular_core.InputSignal<boolean>;
1385
+ gridArea: _angular_core.InputSignal<string>;
1386
+ gridColumn: _angular_core.InputSignal<string>;
1387
+ gridRow: _angular_core.InputSignal<string>;
1388
+ overflow: _angular_core.InputSignal<OptionalOverflow>;
1389
+ shadow: _angular_core.InputSignal<string>;
1390
+ gap: _angular_core.InputSignal<OptionalSize>;
1391
+ fullWidth: _angular_core.InputSignal<boolean>;
1392
+ fullHeight: _angular_core.InputSignal<boolean>;
1393
+ flexDirection: _angular_core.InputSignal<OptionalFlexDirection>;
1394
+ textAlign: _angular_core.InputSignal<OptionalTextAlign>;
1395
+ wrapItems: _angular_core.InputSignal<OptionalWrap>;
1396
+ zIndex: _angular_core.InputSignal<ZIndexableElements>;
1397
+ protected readonly boxClassName: _angular_core.Signal<string>;
1398
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniBoxDirective, never>;
1399
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<UniBoxDirective, "[uni-box-layout], [box-layout]", never, { "containerColor": { "alias": "containerColor"; "required": false; "isSignal": true; }; "backgroundColor": { "alias": "backgroundColor"; "required": false; "isSignal": true; }; "borderRadius": { "alias": "borderRadius"; "required": false; "isSignal": true; }; "borderRadiusLeft": { "alias": "borderRadiusLeft"; "required": false; "isSignal": true; }; "borderRadiusRight": { "alias": "borderRadiusRight"; "required": false; "isSignal": true; }; "borderRadiusTop": { "alias": "borderRadiusTop"; "required": false; "isSignal": true; }; "borderRadiusBottom": { "alias": "borderRadiusBottom"; "required": false; "isSignal": true; }; "padding": { "alias": "padding"; "required": false; "isSignal": true; }; "paddingHorizontal": { "alias": "paddingHorizontal"; "required": false; "isSignal": true; }; "paddingVertical": { "alias": "paddingVertical"; "required": false; "isSignal": true; }; "paddingLeft": { "alias": "paddingLeft"; "required": false; "isSignal": true; }; "paddingRight": { "alias": "paddingRight"; "required": false; "isSignal": true; }; "paddingTop": { "alias": "paddingTop"; "required": false; "isSignal": true; }; "paddingBottom": { "alias": "paddingBottom"; "required": false; "isSignal": true; }; "border": { "alias": "border"; "required": false; "isSignal": true; }; "borderTop": { "alias": "borderTop"; "required": false; "isSignal": true; }; "borderBottom": { "alias": "borderBottom"; "required": false; "isSignal": true; }; "borderLeft": { "alias": "borderLeft"; "required": false; "isSignal": true; }; "borderRight": { "alias": "borderRight"; "required": false; "isSignal": true; }; "dashBorder": { "alias": "dashBorder"; "required": false; "isSignal": true; }; "alignSelf": { "alias": "alignSelf"; "required": false; "isSignal": true; }; "alignItems": { "alias": "alignItems"; "required": false; "isSignal": true; }; "alignContent": { "alias": "alignContent"; "required": false; "isSignal": true; }; "justifyContent": { "alias": "justifyContent"; "required": false; "isSignal": true; }; "grow": { "alias": "grow"; "required": false; "isSignal": true; }; "flex": { "alias": "flex"; "required": false; "isSignal": true; }; "shrink": { "alias": "shrink"; "required": false; "isSignal": true; }; "basis": { "alias": "basis"; "required": false; "isSignal": true; }; "marginInline": { "alias": "marginInline"; "required": false; "isSignal": true; }; "display": { "alias": "display"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; "inset": { "alias": "inset"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "minHeight": { "alias": "minHeight"; "required": false; "isSignal": true; }; "maxHeight": { "alias": "maxHeight"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "minWidth": { "alias": "minWidth"; "required": false; "isSignal": true; }; "maxWidth": { "alias": "maxWidth"; "required": false; "isSignal": true; }; "ignoreDir": { "alias": "ignoreDir"; "required": false; "isSignal": true; }; "gridArea": { "alias": "gridArea"; "required": false; "isSignal": true; }; "gridColumn": { "alias": "gridColumn"; "required": false; "isSignal": true; }; "gridRow": { "alias": "gridRow"; "required": false; "isSignal": true; }; "overflow": { "alias": "overflow"; "required": false; "isSignal": true; }; "shadow": { "alias": "shadow"; "required": false; "isSignal": true; }; "gap": { "alias": "gap"; "required": false; "isSignal": true; }; "fullWidth": { "alias": "fullWidth"; "required": false; "isSignal": true; }; "fullHeight": { "alias": "fullHeight"; "required": false; "isSignal": true; }; "flexDirection": { "alias": "flexDirection"; "required": false; "isSignal": true; }; "textAlign": { "alias": "textAlign"; "required": false; "isSignal": true; }; "wrapItems": { "alias": "wrapItems"; "required": false; "isSignal": true; }; "zIndex": { "alias": "zIndex"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1400
+ }
1401
+
1402
+ declare class UniCenterDirective extends UniBoxDirective {
1403
+ display: _angular_core.InputSignal<OptionalDisplay>;
1404
+ justifyContent: _angular_core.InputSignal<OptionalJustifyContent>;
1405
+ alignItems: _angular_core.InputSignal<OptionalAlignItems>;
1406
+ constructor();
1407
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniCenterDirective, never>;
1408
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<UniCenterDirective, "[uni-center-layout], [center-layout]", never, { "display": { "alias": "display"; "required": false; "isSignal": true; }; "justifyContent": { "alias": "justifyContent"; "required": false; "isSignal": true; }; "alignItems": { "alias": "alignItems"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1409
+ }
1410
+
1411
+ declare class UniGridAreaDirective {
1412
+ area: _angular_core.InputSignal<string>;
1413
+ protected readonly className: _angular_core.Signal<string>;
1414
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniGridAreaDirective, never>;
1415
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<UniGridAreaDirective, "[uni-grid-area-layout], [grid-area-layout]", never, { "area": { "alias": "area"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
1416
+ }
1417
+
1418
+ declare class UniGridDirective extends UniBoxDirective {
1419
+ display: _angular_core.InputSignal<OptionalDisplay>;
1420
+ templateAreas: _angular_core.InputSignal<string>;
1421
+ templateColumns: _angular_core.InputSignal<string>;
1422
+ templateRows: _angular_core.InputSignal<string>;
1423
+ outline: _angular_core.InputSignal<Thickness>;
1424
+ outlineColor: _angular_core.InputSignal<Variant>;
1425
+ protected readonly gridClassName: _angular_core.Signal<string>;
1426
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniGridDirective, never>;
1427
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<UniGridDirective, "[uni-grid-layout], [grid-layout]", never, { "display": { "alias": "display"; "required": false; "isSignal": true; }; "templateAreas": { "alias": "templateAreas"; "required": false; "isSignal": true; }; "templateColumns": { "alias": "templateColumns"; "required": false; "isSignal": true; }; "templateRows": { "alias": "templateRows"; "required": false; "isSignal": true; }; "outline": { "alias": "outline"; "required": false; "isSignal": true; }; "outlineColor": { "alias": "outlineColor"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1428
+ }
1429
+
1430
+ declare class UniRowDirective extends UniBoxDirective {
1431
+ display: _angular_core.InputSignal<OptionalDisplay>;
1432
+ flexDirection: _angular_core.InputSignal<OptionalFlexDirection>;
1433
+ /**
1434
+ * Defaults to `fit-content` (guards content collapse). Set `[minWidth]="0"`
1435
+ * when the row must shrink inside a constrained flex parent (scroll or
1436
+ * text truncation containment).
1437
+ */
1438
+ minWidth: _angular_core.InputSignal<string | number>;
1439
+ constructor();
1440
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniRowDirective, never>;
1441
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<UniRowDirective, "[uni-row-layout], [row-layout]", never, { "display": { "alias": "display"; "required": false; "isSignal": true; }; "flexDirection": { "alias": "flexDirection"; "required": false; "isSignal": true; }; "minWidth": { "alias": "minWidth"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1442
+ }
1443
+
1444
+ declare class UniStackDirective extends UniBoxDirective {
1445
+ display: _angular_core.InputSignal<OptionalDisplay>;
1446
+ flexDirection: _angular_core.InputSignal<OptionalFlexDirection>;
1447
+ /**
1448
+ * Defaults to `fit-content` (guards content collapse). Set `[minHeight]="0"`
1449
+ * when the stack must shrink inside a constrained flex parent (scroll
1450
+ * containment).
1451
+ */
1452
+ minHeight: _angular_core.InputSignal<string | number>;
1453
+ constructor();
1454
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniStackDirective, never>;
1455
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<UniStackDirective, "[uni-stack-layout], [stack-layout]", never, { "display": { "alias": "display"; "required": false; "isSignal": true; }; "flexDirection": { "alias": "flexDirection"; "required": false; "isSignal": true; }; "minHeight": { "alias": "minHeight"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1456
+ }
1457
+
1458
+ declare class UniWrapDirective extends UniBoxDirective {
1459
+ display: _angular_core.InputSignal<OptionalDisplay>;
1460
+ wrapItems: _angular_core.InputSignal<OptionalWrap>;
1461
+ constructor();
1462
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniWrapDirective, never>;
1463
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<UniWrapDirective, "[uni-wrap-layout], [wrap-layout]", never, { "display": { "alias": "display"; "required": false; "isSignal": true; }; "wrapItems": { "alias": "wrapItems"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1464
+ }
1465
+
1466
+ interface UniMultiSelectDropdownOptions {
1467
+ textRole: Typeface;
1468
+ textColor: TextColor;
1469
+ placeholderTextColor: TextColor;
1470
+ dividerBorder: Border;
1471
+ searchInputBorder: Border;
1472
+ searchInputBorderRadius: Radius;
1473
+ focusOutline: string;
1474
+ focusOutlineOffset: number;
1475
+ }
1476
+
1477
+ declare class UniMultiSelectDropdownComponent<T = unknown> extends BaseComponent<UniMultiSelectDropdownOptions> implements FormValueControl<T[]> {
1478
+ protected readonly className: string;
1479
+ readonly value: _angular_core.ModelSignal<T[]>;
1480
+ readonly disabled: _angular_core.InputSignal<boolean>;
1481
+ readonly touched: _angular_core.ModelSignal<boolean>;
1482
+ readonly invalid: _angular_core.InputSignal<boolean>;
1483
+ readonly dirty: _angular_core.InputSignal<boolean>;
1484
+ /** Synced from required() validators by the Signal Forms [field] directive. */
1485
+ readonly required: _angular_core.InputSignal<boolean>;
1486
+ /**
1487
+ * Id(s) of external element(s) describing this control — typically your
1488
+ * app-rendered error message — exposed as aria-describedby.
1489
+ */
1490
+ readonly ariaDescribedBy: _angular_core.InputSignal<string>;
1491
+ readonly options: _angular_core.InputSignal<Options<T>>;
1492
+ readonly placeholder: _angular_core.InputSignal<string>;
1493
+ /**
1494
+ * What the field is for, e.g. "Fruits". Rendered visually hidden inside the
1495
+ * trigger so its accessible name reads "Fruits, Apple, Pear" — without it a
1496
+ * screen reader announces only the current selection, with no clue which
1497
+ * field it belongs to.
1498
+ */
1499
+ readonly label: _angular_core.InputSignal<string>;
1500
+ /** Debounce for the filter box, matching the library's input debounce. */
1501
+ readonly debounceTime: _angular_core.InputSignal<number>;
1502
+ protected readonly srOnly: string;
1503
+ protected readonly query: _angular_core.WritableSignal<string>;
1504
+ private queryTimer?;
1505
+ protected readonly filteredOptions: _angular_core.Signal<Options<T>>;
1506
+ private readonly optionRefs;
1507
+ /**
1508
+ * Roving focus over the options. The shared helper owns the index
1509
+ * arithmetic — wrapping, Home/End, and never pointing past a list the
1510
+ * filter has narrowed — the same contract `uni-search-input` and
1511
+ * `uni-tag-input` use, so the keys behave identically across all three.
1512
+ *
1513
+ * `disabled` indexes into `filteredOptions`, matching `count`: arrows step
1514
+ * over disabled rows and Home/End land on the nearest enabled one, so the
1515
+ * focus target is always a checkbox that can actually take focus.
1516
+ */
1517
+ protected readonly list: _uni_design_system_uni_angular.ListboxNavigation;
1518
+ /** Announced with the selection so the count is not left to guesswork. */
1519
+ readonly selectionSummary: _angular_core.Signal<string>;
1520
+ readonly selectedLabelsText: _angular_core.Signal<string>;
1521
+ protected readonly showError: _angular_core.Signal<boolean>;
1522
+ protected readonly textColor: _angular_core.Signal<_uni_design_system_uni_core.TextColor>;
1523
+ triggerClass: string;
1524
+ protected readonly searchInputClass: _angular_core.Signal<string>;
1525
+ protected handleQueryInput(event: Event): void;
1526
+ /**
1527
+ * Arrow keys walk the options from anywhere in the panel, including the
1528
+ * filter box — previously the only way in was to Tab through every
1529
+ * checkbox.
1530
+ */
1531
+ protected onPanelKeydown(event: KeyboardEvent): void;
1532
+ /** Keeps the active index in step when focus lands on a row by pointer. */
1533
+ protected onOptionFocus(index: number): void;
1534
+ /**
1535
+ * Selects every *enabled* option. A disabled option is not committable, so
1536
+ * "select all" must not commit one on the user's behalf — the same rule
1537
+ * `toggleOption` and the keyboard path follow.
1538
+ */
1539
+ selectAll(): void;
1540
+ deselectAll(): void;
1541
+ protected isOptionSelected(option: Option<T>): _angular_core.Signal<boolean>;
1542
+ toggleOption(option: Option<T>, checked: boolean): void;
1543
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniMultiSelectDropdownComponent<any>, never>;
1544
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniMultiSelectDropdownComponent<any>, "uni-multi-select-dropdown", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": true; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "debounceTime": { "alias": "debounceTime"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; }, never, never, true, never>;
1545
+ }
1546
+
1547
+ declare class UniMultiSelectComponent<T = unknown> {
1548
+ options: _angular_core.InputSignal<Option<T>[]>;
1549
+ selections: _angular_core.InputSignal<T[]>;
1550
+ updates: _angular_core.OutputEmitterRef<T[]>;
1551
+ flexDirection: _angular_core.InputSignal<"column" | "column-reverse" | "row" | "row-reverse">;
1552
+ checkboxGap: _angular_core.InputSignal<NullableSize>;
1553
+ protected readonly values: _angular_core.Signal<unknown[]>;
1554
+ protected readonly optionsWithSelections: _angular_core.Signal<Option<T>[]>;
1555
+ protected readonly className: string;
1556
+ handleCheck(checked: boolean, value: T): void;
1557
+ /** Selects every *enabled* option — a disabled option is not committable. */
1558
+ selectAll(): void;
1559
+ deselectAll(): void;
1560
+ optionWrapper: string;
1561
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniMultiSelectComponent<any>, never>;
1562
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniMultiSelectComponent<any>, "uni-multi-select", never, { "options": { "alias": "options"; "required": false; "isSignal": true; }; "selections": { "alias": "selections"; "required": false; "isSignal": true; }; "flexDirection": { "alias": "flexDirection"; "required": false; "isSignal": true; }; "checkboxGap": { "alias": "checkboxGap"; "required": false; "isSignal": true; }; }, { "updates": "updates"; }, never, never, true, never>;
1563
+ }
1564
+
1565
+ interface UniRadioOption {
1566
+ /**
1567
+ * The label displayed for this radio option
1568
+ */
1569
+ label: string;
1570
+ /**
1571
+ * The value associated with this radio option
1572
+ */
1573
+ value: string;
1574
+ /**
1575
+ * Whether this option is disabled
1576
+ */
1577
+ disabled?: boolean;
1578
+ }
1579
+ interface UniRadioOptions {
1580
+ /**
1581
+ * The size of the radio buttons
1582
+ */
1583
+ size?: number;
1584
+ /** Unselected ring color token. */
1585
+ ringColor?: ColorKey;
1586
+ /** Circle background token. */
1587
+ fillColor?: ColorKey;
1588
+ /** Named motion primitive for the dot's grow/retract and the ring's color
1589
+ change. Defaults to `control`; a token with `duration: 0` is instant. */
1590
+ motion?: Motion;
1591
+ }
1592
+
1593
+ declare class UniRadioComponent extends BaseComponent<UniRadioOptions> implements FormValueControl<string> {
1594
+ readonly value: _angular_core.ModelSignal<string>;
1595
+ readonly disabled: _angular_core.InputSignal<boolean>;
1596
+ readonly touched: _angular_core.ModelSignal<boolean>;
1597
+ readonly invalid: _angular_core.InputSignal<boolean>;
1598
+ readonly dirty: _angular_core.InputSignal<boolean>;
1599
+ /** Synced from required() validators by the Signal Forms [field] directive. */
1600
+ readonly required: _angular_core.InputSignal<boolean>;
1601
+ /**
1602
+ * Id(s) of external element(s) describing this control — typically your
1603
+ * app-rendered error message — exposed as aria-describedby.
1604
+ */
1605
+ readonly ariaDescribedBy: _angular_core.InputSignal<string>;
1606
+ readonly options: _angular_core.InputSignal<UniRadioOption[]>;
1607
+ readonly label: _angular_core.InputSignal<string>;
1608
+ readonly name: _angular_core.InputSignal<string>;
1609
+ /** Links the group label to the radiogroup container. */
1610
+ protected readonly groupLabelId: string;
1611
+ protected readonly showError: _angular_core.Signal<boolean>;
1612
+ markAsTouched(): void;
1613
+ private readonly metrics;
1614
+ protected readonly radioGroupClass: string;
1615
+ protected readonly radioOptionClass: _angular_core.Signal<string>;
1616
+ protected readonly radioInputClass: _angular_core.Signal<string>;
1617
+ handleRadioChange(optionValue: string): void;
1618
+ getThemeColor(token: ColorToken): string;
1619
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniRadioComponent, never>;
1620
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniRadioComponent, "uni-radio", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; }, never, never, true, never>;
1621
+ }
1622
+
1623
+ /**
1624
+ * Text input that emits `change` only after the user pauses typing. Wears the
1625
+ * shared input chrome (themed color, border, typeface, focus ring) via
1626
+ * `uni-input-box`; project adornments with the `pre-input` / `post-input`
1627
+ * slots, matching `uni-input`'s convention. The ARIA passthrough inputs let a
1628
+ * wrapping composite (e.g. SearchInput's combobox) annotate the real input
1629
+ * element.
1630
+ */
1631
+ declare class UniDebounceInputComponent {
1632
+ inputName: _angular_core.InputSignal<string>;
1633
+ inputId: _angular_core.InputSignal<string>;
1634
+ debounceTime: _angular_core.InputSignal<number>;
1635
+ /** Accessible name for the input. */
1636
+ label: _angular_core.InputSignal<string>;
1637
+ placeholder: _angular_core.InputSignal<string>;
1638
+ disabled: _angular_core.InputSignal<boolean>;
1639
+ /** Native input type; text-like only, matching `uni-input`. */
1640
+ type: _angular_core.InputSignal<UniInputType>;
1641
+ autocomplete: _angular_core.InputSignal<string>;
1642
+ inputMode: _angular_core.InputSignal<UniInputMode>;
1643
+ role: _angular_core.InputSignal<string>;
1644
+ ariaExpanded: _angular_core.InputSignal<boolean>;
1645
+ ariaControls: _angular_core.InputSignal<string>;
1646
+ ariaActivedescendant: _angular_core.InputSignal<string>;
1647
+ /** The debounced value, emitted once the user pauses typing. */
1648
+ valueChange: _angular_core.OutputEmitterRef<string>;
1649
+ value: _angular_core.WritableSignal<string>;
1650
+ private readonly inputElement;
1651
+ private timeoutId;
1652
+ private lastEmitted;
1653
+ constructor();
1654
+ handleInput(event: Event): void;
1655
+ /** Empty the field immediately, cancelling any pending emit. */
1656
+ clear(): void;
1657
+ focus(): void;
1658
+ inputClass: string;
1659
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniDebounceInputComponent, never>;
1660
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniDebounceInputComponent, "uni-debounce-input", never, { "inputName": { "alias": "inputName"; "required": false; "isSignal": true; }; "inputId": { "alias": "inputId"; "required": false; "isSignal": true; }; "debounceTime": { "alias": "debounceTime"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "autocomplete": { "alias": "autocomplete"; "required": false; "isSignal": true; }; "inputMode": { "alias": "inputMode"; "required": false; "isSignal": true; }; "role": { "alias": "role"; "required": false; "isSignal": true; }; "ariaExpanded": { "alias": "ariaExpanded"; "required": false; "isSignal": true; }; "ariaControls": { "alias": "ariaControls"; "required": false; "isSignal": true; }; "ariaActivedescendant": { "alias": "ariaActivedescendant"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; }, never, ["[pre-input]", "[post-input]"], true, never>;
1661
+ }
1662
+
1663
+ /** Theme-level options for `uni-search-input`, resolved by token name. */
1664
+ interface UniSearchInputOptions {
1665
+ /** Leading (decorative) symbol. */
1666
+ searchSymbol?: string;
1667
+ /** Clear-button symbol. */
1668
+ clearSymbol?: string;
1669
+ /** Suggestion list surface color token. */
1670
+ listColor?: ColorKey;
1671
+ /** Active/hover suggestion fill; the on-color pair is derived. Must
1672
+ contrast with `listColor` or keyboard navigation turns invisible. */
1673
+ activeColor?: ContainerColorToken;
1674
+ /** Suggestion list elevation token. */
1675
+ listShadow?: Shadow;
1676
+ /** Suggestion list radius token. */
1677
+ listBorderRadius?: Radius;
1678
+ /** Cap on rendered suggestions. */
1679
+ maxSuggestions?: number; /** Named motion primitive for the suggestion popup's open animation.
1680
+ Defaults to `popup` — the token `uni-dropdown` uses. */
1681
+ motion?: Motion;
1682
+ }
1683
+
1684
+ /**
1685
+ * Generic search field: shared input chrome with a leading magnifier, a clear
1686
+ * button while there's a query, Enter to submit, and optional type-ahead —
1687
+ * pass `suggestions` (refresh them from `change`) and the field becomes an
1688
+ * ARIA combobox with a keyboard-navigable listbox. Escape closes the list
1689
+ * first, then clears the query.
1690
+ */
1691
+ declare class UniSearchInputComponent extends BaseComponent<UniSearchInputOptions> {
1692
+ /** Accessible name for the field, also the placeholder fallback. */
1693
+ label: _angular_core.InputSignal<string>;
1694
+ placeholder: _angular_core.InputSignal<string>;
1695
+ width: _angular_core.InputSignal<string | number>;
1696
+ debounceTime: _angular_core.InputSignal<number>;
1697
+ /**
1698
+ * Type-ahead entries. Keep them fresh from `change` emissions; the list
1699
+ * shows while the field has focus and entries exist.
1700
+ */
1701
+ suggestions: _angular_core.InputSignal<string[]>;
1702
+ /** The debounced query, emitted as the user types. */
1703
+ searchChange: _angular_core.OutputEmitterRef<string>;
1704
+ /** A committed search: Enter, or a suggestion chosen from the list. */
1705
+ searchSubmit: _angular_core.OutputEmitterRef<string>;
1706
+ suggestionSelected: _angular_core.OutputEmitterRef<string>;
1707
+ protected readonly field: _angular_core.Signal<UniDebounceInputComponent>;
1708
+ private readonly listRef;
1709
+ /** Ties the popup to the field so the browser tracks it in the top layer. */
1710
+ private readonly anchor;
1711
+ /** `manual` where the top layer is usable, else null — see the popup helper. */
1712
+ protected readonly popupAttr: "manual";
1713
+ constructor();
1714
+ protected readonly visibleSuggestions: _angular_core.Signal<string[]>;
1715
+ /** Shared combobox bookkeeping: open state, active option, ARIA ids. */
1716
+ protected readonly list: _uni_design_system_uni_angular.ListboxNavigation;
1717
+ readonly listboxId: string;
1718
+ protected readonly hasQuery: _angular_core.Signal<boolean>;
1719
+ protected handleChange(value: string): void;
1720
+ protected submit(): void;
1721
+ protected select(suggestion: string): void;
1722
+ protected clear(): void;
1723
+ protected onKeydown(event: KeyboardEvent): void;
1724
+ protected onFocusOut(event: FocusEvent): void;
1725
+ protected readonly className: _angular_core.Signal<string>;
1726
+ protected readonly listClass: _angular_core.Signal<string>;
1727
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniSearchInputComponent, never>;
1728
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniSearchInputComponent, "uni-search-input", never, { "label": { "alias": "label"; "required": true; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "debounceTime": { "alias": "debounceTime"; "required": false; "isSignal": true; }; "suggestions": { "alias": "suggestions"; "required": false; "isSignal": true; }; }, { "searchChange": "searchChange"; "searchSubmit": "searchSubmit"; "suggestionSelected": "suggestionSelected"; }, never, never, true, never>;
1729
+ }
1730
+
1731
+ declare class UniSelectComponent<T> implements FormValueControl<T | null> {
1732
+ readonly value: _angular_core.ModelSignal<T>;
1733
+ readonly disabled: _angular_core.InputSignal<boolean>;
1734
+ readonly touched: _angular_core.ModelSignal<boolean>;
1735
+ readonly invalid: _angular_core.InputSignal<boolean>;
1736
+ readonly dirty: _angular_core.InputSignal<boolean>;
1737
+ /** Synced from required() validators by the Signal Forms [field] directive. */
1738
+ readonly required: _angular_core.InputSignal<boolean>;
1739
+ /**
1740
+ * Id(s) of external element(s) describing this control — typically your
1741
+ * app-rendered error message — exposed as aria-describedby.
1742
+ */
1743
+ readonly ariaDescribedBy: _angular_core.InputSignal<string>;
1744
+ readonly options: _angular_core.InputSignal<Options<T>>;
1745
+ readonly placeholder: _angular_core.InputSignal<string>;
1746
+ readonly width: _angular_core.InputSignal<string | number>;
1747
+ readonly fullWidth: _angular_core.InputSignal<boolean>;
1748
+ readonly grow: _angular_core.InputSignal<number>;
1749
+ /**
1750
+ * Equality used to match `value` against option values, called as
1751
+ * `compareWith(optionValue, value)`. Defaults to reference equality, which
1752
+ * never matches an object value rebuilt from elsewhere (e.g. a saved record
1753
+ * against options from a fresh fetch) — pass a key comparison like
1754
+ * `(a, b) => a?.id === b?.id` for object values.
1755
+ */
1756
+ readonly compareWith: _angular_core.InputSignal<(optionValue: T, value: T) => boolean>;
1757
+ /** Accessible name for the select; a placeholder is not a label. */
1758
+ readonly ariaLabel: _angular_core.InputSignal<string>;
1759
+ protected readonly UNSELECTED = -1;
1760
+ /**
1761
+ * We use the index as the HTML value to avoid issues with
1762
+ * stringifying complex objects or duplicate labels.
1763
+ */
1764
+ protected readonly currentSelectedIndex: _angular_core.Signal<string | -1>;
1765
+ protected readonly showError: _angular_core.Signal<boolean>;
1766
+ protected handleSelectChange(event: Event): void;
1767
+ selectClass: string;
1768
+ arrowClass: string;
1769
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniSelectComponent<any>, never>;
1770
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniSelectComponent<any>, "uni-select", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "fullWidth": { "alias": "fullWidth"; "required": false; "isSignal": true; }; "grow": { "alias": "grow"; "required": false; "isSignal": true; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; }, never, never, true, never>;
1771
+ }
1772
+
1773
+ /** Theme-level options for `uni-slider`, resolved by token name. */
1774
+ interface UniSliderOptions {
1775
+ /** Fill and thumb color. */
1776
+ color?: ColorKey;
1777
+ /** Unfilled track color. */
1778
+ trackColor?: ColorKey;
1779
+ /** Track and thumb radius token. */
1780
+ borderRadius?: Radius;
1781
+ /** Track height in px. */
1782
+ trackHeight?: number;
1783
+ /** Thumb diameter in px. */
1784
+ thumbSize?: number;
1785
+ }
1786
+
1787
+ /**
1788
+ * Range slider on a native `<input type="range">` — keyboard interaction and
1789
+ * the ARIA slider contract come from the platform. Fill, track, thumb and
1790
+ * radii resolve from `slider` theme tokens; the fill percentage rides a CSS
1791
+ * custom property so dragging never regenerates styles.
1792
+ */
1793
+ declare class UniSliderComponent extends BaseComponent<UniSliderOptions> implements FormValueControl<number> {
1794
+ readonly value: _angular_core.ModelSignal<number>;
1795
+ readonly disabled: _angular_core.InputSignal<boolean>;
1796
+ readonly touched: _angular_core.ModelSignal<boolean>;
1797
+ readonly invalid: _angular_core.InputSignal<boolean>;
1798
+ readonly dirty: _angular_core.InputSignal<boolean>;
1799
+ /** Synced from required() validators by the Signal Forms [field] directive. */
1800
+ readonly required: _angular_core.InputSignal<boolean>;
1801
+ /**
1802
+ * Id(s) of external element(s) describing this control — typically your
1803
+ * app-rendered value or error text — exposed as aria-describedby.
1804
+ */
1805
+ readonly ariaDescribedBy: _angular_core.InputSignal<string>;
1806
+ label: _angular_core.InputSignal<string>;
1807
+ min: _angular_core.InputSignal<number>;
1808
+ max: _angular_core.InputSignal<number>;
1809
+ step: _angular_core.InputSignal<number>;
1810
+ protected readonly resolvedMin: _angular_core.Signal<number>;
1811
+ protected readonly resolvedMax: _angular_core.Signal<number>;
1812
+ markAsTouched(): void;
1813
+ handleInput(event: Event): void;
1814
+ protected readonly fillPercent: _angular_core.Signal<string>;
1815
+ protected readonly inputClass: _angular_core.Signal<string>;
1816
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniSliderComponent, never>;
1817
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniSliderComponent, "uni-slider", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": true; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; }, never, never, true, never>;
1818
+ }
1819
+
1820
+ /**
1821
+ * One committed token. `value` is canonical — what a form submits — and
1822
+ * everything else is presentation the field may enrich from a suggestion.
1823
+ *
1824
+ * `{ value: 'a@b.com' }` is a complete item, so the least a caller has to write
1825
+ * is `[value]="[{ value: 'a@b.com' }]"`.
1826
+ */
1827
+ interface UniTagItem {
1828
+ /** Canonical value, e.g. an email address. */
1829
+ value: string;
1830
+ /** Display text; falls back to `value`. */
1831
+ label?: string;
1832
+ avatarSrc?: string;
1833
+ /**
1834
+ * Failed `validate()`. The item stays **in** the value rather than being
1835
+ * rejected — a field that silently swallows a typo'd address is worse than
1836
+ * one that shows it in red, and the user can click in to fix it.
1837
+ */
1838
+ invalid?: boolean;
1839
+ /** Locked token (e.g. a thread owner): rendered without a remove control. */
1840
+ disabled?: boolean;
1841
+ }
1842
+ /** A type-ahead entry. Same contract as `uni-search-input`: the app filters. */
1843
+ interface UniTagSuggestion {
1844
+ value: string;
1845
+ label?: string;
1846
+ description?: string;
1847
+ avatarSrc?: string;
1848
+ }
1849
+ /** Why a typed token did not become a chip. */
1850
+ interface UniTagRejection {
1851
+ raw: string;
1852
+ reason: 'duplicate' | 'max' | 'invalid';
1853
+ }
1854
+ /** Theme options for the `tagInput` component entry. */
1855
+ interface UniTagInputOptions {
1856
+ /** Space between chips. */
1857
+ chipGap?: NullableSize;
1858
+ chipSize?: Size;
1859
+ /** Keeps the text input usable when chips have wrapped. */
1860
+ minInputWidth?: string | number;
1861
+ listColor?: ContainerColorToken;
1862
+ listShadow?: Shadow;
1863
+ listBorderRadius?: Radius;
1864
+ /** Active/hover suggestion fill; the on-color pair is derived. Must
1865
+ contrast with `listColor` or keyboard navigation turns invisible. */
1866
+ activeColor?: ContainerColorToken;
1867
+ maxSuggestions?: number; /** Named motion primitive for the suggestion popup's open animation.
1868
+ Defaults to `popup` — the token `uni-dropdown` uses. */
1869
+ motion?: Motion;
1870
+ }
1871
+
1872
+ declare class UniTagInputComponent extends BaseComponent<UniTagInputOptions> implements FormValueControl<UniTagItem[]> {
1873
+ readonly value: _angular_core.ModelSignal<UniTagItem[]>;
1874
+ readonly disabled: _angular_core.InputSignal<boolean>;
1875
+ readonly touched: _angular_core.ModelSignal<boolean>;
1876
+ readonly invalid: _angular_core.InputSignal<boolean>;
1877
+ readonly dirty: _angular_core.InputSignal<boolean>;
1878
+ readonly required: _angular_core.InputSignal<boolean>;
1879
+ readonly ariaDescribedBy: _angular_core.InputSignal<string>;
1880
+ /** Accessible name for the field, e.g. "To". */
1881
+ label: _angular_core.InputSignal<string>;
1882
+ placeholder: _angular_core.InputSignal<string>;
1883
+ /** `email` wires an address validator, paste parser and space separator. */
1884
+ preset: _angular_core.InputSignal<"text" | "email">;
1885
+ separators: _angular_core.InputSignal<string[]>;
1886
+ commitOnBlur: _angular_core.InputSignal<boolean>;
1887
+ allowDuplicates: _angular_core.InputSignal<boolean>;
1888
+ max: _angular_core.InputSignal<number>;
1889
+ validate: _angular_core.InputSignal<(raw: string) => boolean>;
1890
+ parse: _angular_core.InputSignal<(pasted: string) => string[]>;
1891
+ tagVariant: _angular_core.InputSignal<Variant>;
1892
+ tagTone: _angular_core.InputSignal<TagTone>;
1893
+ tagSize: _angular_core.InputSignal<Size>;
1894
+ suggestions: _angular_core.InputSignal<UniTagSuggestion[]>;
1895
+ /** Debounced text the app should filter `suggestions` from. */
1896
+ query: _angular_core.OutputEmitterRef<string>;
1897
+ debounceTime: _angular_core.InputSignal<number>;
1898
+ added: _angular_core.OutputEmitterRef<UniTagItem>;
1899
+ removed: _angular_core.OutputEmitterRef<UniTagItem>;
1900
+ rejected: _angular_core.OutputEmitterRef<UniTagRejection>;
1901
+ private readonly inputRef;
1902
+ private readonly chipRefs;
1903
+ private readonly listRef;
1904
+ /** Ties the popup to the field so the browser tracks it in the top layer. */
1905
+ private readonly anchor;
1906
+ /** `manual` where the top layer is usable, else null — see the popup helper. */
1907
+ protected readonly popupAttr: "manual";
1908
+ constructor();
1909
+ /** Uncommitted text in the field. */
1910
+ protected readonly draft: _angular_core.WritableSignal<string>;
1911
+ /** Index of the focused chip, or -1 when focus is in the text input. */
1912
+ protected readonly focusedChip: _angular_core.WritableSignal<number>;
1913
+ /** Adds, removes and refusals are otherwise silent to a screen reader. */
1914
+ protected readonly announcer: _uni_design_system_uni_angular.Announcer;
1915
+ protected readonly hintId: string;
1916
+ protected readonly srOnly: string;
1917
+ private queryTimer?;
1918
+ protected readonly visibleSuggestions: _angular_core.Signal<UniTagSuggestion[]>;
1919
+ /** Shared combobox bookkeeping — identical contract to uni-search-input. */
1920
+ protected readonly list: _uni_design_system_uni_angular.ListboxNavigation;
1921
+ protected readonly showError: _angular_core.Signal<boolean>;
1922
+ protected readonly separatorKeys: _angular_core.Signal<string[]>;
1923
+ protected readonly describedBy: _angular_core.Signal<string>;
1924
+ protected labelOf(item: UniTagItem | UniTagSuggestion): string;
1925
+ /** Split pasted text into candidate tokens. */
1926
+ private parseRaw;
1927
+ private isValid;
1928
+ /**
1929
+ * Turn typed text into a chip. Invalid entries are kept and flagged rather
1930
+ * than dropped; duplicates and over-max are refused with a reason.
1931
+ */
1932
+ protected commit(raw: string): boolean;
1933
+ private reject;
1934
+ protected removeAt(index: number, focus?: 'left' | 'right' | 'input'): void;
1935
+ private countNoun;
1936
+ protected focusInput(): void;
1937
+ private focusChip;
1938
+ protected onInputKeydown(event: KeyboardEvent): void;
1939
+ protected onInput(value: string): void;
1940
+ protected onPaste(event: ClipboardEvent): void;
1941
+ protected onBlur(): void;
1942
+ protected onFocusOut(event: FocusEvent): void;
1943
+ protected onChipKeydown(event: KeyboardEvent, index: number): void;
1944
+ /** Lift a chip back into the input for correction. */
1945
+ protected editChip(index: number): void;
1946
+ protected selectSuggestion(suggestion: UniTagSuggestion): void;
1947
+ private commitDraft;
1948
+ private setDraft;
1949
+ /** The host is the popup's anchor — the box the list mirrors the width of,
1950
+ and the one its entry animation is measured against. The wrapper below
1951
+ has the same geometry but is only the fallback's positioning context. */
1952
+ protected readonly className: _angular_core.Signal<string>;
1953
+ protected readonly wrapperClass: _angular_core.Signal<string>;
1954
+ protected readonly fieldClass: _angular_core.Signal<string>;
1955
+ protected readonly inputClass: _angular_core.Signal<string>;
1956
+ protected readonly listClass: _angular_core.Signal<string>;
1957
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniTagInputComponent, never>;
1958
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniTagInputComponent, "uni-tag-input", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": true; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "preset": { "alias": "preset"; "required": false; "isSignal": true; }; "separators": { "alias": "separators"; "required": false; "isSignal": true; }; "commitOnBlur": { "alias": "commitOnBlur"; "required": false; "isSignal": true; }; "allowDuplicates": { "alias": "allowDuplicates"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "validate": { "alias": "validate"; "required": false; "isSignal": true; }; "parse": { "alias": "parse"; "required": false; "isSignal": true; }; "tagVariant": { "alias": "tagVariant"; "required": false; "isSignal": true; }; "tagTone": { "alias": "tagTone"; "required": false; "isSignal": true; }; "tagSize": { "alias": "tagSize"; "required": false; "isSignal": true; }; "suggestions": { "alias": "suggestions"; "required": false; "isSignal": true; }; "debounceTime": { "alias": "debounceTime"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; "query": "query"; "added": "added"; "removed": "removed"; "rejected": "rejected"; }, never, never, true, never>;
1959
+ }
1960
+
1961
+ /**
1962
+ * The typography primitive, applied as an attribute to any element so
1963
+ * semantics stay yours. The attribute value is the typeface:
1964
+ * `<h1 uni-text="display-small">`, `<span uni-text="caption">`, dynamic via
1965
+ * `[uni-text]="role()"`. With no value, the typeface is inferred from the
1966
+ * host element (h1 → headline-large, p → body-1-long, …), falling back to
1967
+ * `title-small`; the `typeface` input remains as an explicit override.
1968
+ *
1969
+ * It is a directive, so it stacks with anything else on the element — a layout
1970
+ * attribute (`<div stack-layout uni-text="title-small">`) or a component's own
1971
+ * host — rather than colliding with it.
1972
+ */
1973
+ declare class UniTextDirective {
1974
+ theme: ThemeService;
1975
+ private readonly tag;
1976
+ /** Typeface via the selector attribute: `uni-text="headline-large"`. */
1977
+ readonly uniText: _angular_core.InputSignal<string>;
1978
+ /** Explicit typeface; the attribute value wins when both are set. */
1979
+ typeface: _angular_core.InputSignal<string>;
1980
+ /** The ink, mapping straight to the CSS `color` property. */
1981
+ color: _angular_core.InputSignal<string>;
1982
+ display: _angular_core.InputSignal<OptionalDisplay>;
1983
+ align: _angular_core.InputSignal<OptionalTextAlign>;
1984
+ nowrap: _angular_core.InputSignal<boolean>;
1985
+ maxWidth: _angular_core.InputSignal<number>;
1986
+ ellipsis: _angular_core.InputSignal<boolean>;
1987
+ protected readonly resolvedTypeface: _angular_core.Signal<string>;
1988
+ protected readonly className: _angular_core.Signal<string>;
1989
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniTextDirective, never>;
1990
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<UniTextDirective, "[uni-text]", never, { "uniText": { "alias": "uni-text"; "required": false; "isSignal": true; }; "typeface": { "alias": "typeface"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "display": { "alias": "display"; "required": false; "isSignal": true; }; "align": { "alias": "align"; "required": false; "isSignal": true; }; "nowrap": { "alias": "nowrap"; "required": false; "isSignal": true; }; "maxWidth": { "alias": "maxWidth"; "required": false; "isSignal": true; }; "ellipsis": { "alias": "ellipsis"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1991
+ }
1992
+
1993
+ declare class UniTextareaComponent implements FormValueControl<string> {
1994
+ private theme;
1995
+ readonly value: _angular_core.ModelSignal<string>;
1996
+ readonly disabled: _angular_core.InputSignal<boolean>;
1997
+ readonly touched: _angular_core.ModelSignal<boolean>;
1998
+ readonly invalid: _angular_core.InputSignal<boolean>;
1999
+ readonly dirty: _angular_core.InputSignal<boolean>;
2000
+ /** Synced from required() validators by the Signal Forms [field] directive. */
2001
+ readonly required: _angular_core.InputSignal<boolean>;
2002
+ /**
2003
+ * Id(s) of external element(s) describing this control — typically your
2004
+ * app-rendered error message — exposed as aria-describedby.
2005
+ */
2006
+ readonly ariaDescribedBy: _angular_core.InputSignal<string>;
2007
+ label: _angular_core.InputSignal<string>;
2008
+ placeholder: _angular_core.InputSignal<string>;
2009
+ /** Visible text rows. Defaults to the theme's `textarea` options. */
2010
+ rows: _angular_core.InputSignal<number>;
2011
+ readonly readonly: _angular_core.InputSignal<boolean>;
2012
+ readonly name: _angular_core.InputSignal<string>;
2013
+ readonly minLength: _angular_core.InputSignal<number>;
2014
+ readonly maxLength: _angular_core.InputSignal<number>;
2015
+ autocomplete: _angular_core.InputSignal<string>;
2016
+ spellcheck: _angular_core.InputSignal<boolean>;
2017
+ width: _angular_core.InputSignal<string | number>;
2018
+ fullWidth: _angular_core.InputSignal<boolean>;
2019
+ grow: _angular_core.InputSignal<number>;
2020
+ private options;
2021
+ protected readonly resolvedRows: _angular_core.Signal<number>;
2022
+ protected readonly showError: _angular_core.Signal<boolean>;
2023
+ protected readonly textareaClass: _angular_core.Signal<string>;
2024
+ markAsTouched(): void;
2025
+ handleInput(event: Event): void;
2026
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniTextareaComponent, never>;
2027
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniTextareaComponent, "uni-textarea", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": true; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "minLength": { "alias": "minLength"; "required": false; "isSignal": true; }; "maxLength": { "alias": "maxLength"; "required": false; "isSignal": true; }; "autocomplete": { "alias": "autocomplete"; "required": false; "isSignal": true; }; "spellcheck": { "alias": "spellcheck"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "fullWidth": { "alias": "fullWidth"; "required": false; "isSignal": true; }; "grow": { "alias": "grow"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; }, never, never, true, never>;
2028
+ }
2029
+
2030
+ /** Why typed text did not become a time. The raw text stays in the field. */
2031
+ interface UniTimeInputRejection {
2032
+ raw: string;
2033
+ reason: 'unparseable' | 'out-of-range' | 'unavailable';
2034
+ }
2035
+ /**
2036
+ * Theme options for the `timeInput` entry. Field chrome is not duplicated
2037
+ * here — it comes from `input` via uni-input-box; the list trio matches
2038
+ * tagInput/searchInput.
2039
+ */
2040
+ interface UniTimeInputOptions {
2041
+ toggleSymbol?: string;
2042
+ listColor?: ContainerColorToken;
2043
+ listShadow?: Shadow;
2044
+ listBorderRadius?: Radius;
2045
+ /** Active/hover option fill; the on-color pair is derived. Must contrast
2046
+ with `listColor` or keyboard navigation turns invisible. */
2047
+ activeColor?: ContainerColorToken;
2048
+ maxVisibleOptions?: number; /** Named motion primitive for the suggestion popup's open animation.
2049
+ Defaults to `popup` — the token `uni-dropdown` uses. */
2050
+ motion?: Motion;
2051
+ }
2052
+
2053
+ /**
2054
+ * Time field: a combobox over time options — the same listbox contract as
2055
+ * uni-search-input and uni-tag-input. Type `3p`, `930` or `15:00`, or pick
2056
+ * `3:00 PM` from the list; the form always gets 24-hour `'HH:mm'` (`hour12`
2057
+ * affects display only). The list is assistive, not exhaustive: any
2058
+ * parseable time commits, unless `slots` pins the choices (a slot picker) —
2059
+ * then a typed time must match one. Unreadable or unavailable text stays in
2060
+ * the field, flagged, with a `rejected` event.
2061
+ */
2062
+ declare class UniTimeInputComponent extends BaseComponent<UniTimeInputOptions> implements FormValueControl<UniTime | undefined> {
2063
+ readonly value: _angular_core.ModelSignal<string>;
2064
+ readonly disabled: _angular_core.InputSignal<boolean>;
2065
+ readonly touched: _angular_core.ModelSignal<boolean>;
2066
+ readonly invalid: _angular_core.InputSignal<boolean>;
2067
+ readonly dirty: _angular_core.InputSignal<boolean>;
2068
+ readonly required: _angular_core.InputSignal<boolean>;
2069
+ readonly ariaDescribedBy: _angular_core.InputSignal<string>;
2070
+ /** Accessible name for the field, e.g. "Start time". */
2071
+ label: _angular_core.InputSignal<string>;
2072
+ placeholder: _angular_core.InputSignal<string>;
2073
+ /** Generated list granularity, in minutes. */
2074
+ minuteStep: _angular_core.InputSignal<number>;
2075
+ /** Earliest allowed time (inclusive), `'09:00'`. */
2076
+ minTime: _angular_core.InputSignal<string>;
2077
+ /** Latest allowed time (inclusive), `'17:00'`. */
2078
+ maxTime: _angular_core.InputSignal<string>;
2079
+ /** Exact allowed times (scheduling). When set, typed entry must match one. */
2080
+ slots: _angular_core.InputSignal<string[]>;
2081
+ /** 12-hour display; defaults from the locale. The value stays 24-hour. */
2082
+ hour12: _angular_core.InputSignal<boolean>;
2083
+ /** BCP 47 tag for the display format; defaults to the document language. */
2084
+ locale: _angular_core.InputSignal<string>;
2085
+ commitOnBlur: _angular_core.InputSignal<boolean>;
2086
+ /** Renders without its own input-box chrome, for composers like uni-date-time-input. */
2087
+ embedded: _angular_core.InputSignal<boolean>;
2088
+ /** A typed commit was refused; the raw text stays in the field. */
2089
+ rejected: _angular_core.OutputEmitterRef<UniTimeInputRejection>;
2090
+ private readonly host;
2091
+ private readonly inputRef;
2092
+ private readonly listRef;
2093
+ /** Ties the popup to the field so the browser tracks it in the top layer. */
2094
+ private readonly anchor;
2095
+ /** `manual` where the top layer is usable, else null — see the popup helper. */
2096
+ protected readonly popupAttr: "manual";
2097
+ constructor();
2098
+ protected readonly srOnly: string;
2099
+ /** A refused commit — styles the field and sets aria-invalid until edited. */
2100
+ protected readonly draftInvalid: _angular_core.WritableSignal<boolean>;
2101
+ /** Commits, clears and refusals are otherwise silent to a screen reader. */
2102
+ protected readonly announcer: _uni_design_system_uni_angular.Announcer;
2103
+ protected readonly resolvedLocale: _angular_core.Signal<string>;
2104
+ protected readonly resolvedHour12: _angular_core.Signal<boolean>;
2105
+ /** The listed times: pinned `slots` verbatim, else the generated step grid. */
2106
+ protected readonly options: _angular_core.Signal<string[]>;
2107
+ protected readonly optionLabels: _angular_core.Signal<string[]>;
2108
+ /** Shared combobox bookkeeping — identical contract to uni-search-input. */
2109
+ protected readonly list: _uni_design_system_uni_angular.ListboxNavigation;
2110
+ protected readonly displayText: _angular_core.Signal<string>;
2111
+ protected readonly resolvedPlaceholder: _angular_core.Signal<string>;
2112
+ protected readonly showError: _angular_core.Signal<boolean>;
2113
+ protected formatValue(time: UniTime): string;
2114
+ protected setValue(time: UniTime | undefined, silent?: boolean): void;
2115
+ private refuse;
2116
+ protected commit(raw: string): boolean;
2117
+ /** Step a committed value ±minuteStep (±1 slot when pinned), clamped. */
2118
+ private stepValue;
2119
+ protected onInputKeydown(event: KeyboardEvent): void;
2120
+ protected onInput(): void;
2121
+ protected onToggle(): void;
2122
+ protected selectOption(time: UniTime): void;
2123
+ protected onFocusOut(event: FocusEvent): void;
2124
+ private openList;
2125
+ private scrollToActive;
2126
+ private scrollToIndex;
2127
+ private setFieldText;
2128
+ protected readonly className: _angular_core.Signal<string>;
2129
+ protected readonly rowClass: _angular_core.Signal<string>;
2130
+ protected readonly inputClass: _angular_core.Signal<string>;
2131
+ protected readonly toggleWrapClass: _angular_core.Signal<string>;
2132
+ /** Embedded mode: the composer owns the box; keep only the flex row. */
2133
+ protected readonly embeddedClass: _angular_core.Signal<string>;
2134
+ protected readonly listClass: _angular_core.Signal<string>;
2135
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniTimeInputComponent, never>;
2136
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniTimeInputComponent, "uni-time-input, TimeInput", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": true; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "minuteStep": { "alias": "minuteStep"; "required": false; "isSignal": true; }; "minTime": { "alias": "minTime"; "required": false; "isSignal": true; }; "maxTime": { "alias": "maxTime"; "required": false; "isSignal": true; }; "slots": { "alias": "slots"; "required": false; "isSignal": true; }; "hour12": { "alias": "hour12"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "commitOnBlur": { "alias": "commitOnBlur"; "required": false; "isSignal": true; }; "embedded": { "alias": "embedded"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; "rejected": "rejected"; }, never, never, true, never>;
2137
+ }
2138
+
2139
+ interface UniToggleOptions {
2140
+ /**
2141
+ * The size of the toggle switch
2142
+ */
2143
+ size?: number;
2144
+ /** Off-state track color token. */
2145
+ trackColor?: ColorKey;
2146
+ /** Knob color token. */
2147
+ knobColor?: ColorKey;
2148
+ }
2149
+
2150
+ declare class UniToggleComponent extends BaseComponent<UniToggleOptions> implements FormCheckboxControl {
2151
+ readonly checked: _angular_core.ModelSignal<boolean>;
2152
+ readonly disabled: _angular_core.InputSignal<boolean>;
2153
+ readonly touched: _angular_core.ModelSignal<boolean>;
2154
+ readonly invalid: _angular_core.InputSignal<boolean>;
2155
+ readonly dirty: _angular_core.InputSignal<boolean>;
2156
+ /** Synced from required() validators by the Signal Forms [field] directive. */
2157
+ readonly required: _angular_core.InputSignal<boolean>;
2158
+ /**
2159
+ * Id(s) of external element(s) describing this control — typically your
2160
+ * app-rendered error message — exposed as aria-describedby.
2161
+ */
2162
+ readonly ariaDescribedBy: _angular_core.InputSignal<string>;
2163
+ readonly label: _angular_core.InputSignal<string>;
2164
+ protected readonly showError: _angular_core.Signal<boolean>;
2165
+ markAsTouched(): void;
2166
+ handleChange(event: Event): void;
2167
+ private readonly metrics;
2168
+ protected readonly toggleLabel: _angular_core.Signal<string>;
2169
+ protected readonly toggleInput: _angular_core.Signal<string>;
2170
+ getThemeColor(token: ColorToken): string;
2171
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniToggleComponent, never>;
2172
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniToggleComponent, "uni-toggle", never, { "checked": { "alias": "checked"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, { "checked": "checkedChange"; "touched": "touchedChange"; }, never, never, true, never>;
2173
+ }
2174
+
2175
+ /**
2176
+ * Every layout and typography attribute directive, for
2177
+ * `imports: [...UNI_LAYOUT]`.
2178
+ *
2179
+ * These are attribute selectors, so an element carrying one that was never
2180
+ * imported compiles cleanly and silently does nothing. Spreading the family is
2181
+ * the cheapest way not to hit that.
2182
+ */
2183
+ declare const UNI_LAYOUT: readonly [typeof UniBoxDirective, typeof UniRowDirective, typeof UniStackDirective, typeof UniCenterDirective, typeof UniWrapDirective, typeof UniGridDirective, typeof UniGridAreaDirective, typeof UniTextDirective];
2184
+ /** Every form control, for `imports: [...UNI_FORMS]`. */
2185
+ declare const UNI_FORMS: readonly [typeof UniInputComponent, typeof UniInputBoxComponent, typeof UniTextareaComponent, typeof UniSelectComponent, typeof UniCheckboxComponent, typeof UniRadioComponent, typeof UniToggleComponent, typeof UniComboboxComponent, typeof UniMultiSelectComponent, typeof UniMultiSelectDropdownComponent, typeof UniSearchInputComponent, typeof UniTagInputComponent, typeof UniSliderComponent, typeof UniDateInputComponent, typeof UniTimeInputComponent, typeof UniDateTimeInputComponent];
2186
+
2187
+ /** Theme-level options for `uni-app-bar`, resolved by token name. */
2188
+ interface UniAppBarOptions {
2189
+ /** Bar surface color token (with its paired on-color). */
2190
+ color?: ContainerColorToken;
2191
+ /** Bar height in px. */
2192
+ height?: number;
2193
+ /** Rule under the bar, as a border primitive token. */
2194
+ divider?: Border;
2195
+ /** Title typography token. */
2196
+ typeface?: Typeface;
2197
+ /** Horizontal padding, as a spacing token. */
2198
+ padding?: OptionalSize;
2199
+ /** Space between bar children, as a spacing token. */
2200
+ gap?: OptionalSize;
2201
+ /** Optional elevation shadow token (e.g. 'raised'). */
2202
+ elevation?: Elevation;
2203
+ }
2204
+
2205
+ /**
2206
+ * Horizontal application bar: project leading controls (menu button, logo)
2207
+ * with the `leading` attribute, actions with `trailing` (pushed to the far
2208
+ * edge), and either pass `title` or project custom center content. Surface,
2209
+ * divider, height, typography and spacing all resolve from `appBar` tokens.
2210
+ * Place it inside your page's `<header>` landmark.
2211
+ */
2212
+ declare class UniAppBarComponent extends BaseComponent<UniAppBarOptions> {
2213
+ /** Bar title; alternatively project your own center content. */
2214
+ title: _angular_core.InputSignal<string>;
2215
+ /** Stick the bar to the top of its scroll container. */
2216
+ sticky: _angular_core.InputSignal<boolean>;
2217
+ protected readonly className: _angular_core.Signal<string>;
2218
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniAppBarComponent, never>;
2219
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniAppBarComponent, "uni-app-bar", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "sticky": { "alias": "sticky"; "required": false; "isSignal": true; }; }, {}, never, ["[leading]", "*", "[trailing]"], true, never>;
2220
+ }
2221
+
2222
+ /** Theme-level options for `uni-avatar`, resolved by token name. */
2223
+ interface UniAvatarOptions {
2224
+ /** Corner radius token — `max` renders circles; `sharp` themes get squares. */
2225
+ borderRadius?: Radius;
2226
+ /** Typeface token for the initials. */
2227
+ typeface?: Typeface;
2228
+ /** Symbol shown when there is no image and no name to take initials from. */
2229
+ fallbackSymbol?: string;
2230
+ }
2231
+ /** Theme-level options for `uni-avatar-group`. */
2232
+ interface UniAvatarGroupOptions {
2233
+ /** How far stacked avatars overlap, as a spacing token. */
2234
+ overlap?: OptionalSize;
2235
+ /** Ring color separating stacked avatars from each other. */
2236
+ ringColor?: ColorKey;
2237
+ /** Ring width in px. */
2238
+ ringWidth?: number;
2239
+ }
2240
+
2241
+ /**
2242
+ * Identity avatar with a graceful fallback chain: image → initials from
2243
+ * `name` → themed symbol. Coloring, radius, typeface and sizes all resolve
2244
+ * from `avatar` theme tokens; `variant` picks the container palette.
2245
+ */
2246
+ declare class UniAvatarComponent extends BaseComponent<UniAvatarOptions> {
2247
+ /** Image URL; on load error the avatar falls back to initials/symbol. */
2248
+ src: _angular_core.InputSignal<string>;
2249
+ /** Person's name: drives the initials and the accessible label. */
2250
+ name: _angular_core.InputSignal<string>;
2251
+ /** Verbatim text instead of derived initials (e.g. a group's “+3”). */
2252
+ text: _angular_core.InputSignal<string>;
2253
+ protected readonly imageFailed: _angular_core.WritableSignal<boolean>;
2254
+ protected readonly showImage: _angular_core.Signal<boolean>;
2255
+ protected readonly initials: _angular_core.Signal<string>;
2256
+ protected readonly label: _angular_core.Signal<string>;
2257
+ protected readonly className: _angular_core.Signal<string>;
2258
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniAvatarComponent, never>;
2259
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniAvatarComponent, "uni-avatar", never, { "src": { "alias": "src"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "text": { "alias": "text"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
2260
+ }
2261
+
2262
+ /**
2263
+ * Overlapping stack of avatars. `max` collapses the overflow into a themed
2264
+ * “+N” chip (itself a `uni-avatar`). Overlap and separator ring resolve from
2265
+ * `avatarGroup` theme tokens.
2266
+ */
2267
+ declare class UniAvatarGroupComponent extends BaseComponent<UniAvatarGroupOptions> {
2268
+ /** Show at most this many avatars; the rest collapse into a “+N” chip. */
2269
+ max: _angular_core.InputSignal<number>;
2270
+ private readonly avatars;
2271
+ protected readonly surplus: _angular_core.Signal<number>;
2272
+ protected readonly className: _angular_core.Signal<string>;
2273
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniAvatarGroupComponent, never>;
2274
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniAvatarGroupComponent, "uni-avatar-group", never, { "max": { "alias": "max"; "required": false; "isSignal": true; }; }, {}, ["avatars"], ["*"], true, never>;
2275
+ }
2276
+
2277
+ type ImagePosition = 'top' | 'bottom' | 'left' | 'right' | 'center' | string;
2278
+ declare class UniBackgroundComponent {
2279
+ theme: ThemeService;
2280
+ image: _angular_core.InputSignal<string>;
2281
+ imagePosition: _angular_core.InputSignal<string>;
2282
+ imageSize: _angular_core.InputSignal<string | number>;
2283
+ height: _angular_core.InputSignal<string | number>;
2284
+ width: _angular_core.InputSignal<string | number>;
2285
+ protected readonly className: _angular_core.Signal<string>;
2286
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniBackgroundComponent, never>;
2287
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniBackgroundComponent, "uni-background", never, { "image": { "alias": "image"; "required": false; "isSignal": true; }; "imagePosition": { "alias": "imagePosition"; "required": false; "isSignal": true; }; "imageSize": { "alias": "imageSize"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
2288
+ }
2289
+
2290
+ interface UniBadgeOptions {
2291
+ borderRadius?: RadiiSize;
2292
+ }
2293
+
2294
+ declare class UniBadgeComponent extends BaseComponent<UniBadgeOptions> {
2295
+ color: _angular_core.InputSignal<Variant>;
2296
+ useVariant: _angular_core.InputSignal<boolean>;
2297
+ width: _angular_core.InputSignal<number>;
2298
+ protected readonly className: _angular_core.Signal<string>;
2299
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniBadgeComponent, never>;
2300
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniBadgeComponent, "[uni-badge]", never, { "color": { "alias": "color"; "required": false; "isSignal": true; }; "useVariant": { "alias": "useVariant"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
2301
+ }
2302
+
2303
+ /** One step in the trail. The last item is treated as the current page. */
2304
+ interface BreadcrumbItem {
2305
+ label: string;
2306
+ /** Link target. Omit for SPA routing and handle `itemClicked` instead. */
2307
+ href?: string;
2308
+ }
2309
+ /** Theme-level options for `uni-breadcrumb`, resolved by token name. */
2310
+ interface UniBreadcrumbOptions {
2311
+ /** Trail typography token. */
2312
+ typeface?: Typeface;
2313
+ /** Link color for ancestor items. */
2314
+ color?: ColorKey;
2315
+ /** Color of the current (last) item. */
2316
+ currentColor?: ColorKey;
2317
+ /** Material symbol drawn between items. */
2318
+ separatorSymbol?: string;
2319
+ /** Space around separators, as a spacing token. */
2320
+ gap?: OptionalSize;
2321
+ }
2322
+
2323
+ /**
2324
+ * WAI-ARIA breadcrumb: a `nav` landmark wrapping an ordered list; the last
2325
+ * item is the current page (`aria-current="page"`), separators are decorative.
2326
+ * Items with `href` render as real links; without one they render as
2327
+ * link-styled buttons emitting `itemClicked` — wire that to your router.
2328
+ */
2329
+ declare class UniBreadcrumbComponent extends BaseComponent<UniBreadcrumbOptions> {
2330
+ /** The trail, root first; the last item is the current page. */
2331
+ items: _angular_core.InputSignal<BreadcrumbItem[]>;
2332
+ /** Landmark label distinguishing this nav from others on the page. */
2333
+ ariaLabel: _angular_core.InputSignal<string>;
2334
+ /** Emits the clicked ancestor item (also fires for `href` links). */
2335
+ itemClicked: _angular_core.OutputEmitterRef<BreadcrumbItem>;
2336
+ protected readonly className: _angular_core.Signal<string>;
2337
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniBreadcrumbComponent, never>;
2338
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniBreadcrumbComponent, "uni-breadcrumb", never, { "items": { "alias": "items"; "required": true; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "itemClicked": "itemClicked"; }, never, never, true, never>;
2339
+ }
2340
+
2341
+ /** Theme-level options for `uni-text-button`, resolved by token name. */
2342
+ interface UniButtonOptions {
2343
+ /**
2344
+ * Corner radius as a radii token. The default theme uses `max` (pill);
2345
+ * because this is a token, the theme's radii scale — including generated
2346
+ * shape languages (`sharp`/`modern`/`playful`) and custom primitives —
2347
+ * restyles every button without touching component code.
2348
+ */
2349
+ borderRadius?: RadiiSize;
2350
+ /**
2351
+ * Label typography as a typeface token. Defaults to the type scale's
2352
+ * `button` role (family/weight/transform); per-size `fontSize` overrides
2353
+ * from the theme's `sizes` still apply on top. Point it at any typeface —
2354
+ * including custom primitives added to the theme's typography.
2355
+ */
2356
+ typeface?: Typeface;
2357
+ }
2358
+
2359
+ declare class RippleDirective {
2360
+ private renderer;
2361
+ el: ElementRef<any>;
2362
+ hostEl: any;
2363
+ constructor();
2364
+ onClick(e: MouseEvent): void;
2365
+ rippleClass: string;
2366
+ animateClass: string;
2367
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<RippleDirective, never>;
2368
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RippleDirective, "[uniRipple]", never, {}, {}, never, never, true, never>;
2369
+ }
2370
+
2371
+ declare class UniButtonComponent extends BaseComponent<UniButtonOptions> {
2372
+ readonly disable: _angular_core.InputSignal<boolean>;
2373
+ readonly loading: _angular_core.InputSignal<boolean>;
2374
+ readonly fullWidth: _angular_core.InputSignal<boolean>;
2375
+ readonly symbolLeft: _angular_core.InputSignal<string>;
2376
+ readonly symbolRight: _angular_core.InputSignal<string>;
2377
+ spinnerBox: string;
2378
+ protected readonly className: _angular_core.Signal<string>;
2379
+ symbolSize: _angular_core.Signal<number>;
2380
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniButtonComponent, never>;
2381
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniButtonComponent, "button[uni-text-button], button[text-button]", never, { "disable": { "alias": "disable"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "fullWidth": { "alias": "fullWidth"; "required": false; "isSignal": true; }; "symbolLeft": { "alias": "symbolLeft"; "required": false; "isSignal": true; }; "symbolRight": { "alias": "symbolRight"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, [{ directive: typeof RippleDirective; inputs: {}; outputs: {}; }]>;
2382
+ }
2383
+
2384
+ declare class UniButtonGroupComponent {
2385
+ private themeService;
2386
+ protected readonly className: _angular_core.Signal<string>;
2387
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniButtonGroupComponent, never>;
2388
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniButtonGroupComponent, "uni-button-group", never, {}, {}, never, ["*"], true, never>;
2389
+ }
2390
+
2391
+ interface ButtonGroupConfig {
2392
+ tooltipPlacement?: Placement;
2393
+ buttonSize: Size;
2394
+ buttons: ButtonGroupItem[];
2395
+ }
2396
+ interface ButtonGroupItem {
2397
+ symbolName: string;
2398
+ selected?: boolean;
2399
+ tooltip?: string;
2400
+ action?: (selectedState?: boolean) => boolean | void;
2401
+ toggle?: WritableSignal<boolean>;
2402
+ }
2403
+
2404
+ /** One rendered day cell — precomputed so the template stays declarative. */
2405
+ interface CalendarCell {
2406
+ date: UniDate;
2407
+ day: number;
2408
+ outside: boolean;
2409
+ disabled: boolean;
2410
+ today: boolean;
2411
+ selected: boolean;
2412
+ inBand: boolean;
2413
+ tabIndex: number;
2414
+ ariaLabel: string;
2415
+ markers: UniCalendarMarker[];
2416
+ cellClass: string;
2417
+ dayClass: string;
2418
+ }
2419
+ /**
2420
+ * Inline month calendar: single-date or start–end range selection, day
2421
+ * markers (availability dots), min/max fences and disabled dates. One tab
2422
+ * stop with a roving-tabindex `role="grid"`; every day is a real button
2423
+ * named with its full date. Values are plain ISO strings (`'YYYY-MM-DD'`),
2424
+ * never `Date` objects, so bindings are timezone-free and serializable.
2425
+ * Selection and today colours come from the theme's `primary` role pair;
2426
+ * geometry and glyphs come from the `calendar` theme entry.
2427
+ */
2428
+ declare class UniCalendarComponent extends BaseComponent<UniCalendarOptions> implements FormValueControl<UniCalendarValue> {
2429
+ readonly value: _angular_core.ModelSignal<UniCalendarValue>;
2430
+ readonly disabled: _angular_core.InputSignal<boolean>;
2431
+ readonly touched: _angular_core.ModelSignal<boolean>;
2432
+ readonly invalid: _angular_core.InputSignal<boolean>;
2433
+ readonly dirty: _angular_core.InputSignal<boolean>;
2434
+ readonly required: _angular_core.InputSignal<boolean>;
2435
+ readonly ariaDescribedBy: _angular_core.InputSignal<string>;
2436
+ /** `'single'` reads/writes a `UniDate`; `'range'` a `UniDateRange`. */
2437
+ mode: _angular_core.InputSignal<UniCalendarMode>;
2438
+ /** Shown month, `'YYYY-MM'` — two-way, so an app can drive "jump to June". */
2439
+ month: _angular_core.ModelSignal<string>;
2440
+ /** Earliest selectable date (inclusive). */
2441
+ minDate: _angular_core.InputSignal<string>;
2442
+ /** Latest selectable date (inclusive). */
2443
+ maxDate: _angular_core.InputSignal<string>;
2444
+ /** Blocked days: a list of dates, or a predicate. */
2445
+ disabledDates: _angular_core.InputSignal<string[] | ((date: UniDate) => boolean)>;
2446
+ /** Availability dots; `label` extends the day's accessible name. */
2447
+ markers: _angular_core.InputSignal<UniCalendarMarker[]>;
2448
+ /** BCP 47 tag; defaults to the document language, then the browser's. */
2449
+ locale: _angular_core.InputSignal<string>;
2450
+ /** First day of week, 0 = Sunday; defaults from the locale's week info. */
2451
+ weekStart: _angular_core.InputSignal<0 | 1 | 2 | 3 | 4 | 6 | 5>;
2452
+ /** Names the grid when it stands alone (otherwise the heading names it). */
2453
+ ariaLabel: _angular_core.InputSignal<string>;
2454
+ /** Day geometry token; `sm`/`md`/`lg` map to the theme's `calendar` sizes. */
2455
+ size: _angular_core.InputSignal<Size>;
2456
+ /** Each committed day, including both ends of a range. */
2457
+ selected: _angular_core.OutputEmitterRef<string>;
2458
+ private readonly host;
2459
+ protected readonly headingId: string;
2460
+ protected readonly srOnly: string;
2461
+ /** Pending range start — set by the first commit, cleared by the second. */
2462
+ protected readonly pendingStart: _angular_core.WritableSignal<string>;
2463
+ /** Hover/focus candidate painting the preview band while a range is pending. */
2464
+ protected readonly previewDate: _angular_core.WritableSignal<string>;
2465
+ /** Live-region text; selections are otherwise silent for a screen reader. */
2466
+ /** Commits, clears and refusals are otherwise silent to a screen reader. */
2467
+ protected readonly announcer: _uni_design_system_uni_angular.Announcer;
2468
+ protected readonly resolvedLocale: _angular_core.Signal<string>;
2469
+ protected readonly resolvedWeekStart: _angular_core.Signal<number>;
2470
+ /**
2471
+ * The month on screen: the `month` model, else the value's month, else
2472
+ * today's. Falsy guards on purpose: `''` — the only typeable empty for a
2473
+ * string-typed model — counts as unset, or it would reach the month math
2474
+ * and blow up the grid and heading.
2475
+ */
2476
+ protected readonly viewMonth: _angular_core.Signal<string>;
2477
+ private readonly anchorDate;
2478
+ /**
2479
+ * The roving-tabindex day. Re-derives when the view or value changes
2480
+ * (selected day in view → today in view → first enabled day); keyboard
2481
+ * navigation writes it directly.
2482
+ */
2483
+ protected readonly focusedDate: _angular_core.WritableSignal<string>;
2484
+ protected readonly showError: _angular_core.Signal<boolean>;
2485
+ protected readonly heading: _angular_core.Signal<string>;
2486
+ protected readonly weekdays: _angular_core.Signal<_uni_design_system_uni_angular.UniWeekdayName[]>;
2487
+ private readonly disabledDateSet;
2488
+ private readonly markersByDate;
2489
+ /** The committed range, or the pending preview band. */
2490
+ private readonly rangeBand;
2491
+ protected isDayDisabled(date: UniDate): boolean;
2492
+ private isSelected;
2493
+ /** The full render model: one precomputed cell per grid position. */
2494
+ protected readonly gridWeeks: _angular_core.Signal<CalendarCell[][]>;
1047
2495
  protected select(date: UniDate): void;
1048
2496
  private cancelPending;
1049
2497
  protected onNav(direction: 1 | -1): void;
@@ -1062,7 +2510,6 @@ declare class UniCalendarComponent extends BaseComponent<UniCalendarOptions> imp
1062
2510
  private focusDay;
1063
2511
  private pickFocus;
1064
2512
  private firstEnabledInView;
1065
- private announce;
1066
2513
  private readonly daySize;
1067
2514
  protected readonly className: _angular_core.Signal<string>;
1068
2515
  protected readonly navClass: _angular_core.Signal<string>;
@@ -1118,7 +2565,10 @@ interface UniCalloutOptions {
1118
2565
  spotlightRadius: Radius;
1119
2566
  /** Spotlight ring width, px. */
1120
2567
  ringWidth: number;
1121
- transitionMs: number;
2568
+ /**
2569
+ * Named motion primitive for the open/close fade. Defaults to `panel`.
2570
+ */
2571
+ motion?: Motion;
1122
2572
  }
1123
2573
 
1124
2574
  /**
@@ -1200,6 +2650,8 @@ declare class UniCalloutComponent extends BaseComponent<UniCalloutOptions> {
1200
2650
  /** A stray click shouldn't kill onboarding: nudge the panel instead. */
1201
2651
  protected onBackdropClick(): void;
1202
2652
  private readonly spotlight;
2653
+ /** Timing for the open/close fade and the teardown that follows it. */
2654
+ private readonly motion;
1203
2655
  protected readonly scrimClassName: _angular_core.Signal<string>;
1204
2656
  protected readonly windowClassName: _angular_core.Signal<string>;
1205
2657
  protected stripClassName(side: (typeof this.stripSides)[number]): string;
@@ -1219,226 +2671,43 @@ declare class UniCardContentComponent extends BaseComponent {
1219
2671
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniCardContentComponent, never>;
1220
2672
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniCardContentComponent, "uni-card-content", never, {}, {}, never, ["*"], true, never>;
1221
2673
  }
1222
-
1223
- declare class UniCardHeaderComponent extends BaseComponent {
1224
- private card;
1225
- title: _angular_core.InputSignal<string>;
1226
- titleTextRole: _angular_core.InputSignal<string>;
1227
- constructor();
1228
- className: string;
1229
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniCardHeaderComponent, never>;
1230
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniCardHeaderComponent, "uni-card-header", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "titleTextRole": { "alias": "titleTextRole"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
1231
- }
1232
-
1233
- /** Theme-level options for `uni-card`, resolved by token name. */
1234
- interface UniCardOptions {
1235
- defaultVariant?: Variant;
1236
- /** Corner radius as a radii token. The default theme uses `xs`. */
1237
- borderRadius?: Radius;
1238
- /**
1239
- * Frame as a border primitive token. When unset, the card follows its
1240
- * variant — `borders.primary`, `borders.warn`, … — so redefining a border
1241
- * primitive restyles every card (and every other component) sharing it.
1242
- */
1243
- border?: Border;
1244
- /** Optional elevation shadow token; cards are flat by default. */
1245
- elevation?: Elevation;
1246
- transitionSpeed?: number;
1247
- }
1248
-
1249
- declare class UniCardComponent extends BaseComponent<UniCardOptions> {
1250
- /**
1251
- * Token-resolved frame (variant-named border primitive, radii, elevation)
1252
- * under the merged theme style, so hand-authored fixed/variant styles from
1253
- * older themes keep winning.
1254
- */
1255
- protected readonly cardStyle: _angular_core.Signal<{
1256
- boxShadow: string;
1257
- }>;
1258
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniCardComponent, never>;
1259
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniCardComponent, "uni-card", never, {}, {}, never, ["*"], true, never>;
1260
- }
1261
-
1262
- interface UniCheckboxOptions {
1263
- size?: string | number;
1264
- borderRadius?: string | number;
1265
- /** Unchecked box background token. */
1266
- boxColor?: ColorKey;
1267
- focusRingGap?: string | number;
1268
- }
1269
-
1270
- declare class UniCheckboxComponent extends BaseComponent<UniCheckboxOptions> implements FormCheckboxControl {
1271
- readonly checked: _angular_core.ModelSignal<boolean>;
1272
- readonly disabled: _angular_core.InputSignal<boolean>;
1273
- readonly touched: _angular_core.ModelSignal<boolean>;
1274
- readonly invalid: _angular_core.InputSignal<boolean>;
1275
- readonly dirty: _angular_core.InputSignal<boolean>;
1276
- /** Synced from required() validators by the Signal Forms [field] directive. */
1277
- readonly required: _angular_core.InputSignal<boolean>;
1278
- /**
1279
- * Id(s) of external element(s) describing this control — typically your
1280
- * app-rendered error message — exposed as aria-describedby.
1281
- */
1282
- readonly ariaDescribedBy: _angular_core.InputSignal<string>;
1283
- readonly label: _angular_core.InputSignal<string>;
1284
- /**
1285
- * Mixed state for "select all"-style parent checkboxes. Cleared
1286
- * automatically on the next user interaction, matching native behavior.
1287
- */
1288
- readonly indeterminate: _angular_core.ModelSignal<boolean>;
1289
- protected readonly showError: _angular_core.Signal<boolean>;
1290
- markAsTouched(): void;
1291
- handleChange(event: Event): void;
1292
- protected readonly checkboxLabel: _angular_core.Signal<string>;
1293
- protected readonly checkboxInput: _angular_core.Signal<string>;
1294
- getThemeColor(token: ColorToken): string;
1295
- /** The content color paired with a variant fill (on-primary, on-warn, …). */
1296
- getOnColor(variant: ColorToken): string;
1297
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniCheckboxComponent, never>;
1298
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniCheckboxComponent, "uni-checkbox", never, { "checked": { "alias": "checked"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "indeterminate": { "alias": "indeterminate"; "required": false; "isSignal": true; }; }, { "checked": "checkedChange"; "touched": "touchedChange"; "indeterminate": "indeterminateChange"; }, never, never, true, never>;
1299
- }
1300
-
1301
- /** A commit was refused (no match); the field reverted to the committed label. */
1302
- interface UniComboboxRejection {
1303
- query: string;
1304
- }
1305
- /**
1306
- * Theme options for the `combobox` entry. Field chrome is not duplicated
1307
- * here — it comes from `input` via uni-input-box; the list trio matches
1308
- * tagInput/searchInput/timeInput. Glyphs are theme icon primitives rendered
1309
- * by `uni-icon`, so they restyle with the theme's iconography.
1310
- */
1311
- interface UniComboboxOptions {
1312
- toggleIcon?: IconName;
1313
- clearIcon?: IconName;
1314
- selectedIcon?: IconName;
1315
- listColor?: ContainerColorToken;
1316
- listShadow?: Shadow;
1317
- listBorderRadius?: Radius;
1318
- /** Active/hover option fill; the on-color pair is derived. Must contrast
1319
- with `listColor` or keyboard navigation turns invisible. */
1320
- activeColor?: ContainerColorToken;
1321
- /** Scroll height in rows — the list scrolls past this, never truncates. */
1322
- maxVisibleOptions?: number;
1323
- descriptionColor?: ContentColorToken;
1324
- }
1325
-
1326
- /**
1327
- * Form-bound, closed-set, single-select autocomplete: `FormValueControl<T | null>`
1328
- * over object `Options<T>`, type-to-filter, commit-on-select. Typing produces a
1329
- * draft — a filter, never a value; the value changes only when an option
1330
- * commits, `clear()` runs, or the model is written from outside. Select
1331
- * semantics, not search: a real label, a chevron, no magnifier, nothing
1332
- * submits. For short lists with no need to type, prefer `uni-select` — the
1333
- * value contract is identical, so swapping is a template-only change.
1334
- */
1335
- declare class UniComboboxComponent<T> extends BaseComponent<UniComboboxOptions> implements FormValueControl<T | null> {
1336
- readonly value: _angular_core.ModelSignal<T>;
1337
- readonly disabled: _angular_core.InputSignal<boolean>;
1338
- readonly touched: _angular_core.ModelSignal<boolean>;
1339
- readonly invalid: _angular_core.InputSignal<boolean>;
1340
- readonly dirty: _angular_core.InputSignal<boolean>;
1341
- readonly required: _angular_core.InputSignal<boolean>;
1342
- readonly ariaDescribedBy: _angular_core.InputSignal<string>;
1343
- /** Accessible name for the field, e.g. "State"; echoed on the listbox. */
1344
- label: _angular_core.InputSignal<string>;
1345
- placeholder: _angular_core.InputSignal<string>;
1346
- options: _angular_core.InputSignal<Options<T>>;
1347
- /**
1348
- * Equality used to match `value` against option values, called as
1349
- * `compareWith(optionValue, value)`. Defaults to reference equality, which
1350
- * never matches an object value rebuilt from elsewhere (e.g. a saved record
1351
- * against options from a fresh fetch) — pass a key comparison like
1352
- * `(a, b) => a?.id === b?.id` for object values.
1353
- */
1354
- compareWith: _angular_core.InputSignal<(optionValue: T, value: T) => boolean>;
1355
- width: _angular_core.InputSignal<string | number>;
1356
- /** Show a ✕ while a value is set; an emptied field on blur also clears. */
1357
- clearable: _angular_core.InputSignal<boolean>;
1358
- /** Blur commits an exact-match draft; a non-matching draft reverts. */
1359
- commitOnBlur: _angular_core.InputSignal<boolean>;
1360
- /** i18n-able empty row, also announced when a filter matches nothing. */
1361
- emptyText: _angular_core.InputSignal<string>;
1362
- /** `false` renders `options` verbatim; narrow them app-side from `query`. */
1363
- filterLocally: _angular_core.InputSignal<boolean>;
1364
- /** Filter predicate; default is locale-lowercased label-contains. */
1365
- filterWith: _angular_core.InputSignal<(option: Option<T>, query: string) => boolean>;
1366
- debounceTime: _angular_core.InputSignal<number>;
1367
- /** Debounced draft text, for async option lists. */
1368
- query: _angular_core.OutputEmitterRef<string>;
1369
- /** An option committed. */
1370
- selected: _angular_core.OutputEmitterRef<Option<T>>;
1371
- cleared: _angular_core.OutputEmitterRef<void>;
1372
- /** A commit was refused (no match); the field reverted. */
1373
- rejected: _angular_core.OutputEmitterRef<UniComboboxRejection>;
1374
- private readonly host;
1375
- private readonly inputRef;
1376
- private readonly listRef;
1377
- /** Cancelled on destroy — a late tick would emit on a destroyed OutputRef. */
1378
- private queryTimer?;
2674
+
2675
+ declare class UniCardHeaderComponent extends BaseComponent {
2676
+ private card;
2677
+ title: _angular_core.InputSignal<string>;
2678
+ titleTextRole: _angular_core.InputSignal<string>;
1379
2679
  constructor();
1380
- protected readonly srOnly: string;
1381
- protected readonly announcement: _angular_core.WritableSignal<string>;
1382
- /** null the field shows the committed label; a string is an uncommitted draft. */
1383
- protected readonly draft: _angular_core.WritableSignal<string>;
2680
+ className: string;
2681
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniCardHeaderComponent, never>;
2682
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniCardHeaderComponent, "uni-card-header", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "titleTextRole": { "alias": "titleTextRole"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
2683
+ }
2684
+
2685
+ /** Theme-level options for `uni-card`, resolved by token name. */
2686
+ interface UniCardOptions {
2687
+ defaultVariant?: Variant;
2688
+ /** Corner radius as a radii token. The default theme uses `xs`. */
2689
+ borderRadius?: Radius;
1384
2690
  /**
1385
- * Popup visibility. Component-owned rather than `list.open()` the shared
1386
- * signal gates on `count() > 0`, which would hide the "No matches" row and
1387
- * misreport `aria-expanded` over an empty filter.
2691
+ * Frame as a border primitive token. When unset, the card follows its
2692
+ * variant `borders.primary`, `borders.warn`, so redefining a border
2693
+ * primitive restyles every card (and every other component) sharing it.
1388
2694
  */
1389
- protected readonly popupOpen: _angular_core.WritableSignal<boolean>;
1390
- /** Index in options() of the option matching value(), else -1. */
1391
- protected readonly committedIndex: _angular_core.Signal<number>;
1392
- /** A value with no matching option renders '' but is preserved — options may
1393
- still be loading; the field self-heals when they arrive. */
1394
- protected readonly committedLabel: _angular_core.Signal<string>;
1395
- protected readonly displayValue: _angular_core.Signal<string>;
1396
- /** Indices into options() surviving the filter. The draft filters; the
1397
- committed label does not — reopening always shows the full set. */
1398
- protected readonly filteredIndices: _angular_core.Signal<number[]>;
1399
- /** Shared combobox bookkeeping, in filtered-list positions — the fourth
1400
- consumer of the contract behind search-input, tag-input and time-input. */
1401
- protected readonly list: _uni_design_system_uni_angular.ListboxNavigation;
1402
- protected readonly showError: _angular_core.Signal<boolean>;
1403
- private commit;
1404
- protected clear(): void;
2695
+ border?: Border;
2696
+ /** Optional elevation shadow token; cards are flat by default. */
2697
+ elevation?: Elevation;
2698
+ }
2699
+
2700
+ declare class UniCardComponent extends BaseComponent<UniCardOptions> {
1405
2701
  /**
1406
- * Draft resolution, used by Enter, Tab and blur:
1407
- * 1. an active option in the list commit it;
1408
- * 2. else a unique exact label match (locale-case-insensitive) → commit it;
1409
- * 3. Enter only: the filter narrowed to exactly one enabled option → commit it
1410
- * (on Enter the user can see the single candidate; on blur they're gone,
1411
- * and committing a value they never saw confirmed is how forms grow
1412
- * mystery data);
1413
- * 4. else the caller keeps the list open (Enter) or reverts (Tab/blur).
2702
+ * Token-resolved frame (variant-named border primitive, radii, elevation)
2703
+ * under the merged theme style, so hand-authored fixed/variant styles from
2704
+ * older themes keep winning.
1414
2705
  */
1415
- private resolveDraft;
1416
- private revertDraft;
1417
- private reject;
1418
- protected onKeydown(event: KeyboardEvent): void;
1419
- protected onInput(): void;
1420
- /** Click-to-browse: pointer users get the select affordance. Focus alone
1421
- never opens — Tab-through forms must not spray popups. */
1422
- protected onFieldClick(): void;
1423
- protected onToggleMousedown(event: MouseEvent): void;
1424
- protected onOptionClick(optIndex: number): void;
1425
- protected onFocusOut(event: FocusEvent): void;
1426
- /** Filtered position of the committed option when visible and enabled, else -1. */
1427
- private committedFilteredPos;
1428
- private openList;
1429
- private closeList;
1430
- private scrollToActive;
1431
- private setFieldText;
1432
- private announce;
1433
- protected readonly className: _angular_core.Signal<string>;
1434
- protected readonly rowClass: _angular_core.Signal<string>;
1435
- protected readonly inputClass: _angular_core.Signal<string>;
1436
- /** Pointer-only affordance: keyboard already has ArrowDown, and the input
1437
- itself announces expanded state. */
1438
- protected readonly toggleClass: _angular_core.Signal<string>;
1439
- protected readonly listClass: _angular_core.Signal<string>;
1440
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniComboboxComponent<any>, never>;
1441
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniComboboxComponent<any>, "uni-combobox, Combobox", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": true; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "commitOnBlur": { "alias": "commitOnBlur"; "required": false; "isSignal": true; }; "emptyText": { "alias": "emptyText"; "required": false; "isSignal": true; }; "filterLocally": { "alias": "filterLocally"; "required": false; "isSignal": true; }; "filterWith": { "alias": "filterWith"; "required": false; "isSignal": true; }; "debounceTime": { "alias": "debounceTime"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; "query": "query"; "selected": "selected"; "cleared": "cleared"; "rejected": "rejected"; }, never, never, true, never>;
2706
+ protected readonly cardStyle: _angular_core.Signal<{
2707
+ boxShadow: string;
2708
+ }>;
2709
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniCardComponent, never>;
2710
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniCardComponent, "uni-card", never, {}, {}, never, ["*"], true, never>;
1442
2711
  }
1443
2712
 
1444
2713
  interface UniDataSearchOptions {
@@ -1464,253 +2733,73 @@ declare class UniDataSearchComponent<T> extends BaseComponent<UniDataSearchOptio
1464
2733
 
1465
2734
  interface ColumnDefinition<T> {
1466
2735
  columnDef: keyof T;
1467
- header: string;
1468
- cell?: (element: T) => string;
1469
- isSticky?: boolean;
1470
- template?: TemplateRef<T>;
1471
- textAlign?: 'left' | 'right' | 'center';
1472
- }
1473
- interface UniDataTableOptions {
1474
- border?: Border;
1475
- borderRadius?: Radius;
1476
- color?: ContainerColorToken;
1477
- elevation?: Elevation;
1478
- headerPadding?: NullableSize;
1479
- footerPadding?: NullableSize;
1480
- headerColor?: ContainerColorToken;
1481
- footerColor?: ContainerColorToken;
1482
- cellPadding?: NullableSize;
1483
- rowHoverColor?: ContainerColorToken;
1484
- thTextRole: TextRole;
1485
- thColor?: ContainerColorToken;
1486
- thPadding?: NullableSize;
1487
- thHorizontalBorder?: Border;
1488
- thVerticalBorder?: Border;
1489
- tdTextRole: TextRole;
1490
- tdColor?: ContainerColorToken;
1491
- tdStickyColor?: ContainerColorToken;
1492
- tdPadding?: NullableSize;
1493
- tdHorizontalBorder?: Border;
1494
- tdVerticalBorder?: Border;
1495
- loadingOverlayColor?: ColorKey;
1496
- loadingSpinnerColor?: ColorKey;
1497
- loadingSpinnerSize?: string | number;
1498
- }
1499
-
1500
- declare class UniDataTableComponent<T> extends BaseComponent<UniDataTableOptions> {
1501
- datasource: _angular_core.InputSignal<UniDatasource<T>>;
1502
- columns: _angular_core.InputSignal<ColumnDefinition<T>[]>;
1503
- detailRowTemplate: _angular_core.InputSignal<TemplateRef<{
1504
- $implicit: T;
1505
- index: number;
1506
- }>>;
1507
- expandedIndex: _angular_core.WritableSignal<number>;
1508
- useMultiSelect: _angular_core.InputSignal<boolean>;
1509
- useRowClick: _angular_core.InputSignal<boolean>;
1510
- highlight?: _angular_core.InputSignal<(row: T) => boolean>;
1511
- height: _angular_core.InputSignal<string>;
1512
- scrollable: _angular_core.WritableSignal<boolean>;
1513
- loadingOverlayClass: string;
1514
- rowSelect: _angular_core.OutputEmitterRef<T>;
1515
- rowClick: _angular_core.OutputEmitterRef<T>;
1516
- protected readonly tableClass: _angular_core.Signal<string>;
1517
- protected readonly headerClass: _angular_core.Signal<string>;
1518
- protected readonly footerClass: _angular_core.Signal<string>;
1519
- protected readonly thClass: _angular_core.Signal<string>;
1520
- protected readonly tdClass: _angular_core.Signal<string>;
1521
- protected readonly trClass: _angular_core.Signal<string>;
1522
- protected readonly detailRowClass: _angular_core.Signal<string>;
1523
- isLoading: _angular_core.WritableSignal<boolean>;
1524
- toggleRow(index: number): void;
1525
- handleRowClick(row: T, index: number): void;
1526
- /** aria-sort value for a column header, or null when the column is unsorted. */
1527
- protected ariaSort(column: ColumnDefinition<T>): 'ascending' | 'descending' | null;
1528
- isHighlighted(row: T): boolean;
1529
- protected readonly String: StringConstructor;
1530
- handleScrollable(scrollable: boolean): void;
1531
- getBorder(name: string | undefined): string;
1532
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniDataTableComponent<any>, never>;
1533
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniDataTableComponent<any>, "uni-data-table", never, { "datasource": { "alias": "datasource"; "required": true; "isSignal": true; }; "columns": { "alias": "columns"; "required": true; "isSignal": true; }; "detailRowTemplate": { "alias": "detailRowTemplate"; "required": false; "isSignal": true; }; "useMultiSelect": { "alias": "useMultiSelect"; "required": false; "isSignal": true; }; "useRowClick": { "alias": "useRowClick"; "required": false; "isSignal": true; }; "highlight": { "alias": "highlight"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; }, { "rowSelect": "rowSelect"; "rowClick": "rowClick"; }, never, ["data-table-header", "data-table-footer"], true, never>;
1534
- }
1535
-
1536
- /** Why typed text did not become a date. The raw text stays in the field. */
1537
- interface UniDateInputRejection {
1538
- raw: string;
1539
- reason: 'unparseable' | 'out-of-range' | 'disabled';
1540
- }
1541
- /**
1542
- * Theme options for the `dateInput` entry. Field chrome is not duplicated
1543
- * here — it comes from `input` via uni-input-box; these style the popup
1544
- * affordance and panel only.
1545
- */
1546
- interface UniDateInputOptions {
1547
- toggleSymbol?: string;
1548
- popupShadow?: Shadow;
1549
- popupBorderRadius?: Radius;
1550
- popupColor?: ContainerColorToken;
1551
- }
1552
-
1553
- /**
1554
- * Date field with free-typed parsing and a popup calendar. Type `aug 20`,
1555
- * `8/20/2026` or `2026-08-20`, or pick from the grid — the form gets the
1556
- * same canonical `'YYYY-MM-DD'` string either way. Parsing is `Intl`-driven
1557
- * (locale digit order and month names, never hardcoded); unreadable text
1558
- * stays in the field, flagged, with a `rejected` event. The popup is a
1559
- * native popover hosting the same `uni-calendar` an app could render inline.
1560
- */
1561
- declare class UniDateInputComponent extends BaseComponent<UniDateInputOptions> implements FormValueControl<UniDate | undefined> {
1562
- readonly value: _angular_core.ModelSignal<string>;
1563
- readonly disabled: _angular_core.InputSignal<boolean>;
1564
- readonly touched: _angular_core.ModelSignal<boolean>;
1565
- readonly invalid: _angular_core.InputSignal<boolean>;
1566
- readonly dirty: _angular_core.InputSignal<boolean>;
1567
- readonly required: _angular_core.InputSignal<boolean>;
1568
- readonly ariaDescribedBy: _angular_core.InputSignal<string>;
1569
- /** Accessible name for the field, e.g. "Appointment date". */
1570
- label: _angular_core.InputSignal<string>;
1571
- /** Defaults to the locale's digit pattern, e.g. `MM/DD/YYYY`. */
1572
- placeholder: _angular_core.InputSignal<string>;
1573
- /** How the committed value renders, e.g. `{ dateStyle: 'long' }`. */
1574
- displayFormat: _angular_core.InputSignal<Intl.DateTimeFormatOptions>;
1575
- /** BCP 47 tag; defaults to the document language, then the browser's. */
1576
- locale: _angular_core.InputSignal<string>;
1577
- commitOnBlur: _angular_core.InputSignal<boolean>;
1578
- /** Custom parser, replacing the built-in ISO/locale/month-name parsing. */
1579
- parse: _angular_core.InputSignal<(raw: string, locale: string) => UniDate | null>;
1580
- /** Renders without its own input-box chrome, for composers like uni-date-time-input. */
1581
- embedded: _angular_core.InputSignal<boolean>;
1582
- minDate: _angular_core.InputSignal<string>;
1583
- maxDate: _angular_core.InputSignal<string>;
1584
- disabledDates: _angular_core.InputSignal<string[] | ((date: UniDate) => boolean)>;
1585
- markers: _angular_core.InputSignal<UniCalendarMarker[]>;
1586
- weekStart: _angular_core.InputSignal<0 | 1 | 2 | 3 | 4 | 6 | 5>;
1587
- /** Popup shown. */
1588
- opened: _angular_core.OutputEmitterRef<void>;
1589
- /** Popup hidden. */
1590
- closed: _angular_core.OutputEmitterRef<void>;
1591
- /** A typed commit was refused; the raw text stays in the field. */
1592
- rejected: _angular_core.OutputEmitterRef<UniDateInputRejection>;
1593
- private readonly host;
1594
- private readonly inputRef;
1595
- private readonly toggleRef;
1596
- private readonly popupRef;
1597
- private readonly dropdown;
1598
- private readonly calendar;
1599
- protected readonly srOnly: string;
1600
- /** A refused commit — styles the field and sets aria-invalid until edited. */
1601
- protected readonly draftInvalid: _angular_core.WritableSignal<boolean>;
1602
- protected readonly announcement: _angular_core.WritableSignal<string>;
1603
- protected readonly toggleElement: _angular_core.Signal<any>;
1604
- protected readonly popupOpen: _angular_core.Signal<boolean>;
1605
- protected readonly resolvedLocale: _angular_core.Signal<string>;
1606
- protected readonly displayText: _angular_core.Signal<string>;
1607
- protected readonly resolvedPlaceholder: _angular_core.Signal<string>;
1608
- protected readonly showError: _angular_core.Signal<boolean>;
1609
- protected readonly toggleLabel: _angular_core.Signal<string>;
1610
- private fullDate;
1611
- private isDayBlocked;
1612
- protected setValue(date: UniDate | undefined, silent?: boolean): void;
1613
- private refuse;
1614
- protected commit(raw: string): boolean;
1615
- /** Step a committed value ±1 day, skipping blocked days, stopping at fences. */
1616
- private step;
1617
- protected onInputKeydown(event: KeyboardEvent): void;
1618
- protected onInput(): void;
1619
- protected onFocusOut(event: FocusEvent): void;
1620
- protected openPopup(): void;
1621
- protected closePopup(): void;
1622
- protected onPopupShowing(): void;
1623
- protected onPopupHiding(): void;
1624
- protected onCalendarPick(date: UniDate): void;
1625
- /** The popup is a focus-holding dialog: Tab cycles inside it (APG pattern). */
1626
- protected onPopupKeydown(event: KeyboardEvent): void;
1627
- private setFieldText;
1628
- private announce;
1629
- protected readonly className: _angular_core.Signal<string>;
1630
- protected readonly rowClass: _angular_core.Signal<string>;
1631
- protected readonly inputClass: _angular_core.Signal<string>;
1632
- protected readonly toggleWrapClass: _angular_core.Signal<string>;
1633
- /** Embedded mode: the composer owns the box; keep only the flex row. */
1634
- protected readonly embeddedClass: _angular_core.Signal<string>;
1635
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniDateInputComponent, never>;
1636
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniDateInputComponent, "uni-date-input, DateInput", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": true; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "displayFormat": { "alias": "displayFormat"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "commitOnBlur": { "alias": "commitOnBlur"; "required": false; "isSignal": true; }; "parse": { "alias": "parse"; "required": false; "isSignal": true; }; "embedded": { "alias": "embedded"; "required": false; "isSignal": true; }; "minDate": { "alias": "minDate"; "required": false; "isSignal": true; }; "maxDate": { "alias": "maxDate"; "required": false; "isSignal": true; }; "disabledDates": { "alias": "disabledDates"; "required": false; "isSignal": true; }; "markers": { "alias": "markers"; "required": false; "isSignal": true; }; "weekStart": { "alias": "weekStart"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; "opened": "opened"; "closed": "closed"; "rejected": "rejected"; }, never, never, true, never>;
2736
+ header: string;
2737
+ cell?: (element: T) => string;
2738
+ isSticky?: boolean;
2739
+ template?: TemplateRef<T>;
2740
+ textAlign?: 'left' | 'right' | 'center';
1637
2741
  }
1638
-
1639
- /**
1640
- * Theme options for the `dateTimeInput` entry. Field chrome comes from
1641
- * `input` via the single shared uni-input-box; these style the seam between
1642
- * the two parts.
1643
- */
1644
- interface UniDateTimeInputOptions {
1645
- /** Space between the date part, the divider, and the time part. */
1646
- partGap?: NullableSize;
1647
- dividerColor?: ColorToken;
2742
+ interface UniDataTableOptions {
2743
+ border?: Border;
2744
+ borderRadius?: Radius;
2745
+ color?: ContainerColorToken;
2746
+ elevation?: Elevation;
2747
+ headerPadding?: NullableSize;
2748
+ footerPadding?: NullableSize;
2749
+ headerColor?: ContainerColorToken;
2750
+ footerColor?: ContainerColorToken;
2751
+ cellPadding?: NullableSize;
2752
+ rowHoverColor?: ContainerColorToken;
2753
+ thTextRole: TextRole;
2754
+ thColor?: ContainerColorToken;
2755
+ thPadding?: NullableSize;
2756
+ thHorizontalBorder?: Border;
2757
+ thVerticalBorder?: Border;
2758
+ tdTextRole: TextRole;
2759
+ tdColor?: ContainerColorToken;
2760
+ tdStickyColor?: ContainerColorToken;
2761
+ tdPadding?: NullableSize;
2762
+ tdHorizontalBorder?: Border;
2763
+ tdVerticalBorder?: Border;
2764
+ loadingOverlayColor?: ColorKey;
2765
+ loadingSpinnerColor?: ColorKey;
2766
+ loadingSpinnerSize?: string | number;
1648
2767
  }
1649
2768
 
1650
- /**
1651
- * One field for a date and a time: a thin composer seating a uni-date-input
1652
- * and a uni-time-input in one input-box chrome under one label, yielding one
1653
- * combined `'YYYY-MM-DDTHH:mm'` value. The value emits only when both parts
1654
- * are set — a time without a day is not an answer — and clearing the date
1655
- * clears it. With `slotsFor`, the time part stays disabled until a day is
1656
- * chosen and offers exactly that day's slots: the scheduling flow in one
1657
- * attribute. Two honest tab stops (it is two questions); apps needing a
1658
- * different arrangement compose the primitives directly.
1659
- */
1660
- declare class UniDateTimeInputComponent extends BaseComponent<UniDateTimeInputOptions> implements FormValueControl<UniDateTime | undefined> {
1661
- readonly value: _angular_core.ModelSignal<string>;
1662
- readonly disabled: _angular_core.InputSignal<boolean>;
1663
- readonly touched: _angular_core.ModelSignal<boolean>;
1664
- readonly invalid: _angular_core.InputSignal<boolean>;
1665
- readonly dirty: _angular_core.InputSignal<boolean>;
1666
- readonly required: _angular_core.InputSignal<boolean>;
1667
- readonly ariaDescribedBy: _angular_core.InputSignal<string>;
1668
- /** Names the group; the parts are announced as "Date" and "Time" under it. */
1669
- label: _angular_core.InputSignal<string>;
1670
- /** Earliest allowed moment; the date and time fences are split from it. */
1671
- minDateTime: _angular_core.InputSignal<string>;
1672
- /** Latest allowed moment; the date and time fences are split from it. */
1673
- maxDateTime: _angular_core.InputSignal<string>;
1674
- disabledDates: _angular_core.InputSignal<string[] | ((date: UniDate) => boolean)>;
1675
- markers: _angular_core.InputSignal<UniCalendarMarker[]>;
1676
- /** Fixed time choices; superseded per-day by `slotsFor` when that is set. */
1677
- slots: _angular_core.InputSignal<string[]>;
1678
- minuteStep: _angular_core.InputSignal<number>;
1679
- hour12: _angular_core.InputSignal<boolean>;
1680
- weekStart: _angular_core.InputSignal<0 | 1 | 2 | 3 | 4 | 6 | 5>;
1681
- locale: _angular_core.InputSignal<string>;
1682
- /** Scheduling: the day's available times. Gates the time part on a date. */
1683
- slotsFor: _angular_core.InputSignal<(date: UniDate) => UniTime[]>;
1684
- private readonly host;
1685
- /**
1686
- * The two part-values. An external `value` write re-derives both; an
1687
- * internal partial state (a date without a time round-trips through
1688
- * `undefined`) must not be wiped by its own echo.
1689
- */
1690
- private readonly parts;
1691
- protected readonly dateValue: _angular_core.Signal<string>;
1692
- protected readonly timeValue: _angular_core.Signal<string>;
1693
- protected readonly showError: _angular_core.Signal<boolean>;
1694
- private readonly minParts;
1695
- private readonly maxParts;
1696
- protected readonly dateMin: _angular_core.Signal<string>;
1697
- protected readonly dateMax: _angular_core.Signal<string>;
1698
- protected readonly timeMin: _angular_core.Signal<string>;
1699
- protected readonly timeMax: _angular_core.Signal<string>;
1700
- /** The chosen day's slots when `slotsFor` is set, else the fixed list. */
1701
- protected readonly effectiveSlots: _angular_core.Signal<string[]>;
1702
- protected readonly timeDisabled: _angular_core.Signal<boolean>;
1703
- protected onDatePartChange(date: UniDate | undefined): void;
1704
- protected onTimePartChange(time: UniTime | undefined): void;
1705
- private setParts;
1706
- protected onHostFocusOut(event: FocusEvent): void;
1707
- protected readonly className: _angular_core.Signal<string>;
1708
- protected readonly groupClass: _angular_core.Signal<string>;
1709
- protected readonly datePartClass: _angular_core.Signal<string>;
1710
- protected readonly timePartClass: _angular_core.Signal<string>;
1711
- protected readonly dividerClass: _angular_core.Signal<string>;
1712
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniDateTimeInputComponent, never>;
1713
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniDateTimeInputComponent, "uni-date-time-input, DateTimeInput", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": true; "isSignal": true; }; "minDateTime": { "alias": "minDateTime"; "required": false; "isSignal": true; }; "maxDateTime": { "alias": "maxDateTime"; "required": false; "isSignal": true; }; "disabledDates": { "alias": "disabledDates"; "required": false; "isSignal": true; }; "markers": { "alias": "markers"; "required": false; "isSignal": true; }; "slots": { "alias": "slots"; "required": false; "isSignal": true; }; "minuteStep": { "alias": "minuteStep"; "required": false; "isSignal": true; }; "hour12": { "alias": "hour12"; "required": false; "isSignal": true; }; "weekStart": { "alias": "weekStart"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "slotsFor": { "alias": "slotsFor"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; }, never, never, true, never>;
2769
+ declare class UniDataTableComponent<T> extends BaseComponent<UniDataTableOptions> {
2770
+ datasource: _angular_core.InputSignal<UniDatasource<T>>;
2771
+ columns: _angular_core.InputSignal<ColumnDefinition<T>[]>;
2772
+ detailRowTemplate: _angular_core.InputSignal<TemplateRef<{
2773
+ $implicit: T;
2774
+ index: number;
2775
+ }>>;
2776
+ expandedIndex: _angular_core.WritableSignal<number>;
2777
+ useMultiSelect: _angular_core.InputSignal<boolean>;
2778
+ useRowClick: _angular_core.InputSignal<boolean>;
2779
+ highlight?: _angular_core.InputSignal<(row: T) => boolean>;
2780
+ height: _angular_core.InputSignal<string>;
2781
+ scrollable: _angular_core.WritableSignal<boolean>;
2782
+ loadingOverlayClass: string;
2783
+ rowSelect: _angular_core.OutputEmitterRef<T>;
2784
+ rowClick: _angular_core.OutputEmitterRef<T>;
2785
+ protected readonly tableClass: _angular_core.Signal<string>;
2786
+ protected readonly headerClass: _angular_core.Signal<string>;
2787
+ protected readonly footerClass: _angular_core.Signal<string>;
2788
+ protected readonly thClass: _angular_core.Signal<string>;
2789
+ protected readonly tdClass: _angular_core.Signal<string>;
2790
+ protected readonly trClass: _angular_core.Signal<string>;
2791
+ protected readonly detailRowClass: _angular_core.Signal<string>;
2792
+ isLoading: _angular_core.WritableSignal<boolean>;
2793
+ toggleRow(index: number): void;
2794
+ handleRowClick(row: T, index: number): void;
2795
+ /** aria-sort value for a column header, or null when the column is unsorted. */
2796
+ protected ariaSort(column: ColumnDefinition<T>): 'ascending' | 'descending' | null;
2797
+ isHighlighted(row: T): boolean;
2798
+ protected readonly String: StringConstructor;
2799
+ handleScrollable(scrollable: boolean): void;
2800
+ getBorder(name: string | undefined): string;
2801
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniDataTableComponent<any>, never>;
2802
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniDataTableComponent<any>, "uni-data-table", never, { "datasource": { "alias": "datasource"; "required": true; "isSignal": true; }; "columns": { "alias": "columns"; "required": true; "isSignal": true; }; "detailRowTemplate": { "alias": "detailRowTemplate"; "required": false; "isSignal": true; }; "useMultiSelect": { "alias": "useMultiSelect"; "required": false; "isSignal": true; }; "useRowClick": { "alias": "useRowClick"; "required": false; "isSignal": true; }; "highlight": { "alias": "highlight"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; }, { "rowSelect": "rowSelect"; "rowClick": "rowClick"; }, never, ["data-table-header", "data-table-footer"], true, never>;
1714
2803
  }
1715
2804
 
1716
2805
  /**
@@ -1906,12 +2995,13 @@ interface UniDropdownOptions {
1906
2995
  borderRadius: Radius;
1907
2996
  shadow: Shadow;
1908
2997
  color: ContainerColorToken;
2998
+ /** Named motion primitive for the open/close animation. */
2999
+ motion: Motion;
1909
3000
  }
1910
3001
 
1911
3002
  type AriaHasPopup = 'menu' | 'listbox' | 'dialog' | 'grid' | 'tree' | 'true';
1912
3003
  declare class UniDropdownComponent extends BaseComponent<UniDropdownOptions> implements OnInit, OnDestroy {
1913
3004
  private renderer;
1914
- private delay;
1915
3005
  showing: _angular_core.WritableSignal<boolean>;
1916
3006
  trigger: _angular_core.InputSignal<HTMLElement>;
1917
3007
  placement: _angular_core.InputSignal<Placement>;
@@ -1931,13 +3021,13 @@ declare class UniDropdownComponent extends BaseComponent<UniDropdownOptions> imp
1931
3021
  border: _angular_core.InputSignal<string>;
1932
3022
  borderRadius: _angular_core.InputSignal<string>;
1933
3023
  shadow: _angular_core.InputSignal<string>;
1934
- color: _angular_core.InputSignal<ContainerColorToken>;
3024
+ /** A container color pair; `color` belongs to `uni-text` across the library. */
3025
+ containerColor: _angular_core.InputSignal<ContainerColorToken>;
1935
3026
  dropdownShowing: _angular_core.OutputEmitterRef<boolean>;
1936
3027
  dropdownHiding: _angular_core.OutputEmitterRef<boolean>;
1937
3028
  dropdownRef: ElementRef<HTMLDivElement>;
1938
3029
  private get _trigger();
1939
3030
  private get _dropdown();
1940
- private transformOriginMap;
1941
3031
  dropdownClass: _angular_core.Signal<string>;
1942
3032
  /** The element that receives focus and carries the ARIA popup state. */
1943
3033
  private get _focusTarget();
@@ -1945,37 +3035,30 @@ declare class UniDropdownComponent extends BaseComponent<UniDropdownOptions> imp
1945
3035
  /**
1946
3036
  * Scale the open/close animation from the corner touching the trigger,
1947
3037
  * wherever the browser actually placed the panel. The static
1948
- * `transformOriginMap` covers only the *requested* placement; with
3038
+ * `TRANSFORM_ORIGINS` entry covers only the *requested* placement; with
1949
3039
  * `position-try-fallbacks` the panel may have flipped at a viewport edge,
1950
3040
  * and a `bottom-end` picker rendered above its field would otherwise still
1951
3041
  * animate from the top-right corner.
1952
3042
  */
1953
3043
  private syncTransformOrigin;
1954
- /**
1955
- * Returns focus to the trigger when the popover closes while focus was
1956
- * inside it (or was dropped on <body> by the top layer closing), so
1957
- * keyboard users are never stranded (WCAG 2.4.3).
1958
- */
1959
- private restoreFocus;
1960
3044
  toggleDropdown(): void;
1961
3045
  hideDropdown(): void;
1962
3046
  ngOnDestroy(): void;
1963
3047
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniDropdownComponent, never>;
1964
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniDropdownComponent, "uni-dropdown", never, { "trigger": { "alias": "trigger"; "required": true; "isSignal": true; }; "placement": { "alias": "placement"; "required": false; "isSignal": true; }; "offset": { "alias": "offset"; "required": false; "isSignal": true; }; "ariaHasPopup": { "alias": "ariaHasPopup"; "required": false; "isSignal": true; }; "paddingVertical": { "alias": "paddingVertical"; "required": false; "isSignal": true; }; "paddingHorizontal": { "alias": "paddingHorizontal"; "required": false; "isSignal": true; }; "border": { "alias": "border"; "required": false; "isSignal": true; }; "borderRadius": { "alias": "borderRadius"; "required": false; "isSignal": true; }; "shadow": { "alias": "shadow"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; }, { "dropdownShowing": "dropdownShowing"; "dropdownHiding": "dropdownHiding"; }, never, ["*"], true, never>;
3048
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniDropdownComponent, "uni-dropdown", never, { "trigger": { "alias": "trigger"; "required": true; "isSignal": true; }; "placement": { "alias": "placement"; "required": false; "isSignal": true; }; "offset": { "alias": "offset"; "required": false; "isSignal": true; }; "ariaHasPopup": { "alias": "ariaHasPopup"; "required": false; "isSignal": true; }; "paddingVertical": { "alias": "paddingVertical"; "required": false; "isSignal": true; }; "paddingHorizontal": { "alias": "paddingHorizontal"; "required": false; "isSignal": true; }; "border": { "alias": "border"; "required": false; "isSignal": true; }; "borderRadius": { "alias": "borderRadius"; "required": false; "isSignal": true; }; "shadow": { "alias": "shadow"; "required": false; "isSignal": true; }; "containerColor": { "alias": "containerColor"; "required": false; "isSignal": true; }; }, { "dropdownShowing": "dropdownShowing"; "dropdownHiding": "dropdownHiding"; }, never, ["*"], true, never>;
1965
3049
  }
1966
3050
 
1967
3051
  /** Theme-level options for `uni-expand`. */
1968
3052
  interface UniExpandOptions {
1969
3053
  /**
1970
- * Base reveal/collapse duration in seconds (matching alert/card
1971
- * `transitionSpeed`), lives in the `expand` theme options. The default
1972
- * theme uses `0.35`. This is the duration at a 240px-tall region; the
1973
- * actual duration scales with content height (√-of-height, clamped
1974
- * `expandDuration` in uni-core) so short regions stay snappy and tall
1975
- * ones aren't rushed. Also drives `uni-expand-toggle`'s chevron rotation
1976
- * so trigger and region move on the same clock.
3054
+ * Named motion primitive for the reveal. Defaults to `reveal`, whose
3055
+ * duration is the *base* speed at a 240px-tall region — the actual duration
3056
+ * scales with content height (√-of-height, clamped `expandDuration` in
3057
+ * uni-core) so short regions stay snappy and tall ones aren't rushed. Its
3058
+ * easing drives the animation curve, and `uni-expand-toggle`'s chevron
3059
+ * reads the same token so trigger and region move on one clock.
1977
3060
  */
1978
- transitionSpeed?: number;
3061
+ motion?: Motion;
1979
3062
  }
1980
3063
 
1981
3064
  declare class UniExpandComponent extends BaseComponent<UniExpandOptions> {
@@ -2017,6 +3100,13 @@ declare class UniExpandComponent extends BaseComponent<UniExpandOptions> {
2017
3100
  * (`[style.transition-duration]="expand.duration() + 's'"`).
2018
3101
  */
2019
3102
  readonly duration: _angular_core.Signal<number>;
3103
+ /**
3104
+ * Base speed in seconds, before the size-aware scaling above: the `motion`
3105
+ * token's duration (ms) converted to seconds.
3106
+ */
3107
+ private readonly baseSpeed;
3108
+ /** Curve for the reveal, from the same token as the speed. */
3109
+ private readonly easing;
2020
3110
  protected readonly cssDuration: _angular_core.Signal<string>;
2021
3111
  /**
2022
3112
  * A custom element is `display: inline` by default, which would lay the
@@ -2043,8 +3133,8 @@ declare class UniExpandComponent extends BaseComponent<UniExpandOptions> {
2043
3133
  * `duration`, so the classes stay static while timing tracks the theme and
2044
3134
  * the content's size through signals alone.
2045
3135
  */
2046
- expandAnimation: string;
2047
- collapseAnimation: string;
3136
+ expandAnimation: _angular_core.Signal<string>;
3137
+ collapseAnimation: _angular_core.Signal<string>;
2048
3138
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniExpandComponent, never>;
2049
3139
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniExpandComponent, "uni-expand", never, { "collapsed": { "alias": "collapsed"; "required": false; "isSignal": true; }; "transitionSpeed": { "alias": "transitionSpeed"; "required": false; "isSignal": true; }; }, { "collapsed": "collapsedChange"; }, never, ["*"], true, never>;
2050
3140
  }
@@ -2073,7 +3163,9 @@ declare class UniExpandToggleComponent {
2073
3163
  * region is size-scaled or overridden per instance.
2074
3164
  */
2075
3165
  transitionSpeed: _angular_core.InputSignal<number>;
2076
- /** Fallback clock when no `transitionSpeed` is bound: the `expand` theme options' `transitionSpeed`. */
3166
+ /** Fallback clock when no `transitionSpeed` is bound: the `expand` entry's
3167
+ motion token — the same one the region itself reads. */
3168
+ private readonly themeService;
2077
3169
  private readonly expandOptions;
2078
3170
  private readonly speed;
2079
3171
  /**
@@ -2142,40 +3234,53 @@ declare class UniFileDropZoneComponent {
2142
3234
  }
2143
3235
 
2144
3236
  /**
2145
- * Text input that emits `change` only after the user pauses typing. Wears the
2146
- * shared input chrome (themed color, border, typeface, focus ring) via
2147
- * `uni-input-box`; project adornments with the `pre-input` / `post-input`
2148
- * slots, matching `uni-input`'s convention. The ARIA passthrough inputs let a
2149
- * wrapping composite (e.g. SearchInput's combobox) annotate the real input
2150
- * element.
3237
+ * Whether the browser can keep a top-layer popup attached to its field.
3238
+ *
3239
+ * The top layer and anchor positioning must be adopted together, and support
3240
+ * for them does not arrive together: Safari shipped `popover` in 17 but
3241
+ * `position-anchor` only in 26. Promoting the popup without anchor support
3242
+ * would strand it — a top-layer element has no positioned ancestor, so the
3243
+ * fallback's `position: absolute; top: 100%` would resolve against the
3244
+ * viewport and drop the list a full screen height down the page. So the
3245
+ * `popover` attribute is gated on this too, not just the anchored CSS.
3246
+ *
3247
+ * Undefined `CSS` (jsdom) reads as unsupported, which is also what keeps the
3248
+ * popup in the normal flow — and the component specs unchanged — under test.
2151
3249
  */
2152
- declare class UniDebounceInputComponent {
2153
- inputName: _angular_core.InputSignal<string>;
2154
- inputId: _angular_core.InputSignal<string>;
2155
- debounceTime: _angular_core.InputSignal<number>;
2156
- /** Accessible name for the input. */
2157
- label: _angular_core.InputSignal<string>;
2158
- placeholder: _angular_core.InputSignal<string>;
2159
- disabled: _angular_core.InputSignal<boolean>;
2160
- role: _angular_core.InputSignal<string>;
2161
- ariaExpanded: _angular_core.InputSignal<boolean>;
2162
- ariaControls: _angular_core.InputSignal<string>;
2163
- ariaActivedescendant: _angular_core.InputSignal<string>;
2164
- change: _angular_core.OutputEmitterRef<string>;
2165
- value: _angular_core.WritableSignal<string>;
2166
- private readonly inputElement;
2167
- private timeoutId;
2168
- private lastEmitted;
2169
- constructor();
2170
- handleInput(event: Event): void;
2171
- /** Empty the field immediately, cancelling any pending emit. */
2172
- clear(): void;
2173
- focus(): void;
2174
- inputClass: string;
2175
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniDebounceInputComponent, never>;
2176
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniDebounceInputComponent, "uni-debounce-input", never, { "inputName": { "alias": "inputName"; "required": false; "isSignal": true; }; "inputId": { "alias": "inputId"; "required": false; "isSignal": true; }; "debounceTime": { "alias": "debounceTime"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "role": { "alias": "role"; "required": false; "isSignal": true; }; "ariaExpanded": { "alias": "ariaExpanded"; "required": false; "isSignal": true; }; "ariaControls": { "alias": "ariaControls"; "required": false; "isSignal": true; }; "ariaActivedescendant": { "alias": "ariaActivedescendant"; "required": false; "isSignal": true; }; }, { "change": "change"; }, never, ["[pre-input]", "[post-input]"], true, never>;
2177
- }
2178
-
3250
+ declare const supportsAnchoredPopup: () => boolean;
3251
+ /** `popover` attribute value for a listbox popup, or null where unsupported.
3252
+ Always `manual`: these controls already own dismissal (focusout, Escape,
3253
+ commit), and `auto`'s light-dismiss fires on pointerdown outside the
3254
+ popup which includes their own field, closing the list behind the
3255
+ component's back on every click into the input. */
3256
+ declare const listboxPopupAttr: () => "manual" | null;
3257
+ /**
3258
+ * A document-unique `anchor-name`, plus the style fragment that puts it on the
3259
+ * field wrapper. Spread `style` into the wrapper's `css()` and pass `name` to
3260
+ * {@link listboxPopupStyles}.
3261
+ */
3262
+ declare function newListboxAnchor(): {
3263
+ name: string;
3264
+ style: CSSObject;
3265
+ };
3266
+ /**
3267
+ * Shows the popup in the top layer as soon as it renders, and scales its
3268
+ * entry animation out of the edge it actually opened from.
3269
+ *
3270
+ * The popups are `@if`-rendered, and a `popover` element is `display: none`
3271
+ * until `showPopover()` runs — so appearing in the DOM is not enough. Runs on
3272
+ * every render pass; `showPopover()` on an already-open popup throws, which is
3273
+ * the cheapest way to ask "is it open?".
3274
+ *
3275
+ * The origin is measured rather than assumed: `position-try-fallbacks` may
3276
+ * have flipped the popup above its field near the bottom of the viewport, and
3277
+ * the static `top center` would then grow it from the wrong edge. Measuring
3278
+ * forces layout, so it lands before the first frame of the transition.
3279
+ *
3280
+ * Call from an injection context (a field initializer or the constructor);
3281
+ * the component's host element is the anchor.
3282
+ */
3283
+ declare function promoteListboxPopup(ref: Signal<ElementRef<HTMLElement> | undefined>): void;
2179
3284
  /**
2180
3285
  * The theme options every listbox popup shares — the "list trio" plus the
2181
3286
  * active-option fill. Component option interfaces (searchInput, tagInput,
@@ -2192,11 +3297,14 @@ interface UniListboxPopupOptions {
2192
3297
  /** Active/hover option fill; the on-color pair is derived. Must contrast
2193
3298
  with `listColor` or keyboard navigation turns invisible. */
2194
3299
  activeColor?: ColorKey;
3300
+ /** Named motion primitive for the open animation. Defaults to `popup`, the
3301
+ same token `uni-dropdown` uses, so every panel in a form opens alike. */
3302
+ motion?: Motion;
2195
3303
  }
2196
3304
  /**
2197
- * Style block for the popup behind every `ListboxNavigation` consumer: an
2198
- * absolutely-positioned `ul[role="listbox"]` under a `position: relative`
2199
- * field wrapper, with the shared option chrome and active/hover highlight.
3305
+ * Style block for the popup behind every `ListboxNavigation` consumer: a
3306
+ * `ul[role="listbox"]` under its field wrapper, with the shared option chrome
3307
+ * and active/hover highlight.
2200
3308
  *
2201
3309
  * Extracted because four components (`uni-search-input`, `uni-tag-input`,
2202
3310
  * `uni-time-input`, `uni-combobox`) carried hand-rolled copies, and the parts
@@ -2204,12 +3312,19 @@ interface UniListboxPopupOptions {
2204
3312
  * trio, and the `activeColor` pair that themes re-point when their container
2205
3313
  * tokens don't contrast (see the Wellsourced overrides).
2206
3314
  *
3315
+ * Pass `anchor` (from {@link newListboxAnchor}) to get the top-layer
3316
+ * positioning where the browser supports it. Without it — or on a browser that
3317
+ * lacks anchor positioning — the popup stays absolutely positioned under a
3318
+ * `position: relative` wrapper, which clips inside `overflow: hidden`
3319
+ * ancestors but at least stays on its field.
3320
+ *
2207
3321
  * Compose extras with the array form — `css([listboxPopupStyles(…), {…}])` —
2208
3322
  * so a component's own `& [role="option"]` block cascades after this one
2209
3323
  * instead of replacing it (an object spread would overwrite the key).
2210
3324
  */
2211
- declare const listboxPopupStyles: (theme: ThemeService, options: UniListboxPopupOptions, { maxHeight }?: {
3325
+ declare const listboxPopupStyles: (theme: ThemeService, options: UniListboxPopupOptions, { maxHeight, anchor }?: {
2212
3326
  maxHeight?: number;
3327
+ anchor?: string;
2213
3328
  }) => CSSObject;
2214
3329
 
2215
3330
  declare class UniIconComponent {
@@ -2254,83 +3369,18 @@ declare class UniIconButtonComponent {
2254
3369
  loading: _angular_core.InputSignal<boolean>;
2255
3370
  opticalSize: _angular_core.InputSignal<number>;
2256
3371
  protected readonly srOnlyClass: string;
2257
- /**
2258
- * Sizes `iconName` from the size token's `fontSize`, the same value that sizes
2259
- * a `symbolName` ligature — so the two paths render the same glyph size and
2260
- * `symbolName` → `iconName` is a like-for-like swap. Without it a masked icon
2261
- * fills the whole button box, since the base size tokens carry no padding.
2262
- * Themes that do use padding (Carbon) set a matching `fontSize`, so they land
2263
- * on the same glyph either way.
2264
- */
2265
- protected readonly glyphSize: _angular_core.Signal<string | number>;
2266
- protected readonly className: _angular_core.Signal<string>;
2267
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniIconButtonComponent, never>;
2268
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniIconButtonComponent, "button[uni-icon-button], button[icon-button]", never, { "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "iconName": { "alias": "iconName"; "required": false; "isSignal": true; }; "symbolName": { "alias": "symbolName"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "disable": { "alias": "disable"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "opticalSize": { "alias": "opticalSize"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, [{ directive: typeof RippleDirective; inputs: {}; outputs: {}; }]>;
2269
- }
2270
-
2271
- declare class UniInputComponent implements FormValueControl<string> {
2272
- readonly value: _angular_core.ModelSignal<string>;
2273
- readonly disabled: _angular_core.InputSignal<boolean>;
2274
- readonly touched: _angular_core.ModelSignal<boolean>;
2275
- readonly invalid: _angular_core.InputSignal<boolean>;
2276
- readonly dirty: _angular_core.InputSignal<boolean>;
2277
- /** Synced from required() validators by the Signal Forms [field] directive. */
2278
- readonly required: _angular_core.InputSignal<boolean>;
2279
- /**
2280
- * Id(s) of external element(s) describing this control — typically your
2281
- * app-rendered error message — exposed as aria-describedby.
2282
- */
2283
- readonly ariaDescribedBy: _angular_core.InputSignal<string>;
2284
- label: _angular_core.InputSignal<string>;
2285
- placeholder: _angular_core.InputSignal<string>;
2286
- protected readonly showError: _angular_core.Signal<boolean>;
2287
- markAsTouched(): void;
2288
- handleInput(event: Event): void;
2289
- inputClass: string;
2290
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniInputComponent, never>;
2291
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniInputComponent, "uni-input", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": true; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; }, never, ["pre-input", "post-input"], true, never>;
2292
- }
2293
-
2294
- interface UniInputBoxOptions {
2295
- color: ContainerColorToken;
2296
- disabledColor: ContainerColorToken;
2297
- errorColor: ContainerColorToken;
2298
- border: Border;
2299
- errorBorder: Border;
2300
- borderRadius: Radius;
2301
- transitionSpeed: number;
2302
- shadow?: Shadow;
2303
- errorShadow?: Shadow;
2304
- height?: string | number;
2305
- paddingLeft: OptionalSize;
2306
- typeface?: Typeface;
2307
- /** @deprecated Use `typeface` (matching tooltip/button/tabs casing). */
2308
- typeFace?: Typeface;
2309
- textColor: ColorKey;
2310
- disabledTextColor: ColorKey;
2311
- focusOutline: string;
2312
- focusOutlineOffset: number;
2313
- /** Border swapped in while an inner control has focus (default: keep `border`). */
2314
- focusBorder?: Border;
2315
- /** Ring shown while focused, e.g. a soft `0 0 0 3px` spread shadow. */
2316
- focusShadow?: Shadow;
2317
- /** Background swapped in while focused (default: keep `color`). */
2318
- focusColor?: ContainerColorToken;
2319
- }
2320
-
2321
- declare class UniInputBoxComponent extends BaseComponent<UniInputBoxOptions> {
2322
- protected readonly className: string;
2323
- disabled: _angular_core.InputSignal<boolean>;
2324
- error: _angular_core.InputSignal<boolean>;
2325
- minWidth: _angular_core.InputSignal<string>;
2326
- /** Override the themed field height, e.g. `'auto'` for multi-line fields. */
2327
- height: _angular_core.InputSignal<string | number>;
2328
- protected readonly color: _angular_core.Signal<_uni_design_system_uni_core.ContainerColorToken>;
2329
- protected readonly border: _angular_core.Signal<string>;
2330
- protected readonly shadow: _angular_core.Signal<string>;
2331
- protected readonly inputBoxClass: _angular_core.Signal<string>;
2332
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniInputBoxComponent, never>;
2333
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniInputBoxComponent, "uni-input-box", never, { "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "minWidth": { "alias": "minWidth"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
3372
+ /**
3373
+ * Sizes `iconName` from the size token's `fontSize`, the same value that sizes
3374
+ * a `symbolName` ligature — so the two paths render the same glyph size and
3375
+ * `symbolName` → `iconName` is a like-for-like swap. Without it a masked icon
3376
+ * fills the whole button box, since the base size tokens carry no padding.
3377
+ * Themes that do use padding (Carbon) set a matching `fontSize`, so they land
3378
+ * on the same glyph either way.
3379
+ */
3380
+ protected readonly glyphSize: _angular_core.Signal<string | number>;
3381
+ protected readonly className: _angular_core.Signal<string>;
3382
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniIconButtonComponent, never>;
3383
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniIconButtonComponent, "button[uni-icon-button], button[icon-button]", never, { "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "iconName": { "alias": "iconName"; "required": false; "isSignal": true; }; "symbolName": { "alias": "symbolName"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "disable": { "alias": "disable"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "opticalSize": { "alias": "opticalSize"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, [{ directive: typeof RippleDirective; inputs: {}; outputs: {}; }]>;
2334
3384
  }
2335
3385
 
2336
3386
  declare class UniJsonViewComponent {
@@ -2346,137 +3396,6 @@ declare class UniJsonViewComponent {
2346
3396
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniJsonViewComponent, "uni-json-view", never, { "json": { "alias": "json"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "fontSize": { "alias": "fontSize"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "selectOnClick": { "alias": "selectOnClick"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
2347
3397
  }
2348
3398
 
2349
- /**
2350
- * The base layout primitive, applied as an attribute to any element so
2351
- * semantics stay yours: `<main box-layout [grow]="1" padding="md">`.
2352
- * Exception: other components' host elements (`<uni-card box-layout>` would
2353
- * put two components on one element) — wrap those in a `<div box-layout>`.
2354
- *
2355
- * Sizing convention (height/width/min/max/inset): a **number is px and needs
2356
- * a binding** — `[height]="420"`; a **plain attribute is a CSS length
2357
- * string** — `height="420px"`. Spacing/radius/color inputs take theme tokens.
2358
- */
2359
- declare class UniBoxComponent {
2360
- theme: ThemeService;
2361
- color: _angular_core.InputSignal<ContainerColorToken>;
2362
- backgroundColor: _angular_core.InputSignal<string>;
2363
- borderRadius: _angular_core.InputSignal<string>;
2364
- borderRadiusLeft: _angular_core.InputSignal<string>;
2365
- borderRadiusRight: _angular_core.InputSignal<string>;
2366
- borderRadiusTop: _angular_core.InputSignal<string>;
2367
- borderRadiusBottom: _angular_core.InputSignal<string>;
2368
- padding: _angular_core.InputSignal<OptionalSize>;
2369
- paddingHorizontal: _angular_core.InputSignal<OptionalSize>;
2370
- paddingVertical: _angular_core.InputSignal<OptionalSize>;
2371
- paddingLeft: _angular_core.InputSignal<OptionalSize>;
2372
- paddingRight: _angular_core.InputSignal<OptionalSize>;
2373
- paddingTop: _angular_core.InputSignal<OptionalSize>;
2374
- paddingBottom: _angular_core.InputSignal<OptionalSize>;
2375
- border: _angular_core.InputSignal<string>;
2376
- borderTop: _angular_core.InputSignal<string>;
2377
- borderBottom: _angular_core.InputSignal<string>;
2378
- borderLeft: _angular_core.InputSignal<string>;
2379
- borderRight: _angular_core.InputSignal<string>;
2380
- dashBorder: _angular_core.InputSignal<boolean>;
2381
- alignSelf: _angular_core.InputSignal<OptionalAlignSelf>;
2382
- alignItems: _angular_core.InputSignal<OptionalAlignItems>;
2383
- alignContent: _angular_core.InputSignal<OptionalAlignContent>;
2384
- justifyContent: _angular_core.InputSignal<OptionalJustifyContent>;
2385
- grow: _angular_core.InputSignal<number>;
2386
- display: _angular_core.InputSignal<OptionalDisplay>;
2387
- position: _angular_core.InputSignal<OptionalPosition>;
2388
- inset: _angular_core.InputSignal<string | number>;
2389
- /** Number = px via binding (`[height]="420"`); string = CSS length (`height="420px"`). */
2390
- height: _angular_core.InputSignal<string | number>;
2391
- minHeight: _angular_core.InputSignal<string | number>;
2392
- maxHeight: _angular_core.InputSignal<string | number>;
2393
- /** Number = px via binding (`[width]="420"`); string = CSS length (`width="50%"`). */
2394
- width: _angular_core.InputSignal<string | number>;
2395
- minWidth: _angular_core.InputSignal<string | number>;
2396
- maxWidth: _angular_core.InputSignal<string | number>;
2397
- ignoreDir: _angular_core.InputSignal<boolean>;
2398
- gridArea: _angular_core.InputSignal<string>;
2399
- gridColumn: _angular_core.InputSignal<string>;
2400
- gridRow: _angular_core.InputSignal<string>;
2401
- overflow: _angular_core.InputSignal<OptionalOverflow>;
2402
- elevation: _angular_core.InputSignal<string>;
2403
- shadow: _angular_core.InputSignal<string>;
2404
- gap: _angular_core.InputSignal<OptionalSize>;
2405
- fullWidth: _angular_core.InputSignal<boolean>;
2406
- fullHeight: _angular_core.InputSignal<boolean>;
2407
- flexDirection: _angular_core.InputSignal<OptionalFlexDirection>;
2408
- textAlign: _angular_core.InputSignal<OptionalTextAlign>;
2409
- wrapItems: _angular_core.InputSignal<OptionalWrap>;
2410
- zIndex: _angular_core.InputSignal<ZIndexableElements>;
2411
- protected readonly boxClassName: _angular_core.Signal<string>;
2412
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniBoxComponent, never>;
2413
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniBoxComponent, "[uni-box-layout], [box-layout]", never, { "color": { "alias": "color"; "required": false; "isSignal": true; }; "backgroundColor": { "alias": "backgroundColor"; "required": false; "isSignal": true; }; "borderRadius": { "alias": "borderRadius"; "required": false; "isSignal": true; }; "borderRadiusLeft": { "alias": "borderRadiusLeft"; "required": false; "isSignal": true; }; "borderRadiusRight": { "alias": "borderRadiusRight"; "required": false; "isSignal": true; }; "borderRadiusTop": { "alias": "borderRadiusTop"; "required": false; "isSignal": true; }; "borderRadiusBottom": { "alias": "borderRadiusBottom"; "required": false; "isSignal": true; }; "padding": { "alias": "padding"; "required": false; "isSignal": true; }; "paddingHorizontal": { "alias": "paddingHorizontal"; "required": false; "isSignal": true; }; "paddingVertical": { "alias": "paddingVertical"; "required": false; "isSignal": true; }; "paddingLeft": { "alias": "paddingLeft"; "required": false; "isSignal": true; }; "paddingRight": { "alias": "paddingRight"; "required": false; "isSignal": true; }; "paddingTop": { "alias": "paddingTop"; "required": false; "isSignal": true; }; "paddingBottom": { "alias": "paddingBottom"; "required": false; "isSignal": true; }; "border": { "alias": "border"; "required": false; "isSignal": true; }; "borderTop": { "alias": "borderTop"; "required": false; "isSignal": true; }; "borderBottom": { "alias": "borderBottom"; "required": false; "isSignal": true; }; "borderLeft": { "alias": "borderLeft"; "required": false; "isSignal": true; }; "borderRight": { "alias": "borderRight"; "required": false; "isSignal": true; }; "dashBorder": { "alias": "dashBorder"; "required": false; "isSignal": true; }; "alignSelf": { "alias": "alignSelf"; "required": false; "isSignal": true; }; "alignItems": { "alias": "alignItems"; "required": false; "isSignal": true; }; "alignContent": { "alias": "alignContent"; "required": false; "isSignal": true; }; "justifyContent": { "alias": "justifyContent"; "required": false; "isSignal": true; }; "grow": { "alias": "grow"; "required": false; "isSignal": true; }; "display": { "alias": "display"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; "inset": { "alias": "inset"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "minHeight": { "alias": "minHeight"; "required": false; "isSignal": true; }; "maxHeight": { "alias": "maxHeight"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "minWidth": { "alias": "minWidth"; "required": false; "isSignal": true; }; "maxWidth": { "alias": "maxWidth"; "required": false; "isSignal": true; }; "ignoreDir": { "alias": "ignoreDir"; "required": false; "isSignal": true; }; "gridArea": { "alias": "gridArea"; "required": false; "isSignal": true; }; "gridColumn": { "alias": "gridColumn"; "required": false; "isSignal": true; }; "gridRow": { "alias": "gridRow"; "required": false; "isSignal": true; }; "overflow": { "alias": "overflow"; "required": false; "isSignal": true; }; "elevation": { "alias": "elevation"; "required": false; "isSignal": true; }; "shadow": { "alias": "shadow"; "required": false; "isSignal": true; }; "gap": { "alias": "gap"; "required": false; "isSignal": true; }; "fullWidth": { "alias": "fullWidth"; "required": false; "isSignal": true; }; "fullHeight": { "alias": "fullHeight"; "required": false; "isSignal": true; }; "flexDirection": { "alias": "flexDirection"; "required": false; "isSignal": true; }; "textAlign": { "alias": "textAlign"; "required": false; "isSignal": true; }; "wrapItems": { "alias": "wrapItems"; "required": false; "isSignal": true; }; "zIndex": { "alias": "zIndex"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
2414
- }
2415
-
2416
- declare class UniCenterComponent extends UniBoxComponent {
2417
- display: _angular_core.InputSignal<OptionalDisplay>;
2418
- justifyContent: _angular_core.InputSignal<OptionalJustifyContent>;
2419
- alignItems: _angular_core.InputSignal<OptionalAlignItems>;
2420
- constructor();
2421
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniCenterComponent, never>;
2422
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniCenterComponent, "[uni-center-layout], [center-layout]", never, { "display": { "alias": "display"; "required": false; "isSignal": true; }; "justifyContent": { "alias": "justifyContent"; "required": false; "isSignal": true; }; "alignItems": { "alias": "alignItems"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
2423
- }
2424
-
2425
- declare class UniGridAreaComponent {
2426
- area: _angular_core.InputSignal<string>;
2427
- protected readonly className: _angular_core.Signal<string>;
2428
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniGridAreaComponent, never>;
2429
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniGridAreaComponent, "[uni-grid-area-layout], [grid-area-layout]", never, { "area": { "alias": "area"; "required": true; "isSignal": true; }; }, {}, never, ["*"], true, never>;
2430
- }
2431
-
2432
- declare class UniGridComponent extends UniBoxComponent {
2433
- display: _angular_core.InputSignal<OptionalDisplay>;
2434
- templateAreas: _angular_core.InputSignal<string>;
2435
- templateColumns: _angular_core.InputSignal<string>;
2436
- templateRows: _angular_core.InputSignal<string>;
2437
- outline: _angular_core.InputSignal<Thickness>;
2438
- outlineColor: _angular_core.InputSignal<Variant>;
2439
- protected readonly gridClassName: _angular_core.Signal<string>;
2440
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniGridComponent, never>;
2441
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniGridComponent, "[uni-grid-layout], [grid-layout]", never, { "display": { "alias": "display"; "required": false; "isSignal": true; }; "templateAreas": { "alias": "templateAreas"; "required": false; "isSignal": true; }; "templateColumns": { "alias": "templateColumns"; "required": false; "isSignal": true; }; "templateRows": { "alias": "templateRows"; "required": false; "isSignal": true; }; "outline": { "alias": "outline"; "required": false; "isSignal": true; }; "outlineColor": { "alias": "outlineColor"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
2442
- }
2443
-
2444
- declare class UniRowComponent extends UniBoxComponent {
2445
- display: _angular_core.InputSignal<OptionalDisplay>;
2446
- flexDirection: _angular_core.InputSignal<OptionalFlexDirection>;
2447
- /**
2448
- * Defaults to `fit-content` (guards content collapse). Set `[minWidth]="0"`
2449
- * when the row must shrink inside a constrained flex parent (scroll or
2450
- * text truncation containment).
2451
- */
2452
- minWidth: _angular_core.InputSignal<string | number>;
2453
- constructor();
2454
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniRowComponent, never>;
2455
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniRowComponent, "[uni-row-layout], [row-layout]", never, { "display": { "alias": "display"; "required": false; "isSignal": true; }; "flexDirection": { "alias": "flexDirection"; "required": false; "isSignal": true; }; "minWidth": { "alias": "minWidth"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
2456
- }
2457
-
2458
- declare class UniStackComponent extends UniBoxComponent {
2459
- display: _angular_core.InputSignal<OptionalDisplay>;
2460
- flexDirection: _angular_core.InputSignal<OptionalFlexDirection>;
2461
- /**
2462
- * Defaults to `fit-content` (guards content collapse). Set `[minHeight]="0"`
2463
- * when the stack must shrink inside a constrained flex parent (scroll
2464
- * containment).
2465
- */
2466
- minHeight: _angular_core.InputSignal<string | number>;
2467
- constructor();
2468
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniStackComponent, never>;
2469
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniStackComponent, "[uni-stack-layout], [stack-layout]", never, { "display": { "alias": "display"; "required": false; "isSignal": true; }; "flexDirection": { "alias": "flexDirection"; "required": false; "isSignal": true; }; "minHeight": { "alias": "minHeight"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
2470
- }
2471
-
2472
- declare class UniWrapComponent extends UniBoxComponent {
2473
- display: _angular_core.InputSignal<OptionalDisplay>;
2474
- wrapItems: _angular_core.InputSignal<OptionalWrap>;
2475
- constructor();
2476
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniWrapComponent, never>;
2477
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniWrapComponent, "[uni-wrap-layout], [wrap-layout]", never, { "display": { "alias": "display"; "required": false; "isSignal": true; }; "wrapItems": { "alias": "wrapItems"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
2478
- }
2479
-
2480
3399
  interface BaseMenuItem {
2481
3400
  symbolName?: string;
2482
3401
  action?: () => void;
@@ -2512,148 +3431,60 @@ interface UniMenuItemOptions {
2512
3431
  /** Resting text color; undefined inherits the panel's on-color. */
2513
3432
  textColor?: ColorKey;
2514
3433
  hoverColor?: ContainerColorToken;
2515
- /** Trailing symbol marking the active item; undefined/'' renders none. */
2516
- activeSymbol?: string;
2517
- /** Hover/focus transition in seconds; 0 switches instantly. */
2518
- transitionSpeed?: number;
2519
- }
2520
-
2521
- /**
2522
- * Theme options for the `menu` component entry. The panel-chrome fields
2523
- * (color/border/borderRadius/shadow) fall back to the theme's `dropdown`
2524
- * options when undefined, so menus follow generic popovers until a theme
2525
- * deliberately splits them.
2526
- */
2527
- interface UniMenuOptions {
2528
- /** Panel minimum width in px; undefined sizes to the widest item. */
2529
- minWidth?: number;
2530
- color?: ContainerColorToken;
2531
- border?: Border;
2532
- borderRadius?: Radius;
2533
- shadow?: Shadow;
2534
- paddingVertical?: NullableSize;
2535
- paddingHorizontal?: NullableSize;
2536
- dividerBorder?: Border;
2537
- /** Vertical margin and horizontal inset applied to dividers. */
2538
- dividerSpacing?: NullableSize;
2539
- }
2540
-
2541
- declare class UniMenuComponent {
2542
- private theme;
2543
- menuItems: _angular_core.InputSignal<MenuItem[]>;
2544
- activeItem: _angular_core.InputSignal<MenuItem>;
2545
- placement: _angular_core.InputSignal<Placement>;
2546
- menuItemClicked: _angular_core.OutputEmitterRef<MenuItem>;
2547
- TriggerClassName: string;
2548
- /** Type guard for the template: dividers render as separators, not items. */
2549
- protected readonly isDivider: (item: MenuItem) => item is _uni_design_system_uni_angular.MenuDivider;
2550
- protected readonly menuOptions: _angular_core.Signal<UniMenuOptions>;
2551
- protected readonly menuClassName: _angular_core.Signal<string>;
2552
- protected readonly dividerClassName: _angular_core.Signal<string>;
2553
- private itemComponents;
2554
- private dropdownComponent;
2555
- /** Which item receives focus when the menu opens (ArrowUp opens onto the last item). */
2556
- private pendingFocus;
2557
- protected readonly className: _angular_core.Signal<string>;
2558
- handleMenuItemClick(item: MenuItem, dropdown: UniDropdownComponent): void;
2559
- /** Enabled items participating in keyboard navigation. */
2560
- private get navigableItems();
2561
- onOpened(): void;
2562
- onTriggerKeydown(event: KeyboardEvent): void;
2563
- onMenuKeydown(event: KeyboardEvent, dropdown: UniDropdownComponent): void;
2564
- /** First-character matching, starting after the focused item and wrapping. */
2565
- private typeahead;
2566
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniMenuComponent, never>;
2567
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniMenuComponent, "uni-menu", never, { "menuItems": { "alias": "menuItems"; "required": true; "isSignal": true; }; "activeItem": { "alias": "activeItem"; "required": false; "isSignal": true; }; "placement": { "alias": "placement"; "required": false; "isSignal": true; }; }, { "menuItemClicked": "menuItemClicked"; }, never, ["*"], true, never>;
2568
- }
2569
-
2570
- declare class UniMultiSelectComponent<T = unknown> {
2571
- options: _angular_core.InputSignal<Option<T>[]>;
2572
- selections: _angular_core.InputSignal<T[]>;
2573
- updates: _angular_core.OutputEmitterRef<T[]>;
2574
- flexDirection: _angular_core.InputSignal<"column" | "row" | "column-reverse" | "row-reverse">;
2575
- checkboxGap: _angular_core.InputSignal<NullableSize>;
2576
- protected readonly values: _angular_core.Signal<unknown[]>;
2577
- protected readonly optionsWithSelections: _angular_core.Signal<Option<T>[]>;
2578
- protected readonly className: string;
2579
- handleCheck(checked: boolean, value: T): void;
2580
- selectAll(): void;
2581
- deselectAll(): void;
2582
- optionWrapper: string;
2583
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniMultiSelectComponent<any>, never>;
2584
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniMultiSelectComponent<any>, "uni-multi-select", never, { "options": { "alias": "options"; "required": false; "isSignal": true; }; "selections": { "alias": "selections"; "required": false; "isSignal": true; }; "flexDirection": { "alias": "flexDirection"; "required": false; "isSignal": true; }; "checkboxGap": { "alias": "checkboxGap"; "required": false; "isSignal": true; }; }, { "updates": "updates"; }, never, never, true, never>;
2585
- }
2586
-
2587
- interface UniMultiSelectDropdownOptions {
2588
- textRole: Typeface;
2589
- textColor: TextColor;
2590
- placeholderTextColor: TextColor;
2591
- dividerBorder: Border;
2592
- searchInputBorder: Border;
2593
- searchInputBorderRadius: Radius;
2594
- focusOutline: string;
2595
- focusOutlineOffset: number;
2596
- }
2597
-
2598
- declare class UniMultiSelectDropdownComponent<T = unknown> extends BaseComponent<UniMultiSelectDropdownOptions> implements FormValueControl<T[]> {
2599
- protected readonly className: string;
2600
- readonly value: _angular_core.ModelSignal<T[]>;
2601
- readonly disabled: _angular_core.InputSignal<boolean>;
2602
- readonly touched: _angular_core.ModelSignal<boolean>;
2603
- readonly invalid: _angular_core.InputSignal<boolean>;
2604
- readonly dirty: _angular_core.InputSignal<boolean>;
2605
- /** Synced from required() validators by the Signal Forms [field] directive. */
2606
- readonly required: _angular_core.InputSignal<boolean>;
2607
- /**
2608
- * Id(s) of external element(s) describing this control — typically your
2609
- * app-rendered error message — exposed as aria-describedby.
2610
- */
2611
- readonly ariaDescribedBy: _angular_core.InputSignal<string>;
2612
- readonly options: _angular_core.InputSignal<Options<T>>;
2613
- readonly placeholder: _angular_core.InputSignal<string>;
2614
- /**
2615
- * What the field is for, e.g. "Fruits". Rendered visually hidden inside the
2616
- * trigger so its accessible name reads "Fruits, Apple, Pear" — without it a
2617
- * screen reader announces only the current selection, with no clue which
2618
- * field it belongs to.
2619
- */
2620
- readonly label: _angular_core.InputSignal<string>;
2621
- /** Debounce for the filter box, matching the library's input debounce. */
2622
- readonly debounceTime: _angular_core.InputSignal<number>;
2623
- protected readonly srOnly: string;
2624
- protected readonly query: _angular_core.WritableSignal<string>;
2625
- private queryTimer?;
2626
- protected readonly filteredOptions: _angular_core.Signal<Options<T>>;
2627
- private readonly optionRefs;
2628
- /**
2629
- * Roving focus over the options. The shared helper owns the index
2630
- * arithmetic — wrapping, Home/End, and never pointing past a list the
2631
- * filter has narrowed — the same contract `uni-search-input` and
2632
- * `uni-tag-input` use, so the keys behave identically across all three.
2633
- */
2634
- protected readonly list: _uni_design_system_uni_angular.ListboxNavigation;
2635
- /** Announced with the selection so the count is not left to guesswork. */
2636
- readonly selectionSummary: _angular_core.Signal<string>;
2637
- readonly selectedLabelsText: _angular_core.Signal<string>;
2638
- protected readonly showError: _angular_core.Signal<boolean>;
2639
- protected readonly textColor: _angular_core.Signal<_uni_design_system_uni_core.TextColor>;
2640
- triggerClass: string;
2641
- protected readonly searchInputClass: _angular_core.Signal<string>;
2642
- protected handleQueryInput(event: Event): void;
2643
- /**
2644
- * Arrow keys walk the options from anywhere in the panel, including the
2645
- * filter box — previously the only way in was to Tab through every
2646
- * checkbox.
2647
- */
2648
- protected onPanelKeydown(event: KeyboardEvent): void;
2649
- /** Keeps the active index in step when focus lands on a row by pointer. */
2650
- protected onOptionFocus(index: number): void;
2651
- selectAll(): void;
2652
- deselectAll(): void;
2653
- protected isOptionSelected(option: Option<T>): _angular_core.Signal<boolean>;
2654
- toggleOption(option: Option<T>, checked: boolean): void;
2655
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniMultiSelectDropdownComponent<any>, never>;
2656
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniMultiSelectDropdownComponent<any>, "uni-multi-select-dropdown", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": true; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "debounceTime": { "alias": "debounceTime"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; }, never, never, true, never>;
3434
+ /** Trailing symbol marking the active item; undefined/'' renders none. */
3435
+ activeSymbol?: string;
3436
+ /** Named motion primitive for the hover/focus fill. Defaults to `control`;
3437
+ omit both this and `transitionSpeed` for no transition at all. */
3438
+ motion?: Motion;
3439
+ }
3440
+
3441
+ /**
3442
+ * Theme options for the `menu` component entry. The panel-chrome fields
3443
+ * (color/border/borderRadius/shadow) fall back to the theme's `dropdown`
3444
+ * options when undefined, so menus follow generic popovers until a theme
3445
+ * deliberately splits them.
3446
+ */
3447
+ interface UniMenuOptions {
3448
+ /** Panel minimum width in px; undefined sizes to the widest item. */
3449
+ minWidth?: number;
3450
+ color?: ContainerColorToken;
3451
+ border?: Border;
3452
+ borderRadius?: Radius;
3453
+ shadow?: Shadow;
3454
+ paddingVertical?: NullableSize;
3455
+ paddingHorizontal?: NullableSize;
3456
+ dividerBorder?: Border;
3457
+ /** Vertical margin and horizontal inset applied to dividers. */
3458
+ dividerSpacing?: NullableSize;
3459
+ }
3460
+
3461
+ declare class UniMenuComponent {
3462
+ private theme;
3463
+ menuItems: _angular_core.InputSignal<MenuItem[]>;
3464
+ activeItem: _angular_core.InputSignal<MenuItem>;
3465
+ placement: _angular_core.InputSignal<Placement>;
3466
+ menuItemClicked: _angular_core.OutputEmitterRef<MenuItem>;
3467
+ TriggerClassName: string;
3468
+ /** Type guard for the template: dividers render as separators, not items. */
3469
+ protected readonly isDivider: (item: MenuItem) => item is _uni_design_system_uni_angular.MenuDivider;
3470
+ protected readonly menuOptions: _angular_core.Signal<UniMenuOptions>;
3471
+ protected readonly menuClassName: _angular_core.Signal<string>;
3472
+ protected readonly dividerClassName: _angular_core.Signal<string>;
3473
+ private itemComponents;
3474
+ private dropdownComponent;
3475
+ /** Which item receives focus when the menu opens (ArrowUp opens onto the last item). */
3476
+ private pendingFocus;
3477
+ protected readonly className: _angular_core.Signal<string>;
3478
+ handleMenuItemClick(item: MenuItem, dropdown: UniDropdownComponent): void;
3479
+ /** Enabled items participating in keyboard navigation. */
3480
+ private get navigableItems();
3481
+ onOpened(): void;
3482
+ onTriggerKeydown(event: KeyboardEvent): void;
3483
+ onMenuKeydown(event: KeyboardEvent, dropdown: UniDropdownComponent): void;
3484
+ /** First-character matching, starting after the focused item and wrapping. */
3485
+ private typeahead;
3486
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniMenuComponent, never>;
3487
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniMenuComponent, "uni-menu", never, { "menuItems": { "alias": "menuItems"; "required": true; "isSignal": true; }; "activeItem": { "alias": "activeItem"; "required": false; "isSignal": true; }; "placement": { "alias": "placement"; "required": false; "isSignal": true; }; }, { "menuItemClicked": "menuItemClicked"; }, never, ["*"], true, never>;
2657
3488
  }
2658
3489
 
2659
3490
  interface UniNotificationBadgeOptions {
@@ -2686,7 +3517,9 @@ declare class UniNotificationBadgeComponent extends BaseComponent<UniNotificatio
2686
3517
  interface UniAlertOptions {
2687
3518
  defaultVariant: Variant;
2688
3519
  borderRadius: Radius;
2689
- transitionSpeed: number;
3520
+ /** Named motion primitive for the enter/leave transition. Defaults to
3521
+ `notification`. */
3522
+ motion?: Motion;
2690
3523
  topPosition: string | number;
2691
3524
  elevation: Elevation;
2692
3525
  }
@@ -2700,6 +3533,8 @@ declare class UniAlertComponent extends BaseComponent<UniAlertOptions> implement
2700
3533
  alertRef?: ElementRef<HTMLDialogElement>;
2701
3534
  private readonly alertState;
2702
3535
  private readonly effectiveVariant;
3536
+ /** Timing for the enter/leave transition. */
3537
+ protected readonly motion: _angular_core.Signal<_uni_design_system_uni_core.MotionToken>;
2703
3538
  protected readonly alertClass: _angular_core.Signal<string>;
2704
3539
  private readonly fadeOut;
2705
3540
  constructor();
@@ -2740,7 +3575,9 @@ declare class NotificationsComponent {
2740
3575
 
2741
3576
  interface UniSnackbarOptions {
2742
3577
  bottomPosition: number;
2743
- transitionDelay: string;
3578
+ /** Named motion primitive for the enter/leave transition. Defaults to
3579
+ `notification`. */
3580
+ motion?: Motion;
2744
3581
  autoCloseDelay: number;
2745
3582
  }
2746
3583
 
@@ -2767,12 +3604,16 @@ declare class UniSnackbarComponent extends BaseComponent<UniSnackbarOptions> imp
2767
3604
  snackbarRef: _angular_core.Signal<ElementRef<any>>;
2768
3605
  private get _snackbar();
2769
3606
  constructor();
3607
+ /** Timing for the enter/leave transition. */
3608
+ protected readonly motion: _angular_core.Signal<_uni_design_system_uni_core.MotionToken>;
2770
3609
  protected readonly snackbarClass: _angular_core.Signal<string>;
2771
3610
  fadeOut: string;
2772
3611
  ngAfterViewInit(): void;
2773
3612
  private get _timeout();
2774
3613
  open(): void;
2775
3614
  close(): void;
3615
+ /** Drops out of the top layer. Called once the closing fade has run. */
3616
+ private hide;
2776
3617
  protected pauseTimer(): void;
2777
3618
  protected resumeTimer(): void;
2778
3619
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniSnackbarComponent, never>;
@@ -2833,7 +3674,8 @@ interface UniPopoverOptions {
2833
3674
  /** Hover open delay in tooltip mode, ms. */
2834
3675
  tooltipOpenDelay: number;
2835
3676
  /** Pointer-leave close delay in tooltip mode, ms. */
2836
- tooltipCloseDelay: number;
3677
+ tooltipCloseDelay: number; /** Named motion primitive for the open/close animation. */
3678
+ motion: Motion;
2837
3679
  }
2838
3680
 
2839
3681
  /**
@@ -2963,66 +3805,6 @@ declare class UniProgressGaugeComponent extends BaseComponent {
2963
3805
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniProgressGaugeComponent, "uni-progress-gauge", never, { "percent": { "alias": "percent"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
2964
3806
  }
2965
3807
 
2966
- interface UniRadioOption {
2967
- /**
2968
- * The label displayed for this radio option
2969
- */
2970
- label: string;
2971
- /**
2972
- * The value associated with this radio option
2973
- */
2974
- value: string;
2975
- /**
2976
- * Whether this option is disabled
2977
- */
2978
- disabled?: boolean;
2979
- }
2980
- interface UniRadioOptions {
2981
- /**
2982
- * The size of the radio buttons
2983
- */
2984
- size?: number;
2985
- /** Unselected ring color token. */
2986
- ringColor?: ColorKey;
2987
- /** Circle background token. */
2988
- fillColor?: ColorKey;
2989
- /**
2990
- * Seconds for the dot's grow/retract and the ring's color change
2991
- * (default 0.3, matching menuItem/expand). 0 switches instantly.
2992
- */
2993
- transitionSpeed?: number;
2994
- }
2995
-
2996
- declare class UniRadioComponent extends BaseComponent<UniRadioOptions> implements FormValueControl<string> {
2997
- readonly value: _angular_core.ModelSignal<string>;
2998
- readonly disabled: _angular_core.InputSignal<boolean>;
2999
- readonly touched: _angular_core.ModelSignal<boolean>;
3000
- readonly invalid: _angular_core.InputSignal<boolean>;
3001
- readonly dirty: _angular_core.InputSignal<boolean>;
3002
- /** Synced from required() validators by the Signal Forms [field] directive. */
3003
- readonly required: _angular_core.InputSignal<boolean>;
3004
- /**
3005
- * Id(s) of external element(s) describing this control — typically your
3006
- * app-rendered error message — exposed as aria-describedby.
3007
- */
3008
- readonly ariaDescribedBy: _angular_core.InputSignal<string>;
3009
- readonly options: _angular_core.InputSignal<UniRadioOption[]>;
3010
- readonly label: _angular_core.InputSignal<string>;
3011
- readonly name: _angular_core.InputSignal<string>;
3012
- /** Links the group label to the radiogroup container. */
3013
- protected readonly groupLabelId: string;
3014
- protected readonly showError: _angular_core.Signal<boolean>;
3015
- markAsTouched(): void;
3016
- private readonly metrics;
3017
- protected readonly radioGroupClass: string;
3018
- protected readonly radioOptionClass: _angular_core.Signal<string>;
3019
- protected readonly radioInputClass: _angular_core.Signal<string>;
3020
- handleRadioChange(optionValue: string): void;
3021
- getThemeColor(token: ColorToken): string;
3022
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniRadioComponent, never>;
3023
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniRadioComponent, "uni-radio", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; }, never, never, true, never>;
3024
- }
3025
-
3026
3808
  /**
3027
3809
  * Visual style of the scrollbar.
3028
3810
  * - `compact`: thin overlay-style scrollbar.
@@ -3043,7 +3825,15 @@ declare class UniScrollAreaComponent {
3043
3825
  isVerticallyScrollable: _angular_core.WritableSignal<boolean>;
3044
3826
  viewport: _angular_core.Signal<ElementRef<HTMLDivElement>>;
3045
3827
  content: _angular_core.Signal<ElementRef<HTMLDivElement>>;
3046
- color: _angular_core.InputSignal<ContainerColorToken>;
3828
+ /**
3829
+ * A container color *pair*: the named surface plus its paired on-color.
3830
+ *
3831
+ * Named `containerColor`, not `color`, for the same reason as the layout
3832
+ * primitives: this is an attribute directive-style selector that shares
3833
+ * elements with `uni-text`, which owns `color` and maps it to the CSS
3834
+ * property. One `color` binding feeding both would render ink on ink.
3835
+ */
3836
+ containerColor: _angular_core.InputSignal<ContainerColorToken>;
3047
3837
  borderRadius: _angular_core.InputSignal<string>;
3048
3838
  padding: _angular_core.InputSignal<OptionalSize>;
3049
3839
  paddingHorizontal: _angular_core.InputSignal<OptionalSize>;
@@ -3066,108 +3856,13 @@ declare class UniScrollAreaComponent {
3066
3856
  protected contentClassName: _angular_core.Signal<string>;
3067
3857
  constructor();
3068
3858
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniScrollAreaComponent, never>;
3069
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniScrollAreaComponent, "[uni-scroll-area], [scroll-area]", never, { "color": { "alias": "color"; "required": false; "isSignal": true; }; "borderRadius": { "alias": "borderRadius"; "required": false; "isSignal": true; }; "padding": { "alias": "padding"; "required": false; "isSignal": true; }; "paddingHorizontal": { "alias": "paddingHorizontal"; "required": false; "isSignal": true; }; "paddingVertical": { "alias": "paddingVertical"; "required": false; "isSignal": true; }; "paddingLeft": { "alias": "paddingLeft"; "required": false; "isSignal": true; }; "paddingRight": { "alias": "paddingRight"; "required": false; "isSignal": true; }; "paddingTop": { "alias": "paddingTop"; "required": false; "isSignal": true; }; "paddingBottom": { "alias": "paddingBottom"; "required": false; "isSignal": true; }; "border": { "alias": "border"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "autoHeightDisabled": { "alias": "autoHeightDisabled"; "required": false; "isSignal": true; }; "verticalScrollPadding": { "alias": "verticalScrollPadding"; "required": false; "isSignal": true; }; }, { "scrollable": "scrollable"; }, never, ["*"], true, never>;
3070
- }
3071
-
3072
- /** Theme-level options for `uni-search-input`, resolved by token name. */
3073
- interface UniSearchInputOptions {
3074
- /** Leading (decorative) symbol. */
3075
- searchSymbol?: string;
3076
- /** Clear-button symbol. */
3077
- clearSymbol?: string;
3078
- /** Suggestion list surface color token. */
3079
- listColor?: ColorKey;
3080
- /** Active/hover suggestion fill; the on-color pair is derived. Must
3081
- contrast with `listColor` or keyboard navigation turns invisible. */
3082
- activeColor?: ContainerColorToken;
3083
- /** Suggestion list elevation token. */
3084
- listShadow?: Shadow;
3085
- /** Suggestion list radius token. */
3086
- listBorderRadius?: Radius;
3087
- /** Cap on rendered suggestions. */
3088
- maxSuggestions?: number;
3089
- }
3090
-
3091
- /**
3092
- * Generic search field: shared input chrome with a leading magnifier, a clear
3093
- * button while there's a query, Enter to submit, and optional type-ahead —
3094
- * pass `suggestions` (refresh them from `change`) and the field becomes an
3095
- * ARIA combobox with a keyboard-navigable listbox. Escape closes the list
3096
- * first, then clears the query.
3097
- */
3098
- declare class UniSearchInputComponent extends BaseComponent<UniSearchInputOptions> {
3099
- /** Accessible name for the field, also the placeholder fallback. */
3100
- label: _angular_core.InputSignal<string>;
3101
- placeholder: _angular_core.InputSignal<string>;
3102
- width: _angular_core.InputSignal<string | number>;
3103
- debounceTime: _angular_core.InputSignal<number>;
3104
- /**
3105
- * Type-ahead entries. Keep them fresh from `change` emissions; the list
3106
- * shows while the field has focus and entries exist.
3107
- */
3108
- suggestions: _angular_core.InputSignal<string[]>;
3109
- change: _angular_core.OutputEmitterRef<string>;
3110
- search: _angular_core.OutputEmitterRef<string>;
3111
- suggestionSelected: _angular_core.OutputEmitterRef<string>;
3112
- protected readonly field: _angular_core.Signal<UniDebounceInputComponent>;
3113
- protected readonly visibleSuggestions: _angular_core.Signal<string[]>;
3114
- /** Shared combobox bookkeeping: open state, active option, ARIA ids. */
3115
- protected readonly list: _uni_design_system_uni_angular.ListboxNavigation;
3116
- readonly listboxId: string;
3117
- protected readonly hasQuery: _angular_core.Signal<boolean>;
3118
- protected handleChange(value: string): void;
3119
- protected submit(): void;
3120
- protected select(suggestion: string): void;
3121
- protected clear(): void;
3122
- protected onKeydown(event: KeyboardEvent): void;
3123
- protected onFocusOut(event: FocusEvent): void;
3124
- protected readonly className: _angular_core.Signal<string>;
3125
- protected readonly listClass: _angular_core.Signal<string>;
3126
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniSearchInputComponent, never>;
3127
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniSearchInputComponent, "uni-search-input", never, { "label": { "alias": "label"; "required": true; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "debounceTime": { "alias": "debounceTime"; "required": false; "isSignal": true; }; "suggestions": { "alias": "suggestions"; "required": false; "isSignal": true; }; }, { "change": "change"; "search": "search"; "suggestionSelected": "suggestionSelected"; }, never, never, true, never>;
3128
- }
3129
-
3130
- declare class UniSelectComponent<T> implements FormValueControl<T | null> {
3131
- readonly value: _angular_core.ModelSignal<T>;
3132
- readonly disabled: _angular_core.InputSignal<boolean>;
3133
- readonly touched: _angular_core.ModelSignal<boolean>;
3134
- readonly invalid: _angular_core.InputSignal<boolean>;
3135
- readonly dirty: _angular_core.InputSignal<boolean>;
3136
- /** Synced from required() validators by the Signal Forms [field] directive. */
3137
- readonly required: _angular_core.InputSignal<boolean>;
3138
- /**
3139
- * Id(s) of external element(s) describing this control — typically your
3140
- * app-rendered error message — exposed as aria-describedby.
3141
- */
3142
- readonly ariaDescribedBy: _angular_core.InputSignal<string>;
3143
- readonly options: _angular_core.InputSignal<Options<T>>;
3144
- readonly placeholder: _angular_core.InputSignal<string>;
3145
- /**
3146
- * Equality used to match `value` against option values, called as
3147
- * `compareWith(optionValue, value)`. Defaults to reference equality, which
3148
- * never matches an object value rebuilt from elsewhere (e.g. a saved record
3149
- * against options from a fresh fetch) — pass a key comparison like
3150
- * `(a, b) => a?.id === b?.id` for object values.
3151
- */
3152
- readonly compareWith: _angular_core.InputSignal<(optionValue: T, value: T) => boolean>;
3153
- /** Accessible name for the select; a placeholder is not a label. */
3154
- readonly ariaLabel: _angular_core.InputSignal<string>;
3155
- protected readonly UNSELECTED = -1;
3156
- /**
3157
- * We use the index as the HTML value to avoid issues with
3158
- * stringifying complex objects or duplicate labels.
3159
- */
3160
- protected readonly currentSelectedIndex: _angular_core.Signal<string | -1>;
3161
- protected readonly showError: _angular_core.Signal<boolean>;
3162
- protected handleSelectChange(event: Event): void;
3163
- selectClass: string;
3164
- arrowClass: string;
3165
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniSelectComponent<any>, never>;
3166
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniSelectComponent<any>, "uni-select", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; }, never, never, true, never>;
3859
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniScrollAreaComponent, "[uni-scroll-area], [scroll-area]", never, { "containerColor": { "alias": "containerColor"; "required": false; "isSignal": true; }; "borderRadius": { "alias": "borderRadius"; "required": false; "isSignal": true; }; "padding": { "alias": "padding"; "required": false; "isSignal": true; }; "paddingHorizontal": { "alias": "paddingHorizontal"; "required": false; "isSignal": true; }; "paddingVertical": { "alias": "paddingVertical"; "required": false; "isSignal": true; }; "paddingLeft": { "alias": "paddingLeft"; "required": false; "isSignal": true; }; "paddingRight": { "alias": "paddingRight"; "required": false; "isSignal": true; }; "paddingTop": { "alias": "paddingTop"; "required": false; "isSignal": true; }; "paddingBottom": { "alias": "paddingBottom"; "required": false; "isSignal": true; }; "border": { "alias": "border"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "autoHeightDisabled": { "alias": "autoHeightDisabled"; "required": false; "isSignal": true; }; "verticalScrollPadding": { "alias": "verticalScrollPadding"; "required": false; "isSignal": true; }; }, { "scrollable": "scrollable"; }, never, ["*"], true, never>;
3167
3860
  }
3168
3861
 
3169
3862
  /** Placeholder geometry: a text line block, a rectangle, or a circle. */
3170
3863
  type SkeletonShape = 'text' | 'rect' | 'circle';
3864
+ /** Direction the shimmer band travels across a block. */
3865
+ type SkeletonSweepDirection = 'ltr' | 'rtl';
3171
3866
  /** Theme-level options for `uni-skeleton`, resolved by token name. */
3172
3867
  interface UniSkeletonOptions {
3173
3868
  /** Base placeholder color. */
@@ -3180,6 +3875,10 @@ interface UniSkeletonOptions {
3180
3875
  animation?: 'shimmer' | 'none';
3181
3876
  /** Shimmer sweep duration in seconds. */
3182
3877
  duration?: number;
3878
+ /** Direction the shimmer band travels. Default: 'ltr'. */
3879
+ direction?: SkeletonSweepDirection;
3880
+ /** Shimmer band width as a percentage of the block. Default: 40. */
3881
+ highlightWidth?: number;
3183
3882
  /** Vertical gap between text lines, as a spacing token. */
3184
3883
  gap?: OptionalSize;
3185
3884
  }
@@ -3189,6 +3888,11 @@ interface UniSkeletonOptions {
3189
3888
  * lines (the last line shortened, as real text would be), `rect` and `circle`
3190
3889
  * render fixed shapes. The shimmer only animates when the user allows motion;
3191
3890
  * it degrades to static blocks under `prefers-reduced-motion`.
3891
+ *
3892
+ * Color and radius are theme options with per-instance overrides, because one
3893
+ * app routinely needs several: skeletons on a card and on the page background
3894
+ * want different tints, and a pill placeholder wants a different corner than
3895
+ * the text bars beside it.
3192
3896
  */
3193
3897
  declare class UniSkeletonComponent extends BaseComponent<UniSkeletonOptions> {
3194
3898
  shape: _angular_core.InputSignal<SkeletonShape>;
@@ -3198,60 +3902,31 @@ declare class UniSkeletonComponent extends BaseComponent<UniSkeletonOptions> {
3198
3902
  height: _angular_core.InputSignal<string | number>;
3199
3903
  /** Number of text lines (text shape only). */
3200
3904
  lines: _angular_core.InputSignal<number>;
3201
- private readonly cssSize;
3202
- protected readonly resolvedHeight: _angular_core.Signal<string>;
3203
- protected readonly lineWidths: _angular_core.Signal<string[]>;
3204
- private readonly sweep;
3205
- protected readonly className: _angular_core.Signal<string>;
3206
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniSkeletonComponent, never>;
3207
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniSkeletonComponent, "uni-skeleton", never, { "shape": { "alias": "shape"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "lines": { "alias": "lines"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
3208
- }
3209
-
3210
- /** Theme-level options for `uni-slider`, resolved by token name. */
3211
- interface UniSliderOptions {
3212
- /** Fill and thumb color. */
3213
- color?: ColorKey;
3214
- /** Unfilled track color. */
3215
- trackColor?: ColorKey;
3216
- /** Track and thumb radius token. */
3217
- borderRadius?: Radius;
3218
- /** Track height in px. */
3219
- trackHeight?: number;
3220
- /** Thumb diameter in px. */
3221
- thumbSize?: number;
3222
- }
3223
-
3224
- /**
3225
- * Range slider on a native `<input type="range">` — keyboard interaction and
3226
- * the ARIA slider contract come from the platform. Fill, track, thumb and
3227
- * radii resolve from `slider` theme tokens; the fill percentage rides a CSS
3228
- * custom property so dragging never regenerates styles.
3229
- */
3230
- declare class UniSliderComponent extends BaseComponent<UniSliderOptions> implements FormValueControl<number> {
3231
- readonly value: _angular_core.ModelSignal<number>;
3232
- readonly disabled: _angular_core.InputSignal<boolean>;
3233
- readonly touched: _angular_core.ModelSignal<boolean>;
3234
- readonly invalid: _angular_core.InputSignal<boolean>;
3235
- readonly dirty: _angular_core.InputSignal<boolean>;
3236
- /** Synced from required() validators by the Signal Forms [field] directive. */
3237
- readonly required: _angular_core.InputSignal<boolean>;
3905
+ /** Base color token; overrides the theme option for this skeleton. */
3906
+ color: _angular_core.InputSignal<string>;
3907
+ /** Shimmer highlight token; overrides the theme option for this skeleton. */
3908
+ highlightColor: _angular_core.InputSignal<string>;
3909
+ /** Radius token; overrides the theme option. Circles are always round. */
3910
+ borderRadius: _angular_core.InputSignal<string>;
3238
3911
  /**
3239
- * Id(s) of external element(s) describing this control typically your
3240
- * app-rendered value or error textexposed as aria-describedby.
3912
+ * Announces the skeleton to assistive tech as a polite status. Leave unset
3913
+ * when a container already carries `aria-busy` the skeleton then stays
3914
+ * `aria-hidden`, as a decorative placeholder should.
3241
3915
  */
3242
- readonly ariaDescribedBy: _angular_core.InputSignal<string>;
3243
3916
  label: _angular_core.InputSignal<string>;
3244
- min: _angular_core.InputSignal<number>;
3245
- max: _angular_core.InputSignal<number>;
3246
- step: _angular_core.InputSignal<number>;
3247
- protected readonly resolvedMin: _angular_core.Signal<number>;
3248
- protected readonly resolvedMax: _angular_core.Signal<number>;
3249
- markAsTouched(): void;
3250
- handleInput(event: Event): void;
3251
- protected readonly fillPercent: _angular_core.Signal<string>;
3252
- protected readonly inputClass: _angular_core.Signal<string>;
3253
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniSliderComponent, never>;
3254
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniSliderComponent, "uni-slider", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": true; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; }, never, never, true, never>;
3917
+ protected readonly srOnly: string;
3918
+ private readonly cssSize;
3919
+ protected readonly resolvedHeight: _angular_core.Signal<string>;
3920
+ protected readonly lineWidths: _angular_core.Signal<string[]>;
3921
+ /**
3922
+ * The band is `bandWidth`% of the block, so it clears the block after
3923
+ * travelling `100 / bandWidth` of its own width — the offsets below are
3924
+ * percentages of the band, not of the block.
3925
+ */
3926
+ private readonly sweep;
3927
+ protected readonly className: _angular_core.Signal<string>;
3928
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniSkeletonComponent, never>;
3929
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniSkeletonComponent, "uni-skeleton", never, { "shape": { "alias": "shape"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "lines": { "alias": "lines"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "highlightColor": { "alias": "highlightColor"; "required": false; "isSignal": true; }; "borderRadius": { "alias": "borderRadius"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
3255
3930
  }
3256
3931
 
3257
3932
  /** Theme-level options for `uni-stat`, resolved by token name. */
@@ -3383,34 +4058,6 @@ declare class UniTabsComponent extends BaseComponent<UniTabsOptions> {
3383
4058
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniTabsComponent, "uni-tabs", never, { "selectedIndex": { "alias": "selectedIndex"; "required": false; "isSignal": true; }; }, { "selectedIndex": "selectedIndexChange"; }, ["tabs"], never, true, never>;
3384
4059
  }
3385
4060
 
3386
- declare class UniTextareaComponent implements FormValueControl<string> {
3387
- private theme;
3388
- readonly value: _angular_core.ModelSignal<string>;
3389
- readonly disabled: _angular_core.InputSignal<boolean>;
3390
- readonly touched: _angular_core.ModelSignal<boolean>;
3391
- readonly invalid: _angular_core.InputSignal<boolean>;
3392
- readonly dirty: _angular_core.InputSignal<boolean>;
3393
- /** Synced from required() validators by the Signal Forms [field] directive. */
3394
- readonly required: _angular_core.InputSignal<boolean>;
3395
- /**
3396
- * Id(s) of external element(s) describing this control — typically your
3397
- * app-rendered error message — exposed as aria-describedby.
3398
- */
3399
- readonly ariaDescribedBy: _angular_core.InputSignal<string>;
3400
- label: _angular_core.InputSignal<string>;
3401
- placeholder: _angular_core.InputSignal<string>;
3402
- /** Visible text rows. Defaults to the theme's `textarea` options. */
3403
- rows: _angular_core.InputSignal<number>;
3404
- private options;
3405
- protected readonly resolvedRows: _angular_core.Signal<number>;
3406
- protected readonly showError: _angular_core.Signal<boolean>;
3407
- protected readonly textareaClass: _angular_core.Signal<string>;
3408
- markAsTouched(): void;
3409
- handleInput(event: Event): void;
3410
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniTextareaComponent, never>;
3411
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniTextareaComponent, "uni-textarea", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": true; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; }, never, never, true, never>;
3412
- }
3413
-
3414
4061
  /** Theme-level options for `uni-textarea`. */
3415
4062
  interface UniTextareaOptions {
3416
4063
  /** Default visible text rows when the component doesn't set `rows`. */
@@ -3436,263 +4083,106 @@ type SymbolWeight = 100 | 200 | 300 | 400 | 500 | 600 | 700;
3436
4083
  type SymbolGrade = -25 | 0 | 200;
3437
4084
  interface SymbolOptions {
3438
4085
  fill?: SymbolFill;
3439
- weight?: SymbolWeight;
3440
- grade?: SymbolGrade;
3441
- opticalSize?: number;
3442
- }
3443
-
3444
- declare class UniSymbolComponent extends BaseComponent<SymbolOptions> {
3445
- name: _angular_core.InputSignal<string>;
3446
- fill: _angular_core.InputSignal<SymbolFill>;
3447
- weight: _angular_core.InputSignal<SymbolWeight>;
3448
- grade: _angular_core.InputSignal<SymbolGrade>;
3449
- opticalSize: _angular_core.InputSignal<number>;
3450
- protected readonly className: _angular_core.Signal<string>;
3451
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniSymbolComponent, never>;
3452
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniSymbolComponent, "uni-symbol", never, { "name": { "alias": "name"; "required": true; "isSignal": true; }; "fill": { "alias": "fill"; "required": false; "isSignal": true; }; "weight": { "alias": "weight"; "required": false; "isSignal": true; }; "grade": { "alias": "grade"; "required": false; "isSignal": true; }; "opticalSize": { "alias": "opticalSize"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
3453
- }
3454
-
3455
- /** Theme options for the `tag` component entry. */
3456
- interface UniTagOptions {
3457
- borderRadius?: Radius;
3458
- typeface?: Typeface;
3459
- /** Space between the lead element, label and remove button. */
3460
- gap?: NullableSize;
3461
- /** Icon primitive for the remove affordance. */
3462
- removeIcon?: IconName;
3463
- /** Icon primitive shown in the lead slot when the chip is selected. */
3464
- selectedIcon?: IconName;
3465
- }
3466
- /** The value a tag echoes back on `removed` / `activated`. */
3467
- type UniTagValue = string | number | undefined;
3468
-
3469
- /**
3470
- * Compact chip for categories, states, filters and tokens.
3471
- *
3472
- * Two orthogonal style axes: `variant` picks the colour role and `tone` picks
3473
- * the archetype (soft / solid / outline). Both live in the theme's `tag` entry,
3474
- * so a theme restyles every chip in the app without touching markup.
3475
- *
3476
- * Structurally a chip is **body + trailing action as siblings**, never nested
3477
- * buttons: an interactive chip whose body is a `<button>` cannot contain the
3478
- * remove `<button>` (invalid HTML, and the inner control becomes unreachable
3479
- * for keyboard users). Both stay independently operable.
3480
- */
3481
- declare class UniTagComponent extends BaseComponent<UniTagOptions> {
3482
- size: _angular_core.InputSignal<Size>;
3483
- tone: _angular_core.InputSignal<TagTone>;
3484
- label: _angular_core.InputSignal<string>;
3485
- value: _angular_core.InputSignal<string | number>;
3486
- /** Truncation budget, e.g. `'14ch'`. A number is treated as px. */
3487
- maxWidth: _angular_core.InputSignal<string | number>;
3488
- avatarSrc: _angular_core.InputSignal<string>;
3489
- /** Initials fallback when `avatarSrc` is absent or fails to load. */
3490
- avatarName: _angular_core.InputSignal<string>;
3491
- /** Theme icon primitive — the preferred glyph path. */
3492
- iconName: _angular_core.InputSignal<IconName>;
3493
- /** Material Symbols ligature, for glyphs the theme's icon set doesn't carry. */
3494
- symbolName: _angular_core.InputSignal<string>;
3495
- /** Status dot in the current colour. */
3496
- dot: _angular_core.InputSignal<boolean>;
3497
- removable: _angular_core.InputSignal<boolean>;
3498
- interactive: _angular_core.InputSignal<boolean>;
3499
- /**
3500
- * Toggle state. Left undefined the chip carries no `aria-pressed` at all —
3501
- * an interactive chip is not always a toggle (inside a tag input it is
3502
- * focusable so it can be removed), and announcing "not pressed" on a
3503
- * recipient chip is worse than announcing nothing.
3504
- */
3505
- selected: _angular_core.InputSignal<boolean>;
3506
- invalid: _angular_core.InputSignal<boolean>;
3507
- disabled: _angular_core.InputSignal<boolean>;
3508
- /** Accessible-name override for the remove button. */
3509
- removeLabel: _angular_core.InputSignal<string>;
3510
- /**
3511
- * Tab position of the chip's controls. A composite that owns its own
3512
- * roving focus — `uni-tag-input`, where the whole field is one tab stop —
3513
- * passes `-1` so Tab does not walk through every chip to reach the next
3514
- * control.
3515
- */
3516
- controlTabIndex: _angular_core.InputSignal<number>;
3517
- removed: _angular_core.OutputEmitterRef<UniTagValue>;
3518
- activated: _angular_core.OutputEmitterRef<UniTagValue>;
3519
- /** A disabled chip wears the theme's `disabled` role, whatever its variant. */
3520
- protected readonly resolvedVariant: _angular_core.Signal<_uni_design_system_uni_core.Variant>;
3521
- protected readonly themeStyle: _angular_core.Signal<{
3522
- [x: string]: string | number | _uni_design_system_uni_core.StyleExpression;
3523
- }>;
3524
- /** Lead elements derive from the chip height, so no second size token. */
3525
- protected readonly leadSize: _angular_core.Signal<number>;
3526
- /** Remove glyph, proportional to the chip rather than to the icon-button. */
3527
- protected readonly removeGlyphSize: _angular_core.Signal<number>;
3528
- protected readonly initials: _angular_core.Signal<string>;
3529
- protected readonly hostClass: _angular_core.Signal<string>;
3530
- /** Truncating label; `title` exposes the full text when a budget is set. */
3531
- protected readonly labelClass: string;
3532
- protected readonly bodyClass: _angular_core.Signal<string>;
3533
- protected readonly leadClass: _angular_core.Signal<string>;
3534
- protected readonly dotClass: _angular_core.Signal<string>;
3535
- protected remove(): void;
3536
- protected activate(): void;
3537
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniTagComponent, never>;
3538
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniTagComponent, "uni-tag", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "tone": { "alias": "tone"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "maxWidth": { "alias": "maxWidth"; "required": false; "isSignal": true; }; "avatarSrc": { "alias": "avatarSrc"; "required": false; "isSignal": true; }; "avatarName": { "alias": "avatarName"; "required": false; "isSignal": true; }; "iconName": { "alias": "iconName"; "required": false; "isSignal": true; }; "symbolName": { "alias": "symbolName"; "required": false; "isSignal": true; }; "dot": { "alias": "dot"; "required": false; "isSignal": true; }; "removable": { "alias": "removable"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "removeLabel": { "alias": "removeLabel"; "required": false; "isSignal": true; }; "controlTabIndex": { "alias": "controlTabIndex"; "required": false; "isSignal": true; }; }, { "removed": "removed"; "activated": "activated"; }, never, ["[tag-lead]", "*"], true, never>;
3539
- }
3540
-
3541
- /**
3542
- * One committed token. `value` is canonical — what a form submits — and
3543
- * everything else is presentation the field may enrich from a suggestion.
3544
- *
3545
- * `{ value: 'a@b.com' }` is a complete item, so the least a caller has to write
3546
- * is `[value]="[{ value: 'a@b.com' }]"`.
3547
- */
3548
- interface UniTagItem {
3549
- /** Canonical value, e.g. an email address. */
3550
- value: string;
3551
- /** Display text; falls back to `value`. */
3552
- label?: string;
3553
- avatarSrc?: string;
3554
- /**
3555
- * Failed `validate()`. The item stays **in** the value rather than being
3556
- * rejected — a field that silently swallows a typo'd address is worse than
3557
- * one that shows it in red, and the user can click in to fix it.
3558
- */
3559
- invalid?: boolean;
3560
- /** Locked token (e.g. a thread owner): rendered without a remove control. */
3561
- disabled?: boolean;
3562
- }
3563
- /** A type-ahead entry. Same contract as `uni-search-input`: the app filters. */
3564
- interface UniTagSuggestion {
3565
- value: string;
3566
- label?: string;
3567
- description?: string;
3568
- avatarSrc?: string;
3569
- }
3570
- /** Why a typed token did not become a chip. */
3571
- interface UniTagRejection {
3572
- raw: string;
3573
- reason: 'duplicate' | 'max' | 'invalid';
3574
- }
3575
- /** Theme options for the `tagInput` component entry. */
3576
- interface UniTagInputOptions {
3577
- /** Space between chips. */
3578
- chipGap?: NullableSize;
3579
- chipSize?: Size;
3580
- /** Keeps the text input usable when chips have wrapped. */
3581
- minInputWidth?: string | number;
3582
- listColor?: ContainerColorToken;
3583
- listShadow?: Shadow;
3584
- listBorderRadius?: Radius;
3585
- /** Active/hover suggestion fill; the on-color pair is derived. Must
3586
- contrast with `listColor` or keyboard navigation turns invisible. */
3587
- activeColor?: ContainerColorToken;
3588
- maxSuggestions?: number;
3589
- }
3590
-
3591
- declare class UniTagInputComponent extends BaseComponent<UniTagInputOptions> implements FormValueControl<UniTagItem[]> {
3592
- readonly value: _angular_core.ModelSignal<UniTagItem[]>;
3593
- readonly disabled: _angular_core.InputSignal<boolean>;
3594
- readonly touched: _angular_core.ModelSignal<boolean>;
3595
- readonly invalid: _angular_core.InputSignal<boolean>;
3596
- readonly dirty: _angular_core.InputSignal<boolean>;
3597
- readonly required: _angular_core.InputSignal<boolean>;
3598
- readonly ariaDescribedBy: _angular_core.InputSignal<string>;
3599
- /** Accessible name for the field, e.g. "To". */
3600
- label: _angular_core.InputSignal<string>;
3601
- placeholder: _angular_core.InputSignal<string>;
3602
- /** `email` wires an address validator, paste parser and space separator. */
3603
- preset: _angular_core.InputSignal<"text" | "email">;
3604
- separators: _angular_core.InputSignal<string[]>;
3605
- commitOnBlur: _angular_core.InputSignal<boolean>;
3606
- allowDuplicates: _angular_core.InputSignal<boolean>;
3607
- max: _angular_core.InputSignal<number>;
3608
- validate: _angular_core.InputSignal<(raw: string) => boolean>;
3609
- parse: _angular_core.InputSignal<(pasted: string) => string[]>;
3610
- tagVariant: _angular_core.InputSignal<Variant>;
3611
- tagTone: _angular_core.InputSignal<TagTone>;
3612
- tagSize: _angular_core.InputSignal<Size>;
3613
- suggestions: _angular_core.InputSignal<UniTagSuggestion[]>;
3614
- /** Debounced text the app should filter `suggestions` from. */
3615
- query: _angular_core.OutputEmitterRef<string>;
3616
- debounceTime: _angular_core.InputSignal<number>;
3617
- added: _angular_core.OutputEmitterRef<UniTagItem>;
3618
- removed: _angular_core.OutputEmitterRef<UniTagItem>;
3619
- rejected: _angular_core.OutputEmitterRef<UniTagRejection>;
3620
- private readonly inputRef;
3621
- private readonly chipRefs;
3622
- /** Uncommitted text in the field. */
3623
- protected readonly draft: _angular_core.WritableSignal<string>;
3624
- /** Index of the focused chip, or -1 when focus is in the text input. */
3625
- protected readonly focusedChip: _angular_core.WritableSignal<number>;
3626
- /** Announcement for the status region; add/remove are otherwise silent. */
3627
- protected readonly announcement: _angular_core.WritableSignal<string>;
3628
- protected readonly hintId: string;
3629
- protected readonly srOnly: string;
3630
- private queryTimer?;
3631
- protected readonly visibleSuggestions: _angular_core.Signal<UniTagSuggestion[]>;
3632
- /** Shared combobox bookkeeping — identical contract to uni-search-input. */
3633
- protected readonly list: _uni_design_system_uni_angular.ListboxNavigation;
3634
- protected readonly showError: _angular_core.Signal<boolean>;
3635
- protected readonly separatorKeys: _angular_core.Signal<string[]>;
3636
- protected readonly describedBy: _angular_core.Signal<string>;
3637
- protected labelOf(item: UniTagItem | UniTagSuggestion): string;
3638
- /** Split pasted text into candidate tokens. */
3639
- private parseRaw;
3640
- private isValid;
3641
- /**
3642
- * Turn typed text into a chip. Invalid entries are kept and flagged rather
3643
- * than dropped; duplicates and over-max are refused with a reason.
3644
- */
3645
- protected commit(raw: string): boolean;
3646
- private reject;
3647
- protected removeAt(index: number, focus?: 'left' | 'right' | 'input'): void;
3648
- private countNoun;
3649
- private announce;
3650
- protected focusInput(): void;
3651
- private focusChip;
3652
- protected onInputKeydown(event: KeyboardEvent): void;
3653
- protected onInput(value: string): void;
3654
- protected onPaste(event: ClipboardEvent): void;
3655
- protected onBlur(): void;
3656
- protected onFocusOut(event: FocusEvent): void;
3657
- protected onChipKeydown(event: KeyboardEvent, index: number): void;
3658
- /** Lift a chip back into the input for correction. */
3659
- protected editChip(index: number): void;
3660
- protected selectSuggestion(suggestion: UniTagSuggestion): void;
3661
- private commitDraft;
3662
- private setDraft;
4086
+ weight?: SymbolWeight;
4087
+ grade?: SymbolGrade;
4088
+ opticalSize?: number;
4089
+ }
4090
+
4091
+ declare class UniSymbolComponent extends BaseComponent<SymbolOptions> {
4092
+ name: _angular_core.InputSignal<string>;
4093
+ fill: _angular_core.InputSignal<SymbolFill>;
4094
+ weight: _angular_core.InputSignal<SymbolWeight>;
4095
+ grade: _angular_core.InputSignal<SymbolGrade>;
4096
+ opticalSize: _angular_core.InputSignal<number>;
3663
4097
  protected readonly className: _angular_core.Signal<string>;
3664
- protected readonly fieldClass: _angular_core.Signal<string>;
3665
- protected readonly inputClass: _angular_core.Signal<string>;
3666
- protected readonly listClass: _angular_core.Signal<string>;
3667
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniTagInputComponent, never>;
3668
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniTagInputComponent, "uni-tag-input", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": true; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "preset": { "alias": "preset"; "required": false; "isSignal": true; }; "separators": { "alias": "separators"; "required": false; "isSignal": true; }; "commitOnBlur": { "alias": "commitOnBlur"; "required": false; "isSignal": true; }; "allowDuplicates": { "alias": "allowDuplicates"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "validate": { "alias": "validate"; "required": false; "isSignal": true; }; "parse": { "alias": "parse"; "required": false; "isSignal": true; }; "tagVariant": { "alias": "tagVariant"; "required": false; "isSignal": true; }; "tagTone": { "alias": "tagTone"; "required": false; "isSignal": true; }; "tagSize": { "alias": "tagSize"; "required": false; "isSignal": true; }; "suggestions": { "alias": "suggestions"; "required": false; "isSignal": true; }; "debounceTime": { "alias": "debounceTime"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; "query": "query"; "added": "added"; "removed": "removed"; "rejected": "rejected"; }, never, never, true, never>;
4098
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniSymbolComponent, never>;
4099
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniSymbolComponent, "uni-symbol", never, { "name": { "alias": "name"; "required": true; "isSignal": true; }; "fill": { "alias": "fill"; "required": false; "isSignal": true; }; "weight": { "alias": "weight"; "required": false; "isSignal": true; }; "grade": { "alias": "grade"; "required": false; "isSignal": true; }; "opticalSize": { "alias": "opticalSize"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
4100
+ }
4101
+
4102
+ /** Theme options for the `tag` component entry. */
4103
+ interface UniTagOptions {
4104
+ borderRadius?: Radius;
4105
+ typeface?: Typeface;
4106
+ /** Space between the lead element, label and remove button. */
4107
+ gap?: NullableSize;
4108
+ /** Icon primitive for the remove affordance. */
4109
+ removeIcon?: IconName;
4110
+ /** Icon primitive shown in the lead slot when the chip is selected. */
4111
+ selectedIcon?: IconName;
3669
4112
  }
4113
+ /** The value a tag echoes back on `removed` / `activated`. */
4114
+ type UniTagValue = string | number | undefined;
3670
4115
 
3671
4116
  /**
3672
- * The typography primitive, applied as an attribute to any element so
3673
- * semantics stay yours. The attribute value is the typeface:
3674
- * `<h1 uni-text="display-small">`, `<span uni-text="caption">`, dynamic via
3675
- * `[uni-text]="role()"`. With no value, the typeface is inferred from the
3676
- * host element (h1 headline-large, p body-1-long, …), falling back to
3677
- * `title-small`; the `typeface` input remains as an explicit override.
4117
+ * Compact chip for categories, states, filters and tokens.
4118
+ *
4119
+ * Two orthogonal style axes: `variant` picks the colour role and `tone` picks
4120
+ * the archetype (soft / solid / outline). Both live in the theme's `tag` entry,
4121
+ * so a theme restyles every chip in the app without touching markup.
4122
+ *
4123
+ * Structurally a chip is **body + trailing action as siblings**, never nested
4124
+ * buttons: an interactive chip whose body is a `<button>` cannot contain the
4125
+ * remove `<button>` (invalid HTML, and the inner control becomes unreachable
4126
+ * for keyboard users). Both stay independently operable.
3678
4127
  */
3679
- declare class UniTextComponent {
3680
- theme: ThemeService;
3681
- private readonly tag;
3682
- /** Typeface via the selector attribute: `uni-text="headline-large"`. */
3683
- readonly uniText: _angular_core.InputSignal<string>;
3684
- /** Explicit typeface; the attribute value wins when both are set. */
3685
- typeface: _angular_core.InputSignal<string>;
3686
- color: _angular_core.InputSignal<string>;
3687
- display: _angular_core.InputSignal<OptionalDisplay>;
3688
- align: _angular_core.InputSignal<OptionalTextAlign>;
3689
- nowrap: _angular_core.InputSignal<boolean>;
3690
- maxWidth: _angular_core.InputSignal<number>;
3691
- ellipsis: _angular_core.InputSignal<boolean>;
3692
- protected readonly resolvedTypeface: _angular_core.Signal<string>;
3693
- protected readonly className: _angular_core.Signal<string>;
3694
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniTextComponent, never>;
3695
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniTextComponent, "[uni-text]", never, { "uniText": { "alias": "uni-text"; "required": false; "isSignal": true; }; "typeface": { "alias": "typeface"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "display": { "alias": "display"; "required": false; "isSignal": true; }; "align": { "alias": "align"; "required": false; "isSignal": true; }; "nowrap": { "alias": "nowrap"; "required": false; "isSignal": true; }; "maxWidth": { "alias": "maxWidth"; "required": false; "isSignal": true; }; "ellipsis": { "alias": "ellipsis"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
4128
+ declare class UniTagComponent extends BaseComponent<UniTagOptions> {
4129
+ size: _angular_core.InputSignal<Size>;
4130
+ tone: _angular_core.InputSignal<TagTone>;
4131
+ label: _angular_core.InputSignal<string>;
4132
+ value: _angular_core.InputSignal<string | number>;
4133
+ /** Truncation budget, e.g. `'14ch'`. A number is treated as px. */
4134
+ maxWidth: _angular_core.InputSignal<string | number>;
4135
+ avatarSrc: _angular_core.InputSignal<string>;
4136
+ /** Initials fallback when `avatarSrc` is absent or fails to load. */
4137
+ avatarName: _angular_core.InputSignal<string>;
4138
+ /** Theme icon primitive — the preferred glyph path. */
4139
+ iconName: _angular_core.InputSignal<IconName>;
4140
+ /** Material Symbols ligature, for glyphs the theme's icon set doesn't carry. */
4141
+ symbolName: _angular_core.InputSignal<string>;
4142
+ /** Status dot in the current colour. */
4143
+ dot: _angular_core.InputSignal<boolean>;
4144
+ removable: _angular_core.InputSignal<boolean>;
4145
+ interactive: _angular_core.InputSignal<boolean>;
4146
+ /**
4147
+ * Toggle state. Left undefined the chip carries no `aria-pressed` at all —
4148
+ * an interactive chip is not always a toggle (inside a tag input it is
4149
+ * focusable so it can be removed), and announcing "not pressed" on a
4150
+ * recipient chip is worse than announcing nothing.
4151
+ */
4152
+ selected: _angular_core.InputSignal<boolean>;
4153
+ invalid: _angular_core.InputSignal<boolean>;
4154
+ disabled: _angular_core.InputSignal<boolean>;
4155
+ /** Accessible-name override for the remove button. */
4156
+ removeLabel: _angular_core.InputSignal<string>;
4157
+ /**
4158
+ * Tab position of the chip's controls. A composite that owns its own
4159
+ * roving focus — `uni-tag-input`, where the whole field is one tab stop —
4160
+ * passes `-1` so Tab does not walk through every chip to reach the next
4161
+ * control.
4162
+ */
4163
+ controlTabIndex: _angular_core.InputSignal<number>;
4164
+ removed: _angular_core.OutputEmitterRef<UniTagValue>;
4165
+ activated: _angular_core.OutputEmitterRef<UniTagValue>;
4166
+ /** A disabled chip wears the theme's `disabled` role, whatever its variant. */
4167
+ protected readonly resolvedVariant: _angular_core.Signal<_uni_design_system_uni_core.Variant>;
4168
+ protected readonly themeStyle: _angular_core.Signal<{
4169
+ [x: string]: string | number | _uni_design_system_uni_core.StyleExpression;
4170
+ }>;
4171
+ /** Lead elements derive from the chip height, so no second size token. */
4172
+ protected readonly leadSize: _angular_core.Signal<number>;
4173
+ /** Remove glyph, proportional to the chip rather than to the icon-button. */
4174
+ protected readonly removeGlyphSize: _angular_core.Signal<number>;
4175
+ protected readonly initials: _angular_core.Signal<string>;
4176
+ protected readonly hostClass: _angular_core.Signal<string>;
4177
+ /** Truncating label; `title` exposes the full text when a budget is set. */
4178
+ protected readonly labelClass: string;
4179
+ protected readonly bodyClass: _angular_core.Signal<string>;
4180
+ protected readonly leadClass: _angular_core.Signal<string>;
4181
+ protected readonly dotClass: _angular_core.Signal<string>;
4182
+ protected remove(): void;
4183
+ protected activate(): void;
4184
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniTagComponent, never>;
4185
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniTagComponent, "uni-tag", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "tone": { "alias": "tone"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "maxWidth": { "alias": "maxWidth"; "required": false; "isSignal": true; }; "avatarSrc": { "alias": "avatarSrc"; "required": false; "isSignal": true; }; "avatarName": { "alias": "avatarName"; "required": false; "isSignal": true; }; "iconName": { "alias": "iconName"; "required": false; "isSignal": true; }; "symbolName": { "alias": "symbolName"; "required": false; "isSignal": true; }; "dot": { "alias": "dot"; "required": false; "isSignal": true; }; "removable": { "alias": "removable"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "removeLabel": { "alias": "removeLabel"; "required": false; "isSignal": true; }; "controlTabIndex": { "alias": "controlTabIndex"; "required": false; "isSignal": true; }; }, { "removed": "removed"; "activated": "activated"; }, never, ["[tag-lead]", "*"], true, never>;
3696
4186
  }
3697
4187
 
3698
4188
  interface Preset {
@@ -3794,144 +4284,6 @@ declare class UniThemeSwitchComponent {
3794
4284
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniThemeSwitchComponent, "uni-theme-switch", never, { "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "themeChanged": "themeChanged"; }, never, never, true, never>;
3795
4285
  }
3796
4286
 
3797
- /** Why typed text did not become a time. The raw text stays in the field. */
3798
- interface UniTimeInputRejection {
3799
- raw: string;
3800
- reason: 'unparseable' | 'out-of-range' | 'unavailable';
3801
- }
3802
- /**
3803
- * Theme options for the `timeInput` entry. Field chrome is not duplicated
3804
- * here — it comes from `input` via uni-input-box; the list trio matches
3805
- * tagInput/searchInput.
3806
- */
3807
- interface UniTimeInputOptions {
3808
- toggleSymbol?: string;
3809
- listColor?: ContainerColorToken;
3810
- listShadow?: Shadow;
3811
- listBorderRadius?: Radius;
3812
- /** Active/hover option fill; the on-color pair is derived. Must contrast
3813
- with `listColor` or keyboard navigation turns invisible. */
3814
- activeColor?: ContainerColorToken;
3815
- maxVisibleOptions?: number;
3816
- }
3817
-
3818
- /**
3819
- * Time field: a combobox over time options — the same listbox contract as
3820
- * uni-search-input and uni-tag-input. Type `3p`, `930` or `15:00`, or pick
3821
- * `3:00 PM` from the list; the form always gets 24-hour `'HH:mm'` (`hour12`
3822
- * affects display only). The list is assistive, not exhaustive: any
3823
- * parseable time commits, unless `slots` pins the choices (a slot picker) —
3824
- * then a typed time must match one. Unreadable or unavailable text stays in
3825
- * the field, flagged, with a `rejected` event.
3826
- */
3827
- declare class UniTimeInputComponent extends BaseComponent<UniTimeInputOptions> implements FormValueControl<UniTime | undefined> {
3828
- readonly value: _angular_core.ModelSignal<string>;
3829
- readonly disabled: _angular_core.InputSignal<boolean>;
3830
- readonly touched: _angular_core.ModelSignal<boolean>;
3831
- readonly invalid: _angular_core.InputSignal<boolean>;
3832
- readonly dirty: _angular_core.InputSignal<boolean>;
3833
- readonly required: _angular_core.InputSignal<boolean>;
3834
- readonly ariaDescribedBy: _angular_core.InputSignal<string>;
3835
- /** Accessible name for the field, e.g. "Start time". */
3836
- label: _angular_core.InputSignal<string>;
3837
- placeholder: _angular_core.InputSignal<string>;
3838
- /** Generated list granularity, in minutes. */
3839
- minuteStep: _angular_core.InputSignal<number>;
3840
- /** Earliest allowed time (inclusive), `'09:00'`. */
3841
- minTime: _angular_core.InputSignal<string>;
3842
- /** Latest allowed time (inclusive), `'17:00'`. */
3843
- maxTime: _angular_core.InputSignal<string>;
3844
- /** Exact allowed times (scheduling). When set, typed entry must match one. */
3845
- slots: _angular_core.InputSignal<string[]>;
3846
- /** 12-hour display; defaults from the locale. The value stays 24-hour. */
3847
- hour12: _angular_core.InputSignal<boolean>;
3848
- /** BCP 47 tag for the display format; defaults to the document language. */
3849
- locale: _angular_core.InputSignal<string>;
3850
- commitOnBlur: _angular_core.InputSignal<boolean>;
3851
- /** Renders without its own input-box chrome, for composers like uni-date-time-input. */
3852
- embedded: _angular_core.InputSignal<boolean>;
3853
- /** A typed commit was refused; the raw text stays in the field. */
3854
- rejected: _angular_core.OutputEmitterRef<UniTimeInputRejection>;
3855
- private readonly host;
3856
- private readonly inputRef;
3857
- private readonly listRef;
3858
- protected readonly srOnly: string;
3859
- /** A refused commit — styles the field and sets aria-invalid until edited. */
3860
- protected readonly draftInvalid: _angular_core.WritableSignal<boolean>;
3861
- protected readonly announcement: _angular_core.WritableSignal<string>;
3862
- protected readonly resolvedLocale: _angular_core.Signal<string>;
3863
- protected readonly resolvedHour12: _angular_core.Signal<boolean>;
3864
- /** The listed times: pinned `slots` verbatim, else the generated step grid. */
3865
- protected readonly options: _angular_core.Signal<string[]>;
3866
- protected readonly optionLabels: _angular_core.Signal<string[]>;
3867
- /** Shared combobox bookkeeping — identical contract to uni-search-input. */
3868
- protected readonly list: _uni_design_system_uni_angular.ListboxNavigation;
3869
- protected readonly displayText: _angular_core.Signal<string>;
3870
- protected readonly resolvedPlaceholder: _angular_core.Signal<string>;
3871
- protected readonly showError: _angular_core.Signal<boolean>;
3872
- protected formatValue(time: UniTime): string;
3873
- protected setValue(time: UniTime | undefined, silent?: boolean): void;
3874
- private refuse;
3875
- protected commit(raw: string): boolean;
3876
- /** Step a committed value ±minuteStep (±1 slot when pinned), clamped. */
3877
- private stepValue;
3878
- protected onInputKeydown(event: KeyboardEvent): void;
3879
- protected onInput(): void;
3880
- protected onToggle(): void;
3881
- protected selectOption(time: UniTime): void;
3882
- protected onFocusOut(event: FocusEvent): void;
3883
- private openList;
3884
- private scrollToActive;
3885
- private scrollToIndex;
3886
- private setFieldText;
3887
- private announce;
3888
- protected readonly className: _angular_core.Signal<string>;
3889
- protected readonly rowClass: _angular_core.Signal<string>;
3890
- protected readonly inputClass: _angular_core.Signal<string>;
3891
- protected readonly toggleWrapClass: _angular_core.Signal<string>;
3892
- /** Embedded mode: the composer owns the box; keep only the flex row. */
3893
- protected readonly embeddedClass: _angular_core.Signal<string>;
3894
- protected readonly listClass: _angular_core.Signal<string>;
3895
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniTimeInputComponent, never>;
3896
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniTimeInputComponent, "uni-time-input, TimeInput", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": true; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "minuteStep": { "alias": "minuteStep"; "required": false; "isSignal": true; }; "minTime": { "alias": "minTime"; "required": false; "isSignal": true; }; "maxTime": { "alias": "maxTime"; "required": false; "isSignal": true; }; "slots": { "alias": "slots"; "required": false; "isSignal": true; }; "hour12": { "alias": "hour12"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "commitOnBlur": { "alias": "commitOnBlur"; "required": false; "isSignal": true; }; "embedded": { "alias": "embedded"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; "rejected": "rejected"; }, never, never, true, never>;
3897
- }
3898
-
3899
- interface UniToggleOptions {
3900
- /**
3901
- * The size of the toggle switch
3902
- */
3903
- size?: number;
3904
- /** Off-state track color token. */
3905
- trackColor?: ColorKey;
3906
- /** Knob color token. */
3907
- knobColor?: ColorKey;
3908
- }
3909
-
3910
- declare class UniToggleComponent extends BaseComponent<UniToggleOptions> implements FormCheckboxControl {
3911
- readonly checked: _angular_core.ModelSignal<boolean>;
3912
- readonly disabled: _angular_core.InputSignal<boolean>;
3913
- readonly touched: _angular_core.ModelSignal<boolean>;
3914
- readonly invalid: _angular_core.InputSignal<boolean>;
3915
- readonly dirty: _angular_core.InputSignal<boolean>;
3916
- /** Synced from required() validators by the Signal Forms [field] directive. */
3917
- readonly required: _angular_core.InputSignal<boolean>;
3918
- /**
3919
- * Id(s) of external element(s) describing this control — typically your
3920
- * app-rendered error message — exposed as aria-describedby.
3921
- */
3922
- readonly ariaDescribedBy: _angular_core.InputSignal<string>;
3923
- readonly label: _angular_core.InputSignal<string>;
3924
- protected readonly showError: _angular_core.Signal<boolean>;
3925
- markAsTouched(): void;
3926
- handleChange(event: Event): void;
3927
- private readonly metrics;
3928
- protected readonly toggleLabel: _angular_core.Signal<string>;
3929
- protected readonly toggleInput: _angular_core.Signal<string>;
3930
- getThemeColor(token: ColorToken): string;
3931
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniToggleComponent, never>;
3932
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniToggleComponent, "uni-toggle", never, { "checked": { "alias": "checked"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, { "checked": "checkedChange"; "touched": "touchedChange"; }, never, never, true, never>;
3933
- }
3934
-
3935
4287
  interface UniTooltipOptions {
3936
4288
  color?: ContainerColorToken;
3937
4289
  border?: Border;
@@ -3960,8 +4312,6 @@ declare class UniTooltipComponent extends BaseComponent<UniTooltipOptions> {
3960
4312
  label: _angular_core.InputSignal<string>;
3961
4313
  placement: _angular_core.InputSignal<Placement>;
3962
4314
  inlineText: _angular_core.InputSignal<boolean>;
3963
- /** @deprecated The tooltip renders in the native top layer; ignored. */
3964
- appendToBody: _angular_core.InputSignal<boolean>;
3965
4315
  private tipRef;
3966
4316
  constructor();
3967
4317
  onFocusIn(event: FocusEvent): void;
@@ -3986,7 +4336,7 @@ declare class UniTooltipComponent extends BaseComponent<UniTooltipOptions> {
3986
4336
  protected readonly tooltipClassName: _angular_core.Signal<string>;
3987
4337
  protected readonly arrowClassName: _angular_core.Signal<string>;
3988
4338
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniTooltipComponent, never>;
3989
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniTooltipComponent, "uni-tooltip", never, { "hoverDelay": { "alias": "hoverDelay"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": true; "isSignal": true; }; "placement": { "alias": "placement"; "required": false; "isSignal": true; }; "inlineText": { "alias": "inlineText"; "required": false; "isSignal": true; }; "appendToBody": { "alias": "appendToBody"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
4339
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniTooltipComponent, "uni-tooltip", never, { "hoverDelay": { "alias": "hoverDelay"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": true; "isSignal": true; }; "placement": { "alias": "placement"; "required": false; "isSignal": true; }; "inlineText": { "alias": "inlineText"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
3990
4340
  }
3991
4341
 
3992
4342
  /**
@@ -4049,7 +4399,9 @@ declare class UniTourComponent extends BaseComponent<UniTourOptions> {
4049
4399
  }>;
4050
4400
  protected readonly calloutOpen: _angular_core.WritableSignal<boolean>;
4051
4401
  protected readonly satisfied: _angular_core.WritableSignal<boolean>;
4052
- protected readonly announcement: _angular_core.WritableSignal<string>;
4402
+ /** Repeats must still be heard: the same gate message can come round
4403
+ again on a later step. */
4404
+ protected readonly announcer: _uni_design_system_uni_angular.Announcer;
4053
4405
  protected readonly resolvedTarget: _angular_core.WritableSignal<HTMLElement>;
4054
4406
  private readonly presentedIndex;
4055
4407
  private gateCleanup;
@@ -4094,14 +4446,15 @@ declare class BodyRenderDirective implements OnInit {
4094
4446
  }
4095
4447
 
4096
4448
  declare class DragAndDropDirective {
4097
- onFileDropped: _angular_core.OutputEmitterRef<FileList>;
4449
+ /** The dropped files. */
4450
+ fileDropped: _angular_core.OutputEmitterRef<FileList>;
4098
4451
  protected workspaceOpacity: _angular_core.WritableSignal<string>;
4099
4452
  onDragOver(event: DragEvent): void;
4100
4453
  onDragLeave(event: DragEvent): void;
4101
4454
  onDrop(event: DragEvent): void;
4102
4455
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DragAndDropDirective, never>;
4103
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<DragAndDropDirective, "[uni-drag-n-drop], [dragAndDrop]", never, {}, { "onFileDropped": "onFileDropped"; }, never, never, true, never>;
4456
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<DragAndDropDirective, "[uni-drag-n-drop], [dragAndDrop]", never, {}, { "fileDropped": "fileDropped"; }, never, never, true, never>;
4104
4457
  }
4105
4458
 
4106
- export { BodyRenderDirective, ConfirmationDialogComponent, DragAndDropDirective, FOCUSABLE_SELECTOR, ListboxNavigation, LocalStorageService, NotificationService, NotificationsComponent, RippleDirective, TRANSFORM_ORIGINS, ThemeService, UNI_THEMES, UniAlertComponent, UniAppBarComponent, UniAvatarComponent, UniAvatarGroupComponent, UniBackgroundComponent, UniBadgeComponent, UniBaseDatasource, UniBoxComponent, UniBreadcrumbComponent, UniButtonComponent, UniButtonGroupComponent, UniCalendarComponent, UniCalloutComponent, UniCardComponent, UniCardContentComponent, UniCardHeaderComponent, UniCenterComponent, UniCheckboxComponent, UniComboboxComponent, UniDataSearchComponent, UniDataTableComponent, UniDateInputComponent, UniDateTimeInputComponent, UniDebounceInputComponent, UniDialogButtonsComponent, UniDialogComponent, UniDialogHeaderComponent, UniDividerComponent, UniDrawerComponent, UniDropdownComponent, UniExpandAreaComponent, UniExpandComponent, UniExpandToggleComponent, UniFileDropZoneComponent, UniGridAreaComponent, UniGridComponent, UniIconButtonComponent, UniIconComponent, UniInputBoxComponent, UniInputComponent, UniJsonViewComponent, UniMenuComponent, UniMultiSelectComponent, UniMultiSelectDropdownComponent, UniNotificationBadgeComponent, UniPaginatorComponent, UniPopoverComponent, UniProgressBarComponent, UniProgressGaugeComponent, UniRadioComponent, UniRecordDatasource, UniRowComponent, UniScrollAreaComponent, UniSearchInputComponent, UniSelectComponent, UniServerSideDatasource, UniSkeletonComponent, UniSliderComponent, UniSnackbarComponent, UniSortHeaderComponent, UniStackComponent, UniStatComponent, UniSymbolComponent, UniTabComponent, UniTabsComponent, UniTagComponent, UniTagInputComponent, UniTextComponent, UniTextareaComponent, UniThemeBuilderComponent, UniThemeSwitchComponent, UniTimeInputComponent, UniToggleComponent, UniTooltipComponent, UniTourComponent, UniWrapComponent, acceptableFile, addDays, addMonths, anchorArrowStyles, anchorStyles, buildMonthGrid, clearAnchorName, createListboxNavigation, dayOfWeek, daysInMonth, discreteOverlayTransition, focusableElements, formatDate, formatMonthHeading, formatTime, getFileExtension, inclusiveDayCount, isDivider, isToggleOpen, isValidDate, isoDate, joinDateTime, listboxPopupStyles, localeDatePlaceholder, localeDefaultHour12, localeFieldOrder, localeMonthNames, localeWeekStart, monthOf, motionSafe, newAnchorName, parseDateText, parseTimeText, resolveElement, resolveFocusTarget, restoreOverlayFocus, setAnchorName, splitDateTime, spotlightStyles, timeSlots, todayIso, transformOriginFor, uniqueId, useTimer, visuallyHidden, weekdayNames };
4107
- export type { Alert, AnchorOffset, AnchorRect, BrandPaletteConfig, BreadcrumbItem, ButtonGroupConfig, ButtonGroupItem, ColumnDefinition, Confirmation, DataLoader, DrawerMode, DrawerPosition, ImagePosition, ListboxNavigationConfig, MenuDivider, MenuItem, MenuItemWithLabel, MenuItemWithTemplate, Option, Options, PageRequest, PageResponse, Placement, ScrollbarAppearance, SkeletonShape, Snackbar, Sort, SortDirection, SpotlightOptions, SpotlightStyles, UniAppBarOptions, UniAvatarGroupOptions, UniAvatarOptions, UniBreadcrumbOptions, UniCalendarMarker, UniCalendarMode, UniCalendarOptions, UniCalendarValue, UniCalloutDismissal, UniCalloutOptions, UniCheckboxOptions, UniComboboxOptions, UniComboboxRejection, UniDataSearchOptions, UniDataTableOptions, UniDatasource, UniDate, UniDateInputOptions, UniDateInputRejection, UniDateRange, UniDateTime, UniDateTimeInputOptions, UniDrawerOptions, UniExpandOptions, UniInputBoxOptions, UniListboxPopupOptions, UniMenuItemOptions, UniMenuOptions, UniMonthGridCell, UniMultiSelectDropdownOptions, UniNotificationBadgeOptions, UniPaginatorOptions, UniPopoverOptions, UniRadioOption, UniRadioOptions, UniSearchInputOptions, UniSkeletonOptions, UniSliderOptions, UniStatOptions, UniTabsOptions, UniTagInputOptions, UniTagItem, UniTagOptions, UniTagRejection, UniTagSuggestion, UniTagValue, UniTextareaOptions, UniTime, UniTimeInputOptions, UniTimeInputRejection, UniToggleOptions, UniTourAdvance, UniTourOptions, UniTourStep, UniWeekdayName };
4459
+ export { BodyRenderDirective, ConfirmationDialogComponent, DragAndDropDirective, FOCUSABLE_SELECTOR, ListboxNavigation, LocalStorageService, NotificationService, NotificationsComponent, RippleDirective, TRANSFORM_ORIGINS, ThemeService, UNI_FORMS, UNI_LAYOUT, UNI_THEMES, UniAlertComponent, UniAppBarComponent, UniAvatarComponent, UniAvatarGroupComponent, UniBackgroundComponent, UniBadgeComponent, UniBaseDatasource, UniBoxDirective, UniBreadcrumbComponent, UniButtonComponent, UniButtonGroupComponent, UniCalendarComponent, UniCalloutComponent, UniCardComponent, UniCardContentComponent, UniCardHeaderComponent, UniCenterDirective, UniCheckboxComponent, UniComboboxComponent, UniDataSearchComponent, UniDataTableComponent, UniDateInputComponent, UniDateTimeInputComponent, UniDebounceInputComponent, UniDialogButtonsComponent, UniDialogComponent, UniDialogHeaderComponent, UniDividerComponent, UniDrawerComponent, UniDropdownComponent, UniExpandAreaComponent, UniExpandComponent, UniExpandToggleComponent, UniFileDropZoneComponent, UniGridAreaDirective, UniGridDirective, UniIconButtonComponent, UniIconComponent, UniInputBoxComponent, UniInputComponent, UniJsonViewComponent, UniMenuComponent, UniMultiSelectComponent, UniMultiSelectDropdownComponent, UniNotificationBadgeComponent, UniPaginatorComponent, UniPopoverComponent, UniProgressBarComponent, UniProgressGaugeComponent, UniRadioComponent, UniRecordDatasource, UniRowDirective, UniScrollAreaComponent, UniSearchInputComponent, UniSelectComponent, UniServerSideDatasource, UniSkeletonComponent, UniSliderComponent, UniSnackbarComponent, UniSortHeaderComponent, UniStackDirective, UniStatComponent, UniSymbolComponent, UniTabComponent, UniTabsComponent, UniTagComponent, UniTagInputComponent, UniTextDirective, UniTextareaComponent, UniThemeBuilderComponent, UniThemeSwitchComponent, UniTimeInputComponent, UniToggleComponent, UniTooltipComponent, UniTourComponent, UniWrapDirective, acceptableFile, addDays, addMonths, anchorArrowStyles, anchorStyles, buildMonthGrid, clearAnchorName, createAnnouncer, createListboxNavigation, dayOfWeek, daysInMonth, discreteOverlayTransition, focusableElements, formatDate, formatMonthHeading, formatTime, getFileExtension, inclusiveDayCount, isDivider, isToggleOpen, isValidDate, isoDate, joinDateTime, listboxPopupAttr, listboxPopupStyles, localeDatePlaceholder, localeDefaultHour12, localeFieldOrder, localeMonthNames, localeWeekStart, monthOf, motionSafe, newAnchorName, newListboxAnchor, parseDateText, parseTimeText, promoteListboxPopup, resolveElement, resolveFocusTarget, restoreOverlayFocus, setAnchorName, splitDateTime, spotlightStyles, supportsAnchoredPopup, timeSlots, todayIso, transformOriginFor, uniqueId, useTimer, visuallyHidden, weekdayNames };
4460
+ export type { Alert, AnchorOffset, AnchorRect, Announcer, BrandPaletteConfig, BreadcrumbItem, ButtonGroupConfig, ButtonGroupItem, ColumnDefinition, Confirmation, DataLoader, DrawerMode, DrawerPosition, ImagePosition, ListboxNavigationConfig, MenuDivider, MenuItem, MenuItemWithLabel, MenuItemWithTemplate, Option, Options, PageRequest, PageResponse, Placement, ScrollbarAppearance, SkeletonShape, SkeletonSweepDirection, Snackbar, Sort, SortDirection, SpotlightOptions, SpotlightStyles, UniAppBarOptions, UniAvatarGroupOptions, UniAvatarOptions, UniBreadcrumbOptions, UniCalendarMarker, UniCalendarMode, UniCalendarOptions, UniCalendarValue, UniCalloutDismissal, UniCalloutOptions, UniCheckboxOptions, UniComboboxOptions, UniComboboxRejection, UniDataSearchOptions, UniDataTableOptions, UniDatasource, UniDate, UniDateInputOptions, UniDateInputRejection, UniDateRange, UniDateTime, UniDateTimeInputOptions, UniDrawerOptions, UniExpandOptions, UniInputBoxOptions, UniInputMode, UniInputType, UniListboxPopupOptions, UniMenuItemOptions, UniMenuOptions, UniMonthGridCell, UniMultiSelectDropdownOptions, UniNotificationBadgeOptions, UniPaginatorOptions, UniPopoverOptions, UniRadioOption, UniRadioOptions, UniSearchInputOptions, UniSkeletonOptions, UniSliderOptions, UniStatOptions, UniTabsOptions, UniTagInputOptions, UniTagItem, UniTagOptions, UniTagRejection, UniTagSuggestion, UniTagValue, UniTextareaOptions, UniTime, UniTimeInputOptions, UniTimeInputRejection, UniToggleOptions, UniTourAdvance, UniTourOptions, UniTourStep, UniWeekdayName };