@uni-design-system/uni-angular 7.3.0 → 8.1.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, 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, ColorScheme, ColorCategory, ThemeShape, ContrastCheck, Colors, GenerationInput } from '@uni-design-system/uni-core';
5
- import { FormCheckboxControl, FormValueControl } from '@angular/forms/signals';
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';
6
5
  import * as _uni_design_system_uni_angular from '@uni-design-system/uni-angular';
6
+ import { FormValueControl, FormCheckboxControl } from '@angular/forms/signals';
7
7
 
8
8
  /**
9
9
  * Returns a document-unique id for wiring ARIA relationships
@@ -44,6 +44,169 @@ declare function motionSafe<T extends object>(styles: T): {
44
44
  '@media (prefers-reduced-motion: no-preference)': T;
45
45
  };
46
46
 
47
+ /**
48
+ * Canonical date/time value shapes shared by `uni-calendar`,
49
+ * `uni-date-input`, `uni-time-input` and `uni-date-time-input`.
50
+ *
51
+ * Plain ISO strings, never `Date`s: a calendar date is a label on a wall
52
+ * calendar, not an instant. `new Date('2026-08-20')` is midnight UTC — which
53
+ * is 19 Aug in Honolulu — the classic off-by-one every `Date`-valued picker
54
+ * ships. Strings are timezone-free, JSON-serializable and sortable with `<`.
55
+ * Zoned scheduling is the app's concern; these components never touch
56
+ * `Date.getTimezoneOffset()`.
57
+ */
58
+ /** A calendar date, `'YYYY-MM-DD'`. */
59
+ type UniDate = string;
60
+ /** A wall-clock time, `'HH:mm'` (24-hour). Display format is separate. */
61
+ type UniTime = string;
62
+ /** A combined date and time, `'YYYY-MM-DDTHH:mm'`. */
63
+ type UniDateTime = string;
64
+ /** A start–end date range. Both ends are inclusive. */
65
+ interface UniDateRange {
66
+ start?: UniDate;
67
+ end?: UniDate;
68
+ }
69
+
70
+ /** `(2026, 8, 5)` → `'2026-08-05'`. Does not validate — see `isValidDate`. */
71
+ declare const isoDate: (year: number, month: number, day: number) => UniDate;
72
+ /** The ISO date when the parts form a real calendar day, else `null`. */
73
+ declare const isValidDate: (year: number, month: number, day: number) => UniDate | null;
74
+ /** Days in a month, leap-year aware. */
75
+ declare const daysInMonth: (year: number, month: number) => number;
76
+ declare const addDays: (date: UniDate, days: number) => UniDate;
77
+ /** Same day ± n months, clamping the day to the target month's length. */
78
+ declare const addMonths: (date: UniDate, months: number) => UniDate;
79
+ /** Day of week, 0 = Sunday … 6 = Saturday. */
80
+ declare const dayOfWeek: (date: UniDate) => number;
81
+ /** `'2026-08-20'` → `'2026-08'`. */
82
+ declare const monthOf: (date: UniDate) => string;
83
+ /** Today as a local-wall-clock ISO date (the one place local time matters). */
84
+ declare const todayIso: () => UniDate;
85
+ /** Inclusive day count of a range: `('-20', '-24')` → 5. */
86
+ declare const inclusiveDayCount: (start: UniDate, end: UniDate) => number;
87
+ interface UniMonthGridCell {
88
+ date: UniDate;
89
+ /** True for leading/trailing cells that belong to the adjacent months. */
90
+ outside: boolean;
91
+ }
92
+ /**
93
+ * The week matrix a calendar renders: full weeks covering `'YYYY-MM'`,
94
+ * starting on `weekStart` (0 = Sunday). Outside cells are always present so
95
+ * showing or hiding them is a pure render decision.
96
+ */
97
+ declare const buildMonthGrid: (month: string, weekStart: number) => UniMonthGridCell[][];
98
+ declare const formatDate: (date: UniDate, locale: string, options?: Intl.DateTimeFormatOptions) => string;
99
+ /** `'2026-08'` → `'August 2026'` in the locale. */
100
+ declare const formatMonthHeading: (month: string, locale: string) => string;
101
+ interface UniWeekdayName {
102
+ /** Column label in the requested format ('narrow' | 'short'). */
103
+ label: string;
104
+ /** Full weekday name, for the columnheader's `abbr`. */
105
+ full: string;
106
+ }
107
+ /** Weekday header labels starting at `weekStart` (0 = Sunday). */
108
+ declare const weekdayNames: (locale: string, weekStart: number, format: "narrow" | "short") => UniWeekdayName[];
109
+ /** `'15:00'` → `'3:00 PM'` (or `'15:00'` when `hour12` is false). */
110
+ declare const formatTime: (time: UniTime, locale: string, hour12: boolean) => string;
111
+ /**
112
+ * The locale's first day of week, 0 = Sunday … 6 = Saturday. Falls back to
113
+ * Sunday where `Intl.Locale` week info is unavailable.
114
+ */
115
+ declare const localeWeekStart: (locale: string) => number;
116
+ /** Whether the locale's default clock is 12-hour. */
117
+ declare const localeDefaultHour12: (locale: string) => boolean;
118
+ type DateField = 'year' | 'month' | 'day';
119
+ /** The locale's numeric-date field order, e.g. en-US → month, day, year. */
120
+ declare const localeFieldOrder: (locale: string) => DateField[];
121
+ /** Long + short month names → month number, lowercased, dots stripped. */
122
+ declare const localeMonthNames: (locale: string) => Map<string, number>;
123
+ /** The locale's digit pattern as a placeholder, e.g. `'MM/DD/YYYY'`. */
124
+ declare const localeDatePlaceholder: (locale: string) => string;
125
+ /**
126
+ * Free-typed date text → ISO date, or `null` when unreadable. Accepts, in
127
+ * order: ISO (`2026-08-20`), a month name from the locale's own long/short
128
+ * lists (`aug 20`, `20 aug 2026`, `August 20th`), and locale-numeric text
129
+ * (`8/20/2026`, `20.8.2026`, `08-20`) with the digit order taken from
130
+ * `Intl.DateTimeFormat(locale).formatToParts()`. A missing year resolves to
131
+ * the next occurrence; two-digit years are refused rather than guessed.
132
+ */
133
+ declare const parseDateText: (raw: string, locale: string, options?: {
134
+ today?: UniDate;
135
+ }) => UniDate | null;
136
+ /**
137
+ * Free-typed time text → `'HH:mm'`, or `null`. Accepts `9`, `930`, `9:30`,
138
+ * `9.30`, `9 30`, `3p`, `3pm`, `3 PM`, `15:00`. Bare hours 1–7 with no
139
+ * meridiem lean PM when `hour12` — typing `3` into an appointment field
140
+ * means 15:00, not 03:00.
141
+ */
142
+ declare const parseTimeText: (raw: string, hour12: boolean) => UniTime | null;
143
+ /** Every `minuteStep` time between `min` and `max` (inclusive bounds). */
144
+ declare const timeSlots: (minuteStep: number, min?: UniTime, max?: UniTime) => UniTime[];
145
+ declare const splitDateTime: (value?: UniDateTime) => {
146
+ date?: UniDate;
147
+ time?: UniTime;
148
+ };
149
+ /** One combined value only when both parts are present. */
150
+ declare const joinDateTime: (date?: UniDate, time?: UniTime) => UniDateTime | undefined;
151
+
152
+ interface ListboxNavigationConfig {
153
+ /** How many options are currently navigable. Read reactively. */
154
+ count: () => number;
155
+ /** Id prefix for the listbox and its options. */
156
+ idPrefix?: string;
157
+ /** Wrap past the ends. Default true. */
158
+ wrap?: boolean;
159
+ }
160
+ /**
161
+ * The keyboard and ARIA bookkeeping shared by every combobox-style popup:
162
+ * open state, the active option index, and the `aria-activedescendant` id
163
+ * wiring. Deliberately owns no markup and no filtering — each control renders
164
+ * its own options and decides what a suggestion *is*.
165
+ *
166
+ * Extracted because three controls need the identical contract
167
+ * (`uni-search-input`, `uni-tag-input`, and the multi-select upgrade), and the
168
+ * parts that silently drift between hand-rolled copies all live here: the
169
+ * wrap-around arithmetic, Home/End, and keeping the active id in sync with the
170
+ * option list.
171
+ *
172
+ * `Enter` and `Escape` are deliberately *not* handled: what they mean depends
173
+ * on the control (submit a search, commit a typed token, clear the field), and
174
+ * `activeIndex()` is all a caller needs to decide.
175
+ */
176
+ declare class ListboxNavigation {
177
+ private readonly config;
178
+ /** Id for the `role="listbox"` element; wire as `aria-controls`. */
179
+ readonly listboxId: string;
180
+ private readonly _open;
181
+ private readonly _activeIndex;
182
+ private readonly wrap;
183
+ /** Whether the popup is showing. Also false when there is nothing to show. */
184
+ readonly open: Signal<boolean>;
185
+ /** Index of the highlighted option, or -1 when none is active. */
186
+ readonly activeIndex: Signal<number>;
187
+ /** Value for `aria-activedescendant`, or null when nothing is active. */
188
+ readonly activeDescendantId: Signal<string | null>;
189
+ constructor(config: ListboxNavigationConfig);
190
+ /** Stable per-option id, for `role="option"` elements. */
191
+ optionId(index: number): string;
192
+ show(): void;
193
+ /** Close and drop the active option, so reopening starts clean. */
194
+ hide(): void;
195
+ setActive(index: number): void;
196
+ /**
197
+ * Handle ArrowDown / ArrowUp / Home / End, opening the popup if needed.
198
+ * Returns true when the key was consumed, so a caller can fall through to
199
+ * its own handling for everything else.
200
+ */
201
+ navigate(event: KeyboardEvent): boolean;
202
+ private nextIndex;
203
+ private step;
204
+ /** Close when focus leaves the control entirely (not on internal moves). */
205
+ closeOnFocusOut(event: FocusEvent): void;
206
+ }
207
+ /** Factory mirroring the signal-API style used elsewhere in the CDK. */
208
+ declare const createListboxNavigation: (config: ListboxNavigationConfig) => ListboxNavigation;
209
+
47
210
  /**
48
211
  * Native CSS Anchor Positioning helpers (Baseline 2026). These replace the
49
212
  * former @floating-ui/dom dependency: the browser tracks the anchor natively
@@ -271,22 +434,61 @@ declare class ThemeService {
271
434
  static readonly CUSTOM_KEY = "CustomTheme";
272
435
  /** localStorage key holding the serialized brand palette config. */
