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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,6 +4,7 @@ import * as _uni_design_system_uni_core from '@uni-design-system/uni-core';
4
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';
5
5
  import * as _uni_design_system_uni_angular from '@uni-design-system/uni-angular';
6
6
  import { FormValueControl, FormCheckboxControl } from '@angular/forms/signals';
7
+ import { CSSObject } from '@emotion/css/create-instance';
7
8
 
8
9
  /**
9
10
  * Returns a document-unique id for wiring ARIA relationships
@@ -156,6 +157,11 @@ interface ListboxNavigationConfig {
156
157
  idPrefix?: string;
157
158
  /** Wrap past the ends. Default true. */
158
159
  wrap?: boolean;
160
+ /**
161
+ * Non-navigable options. Arrows step over them; Home/End land on the
162
+ * nearest enabled option; an all-disabled list never activates.
163
+ */
164
+ disabled?: (index: number) => boolean;
159
165
  }
160
166
  /**
161
167
  * The keyboard and ARIA bookkeeping shared by every combobox-style popup:
@@ -180,6 +186,7 @@ declare class ListboxNavigation {
180
186
  private readonly _open;
181
187
  private readonly _activeIndex;
182
188
  private readonly wrap;
189
+ private readonly isDisabled;
183
190
  /** Whether the popup is showing. Also false when there is nothing to show. */
184
191
  readonly open: Signal<boolean>;
185
192
  /** Index of the highlighted option, or -1 when none is active. */
