@uni-design-system/uni-angular 10.3.0 → 11.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
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, MotionToken, ThemeName, ThemeParseResult, TextRole, ContentColorToken, Size, NullableSize, Thickness, NullableStyleExpression, ColorKey, ColorToken, Typeface, Radius, Motion, OptionalSize, Border, Shadow, ZIndexableElements, OptionalAlignSelf, OptionalAlignItems, OptionalAlignContent, OptionalJustifyContent, OptionalDisplay, OptionalPosition, OptionalOverflow, OptionalFlexDirection, OptionalTextAlign, OptionalWrap, TextColor, TagTone, Elevation, RadiiSize, JustifyContent, StyleExpression, Orientation, CssLength, ColorScheme, ColorCategory, ThemeShape, ContrastCheck, Colors, GenerationInput } from '@uni-design-system/uni-core';
4
+ import { IconName, Variant, ContainerColorToken, PaletteConfig, GenerateColorsConfig, Radii, UniTheme, ComponentName, ComponentTheme, MotionToken, StyleExpression, ThemeName, ThemeParseResult, TextRole, ContentColorToken, Size, NullableSize, Thickness, NullableStyleExpression, ColorKey, ColorToken, Typeface, Radius, Motion, Backdrop, OptionalSize, Border, Shadow, ZIndexableElements, OptionalColor, OptionalRadius, OptionalBorder, OptionalAlignSelf, OptionalAlignItems, OptionalAlignContent, OptionalJustifyContent, OptionalDisplay, OptionalPosition, OptionalOverflow, OptionalFlexDirection, OptionalTextAlign, OptionalWrap, TextColor, TagTone, Elevation, RadiiSize, JustifyContent, Orientation, CssLength, ColorScheme, ColorCategory, ThemeShape, ContrastCheck, Colors, GenerationInput } from '@uni-design-system/uni-core';
5
5
  import { FormCheckboxControl, FormValueControl } from '@angular/forms/signals';
6
6
  import * as _uni_design_system_uni_angular from '@uni-design-system/uni-angular';
7
7
  import { CSSObject } from '@emotion/css/create-instance';