273
436
  static readonly PALETTE_KEY = "uni-custom-palette";
274
- private themes;
275
437
  private localStorage;
276
- theme: _angular_core.WritableSignal<UniTheme>;
277
- themeOptions: _angular_core.WritableSignal<Options<string>>;
438
+ /**
439
+ * The live theme registry: the injected {@link UNI_THEMES} map (validated
440
+ * at construction) plus anything added via {@link registerTheme} — including
441
+ * the custom brand theme, which registers under {@link CUSTOM_KEY} so it is
442
+ * an ordinary, selectable entry.
443
+ */
444
+ private readonly registry;
445
+ private readonly _theme;
446
+ /** The active theme. Write via {@link setTheme}/{@link selectTheme} — every write is validated. */
447
+ readonly theme: Signal<UniTheme>;
448
+ /** Selectable themes, derived from the registry — reactive to registration. */
449
+ readonly themeOptions: Signal<Options<string>>;
278
450
  components: Signal<Partial<Record<ComponentName, ComponentTheme<object>>>>;
279
451
  component: <T>(componentName: ComponentName) => Signal<ComponentTheme<T>>;
280
452
  colors: Signal<Partial<Record<string, string>>>;
281
453
  typeFaces: Signal<Record<string, _uni_design_system_uni_core.TypeFaceDefinition>>;
282
454
  spacing: Signal<Partial<Record<NullableSize, string | number>>>;
283
- thicknesses: Signal<_uni_design_system_uni_core.Thicknesses>;
455
+ thicknesses: Signal<Partial<Record<string, string | number>>>;
284
456
  radii: Signal<Partial<Record<string, string>>>;
285
457
  borders: Signal<Partial<Record<string, string>>>;
286
458
  shadows: Signal<Partial<Record<string, string>>>;
287
459
  icons: Signal<_uni_design_system_uni_core.Icons>;
288
460
  constructor();
289
- selectTheme(themeName: ThemeName): void;
461
+ /**
462
+ * Activate a registered theme. Returns false — touching nothing, persisting
463
+ * nothing — when the name is unknown (previously this silently kept the old
464
+ * theme while still recording the bad key).
465
+ */
466
+ selectTheme(themeName: ThemeName): boolean;
467
+ /**
468
+ * Validate and activate a theme without registering it. The result carries
469
+ * acceptance or the complete list of rejection reasons; on rejection the
470
+ * active theme is unchanged.
471
+ */
472
+ setTheme(input: unknown): ThemeParseResult;
473
+ /**
474
+ * Validate and add a theme to the registry (keyed by its `id`), making it
475
+ * selectable and listed in {@link themeOptions}. On rejection the registry
476
+ * is unchanged and the result lists every reason.
477
+ */
478
+ registerTheme(input: unknown, opts?: {
479
+ select?: boolean;
480
+ }): ThemeParseResult;
481
+ /**
482
+ * The gate every externally-supplied theme passes: validate, then restore
483
+ * any built-in icons the payload left out. Themes that travel as JSON (the
484
+ * MCP theme tools, a theme registry) omit the built-in icon set — it is
485
+ * ~71% of the bytes and every consumer already ships it — so hydration
486
+ * applies the same `{...BaseIcons, ...icons}` contract `createTheme` uses:
487
+ * the theme's own icons win, built-ins fill the rest.
488
+ */
489
+ private accept;
490
+ /** Remove a registered theme; falls back to the first remaining theme if it was active. */
491
+ unregisterTheme(id: string): void;
290
492
  /** The live brand palette config, when a custom theme is active. */
291
493
  customPalette: _angular_core.WritableSignal<BrandPaletteConfig>;
292
494
  isCustomTheme: Signal<boolean>;
@@ -296,7 +498,7 @@ declare class ThemeService {
296
498
  * reload) renders with the same brand.
297
499
  */
298
500
  applyPalette(config: BrandPaletteConfig, persist?: boolean): void;
299
- /** Drop the custom brand theme and fall back to the first built-in theme. */
501
+ /** Drop the custom brand theme and fall back to the first registered theme. */
300
502
  clearCustomPalette(): void;
301
503
  selectedThemeName: Signal<string>;
302
504
  selectedThemeKey: _angular_core.WritableSignal<string>;