@@ -200,6 +207,9 @@ declare class ListboxNavigation {
200
207
  */
201
208
  navigate(event: KeyboardEvent): boolean;
202
209
  private nextIndex;
210
+ /** Nearest enabled index at or after `start`, walking by `delta` with wrap;
211
+ null when every option is disabled. */
212
+ private seek;
203
213
  private step;
204
214
  /** Close when focus leaves the control entirely (not on internal moves). */
205
215
  closeOnFocusOut(event: FocusEvent): void;
@@ -235,8 +245,99 @@ declare function anchorStyles(anchor: string, placement: Placement, offset?: Anc
235
245
  * that faces the anchor. Static per placement: if the browser flips the panel
236
246
  * via position-try, the arrow stays on the configured side (cosmetic-only
237
247
  * degradation, matching the flip-support caveat above).
248
+ *
249
+ * `overlap` (default 0 — cut exactly on the panel edge) extends the kept half
250
+ * into the panel; see {@link ARROW_CLIP} for when that is ever wanted.
251
+ */
252
+ declare function anchorArrowStyles(placement: Placement, size?: number, overlap?: number): Record<string, string | number>;
253
+ interface SpotlightOptions {
254
+ /** Gap between the target's box and the hole edge, px. */
255
+ pad?: number;
256
+ /** Ring border width, px — border-color and radius come from the caller. */
257
+ ringWidth?: number;
258
+ /** Scrim paint; scheme-invariant by convention, like `::backdrop`. */
259
+ scrimColor?: string;
260
+ }
261
+ interface SpotlightStyles {
262
+ /** Paints the scrim + ring. `pointer-events: none` — purely visual. */
263
+ window: Record<string, string | number>;
264
+ /** Click-blockers surrounding the hole; the hole itself is genuinely empty. */
265
+ strips: Record<'top' | 'bottom' | 'left' | 'right', Record<string, string | number>>;
266
+ /** Hole-sized click-blocker, shown when the target must not be interactive. */
267
+ cover: Record<string, string | number>;
268
+ }
269
+ /**
270
+ * Scrim pieces that cut a spotlight hole around the element carrying
271
+ * `anchor-name: <anchor>`. Every inset is `calc(anchor(<side>) ± px)`, so the
272
+ * browser tracks the target through scroll/resize/layout with zero listeners.
273
+ *
274
+ * The window paints everything: its `border` is the focus ring and its huge
275
+ * spread shadow is the scrim (an outer shadow of a rounded rect covers the
276
+ * whole viewport except the rect, rounded corners included). It is
277
+ * click-through; the four strips do the click-blocking, and the optional
278
+ * cover blocks the hole itself. Callers append these to a fixed, transparent,
279
+ * `pointer-events: none` full-viewport container (each piece is
280
+ * `position: fixed`).
281
+ */
282
+ declare function spotlightStyles(anchor: string, options?: SpotlightOptions): SpotlightStyles;
283
+ /** The rect fields the origin computation reads — satisfied by DOMRect. */
284
+ interface AnchorRect {
285
+ top: number;
286
+ right: number;
287
+ bottom: number;
288
+ left: number;
289
+ width: number;
290
+ height: number;
291
+ }
292
+ /**
293
+ * Transform origin for a panel's open/close scale animation, derived from
294
+ * where the panel **actually** rendered relative to its anchor — not from the
295
+ * requested placement. `position-try-fallbacks` lets the browser flip a panel
296
+ * at viewport edges, and a statically mapped origin then animates from the
297
+ * wrong corner (a `bottom-end` picker flipped above its field would still
298
+ * scale from `top right`). Measure after the popover is shown and apply the
299
+ * result as an inline style.
300
+ *
301
+ * Returns keyword pairs like `'top right'` / `'bottom center'`, or `null`
302
+ * when the panel has no box yet (e.g. `display: none`, or jsdom).
303
+ */
304
+ declare function transformOriginFor(panel: AnchorRect, trigger: AnchorRect): string | null;
305
+
306
+ /** Placement → `transform-origin`, so scale animations grow from the anchor. */
307
+ declare const TRANSFORM_ORIGINS: Record<Placement, string>;
308
+ /** Write a CSS `anchor-name` onto an element (detached anchors and targets). */
309
+ declare function setAnchorName(el: HTMLElement, name: string): void;
310
+ declare function clearAnchorName(el: HTMLElement): void;
311
+ /**
312
+ * Resolve an element-or-id reference. Id strings are looked up at call time —
313
+ * never cache the result across opens, the element may have been re-rendered.
314
+ * `''` and null-ish mean "unset" (falsy guard: an empty string is the only
315
+ * typeable empty for a string-typed input).
316
+ */
317
+ declare function resolveElement(ref: HTMLElement | string | null | undefined): HTMLElement | null;
318
+ /** True when a native `toggle` event reports the overlay opening. */
319
+ declare function isToggleOpen(event: Event): boolean;
320
+ /**
321
+ * The discrete-transition block that animates an element into and out of the
322
+ * top layer: `transition-behavior: allow-discrete` over the `hidden` keys plus
323
+ * `display`/`overlay`, the shown state under `:popover-open`, and
324
+ * `@starting-style` so entry transitions run from the hidden state.
325
+ */
326
+ declare function discreteOverlayTransition(durationMs: number, hidden: Record<string, string | number>, shown: Record<string, string | number>): Record<string, unknown>;
327
+ /**
328
+ * Returns focus to `target` when an overlay closes while focus was inside its
329
+ * panel (or was dropped on `<body>` by the top layer closing), so keyboard
330
+ * users are never stranded (WCAG 2.4.3). Focus resting anywhere else is left
331
+ * alone.
332
+ */
333
+ declare function restoreOverlayFocus(panel: HTMLElement, target: HTMLElement | null): void;
334
+ /**
335
+ * The focusable elements inside `root`, in DOM order. Filters disabled
336
+ * controls, and hidden ones where the environment can tell: jsdom reports
337
+ * `offsetParent` as null for every element, so the visibility filter applies
338
+ * only when the document actually lays out (some element has an offsetParent).
238
339
  */
239
- declare function anchorArrowStyles(placement: Placement, size?: number): Record<string, string | number>;
340
+ declare function focusableElements(root: HTMLElement): HTMLElement[];
240
341
 
241
342
  type SortDirection = 'asc' | 'desc' | 'indet';
242
343
  interface Sort<T> {
@@ -401,6 +502,10 @@ declare class NotificationService {
401
502
  interface Option<T = unknown> {
402
503
  label: string;
403
504
  value: T;
505
+ /** Secondary line, e.g. an email under a name. Read as part of the option's name. */
506
+ description?: string;
507
+ /** Visible and announced, but not committable; listbox navigation skips it. */
508
+ disabled?: boolean;
404
509
  }
405
510
  type Options<T = unknown> = Option<T>[];
406
511
 
@@ -896,7 +1001,7 @@ declare class UniCalendarComponent extends BaseComponent<UniCalendarOptions> imp
896
1001
  /** BCP 47 tag; defaults to the document language, then the browser's. */
897
1002
  locale: _angular_core.InputSignal<string>;
898
1003
  /** 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>;
1004
+ weekStart: _angular_core.InputSignal<0 | 1 | 2 | 3 | 4 | 6 | 5>;
900
1005
  /** Names the grid when it stands alone (otherwise the heading names it). */
901
1006
  ariaLabel: _angular_core.InputSignal<string>;
902
1007
  /** Day geometry token; `sm`/`md`/`lg` map to the theme's `calendar` sizes. */
@@ -984,6 +1089,132 @@ declare class UniCalendarComponent extends BaseComponent<UniCalendarOptions> imp
984
1089
  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>;
985
1090
  }
986
1091
 
1092
+ /** Why a callout closed. `programmatic` = the app drove `open` to false. */
1093
+ interface UniCalloutDismissal {
1094
+ /** The callout's `key`, when one was set — the "don't show again" hook. */
1095
+ key?: string;
1096
+ reason: 'close-button' | 'escape' | 'backdrop' | 'programmatic';
1097
+ }
1098
+ /**
1099
+ * Theme options for the `callout` component entry. The spotlight ring color
1100
+ * is deliberately not an option — it is the callout's `variant` role.
1101
+ */
1102
+ interface UniCalloutOptions {
1103
+ color: ContainerColorToken;
1104
+ borderRadius: Radius;
1105
+ shadow: Shadow;
1106
+ width: string;
1107
+ padding: string;
1108
+ headerTypeface: Typeface;
1109
+ typeface: Typeface;
1110
+ closeSymbol: IconName;
1111
+ arrowSize: number;
1112
+ /** Main-axis gap between the spotlight hole edge and the panel, px. */
1113
+ offset: number;
1114
+ /** Scrim paint; scheme-invariant by convention, like `::backdrop`. */
1115
+ scrimColor: string;
1116
+ /** Gap between the target's box and the hole edge, px. */
1117
+ spotlightPadding: number;
1118
+ spotlightRadius: Radius;
1119
+ /** Spotlight ring width, px. */
1120
+ ringWidth: number;
1121
+ transitionMs: number;
1122
+ }
1123
+
1124
+ /**
1125
+ * Anchored coach-mark panel that dims the page and cuts a spotlight hole
1126
+ * around its target. Both the scrim and the panel are `popover="manual"`
1127
+ * elements shown in order, so they stack deterministically in the top layer
1128
+ * above every app z-index, and every scrim piece is CSS-anchor-positioned to
1129
+ * the target — the hole tracks scroll/resize/layout with zero listeners.
1130
+ *
1131
+ * The panel is a non-modal `role="dialog"` (deliberately no `aria-modal`):
1132
+ * focus moves into it on open, Tab runs a "duet loop" over the panel's
1133
+ * focusables plus the spotlit target while it stays interactive, and on close
1134
+ * focus returns to the pre-open element — unless the user moved into the
1135
+ * target, where it stays.
1136
+ *
1137
+ * Storage-free by rule: `key` and the `dismissed` output are the "don't show
1138
+ * again" hooks; persistence is the app's business (e.g. cdk local-storage).
1139
+ */
1140
+ declare class UniCalloutComponent extends BaseComponent<UniCalloutOptions> {
1141
+ private destroyRef;
1142
+ open: _angular_core.ModelSignal<boolean>;
1143
+ /** Identifies this callout in `dismissed` payloads. Empty string = unset. */
1144
+ key: _angular_core.InputSignal<string>;
1145
+ /** Element (or id, resolved at open time) to spotlight. '' = unset. */
1146
+ target: _angular_core.InputSignal<string | HTMLElement>;
1147
+ placement: _angular_core.InputSignal<Placement>;
1148
+ /** Defaults to `spotlight` when a target resolves, else `dim`. */
1149
+ backdrop: _angular_core.InputSignal<"none" | "spotlight" | "dim">;
1150
+ /** When false, a transparent cover blocks the spotlit target. */
1151
+ targetInteractive: _angular_core.InputSignal<boolean>;
1152
+ /** Gates Escape and the close button. */
1153
+ dismissible: _angular_core.InputSignal<boolean>;
1154
+ /** When true, scrim clicks close (reason `backdrop`); else the panel pulses. */
1155
+ dismissOnBackdrop: _angular_core.InputSignal<boolean>;
1156
+ header: _angular_core.InputSignal<string>;
1157
+ arrow: _angular_core.InputSignal<boolean>;
1158
+ /** Wins over the header/body labelling; the tour sets "{title}, step n of N". */
1159
+ ariaLabel: _angular_core.InputSignal<string>;
1160
+ /** Accessible name of the dismiss button (the tour passes its skip label). */
1161
+ closeLabel: _angular_core.InputSignal<string>;
1162
+ opened: _angular_core.OutputEmitterRef<void>;
1163
+ closed: _angular_core.OutputEmitterRef<void>;
1164
+ dismissed: _angular_core.OutputEmitterRef<UniCalloutDismissal>;
1165
+ /** Keys pressed while focus is inside the panel (the tour's arrow-key hook). */
1166
+ panelKeydown: _angular_core.OutputEmitterRef<KeyboardEvent>;
1167
+ readonly panelId: string;
1168
+ protected readonly headerId: string;
1169
+ protected readonly bodyId: string;
1170
+ private readonly anchorName;
1171
+ protected readonly showing: _angular_core.WritableSignal<boolean>;
1172
+ protected readonly activeTarget: _angular_core.WritableSignal<HTMLElement>;
1173
+ private readonly scrimShown;
1174
+ /**
1175
+ * Keeps the spotlight pieces rendered and the panel anchored through the
1176
+ * close fade — tearing the anchor down at close time made the panel jump
1177
+ * and the scrim vanish mid-transition.
1178
+ */
1179
+ protected readonly scrimContent: _angular_core.WritableSignal<boolean>;
1180
+ private pendingTeardown;
1181
+ private prevFocus;
1182
+ private detachKeydown;
1183
+ protected readonly stripSides: readonly ["top", "bottom", "left", "right"];
1184
+ private scrimRef;
1185
+ private panelRef;
1186
+ private actionsRef;
1187
+ constructor();
1188
+ protected readonly effectiveBackdrop: _angular_core.Signal<"none" | "spotlight" | "dim">;
1189
+ private show;
1190
+ protected close(reason: UniCalloutDismissal['reason']): void;
1191
+ /** Move an open callout to a new target without a close/open round trip. */
1192
+ private retarget;
1193
+ /** `[autofocus]` → first action → first panel focusable → the panel itself. */
1194
+ private focusInitial;
1195
+ /**
1196
+ * Capture phase so Escape works from inside the spotlit target and the tab
1197
+ * loop preempts the page. Non-Tab keys surface through `panelKeydown`.
1198
+ */
1199
+ private onKeydown;
1200
+ /** A stray click shouldn't kill onboarding: nudge the panel instead. */
1201
+ protected onBackdropClick(): void;
1202
+ private readonly spotlight;
1203
+ protected readonly scrimClassName: _angular_core.Signal<string>;
1204
+ protected readonly windowClassName: _angular_core.Signal<string>;
1205
+ protected stripClassName(side: (typeof this.stripSides)[number]): string;
1206
+ protected readonly coverClassName: _angular_core.Signal<string>;
1207
+ protected readonly fullCoverClassName: _angular_core.Signal<string>;
1208
+ protected readonly panelClassName: _angular_core.Signal<string>;
1209
+ protected readonly headRowClassName: _angular_core.Signal<string>;
1210
+ protected readonly titleClassName: _angular_core.Signal<string>;
1211
+ protected readonly bodyClassName: _angular_core.Signal<string>;
1212
+ protected readonly actionsRowClassName: _angular_core.Signal<string>;
1213
+ protected readonly arrowClassName: _angular_core.Signal<string>;
1214
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniCalloutComponent, never>;
1215
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniCalloutComponent, "uni-callout", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "key": { "alias": "key"; "required": false; "isSignal": true; }; "target": { "alias": "target"; "required": false; "isSignal": true; }; "placement": { "alias": "placement"; "required": false; "isSignal": true; }; "backdrop": { "alias": "backdrop"; "required": false; "isSignal": true; }; "targetInteractive": { "alias": "targetInteractive"; "required": false; "isSignal": true; }; "dismissible": { "alias": "dismissible"; "required": false; "isSignal": true; }; "dismissOnBackdrop": { "alias": "dismissOnBackdrop"; "required": false; "isSignal": true; }; "header": { "alias": "header"; "required": false; "isSignal": true; }; "arrow": { "alias": "arrow"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "closeLabel": { "alias": "closeLabel"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "opened": "opened"; "closed": "closed"; "dismissed": "dismissed"; "panelKeydown": "panelKeydown"; }, never, ["[callout-media]", "[callout-header]", "*", "[callout-actions]"], true, never>;
1216
+ }
1217
+
987
1218
  declare class UniCardContentComponent extends BaseComponent {
988
1219
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniCardContentComponent, never>;
989
1220
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniCardContentComponent, "uni-card-content", never, {}, {}, never, ["*"], true, never>;
@@ -1067,6 +1298,149 @@ declare class UniCheckboxComponent extends BaseComponent<UniCheckboxOptions> imp
1067
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>;
1068
1299
  }
1069
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?;
1379
+ 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>;
1384
+ /**
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.
1388
+ */
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;
1405
+ /**
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).
1414
+ */
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>;
1442
+ }
1443
+
1070
1444
  interface UniDataSearchOptions {
1071
1445
  border: Border;
1072
1446
  borderRadius: Radius;
@@ -1209,7 +1583,7 @@ declare class UniDateInputComponent extends BaseComponent<UniDateInputOptions> i
1209
1583
  maxDate: _angular_core.InputSignal<string>;
1210
1584
  disabledDates: _angular_core.InputSignal<string[] | ((date: UniDate) => boolean)>;
1211
1585
  markers: _angular_core.InputSignal<UniCalendarMarker[]>;
1212
- weekStart: _angular_core.InputSignal<0 | 1 | 2 | 3 | 4 | 5 | 6>;
1586
+ weekStart: _angular_core.InputSignal<0 | 1 | 2 | 3 | 4 | 6 | 5>;
1213
1587
  /** Popup shown. */
1214
1588
  opened: _angular_core.OutputEmitterRef<void>;
1215
1589
  /** Popup hidden. */
@@ -1303,7 +1677,7 @@ declare class UniDateTimeInputComponent extends BaseComponent<UniDateTimeInputOp
1303
1677
  slots: _angular_core.InputSignal<string[]>;
1304
1678
  minuteStep: _angular_core.InputSignal<number>;
1305
1679
  hour12: _angular_core.InputSignal<boolean>;
1306
- weekStart: _angular_core.InputSignal<0 | 1 | 2 | 3 | 4 | 5 | 6>;
1680
+ weekStart: _angular_core.InputSignal<0 | 1 | 2 | 3 | 4 | 6 | 5>;
1307
1681
  locale: _angular_core.InputSignal<string>;
1308
1682
  /** Scheduling: the day's available times. Gates the time part on a date. */
1309
1683
  slotsFor: _angular_core.InputSignal<(date: UniDate) => UniTime[]>;
@@ -1568,6 +1942,15 @@ declare class UniDropdownComponent extends BaseComponent<UniDropdownOptions> imp
1568
1942
  /** The element that receives focus and carries the ARIA popup state. */
1569
1943
  private get _focusTarget();
1570
1944
  ngOnInit(): void;
1945
+ /**
1946
+ * Scale the open/close animation from the corner touching the trigger,
1947
+ * wherever the browser actually placed the panel. The static
1948
+ * `transformOriginMap` covers only the *requested* placement; with
1949
+ * `position-try-fallbacks` the panel may have flipped at a viewport edge,
1950
+ * and a `bottom-end` picker rendered above its field would otherwise still
1951
+ * animate from the top-right corner.
1952
+ */
1953
+ private syncTransformOrigin;
1571
1954
  /**
1572
1955
  * Returns focus to the trigger when the popover closes while focus was
1573
1956
  * inside it (or was dropped on <body> by the top layer closing), so
@@ -1793,6 +2176,42 @@ declare class UniDebounceInputComponent {
1793
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>;
1794
2177
  }
1795
2178
 
2179
+ /**
2180
+ * The theme options every listbox popup shares — the "list trio" plus the
2181
+ * active-option fill. Component option interfaces (searchInput, tagInput,
2182
+ * timeInput, combobox) satisfy this structurally; their extra options ride
2183
+ * alongside. `ColorKey`-typed so the wider `searchInput` contract (custom
2184
+ * theme color tokens) stays satisfiable; `colorPair` resolves any registered
2185
+ * token at runtime.
2186
+ */
2187
+ interface UniListboxPopupOptions {
2188
+ /** Popup surface; its on-color pair is derived and cascades to options. */
2189
+ listColor?: ColorKey;
2190
+ listShadow?: Shadow;
2191
+ listBorderRadius?: Radius;
2192
+ /** Active/hover option fill; the on-color pair is derived. Must contrast
2193
+ with `listColor` or keyboard navigation turns invisible. */
2194
+ activeColor?: ColorKey;
2195
+ }
2196
+ /**
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.
2200
+ *
2201
+ * Extracted because four components (`uni-search-input`, `uni-tag-input`,
2202
+ * `uni-time-input`, `uni-combobox`) carried hand-rolled copies, and the parts
2203
+ * that silently drift between copies all live here: the surface/elevation
2204
+ * trio, and the `activeColor` pair that themes re-point when their container
2205
+ * tokens don't contrast (see the Wellsourced overrides).
2206
+ *
2207
+ * Compose extras with the array form — `css([listboxPopupStyles(…), {…}])` —
2208
+ * so a component's own `& [role="option"]` block cascades after this one
2209
+ * instead of replacing it (an object spread would overwrite the key).
2210
+ */
2211
+ declare const listboxPopupStyles: (theme: ThemeService, options: UniListboxPopupOptions, { maxHeight }?: {
2212
+ maxHeight?: number;
2213
+ }) => CSSObject;
2214
+
1796
2215
  declare class UniIconComponent {
1797
2216
  private themeService;
1798
2217
  color: _angular_core.InputSignal<string>;
@@ -2387,27 +2806,135 @@ declare class UniPaginatorComponent<T> extends BaseComponent<UniPaginatorOptions
2387
2806
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniPaginatorComponent<any>, "uni-paginator", never, { "datasource": { "alias": "datasource"; "required": false; "isSignal": true; }; "initPageSize": { "alias": "initPageSize"; "required": false; "isSignal": true; }; "showPageSize": { "alias": "showPageSize"; "required": false; "isSignal": true; }; "showPageJumper": { "alias": "showPageJumper"; "required": false; "isSignal": true; }; "showPageNumbers": { "alias": "showPageNumbers"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
2388
2807
  }
2389
2808
 
2390
- declare class UniPopoverComponent {
2809
+ /**
2810
+ * Theme options for the `popover` component entry. Defaults reproduce the
2811
+ * pre-theme hardcoded look; the `tooltip*` options apply only in
2812
+ * `mode="tooltip"`.
2813
+ */
2814
+ interface UniPopoverOptions {
2815
+ color: ContainerColorToken;
2816
+ border: Border;
2817
+ borderRadius: Radius;
2818
+ shadow: Shadow;
2819
+ typeface: Typeface;
2820
+ /** Typeface for the `header` title row. */
2821
+ headerTypeface: Typeface;
2822
+ /** Body padding in rich mode. */
2823
+ padding: string;
2824
+ /** Body padding in tooltip mode (tighter). */
2825
+ tooltipPadding: string;
2826
+ /** Default panel max-width; an instance `maxWidth` input overrides. */
2827
+ maxWidth: string;
2828
+ /** Main-axis gap between anchor and panel, px. */
2829
+ offset: number;
2830
+ arrowSize: number;
2831
+ /** Icon primitive for the `closable` button. */
2832
+ closeSymbol: IconName;
2833
+ /** Hover open delay in tooltip mode, ms. */
2834
+ tooltipOpenDelay: number;
2835
+ /** Pointer-leave close delay in tooltip mode, ms. */
2836
+ tooltipCloseDelay: number;
2837
+ }
2838
+
2839
+ /**
2840
+ * Anchored, top-layer panel on the native `popover` element — the browser owns
2841
+ * positioning (CSS anchor positioning), stacking, and, in rich mode, light
2842
+ * dismissal. Two modes share one implementation:
2843
+ *
2844
+ * - `rich` (default): a click-toggled disclosure. The projected `[trigger]`
2845
+ * carries `aria-expanded`/`aria-controls`; with no trigger content the app
2846
+ * drives `open` and no element claims controller ARIA. Focus stays on the
2847
+ * trigger (APG disclosure) unless the panel marks an `[autofocus]` field,
2848
+ * and returns to the trigger on close.
2849
+ * - `tooltip`: hover/focus-triggered, `role="tooltip"` + `aria-describedby`,
2850
+ * WCAG 1.4.13 dismissable/hoverable/persistent. Content must not contain
2851
+ * focusable elements.
2852
+ *
2853
+ * Anchoring and control are separate: `anchor` re-anchors the panel to any
2854
+ * element (or id) while the trigger keeps the disclosure semantics.
2855
+ */
2856
+ declare class UniPopoverComponent extends BaseComponent<UniPopoverOptions> {
2391
2857
  private renderer;
2392
- private theme;
2858
+ private destroyRef;
2393
2859
  placement: _angular_core.InputSignal<Placement>;
2394
2860
  /** Light-dismiss on outside click / Escape (native popover="auto"). */
2395
2861
  autoClose: _angular_core.InputSignal<boolean>;
2862
+ /** Two-way open state; light dismissal and hover timers sync back into it. */
2863
+ open: _angular_core.ModelSignal<boolean>;
2864
+ /** `rich` = click-toggled disclosure; `tooltip` = hover/focus description. */
2865
+ mode: _angular_core.InputSignal<"tooltip" | "rich">;
2866
+ /**
2867
+ * Anchor the panel to another element (or element id, resolved each time
2868
+ * the panel opens) while the projected trigger keeps the disclosure ARIA.
2869
+ * Empty string means unset.
2870
+ */
2871
+ anchor: _angular_core.InputSignal<string | HTMLElement>;
2872
+ /** Title rendered in the header row and used as the accessible name. */
2873
+ header: _angular_core.InputSignal<string>;
2874
+ /** Renders a "Close" icon button in the header row. */
2875
+ closable: _angular_core.InputSignal<boolean>;
2876
+ arrow: _angular_core.InputSignal<boolean>;
2877
+ /** Panel max-width; numbers are px. Defaults to the theme's `maxWidth`. */
2878
+ maxWidth: _angular_core.InputSignal<string | number>;
2879
+ /** Tooltip-mode hover-open delay, ms; defaults to the theme option. */
2880
+ openDelay: _angular_core.InputSignal<number>;
2881
+ /** Tooltip-mode pointer-leave close delay, ms; defaults to the theme option. */
2882
+ closeDelay: _angular_core.InputSignal<number>;
2883
+ opened: _angular_core.OutputEmitterRef<void>;
2884
+ closed: _angular_core.OutputEmitterRef<void>;
2396
2885
  readonly panelId: string;
2886
+ protected readonly headerId: string;
2397
2887
  private readonly anchorName;
2398
2888
  private readonly showing;
2889
+ /** Whether the `[trigger]` slot projected any element content. */
2890
+ private readonly hasTrigger;
2399
2891
  private triggerRef;
2400
2892
  private panelRef;
2893
+ private openTimer;
2894
+ private closeTimer;
2895
+ /** The element currently carrying our anchor-name. */
2896
+ private anchoredEl;
2897
+ private detachEscape;
2401
2898
  constructor();
2402
- protected onToggle(event: Event): void;
2899
+ /** Tooltip mode is always `manual` — its lifecycle belongs to the timers. */
2900
+ protected readonly popoverKind: _angular_core.Signal<"auto" | "manual">;
2403
2901
  showPopover(): void;
2404
2902
  hidePopover(): void;
2405
- togglePopover(event: MouseEvent): void;
2903
+ togglePopover(event?: MouseEvent): void;
2904
+ /**
2905
+ * The panel anchors to the detached `anchor` when one resolves (id strings
2906
+ * are looked up now, at open time), else to the trigger span.
2907
+ */
2908
+ private applyAnchor;
2909
+ protected onToggle(event: Event): void;
2910
+ protected closeFromButton(): void;
2911
+ protected onTriggerClick(event: MouseEvent): void;
2912
+ private readonly openDelayMs;
2913
+ private readonly closeDelayMs;
2914
+ protected onTriggerEnter(): void;
2915
+ protected onTriggerLeave(): void;
2916
+ protected onTriggerFocusIn(): void;
2917
+ protected onTriggerFocusOut(): void;
2918
+ /** Resting the pointer inside the panel must not dismiss it (hoverable). */
2919
+ protected onPanelEnter(): void;
2920
+ protected onPanelLeave(): void;
2921
+ /**
2922
+ * Tooltip panels are `manual`, so Escape is ours: dismiss without moving
2923
+ * focus, and stop propagation so an enclosing dialog stays open. Capture
2924
+ * phase, document-level — the pointer may be nowhere near the trigger.
2925
+ */
2926
+ private attachTooltipEscape;
2406
2927
  protected readonly triggerClassName: string;
2928
+ private readonly resolvedMaxWidth;
2407
2929
  protected readonly popoverClassName: _angular_core.Signal<string>;
2930
+ /** Empty regions collapse, so bare content renders v1's single-region look. */
2931
+ protected readonly headerRowClassName: _angular_core.Signal<string>;
2932
+ protected readonly titleClassName: _angular_core.Signal<string>;
2933
+ protected readonly bodyClassName: _angular_core.Signal<string>;
2934
+ protected readonly footerRowClassName: _angular_core.Signal<string>;
2408
2935
  protected readonly arrowClassName: _angular_core.Signal<string>;
2409
2936
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniPopoverComponent, never>;
2410
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniPopoverComponent, "uni-popover", never, { "placement": { "alias": "placement"; "required": false; "isSignal": true; }; "autoClose": { "alias": "autoClose"; "required": false; "isSignal": true; }; }, {}, never, ["[trigger]", "*"], true, never>;
2937
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniPopoverComponent, "uni-popover", never, { "placement": { "alias": "placement"; "required": false; "isSignal": true; }; "autoClose": { "alias": "autoClose"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "anchor": { "alias": "anchor"; "required": false; "isSignal": true; }; "header": { "alias": "header"; "required": false; "isSignal": true; }; "closable": { "alias": "closable"; "required": false; "isSignal": true; }; "arrow": { "alias": "arrow"; "required": false; "isSignal": true; }; "maxWidth": { "alias": "maxWidth"; "required": false; "isSignal": true; }; "openDelay": { "alias": "openDelay"; "required": false; "isSignal": true; }; "closeDelay": { "alias": "closeDelay"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "opened": "opened"; "closed": "closed"; }, never, ["[trigger]", "[popover-header]", "*", "[popover-footer]"], true, never>;
2411
2938
  }
2412
2939
 
2413
2940
  declare class UniProgressBarComponent {
@@ -2550,6 +3077,9 @@ interface UniSearchInputOptions {
2550
3077
  clearSymbol?: string;
2551
3078
  /** Suggestion list surface color token. */
2552
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;
2553
3083
  /** Suggestion list elevation token. */
2554
3084
  listShadow?: Shadow;
2555
3085
  /** Suggestion list radius token. */
@@ -3052,6 +3582,9 @@ interface UniTagInputOptions {
3052
3582
  listColor?: ContainerColorToken;
3053
3583
  listShadow?: Shadow;
3054
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;
3055
3588
  maxSuggestions?: number;
3056
3589
  }
3057
3590
 
@@ -3276,6 +3809,9 @@ interface UniTimeInputOptions {
3276
3809
  listColor?: ContainerColorToken;
3277
3810
  listShadow?: Shadow;
3278
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;
3279
3815
  maxVisibleOptions?: number;
3280
3816
  }
3281
3817
 
@@ -3453,6 +3989,102 @@ declare class UniTooltipComponent extends BaseComponent<UniTooltipOptions> {
3453
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>;
3454
3990
  }
3455
3991
 
3992
+ /**
3993
+ * Advances a step from an interaction on its target instead of the Next
3994
+ * button. `auto` advances the moment the event fires; it defaults to true for
3995
+ * `click` (the gesture is complete) and false otherwise (mid-typing must not
3996
+ * yank the user forward — Next unlocks instead).
3997
+ */
3998
+ interface UniTourAdvance {
3999
+ event: string;
4000
+ auto?: boolean;
4001
+ }
4002
+ interface UniTourStep {
4003
+ key: string;
4004
+ /** Element or id to spotlight; omit for a centered, page-dimming step. */
4005
+ target?: HTMLElement | string;
4006
+ title: string;
4007
+ body: string;
4008
+ placement?: Placement;
4009
+ backdrop?: 'spotlight' | 'dim' | 'none';
4010
+ targetInteractive?: boolean;
4011
+ advanceOn?: UniTourAdvance;
4012
+ }
4013
+ /** Theme options for the `tour` component entry. */
4014
+ interface UniTourOptions {
4015
+ progressStyle: 'dots' | 'fraction';
4016
+ footerGap: Size;
4017
+ }
4018
+
4019
+ /**
4020
+ * A thin sequencer over one `uni-callout`: steps spotlight their targets, a
4021
+ * footer walks Next/Back with dots-or-fraction progress, and `advanceOn`
4022
+ * gates a step behind an interaction with its target (auto-advancing for
4023
+ * clicks, unlocking Next otherwise — announced through one `role="status"`
4024
+ * region). Escape or the close button skips the tour and reports the step.
4025
+ *
4026
+ * `active` is a two-way model, so a tour is deep-linkable and inspectable;
4027
+ * steps whose declared target cannot be resolved are skipped (with a dev
4028
+ * warning) in the direction of travel rather than erroring.
4029
+ */
4030
+ declare class UniTourComponent extends BaseComponent<UniTourOptions> {
4031
+ private renderer;
4032
+ private destroyRef;
4033
+ steps: _angular_core.InputSignal<UniTourStep[]>;
4034
+ /** The presented step index, or null when the tour is not running. */
4035
+ active: _angular_core.ModelSignal<number>;
4036
+ nextLabel: _angular_core.InputSignal<string>;
4037
+ backLabel: _angular_core.InputSignal<string>;
4038
+ skipLabel: _angular_core.InputSignal<string>;
4039
+ doneLabel: _angular_core.InputSignal<string>;
4040
+ started: _angular_core.OutputEmitterRef<void>;
4041
+ stepChanged: _angular_core.OutputEmitterRef<{
4042
+ key: string;
4043
+ index: number;
4044
+ }>;
4045
+ finished: _angular_core.OutputEmitterRef<void>;
4046
+ skipped: _angular_core.OutputEmitterRef<{
4047
+ key: string;
4048
+ index: number;
4049
+ }>;
4050
+ protected readonly calloutOpen: _angular_core.WritableSignal<boolean>;
4051
+ protected readonly satisfied: _angular_core.WritableSignal<boolean>;
4052
+ protected readonly announcement: _angular_core.WritableSignal<string>;
4053
+ protected readonly resolvedTarget: _angular_core.WritableSignal<HTMLElement>;
4054
+ private readonly presentedIndex;
4055
+ private gateCleanup;
4056
+ protected readonly index: _angular_core.Signal<number>;
4057
+ protected readonly currentStep: _angular_core.Signal<UniTourStep>;
4058
+ protected readonly isLast: _angular_core.Signal<boolean>;
4059
+ protected readonly clickGate: _angular_core.Signal<boolean>;
4060
+ /** Gated steps force an interactive target — the gate needs the gesture. */
4061
+ protected readonly targetInteractive: _angular_core.Signal<boolean>;
4062
+ protected readonly stepAriaLabel: _angular_core.Signal<string>;
4063
+ constructor();
4064
+ start(at?: number): void;
4065
+ next(): void;
4066
+ back(): void;
4067
+ skip(): void;
4068
+ protected advance(): void;
4069
+ /**
4070
+ * Present step `index`, skipping (in the direction of travel) steps whose
4071
+ * declared target cannot be resolved right now.
4072
+ */
4073
+ private present;
4074
+ private setupGate;
4075
+ protected onDismissed(dismissal: UniCalloutDismissal): void;
4076
+ /** Arrow keys navigate only while focus is inside the panel. */
4077
+ protected onPanelKeydown(event: KeyboardEvent): void;
4078
+ private finishTour;
4079
+ private stopTour;
4080
+ protected readonly statusClassName: string;
4081
+ protected readonly footerClassName: _angular_core.Signal<string>;
4082
+ protected readonly dotsClassName: _angular_core.Signal<string>;
4083
+ protected readonly fractionClassName: string;
4084
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniTourComponent, never>;
4085
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniTourComponent, "uni-tour", never, { "steps": { "alias": "steps"; "required": true; "isSignal": true; }; "active": { "alias": "active"; "required": false; "isSignal": true; }; "nextLabel": { "alias": "nextLabel"; "required": false; "isSignal": true; }; "backLabel": { "alias": "backLabel"; "required": false; "isSignal": true; }; "skipLabel": { "alias": "skipLabel"; "required": false; "isSignal": true; }; "doneLabel": { "alias": "doneLabel"; "required": false; "isSignal": true; }; }, { "active": "activeChange"; "started": "started"; "stepChanged": "stepChanged"; "finished": "finished"; "skipped": "skipped"; }, never, never, true, never>;
4086
+ }
4087
+
3456
4088
  declare class BodyRenderDirective implements OnInit {
3457
4089
  private el;
3458
4090
  private renderer;
@@ -3471,5 +4103,5 @@ declare class DragAndDropDirective {
3471
4103
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<DragAndDropDirective, "[uni-drag-n-drop], [dragAndDrop]", never, {}, { "onFileDropped": "onFileDropped"; }, never, never, true, never>;
3472
4104
  }
3473
4105
 
3474
- 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 };
3475
- 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 };
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 };