@@ -805,7 +805,7 @@ declare abstract class UniBaseDatasource<T> {
805
805
  abstract recordCount: Signal<number>;
806
806
  selections: WritableSignal<T[]>;
807
807
  sort: WritableSignal<Sort<T>>;
808
- sortColumn: Signal<keyof T>;
808
+ sortColumn: Signal<keyof T | undefined>;
809
809
  sortDirection: Signal<SortDirection>;
810
810
  abstract pageIndex: Signal<number>;
811
811
  abstract pageSize: Signal<number>;
@@ -872,7 +872,7 @@ declare class UniServerSideDatasource<T> extends UniBaseDatasource<T> {
872
872
  private _sortColumn;
873
873
  private _sortDirection;
874
874
  private filter;
875
- sortColumn: _angular_core.Signal<keyof T>;
875
+ sortColumn: _angular_core.Signal<keyof T | undefined>;
876
876
  sortDirection: _angular_core.Signal<SortDirection>;
877
877
  private totalRecords;
878
878
  private dataResource;
@@ -883,7 +883,7 @@ declare class UniServerSideDatasource<T> extends UniBaseDatasource<T> {
883
883
  records: _angular_core.Signal<T[]>;
884
884
  recordCount: _angular_core.Signal<number>;
885
885
  isLoading: _angular_core.Signal<boolean>;
886
- error: _angular_core.Signal<Error>;
886
+ error: _angular_core.Signal<Error | undefined>;
887
887
  hasError: _angular_core.Signal<boolean>;
888
888
  constructor(dataLoader: DataLoader<T>, initialPageSize?: number);
889
889
  sortRecords(sort: Sort<T>): void;
@@ -942,13 +942,13 @@ interface Confirmation {
942
942
  }
943
943
 
944
944
  declare class NotificationService {
945
- alert: _angular_core.WritableSignal<Alert>;
945
+ alert: _angular_core.WritableSignal<Alert | undefined>;
946
946
  showAlert: (alert: Alert) => void;
947
947
  hideAlert: () => void;
948
- snackbar: _angular_core.WritableSignal<Snackbar>;
948
+ snackbar: _angular_core.WritableSignal<Snackbar | undefined>;
949
949
  showSnackbar: (snackbar: Snackbar) => void;
950
950
  hideSnackbar: () => void;
951
- confirmation: _angular_core.WritableSignal<Confirmation>;
951
+ confirmation: _angular_core.WritableSignal<Confirmation | undefined>;
952
952
  showConfirmation: (confirmation: Confirmation) => void;
953
953
  hideConfirmation: () => void;
954
954
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NotificationService, never>;
@@ -1019,6 +1019,8 @@ declare class ThemeService {
1019
1019
  shadows: Signal<Partial<Record<string, string>>>;
1020
1020
  icons: Signal<_uni_design_system_uni_core.Icons>;
1021
1021
  motions: Signal<Partial<Record<string, MotionToken>>>;
1022
+ /** Same story as `motions`: a JSON theme may predate the backdrops scale. */
1023
+ backdrops: Signal<Partial<Record<string, StyleExpression>>>;
1022
1024
  constructor();
1023
1025
  /**
1024
1026
  * Activate a registered theme. Returns false — touching nothing, persisting
@@ -1052,7 +1054,7 @@ declare class ThemeService {
1052
1054
  /** Remove a registered theme; falls back to the first remaining theme if it was active. */
1053
1055
  unregisterTheme(id: string): void;
1054
1056
  /** The live brand palette config, when a custom theme is active. */
1055
- customPalette: _angular_core.WritableSignal<BrandPaletteConfig>;
1057
+ customPalette: _angular_core.WritableSignal<BrandPaletteConfig | null>;
1056
1058
  isCustomTheme: Signal<boolean>;
1057
1059
  /**
1058
1060
  * Generate a full theme from a brand palette config and make it active. When
@@ -1066,7 +1068,7 @@ declare class ThemeService {
1066
1068
  selectedThemeKey: _angular_core.WritableSignal<string>;
1067
1069
  textClass: (textRole: TextRole, textColor?: ContentColorToken) => string;
1068
1070
  componentStyle: (componentName: ComponentName, variant: Variant, size: Size) => Signal<{
1069
- [x: string]: string | number | _uni_design_system_uni_core.StyleExpression;
1071
+ [x: string]: string | number | StyleExpression | undefined;
1070
1072
  }>;
1071
1073
  /**
1072
1074
  * The active variant's roles from a component's `variantOptions` map — the
@@ -1095,7 +1097,7 @@ declare class ThemeService {
1095
1097
  * scale like any other token — it is `0`, not the string `'none'`, which is
1096
1098
  * not a valid length and was silently dropped wherever it landed.
1097
1099
  */
1098
- getSpacing: (size: NullableSize) => string | number;
1100
+ getSpacing: (size: NullableSize) => string | number | undefined;
1099
1101
  private readonly warnedSpacing;
1100
1102
  /**
1101
1103
  * Resolve a spacing token against the active theme.
@@ -1106,12 +1108,12 @@ declare class ThemeService {
1106
1108
  * per token in dev.
1107
1109
  */
1108
1110
  private resolveSpacing;
1109
- getThickness: (thickness: Thickness) => string | number;
1110
- getContentColor: (token: ContainerColorToken, useVariant?: boolean) => string;
1111
+ getThickness: (thickness: Thickness) => string | number | undefined;
1112
+ getContentColor: (token: ContainerColorToken, useVariant?: boolean) => string | undefined;
1111
1113
  colorPair: (token?: ContainerColorToken, colorVariant?: boolean) => NullableStyleExpression;
1112
1114
  backgroundColor: (token?: ColorKey) => NullableStyleExpression;
1113
1115
  backgroundImage: (url?: string) => NullableStyleExpression;
1114
- getContainerColors: (color: Variant, useVariant?: boolean) => _uni_design_system_uni_core.StyleExpression;
1116
+ getContainerColors: (color: Variant, useVariant?: boolean) => NullableStyleExpression;
1115
1117
  /**
1116
1118
  * The shared keyboard-focus indicator's styles (WCAG 2.4.7), without a
1117
1119
  * selector — for controls that key the ring off their own state selector
@@ -1128,7 +1130,7 @@ declare class ThemeService {
1128
1130
  * color or `currentColor`.
1129
1131
  */
1130
1132
  focusRingStyle: (color?: string, gap?: string | number) => {
1131
- boxShadow?: string;
1133
+ boxShadow?: string | undefined;
1132
1134
  outline: string;
1133
1135
  outlineOffset: string | number;
1134
1136
  };
@@ -1139,12 +1141,12 @@ declare class ThemeService {
1139
1141
  */
1140
1142
  focusRing: (token?: ColorToken) => {
1141
1143
  '&:focus-visible': {
1142
- boxShadow?: string;
1144
+ boxShadow?: string | undefined;
1143
1145
  outline: string;
1144
1146
  outlineOffset: string | number;
1145
1147
  };
1146
1148
  };
1147
- typeface: (typeface?: Typeface) => _uni_design_system_uni_core.TypeFaceDefinition;
1149
+ typeface: (typeface?: Typeface) => "" | _uni_design_system_uni_core.TypeFaceDefinition | undefined;
1148
1150
  colorPalette: () => Partial<Record<string, string>>;
1149
1151
  color(color?: ColorKey): NullableStyleExpression;
1150
1152
  getDashedBorder(color: ColorKey | undefined, radius: Radius | undefined): NullableStyleExpression;
@@ -1154,6 +1156,16 @@ declare class ThemeService {
1154
1156
  * token that isn't there — still animates rather than snapping.
1155
1157
  */
1156
1158
  motion(token: Motion | undefined): MotionToken;
1159
+ private readonly warnedBackdrops;
1160
+ /**
1161
+ * Resolves a named backdrop primitive — the wash a modal surface lays over
1162
+ * the page — so every such surface dims it the same way.
1163
+ *
1164
+ * A raw style object passes straight through: that is the shape the dialog's
1165
+ * and drawer's `backdrop` options took before the scale existed, and a
1166
+ * consumer theme that still states one keeps working.
1167
+ */
1168
+ backdrop(token: Backdrop | StyleExpression | undefined): NullableStyleExpression;
1157
1169
  radius(size: Radius | undefined): NullableStyleExpression;
1158
1170
  getRadiusLeft(size: Radius | undefined): NullableStyleExpression;
1159
1171
  getRadiusRight(size: Radius | undefined): NullableStyleExpression;
@@ -1178,14 +1190,14 @@ declare class ThemeService {
1178
1190
  borderLeft(border: Border | undefined): NullableStyleExpression;
1179
1191
  borderRight(border: Border | undefined): NullableStyleExpression;
1180
1192
  boxShadow(shadow: Shadow | undefined): {
1181
- boxShadow: string;
1182
- };
1193
+ boxShadow: string | undefined;
1194
+ } | undefined;
1183
1195
  gap(gap: OptionalSize): NullableStyleExpression;
1184
1196
  zIndex(element: ZIndexableElements | undefined): NullableStyleExpression;
1185
1197
  borderColor(borderColor: ColorToken): NullableStyleExpression;
1186
1198
  getComponentTheme<T, V = object>(componentName: ComponentName): Signal<ComponentTheme<T, V>>;
1187
1199
  getComponentOptions: <T>(componentName: ComponentName) => _angular_core.WritableSignal<T>;
1188
- componentOptions: (componentName: ComponentName) => Signal<unknown>;
1200
+ componentOptions: (componentName: ComponentName) => Signal<{}>;
1189
1201
  style(prop: string, value: string | number | undefined): NullableStyleExpression;
1190
1202
  /**
1191
1203
  * Like {@link style}, but only `undefined` means "unset" — so a meaningful
@@ -1211,10 +1223,10 @@ declare class BaseComponent<T = unknown, V = unknown> {
1211
1223
  * be expressed as a single applied style. Undefined when the theme does not
1212
1224
  * define this variant — which also raises a dev warning.
1213
1225
  */
1214
- variantRoles: _angular_core.Signal<V>;
1226
+ variantRoles: _angular_core.Signal<V | undefined>;
1215
1227
  componentOptions: _angular_core.Signal<T>;
1216
1228
  style: _angular_core.Signal<{
1217
- [x: string]: string | number | _uni_design_system_uni_core.StyleExpression;
1229
+ [x: string]: string | number | _uni_design_system_uni_core.StyleExpression | undefined;
1218
1230
  }>;
1219
1231
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<BaseComponent<any, any>, never>;
1220
1232
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<BaseComponent<any, any>, "ng-component", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
@@ -1238,6 +1250,8 @@ interface UniCheckboxVariant {
1238
1250
  onAccent?: ColorKey;
1239
1251
  }
1240
1252
  interface UniCheckboxOptions {
1253
+ /** Named motion primitive for the box, tick and dash transitions. Defaults to `control`. */
1254
+ motion?: Motion;
1241
1255
  size?: string | number;
1242
1256
  borderRadius?: string | number;
1243
1257
  /** Unchecked box background token. */
@@ -1249,6 +1263,13 @@ declare class UniCheckboxComponent extends BaseComponent<UniCheckboxOptions, Uni
1249
1263
  readonly checked: _angular_core.ModelSignal<boolean>;
1250
1264
  readonly disabled: _angular_core.InputSignal<boolean>;
1251
1265
  readonly touched: _angular_core.ModelSignal<boolean>;
1266
+ /**
1267
+ * Angular 22 marks the bound field touched through this output; the
1268
+ * `touched` model above is bound inward by the directive and no longer
1269
+ * propagates back out. Emitted wherever this control already decided
1270
+ * the user was done with it.
1271
+ */
1272
+ readonly touch: _angular_core.OutputEmitterRef<void>;
1252
1273
  readonly invalid: _angular_core.InputSignal<boolean>;
1253
1274
  readonly dirty: _angular_core.InputSignal<boolean>;
1254
1275
  /** Synced from required() validators by the Signal Forms [formField] directive. */
@@ -1259,13 +1280,13 @@ declare class UniCheckboxComponent extends BaseComponent<UniCheckboxOptions, Uni
1259
1280
  * `variant` defaults to `'primary'`, so the component cannot tell "set to
1260
1281
  * primary" from "not set".
1261
1282
  */
1262
- readonly checkedColor: _angular_core.InputSignal<string>;
1283
+ readonly checkedColor: _angular_core.InputSignal<string | undefined>;
1263
1284
  /**
1264
1285
  * Id(s) of external element(s) describing this control — typically your
1265
1286
  * app-rendered error message — exposed as aria-describedby.
1266
1287
  */
1267
- readonly ariaDescribedBy: _angular_core.InputSignal<string>;
1268
- readonly label: _angular_core.InputSignal<string>;
1288
+ readonly ariaDescribedBy: _angular_core.InputSignal<string | undefined>;
1289
+ readonly label: _angular_core.InputSignal<string | undefined>;
1269
1290
  /**
1270
1291
  * Mixed state for "select all"-style parent checkboxes. Cleared
1271
1292
  * automatically on the next user interaction, matching native behavior.
@@ -1274,6 +1295,10 @@ declare class UniCheckboxComponent extends BaseComponent<UniCheckboxOptions, Uni
1274
1295
  protected readonly showError: _angular_core.Signal<boolean>;
1275
1296
  markAsTouched(): void;
1276
1297
  handleChange(event: Event): void;
1298
+ /** Resolved from the component's `motion` option; `control` by default. */
1299
+ private readonly motion;
1300
+ /** The tick is drawn rather than switched, so it trails the box. */
1301
+ private readonly drawMotion;
1277
1302
  protected readonly checkboxLabel: _angular_core.Signal<string>;
1278
1303
  protected readonly checkboxInput: _angular_core.Signal<string>;
1279
1304
  /**
@@ -1289,9 +1314,9 @@ declare class UniCheckboxComponent extends BaseComponent<UniCheckboxOptions, Uni
1289
1314
  * default every component inherits.
1290
1315
  */
1291
1316
  private readonly accent;
1292
- protected readonly boxColor: _angular_core.Signal<string>;
1317
+ protected readonly boxColor: _angular_core.Signal<string | undefined>;
1293
1318
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniCheckboxComponent, never>;
1294
- 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; }; "checkedColor": { "alias": "checkedColor"; "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>;
1319
+ 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; }; "checkedColor": { "alias": "checkedColor"; "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"; "touch": "touch"; "indeterminate": "indeterminateChange"; }, never, never, true, never>;
1295
1320
  }
1296
1321
 
1297
1322
  /** A commit was refused (no match); the field reverted to the committed label. */
@@ -1331,16 +1356,23 @@ interface UniComboboxOptions {
1331
1356
  * value contract is identical, so swapping is a template-only change.
1332
1357
  */
1333
1358
  declare class UniComboboxComponent<T> extends BaseComponent<UniComboboxOptions> implements FormValueControl<T | null> {
1334
- readonly value: _angular_core.ModelSignal<T>;
1359
+ readonly value: _angular_core.ModelSignal<T | null>;
1335
1360
  readonly disabled: _angular_core.InputSignal<boolean>;
1336
1361
  readonly touched: _angular_core.ModelSignal<boolean>;
1362
+ /**
1363
+ * Angular 22 marks the bound field touched through this output; the
1364
+ * `touched` model above is bound inward by the directive and no longer
1365
+ * propagates back out. Emitted wherever this control already decided
1366
+ * the user was done with it.
1367
+ */
1368
+ readonly touch: _angular_core.OutputEmitterRef<void>;
1337
1369
  readonly invalid: _angular_core.InputSignal<boolean>;
1338
1370
  readonly dirty: _angular_core.InputSignal<boolean>;
1339
1371
  readonly required: _angular_core.InputSignal<boolean>;
1340
- readonly ariaDescribedBy: _angular_core.InputSignal<string>;
1372
+ readonly ariaDescribedBy: _angular_core.InputSignal<string | undefined>;
1341
1373
  /** Accessible name for the field, e.g. "State"; echoed on the listbox. */
1342
1374
  label: _angular_core.InputSignal<string>;
1343
- placeholder: _angular_core.InputSignal<string>;
1375
+ placeholder: _angular_core.InputSignal<string | undefined>;
1344
1376
  options: _angular_core.InputSignal<Options<T>>;
1345
1377
  /**
1346
1378
  * Equality used to match `value` against option values, called as
@@ -1360,7 +1392,7 @@ declare class UniComboboxComponent<T> extends BaseComponent<UniComboboxOptions>
1360
1392
  /** `false` renders `options` verbatim; narrow them app-side from `query`. */
1361
1393
  filterLocally: _angular_core.InputSignal<boolean>;
1362
1394
  /** Filter predicate; default is locale-lowercased label-contains. */
1363
- filterWith: _angular_core.InputSignal<(option: Option<T>, query: string) => boolean>;
1395
+ filterWith: _angular_core.InputSignal<((option: Option<T>, query: string) => boolean) | undefined>;
1364
1396
  debounceTime: _angular_core.InputSignal<number>;
1365
1397
  /** Debounced draft text, for async option lists. */
1366
1398
  query: _angular_core.OutputEmitterRef<string>;
@@ -1377,13 +1409,13 @@ declare class UniComboboxComponent<T> extends BaseComponent<UniComboboxOptions>
1377
1409
  /** Ties the popup to the field so the browser tracks it in the top layer. */
1378
1410
  private readonly anchor;
1379
1411
  /** `manual` where the top layer is usable, else null — see the popup helper. */
1380
- protected readonly popupAttr: "manual";
1412
+ protected readonly popupAttr: "manual" | null;
1381
1413
  constructor();
1382
1414
  protected readonly srOnly: string;
1383
1415
  /** Commits, clears and refusals are otherwise silent to a screen reader. */
1384
1416
  protected readonly announcer: _uni_design_system_uni_angular.Announcer;
1385
1417
  /** null → the field shows the committed label; a string is an uncommitted draft. */
1386
- protected readonly draft: _angular_core.WritableSignal<string>;
1418
+ protected readonly draft: _angular_core.WritableSignal<string | null>;
1387
1419
  /**
1388
1420
  * Popup visibility. Component-owned rather than `list.open()` — the shared
1389
1421
  * signal gates on `count() > 0`, which would hide the "No matches" row and
@@ -1432,6 +1464,8 @@ declare class UniComboboxComponent<T> extends BaseComponent<UniComboboxOptions>
1432
1464
  private closeList;
1433
1465
  private scrollToActive;
1434
1466
  private setFieldText;
1467
+ /** The chevron turns with the popup it opens, so both read one token. */
1468
+ private readonly chevronMotion;
1435
1469
  protected readonly className: _angular_core.Signal<string>;
1436
1470
  protected readonly rowClass: _angular_core.Signal<string>;
1437
1471
  protected readonly inputClass: _angular_core.Signal<string>;
@@ -1440,7 +1474,7 @@ declare class UniComboboxComponent<T> extends BaseComponent<UniComboboxOptions>
1440
1474
  protected readonly toggleClass: _angular_core.Signal<string>;
1441
1475
  protected readonly listClass: _angular_core.Signal<string>;
1442
1476
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniComboboxComponent<any>, never>;
1443
- 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>;
1477
+ 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"; "touch": "touch"; "query": "query"; "selected": "selected"; "cleared": "cleared"; "rejected": "rejected"; }, never, never, true, never>;
1444
1478
  }
1445
1479
 
1446
1480
  type UniCalendarMode = 'single' | 'range';
@@ -1469,8 +1503,8 @@ interface UniCalendarOptions {
1469
1503
  typeface?: Typeface;
1470
1504
  /** Grid gutter. */
1471
1505
  gap?: NullableSize;
1472
- navPrevSymbol?: string;
1473
- navNextSymbol?: string;
1506
+ navPrevIcon?: IconName;
1507
+ navNextIcon?: IconName;
1474
1508
  /** Intl weekday column format. */
1475
1509
  weekdayFormat?: 'narrow' | 'short';
1476
1510
  /** Show the adjacent months' days, muted and non-interactive. */
@@ -1490,7 +1524,7 @@ interface UniDateInputRejection {
1490
1524
  * affordance and panel only.
1491
1525
  */
1492
1526
  interface UniDateInputOptions {
1493
- toggleSymbol?: string;
1527
+ toggleIcon?: IconName;
1494
1528
  popupShadow?: Shadow;
1495
1529
  popupBorderRadius?: Radius;
1496
1530
  popupColor?: ContainerColorToken;
@@ -1505,31 +1539,38 @@ interface UniDateInputOptions {
1505
1539
  * native popover hosting the same `uni-calendar` an app could render inline.
1506
1540
  */
1507
1541
  declare class UniDateInputComponent extends BaseComponent<UniDateInputOptions> implements FormValueControl<UniDate | undefined> {
1508
- readonly value: _angular_core.ModelSignal<string>;
1542
+ readonly value: _angular_core.ModelSignal<string | undefined>;
1509
1543
  readonly disabled: _angular_core.InputSignal<boolean>;
1510
1544
  readonly touched: _angular_core.ModelSignal<boolean>;
1545
+ /**
1546
+ * Angular 22 marks the bound field touched through this output; the
1547
+ * `touched` model above is bound inward by the directive and no longer
1548
+ * propagates back out. Emitted wherever this control already decided
1549
+ * the user was done with it.
1550
+ */
1551
+ readonly touch: _angular_core.OutputEmitterRef<void>;
1511
1552
  readonly invalid: _angular_core.InputSignal<boolean>;
1512
1553
  readonly dirty: _angular_core.InputSignal<boolean>;
1513
1554
  readonly required: _angular_core.InputSignal<boolean>;
1514
- readonly ariaDescribedBy: _angular_core.InputSignal<string>;
1555
+ readonly ariaDescribedBy: _angular_core.InputSignal<string | undefined>;
1515
1556
  /** Accessible name for the field, e.g. "Appointment date". */
1516
1557
  label: _angular_core.InputSignal<string>;
1517
1558
  /** Defaults to the locale's digit pattern, e.g. `MM/DD/YYYY`. */
1518
- placeholder: _angular_core.InputSignal<string>;
1559
+ placeholder: _angular_core.InputSignal<string | undefined>;
1519
1560
  /** How the committed value renders, e.g. `{ dateStyle: 'long' }`. */
1520
1561
  displayFormat: _angular_core.InputSignal<Intl.DateTimeFormatOptions>;
1521
1562
  /** BCP 47 tag; defaults to the document language, then the browser's. */
1522
- locale: _angular_core.InputSignal<string>;
1563
+ locale: _angular_core.InputSignal<string | undefined>;
1523
1564
  commitOnBlur: _angular_core.InputSignal<boolean>;
1524
1565
  /** Custom parser, replacing the built-in ISO/locale/month-name parsing. */
1525
- parse: _angular_core.InputSignal<(raw: string, locale: string) => UniDate | null>;
1566
+ parse: _angular_core.InputSignal<((raw: string, locale: string) => UniDate | null) | undefined>;
1526
1567
  /** Renders without its own input-box chrome, for composers like uni-date-time-input. */
1527
1568
  embedded: _angular_core.InputSignal<boolean>;
1528
- minDate: _angular_core.InputSignal<string>;
1529
- maxDate: _angular_core.InputSignal<string>;
1530
- disabledDates: _angular_core.InputSignal<string[] | ((date: UniDate) => boolean)>;
1569
+ minDate: _angular_core.InputSignal<string | undefined>;
1570
+ maxDate: _angular_core.InputSignal<string | undefined>;
1571
+ disabledDates: _angular_core.InputSignal<string[] | ((date: UniDate) => boolean) | undefined>;
1531
1572
  markers: _angular_core.InputSignal<UniCalendarMarker[]>;
1532
- weekStart: _angular_core.InputSignal<0 | 1 | 2 | 3 | 4 | 5 | 6>;
1573
+ weekStart: _angular_core.InputSignal<0 | 1 | 2 | 3 | 4 | 5 | 6 | undefined>;
1533
1574
  /** Popup shown. */
1534
1575
  opened: _angular_core.OutputEmitterRef<void>;
1535
1576
  /** Popup hidden. */
@@ -1579,7 +1620,7 @@ declare class UniDateInputComponent extends BaseComponent<UniDateInputOptions> i
1579
1620
  /** Embedded mode: the composer owns the box; keep only the flex row. */
1580
1621
  protected readonly embeddedClass: _angular_core.Signal<string>;
1581
1622
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniDateInputComponent, never>;
1582
- 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>;
1623
+ 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"; "touch": "touch"; "opened": "opened"; "closed": "closed"; "rejected": "rejected"; }, never, never, true, never>;
1583
1624
  }
1584
1625
 
1585
1626
  /**
@@ -1604,29 +1645,36 @@ interface UniDateTimeInputOptions {
1604
1645
  * different arrangement compose the primitives directly.
1605
1646
  */
1606
1647
  declare class UniDateTimeInputComponent extends BaseComponent<UniDateTimeInputOptions> implements FormValueControl<UniDateTime | undefined> {
1607
- readonly value: _angular_core.ModelSignal<string>;
1648
+ readonly value: _angular_core.ModelSignal<string | undefined>;
1608
1649
  readonly disabled: _angular_core.InputSignal<boolean>;
1609
1650
  readonly touched: _angular_core.ModelSignal<boolean>;
1651
+ /**
1652
+ * Angular 22 marks the bound field touched through this output; the
1653
+ * `touched` model above is bound inward by the directive and no longer
1654
+ * propagates back out. Emitted wherever this control already decided
1655
+ * the user was done with it.
1656
+ */
1657
+ readonly touch: _angular_core.OutputEmitterRef<void>;
1610
1658
  readonly invalid: _angular_core.InputSignal<boolean>;
1611
1659
  readonly dirty: _angular_core.InputSignal<boolean>;
1612
1660
  readonly required: _angular_core.InputSignal<boolean>;
1613
- readonly ariaDescribedBy: _angular_core.InputSignal<string>;
1661
+ readonly ariaDescribedBy: _angular_core.InputSignal<string | undefined>;
1614
1662
  /** Names the group; the parts are announced as "Date" and "Time" under it. */
1615
1663
  label: _angular_core.InputSignal<string>;
1616
1664
  /** Earliest allowed moment; the date and time fences are split from it. */
1617
- minDateTime: _angular_core.InputSignal<string>;
1665
+ minDateTime: _angular_core.InputSignal<string | undefined>;
1618
1666
  /** Latest allowed moment; the date and time fences are split from it. */
1619
- maxDateTime: _angular_core.InputSignal<string>;
1620
- disabledDates: _angular_core.InputSignal<string[] | ((date: UniDate) => boolean)>;
1667
+ maxDateTime: _angular_core.InputSignal<string | undefined>;
1668
+ disabledDates: _angular_core.InputSignal<string[] | ((date: UniDate) => boolean) | undefined>;
1621
1669
  markers: _angular_core.InputSignal<UniCalendarMarker[]>;
1622
1670
  /** Fixed time choices; superseded per-day by `slotsFor` when that is set. */
1623
- slots: _angular_core.InputSignal<string[]>;
1671
+ slots: _angular_core.InputSignal<string[] | undefined>;
1624
1672
  minuteStep: _angular_core.InputSignal<number>;
1625
- hour12: _angular_core.InputSignal<boolean>;
1626
- weekStart: _angular_core.InputSignal<0 | 1 | 2 | 3 | 4 | 5 | 6>;
1627
- locale: _angular_core.InputSignal<string>;
1673
+ hour12: _angular_core.InputSignal<boolean | undefined>;
1674
+ weekStart: _angular_core.InputSignal<0 | 1 | 2 | 3 | 4 | 5 | 6 | undefined>;
1675
+ locale: _angular_core.InputSignal<string | undefined>;
1628
1676
  /** Scheduling: the day's available times. Gates the time part on a date. */
1629
- slotsFor: _angular_core.InputSignal<(date: UniDate) => UniTime[]>;
1677
+ slotsFor: _angular_core.InputSignal<((date: UniDate) => UniTime[]) | undefined>;
1630
1678
  private readonly host;
1631
1679
  /**
1632
1680
  * The two part-values. An external `value` write re-derives both; an
@@ -1634,17 +1682,17 @@ declare class UniDateTimeInputComponent extends BaseComponent<UniDateTimeInputOp
1634
1682
  * `undefined`) must not be wiped by its own echo.
1635
1683
  */
1636
1684
  private readonly parts;
1637
- protected readonly dateValue: _angular_core.Signal<string>;
1638
- protected readonly timeValue: _angular_core.Signal<string>;
1685
+ protected readonly dateValue: _angular_core.Signal<string | undefined>;
1686
+ protected readonly timeValue: _angular_core.Signal<string | undefined>;
1639
1687
  protected readonly showError: _angular_core.Signal<boolean>;
1640
1688
  private readonly minParts;
1641
1689
  private readonly maxParts;
1642
- protected readonly dateMin: _angular_core.Signal<string>;
1643
- protected readonly dateMax: _angular_core.Signal<string>;
1644
- protected readonly timeMin: _angular_core.Signal<string>;
1645
- protected readonly timeMax: _angular_core.Signal<string>;
1690
+ protected readonly dateMin: _angular_core.Signal<string | undefined>;
1691
+ protected readonly dateMax: _angular_core.Signal<string | undefined>;
1692
+ protected readonly timeMin: _angular_core.Signal<string | undefined>;
1693
+ protected readonly timeMax: _angular_core.Signal<string | undefined>;
1646
1694
  /** The chosen day's slots when `slotsFor` is set, else the fixed list. */
1647
- protected readonly effectiveSlots: _angular_core.Signal<string[]>;
1695
+ protected readonly effectiveSlots: _angular_core.Signal<string[] | undefined>;
1648
1696
  protected readonly timeDisabled: _angular_core.Signal<boolean>;
1649
1697
  protected onDatePartChange(date: UniDate | undefined): void;
1650
1698
  protected onTimePartChange(time: UniTime | undefined): void;
@@ -1656,7 +1704,7 @@ declare class UniDateTimeInputComponent extends BaseComponent<UniDateTimeInputOp
1656
1704
  protected readonly timePartClass: _angular_core.Signal<string>;
1657
1705
  protected readonly dividerClass: _angular_core.Signal<string>;
1658
1706
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniDateTimeInputComponent, never>;
1659
- 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>;
1707
+ 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"; "touch": "touch"; }, never, never, true, never>;
1660
1708
  }
1661
1709
 
1662
1710
  interface UniInputBoxOptions {
@@ -1689,10 +1737,10 @@ declare class UniInputBoxComponent extends BaseComponent<UniInputBoxOptions> {
1689
1737
  error: _angular_core.InputSignal<boolean>;
1690
1738
  minWidth: _angular_core.InputSignal<string>;
1691
1739
  /** Override the themed field height, e.g. `'auto'` for multi-line fields. */
1692
- height: _angular_core.InputSignal<string | number>;
1693
- width: _angular_core.InputSignal<string | number>;
1740
+ height: _angular_core.InputSignal<string | number | undefined>;
1741
+ width: _angular_core.InputSignal<string | number | undefined>;
1694
1742
  fullWidth: _angular_core.InputSignal<boolean>;
1695
- grow: _angular_core.InputSignal<number>;
1743
+ grow: _angular_core.InputSignal<number | undefined>;
1696
1744
  /**
1697
1745
  * Stop applying the themed leading inset to the inner control, for fields
1698
1746
  * that place it themselves.
@@ -1706,10 +1754,10 @@ declare class UniInputBoxComponent extends BaseComponent<UniInputBoxOptions> {
1706
1754
  managedInset: _angular_core.InputSignal<boolean>;
1707
1755
  /** Auto-height fields (tag input, textarea) still keep the themed height as
1708
1756
  a floor, so a single-line field lines up with every other input. */
1709
- protected readonly minHeight: _angular_core.Signal<string | number>;
1757
+ protected readonly minHeight: _angular_core.Signal<string | number | undefined>;
1710
1758
  protected readonly color: _angular_core.Signal<_uni_design_system_uni_core.ContainerColorToken>;
1711
1759
  protected readonly border: _angular_core.Signal<string>;
1712
- protected readonly shadow: _angular_core.Signal<string>;
1760
+ protected readonly shadow: _angular_core.Signal<string | undefined>;
1713
1761
  protected readonly inputBoxClass: _angular_core.Signal<string>;
1714
1762
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniInputBoxComponent, never>;
1715
1763
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniInputBoxComponent, "uni-input-box", never, { "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "minWidth": { "alias": "minWidth"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "fullWidth": { "alias": "fullWidth"; "required": false; "isSignal": true; }; "grow": { "alias": "grow"; "required": false; "isSignal": true; }; "managedInset": { "alias": "managedInset"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
@@ -1733,6 +1781,13 @@ declare class UniInputComponent implements FormValueControl<string> {
1733
1781
  readonly value: _angular_core.ModelSignal<string>;
1734
1782
  readonly disabled: _angular_core.InputSignal<boolean>;
1735
1783
  readonly touched: _angular_core.ModelSignal<boolean>;
1784
+ /**
1785
+ * Angular 22 marks the bound field touched through this output; the
1786
+ * `touched` model above is bound inward by the directive and no longer
1787
+ * propagates back out. Emitted wherever this control already decided
1788
+ * the user was done with it.
1789
+ */
1790
+ readonly touch: _angular_core.OutputEmitterRef<void>;
1736
1791
  readonly invalid: _angular_core.InputSignal<boolean>;
1737
1792
  readonly dirty: _angular_core.InputSignal<boolean>;
1738
1793
  /** Synced from required() validators by the Signal Forms [formField] directive. */
@@ -1741,7 +1796,7 @@ declare class UniInputComponent implements FormValueControl<string> {
1741
1796
  * Id(s) of external element(s) describing this control — typically your
1742
1797
  * app-rendered error message — exposed as aria-describedby.
1743
1798
  */
1744
- readonly ariaDescribedBy: _angular_core.InputSignal<string>;
1799
+ readonly ariaDescribedBy: _angular_core.InputSignal<string | undefined>;
1745
1800
  label: _angular_core.InputSignal<string>;
1746
1801
  placeholder: _angular_core.InputSignal<string>;
1747
1802
  /**
@@ -1751,10 +1806,10 @@ declare class UniInputComponent implements FormValueControl<string> {
1751
1806
  type: _angular_core.InputSignal<UniInputType>;
1752
1807
  readonly readonly: _angular_core.InputSignal<boolean>;
1753
1808
  readonly name: _angular_core.InputSignal<string>;
1754
- readonly min: _angular_core.InputSignal<number>;
1755
- readonly max: _angular_core.InputSignal<number>;
1756
- readonly minLength: _angular_core.InputSignal<number>;
1757
- readonly maxLength: _angular_core.InputSignal<number>;
1809
+ readonly minAttr: _angular_core.InputSignal<number | undefined>;
1810
+ readonly maxAttr: _angular_core.InputSignal<number | undefined>;
1811
+ readonly minLength: _angular_core.InputSignal<number | undefined>;
1812
+ readonly maxLength: _angular_core.InputSignal<number | undefined>;
1758
1813
  /**
1759
1814
  * Patterns the value must match — all of them, per Signal Forms. The native
1760
1815
  * `pattern` attribute can only express one, so it is reflected only when
@@ -1762,25 +1817,25 @@ declare class UniInputComponent implements FormValueControl<string> {
1762
1817
  */
1763
1818
  readonly pattern: _angular_core.InputSignal<readonly RegExp[]>;
1764
1819
  /** Granularity for `type="number"`, e.g. `0.01` or `'any'`. */
1765
- step: _angular_core.InputSignal<string | number>;
1820
+ step: _angular_core.InputSignal<string | number | undefined>;
1766
1821
  /** Autofill hint, e.g. `email`, `current-password`, `off`. */
1767
- autocomplete: _angular_core.InputSignal<string>;
1822
+ autocomplete: _angular_core.InputSignal<string | undefined>;
1768
1823
  /** On-screen keyboard hint; defaults to whatever `type` implies. */
1769
- inputMode: _angular_core.InputSignal<UniInputMode>;
1824
+ inputMode: _angular_core.InputSignal<UniInputMode | undefined>;
1770
1825
  /** Id of a `<datalist>` supplying suggestions. */
1771
- list: _angular_core.InputSignal<string>;
1772
- spellcheck: _angular_core.InputSignal<boolean>;
1826
+ list: _angular_core.InputSignal<string | undefined>;
1827
+ spellcheck: _angular_core.InputSignal<boolean | undefined>;
1773
1828
  /** Reflected only when unambiguous — see `pattern`. */
1774
- protected readonly nativePattern: _angular_core.Signal<string>;
1775
- width: _angular_core.InputSignal<string | number>;
1829
+ protected readonly nativePattern: _angular_core.Signal<string | null>;
1830
+ width: _angular_core.InputSignal<string | number | undefined>;
1776
1831
  fullWidth: _angular_core.InputSignal<boolean>;
1777
- grow: _angular_core.InputSignal<number>;
1832
+ grow: _angular_core.InputSignal<number | undefined>;
1778
1833
  protected readonly showError: _angular_core.Signal<boolean>;
1779
1834
  markAsTouched(): void;
1780
1835
  handleInput(event: Event): void;
1781
1836
  inputClass: string;
1782
1837
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniInputComponent, never>;
1783
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniInputComponent, "uni-input", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": true; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "minLength": { "alias": "minLength"; "required": false; "isSignal": true; }; "maxLength": { "alias": "maxLength"; "required": false; "isSignal": true; }; "pattern": { "alias": "pattern"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "autocomplete": { "alias": "autocomplete"; "required": false; "isSignal": true; }; "inputMode": { "alias": "inputMode"; "required": false; "isSignal": true; }; "list": { "alias": "list"; "required": false; "isSignal": true; }; "spellcheck": { "alias": "spellcheck"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "fullWidth": { "alias": "fullWidth"; "required": false; "isSignal": true; }; "grow": { "alias": "grow"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; }, never, ["pre-input, [pre-input]", "post-input, [post-input]"], true, never>;
1838
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniInputComponent, "uni-input", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": true; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "minAttr": { "alias": "min"; "required": false; "isSignal": true; }; "maxAttr": { "alias": "max"; "required": false; "isSignal": true; }; "minLength": { "alias": "minLength"; "required": false; "isSignal": true; }; "maxLength": { "alias": "maxLength"; "required": false; "isSignal": true; }; "pattern": { "alias": "pattern"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "autocomplete": { "alias": "autocomplete"; "required": false; "isSignal": true; }; "inputMode": { "alias": "inputMode"; "required": false; "isSignal": true; }; "list": { "alias": "list"; "required": false; "isSignal": true; }; "spellcheck": { "alias": "spellcheck"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "fullWidth": { "alias": "fullWidth"; "required": false; "isSignal": true; }; "grow": { "alias": "grow"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; "touch": "touch"; }, never, ["pre-input, [pre-input]", "post-input, [post-input]"], true, never>;
1784
1839
  }
1785
1840
 
1786
1841
  /**
@@ -1807,13 +1862,13 @@ declare class UniBoxDirective {
1807
1862
  * `color` binding would feed both: the box would paint the surface and the
1808
1863
  * text would take the same token, rendering ink on identical ink.
1809
1864
  */
1810
- containerColor: _angular_core.InputSignal<ContainerColorToken>;
1811
- backgroundColor: _angular_core.InputSignal<string>;
1812
- borderRadius: _angular_core.InputSignal<string>;
1813
- borderRadiusLeft: _angular_core.InputSignal<string>;
1814
- borderRadiusRight: _angular_core.InputSignal<string>;
1815
- borderRadiusTop: _angular_core.InputSignal<string>;
1816
- borderRadiusBottom: _angular_core.InputSignal<string>;
1865
+ containerColor: _angular_core.InputSignal<ContainerColorToken | undefined>;
1866
+ backgroundColor: _angular_core.InputSignal<OptionalColor>;
1867
+ borderRadius: _angular_core.InputSignal<OptionalRadius>;
1868
+ borderRadiusLeft: _angular_core.InputSignal<OptionalRadius>;
1869
+ borderRadiusRight: _angular_core.InputSignal<OptionalRadius>;
1870
+ borderRadiusTop: _angular_core.InputSignal<OptionalRadius>;
1871
+ borderRadiusBottom: _angular_core.InputSignal<OptionalRadius>;
1817
1872
  padding: _angular_core.InputSignal<OptionalSize>;
1818
1873
  paddingHorizontal: _angular_core.InputSignal<OptionalSize>;
1819
1874
  paddingVertical: _angular_core.InputSignal<OptionalSize>;
@@ -1821,56 +1876,56 @@ declare class UniBoxDirective {
1821
1876
  paddingRight: _angular_core.InputSignal<OptionalSize>;
1822
1877
  paddingTop: _angular_core.InputSignal<OptionalSize>;
1823
1878
  paddingBottom: _angular_core.InputSignal<OptionalSize>;
1824
- border: _angular_core.InputSignal<string>;
1825
- borderTop: _angular_core.InputSignal<string>;
1826
- borderBottom: _angular_core.InputSignal<string>;
1827
- borderLeft: _angular_core.InputSignal<string>;
1828
- borderRight: _angular_core.InputSignal<string>;
1879
+ border: _angular_core.InputSignal<OptionalBorder>;
1880
+ borderTop: _angular_core.InputSignal<OptionalBorder>;
1881
+ borderBottom: _angular_core.InputSignal<OptionalBorder>;
1882
+ borderLeft: _angular_core.InputSignal<OptionalBorder>;
1883
+ borderRight: _angular_core.InputSignal<OptionalBorder>;
1829
1884
  dashBorder: _angular_core.InputSignal<boolean>;
1830
1885
  alignSelf: _angular_core.InputSignal<OptionalAlignSelf>;
1831
1886
  alignItems: _angular_core.InputSignal<OptionalAlignItems>;
1832
1887
  alignContent: _angular_core.InputSignal<OptionalAlignContent>;
1833
1888
  justifyContent: _angular_core.InputSignal<OptionalJustifyContent>;
1834
- grow: _angular_core.InputSignal<number>;
1889
+ grow: _angular_core.InputSignal<number | undefined>;
1835
1890
  /**
1836
1891
  * The `flex` shorthand. `[flex]="1"` is `flex: 1` — grow, shrink and a zero
1837
1892
  * basis — which `grow` alone cannot express, since it leaves
1838
1893
  * `flex-basis: auto`. Wins over `grow` when both are set.
1839
1894
  */
1840
- flex: _angular_core.InputSignal<string | number>;
1841
- shrink: _angular_core.InputSignal<number>;
1842
- basis: _angular_core.InputSignal<string | number>;
1895
+ flex: _angular_core.InputSignal<string | number | undefined>;
1896
+ shrink: _angular_core.InputSignal<number | undefined>;
1897
+ basis: _angular_core.InputSignal<string | number | undefined>;
1843
1898
  /**
1844
1899
  * Inline-axis margin. `marginInline="auto"` centers a `maxWidth` container —
1845
1900
  * the one thing flex centering cannot do without an extra wrapper. Only the
1846
1901
  * inline axis is exposed: block margins collapse and fight `gap`, which is
1847
1902
  * why the primitives carry no margin otherwise.
1848
1903
  */
1849
- marginInline: _angular_core.InputSignal<"auto" | NullableSize>;
1904
+ marginInline: _angular_core.InputSignal<"auto" | NullableSize | undefined>;
1850
1905
  display: _angular_core.InputSignal<OptionalDisplay>;
1851
1906
  position: _angular_core.InputSignal<OptionalPosition>;
1852
- inset: _angular_core.InputSignal<string | number>;
1907
+ inset: _angular_core.InputSignal<string | number | undefined>;
1853
1908
  /** Number = px via binding (`[height]="420"`); string = CSS length (`height="420px"`). */
1854
- height: _angular_core.InputSignal<string | number>;
1855
- minHeight: _angular_core.InputSignal<string | number>;
1856
- maxHeight: _angular_core.InputSignal<string | number>;
1909
+ height: _angular_core.InputSignal<string | number | undefined>;
1910
+ minHeight: _angular_core.InputSignal<string | number | undefined>;
1911
+ maxHeight: _angular_core.InputSignal<string | number | undefined>;
1857
1912
  /** Number = px via binding (`[width]="420"`); string = CSS length (`width="50%"`). */
1858
- width: _angular_core.InputSignal<string | number>;
1859
- minWidth: _angular_core.InputSignal<string | number>;
1860
- maxWidth: _angular_core.InputSignal<string | number>;
1913
+ width: _angular_core.InputSignal<string | number | undefined>;
1914
+ minWidth: _angular_core.InputSignal<string | number | undefined>;
1915
+ maxWidth: _angular_core.InputSignal<string | number | undefined>;
1861
1916
  ignoreDir: _angular_core.InputSignal<boolean>;
1862
- gridArea: _angular_core.InputSignal<string>;
1863
- gridColumn: _angular_core.InputSignal<string>;
1864
- gridRow: _angular_core.InputSignal<string>;
1917
+ gridArea: _angular_core.InputSignal<string | undefined>;
1918
+ gridColumn: _angular_core.InputSignal<string | undefined>;
1919
+ gridRow: _angular_core.InputSignal<string | undefined>;
1865
1920
  overflow: _angular_core.InputSignal<OptionalOverflow>;
1866
- shadow: _angular_core.InputSignal<string>;
1921
+ shadow: _angular_core.InputSignal<string | undefined>;
1867
1922
  gap: _angular_core.InputSignal<OptionalSize>;
1868
- fullWidth: _angular_core.InputSignal<boolean>;
1869
- fullHeight: _angular_core.InputSignal<boolean>;
1923
+ fullWidth: _angular_core.InputSignal<boolean | undefined>;
1924
+ fullHeight: _angular_core.InputSignal<boolean | undefined>;
1870
1925
  flexDirection: _angular_core.InputSignal<OptionalFlexDirection>;
1871
1926
  textAlign: _angular_core.InputSignal<OptionalTextAlign>;
1872
1927
  wrapItems: _angular_core.InputSignal<OptionalWrap>;
1873
- zIndex: _angular_core.InputSignal<ZIndexableElements>;
1928
+ zIndex: _angular_core.InputSignal<ZIndexableElements | undefined>;
1874
1929
  protected readonly boxClassName: _angular_core.Signal<string>;
1875
1930
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniBoxDirective, never>;
1876
1931
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<UniBoxDirective, "[uni-box-layout], [box-layout]", never, { "containerColor": { "alias": "containerColor"; "required": false; "isSignal": true; }; "backgroundColor": { "alias": "backgroundColor"; "required": false; "isSignal": true; }; "borderRadius": { "alias": "borderRadius"; "required": false; "isSignal": true; }; "borderRadiusLeft": { "alias": "borderRadiusLeft"; "required": false; "isSignal": true; }; "borderRadiusRight": { "alias": "borderRadiusRight"; "required": false; "isSignal": true; }; "borderRadiusTop": { "alias": "borderRadiusTop"; "required": false; "isSignal": true; }; "borderRadiusBottom": { "alias": "borderRadiusBottom"; "required": false; "isSignal": true; }; "padding": { "alias": "padding"; "required": false; "isSignal": true; }; "paddingHorizontal": { "alias": "paddingHorizontal"; "required": false; "isSignal": true; }; "paddingVertical": { "alias": "paddingVertical"; "required": false; "isSignal": true; }; "paddingLeft": { "alias": "paddingLeft"; "required": false; "isSignal": true; }; "paddingRight": { "alias": "paddingRight"; "required": false; "isSignal": true; }; "paddingTop": { "alias": "paddingTop"; "required": false; "isSignal": true; }; "paddingBottom": { "alias": "paddingBottom"; "required": false; "isSignal": true; }; "border": { "alias": "border"; "required": false; "isSignal": true; }; "borderTop": { "alias": "borderTop"; "required": false; "isSignal": true; }; "borderBottom": { "alias": "borderBottom"; "required": false; "isSignal": true; }; "borderLeft": { "alias": "borderLeft"; "required": false; "isSignal": true; }; "borderRight": { "alias": "borderRight"; "required": false; "isSignal": true; }; "dashBorder": { "alias": "dashBorder"; "required": false; "isSignal": true; }; "alignSelf": { "alias": "alignSelf"; "required": false; "isSignal": true; }; "alignItems": { "alias": "alignItems"; "required": false; "isSignal": true; }; "alignContent": { "alias": "alignContent"; "required": false; "isSignal": true; }; "justifyContent": { "alias": "justifyContent"; "required": false; "isSignal": true; }; "grow": { "alias": "grow"; "required": false; "isSignal": true; }; "flex": { "alias": "flex"; "required": false; "isSignal": true; }; "shrink": { "alias": "shrink"; "required": false; "isSignal": true; }; "basis": { "alias": "basis"; "required": false; "isSignal": true; }; "marginInline": { "alias": "marginInline"; "required": false; "isSignal": true; }; "display": { "alias": "display"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; "inset": { "alias": "inset"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "minHeight": { "alias": "minHeight"; "required": false; "isSignal": true; }; "maxHeight": { "alias": "maxHeight"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "minWidth": { "alias": "minWidth"; "required": false; "isSignal": true; }; "maxWidth": { "alias": "maxWidth"; "required": false; "isSignal": true; }; "ignoreDir": { "alias": "ignoreDir"; "required": false; "isSignal": true; }; "gridArea": { "alias": "gridArea"; "required": false; "isSignal": true; }; "gridColumn": { "alias": "gridColumn"; "required": false; "isSignal": true; }; "gridRow": { "alias": "gridRow"; "required": false; "isSignal": true; }; "overflow": { "alias": "overflow"; "required": false; "isSignal": true; }; "shadow": { "alias": "shadow"; "required": false; "isSignal": true; }; "gap": { "alias": "gap"; "required": false; "isSignal": true; }; "fullWidth": { "alias": "fullWidth"; "required": false; "isSignal": true; }; "fullHeight": { "alias": "fullHeight"; "required": false; "isSignal": true; }; "flexDirection": { "alias": "flexDirection"; "required": false; "isSignal": true; }; "textAlign": { "alias": "textAlign"; "required": false; "isSignal": true; }; "wrapItems": { "alias": "wrapItems"; "required": false; "isSignal": true; }; "zIndex": { "alias": "zIndex"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
@@ -1894,11 +1949,11 @@ declare class UniGridAreaDirective {
1894
1949
 
1895
1950
  declare class UniGridDirective extends UniBoxDirective {
1896
1951
  display: _angular_core.InputSignal<OptionalDisplay>;
1897
- templateAreas: _angular_core.InputSignal<string>;
1898
- templateColumns: _angular_core.InputSignal<string>;
1899
- templateRows: _angular_core.InputSignal<string>;
1900
- outline: _angular_core.InputSignal<Thickness>;
1901
- outlineColor: _angular_core.InputSignal<keyof _uni_design_system_uni_core.UniVariantRegistry>;
1952
+ templateAreas: _angular_core.InputSignal<string | undefined>;
1953
+ templateColumns: _angular_core.InputSignal<string | undefined>;
1954
+ templateRows: _angular_core.InputSignal<string | undefined>;
1955
+ outline: _angular_core.InputSignal<Thickness | undefined>;
1956
+ outlineColor: _angular_core.InputSignal<keyof _uni_design_system_uni_core.UniVariantRegistry | undefined>;
1902
1957
  protected readonly gridClassName: _angular_core.Signal<string>;
1903
1958
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniGridDirective, never>;
1904
1959
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<UniGridDirective, "[uni-grid-layout], [grid-layout]", never, { "display": { "alias": "display"; "required": false; "isSignal": true; }; "templateAreas": { "alias": "templateAreas"; "required": false; "isSignal": true; }; "templateColumns": { "alias": "templateColumns"; "required": false; "isSignal": true; }; "templateRows": { "alias": "templateRows"; "required": false; "isSignal": true; }; "outline": { "alias": "outline"; "required": false; "isSignal": true; }; "outlineColor": { "alias": "outlineColor"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
@@ -1912,7 +1967,7 @@ declare class UniRowDirective extends UniBoxDirective {
1912
1967
  * when the row must shrink inside a constrained flex parent (scroll or
1913
1968
  * text truncation containment).
1914
1969
  */
1915
- minWidth: _angular_core.InputSignal<string | number>;
1970
+ minWidth: _angular_core.InputSignal<string | number | undefined>;
1916
1971
  constructor();
1917
1972
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniRowDirective, never>;
1918
1973
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<UniRowDirective, "[uni-row-layout], [row-layout]", never, { "display": { "alias": "display"; "required": false; "isSignal": true; }; "flexDirection": { "alias": "flexDirection"; "required": false; "isSignal": true; }; "minWidth": { "alias": "minWidth"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
@@ -1926,7 +1981,7 @@ declare class UniStackDirective extends UniBoxDirective {
1926
1981
  * when the stack must shrink inside a constrained flex parent (scroll
1927
1982
  * containment).
1928
1983
  */
1929
- minHeight: _angular_core.InputSignal<string | number>;
1984
+ minHeight: _angular_core.InputSignal<string | number | undefined>;
1930
1985
  constructor();
1931
1986
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniStackDirective, never>;
1932
1987
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<UniStackDirective, "[uni-stack-layout], [stack-layout]", never, { "display": { "alias": "display"; "required": false; "isSignal": true; }; "flexDirection": { "alias": "flexDirection"; "required": false; "isSignal": true; }; "minHeight": { "alias": "minHeight"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
@@ -1956,6 +2011,13 @@ declare class UniMultiSelectDropdownComponent<T = unknown> extends BaseComponent
1956
2011
  readonly value: _angular_core.ModelSignal<T[]>;
1957
2012
  readonly disabled: _angular_core.InputSignal<boolean>;
1958
2013
  readonly touched: _angular_core.ModelSignal<boolean>;
2014
+ /**
2015
+ * Angular 22 marks the bound field touched through this output; the
2016
+ * `touched` model above is bound inward by the directive and no longer
2017
+ * propagates back out. Emitted wherever this control already decided
2018
+ * the user was done with it.
2019
+ */
2020
+ readonly touch: _angular_core.OutputEmitterRef<void>;
1959
2021
  readonly invalid: _angular_core.InputSignal<boolean>;
1960
2022
  readonly dirty: _angular_core.InputSignal<boolean>;
1961
2023
  /** Synced from required() validators by the Signal Forms [formField] directive. */
@@ -1964,7 +2026,7 @@ declare class UniMultiSelectDropdownComponent<T = unknown> extends BaseComponent
1964
2026
  * Id(s) of external element(s) describing this control — typically your
1965
2027
  * app-rendered error message — exposed as aria-describedby.
1966
2028
  */
1967
- readonly ariaDescribedBy: _angular_core.InputSignal<string>;
2029
+ readonly ariaDescribedBy: _angular_core.InputSignal<string | undefined>;
1968
2030
  readonly options: _angular_core.InputSignal<Options<T>>;
1969
2031
  readonly placeholder: _angular_core.InputSignal<string>;
1970
2032
  /**
@@ -1973,7 +2035,7 @@ declare class UniMultiSelectDropdownComponent<T = unknown> extends BaseComponent
1973
2035
  * screen reader announces only the current selection, with no clue which
1974
2036
  * field it belongs to.
1975
2037
  */
1976
- readonly label: _angular_core.InputSignal<string>;
2038
+ readonly label: _angular_core.InputSignal<string | undefined>;
1977
2039
  /** Debounce for the filter box, matching the library's input debounce. */
1978
2040
  readonly debounceTime: _angular_core.InputSignal<number>;
1979
2041
  protected readonly srOnly: string;
@@ -2018,15 +2080,15 @@ declare class UniMultiSelectDropdownComponent<T = unknown> extends BaseComponent
2018
2080
  protected isOptionSelected(option: Option<T>): _angular_core.Signal<boolean>;
2019
2081
  toggleOption(option: Option<T>, checked: boolean): void;
2020
2082
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniMultiSelectDropdownComponent<any>, never>;
2021
- 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>;
2083
+ 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"; "touch": "touch"; }, never, never, true, never>;
2022
2084
  }
2023
2085
 
2024
2086
  declare class UniMultiSelectComponent<T = unknown> {
2025
2087
  options: _angular_core.InputSignal<Option<T>[]>;
2026
- selections: _angular_core.InputSignal<T[]>;
2027
- updates: _angular_core.OutputEmitterRef<T[]>;
2088
+ selections: _angular_core.InputSignal<T[] | null | undefined>;
2089
+ updates: _angular_core.OutputEmitterRef<T[] | undefined>;
2028
2090
  flexDirection: _angular_core.InputSignal<"column" | "column-reverse" | "row" | "row-reverse">;
2029
- checkboxGap: _angular_core.InputSignal<NullableSize>;
2091
+ checkboxGap: _angular_core.InputSignal<NullableSize | undefined>;
2030
2092
  protected readonly values: _angular_core.Signal<unknown[]>;
2031
2093
  protected readonly optionsWithSelections: _angular_core.Signal<Option<T>[]>;
2032
2094
  protected readonly className: string;
@@ -2079,6 +2141,13 @@ declare class UniRadioComponent extends BaseComponent<UniRadioOptions, UniRadioV
2079
2141
  readonly value: _angular_core.ModelSignal<string>;
2080
2142
  readonly disabled: _angular_core.InputSignal<boolean>;
2081
2143
  readonly touched: _angular_core.ModelSignal<boolean>;
2144
+ /**
2145
+ * Angular 22 marks the bound field touched through this output; the
2146
+ * `touched` model above is bound inward by the directive and no longer
2147
+ * propagates back out. Emitted wherever this control already decided
2148
+ * the user was done with it.
2149
+ */
2150
+ readonly touch: _angular_core.OutputEmitterRef<void>;
2082
2151
  readonly invalid: _angular_core.InputSignal<boolean>;
2083
2152
  readonly dirty: _angular_core.InputSignal<boolean>;
2084
2153
  /** Synced from required() validators by the Signal Forms [formField] directive. */
@@ -2088,14 +2157,14 @@ declare class UniRadioComponent extends BaseComponent<UniRadioOptions, UniRadioV
2088
2157
  * instance. Mirrors the input of the same name on `uni-checkbox` and
2089
2158
  * `uni-toggle`.
2090
2159
  */
2091
- readonly checkedColor: _angular_core.InputSignal<string>;
2160
+ readonly checkedColor: _angular_core.InputSignal<string | undefined>;
2092
2161
  /**
2093
2162
  * Id(s) of external element(s) describing this control — typically your
2094
2163
  * app-rendered error message — exposed as aria-describedby.
2095
2164
  */
2096
- readonly ariaDescribedBy: _angular_core.InputSignal<string>;
2165
+ readonly ariaDescribedBy: _angular_core.InputSignal<string | undefined>;
2097
2166
  readonly options: _angular_core.InputSignal<UniRadioOption[]>;
2098
- readonly label: _angular_core.InputSignal<string>;
2167
+ readonly label: _angular_core.InputSignal<string | undefined>;
2099
2168
  readonly name: _angular_core.InputSignal<string>;
2100
2169
  /** Links the group label to the radiogroup container. */
2101
2170
  protected readonly groupLabelId: string;
@@ -2119,7 +2188,7 @@ declare class UniRadioComponent extends BaseComponent<UniRadioOptions, UniRadioV
2119
2188
  private color;
2120
2189
  private readonly accent;
2121
2190
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniRadioComponent, never>;
2122
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniRadioComponent, "uni-radio", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "checkedColor": { "alias": "checkedColor"; "required": false; "isSignal": true; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; }, never, never, true, never>;
2191
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniRadioComponent, "uni-radio", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "checkedColor": { "alias": "checkedColor"; "required": false; "isSignal": true; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; "touch": "touch"; }, never, never, true, never>;
2123
2192
  }
2124
2193
 
2125
2194
  /**
@@ -2131,24 +2200,24 @@ declare class UniRadioComponent extends BaseComponent<UniRadioOptions, UniRadioV
2131
2200
  * element.
2132
2201
  */
2133
2202
  declare class UniDebounceInputComponent {
2134
- inputName: _angular_core.InputSignal<string>;
2135
- inputId: _angular_core.InputSignal<string>;
2203
+ inputName: _angular_core.InputSignal<string | undefined>;
2204
+ inputId: _angular_core.InputSignal<string | undefined>;
2136
2205
  debounceTime: _angular_core.InputSignal<number>;
2137
2206
  /** Accessible name for the input. */
2138
- label: _angular_core.InputSignal<string>;
2207
+ label: _angular_core.InputSignal<string | undefined>;
2139
2208
  placeholder: _angular_core.InputSignal<string>;
2140
2209
  disabled: _angular_core.InputSignal<boolean>;
2141
2210
  /** Native input type; text-like only, matching `uni-input`. */
2142
2211
  type: _angular_core.InputSignal<UniInputType>;
2143
- autocomplete: _angular_core.InputSignal<string>;
2144
- inputMode: _angular_core.InputSignal<UniInputMode>;
2145
- role: _angular_core.InputSignal<string>;
2146
- ariaExpanded: _angular_core.InputSignal<boolean>;
2147
- ariaControls: _angular_core.InputSignal<string>;
2148
- ariaActivedescendant: _angular_core.InputSignal<string>;
2212
+ autocomplete: _angular_core.InputSignal<string | undefined>;
2213
+ inputMode: _angular_core.InputSignal<UniInputMode | undefined>;
2214
+ role: _angular_core.InputSignal<string | undefined>;
2215
+ ariaExpanded: _angular_core.InputSignal<boolean | undefined>;
2216
+ ariaControls: _angular_core.InputSignal<string | undefined>;
2217
+ ariaActivedescendant: _angular_core.InputSignal<string | undefined>;
2149
2218
  /** The debounced value, emitted once the user pauses typing. */
2150
2219
  valueChange: _angular_core.OutputEmitterRef<string>;
2151
- value: _angular_core.WritableSignal<string>;
2220
+ value: _angular_core.WritableSignal<string | undefined>;
2152
2221
  private readonly inputElement;
2153
2222
  private timeoutId;
2154
2223
  private lastEmitted;
@@ -2165,9 +2234,9 @@ declare class UniDebounceInputComponent {
2165
2234
  /** Theme-level options for `uni-search-input`, resolved by token name. */
2166
2235
  interface UniSearchInputOptions {
2167
2236
  /** Leading (decorative) symbol. */
2168
- searchSymbol?: string;
2237
+ searchIcon?: IconName;
2169
2238
  /** Clear-button symbol. */
2170
- clearSymbol?: string;
2239
+ clearIcon?: IconName;
2171
2240
  /** Suggestion list surface color token. */
2172
2241
  listColor?: ColorKey;
2173
2242
  /** Active/hover suggestion fill; the on-color pair is derived. Must
@@ -2193,7 +2262,7 @@ interface UniSearchInputOptions {
2193
2262
  declare class UniSearchInputComponent extends BaseComponent<UniSearchInputOptions> {
2194
2263
  /** Accessible name for the field, also the placeholder fallback. */
2195
2264
  label: _angular_core.InputSignal<string>;
2196
- placeholder: _angular_core.InputSignal<string>;
2265
+ placeholder: _angular_core.InputSignal<string | undefined>;
2197
2266
  width: _angular_core.InputSignal<string | number>;
2198
2267
  debounceTime: _angular_core.InputSignal<number>;
2199
2268
  /**
@@ -2211,7 +2280,7 @@ declare class UniSearchInputComponent extends BaseComponent<UniSearchInputOption
2211
2280
  /** Ties the popup to the field so the browser tracks it in the top layer. */
2212
2281
  private readonly anchor;
2213
2282
  /** `manual` where the top layer is usable, else null — see the popup helper. */
2214
- protected readonly popupAttr: "manual";
2283
+ protected readonly popupAttr: "manual" | null;
2215
2284
  constructor();
2216
2285
  protected readonly visibleSuggestions: _angular_core.Signal<string[]>;
2217
2286
  /** Shared combobox bookkeeping: open state, active option, ARIA ids. */
@@ -2230,8 +2299,25 @@ declare class UniSearchInputComponent extends BaseComponent<UniSearchInputOption
2230
2299
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniSearchInputComponent, "uni-search-input", never, { "label": { "alias": "label"; "required": true; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "debounceTime": { "alias": "debounceTime"; "required": false; "isSignal": true; }; "suggestions": { "alias": "suggestions"; "required": false; "isSignal": true; }; }, { "searchChange": "searchChange"; "searchSubmit": "searchSubmit"; "suggestionSelected": "suggestionSelected"; }, never, never, true, never>;
2231
2300
  }
2232
2301
 
2302
+ /**
2303
+ * Theme options for `uni-select`. The box itself is `uni-input-box`'s; what
2304
+ * belongs to the select is the dropdown affordance, which until 11.0.0 was
2305
+ * hardcoded — `select` was declared in `ComponentName` with no theme entry
2306
+ * behind it, so a theme could not reach it at all.
2307
+ */
2308
+ interface UniSelectOptions {
2309
+ /** Glyph for the dropdown affordance. Defaults to `chevronDown`. */
2310
+ toggleIcon?: IconName;
2311
+ /** Ink for that glyph. Defaults to `on-background-variant`, as `uni-combobox`. */
2312
+ toggleColor?: ColorKey;
2313
+ /** Square size of the glyph in px. Defaults to 20, matching `uni-combobox`. */
2314
+ toggleSize?: number;
2315
+ }
2316
+
2233
2317
  declare class UniSelectComponent<T> implements FormValueControl<T | null> {
2234
- readonly value: _angular_core.ModelSignal<T>;
2318
+ private readonly theme;
2319
+ protected readonly componentOptions: _angular_core.WritableSignal<UniSelectOptions>;
2320
+ readonly value: _angular_core.ModelSignal<T | null>;
2235
2321
  readonly disabled: _angular_core.InputSignal<boolean>;
2236
2322
  readonly touched: _angular_core.ModelSignal<boolean>;
2237
2323
  readonly invalid: _angular_core.InputSignal<boolean>;
@@ -2242,12 +2328,12 @@ declare class UniSelectComponent<T> implements FormValueControl<T | null> {
2242
2328
  * Id(s) of external element(s) describing this control — typically your
2243
2329
  * app-rendered error message — exposed as aria-describedby.
2244
2330
  */
2245
- readonly ariaDescribedBy: _angular_core.InputSignal<string>;
2331
+ readonly ariaDescribedBy: _angular_core.InputSignal<string | undefined>;
2246
2332
  readonly options: _angular_core.InputSignal<Options<T>>;
2247
- readonly placeholder: _angular_core.InputSignal<string>;
2248
- readonly width: _angular_core.InputSignal<string | number>;
2333
+ readonly placeholder: _angular_core.InputSignal<string | undefined>;
2334
+ readonly width: _angular_core.InputSignal<string | number | undefined>;
2249
2335
  readonly fullWidth: _angular_core.InputSignal<boolean>;
2250
- readonly grow: _angular_core.InputSignal<number>;
2336
+ readonly grow: _angular_core.InputSignal<number | undefined>;
2251
2337
  /**
2252
2338
  * Equality used to match `value` against option values, called as
2253
2339
  * `compareWith(optionValue, value)`. Defaults to reference equality, which
@@ -2257,7 +2343,7 @@ declare class UniSelectComponent<T> implements FormValueControl<T | null> {
2257
2343
  */
2258
2344
  readonly compareWith: _angular_core.InputSignal<(optionValue: T, value: T) => boolean>;
2259
2345
  /** Accessible name for the select; a placeholder is not a label. */
2260
- readonly ariaLabel: _angular_core.InputSignal<string>;
2346
+ readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
2261
2347
  protected readonly UNSELECTED = -1;
2262
2348
  /**
2263
2349
  * We use the index as the HTML value to avoid issues with
@@ -2267,7 +2353,7 @@ declare class UniSelectComponent<T> implements FormValueControl<T | null> {
2267
2353
  protected readonly showError: _angular_core.Signal<boolean>;
2268
2354
  protected handleSelectChange(event: Event): void;
2269
2355
  selectClass: string;
2270
- arrowClass: string;
2356
+ protected readonly arrowClass: _angular_core.Signal<string>;
2271
2357
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniSelectComponent<any>, never>;
2272
2358
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniSelectComponent<any>, "uni-select", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "fullWidth": { "alias": "fullWidth"; "required": false; "isSignal": true; }; "grow": { "alias": "grow"; "required": false; "isSignal": true; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; }, never, never, true, never>;
2273
2359
  }
@@ -2319,11 +2405,11 @@ interface UniSliderOptions {
2319
2405
  tooltipShadow?: Shadow;
2320
2406
  tooltipBorderRadius?: Radius;
2321
2407
  /**
2322
- * Click-to-jump transition in ms. A drag is never animated — a transition on
2323
- * a dragged thumb reads as lag — so this applies to keyboard and track
2324
- * presses only.
2408
+ * Timing for the click-to-jump move, as a `motion` token. A drag is never
2409
+ * animated — a transition on a dragged thumb reads as lag — so this applies
2410
+ * to keyboard and track presses only. Defaults to `snap`.
2325
2411
  */
2326
- transitionMs?: number;
2412
+ motion?: Motion;
2327
2413
  }
2328
2414
 
2329
2415
  /** Index into the thumb pair. `0` is the `start` thumb, `1` the `end` thumb. */
@@ -2344,23 +2430,30 @@ type ThumbIndex = 0 | 1;
2344
2430
  */
2345
2431
  declare class UniSliderComponent extends BaseComponent<UniSliderOptions> implements FormValueControl<number | UniNumberRange | null> {
2346
2432
  /** Shape follows `mode`: a number when `single`, a `UniNumberRange` when `range`. */
2347
- readonly value: _angular_core.ModelSignal<number | UniNumberRange>;
2433
+ readonly value: _angular_core.ModelSignal<number | UniNumberRange | null>;
2348
2434
  readonly disabled: _angular_core.InputSignal<boolean>;
2349
2435
  readonly touched: _angular_core.ModelSignal<boolean>;
2436
+ /**
2437
+ * Angular 22 marks the bound field touched through this output; the
2438
+ * `touched` model above is bound inward by the directive and no longer
2439
+ * propagates back out. Emitted wherever this control already decided
2440
+ * the user was done with it.
2441
+ */
2442
+ readonly touch: _angular_core.OutputEmitterRef<void>;
2350
2443
  readonly invalid: _angular_core.InputSignal<boolean>;
2351
2444
  readonly dirty: _angular_core.InputSignal<boolean>;
2352
2445
  readonly required: _angular_core.InputSignal<boolean>;
2353
- readonly ariaDescribedBy: _angular_core.InputSignal<string>;
2446
+ readonly ariaDescribedBy: _angular_core.InputSignal<string | undefined>;
2354
2447
  /** Accessible name, e.g. "Opacity". Names the group in range mode. */
2355
2448
  label: _angular_core.InputSignal<string>;
2356
2449
  mode: _angular_core.InputSignal<"range" | "single">;
2357
- min: _angular_core.InputSignal<number>;
2358
- max: _angular_core.InputSignal<number>;
2450
+ min: _angular_core.InputSignal<number | UniNumberRange | undefined>;
2451
+ max: _angular_core.InputSignal<number | UniNumberRange | undefined>;
2359
2452
  step: _angular_core.InputSignal<number>;
2360
2453
  /** `PageUp`/`PageDown` and `Shift+Arrow`. Default: a tenth of the range. */
2361
- largeStep: _angular_core.InputSignal<number>;
2454
+ largeStep: _angular_core.InputSignal<number | undefined>;
2362
2455
  /** Fill anchor. Defaults to `min`; set `0` for a slider that spans ±. */
2363
- origin: _angular_core.InputSignal<number>;
2456
+ origin: _angular_core.InputSignal<number | undefined>;
2364
2457
  marks: _angular_core.InputSignal<UniSliderMark[]>;
2365
2458
  /** Marks become the only valid stops — t-shirt sizing, Likert scales. */
2366
2459
  snapToMarks: _angular_core.InputSignal<boolean>;
@@ -2376,9 +2469,9 @@ declare class UniSliderComponent extends BaseComponent<UniSliderOptions> impleme
2376
2469
  */
2377
2470
  valueDisplay: _angular_core.InputSignal<"input" | "none" | "tooltip" | "inline">;
2378
2471
  /** Overrides how a value is rendered and spoken. */
2379
- formatValue: _angular_core.InputSignal<(value: number) => string>;
2472
+ formatValue: _angular_core.InputSignal<((value: number) => string) | undefined>;
2380
2473
  /** Enforced distance between the two ends, in range mode. */
2381
- minGap: _angular_core.InputSignal<number>;
2474
+ minGap: _angular_core.InputSignal<number | undefined>;
2382
2475
  variant: _angular_core.InputSignal<keyof _uni_design_system_uni_core.UniVariantRegistry>;
2383
2476
  /** Continuous, during a drag or a held key. Bind this for a live preview. */
2384
2477
  sliding: _angular_core.OutputEmitterRef<number | UniNumberRange>;
@@ -2399,6 +2492,8 @@ declare class UniSliderComponent extends BaseComponent<UniSliderOptions> impleme
2399
2492
  /** Set by keydown, consumed by keyup, so one commit follows a key run. */
2400
2493
  private keyed;
2401
2494
  protected readonly isRange: _angular_core.Signal<boolean>;
2495
+ /** The contract admits a range here; a slider's own bounds are always scalar. */
2496
+ private static readonly scalar;
2402
2497
  protected readonly resolvedMin: _angular_core.Signal<number>;
2403
2498
  protected readonly resolvedMax: _angular_core.Signal<number>;
2404
2499
  private derivePair;
@@ -2480,6 +2575,11 @@ declare class UniSliderComponent extends BaseComponent<UniSliderOptions> impleme
2480
2575
  protected readonly rootClass: _angular_core.Signal<string>;
2481
2576
  protected readonly rowClass: _angular_core.Signal<string>;
2482
2577
  protected readonly trackClass: _angular_core.Signal<string>;
2578
+ /**
2579
+ * The click-to-jump timing. `snap` by default: a thumb covering distance to
2580
+ * a value the user just chose, which at `control`'s 300ms would read as lag.
2581
+ */
2582
+ private readonly motion;
2483
2583
  protected readonly fillClass: _angular_core.Signal<string>;
2484
2584
  protected readonly markClass: _angular_core.Signal<string>;
2485
2585
  protected readonly thumbClass: _angular_core.Signal<string>;
@@ -2490,7 +2590,7 @@ declare class UniSliderComponent extends BaseComponent<UniSliderOptions> impleme
2490
2590
  protected readonly readoutFieldClass: _angular_core.Signal<string>;
2491
2591
  protected readonly readoutClass: _angular_core.Signal<string>;
2492
2592
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniSliderComponent, never>;
2493
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniSliderComponent, "uni-slider, Slider", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": true; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "largeStep": { "alias": "largeStep"; "required": false; "isSignal": true; }; "origin": { "alias": "origin"; "required": false; "isSignal": true; }; "marks": { "alias": "marks"; "required": false; "isSignal": true; }; "snapToMarks": { "alias": "snapToMarks"; "required": false; "isSignal": true; }; "valueDisplay": { "alias": "valueDisplay"; "required": false; "isSignal": true; }; "formatValue": { "alias": "formatValue"; "required": false; "isSignal": true; }; "minGap": { "alias": "minGap"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; "sliding": "sliding"; "changed": "changed"; }, never, never, true, never>;
2593
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniSliderComponent, "uni-slider, Slider", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": true; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "largeStep": { "alias": "largeStep"; "required": false; "isSignal": true; }; "origin": { "alias": "origin"; "required": false; "isSignal": true; }; "marks": { "alias": "marks"; "required": false; "isSignal": true; }; "snapToMarks": { "alias": "snapToMarks"; "required": false; "isSignal": true; }; "valueDisplay": { "alias": "valueDisplay"; "required": false; "isSignal": true; }; "formatValue": { "alias": "formatValue"; "required": false; "isSignal": true; }; "minGap": { "alias": "minGap"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; "touch": "touch"; "sliding": "sliding"; "changed": "changed"; }, never, never, true, never>;
2494
2594
  }
2495
2595
 
2496
2596
  /**
@@ -2573,58 +2673,65 @@ interface UniNumberInputOptions {
2573
2673
  * every other field. All arithmetic runs on the cdk's exact decimal helpers.
2574
2674
  */
2575
2675
  declare class UniNumberInputComponent extends BaseComponent<UniNumberInputOptions> implements FormValueControl<number | null> {
2576
- readonly value: _angular_core.ModelSignal<number>;
2676
+ readonly value: _angular_core.ModelSignal<number | null>;
2577
2677
  readonly disabled: _angular_core.InputSignal<boolean>;
2578
2678
  readonly touched: _angular_core.ModelSignal<boolean>;
2679
+ /**
2680
+ * Angular 22 marks the bound field touched through this output; the
2681
+ * `touched` model above is bound inward by the directive and no longer
2682
+ * propagates back out. Emitted wherever this control already decided
2683
+ * the user was done with it.
2684
+ */
2685
+ readonly touch: _angular_core.OutputEmitterRef<void>;
2579
2686
  readonly invalid: _angular_core.InputSignal<boolean>;
2580
2687
  readonly dirty: _angular_core.InputSignal<boolean>;
2581
2688
  readonly required: _angular_core.InputSignal<boolean>;
2582
- readonly ariaDescribedBy: _angular_core.InputSignal<string>;
2689
+ readonly ariaDescribedBy: _angular_core.InputSignal<string | undefined>;
2583
2690
  /**
2584
2691
  * Exact binding, as a canonical decimal string. Bind this instead of `value`
2585
2692
  * where a cent in the fifth decimal place matters; both stay in sync, so it
2586
2693
  * is a one-word change from the ordinary case.
2587
2694
  */
2588
- readonly valueAsString: _angular_core.ModelSignal<string>;
2695
+ readonly valueAsString: _angular_core.ModelSignal<string | null>;
2589
2696
  /** Accessible name, e.g. "Unit price". */
2590
2697
  label: _angular_core.InputSignal<string>;
2591
- placeholder: _angular_core.InputSignal<string>;
2698
+ placeholder: _angular_core.InputSignal<string | undefined>;
2592
2699
  preset: _angular_core.InputSignal<UniNumberPreset>;
2593
2700
  /** ISO 4217 code, e.g. `'USD'`. Implies `preset="currency"`. */
2594
- currency: _angular_core.InputSignal<string>;
2701
+ currency: _angular_core.InputSignal<string | undefined>;
2595
2702
  /** BCP 47 tag. Defaults to the document language, then the browser's. */
2596
- locale: _angular_core.InputSignal<string>;
2703
+ locale: _angular_core.InputSignal<string | undefined>;
2597
2704
  /** Static adornment before the number, e.g. `'$'`. Never parseable input. */
2598
- prefix: _angular_core.InputSignal<string>;
2705
+ prefix: _angular_core.InputSignal<string | undefined>;
2599
2706
  /** Static adornment after the number, e.g. `'kg'`, `'/mo'`. */
2600
- suffix: _angular_core.InputSignal<string>;
2601
- decimals: _angular_core.InputSignal<number | [min: number, max: number]>;
2602
- grouping: _angular_core.InputSignal<false | "auto" | "always" | "min2">;
2707
+ suffix: _angular_core.InputSignal<string | undefined>;
2708
+ decimals: _angular_core.InputSignal<number | [min: number, max: number] | undefined>;
2709
+ grouping: _angular_core.InputSignal<false | "auto" | "always" | "min2" | undefined>;
2603
2710
  /** Escape hatch, merged over the preset. */
2604
- numberFormat: _angular_core.InputSignal<Intl.NumberFormatOptions>;
2711
+ numberFormat: _angular_core.InputSignal<Intl.NumberFormatOptions | undefined>;
2605
2712
  roundingMode: _angular_core.InputSignal<UniRoundingMode>;
2606
- align: _angular_core.InputSignal<"center" | "start" | "end">;
2713
+ align: _angular_core.InputSignal<"center" | "start" | "end" | undefined>;
2607
2714
  /** The model is a fraction: `0.15` displays as `15%`. */
2608
2715
  valueIsFraction: _angular_core.InputSignal<boolean>;
2609
2716
  /** Spoken long form of an abbreviated suffix, e.g. `'kilograms'` for `kg`. */
2610
- unitAnnouncement: _angular_core.InputSignal<string>;
2717
+ unitAnnouncement: _angular_core.InputSignal<string | undefined>;
2611
2718
  readOnly: _angular_core.InputSignal<boolean>;
2612
2719
  /** Renders without its own input-box chrome, for composers like uni-slider. */
2613
2720
  embedded: _angular_core.InputSignal<boolean>;
2614
- min: _angular_core.InputSignal<number>;
2615
- max: _angular_core.InputSignal<number>;
2721
+ min: _angular_core.InputSignal<number | undefined>;
2722
+ max: _angular_core.InputSignal<number | undefined>;
2616
2723
  step: _angular_core.InputSignal<number>;
2617
2724
  /** `PageUp`/`PageDown` and `Shift+Arrow`. Default: `step × 10`. */
2618
- largeStep: _angular_core.InputSignal<number>;
2725
+ largeStep: _angular_core.InputSignal<number | undefined>;
2619
2726
  /** `Alt+Arrow`, Figma's fine-nudge convention. Unset disables it. */
2620
- smallStep: _angular_core.InputSignal<number>;
2727
+ smallStep: _angular_core.InputSignal<number | undefined>;
2621
2728
  stepOrigin: _angular_core.InputSignal<"min" | "zero">;
2622
2729
  /** Cyclic fields only — 23 → 0 hours, 359 → 0 degrees. */
2623
2730
  wrap: _angular_core.InputSignal<boolean>;
2624
2731
  /** `false` refuses an out-of-range commit instead of clamping it. */
2625
2732
  clampOnCommit: _angular_core.InputSignal<boolean>;
2626
2733
  /** What ↑ commits on an empty field. Default: `min ?? 0`. */
2627
- emptyStepValue: _angular_core.InputSignal<number>;
2734
+ emptyStepValue: _angular_core.InputSignal<number | undefined>;
2628
2735
  commitOnBlur: _angular_core.InputSignal<boolean>;
2629
2736
  selectOnFocus: _angular_core.InputSignal<boolean>;
2630
2737
  /** `12*3` → 36. Off by default: a parser in a form field is a real cost. */
@@ -2633,9 +2740,9 @@ declare class UniNumberInputComponent extends BaseComponent<UniNumberInputOption
2633
2740
  wheel: _angular_core.InputSignal<boolean>;
2634
2741
  repeat: _angular_core.InputSignal<boolean>;
2635
2742
  /** Custom parser, replacing the built-in locale parsing. */
2636
- parse: _angular_core.InputSignal<(raw: string, locale: string) => string | null>;
2743
+ parse: _angular_core.InputSignal<((raw: string, locale: string) => string | null) | undefined>;
2637
2744
  /** Overrides the themed layout for this instance. */
2638
- stepperLayout: _angular_core.InputSignal<_uni_design_system_uni_angular.UniStepperLayout>;
2745
+ stepperLayout: _angular_core.InputSignal<_uni_design_system_uni_angular.UniStepperLayout | undefined>;
2639
2746
  stepped: _angular_core.OutputEmitterRef<UniNumberStepped>;
2640
2747
  /** A commit was refused; the raw text stays in the field. */
2641
2748
  rejected: _angular_core.OutputEmitterRef<UniNumberRejection>;
@@ -2685,7 +2792,7 @@ declare class UniNumberInputComponent extends BaseComponent<UniNumberInputOption
2685
2792
  * spinbutton reporting 0 for "nothing yet" is a wrong answer, not a missing
2686
2793
  * one. `aria-valuetext` carries the localized "Empty" instead.
2687
2794
  */
2688
- protected readonly canonicalForAria: _angular_core.Signal<string>;
2795
+ protected readonly canonicalForAria: _angular_core.Signal<string | null>;
2689
2796
  protected readonly describedBy: _angular_core.Signal<string>;
2690
2797
  private atFence;
2691
2798
  protected readonly atMin: _angular_core.Signal<boolean>;
@@ -2761,7 +2868,7 @@ declare class UniNumberInputComponent extends BaseComponent<UniNumberInputOption
2761
2868
  protected readonly stackedButtonClass: _angular_core.Signal<string>;
2762
2869
  protected readonly glyphSize: _angular_core.Signal<12 | 18>;
2763
2870
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniNumberInputComponent, never>;
2764
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniNumberInputComponent, "uni-number-input, NumberInput", 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; }; "valueAsString": { "alias": "valueAsString"; "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; }; "currency": { "alias": "currency"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "prefix": { "alias": "prefix"; "required": false; "isSignal": true; }; "suffix": { "alias": "suffix"; "required": false; "isSignal": true; }; "decimals": { "alias": "decimals"; "required": false; "isSignal": true; }; "grouping": { "alias": "grouping"; "required": false; "isSignal": true; }; "numberFormat": { "alias": "numberFormat"; "required": false; "isSignal": true; }; "roundingMode": { "alias": "roundingMode"; "required": false; "isSignal": true; }; "align": { "alias": "align"; "required": false; "isSignal": true; }; "valueIsFraction": { "alias": "valueIsFraction"; "required": false; "isSignal": true; }; "unitAnnouncement": { "alias": "unitAnnouncement"; "required": false; "isSignal": true; }; "readOnly": { "alias": "readOnly"; "required": false; "isSignal": true; }; "embedded": { "alias": "embedded"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "largeStep": { "alias": "largeStep"; "required": false; "isSignal": true; }; "smallStep": { "alias": "smallStep"; "required": false; "isSignal": true; }; "stepOrigin": { "alias": "stepOrigin"; "required": false; "isSignal": true; }; "wrap": { "alias": "wrap"; "required": false; "isSignal": true; }; "clampOnCommit": { "alias": "clampOnCommit"; "required": false; "isSignal": true; }; "emptyStepValue": { "alias": "emptyStepValue"; "required": false; "isSignal": true; }; "commitOnBlur": { "alias": "commitOnBlur"; "required": false; "isSignal": true; }; "selectOnFocus": { "alias": "selectOnFocus"; "required": false; "isSignal": true; }; "allowExpressions": { "alias": "allowExpressions"; "required": false; "isSignal": true; }; "wheel": { "alias": "wheel"; "required": false; "isSignal": true; }; "repeat": { "alias": "repeat"; "required": false; "isSignal": true; }; "parse": { "alias": "parse"; "required": false; "isSignal": true; }; "stepperLayout": { "alias": "stepperLayout"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; "valueAsString": "valueAsStringChange"; "stepped": "stepped"; "rejected": "rejected"; }, never, never, true, never>;
2871
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniNumberInputComponent, "uni-number-input, NumberInput", 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; }; "valueAsString": { "alias": "valueAsString"; "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; }; "currency": { "alias": "currency"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "prefix": { "alias": "prefix"; "required": false; "isSignal": true; }; "suffix": { "alias": "suffix"; "required": false; "isSignal": true; }; "decimals": { "alias": "decimals"; "required": false; "isSignal": true; }; "grouping": { "alias": "grouping"; "required": false; "isSignal": true; }; "numberFormat": { "alias": "numberFormat"; "required": false; "isSignal": true; }; "roundingMode": { "alias": "roundingMode"; "required": false; "isSignal": true; }; "align": { "alias": "align"; "required": false; "isSignal": true; }; "valueIsFraction": { "alias": "valueIsFraction"; "required": false; "isSignal": true; }; "unitAnnouncement": { "alias": "unitAnnouncement"; "required": false; "isSignal": true; }; "readOnly": { "alias": "readOnly"; "required": false; "isSignal": true; }; "embedded": { "alias": "embedded"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "largeStep": { "alias": "largeStep"; "required": false; "isSignal": true; }; "smallStep": { "alias": "smallStep"; "required": false; "isSignal": true; }; "stepOrigin": { "alias": "stepOrigin"; "required": false; "isSignal": true; }; "wrap": { "alias": "wrap"; "required": false; "isSignal": true; }; "clampOnCommit": { "alias": "clampOnCommit"; "required": false; "isSignal": true; }; "emptyStepValue": { "alias": "emptyStepValue"; "required": false; "isSignal": true; }; "commitOnBlur": { "alias": "commitOnBlur"; "required": false; "isSignal": true; }; "selectOnFocus": { "alias": "selectOnFocus"; "required": false; "isSignal": true; }; "allowExpressions": { "alias": "allowExpressions"; "required": false; "isSignal": true; }; "wheel": { "alias": "wheel"; "required": false; "isSignal": true; }; "repeat": { "alias": "repeat"; "required": false; "isSignal": true; }; "parse": { "alias": "parse"; "required": false; "isSignal": true; }; "stepperLayout": { "alias": "stepperLayout"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; "touch": "touch"; "valueAsString": "valueAsStringChange"; "stepped": "stepped"; "rejected": "rejected"; }, never, never, true, never>;
2765
2872
  }
2766
2873
 
2767
2874
  /** Which end of the range a rejection or a change came from. */
@@ -2810,32 +2917,39 @@ interface UniNumberRangeInputOptions {
2810
2917
  * are still the cdk's, shared with every other numeric control.
2811
2918
  */
2812
2919
  declare class UniNumberRangeInputComponent extends BaseComponent<UniNumberRangeInputOptions> implements FormValueControl<UniNumberRange | null> {
2813
- readonly value: _angular_core.ModelSignal<UniNumberRange>;
2920
+ readonly value: _angular_core.ModelSignal<UniNumberRange | null>;
2814
2921
  readonly disabled: _angular_core.InputSignal<boolean>;
2815
2922
  readonly touched: _angular_core.ModelSignal<boolean>;
2923
+ /**
2924
+ * Angular 22 marks the bound field touched through this output; the
2925
+ * `touched` model above is bound inward by the directive and no longer
2926
+ * propagates back out. Emitted wherever this control already decided
2927
+ * the user was done with it.
2928
+ */
2929
+ readonly touch: _angular_core.OutputEmitterRef<void>;
2816
2930
  readonly invalid: _angular_core.InputSignal<boolean>;
2817
2931
  readonly dirty: _angular_core.InputSignal<boolean>;
2818
2932
  readonly required: _angular_core.InputSignal<boolean>;
2819
- readonly ariaDescribedBy: _angular_core.InputSignal<string>;
2933
+ readonly ariaDescribedBy: _angular_core.InputSignal<string | undefined>;
2820
2934
  /** Names the group, e.g. "Price range". */
2821
2935
  label: _angular_core.InputSignal<string>;
2822
2936
  startLabel: _angular_core.InputSignal<string>;
2823
2937
  endLabel: _angular_core.InputSignal<string>;
2824
2938
  preset: _angular_core.InputSignal<UniNumberPreset>;
2825
- currency: _angular_core.InputSignal<string>;
2826
- locale: _angular_core.InputSignal<string>;
2827
- prefix: _angular_core.InputSignal<string>;
2828
- suffix: _angular_core.InputSignal<string>;
2829
- decimals: _angular_core.InputSignal<number | [min: number, max: number]>;
2830
- grouping: _angular_core.InputSignal<false | "auto" | "always" | "min2">;
2939
+ currency: _angular_core.InputSignal<string | undefined>;
2940
+ locale: _angular_core.InputSignal<string | undefined>;
2941
+ prefix: _angular_core.InputSignal<string | undefined>;
2942
+ suffix: _angular_core.InputSignal<string | undefined>;
2943
+ decimals: _angular_core.InputSignal<number | [min: number, max: number] | undefined>;
2944
+ grouping: _angular_core.InputSignal<false | "auto" | "always" | "min2" | undefined>;
2831
2945
  roundingMode: _angular_core.InputSignal<UniRoundingMode>;
2832
- placeholderStart: _angular_core.InputSignal<string>;
2833
- placeholderEnd: _angular_core.InputSignal<string>;
2834
- min: _angular_core.InputSignal<number>;
2835
- max: _angular_core.InputSignal<number>;
2946
+ placeholderStart: _angular_core.InputSignal<string | undefined>;
2947
+ placeholderEnd: _angular_core.InputSignal<string | undefined>;
2948
+ minValue: _angular_core.InputSignal<number | undefined>;
2949
+ maxValue: _angular_core.InputSignal<number | undefined>;
2836
2950
  step: _angular_core.InputSignal<number>;
2837
2951
  /** Enforced distance between the two ends. */
2838
- minGap: _angular_core.InputSignal<number>;
2952
+ minGap: _angular_core.InputSignal<number | undefined>;
2839
2953
  /** The ends were entered backwards and have been exchanged. */
2840
2954
  swapped: _angular_core.OutputEmitterRef<UniNumberRange>;
2841
2955
  /** A typed commit on one end could not be read; its text stays in place. */
@@ -2862,7 +2976,7 @@ declare class UniNumberRangeInputComponent extends BaseComponent<UniNumberRangeI
2862
2976
  protected readonly describedBy: _angular_core.Signal<string>;
2863
2977
  /** The committed canonical decimal for a part, or `null` when that end is open. */
2864
2978
  private canonicalOf;
2865
- protected valueOf(part: UniNumberRangePart): number | null;
2979
+ protected partValue(part: UniNumberRangePart): number | null;
2866
2980
  protected displayText(part: UniNumberRangePart): string;
2867
2981
  protected partLabel(part: UniNumberRangePart): string;
2868
2982
  protected valueTextOf(part: UniNumberRangePart): string;
@@ -2911,7 +3025,7 @@ declare class UniNumberRangeInputComponent extends BaseComponent<UniNumberRangeI
2911
3025
  protected readonly dividerClass: _angular_core.Signal<string>;
2912
3026
  protected readonly dividerText: _angular_core.Signal<string>;
2913
3027
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniNumberRangeInputComponent, never>;
2914
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniNumberRangeInputComponent, "uni-number-range-input, NumberRangeInput", 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; }; "startLabel": { "alias": "startLabel"; "required": false; "isSignal": true; }; "endLabel": { "alias": "endLabel"; "required": false; "isSignal": true; }; "preset": { "alias": "preset"; "required": false; "isSignal": true; }; "currency": { "alias": "currency"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "prefix": { "alias": "prefix"; "required": false; "isSignal": true; }; "suffix": { "alias": "suffix"; "required": false; "isSignal": true; }; "decimals": { "alias": "decimals"; "required": false; "isSignal": true; }; "grouping": { "alias": "grouping"; "required": false; "isSignal": true; }; "roundingMode": { "alias": "roundingMode"; "required": false; "isSignal": true; }; "placeholderStart": { "alias": "placeholderStart"; "required": false; "isSignal": true; }; "placeholderEnd": { "alias": "placeholderEnd"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "minGap": { "alias": "minGap"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; "swapped": "swapped"; "rejected": "rejected"; }, never, never, true, never>;
3028
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniNumberRangeInputComponent, "uni-number-range-input, NumberRangeInput", 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; }; "startLabel": { "alias": "startLabel"; "required": false; "isSignal": true; }; "endLabel": { "alias": "endLabel"; "required": false; "isSignal": true; }; "preset": { "alias": "preset"; "required": false; "isSignal": true; }; "currency": { "alias": "currency"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "prefix": { "alias": "prefix"; "required": false; "isSignal": true; }; "suffix": { "alias": "suffix"; "required": false; "isSignal": true; }; "decimals": { "alias": "decimals"; "required": false; "isSignal": true; }; "grouping": { "alias": "grouping"; "required": false; "isSignal": true; }; "roundingMode": { "alias": "roundingMode"; "required": false; "isSignal": true; }; "placeholderStart": { "alias": "placeholderStart"; "required": false; "isSignal": true; }; "placeholderEnd": { "alias": "placeholderEnd"; "required": false; "isSignal": true; }; "minValue": { "alias": "min"; "required": false; "isSignal": true; }; "maxValue": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "minGap": { "alias": "minGap"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; "touch": "touch"; "swapped": "swapped"; "rejected": "rejected"; }, never, never, true, never>;
2915
3029
  }
2916
3030
 
2917
3031
  /**
@@ -2973,20 +3087,27 @@ interface UniQuantityStepperOptions {
2973
3087
  * eleven times. `editable=false` is for read-mostly tables.
2974
3088
  */
2975
3089
  declare class UniQuantityStepperComponent extends BaseComponent<UniQuantityStepperOptions> implements FormValueControl<number | null> {
2976
- readonly value: _angular_core.ModelSignal<number>;
3090
+ readonly value: _angular_core.ModelSignal<number | null>;
2977
3091
  readonly disabled: _angular_core.InputSignal<boolean>;
2978
3092
  readonly touched: _angular_core.ModelSignal<boolean>;
3093
+ /**
3094
+ * Angular 22 marks the bound field touched through this output; the
3095
+ * `touched` model above is bound inward by the directive and no longer
3096
+ * propagates back out. Emitted wherever this control already decided
3097
+ * the user was done with it.
3098
+ */
3099
+ readonly touch: _angular_core.OutputEmitterRef<void>;
2979
3100
  readonly invalid: _angular_core.InputSignal<boolean>;
2980
3101
  readonly dirty: _angular_core.InputSignal<boolean>;
2981
3102
  readonly required: _angular_core.InputSignal<boolean>;
2982
- readonly ariaDescribedBy: _angular_core.InputSignal<string>;
3103
+ readonly ariaDescribedBy: _angular_core.InputSignal<string | undefined>;
2983
3104
  /**
2984
3105
  * Accessible name. Never visible and always needed — a cart with six of these
2985
3106
  * needs "Quantity, Blue T-shirt (M)", not six controls called "Quantity".
2986
3107
  */
2987
3108
  label: _angular_core.InputSignal<string>;
2988
- min: _angular_core.InputSignal<number>;
2989
- max: _angular_core.InputSignal<number>;
3109
+ min: _angular_core.InputSignal<number | undefined>;
3110
+ max: _angular_core.InputSignal<number | undefined>;
2990
3111
  step: _angular_core.InputSignal<number>;
2991
3112
  size: _angular_core.InputSignal<Size>;
2992
3113
  /** `false` renders the number as text: read-mostly tables. */
@@ -3098,7 +3219,7 @@ declare class UniQuantityStepperComponent extends BaseComponent<UniQuantityStepp
3098
3219
  protected readonly readoutClass: _angular_core.Signal<string>;
3099
3220
  protected readonly glyphSize: _angular_core.Signal<number>;
3100
3221
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniQuantityStepperComponent, never>;
3101
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniQuantityStepperComponent, "uni-quantity-stepper, QuantityStepper", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": true; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "editable": { "alias": "editable"; "required": false; "isSignal": true; }; "deleteAtMin": { "alias": "deleteAtMin"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; "removed": "removed"; }, never, never, true, never>;
3222
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniQuantityStepperComponent, "uni-quantity-stepper, QuantityStepper", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": true; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "editable": { "alias": "editable"; "required": false; "isSignal": true; }; "deleteAtMin": { "alias": "deleteAtMin"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; "touch": "touch"; "removed": "removed"; }, never, never, true, never>;
3102
3223
  }
3103
3224
 
3104
3225
  /**
@@ -3157,24 +3278,36 @@ declare class UniTagInputComponent extends BaseComponent<UniTagInputOptions> imp
3157
3278
  readonly value: _angular_core.ModelSignal<UniTagItem[]>;
3158
3279
  readonly disabled: _angular_core.InputSignal<boolean>;
3159
3280
  readonly touched: _angular_core.ModelSignal<boolean>;
3281
+ /**
3282
+ * Angular 22 marks the bound field touched through this output; the
3283
+ * `touched` model above is bound inward by the directive and no longer
3284
+ * propagates back out. Emitted wherever this control already decided
3285
+ * the user was done with it.
3286
+ */
3287
+ readonly touch: _angular_core.OutputEmitterRef<void>;
3160
3288
  readonly invalid: _angular_core.InputSignal<boolean>;
3161
3289
  readonly dirty: _angular_core.InputSignal<boolean>;
3162
3290
  readonly required: _angular_core.InputSignal<boolean>;
3163
- readonly ariaDescribedBy: _angular_core.InputSignal<string>;
3291
+ readonly ariaDescribedBy: _angular_core.InputSignal<string | undefined>;
3164
3292
  /** Accessible name for the field, e.g. "To". */
3165
3293
  label: _angular_core.InputSignal<string>;
3166
- placeholder: _angular_core.InputSignal<string>;
3294
+ placeholder: _angular_core.InputSignal<string | undefined>;
3167
3295
  /** `email` wires an address validator, paste parser and space separator. */
3168
3296
  preset: _angular_core.InputSignal<"text" | "email">;
3169
3297
  separators: _angular_core.InputSignal<string[]>;
3170
3298
  commitOnBlur: _angular_core.InputSignal<boolean>;
3171
3299
  allowDuplicates: _angular_core.InputSignal<boolean>;
3172
- max: _angular_core.InputSignal<number>;
3173
- validate: _angular_core.InputSignal<(raw: string) => boolean>;
3174
- parse: _angular_core.InputSignal<(pasted: string) => string[]>;
3300
+ /**
3301
+ * Maximum number of tags. Declared as the contract's `maxLength` — for an
3302
+ * array value that is exactly what it means, and Angular 22 types it as a
3303
+ * number — while staying `[max]` in templates.
3304
+ */
3305
+ maxLength: _angular_core.InputSignal<number | undefined>;
3306
+ validate: _angular_core.InputSignal<((raw: string) => boolean) | undefined>;
3307
+ parse: _angular_core.InputSignal<((pasted: string) => string[]) | undefined>;
3175
3308
  tagVariant: _angular_core.InputSignal<keyof _uni_design_system_uni_core.UniVariantRegistry>;
3176
3309
  tagTone: _angular_core.InputSignal<TagTone>;
3177
- tagSize: _angular_core.InputSignal<Size>;
3310
+ tagSize: _angular_core.InputSignal<Size | undefined>;
3178
3311
  suggestions: _angular_core.InputSignal<UniTagSuggestion[]>;
3179
3312
  /** Debounced text the app should filter `suggestions` from. */
3180
3313
  query: _angular_core.OutputEmitterRef<string>;
@@ -3188,7 +3321,7 @@ declare class UniTagInputComponent extends BaseComponent<UniTagInputOptions> imp
3188
3321
  /** Ties the popup to the field so the browser tracks it in the top layer. */
3189
3322
  private readonly anchor;
3190
3323
  /** `manual` where the top layer is usable, else null — see the popup helper. */
3191
- protected readonly popupAttr: "manual";
3324
+ protected readonly popupAttr: "manual" | null;
3192
3325
  constructor();
3193
3326
  /** Uncommitted text in the field. */
3194
3327
  protected readonly draft: _angular_core.WritableSignal<string>;
@@ -3246,7 +3379,7 @@ declare class UniTagInputComponent extends BaseComponent<UniTagInputOptions> imp
3246
3379
  protected readonly inputClass: _angular_core.Signal<string>;
3247
3380
  protected readonly listClass: _angular_core.Signal<string>;
3248
3381
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniTagInputComponent, never>;
3249
- 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>;
3382
+ 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; }; "maxLength": { "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"; "touch": "touch"; "query": "query"; "added": "added"; "removed": "removed"; "rejected": "rejected"; }, never, never, true, never>;
3250
3383
  }
3251
3384
 
3252
3385
  /**
@@ -3267,13 +3400,13 @@ declare class UniTextDirective {
3267
3400
  /** Typeface via the selector attribute: `uni-text="headline-large"`. */
3268
3401
  readonly uniText: _angular_core.InputSignal<string>;
3269
3402
  /** Explicit typeface; the attribute value wins when both are set. */
3270
- typeface: _angular_core.InputSignal<string>;
3403
+ typeface: _angular_core.InputSignal<string | undefined>;
3271
3404
  /** The ink, mapping straight to the CSS `color` property. */
3272
- color: _angular_core.InputSignal<string>;
3405
+ color: _angular_core.InputSignal<string | undefined>;
3273
3406
  display: _angular_core.InputSignal<OptionalDisplay>;
3274
3407
  align: _angular_core.InputSignal<OptionalTextAlign>;
3275
- nowrap: _angular_core.InputSignal<boolean>;
3276
- maxWidth: _angular_core.InputSignal<number>;
3408
+ nowrap: _angular_core.InputSignal<boolean | undefined>;
3409
+ maxWidth: _angular_core.InputSignal<number | undefined>;
3277
3410
  ellipsis: _angular_core.InputSignal<boolean>;
3278
3411
  protected readonly resolvedTypeface: _angular_core.Signal<string>;
3279
3412
  protected readonly className: _angular_core.Signal<string>;
@@ -3286,6 +3419,13 @@ declare class UniTextareaComponent implements FormValueControl<string> {
3286
3419
  readonly value: _angular_core.ModelSignal<string>;
3287
3420
  readonly disabled: _angular_core.InputSignal<boolean>;
3288
3421
  readonly touched: _angular_core.ModelSignal<boolean>;
3422
+ /**
3423
+ * Angular 22 marks the bound field touched through this output; the
3424
+ * `touched` model above is bound inward by the directive and no longer
3425
+ * propagates back out. Emitted wherever this control already decided
3426
+ * the user was done with it.
3427
+ */
3428
+ readonly touch: _angular_core.OutputEmitterRef<void>;
3289
3429
  readonly invalid: _angular_core.InputSignal<boolean>;
3290
3430
  readonly dirty: _angular_core.InputSignal<boolean>;
3291
3431
  /** Synced from required() validators by the Signal Forms [formField] directive. */
@@ -3294,20 +3434,20 @@ declare class UniTextareaComponent implements FormValueControl<string> {
3294
3434
  * Id(s) of external element(s) describing this control — typically your
3295
3435
  * app-rendered error message — exposed as aria-describedby.
3296
3436
  */
3297
- readonly ariaDescribedBy: _angular_core.InputSignal<string>;
3437
+ readonly ariaDescribedBy: _angular_core.InputSignal<string | undefined>;
3298
3438
  label: _angular_core.InputSignal<string>;
3299
3439
  placeholder: _angular_core.InputSignal<string>;
3300
3440
  /** Visible text rows. Defaults to the theme's `textarea` options. */
3301
- rows: _angular_core.InputSignal<number>;
3441
+ rows: _angular_core.InputSignal<number | undefined>;
3302
3442
  readonly readonly: _angular_core.InputSignal<boolean>;
3303
3443
  readonly name: _angular_core.InputSignal<string>;
3304
- readonly minLength: _angular_core.InputSignal<number>;
3305
- readonly maxLength: _angular_core.InputSignal<number>;
3306
- autocomplete: _angular_core.InputSignal<string>;
3307
- spellcheck: _angular_core.InputSignal<boolean>;
3308
- width: _angular_core.InputSignal<string | number>;
3444
+ readonly minLength: _angular_core.InputSignal<number | undefined>;
3445
+ readonly maxLength: _angular_core.InputSignal<number | undefined>;
3446
+ autocomplete: _angular_core.InputSignal<string | undefined>;
3447
+ spellcheck: _angular_core.InputSignal<boolean | undefined>;
3448
+ width: _angular_core.InputSignal<string | number | undefined>;
3309
3449
  fullWidth: _angular_core.InputSignal<boolean>;
3310
- grow: _angular_core.InputSignal<number>;
3450
+ grow: _angular_core.InputSignal<number | undefined>;
3311
3451
  private options;
3312
3452
  protected readonly resolvedRows: _angular_core.Signal<number>;
3313
3453
  protected readonly showError: _angular_core.Signal<boolean>;
@@ -3315,7 +3455,7 @@ declare class UniTextareaComponent implements FormValueControl<string> {
3315
3455
  markAsTouched(): void;
3316
3456
  handleInput(event: Event): void;
3317
3457
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniTextareaComponent, never>;
3318
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniTextareaComponent, "uni-textarea", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": true; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "minLength": { "alias": "minLength"; "required": false; "isSignal": true; }; "maxLength": { "alias": "maxLength"; "required": false; "isSignal": true; }; "autocomplete": { "alias": "autocomplete"; "required": false; "isSignal": true; }; "spellcheck": { "alias": "spellcheck"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "fullWidth": { "alias": "fullWidth"; "required": false; "isSignal": true; }; "grow": { "alias": "grow"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; }, never, never, true, never>;
3458
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniTextareaComponent, "uni-textarea", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": true; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "minLength": { "alias": "minLength"; "required": false; "isSignal": true; }; "maxLength": { "alias": "maxLength"; "required": false; "isSignal": true; }; "autocomplete": { "alias": "autocomplete"; "required": false; "isSignal": true; }; "spellcheck": { "alias": "spellcheck"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "fullWidth": { "alias": "fullWidth"; "required": false; "isSignal": true; }; "grow": { "alias": "grow"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; "touch": "touch"; }, never, never, true, never>;
3319
3459
  }
3320
3460
 
3321
3461
  /** Why typed text did not become a time. The raw text stays in the field. */
@@ -3329,7 +3469,7 @@ interface UniTimeInputRejection {
3329
3469
  * tagInput/searchInput.
3330
3470
  */
3331
3471
  interface UniTimeInputOptions {
3332
- toggleSymbol?: string;
3472
+ toggleIcon?: IconName;
3333
3473
  listColor?: ContainerColorToken;
3334
3474
  listShadow?: Shadow;
3335
3475
  listBorderRadius?: Radius;
@@ -3351,28 +3491,35 @@ interface UniTimeInputOptions {
3351
3491
  * the field, flagged, with a `rejected` event.
3352
3492
  */
3353
3493
  declare class UniTimeInputComponent extends BaseComponent<UniTimeInputOptions> implements FormValueControl<UniTime | undefined> {
3354
- readonly value: _angular_core.ModelSignal<string>;
3494
+ readonly value: _angular_core.ModelSignal<string | undefined>;
3355
3495
  readonly disabled: _angular_core.InputSignal<boolean>;
3356
3496
  readonly touched: _angular_core.ModelSignal<boolean>;
3497
+ /**
3498
+ * Angular 22 marks the bound field touched through this output; the
3499
+ * `touched` model above is bound inward by the directive and no longer
3500
+ * propagates back out. Emitted wherever this control already decided
3501
+ * the user was done with it.
3502
+ */
3503
+ readonly touch: _angular_core.OutputEmitterRef<void>;
3357
3504
  readonly invalid: _angular_core.InputSignal<boolean>;
3358
3505
  readonly dirty: _angular_core.InputSignal<boolean>;
3359
3506
  readonly required: _angular_core.InputSignal<boolean>;
3360
- readonly ariaDescribedBy: _angular_core.InputSignal<string>;
3507
+ readonly ariaDescribedBy: _angular_core.InputSignal<string | undefined>;
3361
3508
  /** Accessible name for the field, e.g. "Start time". */
3362
3509
  label: _angular_core.InputSignal<string>;
3363
- placeholder: _angular_core.InputSignal<string>;
3510
+ placeholder: _angular_core.InputSignal<string | undefined>;
3364
3511
  /** Generated list granularity, in minutes. */
3365
3512
  minuteStep: _angular_core.InputSignal<number>;
3366
3513
  /** Earliest allowed time (inclusive), `'09:00'`. */
3367
- minTime: _angular_core.InputSignal<string>;
3514
+ minTime: _angular_core.InputSignal<string | undefined>;
3368
3515
  /** Latest allowed time (inclusive), `'17:00'`. */
3369
- maxTime: _angular_core.InputSignal<string>;
3516
+ maxTime: _angular_core.InputSignal<string | undefined>;
3370
3517
  /** Exact allowed times (scheduling). When set, typed entry must match one. */
3371
- slots: _angular_core.InputSignal<string[]>;
3518
+ slots: _angular_core.InputSignal<string[] | undefined>;
3372
3519
  /** 12-hour display; defaults from the locale. The value stays 24-hour. */
3373
- hour12: _angular_core.InputSignal<boolean>;
3520
+ hour12: _angular_core.InputSignal<boolean | undefined>;
3374
3521
  /** BCP 47 tag for the display format; defaults to the document language. */
3375
- locale: _angular_core.InputSignal<string>;
3522
+ locale: _angular_core.InputSignal<string | undefined>;
3376
3523
  commitOnBlur: _angular_core.InputSignal<boolean>;
3377
3524
  /** Renders without its own input-box chrome, for composers like uni-date-time-input. */
3378
3525
  embedded: _angular_core.InputSignal<boolean>;
@@ -3384,7 +3531,7 @@ declare class UniTimeInputComponent extends BaseComponent<UniTimeInputOptions> i
3384
3531
  /** Ties the popup to the field so the browser tracks it in the top layer. */
3385
3532
  private readonly anchor;
3386
3533
  /** `manual` where the top layer is usable, else null — see the popup helper. */
3387
- protected readonly popupAttr: "manual";
3534
+ protected readonly popupAttr: "manual" | null;
3388
3535
  constructor();
3389
3536
  protected readonly srOnly: string;
3390
3537
  /** A refused commit — styles the field and sets aria-invalid until edited. */
@@ -3424,7 +3571,7 @@ declare class UniTimeInputComponent extends BaseComponent<UniTimeInputOptions> i
3424
3571
  protected readonly embeddedClass: _angular_core.Signal<string>;
3425
3572
  protected readonly listClass: _angular_core.Signal<string>;
3426
3573
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniTimeInputComponent, never>;
3427
- 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>;
3574
+ 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"; "touch": "touch"; "rejected": "rejected"; }, never, never, true, never>;
3428
3575
  }
3429
3576
 
3430
3577
  /**
@@ -3436,15 +3583,6 @@ interface UniToggleVariant {
3436
3583
  accent: ColorKey;
3437
3584
  }
3438
3585
  interface UniToggleOptions {
3439
- /**
3440
- * @deprecated Track height in px, from before the toggle had a `sizes` block.
3441
- * Still honoured — and still wins when set, since a theme carrying it opted
3442
- * into the old derived-ratio geometry (width = 2x, knob = 0.8x) — but it
3443
- * applies to every instance regardless of the `size` input. Prefer the
3444
- * theme's `toggle.sizes` block, which gives each size token its own
3445
- * `width` / `height` / `padding`.
3446
- */
3447
- size?: number;
3448
3586
  /** Off-state track color token. */
3449
3587
  trackColor?: ColorKey;
3450
3588
  /** Knob color token. */
@@ -3463,6 +3601,13 @@ declare class UniToggleComponent extends BaseComponent<UniToggleOptions, UniTogg
3463
3601
  readonly checked: _angular_core.ModelSignal<boolean>;
3464
3602
  readonly disabled: _angular_core.InputSignal<boolean>;
3465
3603
  readonly touched: _angular_core.ModelSignal<boolean>;
3604
+ /**
3605
+ * Angular 22 marks the bound field touched through this output; the
3606
+ * `touched` model above is bound inward by the directive and no longer
3607
+ * propagates back out. Emitted wherever this control already decided
3608
+ * the user was done with it.
3609
+ */
3610
+ readonly touch: _angular_core.OutputEmitterRef<void>;
3466
3611
  readonly invalid: _angular_core.InputSignal<boolean>;
3467
3612
  readonly dirty: _angular_core.InputSignal<boolean>;
3468
3613
  /** Synced from required() validators by the Signal Forms [formField] directive. */
@@ -3471,8 +3616,8 @@ declare class UniToggleComponent extends BaseComponent<UniToggleOptions, UniTogg
3471
3616
  * Id(s) of external element(s) describing this control — typically your
3472
3617
  * app-rendered error message — exposed as aria-describedby.
3473
3618
  */
3474
- readonly ariaDescribedBy: _angular_core.InputSignal<string>;
3475
- readonly label: _angular_core.InputSignal<string>;
3619
+ readonly ariaDescribedBy: _angular_core.InputSignal<string | undefined>;
3620
+ readonly label: _angular_core.InputSignal<string | undefined>;
3476
3621
  /**
3477
3622
  * Checked-state track color token, overriding the theme's
3478
3623
  * `toggle.behavior.checkedColor`.
@@ -3482,7 +3627,7 @@ declare class UniToggleComponent extends BaseComponent<UniToggleOptions, UniTogg
3482
3627
  * tell "set to primary" from "not set". Without an input, a theme-level
3483
3628
  * `checkedColor` would silently make per-instance `variant` inert.
3484
3629
  */
3485
- readonly checkedColor: _angular_core.InputSignal<string>;
3630
+ readonly checkedColor: _angular_core.InputSignal<string | undefined>;
3486
3631
  protected readonly showError: _angular_core.Signal<boolean>;
3487
3632
  markAsTouched(): void;
3488
3633
  handleChange(event: Event): void;
@@ -3513,7 +3658,7 @@ declare class UniToggleComponent extends BaseComponent<UniToggleOptions, UniTogg
3513
3658
  /** A chrome colour by token — no silent fallback; see `uni-radio`. */
3514
3659
  private color;
3515
3660
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniToggleComponent, never>;
3516
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniToggleComponent, "uni-toggle", never, { "checked": { "alias": "checked"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "checkedColor": { "alias": "checkedColor"; "required": false; "isSignal": true; }; }, { "checked": "checkedChange"; "touched": "touchedChange"; }, never, never, true, never>;
3661
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniToggleComponent, "uni-toggle", never, { "checked": { "alias": "checked"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "checkedColor": { "alias": "checkedColor"; "required": false; "isSignal": true; }; }, { "checked": "checkedChange"; "touched": "touchedChange"; "touch": "touch"; }, never, never, true, never>;
3517
3662
  }
3518
3663
 
3519
3664
  /**
@@ -3555,7 +3700,7 @@ interface UniAppBarOptions {
3555
3700
  */
3556
3701
  declare class UniAppBarComponent extends BaseComponent<UniAppBarOptions> {
3557
3702
  /** Bar title; alternatively project your own center content. */
3558
- title: _angular_core.InputSignal<string>;
3703
+ title: _angular_core.InputSignal<string | undefined>;
3559
3704
  /** Stick the bar to the top of its scroll container. */
3560
3705
  sticky: _angular_core.InputSignal<boolean>;
3561
3706
  protected readonly className: _angular_core.Signal<string>;
@@ -3570,7 +3715,7 @@ interface UniAvatarOptions {
3570
3715
  /** Typeface token for the initials. */
3571
3716
  typeface?: Typeface;
3572
3717
  /** Symbol shown when there is no image and no name to take initials from. */
3573
- fallbackSymbol?: string;
3718
+ fallbackIcon?: IconName;
3574
3719
  }
3575
3720
  /** Theme-level options for `uni-avatar-group`. */
3576
3721
  interface UniAvatarGroupOptions {
@@ -3589,15 +3734,15 @@ interface UniAvatarGroupOptions {
3589
3734
  */
3590
3735
  declare class UniAvatarComponent extends BaseComponent<UniAvatarOptions> {
3591
3736
  /** Image URL; on load error the avatar falls back to initials/symbol. */
3592
- src: _angular_core.InputSignal<string>;
3737
+ src: _angular_core.InputSignal<string | undefined>;
3593
3738
  /** Person's name: drives the initials and the accessible label. */
3594
- name: _angular_core.InputSignal<string>;
3739
+ name: _angular_core.InputSignal<string | undefined>;
3595
3740
  /** Verbatim text instead of derived initials (e.g. a group's “+3”). */
3596
- text: _angular_core.InputSignal<string>;
3741
+ text: _angular_core.InputSignal<string | undefined>;
3597
3742
  protected readonly imageFailed: _angular_core.WritableSignal<boolean>;
3598
3743
  protected readonly showImage: _angular_core.Signal<boolean>;
3599
3744
  protected readonly initials: _angular_core.Signal<string>;
3600
- protected readonly label: _angular_core.Signal<string>;
3745
+ protected readonly label: _angular_core.Signal<string | undefined>;
3601
3746
  protected readonly className: _angular_core.Signal<string>;
3602
3747
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniAvatarComponent, never>;
3603
3748
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniAvatarComponent, "uni-avatar", never, { "src": { "alias": "src"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "text": { "alias": "text"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
@@ -3610,7 +3755,7 @@ declare class UniAvatarComponent extends BaseComponent<UniAvatarOptions> {
3610
3755
  */
3611
3756
  declare class UniAvatarGroupComponent extends BaseComponent<UniAvatarGroupOptions> {
3612
3757
  /** Show at most this many avatars; the rest collapse into a “+N” chip. */
3613
- max: _angular_core.InputSignal<number>;
3758
+ max: _angular_core.InputSignal<number | undefined>;
3614
3759
  private readonly avatars;
3615
3760
  protected readonly surplus: _angular_core.Signal<number>;
3616
3761
  protected readonly className: _angular_core.Signal<string>;
@@ -3621,11 +3766,11 @@ declare class UniAvatarGroupComponent extends BaseComponent<UniAvatarGroupOption
3621
3766
  type ImagePosition = 'top' | 'bottom' | 'left' | 'right' | 'center' | string;
3622
3767
  declare class UniBackgroundComponent {
3623
3768
  theme: ThemeService;
3624
- image: _angular_core.InputSignal<string>;
3625
- imagePosition: _angular_core.InputSignal<string>;
3626
- imageSize: _angular_core.InputSignal<string | number>;
3769
+ image: _angular_core.InputSignal<string | undefined>;
3770
+ imagePosition: _angular_core.InputSignal<string | undefined>;
3771
+ imageSize: _angular_core.InputSignal<string | number | undefined>;
3627
3772
  height: _angular_core.InputSignal<string | number>;
3628
- width: _angular_core.InputSignal<string | number>;
3773
+ width: _angular_core.InputSignal<string | number | undefined>;
3629
3774
  protected readonly className: _angular_core.Signal<string>;
3630
3775
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniBackgroundComponent, never>;
3631
3776
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniBackgroundComponent, "uni-background", never, { "image": { "alias": "image"; "required": false; "isSignal": true; }; "imagePosition": { "alias": "imagePosition"; "required": false; "isSignal": true; }; "imageSize": { "alias": "imageSize"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
@@ -3636,9 +3781,9 @@ interface UniBadgeOptions {
3636
3781
  }
3637
3782
 
3638
3783
  declare class UniBadgeComponent extends BaseComponent<UniBadgeOptions> {
3639
- color: _angular_core.InputSignal<keyof _uni_design_system_uni_core.UniVariantRegistry>;
3784
+ color: _angular_core.InputSignal<keyof _uni_design_system_uni_core.UniVariantRegistry | undefined>;
3640
3785
  useVariant: _angular_core.InputSignal<boolean>;
3641
- width: _angular_core.InputSignal<number>;
3786
+ width: _angular_core.InputSignal<number | undefined>;
3642
3787
  protected readonly className: _angular_core.Signal<string>;
3643
3788
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniBadgeComponent, never>;
3644
3789
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniBadgeComponent, "[uni-badge]", never, { "color": { "alias": "color"; "required": false; "isSignal": true; }; "useVariant": { "alias": "useVariant"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
@@ -3659,7 +3804,7 @@ interface UniBreadcrumbOptions {
3659
3804
  /** Color of the current (last) item. */
3660
3805
  currentColor?: ColorKey;
3661
3806
  /** Material symbol drawn between items. */
3662
- separatorSymbol?: string;
3807
+ separatorIcon?: IconName;
3663
3808
  /** Space around separators, as a spacing token. */
3664
3809
  gap?: OptionalSize;
3665
3810
  }
@@ -3705,6 +3850,8 @@ interface UniButtonVariant {
3705
3850
  }
3706
3851
  /** Theme-level options for `uni-text-button`, resolved by token name. */
3707
3852
  interface UniButtonOptions {
3853
+ /** Named motion primitive for the hover and press transition. Defaults to `control`. */
3854
+ motion?: Motion;
3708
3855
  /**
3709
3856
  * Corner radius as a radii token. The default theme uses `max` (pill);
3710
3857
  * because this is a token, the theme's radii scale — including generated
@@ -3734,12 +3881,14 @@ declare class RippleDirective {
3734
3881
  }
3735
3882
 
3736
3883
  declare class UniButtonComponent extends BaseComponent<UniButtonOptions, UniButtonVariant> {
3737
- readonly disable: _angular_core.InputSignal<boolean>;
3738
- readonly loading: _angular_core.InputSignal<boolean>;
3884
+ readonly disable: _angular_core.InputSignal<boolean | undefined>;
3885
+ readonly loading: _angular_core.InputSignal<boolean | undefined>;
3739
3886
  readonly fullWidth: _angular_core.InputSignal<boolean>;
3740
- readonly symbolLeft: _angular_core.InputSignal<string>;
3741
- readonly symbolRight: _angular_core.InputSignal<string>;
3887
+ readonly symbolLeft: _angular_core.InputSignal<string | undefined>;
3888
+ readonly symbolRight: _angular_core.InputSignal<string | undefined>;
3742
3889
  spinnerBox: string;
3890
+ /** Resolved from the component's `motion` option; `control` by default. */
3891
+ private readonly motion;
3743
3892
  protected readonly className: _angular_core.Signal<string>;
3744
3893
  /**
3745
3894
  * The focus ring's colour, from the variant's theme entry.
@@ -3763,13 +3912,6 @@ declare class UniButtonComponent extends BaseComponent<UniButtonOptions, UniButt
3763
3912
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniButtonComponent, "button[uni-text-button], button[text-button]", never, { "disable": { "alias": "disable"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "fullWidth": { "alias": "fullWidth"; "required": false; "isSignal": true; }; "symbolLeft": { "alias": "symbolLeft"; "required": false; "isSignal": true; }; "symbolRight": { "alias": "symbolRight"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, [{ directive: typeof RippleDirective; inputs: {}; outputs: {}; }]>;
3764
3913
  }
3765
3914
 
3766
- declare class UniButtonGroupComponent {
3767
- private themeService;
3768
- protected readonly className: _angular_core.Signal<string>;
3769
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniButtonGroupComponent, never>;
3770
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniButtonGroupComponent, "uni-button-group", never, {}, {}, never, ["*"], true, never>;
3771
- }
3772
-
3773
3915
  interface ButtonGroupConfig {
3774
3916
  tooltipPlacement?: Placement;
3775
3917
  buttonSize: Size;
@@ -3782,6 +3924,25 @@ interface ButtonGroupItem {
3782
3924
  action?: (selectedState?: boolean) => boolean | void;
3783
3925
  toggle?: WritableSignal<boolean>;
3784
3926
  }
3927
+ /**
3928
+ * Theme options for `uni-button-group`. Declared in `ComponentName` since 8.x
3929
+ * but with no entry behind it until 11.0.0, so the segmented frame's border
3930
+ * and corner radius were hardcoded and unreachable from a theme.
3931
+ */
3932
+ interface UniButtonGroupOptions {
3933
+ /** Border primitive around each segment. Defaults to `quaternary`. */
3934
+ border?: Border;
3935
+ /** Corner radius on the outer ends of the group, in px. Defaults to 4. */
3936
+ borderRadius?: number;
3937
+ }
3938
+
3939
+ declare class UniButtonGroupComponent {
3940
+ private themeService;
3941
+ protected readonly componentOptions: _angular_core.WritableSignal<UniButtonGroupOptions>;
3942
+ protected readonly className: _angular_core.Signal<string>;
3943
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniButtonGroupComponent, never>;
3944
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniButtonGroupComponent, "uni-button-group", never, {}, {}, never, ["*"], true, never>;
3945
+ }
3785
3946
 
3786
3947
  /** One rendered day cell — precomputed so the template stays declarative. */
3787
3948
  interface CalendarCell {
@@ -3811,28 +3972,35 @@ declare class UniCalendarComponent extends BaseComponent<UniCalendarOptions> imp
3811
3972
  readonly value: _angular_core.ModelSignal<UniCalendarValue>;
3812
3973
  readonly disabled: _angular_core.InputSignal<boolean>;
3813
3974
  readonly touched: _angular_core.ModelSignal<boolean>;
3975
+ /**
3976
+ * Angular 22 marks the bound field touched through this output; the
3977
+ * `touched` model above is bound inward by the directive and no longer
3978
+ * propagates back out. Emitted wherever this control already decided
3979
+ * the user was done with it.
3980
+ */
3981
+ readonly touch: _angular_core.OutputEmitterRef<void>;
3814
3982
  readonly invalid: _angular_core.InputSignal<boolean>;
3815
3983
  readonly dirty: _angular_core.InputSignal<boolean>;
3816
3984
  readonly required: _angular_core.InputSignal<boolean>;
3817
- readonly ariaDescribedBy: _angular_core.InputSignal<string>;
3985
+ readonly ariaDescribedBy: _angular_core.InputSignal<string | undefined>;
3818
3986
  /** `'single'` reads/writes a `UniDate`; `'range'` a `UniDateRange`. */
3819
3987
  mode: _angular_core.InputSignal<UniCalendarMode>;
3820
3988
  /** Shown month, `'YYYY-MM'` — two-way, so an app can drive "jump to June". */
3821
- month: _angular_core.ModelSignal<string>;
3989
+ month: _angular_core.ModelSignal<string | undefined>;
3822
3990
  /** Earliest selectable date (inclusive). */
3823
- minDate: _angular_core.InputSignal<string>;
3991
+ minDate: _angular_core.InputSignal<string | undefined>;
3824
3992
  /** Latest selectable date (inclusive). */
3825
- maxDate: _angular_core.InputSignal<string>;
3993
+ maxDate: _angular_core.InputSignal<string | undefined>;
3826
3994
  /** Blocked days: a list of dates, or a predicate. */
3827
- disabledDates: _angular_core.InputSignal<string[] | ((date: UniDate) => boolean)>;
3995
+ disabledDates: _angular_core.InputSignal<string[] | ((date: UniDate) => boolean) | undefined>;
3828
3996
  /** Availability dots; `label` extends the day's accessible name. */
3829
3997
  markers: _angular_core.InputSignal<UniCalendarMarker[]>;
3830
3998
  /** BCP 47 tag; defaults to the document language, then the browser's. */
3831
- locale: _angular_core.InputSignal<string>;
3999
+ locale: _angular_core.InputSignal<string | undefined>;
3832
4000
  /** First day of week, 0 = Sunday; defaults from the locale's week info. */
3833
- weekStart: _angular_core.InputSignal<0 | 1 | 2 | 3 | 4 | 5 | 6>;
4001
+ weekStart: _angular_core.InputSignal<0 | 1 | 2 | 3 | 4 | 5 | 6 | undefined>;
3834
4002
  /** Names the grid when it stands alone (otherwise the heading names it). */
3835
- ariaLabel: _angular_core.InputSignal<string>;
4003
+ ariaLabel: _angular_core.InputSignal<string | undefined>;
3836
4004
  /** Day geometry token; `sm`/`md`/`lg` map to the theme's `calendar` sizes. */
3837
4005
  size: _angular_core.InputSignal<Size>;
3838
4006
  /** Each committed day, including both ends of a range. */
@@ -3841,9 +4009,9 @@ declare class UniCalendarComponent extends BaseComponent<UniCalendarOptions> imp
3841
4009
  protected readonly headingId: string;
3842
4010
  protected readonly srOnly: string;
3843
4011
  /** Pending range start — set by the first commit, cleared by the second. */
3844
- protected readonly pendingStart: _angular_core.WritableSignal<string>;
4012
+ protected readonly pendingStart: _angular_core.WritableSignal<string | null>;
3845
4013
  /** Hover/focus candidate painting the preview band while a range is pending. */
3846
- protected readonly previewDate: _angular_core.WritableSignal<string>;
4014
+ protected readonly previewDate: _angular_core.WritableSignal<string | null>;
3847
4015
  /** Live-region text; selections are otherwise silent for a screen reader. */
3848
4016
  /** Commits, clears and refusals are otherwise silent to a screen reader. */
3849
4017
  protected readonly announcer: _uni_design_system_uni_angular.Announcer;
@@ -3915,7 +4083,7 @@ declare class UniCalendarComponent extends BaseComponent<UniCalendarOptions> imp
3915
4083
  protected dotClassFor(variant: Variant | undefined): string;
3916
4084
  protected readonly showOutside: _angular_core.Signal<boolean>;
3917
4085
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniCalendarComponent, never>;
3918
- 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>;
4086
+ 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"; "touch": "touch"; "month": "monthChange"; "selected": "selected"; }, never, never, true, never>;
3919
4087
  }
3920
4088
 
3921
4089
  /** Why a callout closed. `programmatic` = the app drove `open` to false. */
@@ -3936,7 +4104,7 @@ interface UniCalloutOptions {
3936
4104
  padding: string;
3937
4105
  headerTypeface: Typeface;
3938
4106
  typeface: Typeface;
3939
- closeSymbol: IconName;
4107
+ closeIcon: IconName;
3940
4108
  arrowSize: number;
3941
4109
  /** Main-axis gap between the spotlight hole edge and the panel, px. */
3942
4110
  offset: number;
@@ -3973,22 +4141,22 @@ declare class UniCalloutComponent extends BaseComponent<UniCalloutOptions> {
3973
4141
  private destroyRef;
3974
4142
  open: _angular_core.ModelSignal<boolean>;
3975
4143
  /** Identifies this callout in `dismissed` payloads. Empty string = unset. */
3976
- key: _angular_core.InputSignal<string>;
4144
+ key: _angular_core.InputSignal<string | undefined>;
3977
4145
  /** Element (or id, resolved at open time) to spotlight. '' = unset. */
3978
- target: _angular_core.InputSignal<string | HTMLElement>;
4146
+ target: _angular_core.InputSignal<string | HTMLElement | undefined>;
3979
4147
  placement: _angular_core.InputSignal<Placement>;
3980
4148
  /** Defaults to `spotlight` when a target resolves, else `dim`. */
3981
- backdrop: _angular_core.InputSignal<"none" | "spotlight" | "dim">;
4149
+ backdrop: _angular_core.InputSignal<"none" | "spotlight" | "dim" | undefined>;
3982
4150
  /** When false, a transparent cover blocks the spotlit target. */
3983
4151
  targetInteractive: _angular_core.InputSignal<boolean>;
3984
4152
  /** Gates Escape and the close button. */
3985
4153
  dismissible: _angular_core.InputSignal<boolean>;
3986
4154
  /** When true, scrim clicks close (reason `backdrop`); else the panel pulses. */
3987
4155
  dismissOnBackdrop: _angular_core.InputSignal<boolean>;
3988
- header: _angular_core.InputSignal<string>;
4156
+ header: _angular_core.InputSignal<string | undefined>;
3989
4157
  arrow: _angular_core.InputSignal<boolean>;
3990
4158
  /** Wins over the header/body labelling; the tour sets "{title}, step n of N". */
3991
- ariaLabel: _angular_core.InputSignal<string>;
4159
+ ariaLabel: _angular_core.InputSignal<string | undefined>;
3992
4160
  /** Accessible name of the dismiss button (the tour passes its skip label). */
3993
4161
  closeLabel: _angular_core.InputSignal<string>;
3994
4162
  opened: _angular_core.OutputEmitterRef<void>;
@@ -4001,7 +4169,7 @@ declare class UniCalloutComponent extends BaseComponent<UniCalloutOptions> {
4001
4169
  protected readonly bodyId: string;
4002
4170
  private readonly anchorName;
4003
4171
  protected readonly showing: _angular_core.WritableSignal<boolean>;
4004
- protected readonly activeTarget: _angular_core.WritableSignal<HTMLElement>;
4172
+ protected readonly activeTarget: _angular_core.WritableSignal<HTMLElement | null>;
4005
4173
  private readonly scrimShown;
4006
4174
  /**
4007
4175
  * Keeps the spotlight pieces rendered and the panel anchored through the
@@ -4086,7 +4254,7 @@ declare class UniCardComponent extends BaseComponent<UniCardOptions> {
4086
4254
  * older themes keep winning.
4087
4255
  */
4088
4256
  protected readonly cardStyle: _angular_core.Signal<{
4089
- boxShadow: string;
4257
+ boxShadow?: string | undefined;
4090
4258
  }>;
4091
4259
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniCardComponent, never>;
4092
4260
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniCardComponent, "uni-card", never, {}, {}, never, ["*"], true, never>;
@@ -4100,9 +4268,9 @@ interface UniDataSearchOptions {
4100
4268
  }
4101
4269
 
4102
4270
  declare class UniDataSearchComponent<T> extends BaseComponent<UniDataSearchOptions> {
4103
- datasource: _angular_core.InputSignal<UniDatasource<T>>;
4271
+ datasource: _angular_core.InputSignal<UniDatasource<T> | undefined>;
4104
4272
  placeholder: _angular_core.InputSignal<string>;
4105
- fields: _angular_core.InputSignal<string[]>;
4273
+ fields: _angular_core.InputSignal<string[] | undefined>;
4106
4274
  searchValue: _angular_core.WritableSignal<string>;
4107
4275
  inputClassName: string;
4108
4276
  constructor();
@@ -4122,6 +4290,8 @@ interface ColumnDefinition<T> {
4122
4290
  textAlign?: 'left' | 'right' | 'center';
4123
4291
  }
4124
4292
  interface UniDataTableOptions {
4293
+ /** Named motion primitive for the row hover transition. Defaults to `control`. */
4294
+ motion?: Motion;
4125
4295
  border?: Border;
4126
4296
  borderRadius?: Radius;
4127
4297
  color?: ContainerColorToken;
@@ -4154,14 +4324,18 @@ declare class UniDataTableComponent<T> extends BaseComponent<UniDataTableOptions
4154
4324
  detailRowTemplate: _angular_core.InputSignal<TemplateRef<{
4155
4325
  $implicit: T;
4156
4326
  index: number;
4157
- }>>;
4158
- expandedIndex: _angular_core.WritableSignal<number>;
4327
+ }> | undefined>;
4328
+ expandedIndex: _angular_core.WritableSignal<number | null>;
4159
4329
  useMultiSelect: _angular_core.InputSignal<boolean>;
4160
4330
  useRowClick: _angular_core.InputSignal<boolean>;
4161
- highlight?: _angular_core.InputSignal<(row: T) => boolean>;
4162
- height: _angular_core.InputSignal<string>;
4331
+ highlight?: _angular_core.InputSignal<((row: T) => boolean) | undefined> | undefined;
4332
+ height: _angular_core.InputSignal<string | undefined>;
4163
4333
  scrollable: _angular_core.WritableSignal<boolean>;
4164
- loadingOverlayClass: string;
4334
+ /** Row hover answers the pointer; the overlay arrives; a detail row reveals. */
4335
+ private readonly motion;
4336
+ private readonly overlayMotion;
4337
+ private readonly revealMotion;
4338
+ protected readonly loadingOverlayClass: _angular_core.Signal<string>;
4165
4339
  rowSelect: _angular_core.OutputEmitterRef<T>;
4166
4340
  rowClick: _angular_core.OutputEmitterRef<T>;
4167
4341
  protected readonly tableClass: _angular_core.Signal<string>;
@@ -4179,7 +4353,7 @@ declare class UniDataTableComponent<T> extends BaseComponent<UniDataTableOptions
4179
4353
  isHighlighted(row: T): boolean;
4180
4354
  protected readonly String: StringConstructor;
4181
4355
  handleScrollable(scrollable: boolean): void;
4182
- getBorder(name: string | undefined): string;
4356
+ getBorder(name: string | undefined): string | undefined;
4183
4357
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniDataTableComponent<any>, never>;
4184
4358
  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>;
4185
4359
  }
@@ -4196,6 +4370,8 @@ interface UniDialogButtonsOptions {
4196
4370
  /** Bottom padding, as a spacing token. */
4197
4371
  paddingBottom?: NullableSize;
4198
4372
  justifyContent?: JustifyContent;
4373
+ /** Border drawn above the pinned row, separating it from the scrolling body. */
4374
+ divider?: Border;
4199
4375
  confirmButtonVariant?: Variant;
4200
4376
  cancelButtonVariant?: Variant;
4201
4377
  /** Size passed to both buttons. */
@@ -4212,14 +4388,14 @@ interface UniDialogButtonsOptions {
4212
4388
 
4213
4389
  declare class UniDialogButtonsComponent extends BaseComponent<UniDialogButtonsOptions> {
4214
4390
  private dialog;
4215
- confirmButtonText: _angular_core.InputSignal<string>;
4216
- confirmButtonVariant: _angular_core.InputSignal<keyof _uni_design_system_uni_core.UniVariantRegistry>;
4217
- cancelButtonText: _angular_core.InputSignal<string>;
4218
- cancelButtonVariant: _angular_core.InputSignal<keyof _uni_design_system_uni_core.UniVariantRegistry>;
4219
- disableConfirm: _angular_core.InputSignal<boolean>;
4220
- padding: _angular_core.InputSignal<NullableSize>;
4221
- paddingBottom: _angular_core.InputSignal<NullableSize>;
4222
- justifyContent: _angular_core.InputSignal<JustifyContent>;
4391
+ confirmButtonText: _angular_core.InputSignal<string | undefined>;
4392
+ confirmButtonVariant: _angular_core.InputSignal<keyof _uni_design_system_uni_core.UniVariantRegistry | undefined>;
4393
+ cancelButtonText: _angular_core.InputSignal<string | undefined>;
4394
+ cancelButtonVariant: _angular_core.InputSignal<keyof _uni_design_system_uni_core.UniVariantRegistry | undefined>;
4395
+ disableConfirm: _angular_core.InputSignal<boolean | undefined>;
4396
+ padding: _angular_core.InputSignal<NullableSize | undefined>;
4397
+ paddingBottom: _angular_core.InputSignal<NullableSize | undefined>;
4398
+ justifyContent: _angular_core.InputSignal<JustifyContent | undefined>;
4223
4399
  confirmed: _angular_core.OutputEmitterRef<void>;
4224
4400
  protected confirmVariant: _angular_core.Signal<keyof _uni_design_system_uni_core.UniVariantRegistry>;
4225
4401
  protected cancelVariant: _angular_core.Signal<keyof _uni_design_system_uni_core.UniVariantRegistry>;
@@ -4228,6 +4404,8 @@ declare class UniDialogButtonsComponent extends BaseComponent<UniDialogButtonsOp
4228
4404
  protected justifyContentValue: _angular_core.Signal<JustifyContent>;
4229
4405
  protected gapValue: _angular_core.Signal<NullableSize>;
4230
4406
  protected buttonSize: _angular_core.Signal<Size>;
4407
+ /** A pinned row, sized by its content rather than by the body beside it. */
4408
+ protected readonly hostClass: _angular_core.Signal<string>;
4231
4409
  protected readonly className: _angular_core.Signal<string>;
4232
4410
  closeDialog(): void;
4233
4411
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniDialogButtonsComponent, never>;
@@ -4243,19 +4421,25 @@ interface UniDialogHeaderOptions {
4243
4421
  textRole: TextRole;
4244
4422
  textColor?: ContentColorToken;
4245
4423
  textAlign?: 'left' | 'center' | 'right';
4424
+ /** Border drawn under the pinned header, separating it from the scrolling body. */
4425
+ divider?: Border;
4246
4426
  closeButtonIcon?: IconName;
4247
- closeButtonSymbol?: string;
4248
4427
  closeButtonSize?: Size;
4249
4428
  }
4250
4429
 
4251
4430
  declare class UniDialogHeaderComponent extends BaseComponent<UniDialogHeaderOptions> {
4252
4431
  private dialog;
4253
4432
  /** Attached to the title element so the parent dialog is labelled by it. */
4254
- protected readonly titleId: string;
4433
+ protected readonly titleId: string | null;
4255
4434
  constructor();
4256
4435
  closeDialog(): void;
4436
+ /**
4437
+ * A pinned row: it is a flex child of the dialog and must not be sized by
4438
+ * the scrolling body beside it.
4439
+ */
4440
+ protected readonly className: _angular_core.Signal<string>;
4257
4441
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniDialogHeaderComponent, never>;
4258
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniDialogHeaderComponent, "[uni-dialog-header]", never, {}, {}, never, ["*"], true, never>;
4442
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniDialogHeaderComponent, "[uni-dialog-header], [dialog-header]", never, {}, {}, never, ["*"], true, never>;
4259
4443
  }
4260
4444
 
4261
4445
  interface UniDialogOptions {
@@ -4263,10 +4447,51 @@ interface UniDialogOptions {
4263
4447
  borderRadius: Radius;
4264
4448
  color: ContainerColorToken;
4265
4449
  elevation: Elevation;
4266
- backdrop: StyleExpression;
4450
+ /**
4451
+ * Name of a `backdrops` primitive — the wash laid over the page behind the
4452
+ * dialog. Shared with the drawer, so one token dresses both. A raw style
4453
+ * object is still accepted for themes that stated one before the scale.
4454
+ */
4455
+ backdrop: Backdrop | StyleExpression;
4456
+ /**
4457
+ * Insets the whole surface: the pinned header, the scrolling body and the
4458
+ * pinned buttons all sit inside it. Safe on a surface that never scrolls —
4459
+ * the dialog is `overflow: clip` and only its body row scrolls.
4460
+ */
4267
4461
  padding?: NullableSize;
4462
+ /**
4463
+ * Padding on the scrolling body row alone. Distinct from `padding`, which
4464
+ * insets all three rows.
4465
+ */
4466
+ bodyPadding?: NullableSize;
4467
+ /**
4468
+ * Timing for the open and close fade, panel and scrim together. The same
4469
+ * token the drawer points at, so the two surfaces arrive and leave alike.
4470
+ */
4471
+ motion?: Motion;
4472
+ /**
4473
+ * Minimum gap between the surface and the viewport edge. The dialog is
4474
+ * content-sized up to `calc(100dvh - 2 x inset)` and scrolls its body from
4475
+ * there.
4476
+ */
4477
+ inset?: NullableSize;
4268
4478
  }
4269
4479
 
4480
+ /**
4481
+ * Modal dialog on the native `<dialog>` element, laid out as three rows:
4482
+ * an optional `[dialog-header]`, the projected body, an optional
4483
+ * `[dialog-buttons]`.
4484
+ *
4485
+ * **The surface is never the scroll container.** It is a flex column that is
4486
+ * `overflow: clip` on both axes; the header and buttons pin while only the
4487
+ * body row scrolls. Unlike the drawer, which is deliberately viewport-tall,
4488
+ * the dialog stays content-sized: it has no `height`, and grows until it hits
4489
+ * `calc(100dvh - 2 x inset)` — the point at which the body starts to scroll.
4490
+ *
4491
+ * The theme's `padding` insets all three rows (which is what makes the default
4492
+ * header read as a pill floating inside the surface); `bodyPadding` pads the
4493
+ * scrolling row alone.
4494
+ */
4270
4495
  declare class UniDialogComponent extends BaseComponent<UniDialogOptions> {
4271
4496
  private elem;
4272
4497
  /** Two-way bindable open state: [(show)]. */
@@ -4275,21 +4500,34 @@ declare class UniDialogComponent extends BaseComponent<UniDialogOptions> {
4275
4500
  * Accessible name for dialogs without a DialogHeader. When a DialogHeader
4276
4501
  * is present it labels the dialog automatically via aria-labelledby.
4277
4502
  */
4278
- ariaLabel: _angular_core.InputSignal<string>;
4503
+ ariaLabel: _angular_core.InputSignal<string | undefined>;
4279
4504
  /**
4280
4505
  * CSS selector for the element to focus when the dialog opens. Defaults to
4281
4506
  * the browser's native behavior (first focusable element).
4282
4507
  */
4283
- initialFocus: _angular_core.InputSignal<string>;
4284
- defaultCloseButton: _angular_core.InputSignal<boolean>;
4508
+ initialFocus: _angular_core.InputSignal<string | undefined>;
4509
+ defaultCloseButton: _angular_core.InputSignal<boolean | undefined>;
4285
4510
  /** Id referenced by aria-labelledby; DialogHeader attaches it to the title. */
4286
4511
  readonly titleId: string;
4287
4512
  readonly hasTitle: _angular_core.WritableSignal<boolean>;
4288
4513
  /** Emits true once opened and false once the closing animation finishes. */
4289
4514
  showing: _angular_core.OutputEmitterRef<boolean>;
4515
+ protected readonly headerTemplate: _angular_core.Signal<TemplateRef<unknown>>;
4516
+ protected readonly bodyTemplate: _angular_core.Signal<TemplateRef<unknown>>;
4517
+ protected readonly footerTemplate: _angular_core.Signal<TemplateRef<unknown>>;
4290
4518
  constructor();
4291
4519
  private get _dialog();
4520
+ /**
4521
+ * One timing for the whole move, panel and scrim together — the same `panel`
4522
+ * token the drawer's slide reads, so the two surfaces no longer disagree
4523
+ * about how long arriving takes.
4524
+ */
4525
+ private readonly motion;
4526
+ /** The gap the surface keeps from the viewport edge before its body scrolls. */
4527
+ private readonly inset;
4292
4528
  protected readonly className: _angular_core.Signal<string>;
4529
+ /** The only scrolling row, and the only one `bodyPadding` touches. */
4530
+ protected readonly bodyClass: _angular_core.Signal<string>;
4293
4531
  protected backdropClick(event: Event): void;
4294
4532
  /**
4295
4533
  * Escape fires the native 'cancel' event, which would close the dialog
@@ -4298,13 +4536,19 @@ declare class UniDialogComponent extends BaseComponent<UniDialogOptions> {
4298
4536
  */
4299
4537
  protected escapeCancel(event: Event): void;
4300
4538
  protected closingAnimation(e: AnimationEvent): void;
4539
+ /**
4540
+ * Doubled selector (`.css-x.css-x`) so these win over the icon button's own
4541
+ * class, which sets `position: relative` and is emitted after this one.
4542
+ * Without it the close never leaves the flow — it used to sit inline at the
4543
+ * top of the surface, and under the flex column it would take a whole row.
4544
+ */
4301
4545
  closeButton: string;
4302
4546
  private dialogFadeIn;
4303
4547
  private dialogFadeOut;
4304
4548
  open(): void;
4305
4549
  close(): void;
4306
4550
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniDialogComponent, never>;
4307
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniDialogComponent, "dialog[uni-dialog]", never, { "show": { "alias": "show"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "initialFocus": { "alias": "initialFocus"; "required": false; "isSignal": true; }; "defaultCloseButton": { "alias": "defaultCloseButton"; "required": false; "isSignal": true; }; }, { "show": "showChange"; "showing": "showing"; }, never, ["*"], true, never>;
4551
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniDialogComponent, "dialog[uni-dialog]", never, { "show": { "alias": "show"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "initialFocus": { "alias": "initialFocus"; "required": false; "isSignal": true; }; "defaultCloseButton": { "alias": "defaultCloseButton"; "required": false; "isSignal": true; }; }, { "show": "showChange"; "showing": "showing"; }, never, ["[uni-dialog-header], [dialog-header]", "[uni-dialog-buttons], [dialog-buttons]", "*"], true, never>;
4308
4552
  }
4309
4553
 
4310
4554
  declare class UniDividerComponent {
@@ -4351,13 +4595,13 @@ interface UniDrawerButtonsOptions {
4351
4595
  */
4352
4596
  declare class UniDrawerButtonsComponent extends BaseComponent<UniDrawerButtonsOptions> {
4353
4597
  private readonly drawer;
4354
- confirmButtonText: _angular_core.InputSignal<string>;
4355
- confirmButtonVariant: _angular_core.InputSignal<keyof _uni_design_system_uni_core.UniVariantRegistry>;
4356
- cancelButtonText: _angular_core.InputSignal<string>;
4357
- cancelButtonVariant: _angular_core.InputSignal<keyof _uni_design_system_uni_core.UniVariantRegistry>;
4358
- disableConfirm: _angular_core.InputSignal<boolean>;
4359
- padding: _angular_core.InputSignal<NullableSize>;
4360
- justifyContent: _angular_core.InputSignal<JustifyContent>;
4598
+ confirmButtonText: _angular_core.InputSignal<string | undefined>;
4599
+ confirmButtonVariant: _angular_core.InputSignal<keyof _uni_design_system_uni_core.UniVariantRegistry | undefined>;
4600
+ cancelButtonText: _angular_core.InputSignal<string | undefined>;
4601
+ cancelButtonVariant: _angular_core.InputSignal<keyof _uni_design_system_uni_core.UniVariantRegistry | undefined>;
4602
+ disableConfirm: _angular_core.InputSignal<boolean | undefined>;
4603
+ padding: _angular_core.InputSignal<NullableSize | undefined>;
4604
+ justifyContent: _angular_core.InputSignal<JustifyContent | undefined>;
4361
4605
  confirmed: _angular_core.OutputEmitterRef<void>;
4362
4606
  protected confirmVariant: _angular_core.Signal<keyof _uni_design_system_uni_core.UniVariantRegistry>;
4363
4607
  protected cancelVariant: _angular_core.Signal<keyof _uni_design_system_uni_core.UniVariantRegistry>;
@@ -4396,7 +4640,6 @@ interface UniDrawerHeaderOptions {
4396
4640
  /** Rule separating the header from the scrolling body, as a border primitive. */
4397
4641
  divider?: Border;
4398
4642
  closeButtonIcon?: IconName;
4399
- closeButtonSymbol?: string;
4400
4643
  closeButtonSize?: Size;
4401
4644
  }
4402
4645
 
@@ -4411,9 +4654,9 @@ interface UniDrawerHeaderOptions {
4411
4654
  declare class UniDrawerHeaderComponent extends BaseComponent<UniDrawerHeaderOptions> {
4412
4655
  private readonly drawer;
4413
4656
  /** Title text. Falls back to the drawer's `headline`; projected content wins over both. */
4414
- headline: _angular_core.InputSignal<string>;
4657
+ headline: _angular_core.InputSignal<string | undefined>;
4415
4658
  /** Attached to the title so the drawer is labelled by it. */
4416
- protected readonly titleId: string;
4659
+ protected readonly titleId: string | null;
4417
4660
  protected readonly title: _angular_core.Signal<string>;
4418
4661
  protected readonly showClose: _angular_core.Signal<boolean>;
4419
4662
  constructor();
@@ -4472,8 +4715,12 @@ interface UniDrawerOptions {
4472
4715
  * unpadded so that header and footer rows can pin flush to its edges.
4473
4716
  */
4474
4717
  padding?: OptionalSize;
4475
- /** Backdrop styling for the overlay mode. Ignored when `scrim` is false. */
4476
- backdrop?: StyleExpression;
4718
+ /**
4719
+ * Name of a `backdrops` primitive — the wash laid over the page behind the
4720
+ * overlay. The same token the dialog points at, so one theme entry dresses
4721
+ * both. A raw style object is still accepted. Ignored when `scrim` is false.
4722
+ */
4723
+ backdrop?: Backdrop | StyleExpression;
4477
4724
  /**
4478
4725
  * Whether the overlay mode dims the page behind it. False leaves
4479
4726
  * `::backdrop` transparent — the drawer still traps focus and is still
@@ -4482,6 +4729,12 @@ interface UniDrawerOptions {
4482
4729
  scrim?: boolean;
4483
4730
  /** Surface treatment of the panel. */
4484
4731
  background?: DrawerBackground;
4732
+ /**
4733
+ * Timing for everything the panel does: the overlay's slide, its scrim's
4734
+ * fade, and the side panel's width transition. One token for all three, so
4735
+ * the scrim can never drift out of step with the panel it dims.
4736
+ */
4737
+ motion?: Motion;
4485
4738
  }
4486
4739
 
4487
4740
  /**
@@ -4519,17 +4772,17 @@ declare class UniDrawerComponent extends BaseComponent<UniDrawerOptions> {
4519
4772
  * is not, and a wrong accessible name is worse than a missing one — the
4520
4773
  * missing one is at least caught by any audit.
4521
4774
  */
4522
- ariaLabel: _angular_core.InputSignal<string>;
4775
+ ariaLabel: _angular_core.InputSignal<string | undefined>;
4523
4776
  /**
4524
4777
  * Title for the drawer's header row. Shorthand for projecting a
4525
4778
  * `[uni-drawer-header]`; project one instead when the header needs more
4526
4779
  * than a title (a record counter, prev/next navigation).
4527
4780
  */
4528
- headline: _angular_core.InputSignal<string>;
4781
+ headline: _angular_core.InputSignal<string | undefined>;
4529
4782
  /** Whether the header row renders a close button. */
4530
4783
  defaultCloseButton: _angular_core.InputSignal<boolean>;
4531
4784
  /** Panel width in px, overriding the theme's `drawer.behavior.width`. */
4532
- width: _angular_core.InputSignal<number>;
4785
+ width: _angular_core.InputSignal<number | undefined>;
4533
4786
  /**
4534
4787
  * Whether the overlay dims the page behind it, overriding the theme's
4535
4788
  * `drawer.behavior.scrim`. False leaves the backdrop transparent so the page
@@ -4539,13 +4792,13 @@ declare class UniDrawerComponent extends BaseComponent<UniDrawerOptions> {
4539
4792
  * This does not make the drawer non-modal: focus is still trapped and the
4540
4793
  * page behind is still inert. It is a visibility choice, not a modality one.
4541
4794
  */
4542
- scrim: _angular_core.InputSignal<boolean>;
4795
+ scrim: _angular_core.InputSignal<boolean | undefined>;
4543
4796
  /**
4544
4797
  * CSS selector for the element to focus when the overlay opens. The native
4545
4798
  * default is the first focusable element, which in an editor panel is
4546
4799
  * usually the close button rather than the first field.
4547
4800
  */
4548
- initialFocus: _angular_core.InputSignal<string>;
4801
+ initialFocus: _angular_core.InputSignal<string | undefined>;
4549
4802
  /**
4550
4803
  * The drawer is *asking* to close — Escape, the backdrop, or a close/cancel
4551
4804
  * button. Pair with `disableAutoClose` to hold the panel open while an async
@@ -4562,7 +4815,7 @@ declare class UniDrawerComponent extends BaseComponent<UniDrawerOptions> {
4562
4815
  readonly hasHeader: _angular_core.WritableSignal<boolean>;
4563
4816
  /** Id referenced by aria-labelledby; the header row attaches it to its title. */
4564
4817
  readonly titleId: string;
4565
- protected readonly labelledBy: _angular_core.Signal<string>;
4818
+ protected readonly labelledBy: _angular_core.Signal<string | null>;
4566
4819
  protected readonly headerTemplate: _angular_core.Signal<TemplateRef<unknown>>;
4567
4820
  protected readonly bodyTemplate: _angular_core.Signal<TemplateRef<unknown>>;
4568
4821
  protected readonly footerTemplate: _angular_core.Signal<TemplateRef<unknown>>;
@@ -4581,6 +4834,15 @@ declare class UniDrawerComponent extends BaseComponent<UniDrawerOptions> {
4581
4834
  private readonly edge;
4582
4835
  private readonly slideIn;
4583
4836
  private readonly slideOut;
4837
+ /** The scrim's own fade, so the dimming arrives and leaves with the panel. */
4838
+ private readonly scrimIn;
4839
+ private readonly scrimOut;
4840
+ /**
4841
+ * One timing for everything the panel does. The scrim used to snap in and
4842
+ * out around a panel that took 250ms to slide, because `::backdrop` had a
4843
+ * background and no animation at all.
4844
+ */
4845
+ private readonly motion;
4584
4846
  /** Input wins over the theme option; the literal is the last-resort default. */
4585
4847
  private readonly panelWidth;
4586
4848
  private readonly showScrim;
@@ -4623,16 +4885,16 @@ declare class UniDropdownComponent extends BaseComponent<UniDropdownOptions> imp
4623
4885
  * contains (e.g. 'menu' for Menu, 'dialog' for rich content). When unset,
4624
4886
  * only aria-expanded/aria-controls are managed.
4625
4887
  */
4626
- ariaHasPopup: _angular_core.InputSignal<AriaHasPopup>;
4888
+ ariaHasPopup: _angular_core.InputSignal<AriaHasPopup | null>;
4627
4889
  /** Document-unique id of the popover element, for aria-controls wiring. */
4628
4890
  readonly popoverId: string;
4629
- paddingVertical: _angular_core.InputSignal<NullableSize>;
4630
- paddingHorizontal: _angular_core.InputSignal<NullableSize>;
4631
- border: _angular_core.InputSignal<string>;
4632
- borderRadius: _angular_core.InputSignal<string>;
4633
- shadow: _angular_core.InputSignal<string>;
4891
+ paddingVertical: _angular_core.InputSignal<NullableSize | undefined>;
4892
+ paddingHorizontal: _angular_core.InputSignal<NullableSize | undefined>;
4893
+ border: _angular_core.InputSignal<string | undefined>;
4894
+ borderRadius: _angular_core.InputSignal<string | undefined>;
4895
+ shadow: _angular_core.InputSignal<string | undefined>;
4634
4896
  /** A container color pair; `color` belongs to `uni-text` across the library. */
4635
- containerColor: _angular_core.InputSignal<ContainerColorToken>;
4897
+ containerColor: _angular_core.InputSignal<ContainerColorToken | undefined>;
4636
4898
  dropdownShowing: _angular_core.OutputEmitterRef<boolean>;
4637
4899
  dropdownHiding: _angular_core.OutputEmitterRef<boolean>;
4638
4900
  dropdownRef: ElementRef<HTMLDivElement>;
@@ -4679,7 +4941,7 @@ declare class UniExpandComponent extends BaseComponent<UniExpandOptions> {
4679
4941
  * duration derives from the `expand` theme options' `transitionSpeed`
4680
4942
  * scaled by content height (see `duration`).
4681
4943
  */
4682
- transitionSpeed: _angular_core.InputSignal<number>;
4944
+ transitionSpeed: _angular_core.InputSignal<number | undefined>;
4683
4945
  /** Referenced by the controlling toggle's aria-controls. */
4684
4946
  readonly regionId: string;
4685
4947
  /**
@@ -4762,17 +5024,17 @@ declare class UniExpandComponent extends BaseComponent<UniExpandOptions> {
4762
5024
  declare class UniExpandToggleComponent {
4763
5025
  collapsed: _angular_core.ModelSignal<boolean>;
4764
5026
  /** Id of the Expand region this toggle controls (see UniExpandComponent.regionId). */
4765
- ariaControls: _angular_core.InputSignal<string>;
5027
+ ariaControls: _angular_core.InputSignal<string | undefined>;
4766
5028
  /** Names the region. Setting it switches the toggle to its labelled shape. */
4767
- label: _angular_core.InputSignal<string>;
5029
+ label: _angular_core.InputSignal<string | undefined>;
4768
5030
  /** Muted qualifier beside the label ("for POs & custom orders"). Needs `label`. */
4769
- sublabel: _angular_core.InputSignal<string>;
5031
+ sublabel: _angular_core.InputSignal<string | undefined>;
4770
5032
  /**
4771
5033
  * Rotation duration in seconds. Expand Area binds the region's resolved
4772
5034
  * `duration` here so chevron and reveal share one clock even when the
4773
5035
  * region is size-scaled or overridden per instance.
4774
5036
  */
4775
- transitionSpeed: _angular_core.InputSignal<number>;
5037
+ transitionSpeed: _angular_core.InputSignal<number | undefined>;
4776
5038
  /** Fallback clock when no `transitionSpeed` is bound: the `expand` entry's
4777
5039
  motion token — the same one the region itself reads. */
4778
5040
  private readonly themeService;
@@ -4808,22 +5070,22 @@ declare class UniExpandAreaComponent {
4808
5070
  }
4809
5071
 
4810
5072
  declare class UniFileDropZoneComponent {
4811
- selectedFile: _angular_core.WritableSignal<File>;
4812
- selectedFileName: _angular_core.Signal<string>;
4813
- attachmentState: _angular_core.WritableSignal<"upload">;
5073
+ selectedFile: _angular_core.WritableSignal<File | undefined>;
5074
+ selectedFileName: _angular_core.Signal<string | undefined>;
5075
+ attachmentState: _angular_core.WritableSignal<"upload" | undefined>;
4814
5076
  fileSelectorRef: _angular_core.Signal<ElementRef<HTMLInputElement>>;
4815
5077
  get fileSelectorElement(): HTMLInputElement;
4816
- height: _angular_core.InputSignal<string | number>;
5078
+ height: _angular_core.InputSignal<string | number | undefined>;
4817
5079
  borderRadius: _angular_core.InputSignal<string>;
4818
5080
  border: _angular_core.InputSignal<keyof _uni_design_system_uni_core.UniVariantRegistry>;
4819
5081
  padding: _angular_core.InputSignal<NullableSize>;
4820
5082
  useBrowseButton: _angular_core.InputSignal<boolean>;
4821
5083
  browseButtonText: _angular_core.InputSignal<string>;
4822
5084
  allowedFileExtensions: _angular_core.InputSignal<string[]>;
4823
- label: _angular_core.InputSignal<string>;
4824
- helpTemplate: _angular_core.InputSignal<TemplateRef<unknown>>;
5085
+ label: _angular_core.InputSignal<string | undefined>;
5086
+ helpTemplate: _angular_core.InputSignal<TemplateRef<unknown> | null>;
4825
5087
  helpTemplateContext: _angular_core.InputSignal<unknown>;
4826
- fileAttached: _angular_core.OutputEmitterRef<File>;
5088
+ fileAttached: _angular_core.OutputEmitterRef<File | undefined>;
4827
5089
  fileRemoved: _angular_core.OutputEmitterRef<void>;
4828
5090
  /**
4829
5091
  * The zone acts as the keyboard-reachable file picker only when no browse
@@ -4939,7 +5201,7 @@ declare const listboxPopupStyles: (theme: ThemeService, options: UniListboxPopup
4939
5201
 
4940
5202
  declare class UniIconComponent {
4941
5203
  private themeService;
4942
- color: _angular_core.InputSignal<string>;
5204
+ color: _angular_core.InputSignal<string | undefined>;
4943
5205
  name: _angular_core.InputSignal<IconName>;
4944
5206
  /**
4945
5207
  * Explicit square size. Bare numbers are px; strings pass through, so any CSS
@@ -4950,11 +5212,11 @@ declare class UniIconComponent {
4950
5212
  * padding. Set it at call sites that would otherwise need a width/height
4951
5213
  * rule just to size one icon.
4952
5214
  */
4953
- size: _angular_core.InputSignal<CssLength>;
5215
+ size: _angular_core.InputSignal<CssLength | undefined>;
4954
5216
  /** Resolved from the theme's icon primitives; unknown names render nothing. */
4955
5217
  protected readonly path: _angular_core.Signal<string>;
4956
5218
  /** `null` leaves the styles off entirely, falling back to the stylesheet. */
4957
- protected readonly sizeValue: _angular_core.Signal<string>;
5219
+ protected readonly sizeValue: _angular_core.Signal<string | null>;
4958
5220
  protected readonly className: _angular_core.Signal<string>;
4959
5221
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniIconComponent, never>;
4960
5222
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniIconComponent, "uni-icon", never, { "color": { "alias": "color"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": true; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
@@ -4973,19 +5235,20 @@ declare class UniIconButtonComponent {
4973
5235
  private theme;
4974
5236
  config: _angular_core.Signal<_uni_design_system_uni_core.ComponentTheme<{
4975
5237
  borderRadius?: RadiiSize;
5238
+ motion?: Motion;
4976
5239
  }, UniIconButtonVariant>>;
4977
5240
  /**
4978
5241
  * Accessible name for the button. Alternative to projecting text content
4979
5242
  * (`<button icon-button>Close</button>`); one of the two is required for
4980
5243
  * an icon-only button to be announced correctly.
4981
5244
  */
4982
- ariaLabel: _angular_core.InputSignal<string>;
4983
- iconName: _angular_core.InputSignal<IconName>;
4984
- symbolName: _angular_core.InputSignal<string>;
5245
+ ariaLabel: _angular_core.InputSignal<string | undefined>;
5246
+ iconName: _angular_core.InputSignal<IconName | undefined>;
5247
+ symbolName: _angular_core.InputSignal<string | undefined>;
4985
5248
  variant: _angular_core.InputSignal<keyof _uni_design_system_uni_core.UniVariantRegistry>;
4986
5249
  size: _angular_core.InputSignal<Size>;
4987
- disable: _angular_core.InputSignal<boolean>;
4988
- loading: _angular_core.InputSignal<boolean>;
5250
+ disable: _angular_core.InputSignal<boolean | undefined>;
5251
+ loading: _angular_core.InputSignal<boolean | undefined>;
4989
5252
  opticalSize: _angular_core.InputSignal<number>;
4990
5253
  protected readonly srOnlyClass: string;
4991
5254
  /**
@@ -4996,7 +5259,9 @@ declare class UniIconButtonComponent {
4996
5259
  * Themes that do use padding (Carbon) set a matching `fontSize`, so they land
4997
5260
  * on the same glyph either way.
4998
5261
  */
4999
- protected readonly glyphSize: _angular_core.Signal<string | number>;
5262
+ protected readonly glyphSize: _angular_core.Signal<string | number | undefined>;
5263
+ /** Resolved from the component's `motion` option; `control` by default. */
5264
+ private readonly motion;
5000
5265
  protected readonly className: _angular_core.Signal<string>;
5001
5266
  /**
5002
5267
  * The focus ring's colour, from the variant's theme entry — never from the
@@ -5009,6 +5274,81 @@ declare class UniIconButtonComponent {
5009
5274
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniIconButtonComponent, "button[uni-icon-button], button[icon-button]", never, { "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "iconName": { "alias": "iconName"; "required": false; "isSignal": true; }; "symbolName": { "alias": "symbolName"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "disable": { "alias": "disable"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "opticalSize": { "alias": "opticalSize"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, [{ directive: typeof RippleDirective; inputs: {}; outputs: {}; }]>;
5010
5275
  }
5011
5276
 
5277
+ /**
5278
+ * Theme options for `uni-inline-button` — the `inlineButton` theme entry.
5279
+ *
5280
+ * The control exists because the alternatives distort a sentence: a `ghost`
5281
+ * button brings padding and a hit area that push the surrounding words apart,
5282
+ * and a bare `<a>` gives navigation semantics to something that only acts.
5283
+ */
5284
+ interface UniInlineButtonOptions {
5285
+ /** Ink when `link` is set. Defaults to `primary`. */
5286
+ linkColor?: ColorKey;
5287
+ /** Underline by default, so a theme can make every inline button read as a link. */
5288
+ underline?: boolean;
5289
+ /** Underline on hover even when `underline` is off. Defaults to true. */
5290
+ underlineOnHover?: boolean;
5291
+ /** Distance from the text baseline to the underline. Defaults to `0.15em`. */
5292
+ underlineOffset?: string;
5293
+ /** Space between the glyph and the label, as a spacing token. Defaults to `xxs`. */
5294
+ gap?: NullableSize;
5295
+ /** Focus ring colour. Defaults to the shared focus ring. */
5296
+ focusColor?: ColorKey;
5297
+ }
5298
+
5299
+ /**
5300
+ * A button that lives inside a sentence.
5301
+ *
5302
+ * Every other button in the library owns a box. Even `ghost` is a flex box
5303
+ * with a hit area, horizontal padding and a type scale of its own, so dropping
5304
+ * one into a sentence takes it out of the run of text entirely. This one
5305
+ * inherits that type — family, size, weight, line height and colour — and adds
5306
+ * no padding, so a paragraph reads as one continuous run with an action in the
5307
+ * middle of it.
5308
+ *
5309
+ * It is always a real `<button>`: it can *look* like a link (`underline`,
5310
+ * `link`) without claiming to be navigation, so Enter and Space activate it
5311
+ * and assistive tech announces a button rather than an unfollowable link.
5312
+ *
5313
+ * A glyph may sit alongside the label without disturbing that: it is sized in
5314
+ * `em`, so it scales with the type it lands in rather than pinning a px size
5315
+ * into someone else's paragraph.
5316
+ *
5317
+ * One limit comes from the element itself. Browsers blockify a `<button>` to
5318
+ * `inline-block` whatever `display` it asks for, so the control is an atomic
5319
+ * inline box: its own label wraps inside it, but the run cannot split across a
5320
+ * line break the way the words around it do. `display: contents` would buy
5321
+ * that at the cost of the button being focusable at all, which is not a trade
5322
+ * worth making — keep labels to a few words, which is what an inline action
5323
+ * wants anyway.
5324
+ */
5325
+ declare class UniInlineButtonComponent extends BaseComponent<UniInlineButtonOptions> {
5326
+ /** Theme icon token rendered beside the label. Prefer this over `symbolName`. */
5327
+ readonly iconName: _angular_core.InputSignal<IconName | undefined>;
5328
+ /** Material Symbols ligature, for glyphs the theme's icon set doesn't carry. */
5329
+ readonly symbolName: _angular_core.InputSignal<string | undefined>;
5330
+ /** Which side of the label the glyph sits on. */
5331
+ readonly iconPosition: _angular_core.InputSignal<"start" | "end">;
5332
+ /** Underline the label, overriding the theme's default. */
5333
+ readonly underline: _angular_core.InputSignalWithTransform<boolean | undefined, unknown>;
5334
+ /** Paint the label with the theme's link colour instead of inheriting the ink. */
5335
+ readonly link: _angular_core.InputSignalWithTransform<boolean, unknown>;
5336
+ readonly disable: _angular_core.InputSignalWithTransform<boolean, unknown>;
5337
+ protected readonly glyphAtStart: _angular_core.Signal<boolean>;
5338
+ /**
5339
+ * `1em` rather than a px size: the control inherits the surrounding type, so
5340
+ * the glyph has to scale with it or it will look wrong in every context but
5341
+ * the one it was measured in.
5342
+ */
5343
+ protected readonly glyphSize: _angular_core.Signal<string>;
5344
+ private readonly showUnderline;
5345
+ protected readonly className: _angular_core.Signal<string>;
5346
+ protected readonly labelClass: _angular_core.Signal<string>;
5347
+ protected readonly glyphClass: _angular_core.Signal<string>;
5348
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniInlineButtonComponent, never>;
5349
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniInlineButtonComponent, "button[uni-inline-button], button[inline-button]", never, { "iconName": { "alias": "iconName"; "required": false; "isSignal": true; }; "symbolName": { "alias": "symbolName"; "required": false; "isSignal": true; }; "iconPosition": { "alias": "iconPosition"; "required": false; "isSignal": true; }; "underline": { "alias": "underline"; "required": false; "isSignal": true; }; "link": { "alias": "link"; "required": false; "isSignal": true; }; "disable": { "alias": "disable"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
5350
+ }
5351
+
5012
5352
  declare class UniJsonViewComponent {
5013
5353
  json: _angular_core.InputSignal<unknown>;
5014
5354
  rows: _angular_core.InputSignal<number>;
@@ -5058,7 +5398,7 @@ interface UniMenuItemOptions {
5058
5398
  textColor?: ColorKey;
5059
5399
  hoverColor?: ContainerColorToken;
5060
5400
  /** Trailing symbol marking the active item; undefined/'' renders none. */
5061
- activeSymbol?: string;
5401
+ activeIcon?: IconName;
5062
5402
  /** Named motion primitive for the hover/focus fill. Defaults to `control`;
5063
5403
  omit both this and `transitionSpeed` for no transition at all. */
5064
5404
  motion?: Motion;
@@ -5087,7 +5427,7 @@ interface UniMenuOptions {
5087
5427
  declare class UniMenuComponent {
5088
5428
  private theme;
5089
5429
  menuItems: _angular_core.InputSignal<MenuItem[]>;
5090
- activeItem: _angular_core.InputSignal<MenuItem>;
5430
+ activeItem: _angular_core.InputSignal<MenuItem | undefined>;
5091
5431
  placement: _angular_core.InputSignal<Placement>;
5092
5432
  menuItemClicked: _angular_core.OutputEmitterRef<MenuItem>;
5093
5433
  TriggerClassName: string;
@@ -5120,17 +5460,17 @@ interface UniNotificationBadgeOptions {
5120
5460
  }
5121
5461
 
5122
5462
  declare class UniNotificationBadgeComponent extends BaseComponent<UniNotificationBadgeOptions> {
5123
- count: _angular_core.InputSignal<number>;
5463
+ count: _angular_core.InputSignal<number | undefined>;
5124
5464
  maxCount: _angular_core.InputSignal<number>;
5125
5465
  badgeVariant: _angular_core.InputSignal<"dot" | "count" | "pill">;
5126
- color: _angular_core.InputSignal<keyof _uni_design_system_uni_core.UniVariantRegistry>;
5466
+ color: _angular_core.InputSignal<keyof _uni_design_system_uni_core.UniVariantRegistry | undefined>;
5127
5467
  position: _angular_core.InputSignal<"top-right" | "top-left" | "bottom-right" | "bottom-left">;
5128
5468
  show: _angular_core.InputSignal<boolean>;
5129
5469
  /**
5130
5470
  * Screen-reader text for the badge (e.g. "5 unread messages"). Without it
5131
5471
  * a sensible default is announced; a bare number or dot carries no meaning.
5132
5472
  */
5133
- ariaLabel: _angular_core.InputSignal<string>;
5473
+ ariaLabel: _angular_core.InputSignal<string | undefined>;
5134
5474
  protected readonly srOnlyClass: string;
5135
5475
  protected readonly announcement: _angular_core.Signal<string>;
5136
5476
  displayValue: _angular_core.Signal<string>;
@@ -5151,9 +5491,9 @@ interface UniAlertOptions {
5151
5491
  }
5152
5492
 
5153
5493
  declare class UniAlertComponent extends BaseComponent<UniAlertOptions> implements AfterViewInit {
5154
- show: _angular_core.ModelSignal<boolean>;
5155
- iconName: _angular_core.InputSignal<IconName>;
5156
- symbolName: _angular_core.InputSignal<string>;
5494
+ show: _angular_core.ModelSignal<boolean | undefined>;
5495
+ iconName: _angular_core.InputSignal<IconName | undefined>;
5496
+ symbolName: _angular_core.InputSignal<string | undefined>;
5157
5497
  useVariant: _angular_core.InputSignal<boolean>;
5158
5498
  showing: _angular_core.OutputEmitterRef<boolean>;
5159
5499
  alertRef?: ElementRef<HTMLDialogElement>;
@@ -5167,14 +5507,14 @@ declare class UniAlertComponent extends BaseComponent<UniAlertOptions> implement
5167
5507
  ngAfterViewInit(): void;
5168
5508
  open(): void;
5169
5509
  close(): void;
5170
- protected readonly effectiveIconName: _angular_core.Signal<IconName>;
5510
+ protected readonly effectiveIconName: _angular_core.Signal<IconName | undefined>;
5171
5511
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniAlertComponent, never>;
5172
5512
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniAlertComponent, "uni-alert", never, { "show": { "alias": "show"; "required": false; "isSignal": true; }; "iconName": { "alias": "iconName"; "required": false; "isSignal": true; }; "symbolName": { "alias": "symbolName"; "required": false; "isSignal": true; }; "useVariant": { "alias": "useVariant"; "required": false; "isSignal": true; }; }, { "show": "showChange"; "showing": "showing"; }, never, ["*"], true, never>;
5173
5513
  }
5174
5514
 
5175
5515
  declare class ConfirmationDialogComponent {
5176
5516
  show: _angular_core.InputSignal<boolean>;
5177
- confirmation: _angular_core.InputSignal<Confirmation>;
5517
+ confirmation: _angular_core.InputSignal<Confirmation | undefined>;
5178
5518
  showing: _angular_core.OutputEmitterRef<boolean>;
5179
5519
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ConfirmationDialogComponent, never>;
5180
5520
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<ConfirmationDialogComponent, "uni-confirmation-dialog", never, { "show": { "alias": "show"; "required": false; "isSignal": true; }; "confirmation": { "alias": "confirmation"; "required": false; "isSignal": true; }; }, { "showing": "showing"; }, never, never, true, never>;
@@ -5188,9 +5528,9 @@ declare class NotificationsComponent {
5188
5528
  protected readonly showAlert: _angular_core.Signal<boolean>;
5189
5529
  protected readonly showSnackbar: _angular_core.Signal<boolean>;
5190
5530
  protected readonly showConfirmation: _angular_core.Signal<boolean>;
5191
- protected readonly alert: _angular_core.Signal<Alert>;
5192
- protected readonly snackbar: _angular_core.Signal<Snackbar>;
5193
- protected readonly confirmation: _angular_core.Signal<Confirmation>;
5531
+ protected readonly alert: _angular_core.Signal<Alert | undefined>;
5532
+ protected readonly snackbar: _angular_core.Signal<Snackbar | undefined>;
5533
+ protected readonly confirmation: _angular_core.Signal<Confirmation | undefined>;
5194
5534
  constructor();
5195
5535
  handleConfirmationShowingEvent(showing: boolean): void;
5196
5536
  handleSnackbarShowingEvent(showing: boolean): void;
@@ -5219,15 +5559,15 @@ declare class UniSnackbarComponent extends BaseComponent<UniSnackbarOptions> imp
5219
5559
  secondsRemaining: _angular_core.Signal<number>;
5220
5560
  };
5221
5561
  /** Two-way bindable open state: [(show)]. */
5222
- show: _angular_core.ModelSignal<boolean>;
5223
- iconName: _angular_core.InputSignal<IconName>;
5224
- symbolName: _angular_core.InputSignal<string>;
5225
- timeout: _angular_core.InputSignal<string | number>;
5226
- actionLabel: _angular_core.InputSignal<string>;
5562
+ show: _angular_core.ModelSignal<boolean | undefined>;
5563
+ iconName: _angular_core.InputSignal<IconName | undefined>;
5564
+ symbolName: _angular_core.InputSignal<string | undefined>;
5565
+ timeout: _angular_core.InputSignal<string | number | undefined>;
5566
+ actionLabel: _angular_core.InputSignal<string | undefined>;
5227
5567
  useVariant: _angular_core.InputSignal<boolean>;
5228
5568
  action: _angular_core.OutputEmitterRef<void>;
5229
5569
  showing: _angular_core.OutputEmitterRef<boolean>;
5230
- snackbarRef: _angular_core.Signal<ElementRef<any>>;
5570
+ snackbarRef: _angular_core.Signal<ElementRef<any> | undefined>;
5231
5571
  private get _snackbar();
5232
5572
  constructor();
5233
5573
  /** Timing for the enter/leave transition. */
@@ -5258,8 +5598,8 @@ interface UniPaginatorOptions {
5258
5598
  }
5259
5599
 
5260
5600
  declare class UniPaginatorComponent<T> extends BaseComponent<UniPaginatorOptions> {
5261
- datasource: _angular_core.InputSignal<UniDatasource<T>>;
5262
- initPageSize: _angular_core.InputSignal<number>;
5601
+ datasource: _angular_core.InputSignal<UniDatasource<T> | undefined>;
5602
+ initPageSize: _angular_core.InputSignal<number | undefined>;
5263
5603
  showPageSize: _angular_core.InputSignal<boolean>;
5264
5604
  showPageJumper: _angular_core.InputSignal<boolean>;
5265
5605
  showPageNumbers: _angular_core.InputSignal<boolean>;
@@ -5296,7 +5636,7 @@ interface UniPopoverOptions {
5296
5636
  offset: number;
5297
5637
  arrowSize: number;
5298
5638
  /** Icon primitive for the `closable` button. */
5299
- closeSymbol: IconName;
5639
+ closeIcon: IconName;
5300
5640
  /** Hover open delay in tooltip mode, ms. */
5301
5641
  tooltipOpenDelay: number;
5302
5642
  /** Pointer-leave close delay in tooltip mode, ms. */
@@ -5336,18 +5676,18 @@ declare class UniPopoverComponent extends BaseComponent<UniPopoverOptions> {
5336
5676
  * the panel opens) while the projected trigger keeps the disclosure ARIA.
5337
5677
  * Empty string means unset.
5338
5678
  */
5339
- anchor: _angular_core.InputSignal<string | HTMLElement>;
5679
+ anchor: _angular_core.InputSignal<string | HTMLElement | undefined>;
5340
5680
  /** Title rendered in the header row and used as the accessible name. */
5341
- header: _angular_core.InputSignal<string>;
5681
+ header: _angular_core.InputSignal<string | undefined>;
5342
5682
  /** Renders a "Close" icon button in the header row. */
5343
5683
  closable: _angular_core.InputSignal<boolean>;
5344
5684
  arrow: _angular_core.InputSignal<boolean>;
5345
5685
  /** Panel max-width; numbers are px. Defaults to the theme's `maxWidth`. */
5346
- maxWidth: _angular_core.InputSignal<string | number>;
5686
+ maxWidth: _angular_core.InputSignal<string | number | undefined>;
5347
5687
  /** Tooltip-mode hover-open delay, ms; defaults to the theme option. */
5348
- openDelay: _angular_core.InputSignal<number>;
5688
+ openDelay: _angular_core.InputSignal<number | undefined>;
5349
5689
  /** Tooltip-mode pointer-leave close delay, ms; defaults to the theme option. */
5350
- closeDelay: _angular_core.InputSignal<number>;
5690
+ closeDelay: _angular_core.InputSignal<number | undefined>;
5351
5691
  opened: _angular_core.OutputEmitterRef<void>;
5352
5692
  closed: _angular_core.OutputEmitterRef<void>;
5353
5693
  readonly panelId: string;
@@ -5405,15 +5745,41 @@ declare class UniPopoverComponent extends BaseComponent<UniPopoverOptions> {
5405
5745
  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>;
5406
5746
  }
5407
5747
 
5748
+ /**
5749
+ * Theme options for `uni-progress-bar`. Declared in `ComponentName` with no
5750
+ * entry behind it until 11.0.0, so the bar picked its colours straight off the
5751
+ * palette and a theme had no way to re-point them.
5752
+ */
5753
+ interface UniProgressBarOptions {
5754
+ /** Unfilled track. Defaults to `primary-surface`. */
5755
+ trackColor?: ColorKey;
5756
+ /** Fill while in progress. Defaults to `secondary-surface`. */
5757
+ fillColor?: ColorKey;
5758
+ /** Fill once complete. Defaults to `secondary`. */
5759
+ completeColor?: ColorKey;
5760
+ /** Outline on both track and fill. Defaults to `on-background-variant`. */
5761
+ borderColor?: ColorKey;
5762
+ /** Outline width in px. Defaults to 1. */
5763
+ strokeWidth?: number;
5764
+ }
5765
+
5408
5766
  declare class UniProgressBarComponent {
5409
5767
  theme: ThemeService;
5768
+ protected readonly componentOptions: _angular_core.WritableSignal<UniProgressBarOptions>;
5410
5769
  palette: _angular_core.Signal<Partial<Record<string, string>>>;
5770
+ /** Every paint the bar uses, resolved through the theme entry. */
5771
+ protected readonly paint: _angular_core.Signal<{
5772
+ track: string | undefined;
5773
+ fill: string | undefined;
5774
+ complete: string | undefined;
5775
+ border: string | undefined;
5776
+ }>;
5411
5777
  width: _angular_core.InputSignal<number>;
5412
5778
  height: _angular_core.InputSignal<number>;
5413
5779
  percent: _angular_core.InputSignal<number>;
5414
5780
  /** Accessible name describing what is progressing (e.g. "Upload progress"). */
5415
- ariaLabel: _angular_core.InputSignal<string>;
5416
- stroke: number;
5781
+ ariaLabel: _angular_core.InputSignal<string | undefined>;
5782
+ protected readonly stroke: _angular_core.Signal<number>;
5417
5783
  protected readonly className: _angular_core.Signal<string>;
5418
5784
  protected readonly Math: Math;
5419
5785
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniProgressBarComponent, never>;
@@ -5423,8 +5789,8 @@ declare class UniProgressBarComponent {
5423
5789
  declare class UniProgressGaugeComponent extends BaseComponent {
5424
5790
  percent: _angular_core.InputSignal<number>;
5425
5791
  /** Accessible name describing what is progressing. */
5426
- ariaLabel: _angular_core.InputSignal<string>;
5427
- textStyle: _angular_core.Signal<string | number | _uni_design_system_uni_core.StyleExpression>;
5792
+ ariaLabel: _angular_core.InputSignal<string | undefined>;
5793
+ textStyle: _angular_core.Signal<string | number | _uni_design_system_uni_core.StyleExpression | undefined>;
5428
5794
  private progress;
5429
5795
  protected readonly className: _angular_core.Signal<string>;
5430
5796
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniProgressGaugeComponent, never>;
@@ -5459,7 +5825,7 @@ declare class UniScrollAreaComponent {
5459
5825
  * elements with `uni-text`, which owns `color` and maps it to the CSS
5460
5826
  * property. One `color` binding feeding both would render ink on ink.
5461
5827
  */
5462
- containerColor: _angular_core.InputSignal<ContainerColorToken>;
5828
+ containerColor: _angular_core.InputSignal<ContainerColorToken | undefined>;
5463
5829
  borderRadius: _angular_core.InputSignal<string>;
5464
5830
  padding: _angular_core.InputSignal<OptionalSize>;
5465
5831
  paddingHorizontal: _angular_core.InputSignal<OptionalSize>;
@@ -5468,7 +5834,7 @@ declare class UniScrollAreaComponent {
5468
5834
  paddingRight: _angular_core.InputSignal<OptionalSize>;
5469
5835
  paddingTop: _angular_core.InputSignal<OptionalSize>;
5470
5836
  paddingBottom: _angular_core.InputSignal<OptionalSize>;
5471
- border: _angular_core.InputSignal<keyof _uni_design_system_uni_core.UniVariantRegistry>;
5837
+ border: _angular_core.InputSignal<keyof _uni_design_system_uni_core.UniVariantRegistry | undefined>;
5472
5838
  height: _angular_core.InputSignal<OptionalValue>;
5473
5839
  width: _angular_core.InputSignal<OptionalValue>;
5474
5840
  appearance: _angular_core.InputSignal<ScrollbarAppearance>;
@@ -5523,23 +5889,23 @@ interface UniSkeletonOptions {
5523
5889
  declare class UniSkeletonComponent extends BaseComponent<UniSkeletonOptions> {
5524
5890
  shape: _angular_core.InputSignal<SkeletonShape>;
5525
5891
  /** CSS width; defaults to 100% for text/rect and `height` for circles. */
5526
- width: _angular_core.InputSignal<string | number>;
5892
+ width: _angular_core.InputSignal<string | number | undefined>;
5527
5893
  /** CSS height per block; defaults to 1em (text), 96px (rect), 40px (circle). */
5528
- height: _angular_core.InputSignal<string | number>;
5894
+ height: _angular_core.InputSignal<string | number | undefined>;
5529
5895
  /** Number of text lines (text shape only). */
5530
5896
  lines: _angular_core.InputSignal<number>;
5531
5897
  /** Base color token; overrides the theme option for this skeleton. */
5532
- color: _angular_core.InputSignal<string>;
5898
+ color: _angular_core.InputSignal<string | undefined>;
5533
5899
  /** Shimmer highlight token; overrides the theme option for this skeleton. */
5534
- highlightColor: _angular_core.InputSignal<string>;
5900
+ highlightColor: _angular_core.InputSignal<string | undefined>;
5535
5901
  /** Radius token; overrides the theme option. Circles are always round. */
5536
- borderRadius: _angular_core.InputSignal<string>;
5902
+ borderRadius: _angular_core.InputSignal<string | undefined>;
5537
5903
  /**
5538
5904
  * Announces the skeleton to assistive tech as a polite status. Leave unset
5539
5905
  * when a container already carries `aria-busy` — the skeleton then stays
5540
5906
  * `aria-hidden`, as a decorative placeholder should.
5541
5907
  */
5542
- label: _angular_core.InputSignal<string>;
5908
+ label: _angular_core.InputSignal<string | undefined>;
5543
5909
  protected readonly srOnly: string;
5544
5910
  private readonly cssSize;
5545
5911
  protected readonly resolvedHeight: _angular_core.Signal<string>;
@@ -5594,13 +5960,13 @@ declare class UniStatComponent extends BaseComponent<UniStatOptions> {
5594
5960
  /** The headline number: strings render verbatim, numbers auto-compact. */
5595
5961
  value: _angular_core.InputSignal<string | number>;
5596
5962
  /** Signed change, e.g. "+12.4%" or "-0.4%". The sign drives the arrow. */
5597
- delta: _angular_core.InputSignal<string>;
5963
+ delta: _angular_core.InputSignal<string | undefined>;
5598
5964
  /** Whether an upward movement is good news. Flip for churn, errors, cost. */
5599
5965
  upIsGood: _angular_core.InputSignal<boolean>;
5600
5966
  /** Names the comparison period, e.g. "vs last month". */
5601
- caption: _angular_core.InputSignal<string>;
5967
+ caption: _angular_core.InputSignal<string | undefined>;
5602
5968
  /** Recent values for the decorative sparkline (12 points reads best). */
5603
- trend: _angular_core.InputSignal<number[]>;
5969
+ trend: _angular_core.InputSignal<number[] | undefined>;
5604
5970
  protected readonly srOnly: string;
5605
5971
  protected readonly displayValue: _angular_core.Signal<string>;
5606
5972
  protected readonly deltaIsUp: _angular_core.Signal<boolean>;
@@ -5612,7 +5978,7 @@ declare class UniStatComponent extends BaseComponent<UniStatOptions> {
5612
5978
  path: string;
5613
5979
  endX: string;
5614
5980
  endY: string;
5615
- }>;
5981
+ } | undefined>;
5616
5982
  protected readonly className: _angular_core.Signal<string>;
5617
5983
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniStatComponent, never>;
5618
5984
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniStatComponent, "uni-stat", never, { "label": { "alias": "label"; "required": true; "isSignal": true; }; "value": { "alias": "value"; "required": true; "isSignal": true; }; "delta": { "alias": "delta"; "required": false; "isSignal": true; }; "upIsGood": { "alias": "upIsGood"; "required": false; "isSignal": true; }; "caption": { "alias": "caption"; "required": false; "isSignal": true; }; "trend": { "alias": "trend"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
@@ -5640,6 +6006,8 @@ declare class UniTabComponent {
5640
6006
  * get pills (`borderRadius: 'max'` + `activeColor`) or any custom treatment.
5641
6007
  */
5642
6008
  interface UniTabsOptions {
6009
+ /** Named motion primitive for a tab's ink and indicator transition. Defaults to `snap`. */
6010
+ motion?: Motion;
5643
6011
  /** Tab label typography. */
5644
6012
  typeface?: Typeface;
5645
6013
  /** Inactive tab label color. */
@@ -5677,6 +6045,8 @@ declare class UniTabsComponent extends BaseComponent<UniTabsOptions> {
5677
6045
  protected readonly activeTab: _angular_core.Signal<UniTabComponent>;
5678
6046
  protected select(index: number): void;
5679
6047
  protected onKeydown(event: KeyboardEvent): void;
6048
+ /** Resolved from the component's `motion` option; `snap` by default. */
6049
+ private readonly motion;
5680
6050
  protected readonly tablistClass: _angular_core.Signal<string>;
5681
6051
  protected readonly tabClass: _angular_core.Signal<string>;
5682
6052
  protected readonly panelClass: _angular_core.Signal<string>;
@@ -5693,8 +6063,15 @@ interface UniTextareaOptions {
5693
6063
  }
5694
6064
 
5695
6065
  declare class UniSortHeaderComponent<T> {
5696
- column: _angular_core.InputSignal<keyof T>;
5697
- datasource: _angular_core.InputSignal<UniDatasource<T>>;
6066
+ private readonly theme;
6067
+ /**
6068
+ * The arrow answers a click, so it rides `control`. This component has no
6069
+ * theme entry of its own, so it names the token directly rather than
6070
+ * exposing an option that would have nowhere to live.
6071
+ */
6072
+ private readonly motion;
6073
+ column: _angular_core.InputSignal<keyof T | undefined>;
6074
+ datasource: _angular_core.InputSignal<UniDatasource<T> | undefined>;
5698
6075
  protected readonly buttonClass: string;
5699
6076
  direction: _angular_core.Signal<SortDirection>;
5700
6077
  protected readonly className: _angular_core.Signal<string>;
@@ -5716,10 +6093,10 @@ interface SymbolOptions {
5716
6093
 
5717
6094
  declare class UniSymbolComponent extends BaseComponent<SymbolOptions> {
5718
6095
  name: _angular_core.InputSignal<string>;
5719
- fill: _angular_core.InputSignal<SymbolFill>;
5720
- weight: _angular_core.InputSignal<SymbolWeight>;
5721
- grade: _angular_core.InputSignal<SymbolGrade>;
5722
- opticalSize: _angular_core.InputSignal<number>;
6096
+ fill: _angular_core.InputSignal<SymbolFill | undefined>;
6097
+ weight: _angular_core.InputSignal<SymbolWeight | undefined>;
6098
+ grade: _angular_core.InputSignal<SymbolGrade | undefined>;
6099
+ opticalSize: _angular_core.InputSignal<number | undefined>;
5723
6100
  protected readonly className: _angular_core.Signal<string>;
5724
6101
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniSymbolComponent, never>;
5725
6102
  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>;
@@ -5727,6 +6104,8 @@ declare class UniSymbolComponent extends BaseComponent<SymbolOptions> {
5727
6104
 
5728
6105
  /** Theme options for the `tag` component entry. */
5729
6106
  interface UniTagOptions {
6107
+ /** Named motion primitive for the fill and ink transition. Defaults to `control`. */
6108
+ motion?: Motion;
5730
6109
  borderRadius?: Radius;
5731
6110
  typeface?: Typeface;
5732
6111
  /** Space between the lead element, label and remove button. */
@@ -5754,17 +6133,17 @@ type UniTagValue = string | number | undefined;
5754
6133
  declare class UniTagComponent extends BaseComponent<UniTagOptions> {
5755
6134
  size: _angular_core.InputSignal<Size>;
5756
6135
  tone: _angular_core.InputSignal<TagTone>;
5757
- label: _angular_core.InputSignal<string>;
5758
- value: _angular_core.InputSignal<string | number>;
6136
+ label: _angular_core.InputSignal<string | undefined>;
6137
+ value: _angular_core.InputSignal<string | number | undefined>;
5759
6138
  /** Truncation budget, e.g. `'14ch'`. A number is treated as px. */
5760
- maxWidth: _angular_core.InputSignal<string | number>;
5761
- avatarSrc: _angular_core.InputSignal<string>;
6139
+ maxWidth: _angular_core.InputSignal<string | number | undefined>;
6140
+ avatarSrc: _angular_core.InputSignal<string | undefined>;
5762
6141
  /** Initials fallback when `avatarSrc` is absent or fails to load. */
5763
- avatarName: _angular_core.InputSignal<string>;
6142
+ avatarName: _angular_core.InputSignal<string | undefined>;
5764
6143
  /** Theme icon primitive — the preferred glyph path. */
5765
- iconName: _angular_core.InputSignal<IconName>;
6144
+ iconName: _angular_core.InputSignal<IconName | undefined>;
5766
6145
  /** Material Symbols ligature, for glyphs the theme's icon set doesn't carry. */
5767
- symbolName: _angular_core.InputSignal<string>;
6146
+ symbolName: _angular_core.InputSignal<string | undefined>;
5768
6147
  /** Status dot in the current colour. */
5769
6148
  dot: _angular_core.InputSignal<boolean>;
5770
6149
  removable: _angular_core.InputSignal<boolean>;
@@ -5775,11 +6154,11 @@ declare class UniTagComponent extends BaseComponent<UniTagOptions> {
5775
6154
  * focusable so it can be removed), and announcing "not pressed" on a
5776
6155
  * recipient chip is worse than announcing nothing.
5777
6156
  */
5778
- selected: _angular_core.InputSignal<boolean>;
6157
+ selected: _angular_core.InputSignal<boolean | undefined>;
5779
6158
  invalid: _angular_core.InputSignal<boolean>;
5780
6159
  disabled: _angular_core.InputSignal<boolean>;
5781
6160
  /** Accessible-name override for the remove button. */
5782
- removeLabel: _angular_core.InputSignal<string>;
6161
+ removeLabel: _angular_core.InputSignal<string | undefined>;
5783
6162
  /**
5784
6163
  * Tab position of the chip's controls. A composite that owns its own
5785
6164
  * roving focus — `uni-tag-input`, where the whole field is one tab stop —
@@ -5792,7 +6171,7 @@ declare class UniTagComponent extends BaseComponent<UniTagOptions> {
5792
6171
  /** A disabled chip wears the theme's `disabled` role, whatever its variant. */
5793
6172
  protected readonly resolvedVariant: _angular_core.Signal<keyof _uni_design_system_uni_core.UniVariantRegistry>;
5794
6173
  protected readonly themeStyle: _angular_core.Signal<{
5795
- [x: string]: string | number | _uni_design_system_uni_core.StyleExpression;
6174
+ [x: string]: string | number | _uni_design_system_uni_core.StyleExpression | undefined;
5796
6175
  }>;
5797
6176
  /** Lead elements derive from the chip height, so no second size token. */
5798
6177
  protected readonly leadSize: _angular_core.Signal<number>;
@@ -5839,8 +6218,8 @@ declare class UniThemeBuilderComponent {
5839
6218
  protected pinSecondary: _angular_core.WritableSignal<boolean>;
5840
6219
  protected secondaryHex: _angular_core.WritableSignal<string>;
5841
6220
  /** Soft brand targets carried by the active preset (cleared on seed edits). */
5842
- protected targets: _angular_core.WritableSignal<Partial<Record<_uni_design_system_uni_core.BrandRole, string>>>;
5843
- protected copied: _angular_core.WritableSignal<"file" | "ngadd" | "dtcg">;
6221
+ protected targets: _angular_core.WritableSignal<Partial<Record<_uni_design_system_uni_core.BrandRole, string>> | undefined>;
6222
+ protected copied: _angular_core.WritableSignal<"file" | "ngadd" | "dtcg" | null>;
5844
6223
  protected showAllPairs: _angular_core.WritableSignal<boolean>;
5845
6224
  constructor();
5846
6225
  protected config: _angular_core.Signal<BrandPaletteConfig>;
@@ -5904,13 +6283,15 @@ declare class UniThemeSwitchComponent {
5904
6283
  ariaLabel: _angular_core.InputSignal<string>;
5905
6284
  /** Emits the selected theme key after it has been applied. */
5906
6285
  themeChanged: _angular_core.OutputEmitterRef<string>;
5907
- protected selected: _angular_core.Signal<string>;
6286
+ protected selected: _angular_core.Signal<string | null>;
5908
6287
  protected select(themeName: ThemeName | null): void;
5909
6288
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniThemeSwitchComponent, never>;
5910
6289
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniThemeSwitchComponent, "uni-theme-switch", never, { "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "themeChanged": "themeChanged"; }, never, never, true, never>;
5911
6290
  }
5912
6291
 
5913
6292
  interface UniTooltipOptions {
6293
+ /** Named motion primitive for the fade in and out. Defaults to `notification`. */
6294
+ motion?: Motion;
5914
6295
  color?: ContainerColorToken;
5915
6296
  border?: Border;
5916
6297
  borderRadius?: Radius;
@@ -5956,6 +6337,8 @@ declare class UniTooltipComponent extends BaseComponent<UniTooltipOptions> {
5956
6337
  showTooltip(): void;
5957
6338
  hideTooltip(): void;
5958
6339
  protected onAnimationEnd(event: AnimationEvent): void;
6340
+ /** Resolved from the component's `motion` option; `notification` by default. */
6341
+ private readonly motion;
5959
6342
  protected readonly className: _angular_core.Signal<string>;
5960
6343
  private tooltipFadeIn;
5961
6344
  private tooltipFadeOut;
@@ -6008,7 +6391,7 @@ declare class UniTourComponent extends BaseComponent<UniTourOptions> {
6008
6391
  private destroyRef;
6009
6392
  steps: _angular_core.InputSignal<UniTourStep[]>;
6010
6393
  /** The presented step index, or null when the tour is not running. */
6011
- active: _angular_core.ModelSignal<number>;
6394
+ active: _angular_core.ModelSignal<number | null>;
6012
6395
  nextLabel: _angular_core.InputSignal<string>;
6013
6396
  backLabel: _angular_core.InputSignal<string>;
6014
6397
  skipLabel: _angular_core.InputSignal<string>;
@@ -6028,11 +6411,11 @@ declare class UniTourComponent extends BaseComponent<UniTourOptions> {
6028
6411
  /** Repeats must still be heard: the same gate message can come round
6029
6412
  again on a later step. */
6030
6413
  protected readonly announcer: _uni_design_system_uni_angular.Announcer;
6031
- protected readonly resolvedTarget: _angular_core.WritableSignal<HTMLElement>;
6414
+ protected readonly resolvedTarget: _angular_core.WritableSignal<HTMLElement | undefined>;
6032
6415
  private readonly presentedIndex;
6033
6416
  private gateCleanup;
6034
6417
  protected readonly index: _angular_core.Signal<number>;
6035
- protected readonly currentStep: _angular_core.Signal<UniTourStep>;
6418
+ protected readonly currentStep: _angular_core.Signal<UniTourStep | undefined>;
6036
6419
  protected readonly isLast: _angular_core.Signal<boolean>;
6037
6420
  protected readonly clickGate: _angular_core.Signal<boolean>;
6038
6421
  /** Gated steps force an interactive target — the gate needs the gesture. */
@@ -6082,5 +6465,6 @@ declare class DragAndDropDirective {
6082
6465
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<DragAndDropDirective, "[uni-drag-n-drop], [dragAndDrop]", never, {}, { "fileDropped": "fileDropped"; }, never, never, true, never>;
6083
6466
  }
6084
6467
 
6085
- export { BodyRenderDirective, ConfirmationDialogComponent, DRAWER_PANEL, DragAndDropDirective, FOCUSABLE_SELECTOR, ListboxNavigation, LocalStorageService, NotificationService, NotificationsComponent, RippleDirective, TRANSFORM_ORIGINS, ThemeService, UNI_FORMS, UNI_LAYOUT, UNI_THEMES, UniAlertComponent, UniAppBarComponent, UniAvatarComponent, UniAvatarGroupComponent, UniBackgroundComponent, UniBadgeComponent, UniBaseDatasource, UniBoxDirective, UniBreadcrumbComponent, UniButtonComponent, UniButtonGroupComponent, UniCalendarComponent, UniCalloutComponent, UniCardComponent, UniCardContentComponent, UniCardHeaderComponent, UniCenterDirective, UniCheckboxComponent, UniComboboxComponent, UniDataSearchComponent, UniDataTableComponent, UniDateInputComponent, UniDateTimeInputComponent, UniDebounceInputComponent, UniDialogButtonsComponent, UniDialogComponent, UniDialogHeaderComponent, UniDividerComponent, UniDrawerButtonsComponent, UniDrawerComponent, UniDrawerHeaderComponent, UniDropdownComponent, UniExpandAreaComponent, UniExpandComponent, UniExpandToggleComponent, UniFileDropZoneComponent, UniGridAreaDirective, UniGridDirective, UniIconButtonComponent, UniIconComponent, UniInputBoxComponent, UniInputComponent, UniJsonViewComponent, UniMenuComponent, UniMultiSelectComponent, UniMultiSelectDropdownComponent, UniNotificationBadgeComponent, UniNumberInputComponent, UniNumberRangeInputComponent, UniPaginatorComponent, UniPopoverComponent, UniProgressBarComponent, UniProgressGaugeComponent, UniQuantityStepperComponent, UniRadioComponent, UniRecordDatasource, UniRowDirective, UniScrollAreaComponent, UniSearchInputComponent, UniSelectComponent, UniServerSideDatasource, UniSkeletonComponent, UniSliderComponent, UniSnackbarComponent, UniSortHeaderComponent, UniStackDirective, UniStatComponent, UniSymbolComponent, UniTabComponent, UniTabsComponent, UniTagComponent, UniTagInputComponent, UniTextDirective, UniTextareaComponent, UniThemeBuilderComponent, UniThemeSwitchComponent, UniTimeInputComponent, UniToggleComponent, UniTooltipComponent, UniTourComponent, UniWrapDirective, acceptableFile, addDays, addMonths, anchorArrowStyles, anchorStyles, buildMonthGrid, clampDecimal, clearAnchorName, compareDecimal, createAnnouncer, createListboxNavigation, createPressRepeat, dayOfWeek, daysInMonth, decimalScale, discreteOverlayTransition, evaluateExpression, focusableElements, formatDate, formatMonthHeading, formatNumber, formatTime, fromScaled, getFileExtension, inclusiveDayCount, isCanonicalDecimal, isDivider, isToggleOpen, isValidDate, isoDate, joinDateTime, listboxPopupAttr, listboxPopupStyles, localeDatePlaceholder, localeDefaultHour12, localeFieldOrder, localeMonthNames, localeNumberParts, localeWeekStart, losesPrecision, monthOf, motionSafe, newAnchorName, newListboxAnchor, normalizeDecimal, parseDateText, parseNumber, parseTimeText, promoteListboxPopup, rawNumberText, resolveElement, resolveFocusTarget, resolveNumberFormat, restoreOverlayFocus, roundDecimal, setAnchorName, settleNumber, shiftDecimal, speakNumber, splitDateTime, spotlightStyles, stepDecimal, supportsAnchoredPopup, timeSlots, toAsciiDigits, toDecimal, toNumber, toScaled, todayIso, transformOriginFor, uniqueId, useTimer, visuallyHidden, weekdayNames };
6086
- export type { Alert, AnchorOffset, AnchorRect, Announcer, BrandPaletteConfig, BreadcrumbItem, ButtonGroupConfig, ButtonGroupItem, ColumnDefinition, Confirmation, DataLoader, DrawerBackground, DrawerCloseReason, DrawerMode, DrawerPosition, ImagePosition, ListboxNavigationConfig, MenuDivider, MenuItem, MenuItemWithLabel, MenuItemWithTemplate, Option, Options, PageRequest, PageResponse, Placement, PressRepeat, PressRepeatConfig, PressRepeatTiming, ScrollbarAppearance, SkeletonShape, SkeletonSweepDirection, Snackbar, Sort, SortDirection, SpotlightOptions, SpotlightStyles, UniAppBarOptions, UniAvatarGroupOptions, UniAvatarOptions, UniBreadcrumbOptions, UniCalendarMarker, UniCalendarMode, UniCalendarOptions, UniCalendarValue, UniCalloutDismissal, UniCalloutOptions, UniCheckboxOptions, UniCheckboxVariant, UniComboboxOptions, UniComboboxRejection, UniDataSearchOptions, UniDataTableOptions, UniDatasource, UniDate, UniDateInputOptions, UniDateInputRejection, UniDateRange, UniDateTime, UniDateTimeInputOptions, UniDrawerButtonsOptions, UniDrawerCloseRequest, UniDrawerHeaderOptions, UniDrawerOptions, UniDrawerPanel, UniExpandOptions, UniInputBoxOptions, UniInputMode, UniInputType, UniListboxPopupOptions, UniLocaleNumberParts, UniMenuItemOptions, UniMenuOptions, UniMonthGridCell, UniMultiSelectDropdownOptions, UniNotificationBadgeOptions, UniNumberClamp, UniNumberFormatConfig, UniNumberGrouping, UniNumberInputOptions, UniNumberParseResult, UniNumberPreset, UniNumberRange, UniNumberRangeInputOptions, UniNumberRangePart, UniNumberRangeRejection, UniNumberRejectReason, UniNumberRejection, UniNumberStepConfig, UniNumberStepped, UniPaginatorOptions, UniPopoverOptions, UniQuantityStepperOptions, UniRadioOption, UniRadioOptions, UniRadioVariant, UniResolvedNumberFormat, UniRoundingMode, UniSearchInputOptions, UniSkeletonOptions, UniSliderMark, UniSliderOptions, UniSliderThumb, UniStatOptions, UniStepperLayout, UniTabsOptions, UniTagInputOptions, UniTagItem, UniTagOptions, UniTagRejection, UniTagSuggestion, UniTagValue, UniTextareaOptions, UniTime, UniTimeInputOptions, UniTimeInputRejection, UniToggleOptions, UniToggleVariant, UniTourAdvance, UniTourOptions, UniTourStep, UniWeekdayName };
6468
+ export { BodyRenderDirective, ConfirmationDialogComponent, DRAWER_PANEL, DragAndDropDirective, FOCUSABLE_SELECTOR, ListboxNavigation, LocalStorageService, NotificationService, NotificationsComponent, RippleDirective, TRANSFORM_ORIGINS, ThemeService, UNI_FORMS, UNI_LAYOUT, UNI_THEMES, UniAlertComponent, UniAppBarComponent, UniAvatarComponent, UniAvatarGroupComponent, UniBackgroundComponent, UniBadgeComponent, UniBaseDatasource, UniBoxDirective, UniBreadcrumbComponent, UniButtonComponent, UniButtonGroupComponent, UniCalendarComponent, UniCalloutComponent, UniCardComponent, UniCardContentComponent, UniCardHeaderComponent, UniCenterDirective, UniCheckboxComponent, UniComboboxComponent, UniDataSearchComponent, UniDataTableComponent, UniDateInputComponent, UniDateTimeInputComponent, UniDebounceInputComponent, UniDialogButtonsComponent, UniDialogComponent, UniDialogHeaderComponent, UniDividerComponent, UniDrawerButtonsComponent, UniDrawerComponent, UniDrawerHeaderComponent, UniDropdownComponent, UniExpandAreaComponent, UniExpandComponent, UniExpandToggleComponent, UniFileDropZoneComponent, UniGridAreaDirective, UniGridDirective, UniIconButtonComponent, UniIconComponent, UniInlineButtonComponent, UniInputBoxComponent, UniInputComponent, UniJsonViewComponent, UniMenuComponent, UniMultiSelectComponent, UniMultiSelectDropdownComponent, UniNotificationBadgeComponent, UniNumberInputComponent, UniNumberRangeInputComponent, UniPaginatorComponent, UniPopoverComponent, UniProgressBarComponent, UniProgressGaugeComponent, UniQuantityStepperComponent, UniRadioComponent, UniRecordDatasource, UniRowDirective, UniScrollAreaComponent, UniSearchInputComponent, UniSelectComponent, UniServerSideDatasource, UniSkeletonComponent, UniSliderComponent, UniSnackbarComponent, UniSortHeaderComponent, UniStackDirective, UniStatComponent, UniSymbolComponent, UniTabComponent, UniTabsComponent, UniTagComponent, UniTagInputComponent, UniTextDirective, UniTextareaComponent, UniThemeBuilderComponent, UniThemeSwitchComponent, UniTimeInputComponent, UniToggleComponent, UniTooltipComponent, UniTourComponent, UniWrapDirective, acceptableFile, addDays, addMonths, anchorArrowStyles, anchorStyles, buildMonthGrid, clampDecimal, clearAnchorName, compareDecimal, createAnnouncer, createListboxNavigation, createPressRepeat, dayOfWeek, daysInMonth, decimalScale, discreteOverlayTransition, evaluateExpression, focusableElements, formatDate, formatMonthHeading, formatNumber, formatTime, fromScaled, getFileExtension, inclusiveDayCount, isCanonicalDecimal, isDivider, isToggleOpen, isValidDate, isoDate, joinDateTime, listboxPopupAttr, listboxPopupStyles, localeDatePlaceholder, localeDefaultHour12, localeFieldOrder, localeMonthNames, localeNumberParts, localeWeekStart, losesPrecision, monthOf, motionSafe, newAnchorName, newListboxAnchor, normalizeDecimal, parseDateText, parseNumber, parseTimeText, promoteListboxPopup, rawNumberText, resolveElement, resolveFocusTarget, resolveNumberFormat, restoreOverlayFocus, roundDecimal, setAnchorName, settleNumber, shiftDecimal, speakNumber, splitDateTime, spotlightStyles, stepDecimal, supportsAnchoredPopup, timeSlots, toAsciiDigits, toDecimal, toNumber, toScaled, todayIso, transformOriginFor, uniqueId, useTimer, visuallyHidden, weekdayNames };
6469
+ export type { Alert, AnchorOffset, AnchorRect, Announcer, BrandPaletteConfig, BreadcrumbItem, ButtonGroupConfig, ButtonGroupItem, ColumnDefinition, Confirmation, DataLoader, DrawerBackground, DrawerCloseReason, DrawerMode, DrawerPosition, ImagePosition, ListboxNavigationConfig, MenuDivider, MenuItem, MenuItemWithLabel, MenuItemWithTemplate, Option, Options, PageRequest, PageResponse, Placement, PressRepeat, PressRepeatConfig, PressRepeatTiming, ScrollbarAppearance, SkeletonShape, SkeletonSweepDirection, Snackbar, Sort, SortDirection, SpotlightOptions, SpotlightStyles, UniAppBarOptions, UniAvatarGroupOptions, UniAvatarOptions, UniBreadcrumbOptions, UniCalendarMarker, UniCalendarMode, UniCalendarOptions, UniCalendarValue, UniCalloutDismissal, UniCalloutOptions, UniCheckboxOptions, UniCheckboxVariant, UniComboboxOptions, UniComboboxRejection, UniDataSearchOptions, UniDataTableOptions, UniDatasource, UniDate, UniDateInputOptions, UniDateInputRejection, UniDateRange, UniDateTime, UniDateTimeInputOptions, UniDrawerButtonsOptions, UniDrawerCloseRequest, UniDrawerHeaderOptions, UniDrawerOptions, UniDrawerPanel, UniExpandOptions, UniInlineButtonOptions, UniInputBoxOptions, UniInputMode, UniInputType, UniListboxPopupOptions, UniLocaleNumberParts, UniMenuItemOptions, UniMenuOptions, UniMonthGridCell, UniMultiSelectDropdownOptions, UniNotificationBadgeOptions, UniNumberClamp, UniNumberFormatConfig, UniNumberGrouping, UniNumberInputOptions, UniNumberParseResult, UniNumberPreset, UniNumberRange, UniNumberRangeInputOptions, UniNumberRangePart, UniNumberRangeRejection, UniNumberRejectReason, UniNumberRejection, UniNumberStepConfig, UniNumberStepped, UniPaginatorOptions, UniPopoverOptions, UniQuantityStepperOptions, UniRadioOption, UniRadioOptions, UniRadioVariant, UniResolvedNumberFormat, UniRoundingMode, UniSearchInputOptions, UniSelectOptions, UniSkeletonOptions, UniSliderMark, UniSliderOptions, UniSliderThumb, UniStatOptions, UniStepperLayout, UniTabsOptions, UniTagInputOptions, UniTagItem, UniTagOptions, UniTagRejection, UniTagSuggestion, UniTagValue, UniTextareaOptions, UniTime, UniTimeInputOptions, UniTimeInputRejection, UniToggleOptions, UniToggleVariant, UniTourAdvance, UniTourOptions, UniTourStep, UniWeekdayName };
6470
+ //# sourceMappingURL=uni-design-system-uni-angular.d.ts.map