@@ -311,14 +513,36 @@ declare class ThemeService {
311
513
  backgroundColor: (token?: ColorKey) => NullableStyleExpression;
312
514
  backgroundImage: (url?: string) => NullableStyleExpression;
313
515
  getContainerColors: (color: Variant, useVariant?: boolean) => _uni_design_system_uni_core.StyleExpression;
516
+ /**
517
+ * The shared keyboard-focus indicator's styles (WCAG 2.4.7), without a
518
+ * selector — for controls that key the ring off their own state selector
519
+ * (`&:focus + .checkbox`). Everything else spreads `focusRing()` instead.
520
+ *
521
+ * Themable: a theme that defines `focusRing` **border** and/or **shadow**
522
+ * primitives replaces the default 2px outline with that border (drawn as
523
+ * an outline hugging the control) plus the ring shadow — one focus
524
+ * language for every control, from text fields to checkboxes to calendar
525
+ * days. A `focusRing` **thickness** primitive sets the outline offset
526
+ * (default 0 when themed, 2px for the classic outline; negative values
527
+ * overlay the control's own border, reading as a border-color change).
528
+ * Without those primitives the classic outline renders, in the given
529
+ * color or `currentColor`.
530
+ */
531
+ focusRingStyle: (color?: string, gap?: string | number) => {
532
+ boxShadow?: string;
533
+ outline: string;
534
+ outlineOffset: string | number;
535
+ };
314
536
  /**
315
537
  * Shared keyboard-focus indicator (WCAG 2.4.7). Spread into a component's
316
538
  * Emotion styles: `...this.theme.focusRing()` or `focusRing('primary')`.
539
+ * See `focusRingStyle` for how themes restyle it.
317
540
  */
318
541
  focusRing: (token?: ColorToken) => {
319
542
  '&:focus-visible': {
543
+ boxShadow?: string;
320
544
  outline: string;
321
- outlineOffset: string;
545
+ outlineOffset: string | number;
322
546
  };
323
547
  };
324
548
  typeface: (typeface?: Typeface) => _uni_design_system_uni_core.TypeFaceDefinition;
@@ -589,6 +813,172 @@ interface ButtonGroupItem {
589
813
  toggle?: WritableSignal<boolean>;
590
814
  }
591
815
 
816
+ type UniCalendarMode = 'single' | 'range';
817
+ /** What the calendar reads/writes: a date in `single` mode, a range in `range` mode. */
818
+ type UniCalendarValue = UniDate | UniDateRange | undefined;
819
+ /**
820
+ * An availability dot on a day, driven by app data — the scheduling pattern
821
+ * is the first application. `label` extends the day's accessible name
822
+ * (e.g. "3 slots open"); without it the dot is decoration only.
823
+ */
824
+ interface UniCalendarMarker {
825
+ date: UniDate;
826
+ /** Dot color role, default `'primary'`. */
827
+ variant?: Variant;
828
+ /** Screen-reader suffix appended to the day's name. */
829
+ label?: string;
830
+ }
831
+ /**
832
+ * Theme options for the `calendar` component entry. Selection/range/today
833
+ * colours are deliberately not here — they are the `primary` role pair, so a
834
+ * theme restyles them by restyling its palette.
835
+ */
836
+ interface UniCalendarOptions {
837
+ /** `'max'` renders circles; `'xxs'` the square/GitHub-contributions look. */
838
+ dayBorderRadius?: Radius;
839
+ typeface?: Typeface;
840
+ /** Grid gutter. */
841
+ gap?: NullableSize;
842
+ navPrevSymbol?: string;
843
+ navNextSymbol?: string;
844
+ /** Intl weekday column format. */
845
+ weekdayFormat?: 'narrow' | 'short';
846
+ /** Show the adjacent months' days, muted and non-interactive. */
847
+ showOutsideDays?: boolean;
848
+ /** How today is marked: 1px outline, or a dot under the number. */
849
+ todayStyle?: 'outline' | 'dot';
850
+ }
851
+
852
+ /** One rendered day cell — precomputed so the template stays declarative. */
853
+ interface CalendarCell {
854
+ date: UniDate;
855
+ day: number;
856
+ outside: boolean;
857
+ disabled: boolean;
858
+ today: boolean;
859
+ selected: boolean;
860
+ inBand: boolean;
861
+ tabIndex: number;
862
+ ariaLabel: string;
863
+ markers: UniCalendarMarker[];
864
+ cellClass: string;
865
+ dayClass: string;
866
+ }
867
+ /**
868
+ * Inline month calendar: single-date or start–end range selection, day
869
+ * markers (availability dots), min/max fences and disabled dates. One tab
870
+ * stop with a roving-tabindex `role="grid"`; every day is a real button
871
+ * named with its full date. Values are plain ISO strings (`'YYYY-MM-DD'`),
872
+ * never `Date` objects, so bindings are timezone-free and serializable.
873
+ * Selection and today colours come from the theme's `primary` role pair;
874
+ * geometry and glyphs come from the `calendar` theme entry.
875
+ */
876
+ declare class UniCalendarComponent extends BaseComponent<UniCalendarOptions> implements FormValueControl<UniCalendarValue> {
877
+ readonly value: _angular_core.ModelSignal<UniCalendarValue>;
878
+ readonly disabled: _angular_core.InputSignal<boolean>;
879
+ readonly touched: _angular_core.ModelSignal<boolean>;
880
+ readonly invalid: _angular_core.InputSignal<boolean>;
881
+ readonly dirty: _angular_core.InputSignal<boolean>;
882
+ readonly required: _angular_core.InputSignal<boolean>;
883
+ readonly ariaDescribedBy: _angular_core.InputSignal<string>;
884
+ /** `'single'` reads/writes a `UniDate`; `'range'` a `UniDateRange`. */
885
+ mode: _angular_core.InputSignal<UniCalendarMode>;
886
+ /** Shown month, `'YYYY-MM'` — two-way, so an app can drive "jump to June". */
887
+ month: _angular_core.ModelSignal<string>;
888
+ /** Earliest selectable date (inclusive). */
889
+ minDate: _angular_core.InputSignal<string>;
890
+ /** Latest selectable date (inclusive). */
891
+ maxDate: _angular_core.InputSignal<string>;
892
+ /** Blocked days: a list of dates, or a predicate. */
893
+ disabledDates: _angular_core.InputSignal<string[] | ((date: UniDate) => boolean)>;
894
+ /** Availability dots; `label` extends the day's accessible name. */
895
+ markers: _angular_core.InputSignal<UniCalendarMarker[]>;
896
+ /** BCP 47 tag; defaults to the document language, then the browser's. */
897
+ locale: _angular_core.InputSignal<string>;
898
+ /** First day of week, 0 = Sunday; defaults from the locale's week info. */
899
+ weekStart: _angular_core.InputSignal<0 | 1 | 2 | 3 | 4 | 5 | 6>;
900
+ /** Names the grid when it stands alone (otherwise the heading names it). */
901
+ ariaLabel: _angular_core.InputSignal<string>;
902
+ /** Day geometry token; `sm`/`md`/`lg` map to the theme's `calendar` sizes. */
903
+ size: _angular_core.InputSignal<Size>;
904
+ /** Each committed day, including both ends of a range. */
905
+ selected: _angular_core.OutputEmitterRef<string>;
906
+ private readonly host;
907
+ protected readonly headingId: string;
908
+ protected readonly srOnly: string;
909
+ /** Pending range start — set by the first commit, cleared by the second. */
910
+ protected readonly pendingStart: _angular_core.WritableSignal<string>;
911
+ /** Hover/focus candidate painting the preview band while a range is pending. */
912
+ protected readonly previewDate: _angular_core.WritableSignal<string>;
913
+ /** Live-region text; selections are otherwise silent for a screen reader. */
914
+ protected readonly announcement: _angular_core.WritableSignal<string>;
915
+ protected readonly resolvedLocale: _angular_core.Signal<string>;
916
+ protected readonly resolvedWeekStart: _angular_core.Signal<number>;
917
+ /** The month on screen: the `month` model, else the value's month, else today's. */
918
+ protected readonly viewMonth: _angular_core.Signal<string>;
919
+ private readonly anchorDate;
920
+ /**
921
+ * The roving-tabindex day. Re-derives when the view or value changes
922
+ * (selected day in view → today in view → first enabled day); keyboard
923
+ * navigation writes it directly.
924
+ */
925
+ protected readonly focusedDate: _angular_core.WritableSignal<string>;
926
+ protected readonly showError: _angular_core.Signal<boolean>;
927
+ protected readonly heading: _angular_core.Signal<string>;
928
+ protected readonly weekdays: _angular_core.Signal<_uni_design_system_uni_angular.UniWeekdayName[]>;
929
+ private readonly disabledDateSet;
930
+ private readonly markersByDate;
931
+ /** The committed range, or the pending preview band. */
932
+ private readonly rangeBand;
933
+ protected isDayDisabled(date: UniDate): boolean;
934
+ private isSelected;
935
+ /** The full render model: one precomputed cell per grid position. */
936
+ protected readonly gridWeeks: _angular_core.Signal<CalendarCell[][]>;
937
+ protected select(date: UniDate): void;
938
+ private cancelPending;
939
+ protected onNav(direction: 1 | -1): void;
940
+ private setViewMonth;
941
+ /**
942
+ * Move the roving focus. A landing on a disabled day keeps going in the
943
+ * same direction until an enabled day; the min/max fence stops the caret,
944
+ * it never wraps. Month edges never block — the grid follows.
945
+ */
946
+ private moveFocus;
947
+ protected onGridKeydown(event: KeyboardEvent): void;
948
+ protected onDayHover(date: UniDate): void;
949
+ /** Focus the roving day — used by popup hosts when the calendar opens. */
950
+ focusActiveDay(): void;
951
+ protected onHostFocusOut(event: FocusEvent): void;
952
+ private focusDay;
953
+ private pickFocus;
954
+ private firstEnabledInView;
955
+ private announce;
956
+ private readonly daySize;
957
+ protected readonly className: _angular_core.Signal<string>;
958
+ protected readonly navClass: _angular_core.Signal<string>;
959
+ protected readonly headingClass: _angular_core.Signal<string>;
960
+ protected readonly gridClass: _angular_core.Signal<string>;
961
+ protected readonly rowClass: _angular_core.Signal<string>;
962
+ protected readonly weekdayClass: _angular_core.Signal<string>;
963
+ /** The gridcell — range bands paint here so they read as one bar. */
964
+ protected readonly cellClass: _angular_core.Signal<string>;
965
+ protected readonly inRangeClass: _angular_core.Signal<string>;
966
+ protected readonly previewClass: _angular_core.Signal<string>;
967
+ protected readonly bandStartClass: _angular_core.Signal<string>;
968
+ protected readonly bandEndClass: _angular_core.Signal<string>;
969
+ protected readonly dayClass: _angular_core.Signal<string>;
970
+ protected readonly todayClass: _angular_core.Signal<string>;
971
+ protected readonly selectedClass: _angular_core.Signal<string>;
972
+ protected readonly outsideDayClass: _angular_core.Signal<string>;
973
+ protected readonly dotsClass: _angular_core.Signal<string>;
974
+ /** One dot class per marker variant present, resolved from the palette. */
975
+ protected readonly dotClasses: _angular_core.Signal<Map<Variant, string>>;
976
+ protected dotClassFor(variant: Variant | undefined): string;
977
+ protected readonly showOutside: _angular_core.Signal<boolean>;
978
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniCalendarComponent, never>;
979
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniCalendarComponent, "uni-calendar, Calendar", 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; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "month": { "alias": "month"; "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; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "weekStart": { "alias": "weekStart"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; "month": "monthChange"; "selected": "selected"; }, never, never, true, never>;
980
+ }
981
+
592
982
  declare class UniCardContentComponent extends BaseComponent {
593
983
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniCardContentComponent, never>;
594
984
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniCardContentComponent, "uni-card-content", never, {}, {}, never, ["*"], true, never>;
@@ -638,6 +1028,7 @@ interface UniCheckboxOptions {
638
1028
  borderRadius?: string | number;
639
1029
  /** Unchecked box background token. */
640
1030
  boxColor?: ColorKey;
1031
+ focusRingGap?: string | number;
641
1032
  }
642
1033
 
643
1034
  declare class UniCheckboxComponent extends BaseComponent<UniCheckboxOptions> implements FormCheckboxControl {
@@ -763,6 +1154,186 @@ declare class UniDataTableComponent<T> extends BaseComponent<UniDataTableOptions
763
1154
  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>;
764
1155
  }
765
1156
 
1157
+ /** Why typed text did not become a date. The raw text stays in the field. */
1158
+ interface UniDateInputRejection {
1159
+ raw: string;
1160
+ reason: 'unparseable' | 'out-of-range' | 'disabled';
1161
+ }
1162
+ /**
1163
+ * Theme options for the `dateInput` entry. Field chrome is not duplicated
1164
+ * here — it comes from `input` via uni-input-box; these style the popup
1165
+ * affordance and panel only.
1166
+ */
1167
+ interface UniDateInputOptions {
1168
+ toggleSymbol?: string;
1169
+ popupShadow?: Shadow;
1170
+ popupBorderRadius?: Radius;
1171
+ popupColor?: ContainerColorToken;
1172
+ }
1173
+
1174
+ /**
1175
+ * Date field with free-typed parsing and a popup calendar. Type `aug 20`,
1176
+ * `8/20/2026` or `2026-08-20`, or pick from the grid — the form gets the
1177
+ * same canonical `'YYYY-MM-DD'` string either way. Parsing is `Intl`-driven
1178
+ * (locale digit order and month names, never hardcoded); unreadable text
1179
+ * stays in the field, flagged, with a `rejected` event. The popup is a
1180
+ * native popover hosting the same `uni-calendar` an app could render inline.
1181
+ */
1182
+ declare class UniDateInputComponent extends BaseComponent<UniDateInputOptions> implements FormValueControl<UniDate | undefined> {
1183
+ readonly value: _angular_core.ModelSignal<string>;
1184
+ readonly disabled: _angular_core.InputSignal<boolean>;
1185
+ readonly touched: _angular_core.ModelSignal<boolean>;
1186
+ readonly invalid: _angular_core.InputSignal<boolean>;
1187
+ readonly dirty: _angular_core.InputSignal<boolean>;
1188
+ readonly required: _angular_core.InputSignal<boolean>;
1189
+ readonly ariaDescribedBy: _angular_core.InputSignal<string>;
1190
+ /** Accessible name for the field, e.g. "Appointment date". */
1191
+ label: _angular_core.InputSignal<string>;
1192
+ /** Defaults to the locale's digit pattern, e.g. `MM/DD/YYYY`. */
1193
+ placeholder: _angular_core.InputSignal<string>;
1194
+ /** How the committed value renders, e.g. `{ dateStyle: 'long' }`. */
1195
+ displayFormat: _angular_core.InputSignal<Intl.DateTimeFormatOptions>;
1196
+ /** BCP 47 tag; defaults to the document language, then the browser's. */
1197
+ locale: _angular_core.InputSignal<string>;
1198
+ commitOnBlur: _angular_core.InputSignal<boolean>;
1199
+ /** Custom parser, replacing the built-in ISO/locale/month-name parsing. */
1200
+ parse: _angular_core.InputSignal<(raw: string, locale: string) => UniDate | null>;
1201
+ /** Renders without its own input-box chrome, for composers like uni-date-time-input. */
1202
+ embedded: _angular_core.InputSignal<boolean>;
1203
+ minDate: _angular_core.InputSignal<string>;
1204
+ maxDate: _angular_core.InputSignal<string>;
1205
+ disabledDates: _angular_core.InputSignal<string[] | ((date: UniDate) => boolean)>;
1206
+ markers: _angular_core.InputSignal<UniCalendarMarker[]>;
1207
+ weekStart: _angular_core.InputSignal<0 | 1 | 2 | 3 | 4 | 5 | 6>;
1208
+ /** Popup shown. */
1209
+ opened: _angular_core.OutputEmitterRef<void>;
1210
+ /** Popup hidden. */
1211
+ closed: _angular_core.OutputEmitterRef<void>;
1212
+ /** A typed commit was refused; the raw text stays in the field. */
1213
+ rejected: _angular_core.OutputEmitterRef<UniDateInputRejection>;
1214
+ private readonly host;
1215
+ private readonly inputRef;
1216
+ private readonly toggleRef;
1217
+ private readonly popupRef;
1218
+ private readonly dropdown;
1219
+ private readonly calendar;
1220
+ protected readonly srOnly: string;
1221
+ /** A refused commit — styles the field and sets aria-invalid until edited. */
1222
+ protected readonly draftInvalid: _angular_core.WritableSignal<boolean>;
1223
+ protected readonly announcement: _angular_core.WritableSignal<string>;
1224
+ protected readonly toggleElement: _angular_core.Signal<any>;
1225
+ protected readonly popupOpen: _angular_core.Signal<boolean>;
1226
+ protected readonly resolvedLocale: _angular_core.Signal<string>;
1227
+ protected readonly displayText: _angular_core.Signal<string>;
1228
+ protected readonly resolvedPlaceholder: _angular_core.Signal<string>;
1229
+ protected readonly showError: _angular_core.Signal<boolean>;
1230
+ protected readonly toggleLabel: _angular_core.Signal<string>;
1231
+ private fullDate;
1232
+ private isDayBlocked;
1233
+ protected setValue(date: UniDate | undefined, silent?: boolean): void;
1234
+ private refuse;
1235
+ protected commit(raw: string): boolean;
1236
+ /** Step a committed value ±1 day, skipping blocked days, stopping at fences. */
1237
+ private step;
1238
+ protected onInputKeydown(event: KeyboardEvent): void;
1239
+ protected onInput(): void;
1240
+ protected onFocusOut(event: FocusEvent): void;
1241
+ protected openPopup(): void;
1242
+ protected closePopup(): void;
1243
+ protected onPopupShowing(): void;
1244
+ protected onPopupHiding(): void;
1245
+ protected onCalendarPick(date: UniDate): void;
1246
+ /** The popup is a focus-holding dialog: Tab cycles inside it (APG pattern). */
1247
+ protected onPopupKeydown(event: KeyboardEvent): void;
1248
+ private setFieldText;
1249
+ private announce;
1250
+ protected readonly className: _angular_core.Signal<string>;
1251
+ protected readonly rowClass: _angular_core.Signal<string>;
1252
+ protected readonly inputClass: _angular_core.Signal<string>;
1253
+ protected readonly toggleWrapClass: _angular_core.Signal<string>;
1254
+ /** Embedded mode: the composer owns the box; keep only the flex row. */
1255
+ protected readonly embeddedClass: _angular_core.Signal<string>;
1256
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniDateInputComponent, never>;
1257
+ 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>;
1258
+ }
1259
+
1260
+ /**
1261
+ * Theme options for the `dateTimeInput` entry. Field chrome comes from
1262
+ * `input` via the single shared uni-input-box; these style the seam between
1263
+ * the two parts.
1264
+ */
1265
+ interface UniDateTimeInputOptions {
1266
+ /** Space between the date part, the divider, and the time part. */
1267
+ partGap?: NullableSize;
1268
+ dividerColor?: ColorToken;
1269
+ }
1270
+
1271
+ /**
1272
+ * One field for a date and a time: a thin composer seating a uni-date-input
1273
+ * and a uni-time-input in one input-box chrome under one label, yielding one
1274
+ * combined `'YYYY-MM-DDTHH:mm'` value. The value emits only when both parts
1275
+ * are set — a time without a day is not an answer — and clearing the date
1276
+ * clears it. With `slotsFor`, the time part stays disabled until a day is
1277
+ * chosen and offers exactly that day's slots: the scheduling flow in one
1278
+ * attribute. Two honest tab stops (it is two questions); apps needing a
1279
+ * different arrangement compose the primitives directly.
1280
+ */
1281
+ declare class UniDateTimeInputComponent extends BaseComponent<UniDateTimeInputOptions> implements FormValueControl<UniDateTime | undefined> {
1282
+ readonly value: _angular_core.ModelSignal<string>;
1283
+ readonly disabled: _angular_core.InputSignal<boolean>;
1284
+ readonly touched: _angular_core.ModelSignal<boolean>;
1285
+ readonly invalid: _angular_core.InputSignal<boolean>;
1286
+ readonly dirty: _angular_core.InputSignal<boolean>;
1287
+ readonly required: _angular_core.InputSignal<boolean>;
1288
+ readonly ariaDescribedBy: _angular_core.InputSignal<string>;
1289
+ /** Names the group; the parts are announced as "Date" and "Time" under it. */
1290
+ label: _angular_core.InputSignal<string>;
1291
+ /** Earliest allowed moment; the date and time fences are split from it. */
1292
+ minDateTime: _angular_core.InputSignal<string>;
1293
+ /** Latest allowed moment; the date and time fences are split from it. */
1294
+ maxDateTime: _angular_core.InputSignal<string>;
1295
+ disabledDates: _angular_core.InputSignal<string[] | ((date: UniDate) => boolean)>;
1296
+ markers: _angular_core.InputSignal<UniCalendarMarker[]>;
1297
+ /** Fixed time choices; superseded per-day by `slotsFor` when that is set. */
1298
+ slots: _angular_core.InputSignal<string[]>;
1299
+ minuteStep: _angular_core.InputSignal<number>;
1300
+ hour12: _angular_core.InputSignal<boolean>;
1301
+ weekStart: _angular_core.InputSignal<0 | 1 | 2 | 3 | 4 | 5 | 6>;
1302
+ locale: _angular_core.InputSignal<string>;
1303
+ /** Scheduling: the day's available times. Gates the time part on a date. */
1304
+ slotsFor: _angular_core.InputSignal<(date: UniDate) => UniTime[]>;
1305
+ private readonly host;
1306
+ /**
1307
+ * The two part-values. An external `value` write re-derives both; an
1308
+ * internal partial state (a date without a time round-trips through
1309
+ * `undefined`) must not be wiped by its own echo.
1310
+ */
1311
+ private readonly parts;
1312
+ protected readonly dateValue: _angular_core.Signal<string>;
1313
+ protected readonly timeValue: _angular_core.Signal<string>;
1314
+ protected readonly showError: _angular_core.Signal<boolean>;
1315
+ private readonly minParts;
1316
+ private readonly maxParts;
1317
+ protected readonly dateMin: _angular_core.Signal<string>;
1318
+ protected readonly dateMax: _angular_core.Signal<string>;
1319
+ protected readonly timeMin: _angular_core.Signal<string>;
1320
+ protected readonly timeMax: _angular_core.Signal<string>;
1321
+ /** The chosen day's slots when `slotsFor` is set, else the fixed list. */
1322
+ protected readonly effectiveSlots: _angular_core.Signal<string[]>;
1323
+ protected readonly timeDisabled: _angular_core.Signal<boolean>;
1324
+ protected onDatePartChange(date: UniDate | undefined): void;
1325
+ protected onTimePartChange(time: UniTime | undefined): void;
1326
+ private setParts;
1327
+ protected onHostFocusOut(event: FocusEvent): void;
1328
+ protected readonly className: _angular_core.Signal<string>;
1329
+ protected readonly groupClass: _angular_core.Signal<string>;
1330
+ protected readonly datePartClass: _angular_core.Signal<string>;
1331
+ protected readonly timePartClass: _angular_core.Signal<string>;
1332
+ protected readonly dividerClass: _angular_core.Signal<string>;
1333
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniDateTimeInputComponent, never>;
1334
+ 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>;
1335
+ }
1336
+
766
1337
  /**
767
1338
  * Theme-level options for the dialog footer action row. Inputs on the
768
1339
  * component override these per instance; the theme sets the default posture.
@@ -1313,6 +1884,12 @@ interface UniInputBoxOptions {
1313
1884
  disabledTextColor: ColorKey;
1314
1885
  focusOutline: string;
1315
1886
  focusOutlineOffset: number;
1887
+ /** Border swapped in while an inner control has focus (default: keep `border`). */
1888
+ focusBorder?: Border;
1889
+ /** Ring shown while focused, e.g. a soft `0 0 0 3px` spread shadow. */
1890
+ focusShadow?: Shadow;
1891
+ /** Background swapped in while focused (default: keep `color`). */
1892
+ focusColor?: ContainerColorToken;
1316
1893
  }
1317
1894
 
1318
1895
  declare class UniInputBoxComponent extends BaseComponent<UniInputBoxOptions> {
@@ -1608,20 +2185,49 @@ declare class UniMultiSelectDropdownComponent<T = unknown> extends BaseComponent
1608
2185
  readonly ariaDescribedBy: _angular_core.InputSignal<string>;
1609
2186
  readonly options: _angular_core.InputSignal<Options<T>>;
1610
2187
  readonly placeholder: _angular_core.InputSignal<string>;
2188
+ /**
2189
+ * What the field is for, e.g. "Fruits". Rendered visually hidden inside the
2190
+ * trigger so its accessible name reads "Fruits, Apple, Pear" — without it a
2191
+ * screen reader announces only the current selection, with no clue which
2192
+ * field it belongs to.
2193
+ */
2194
+ readonly label: _angular_core.InputSignal<string>;
2195
+ /** Debounce for the filter box, matching the library's input debounce. */
2196
+ readonly debounceTime: _angular_core.InputSignal<number>;
2197
+ protected readonly srOnly: string;
1611
2198
  protected readonly query: _angular_core.WritableSignal<string>;
2199
+ private queryTimer?;
1612
2200
  protected readonly filteredOptions: _angular_core.Signal<Options<T>>;
2201
+ private readonly optionRefs;
2202
+ /**
2203
+ * Roving focus over the options. The shared helper owns the index
2204
+ * arithmetic — wrapping, Home/End, and never pointing past a list the
2205
+ * filter has narrowed — the same contract `uni-search-input` and
2206
+ * `uni-tag-input` use, so the keys behave identically across all three.
2207
+ */
2208
+ protected readonly list: _uni_design_system_uni_angular.ListboxNavigation;
2209
+ /** Announced with the selection so the count is not left to guesswork. */
2210
+ readonly selectionSummary: _angular_core.Signal<string>;
1613
2211
  readonly selectedLabelsText: _angular_core.Signal<string>;
1614
2212
  protected readonly showError: _angular_core.Signal<boolean>;
1615
2213
  protected readonly textColor: _angular_core.Signal<_uni_design_system_uni_core.TextColor>;
1616
2214
  triggerClass: string;
1617
2215
  protected readonly searchInputClass: _angular_core.Signal<string>;
1618
2216
  protected handleQueryInput(event: Event): void;
2217
+ /**
2218
+ * Arrow keys walk the options from anywhere in the panel, including the
2219
+ * filter box — previously the only way in was to Tab through every
2220
+ * checkbox.
2221
+ */
2222
+ protected onPanelKeydown(event: KeyboardEvent): void;
2223
+ /** Keeps the active index in step when focus lands on a row by pointer. */
2224
+ protected onOptionFocus(index: number): void;
1619
2225
  selectAll(): void;
1620
2226
  deselectAll(): void;
1621
2227
  protected isOptionSelected(option: Option<T>): _angular_core.Signal<boolean>;
1622
2228
  toggleOption(option: Option<T>, checked: boolean): void;
1623
2229
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniMultiSelectDropdownComponent<any>, never>;
1624
- 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; }; }, { "value": "valueChange"; "touched": "touchedChange"; }, never, never, true, never>;
2230
+ 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>;
1625
2231
  }
1626
2232
 
1627
2233
  interface UniNotificationBadgeOptions {
@@ -1846,6 +2452,11 @@ interface UniRadioOptions {
1846
2452
  ringColor?: ColorKey;
1847
2453
  /** Circle background token. */
1848
2454
  fillColor?: ColorKey;
2455
+ /**
2456
+ * Seconds for the dot's grow/retract and the ring's color change
2457
+ * (default 0.3, matching menuItem/expand). 0 switches instantly.
2458
+ */
2459
+ transitionSpeed?: number;
1849
2460
  }
1850
2461
 
1851
2462
  declare class UniRadioComponent extends BaseComponent<UniRadioOptions> implements FormValueControl<string> {
@@ -1962,12 +2573,10 @@ declare class UniSearchInputComponent extends BaseComponent<UniSearchInputOption
1962
2573
  search: _angular_core.OutputEmitterRef<string>;
1963
2574
  suggestionSelected: _angular_core.OutputEmitterRef<string>;
1964
2575
  protected readonly field: _angular_core.Signal<UniDebounceInputComponent>;
1965
- readonly listboxId: string;
1966
- protected readonly listOpen: _angular_core.WritableSignal<boolean>;
1967
- protected readonly activeIndex: _angular_core.WritableSignal<number>;
1968
2576
  protected readonly visibleSuggestions: _angular_core.Signal<string[]>;
1969
- protected readonly showList: _angular_core.Signal<boolean>;
1970
- protected readonly activeOptionId: _angular_core.Signal<string>;
2577
+ /** Shared combobox bookkeeping: open state, active option, ARIA ids. */
2578
+ protected readonly list: _uni_design_system_uni_angular.ListboxNavigation;
2579
+ readonly listboxId: string;
1971
2580
  protected readonly hasQuery: _angular_core.Signal<boolean>;
1972
2581
  protected handleChange(value: string): void;
1973
2582
  protected submit(): void;
@@ -2298,13 +2907,217 @@ declare class UniSymbolComponent extends BaseComponent<SymbolOptions> {
2298
2907
  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>;
2299
2908
  }
2300
2909
 
2301
- declare class UniTagComponent {
2910
+ /** Theme options for the `tag` component entry. */
2911
+ interface UniTagOptions {
2912
+ borderRadius?: Radius;
2913
+ typeface?: Typeface;
2914
+ /** Space between the lead element, label and remove button. */
2915
+ gap?: NullableSize;
2916
+ /** Icon primitive for the remove affordance. */
2917
+ removeIcon?: IconName;
2918
+ /** Icon primitive shown in the lead slot when the chip is selected. */
2919
+ selectedIcon?: IconName;
2920
+ }
2921
+ /** The value a tag echoes back on `removed` / `activated`. */
2922
+ type UniTagValue = string | number | undefined;
2923
+
2924
+ /**
2925
+ * Compact chip for categories, states, filters and tokens.
2926
+ *
2927
+ * Two orthogonal style axes: `variant` picks the colour role and `tone` picks
2928
+ * the archetype (soft / solid / outline). Both live in the theme's `tag` entry,
2929
+ * so a theme restyles every chip in the app without touching markup.
2930
+ *
2931
+ * Structurally a chip is **body + trailing action as siblings**, never nested
2932
+ * buttons: an interactive chip whose body is a `<button>` cannot contain the
2933
+ * remove `<button>` (invalid HTML, and the inner control becomes unreachable
2934
+ * for keyboard users). Both stay independently operable.
2935
+ */
2936
+ declare class UniTagComponent extends BaseComponent<UniTagOptions> {
2937
+ size: _angular_core.InputSignal<Size>;
2938
+ tone: _angular_core.InputSignal<TagTone>;
2302
2939
  label: _angular_core.InputSignal<string>;
2303
2940
  value: _angular_core.InputSignal<string | number>;
2304
- close: _angular_core.OutputEmitterRef<string | number>;
2305
- handleClose(): void;
2941
+ /** Truncation budget, e.g. `'14ch'`. A number is treated as px. */
2942
+ maxWidth: _angular_core.InputSignal<string | number>;
2943
+ avatarSrc: _angular_core.InputSignal<string>;
2944
+ /** Initials fallback when `avatarSrc` is absent or fails to load. */
2945
+ avatarName: _angular_core.InputSignal<string>;
2946
+ /** Theme icon primitive — the preferred glyph path. */
2947
+ iconName: _angular_core.InputSignal<IconName>;
2948
+ /** Material Symbols ligature, for glyphs the theme's icon set doesn't carry. */
2949
+ symbolName: _angular_core.InputSignal<string>;
2950
+ /** Status dot in the current colour. */
2951
+ dot: _angular_core.InputSignal<boolean>;
2952
+ removable: _angular_core.InputSignal<boolean>;
2953
+ interactive: _angular_core.InputSignal<boolean>;
2954
+ /**
2955
+ * Toggle state. Left undefined the chip carries no `aria-pressed` at all —
2956
+ * an interactive chip is not always a toggle (inside a tag input it is
2957
+ * focusable so it can be removed), and announcing "not pressed" on a
2958
+ * recipient chip is worse than announcing nothing.
2959
+ */
2960
+ selected: _angular_core.InputSignal<boolean>;
2961
+ invalid: _angular_core.InputSignal<boolean>;
2962
+ disabled: _angular_core.InputSignal<boolean>;
2963
+ /** Accessible-name override for the remove button. */
2964
+ removeLabel: _angular_core.InputSignal<string>;
2965
+ /**
2966
+ * Tab position of the chip's controls. A composite that owns its own
2967
+ * roving focus — `uni-tag-input`, where the whole field is one tab stop —
2968
+ * passes `-1` so Tab does not walk through every chip to reach the next
2969
+ * control.
2970
+ */
2971
+ controlTabIndex: _angular_core.InputSignal<number>;
2972
+ removed: _angular_core.OutputEmitterRef<UniTagValue>;
2973
+ activated: _angular_core.OutputEmitterRef<UniTagValue>;
2974
+ /** A disabled chip wears the theme's `disabled` role, whatever its variant. */
2975
+ protected readonly resolvedVariant: _angular_core.Signal<_uni_design_system_uni_core.Variant>;
2976
+ protected readonly themeStyle: _angular_core.Signal<{
2977
+ [x: string]: string | number | _uni_design_system_uni_core.StyleExpression;
2978
+ }>;
2979
+ /** Lead elements derive from the chip height, so no second size token. */
2980
+ protected readonly leadSize: _angular_core.Signal<number>;
2981
+ /** Remove glyph, proportional to the chip rather than to the icon-button. */
2982
+ protected readonly removeGlyphSize: _angular_core.Signal<number>;
2983
+ protected readonly initials: _angular_core.Signal<string>;
2984
+ protected readonly hostClass: _angular_core.Signal<string>;
2985
+ /** Truncating label; `title` exposes the full text when a budget is set. */
2986
+ protected readonly labelClass: string;
2987
+ protected readonly bodyClass: _angular_core.Signal<string>;
2988
+ protected readonly leadClass: _angular_core.Signal<string>;
2989
+ protected readonly dotClass: _angular_core.Signal<string>;
2990
+ protected remove(): void;
2991
+ protected activate(): void;
2306
2992
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniTagComponent, never>;
2307
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniTagComponent, "uni-tag", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "close": "close"; }, never, never, true, never>;
2993
+ 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>;
2994
+ }
2995
+
2996
+ /**
2997
+ * One committed token. `value` is canonical — what a form submits — and
2998
+ * everything else is presentation the field may enrich from a suggestion.
2999
+ *
3000
+ * `{ value: 'a@b.com' }` is a complete item, so the least a caller has to write
3001
+ * is `[value]="[{ value: 'a@b.com' }]"`.
3002
+ */
3003
+ interface UniTagItem {
3004
+ /** Canonical value, e.g. an email address. */
3005
+ value: string;
3006
+ /** Display text; falls back to `value`. */
3007
+ label?: string;
3008
+ avatarSrc?: string;
3009
+ /**
3010
+ * Failed `validate()`. The item stays **in** the value rather than being
3011
+ * rejected — a field that silently swallows a typo'd address is worse than
3012
+ * one that shows it in red, and the user can click in to fix it.
3013
+ */
3014
+ invalid?: boolean;
3015
+ /** Locked token (e.g. a thread owner): rendered without a remove control. */
3016
+ disabled?: boolean;
3017
+ }
3018
+ /** A type-ahead entry. Same contract as `uni-search-input`: the app filters. */
3019
+ interface UniTagSuggestion {
3020
+ value: string;
3021
+ label?: string;
3022
+ description?: string;
3023
+ avatarSrc?: string;
3024
+ }
3025
+ /** Why a typed token did not become a chip. */
3026
+ interface UniTagRejection {
3027
+ raw: string;
3028
+ reason: 'duplicate' | 'max' | 'invalid';
3029
+ }
3030
+ /** Theme options for the `tagInput` component entry. */
3031
+ interface UniTagInputOptions {
3032
+ /** Space between chips. */
3033
+ chipGap?: NullableSize;
3034
+ chipSize?: Size;
3035
+ /** Keeps the text input usable when chips have wrapped. */
3036
+ minInputWidth?: string | number;
3037
+ listColor?: ContainerColorToken;
3038
+ listShadow?: Shadow;
3039
+ listBorderRadius?: Radius;
3040
+ maxSuggestions?: number;
3041
+ }
3042
+
3043
+ declare class UniTagInputComponent extends BaseComponent<UniTagInputOptions> implements FormValueControl<UniTagItem[]> {
3044
+ readonly value: _angular_core.ModelSignal<UniTagItem[]>;
3045
+ readonly disabled: _angular_core.InputSignal<boolean>;
3046
+ readonly touched: _angular_core.ModelSignal<boolean>;
3047
+ readonly invalid: _angular_core.InputSignal<boolean>;
3048
+ readonly dirty: _angular_core.InputSignal<boolean>;
3049
+ readonly required: _angular_core.InputSignal<boolean>;
3050
+ readonly ariaDescribedBy: _angular_core.InputSignal<string>;
3051
+ /** Accessible name for the field, e.g. "To". */
3052
+ label: _angular_core.InputSignal<string>;
3053
+ placeholder: _angular_core.InputSignal<string>;
3054
+ /** `email` wires an address validator, paste parser and space separator. */
3055
+ preset: _angular_core.InputSignal<"text" | "email">;
3056
+ separators: _angular_core.InputSignal<string[]>;
3057
+ commitOnBlur: _angular_core.InputSignal<boolean>;
3058
+ allowDuplicates: _angular_core.InputSignal<boolean>;
3059
+ max: _angular_core.InputSignal<number>;
3060
+ validate: _angular_core.InputSignal<(raw: string) => boolean>;
3061
+ parse: _angular_core.InputSignal<(pasted: string) => string[]>;
3062
+ tagVariant: _angular_core.InputSignal<Variant>;
3063
+ tagTone: _angular_core.InputSignal<TagTone>;
3064
+ tagSize: _angular_core.InputSignal<Size>;
3065
+ suggestions: _angular_core.InputSignal<UniTagSuggestion[]>;
3066
+ /** Debounced text the app should filter `suggestions` from. */
3067
+ query: _angular_core.OutputEmitterRef<string>;
3068
+ debounceTime: _angular_core.InputSignal<number>;
3069
+ added: _angular_core.OutputEmitterRef<UniTagItem>;
3070
+ removed: _angular_core.OutputEmitterRef<UniTagItem>;
3071
+ rejected: _angular_core.OutputEmitterRef<UniTagRejection>;
3072
+ private readonly inputRef;
3073
+ private readonly chipRefs;
3074
+ /** Uncommitted text in the field. */
3075
+ protected readonly draft: _angular_core.WritableSignal<string>;
3076
+ /** Index of the focused chip, or -1 when focus is in the text input. */
3077
+ protected readonly focusedChip: _angular_core.WritableSignal<number>;
3078
+ /** Announcement for the status region; add/remove are otherwise silent. */
3079
+ protected readonly announcement: _angular_core.WritableSignal<string>;
3080
+ protected readonly hintId: string;
3081
+ protected readonly srOnly: string;
3082
+ private queryTimer?;
3083
+ protected readonly visibleSuggestions: _angular_core.Signal<UniTagSuggestion[]>;
3084
+ /** Shared combobox bookkeeping — identical contract to uni-search-input. */
3085
+ protected readonly list: _uni_design_system_uni_angular.ListboxNavigation;
3086
+ protected readonly showError: _angular_core.Signal<boolean>;
3087
+ protected readonly separatorKeys: _angular_core.Signal<string[]>;
3088
+ protected readonly describedBy: _angular_core.Signal<string>;
3089
+ protected labelOf(item: UniTagItem | UniTagSuggestion): string;
3090
+ /** Split pasted text into candidate tokens. */
3091
+ private parseRaw;
3092
+ private isValid;
3093
+ /**
3094
+ * Turn typed text into a chip. Invalid entries are kept and flagged rather
3095
+ * than dropped; duplicates and over-max are refused with a reason.
3096
+ */
3097
+ protected commit(raw: string): boolean;
3098
+ private reject;
3099
+ protected removeAt(index: number, focus?: 'left' | 'right' | 'input'): void;
3100
+ private countNoun;
3101
+ private announce;
3102
+ protected focusInput(): void;
3103
+ private focusChip;
3104
+ protected onInputKeydown(event: KeyboardEvent): void;
3105
+ protected onInput(value: string): void;
3106
+ protected onPaste(event: ClipboardEvent): void;
3107
+ protected onBlur(): void;
3108
+ protected onFocusOut(event: FocusEvent): void;
3109
+ protected onChipKeydown(event: KeyboardEvent, index: number): void;
3110
+ /** Lift a chip back into the input for correction. */
3111
+ protected editChip(index: number): void;
3112
+ protected selectSuggestion(suggestion: UniTagSuggestion): void;
3113
+ private commitDraft;
3114
+ private setDraft;
3115
+ protected readonly className: _angular_core.Signal<string>;
3116
+ protected readonly fieldClass: _angular_core.Signal<string>;
3117
+ protected readonly inputClass: _angular_core.Signal<string>;
3118
+ protected readonly listClass: _angular_core.Signal<string>;
3119
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniTagInputComponent, never>;
3120
+ 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>;
2308
3121
  }
2309
3122
 
2310
3123
  /**
@@ -2433,6 +3246,105 @@ declare class UniThemeSwitchComponent {
2433
3246
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniThemeSwitchComponent, "uni-theme-switch", never, { "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "themeChanged": "themeChanged"; }, never, never, true, never>;
2434
3247
  }
2435
3248
 
3249
+ /** Why typed text did not become a time. The raw text stays in the field. */
3250
+ interface UniTimeInputRejection {
3251
+ raw: string;
3252
+ reason: 'unparseable' | 'out-of-range' | 'unavailable';
3253
+ }
3254
+ /**
3255
+ * Theme options for the `timeInput` entry. Field chrome is not duplicated
3256
+ * here — it comes from `input` via uni-input-box; the list trio matches
3257
+ * tagInput/searchInput.
3258
+ */
3259
+ interface UniTimeInputOptions {
3260
+ toggleSymbol?: string;
3261
+ listColor?: ContainerColorToken;
3262
+ listShadow?: Shadow;
3263
+ listBorderRadius?: Radius;
3264
+ maxVisibleOptions?: number;
3265
+ }
3266
+
3267
+ /**
3268
+ * Time field: a combobox over time options — the same listbox contract as
3269
+ * uni-search-input and uni-tag-input. Type `3p`, `930` or `15:00`, or pick
3270
+ * `3:00 PM` from the list; the form always gets 24-hour `'HH:mm'` (`hour12`
3271
+ * affects display only). The list is assistive, not exhaustive: any
3272
+ * parseable time commits, unless `slots` pins the choices (a slot picker) —
3273
+ * then a typed time must match one. Unreadable or unavailable text stays in
3274
+ * the field, flagged, with a `rejected` event.
3275
+ */
3276
+ declare class UniTimeInputComponent extends BaseComponent<UniTimeInputOptions> implements FormValueControl<UniTime | undefined> {
3277
+ readonly value: _angular_core.ModelSignal<string>;
3278
+ readonly disabled: _angular_core.InputSignal<boolean>;
3279
+ readonly touched: _angular_core.ModelSignal<boolean>;
3280
+ readonly invalid: _angular_core.InputSignal<boolean>;
3281
+ readonly dirty: _angular_core.InputSignal<boolean>;
3282
+ readonly required: _angular_core.InputSignal<boolean>;
3283
+ readonly ariaDescribedBy: _angular_core.InputSignal<string>;
3284
+ /** Accessible name for the field, e.g. "Start time". */
3285
+ label: _angular_core.InputSignal<string>;
3286
+ placeholder: _angular_core.InputSignal<string>;
3287
+ /** Generated list granularity, in minutes. */
3288
+ minuteStep: _angular_core.InputSignal<number>;
3289
+ /** Earliest allowed time (inclusive), `'09:00'`. */
3290
+ minTime: _angular_core.InputSignal<string>;
3291
+ /** Latest allowed time (inclusive), `'17:00'`. */
3292
+ maxTime: _angular_core.InputSignal<string>;
3293
+ /** Exact allowed times (scheduling). When set, typed entry must match one. */
3294
+ slots: _angular_core.InputSignal<string[]>;
3295
+ /** 12-hour display; defaults from the locale. The value stays 24-hour. */
3296
+ hour12: _angular_core.InputSignal<boolean>;
3297
+ /** BCP 47 tag for the display format; defaults to the document language. */
3298
+ locale: _angular_core.InputSignal<string>;
3299
+ commitOnBlur: _angular_core.InputSignal<boolean>;
3300
+ /** Renders without its own input-box chrome, for composers like uni-date-time-input. */
3301
+ embedded: _angular_core.InputSignal<boolean>;
3302
+ /** A typed commit was refused; the raw text stays in the field. */
3303
+ rejected: _angular_core.OutputEmitterRef<UniTimeInputRejection>;
3304
+ private readonly host;
3305
+ private readonly inputRef;
3306
+ private readonly listRef;
3307
+ protected readonly srOnly: string;
3308
+ /** A refused commit — styles the field and sets aria-invalid until edited. */
3309
+ protected readonly draftInvalid: _angular_core.WritableSignal<boolean>;
3310
+ protected readonly announcement: _angular_core.WritableSignal<string>;
3311
+ protected readonly resolvedLocale: _angular_core.Signal<string>;
3312
+ protected readonly resolvedHour12: _angular_core.Signal<boolean>;
3313
+ /** The listed times: pinned `slots` verbatim, else the generated step grid. */
3314
+ protected readonly options: _angular_core.Signal<string[]>;
3315
+ protected readonly optionLabels: _angular_core.Signal<string[]>;
3316
+ /** Shared combobox bookkeeping — identical contract to uni-search-input. */
3317
+ protected readonly list: _uni_design_system_uni_angular.ListboxNavigation;
3318
+ protected readonly displayText: _angular_core.Signal<string>;
3319
+ protected readonly resolvedPlaceholder: _angular_core.Signal<string>;
3320
+ protected readonly showError: _angular_core.Signal<boolean>;
3321
+ protected formatValue(time: UniTime): string;
3322
+ protected setValue(time: UniTime | undefined, silent?: boolean): void;
3323
+ private refuse;
3324
+ protected commit(raw: string): boolean;
3325
+ /** Step a committed value ±minuteStep (±1 slot when pinned), clamped. */
3326
+ private stepValue;
3327
+ protected onInputKeydown(event: KeyboardEvent): void;
3328
+ protected onInput(): void;
3329
+ protected onToggle(): void;
3330
+ protected selectOption(time: UniTime): void;
3331
+ protected onFocusOut(event: FocusEvent): void;
3332
+ private openList;
3333
+ private scrollToActive;
3334
+ private scrollToIndex;
3335
+ private setFieldText;
3336
+ private announce;
3337
+ protected readonly className: _angular_core.Signal<string>;
3338
+ protected readonly rowClass: _angular_core.Signal<string>;
3339
+ protected readonly inputClass: _angular_core.Signal<string>;
3340
+ protected readonly toggleWrapClass: _angular_core.Signal<string>;
3341
+ /** Embedded mode: the composer owns the box; keep only the flex row. */
3342
+ protected readonly embeddedClass: _angular_core.Signal<string>;
3343
+ protected readonly listClass: _angular_core.Signal<string>;
3344
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniTimeInputComponent, never>;
3345
+ 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>;
3346
+ }
3347
+
2436
3348
  interface UniToggleOptions {
2437
3349
  /**
2438
3350
  * The size of the toggle switch
@@ -2544,5 +3456,5 @@ declare class DragAndDropDirective {
2544
3456
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<DragAndDropDirective, "[uni-drag-n-drop], [dragAndDrop]", never, {}, { "onFileDropped": "onFileDropped"; }, never, never, true, never>;
2545
3457
  }
2546
3458
 
2547
- export { BodyRenderDirective, ConfirmationDialogComponent, DragAndDropDirective, FOCUSABLE_SELECTOR, LocalStorageService, NotificationService, NotificationsComponent, RippleDirective, ThemeService, UNI_THEMES, UniAlertComponent, UniAppBarComponent, UniAvatarComponent, UniAvatarGroupComponent, UniBackgroundComponent, UniBadgeComponent, UniBaseDatasource, UniBoxComponent, UniBreadcrumbComponent, UniButtonComponent, UniButtonGroupComponent, UniCardComponent, UniCardContentComponent, UniCardHeaderComponent, UniCenterComponent, UniCheckboxComponent, UniDataSearchComponent, UniDataTableComponent, 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, UniTextComponent, UniTextareaComponent, UniThemeBuilderComponent, UniThemeSwitchComponent, UniToggleComponent, UniTooltipComponent, UniWrapComponent, acceptableFile, anchorArrowStyles, anchorStyles, getFileExtension, isDivider, motionSafe, newAnchorName, resolveFocusTarget, uniqueId, useTimer, visuallyHidden };
2548
- export type { Alert, AnchorOffset, BrandPaletteConfig, BreadcrumbItem, ButtonGroupConfig, ButtonGroupItem, ColumnDefinition, Confirmation, DataLoader, DrawerMode, DrawerPosition, ImagePosition, MenuDivider, MenuItem, MenuItemWithLabel, MenuItemWithTemplate, Option, Options, PageRequest, PageResponse, Placement, ScrollbarAppearance, SkeletonShape, Snackbar, Sort, SortDirection, UniAppBarOptions, UniAvatarGroupOptions, UniAvatarOptions, UniBreadcrumbOptions, UniCheckboxOptions, UniDataSearchOptions, UniDataTableOptions, UniDatasource, UniDrawerOptions, UniExpandOptions, UniInputBoxOptions, UniMenuItemOptions, UniMenuOptions, UniMultiSelectDropdownOptions, UniNotificationBadgeOptions, UniPaginatorOptions, UniRadioOption, UniRadioOptions, UniSearchInputOptions, UniSkeletonOptions, UniSliderOptions, UniStatOptions, UniTabsOptions, UniTextareaOptions, UniToggleOptions };
3459
+ export { BodyRenderDirective, ConfirmationDialogComponent, DragAndDropDirective, FOCUSABLE_SELECTOR, ListboxNavigation, LocalStorageService, NotificationService, NotificationsComponent, RippleDirective, ThemeService, UNI_THEMES, UniAlertComponent, UniAppBarComponent, UniAvatarComponent, UniAvatarGroupComponent, UniBackgroundComponent, UniBadgeComponent, UniBaseDatasource, UniBoxComponent, UniBreadcrumbComponent, UniButtonComponent, UniButtonGroupComponent, UniCalendarComponent, UniCardComponent, UniCardContentComponent, UniCardHeaderComponent, UniCenterComponent, UniCheckboxComponent, 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, UniWrapComponent, acceptableFile, addDays, addMonths, anchorArrowStyles, anchorStyles, buildMonthGrid, createListboxNavigation, dayOfWeek, daysInMonth, formatDate, formatMonthHeading, formatTime, getFileExtension, inclusiveDayCount, isDivider, isValidDate, isoDate, joinDateTime, localeDatePlaceholder, localeDefaultHour12, localeFieldOrder, localeMonthNames, localeWeekStart, monthOf, motionSafe, newAnchorName, parseDateText, parseTimeText, resolveFocusTarget, splitDateTime, timeSlots, todayIso, uniqueId, useTimer, visuallyHidden, weekdayNames };
3460
+ export type { Alert, AnchorOffset, 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, UniAppBarOptions, UniAvatarGroupOptions, UniAvatarOptions, UniBreadcrumbOptions, UniCalendarMarker, UniCalendarMode, UniCalendarOptions, UniCalendarValue, UniCheckboxOptions, UniDataSearchOptions, UniDataTableOptions, UniDatasource, UniDate, UniDateInputOptions, UniDateInputRejection, UniDateRange, UniDateTime, UniDateTimeInputOptions, UniDrawerOptions, UniExpandOptions, UniInputBoxOptions, UniMenuItemOptions, UniMenuOptions, UniMonthGridCell, UniMultiSelectDropdownOptions, UniNotificationBadgeOptions, UniPaginatorOptions, UniRadioOption, UniRadioOptions, UniSearchInputOptions, UniSkeletonOptions, UniSliderOptions, UniStatOptions, UniTabsOptions, UniTagInputOptions, UniTagItem, UniTagOptions, UniTagRejection, UniTagSuggestion, UniTagValue, UniTextareaOptions, UniTime, UniTimeInputOptions, UniTimeInputRejection, UniToggleOptions, UniWeekdayName };