@uni-design-system/uni-angular 7.3.0 → 8.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uni-design-system/uni-angular",
3
- "version": "7.3.0",
3
+ "version": "8.0.0",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -22,7 +22,7 @@
22
22
  "@angular/core": "^21.2.0",
23
23
  "@angular/forms": "^21.2.0",
24
24
  "@emotion/css": "^11.0.0",
25
- "@uni-design-system/uni-core": "^7.3.0"
25
+ "@uni-design-system/uni-core": "^8.0.0"
26
26
  },
27
27
  "module": "fesm2022/uni-design-system-uni-angular.mjs",
28
28
  "typings": "types/uni-design-system-uni-angular.d.ts",
@@ -644,6 +644,23 @@ var BaseIcons = {
644
644
  logout: "data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M212.31-140Q182-140 161-161q-21-21-21-51.31v-535.38Q140-778 161-799q21-21 51.31-21h268.07v60H212.31q-4.62 0-8.46 3.85-3.85 3.84-3.85 8.46v535.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85h268.07v60H212.31Zm436.92-169.23-41.54-43.39L705.08-450H363.85v-60h341.23l-97.39-97.38 41.54-43.39L820-480 649.23-309.23Z'/%3e%3c/svg%3e",
645
645
  spinner: "data:image/svg+xml;charset=UTF-8,%3csvg stroke='%23000' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg' %3e%3cstyle%3e .oui_spinner %7b transform-origin: center; animation: rotate_360 2s linear infinite;%7d .oui_spinner circle %7b stroke-linecap: round; animation: dash 1.5s ease-in-out infinite;%7d %40keyframes rotate_360 %7b 100%25 %7b transform: rotate(360deg);%7d %7d %40keyframes dash %7b 0%25 %7b stroke-dasharray: 0 150; stroke-dashoffset: 0;%7d 47.5%25 %7b stroke-dasharray: 42 150; stroke-dashoffset: -16;%7d 95%25, 100%25 %7b stroke-dasharray: 42 150; stroke-dashoffset: -59;%7d %7d %3c/style%3e%3cg class='oui_spinner'%3e%3ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3'%3e%3c/circle%3e%3c/g%3e%3c/svg%3e "
646
646
  };
647
+ /**
648
+ * The highlight state for roving-focus composites (menus, and any other widget
649
+ * that moves focus programmatically): pointer hover, or focus the user drove
650
+ * from the keyboard.
651
+ *
652
+ * Why not plain `:focus` — a roving-focus composite calls `.focus()` on an item
653
+ * every time it opens, including pointer opens, and `:focus` would paint that
654
+ * as a highlight the mouse user never asked for, reading as a preselected
655
+ * item. `:focus-visible` excludes programmatic focus that follows a click while
656
+ * still matching keyboard navigation.
657
+ *
658
+ * Shared as a constant because Emotion merges styles by **exact selector
659
+ * text**: a component's base rule and any theme variant restyling that rule
660
+ * must key both with this value, or the variant silently fails to override and
661
+ * reintroduces the phantom highlight.
662
+ */
663
+ var HOVER_OR_KEYBOARD_FOCUS = "&:hover, &:focus-visible";
647
664
  var BaseTypography = {
648
665
  "display-large": {
649
666
  fontFamily: "Red Hat Display",
@@ -840,6 +857,25 @@ var buildBorders = (c) => ({
840
857
  dark: `1px solid ${c["on-background"]}`,
841
858
  dotted: `1px dotted ${c["on-background"]}`
842
859
  });
860
+ /**
861
+ * One tag colour role across all three tones. `soft` is the resting look (the
862
+ * container pair), `solid` fills with the role itself, `outline` keeps the
863
+ * surface and draws the edge — so every role stays consistent and a theme can
864
+ * still override any single cell.
865
+ */
866
+ var tagVariant = (c, role) => ({ [role]: {
867
+ backgroundColor: c[`${role}-container`],
868
+ color: c[`on-${role}-container`],
869
+ "&.tone-solid": {
870
+ backgroundColor: c[role],
871
+ color: c[`on-${role}`]
872
+ },
873
+ "&.tone-outline": {
874
+ backgroundColor: "transparent",
875
+ color: c[role],
876
+ borderColor: c[`on-${role}-container-border`] ?? c[role]
877
+ }
878
+ } });
843
879
  var buildComponents = (c) => ({
844
880
  alert: { options: {
845
881
  topPosition: 40,
@@ -1010,7 +1046,7 @@ var buildComponents = (c) => ({
1010
1046
  },
1011
1047
  variants: { warn: {
1012
1048
  color: c.warn,
1013
- "&:hover, &:focus": {
1049
+ [HOVER_OR_KEYBOARD_FOCUS]: {
1014
1050
  backgroundColor: c["warn-container"],
1015
1051
  color: c["on-warn-container"]
1016
1052
  }
@@ -1064,6 +1100,79 @@ var buildComponents = (c) => ({
1064
1100
  focusOutlineOffset: 2
1065
1101
  } },
1066
1102
  badge: { options: { borderRadius: "xxs" } },
1103
+ tag: {
1104
+ options: {
1105
+ borderRadius: "max",
1106
+ typeface: "tag",
1107
+ gap: "xs",
1108
+ removeIcon: "close",
1109
+ selectedIcon: "check"
1110
+ },
1111
+ fixed: {
1112
+ display: "inline-flex",
1113
+ alignItems: "center",
1114
+ maxWidth: "100%",
1115
+ border: "1px solid transparent",
1116
+ transition: "background-color .2s ease, color .2s ease"
1117
+ },
1118
+ variants: {
1119
+ ...tagVariant(c, "primary"),
1120
+ ...tagVariant(c, "secondary"),
1121
+ ...tagVariant(c, "tertiary"),
1122
+ ...tagVariant(c, "warn"),
1123
+ ...tagVariant(c, "success"),
1124
+ ghost: {
1125
+ backgroundColor: "transparent",
1126
+ color: c["on-background"],
1127
+ "&.tone-solid": {
1128
+ backgroundColor: c["surface-variant"],
1129
+ color: c["on-surface-variant"]
1130
+ },
1131
+ "&.tone-outline": {
1132
+ backgroundColor: "transparent",
1133
+ borderColor: c.outline
1134
+ }
1135
+ },
1136
+ disabled: {
1137
+ backgroundColor: c["disabled-container"],
1138
+ color: c["on-disabled"],
1139
+ "&.tone-solid": {
1140
+ backgroundColor: c.disabled,
1141
+ color: c["on-disabled"]
1142
+ },
1143
+ "&.tone-outline": {
1144
+ backgroundColor: "transparent",
1145
+ borderColor: c.disabled
1146
+ }
1147
+ }
1148
+ },
1149
+ sizes: {
1150
+ sm: {
1151
+ height: 20,
1152
+ fontSize: 12,
1153
+ padding: "0 8px"
1154
+ },
1155
+ md: {
1156
+ height: 24,
1157
+ fontSize: 13,
1158
+ padding: "0 10px"
1159
+ },
1160
+ lg: {
1161
+ height: 32,
1162
+ fontSize: 15,
1163
+ padding: "0 12px"
1164
+ }
1165
+ }
1166
+ },
1167
+ tagInput: { options: {
1168
+ chipGap: "xs",
1169
+ chipSize: "md",
1170
+ minInputWidth: "12ch",
1171
+ listColor: "primary-surface",
1172
+ listShadow: "menu",
1173
+ listBorderRadius: "xs",
1174
+ maxSuggestions: 8
1175
+ } },
1067
1176
  button: {
1068
1177
  options: {
1069
1178
  borderRadius: "max",
@@ -1367,11 +1476,11 @@ var buildComponents = (c) => ({
1367
1476
  typeface: "label"
1368
1477
  } }
1369
1478
  });
1370
- var isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
1479
+ var isRecord$1 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
1371
1480
  var deepMerge = (base, override) => {
1372
1481
  if (!override) return base;
1373
1482
  const out = { ...base };
1374
- for (const [key, value] of Object.entries(override)) out[key] = isRecord(value) && isRecord(out[key]) ? deepMerge(out[key], value) : value;
1483
+ for (const [key, value] of Object.entries(override)) out[key] = isRecord$1(value) && isRecord$1(out[key]) ? deepMerge(out[key], value) : value;
1375
1484
  return out;
1376
1485
  };
1377
1486
  var createTheme = ({ id, name, colors, icons = {}, radii = BaseRadii, shadows = BaseShadows, borders, components }) => ({
@@ -1519,6 +1628,11 @@ var generateThemes = (input) => {
1519
1628
  }
1520
1629
  };
1521
1630
  };
1631
+ /**
1632
+ * One-line human summary of a {@link ContrastReport}. Shared so the generated
1633
+ * theme file's header and the MCP's theme tools report identical wording.
1634
+ */
1635
+ var summarizeContrast = (report) => `${report.checks.length} contrast pairs checked · worst ${report.worstRatio}:1 · ${report.pass ? "all AA" : `${report.checks.filter((check) => !check.pass).length} failing`}`;
1522
1636
  var IDENT = /^[A-Za-z_$][A-Za-z0-9_$]*$/;
1523
1637
  var asKey = (k) => IDENT.test(k) ? k : `'${k}'`;
1524
1638
  var recordLiteral = (record, indent) => Object.entries(record).map(([k, v]) => `${indent}${asKey(k)}: '${v}',`).join("\n");
@@ -1573,7 +1687,7 @@ var emitThemeFile = (input) => {
1573
1687
  input.shape && `--shape=${input.shape}`,
1574
1688
  !darkMode && "--dark-mode=false"
1575
1689
  ].filter(Boolean).join(" ");
1576
- const reportSummary = `${report.checks.length} contrast pairs checked · worst ${report.worstRatio}:1 · ${report.pass ? "all AA" : `${report.checks.filter((c) => !c.pass).length} failing`}`;
1690
+ const reportSummary = summarizeContrast(report);
1577
1691
  const modes = [{
1578
1692
  exportName: `${id}Light`,
1579
1693
  displayName: `${name} Light`,
@@ -1754,7 +1868,7 @@ var UniThemes = {
1754
1868
  Object.keys(UniThemes)[0];
1755
1869
  //#endregion
1756
1870
  //#region package.json
1757
- var version = "7.3.0";
1871
+ var version = "8.0.0";
1758
1872
  //#endregion
1759
1873
  //#region schematics-src/ng-add/transforms.ts
1760
1874
  var addDependencies = (packageJsonText, deps) => {
@@ -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, NullableSize, ThemeName, TextRole, ContentColorToken, Size, Thickness, NullableStyleExpression, ColorKey, ColorToken, Typeface, Radius, OptionalSize, Border, Shadow, ZIndexableElements, Elevation, RadiiSize, TextColor, JustifyContent, StyleExpression, Orientation, CssLength, OptionalAlignSelf, OptionalAlignItems, OptionalAlignContent, OptionalJustifyContent, OptionalDisplay, OptionalPosition, OptionalOverflow, OptionalFlexDirection, OptionalTextAlign, OptionalWrap, ColorScheme, ColorCategory, ThemeShape, ContrastCheck, Colors, GenerationInput } from '@uni-design-system/uni-core';
4
+ import { IconName, Variant, ContainerColorToken, PaletteConfig, GenerateColorsConfig, Radii, UniTheme, ComponentName, ComponentTheme, NullableSize, ThemeName, ThemeParseResult, TextRole, ContentColorToken, Size, Thickness, NullableStyleExpression, ColorKey, ColorToken, Typeface, Radius, OptionalSize, Border, Shadow, ZIndexableElements, Elevation, RadiiSize, TextColor, JustifyContent, StyleExpression, Orientation, CssLength, OptionalAlignSelf, OptionalAlignItems, OptionalAlignContent, OptionalJustifyContent, OptionalDisplay, OptionalPosition, OptionalOverflow, OptionalFlexDirection, OptionalTextAlign, OptionalWrap, TagTone, ColorScheme, ColorCategory, ThemeShape, ContrastCheck, Colors, GenerationInput } from '@uni-design-system/uni-core';
5
5
  import { FormCheckboxControl, FormValueControl } from '@angular/forms/signals';
6
6
  import * as _uni_design_system_uni_angular from '@uni-design-system/uni-angular';
7
7
 
@@ -44,6 +44,64 @@ declare function motionSafe<T extends object>(styles: T): {
44
44
  '@media (prefers-reduced-motion: no-preference)': T;
45
45
  };
46
46
 
47
+ interface ListboxNavigationConfig {
48
+ /** How many options are currently navigable. Read reactively. */
49
+ count: () => number;
50
+ /** Id prefix for the listbox and its options. */
51
+ idPrefix?: string;
52
+ /** Wrap past the ends. Default true. */
53
+ wrap?: boolean;
54
+ }
55
+ /**
56
+ * The keyboard and ARIA bookkeeping shared by every combobox-style popup:
57
+ * open state, the active option index, and the `aria-activedescendant` id
58
+ * wiring. Deliberately owns no markup and no filtering — each control renders
59
+ * its own options and decides what a suggestion *is*.
60
+ *
61
+ * Extracted because three controls need the identical contract
62
+ * (`uni-search-input`, `uni-tag-input`, and the multi-select upgrade), and the
63
+ * parts that silently drift between hand-rolled copies all live here: the
64
+ * wrap-around arithmetic, Home/End, and keeping the active id in sync with the
65
+ * option list.
66
+ *
67
+ * `Enter` and `Escape` are deliberately *not* handled: what they mean depends
68
+ * on the control (submit a search, commit a typed token, clear the field), and
69
+ * `activeIndex()` is all a caller needs to decide.
70
+ */
71
+ declare class ListboxNavigation {
72
+ private readonly config;
73
+ /** Id for the `role="listbox"` element; wire as `aria-controls`. */
74
+ readonly listboxId: string;
75
+ private readonly _open;
76
+ private readonly _activeIndex;
77
+ private readonly wrap;
78
+ /** Whether the popup is showing. Also false when there is nothing to show. */
79
+ readonly open: Signal<boolean>;
80
+ /** Index of the highlighted option, or -1 when none is active. */
81
+ readonly activeIndex: Signal<number>;
82
+ /** Value for `aria-activedescendant`, or null when nothing is active. */
83
+ readonly activeDescendantId: Signal<string | null>;
84
+ constructor(config: ListboxNavigationConfig);
85
+ /** Stable per-option id, for `role="option"` elements. */
86
+ optionId(index: number): string;
87
+ show(): void;
88
+ /** Close and drop the active option, so reopening starts clean. */
89
+ hide(): void;
90
+ setActive(index: number): void;
91
+ /**
92
+ * Handle ArrowDown / ArrowUp / Home / End, opening the popup if needed.
93
+ * Returns true when the key was consumed, so a caller can fall through to
94
+ * its own handling for everything else.
95
+ */
96
+ navigate(event: KeyboardEvent): boolean;
97
+ private nextIndex;
98
+ private step;
99
+ /** Close when focus leaves the control entirely (not on internal moves). */
100
+ closeOnFocusOut(event: FocusEvent): void;
101
+ }
102
+ /** Factory mirroring the signal-API style used elsewhere in the CDK. */
103
+ declare const createListboxNavigation: (config: ListboxNavigationConfig) => ListboxNavigation;
104
+
47
105
  /**
48
106
  * Native CSS Anchor Positioning helpers (Baseline 2026). These replace the
49
107
  * former @floating-ui/dom dependency: the browser tracks the anchor natively
@@ -271,10 +329,19 @@ declare class ThemeService {
271
329
  static readonly CUSTOM_KEY = "CustomTheme";
272
330
  /** localStorage key holding the serialized brand palette config. */
273
331
  static readonly PALETTE_KEY = "uni-custom-palette";
274
- private themes;
275
332
  private localStorage;
276
- theme: _angular_core.WritableSignal<UniTheme>;
277
- themeOptions: _angular_core.WritableSignal<Options<string>>;
333
+ /**
334
+ * The live theme registry: the injected {@link UNI_THEMES} map (validated
335
+ * at construction) plus anything added via {@link registerTheme} — including
336
+ * the custom brand theme, which registers under {@link CUSTOM_KEY} so it is
337
+ * an ordinary, selectable entry.
338
+ */
339
+ private readonly registry;
340
+ private readonly _theme;
341
+ /** The active theme. Write via {@link setTheme}/{@link selectTheme} — every write is validated. */
342
+ readonly theme: Signal<UniTheme>;
343
+ /** Selectable themes, derived from the registry — reactive to registration. */
344
+ readonly themeOptions: Signal<Options<string>>;
278
345
  components: Signal<Partial<Record<ComponentName, ComponentTheme<object>>>>;
279
346
  component: <T>(componentName: ComponentName) => Signal<ComponentTheme<T>>;
280
347
  colors: Signal<Partial<Record<string, string>>>;
@@ -286,7 +353,37 @@ declare class ThemeService {
286
353
  shadows: Signal<Partial<Record<string, string>>>;
287
354
  icons: Signal<_uni_design_system_uni_core.Icons>;
288
355
  constructor();
289
- selectTheme(themeName: ThemeName): void;
356
+ /**
357
+ * Activate a registered theme. Returns false — touching nothing, persisting
358
+ * nothing — when the name is unknown (previously this silently kept the old
359
+ * theme while still recording the bad key).
360
+ */
361
+ selectTheme(themeName: ThemeName): boolean;
362
+ /**
363
+ * Validate and activate a theme without registering it. The result carries
364
+ * acceptance or the complete list of rejection reasons; on rejection the
365
+ * active theme is unchanged.
366
+ */
367
+ setTheme(input: unknown): ThemeParseResult;
368
+ /**
369
+ * Validate and add a theme to the registry (keyed by its `id`), making it
370
+ * selectable and listed in {@link themeOptions}. On rejection the registry
371
+ * is unchanged and the result lists every reason.
372
+ */
373
+ registerTheme(input: unknown, opts?: {
374
+ select?: boolean;
375
+ }): ThemeParseResult;
376
+ /**
377
+ * The gate every externally-supplied theme passes: validate, then restore
378
+ * any built-in icons the payload left out. Themes that travel as JSON (the
379
+ * MCP theme tools, a theme registry) omit the built-in icon set — it is
380
+ * ~71% of the bytes and every consumer already ships it — so hydration
381
+ * applies the same `{...BaseIcons, ...icons}` contract `createTheme` uses:
382
+ * the theme's own icons win, built-ins fill the rest.
383
+ */
384
+ private accept;
385
+ /** Remove a registered theme; falls back to the first remaining theme if it was active. */
386
+ unregisterTheme(id: string): void;
290
387
  /** The live brand palette config, when a custom theme is active. */
291
388
  customPalette: _angular_core.WritableSignal<BrandPaletteConfig>;
292
389
  isCustomTheme: Signal<boolean>;
@@ -296,7 +393,7 @@ declare class ThemeService {
296
393
  * reload) renders with the same brand.
297
394
  */
298
395
  applyPalette(config: BrandPaletteConfig, persist?: boolean): void;
299
- /** Drop the custom brand theme and fall back to the first built-in theme. */
396
+ /** Drop the custom brand theme and fall back to the first registered theme. */
300
397
  clearCustomPalette(): void;
301
398
  selectedThemeName: Signal<string>;
302
399
  selectedThemeKey: _angular_core.WritableSignal<string>;
@@ -1608,20 +1705,49 @@ declare class UniMultiSelectDropdownComponent<T = unknown> extends BaseComponent
1608
1705
  readonly ariaDescribedBy: _angular_core.InputSignal<string>;
1609
1706
  readonly options: _angular_core.InputSignal<Options<T>>;
1610
1707
  readonly placeholder: _angular_core.InputSignal<string>;
1708
+ /**
1709
+ * What the field is for, e.g. "Fruits". Rendered visually hidden inside the
1710
+ * trigger so its accessible name reads "Fruits, Apple, Pear" — without it a
1711
+ * screen reader announces only the current selection, with no clue which
1712
+ * field it belongs to.
1713
+ */
1714
+ readonly label: _angular_core.InputSignal<string>;
1715
+ /** Debounce for the filter box, matching the library's input debounce. */
1716
+ readonly debounceTime: _angular_core.InputSignal<number>;
1717
+ protected readonly srOnly: string;
1611
1718
  protected readonly query: _angular_core.WritableSignal<string>;
1719
+ private queryTimer?;
1612
1720
  protected readonly filteredOptions: _angular_core.Signal<Options<T>>;
1721
+ private readonly optionRefs;
1722
+ /**
1723
+ * Roving focus over the options. The shared helper owns the index
1724
+ * arithmetic — wrapping, Home/End, and never pointing past a list the
1725
+ * filter has narrowed — the same contract `uni-search-input` and
1726
+ * `uni-tag-input` use, so the keys behave identically across all three.
1727
+ */
1728
+ protected readonly list: _uni_design_system_uni_angular.ListboxNavigation;
1729
+ /** Announced with the selection so the count is not left to guesswork. */
1730
+ readonly selectionSummary: _angular_core.Signal<string>;
1613
1731
  readonly selectedLabelsText: _angular_core.Signal<string>;
1614
1732
  protected readonly showError: _angular_core.Signal<boolean>;
1615
1733
  protected readonly textColor: _angular_core.Signal<_uni_design_system_uni_core.TextColor>;
1616
1734
  triggerClass: string;
1617
1735
  protected readonly searchInputClass: _angular_core.Signal<string>;
1618
1736
  protected handleQueryInput(event: Event): void;
1737
+ /**
1738
+ * Arrow keys walk the options from anywhere in the panel, including the
1739
+ * filter box — previously the only way in was to Tab through every
1740
+ * checkbox.
1741
+ */
1742
+ protected onPanelKeydown(event: KeyboardEvent): void;
1743
+ /** Keeps the active index in step when focus lands on a row by pointer. */
1744
+ protected onOptionFocus(index: number): void;
1619
1745
  selectAll(): void;
1620
1746
  deselectAll(): void;
1621
1747
  protected isOptionSelected(option: Option<T>): _angular_core.Signal<boolean>;
1622
1748
  toggleOption(option: Option<T>, checked: boolean): void;
1623
1749
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniMultiSelectDropdownComponent<any>, never>;
1624
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniMultiSelectDropdownComponent<any>, "uni-multi-select-dropdown", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": true; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; }, never, never, true, never>;
1750
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniMultiSelectDropdownComponent<any>, "uni-multi-select-dropdown", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": true; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "debounceTime": { "alias": "debounceTime"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; }, never, never, true, never>;
1625
1751
  }
1626
1752
 
1627
1753
  interface UniNotificationBadgeOptions {
@@ -1962,12 +2088,10 @@ declare class UniSearchInputComponent extends BaseComponent<UniSearchInputOption
1962
2088
  search: _angular_core.OutputEmitterRef<string>;
1963
2089
  suggestionSelected: _angular_core.OutputEmitterRef<string>;
1964
2090
  protected readonly field: _angular_core.Signal<UniDebounceInputComponent>;
1965
- readonly listboxId: string;
1966
- protected readonly listOpen: _angular_core.WritableSignal<boolean>;
1967
- protected readonly activeIndex: _angular_core.WritableSignal<number>;
1968
2091
  protected readonly visibleSuggestions: _angular_core.Signal<string[]>;
1969
- protected readonly showList: _angular_core.Signal<boolean>;
1970
- protected readonly activeOptionId: _angular_core.Signal<string>;
2092
+ /** Shared combobox bookkeeping: open state, active option, ARIA ids. */
2093
+ protected readonly list: _uni_design_system_uni_angular.ListboxNavigation;
2094
+ readonly listboxId: string;
1971
2095
  protected readonly hasQuery: _angular_core.Signal<boolean>;
1972
2096
  protected handleChange(value: string): void;
1973
2097
  protected submit(): void;
@@ -2298,13 +2422,217 @@ declare class UniSymbolComponent extends BaseComponent<SymbolOptions> {
2298
2422
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniSymbolComponent, "uni-symbol", never, { "name": { "alias": "name"; "required": true; "isSignal": true; }; "fill": { "alias": "fill"; "required": false; "isSignal": true; }; "weight": { "alias": "weight"; "required": false; "isSignal": true; }; "grade": { "alias": "grade"; "required": false; "isSignal": true; }; "opticalSize": { "alias": "opticalSize"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
2299
2423
  }
2300
2424
 
2301
- declare class UniTagComponent {
2425
+ /** Theme options for the `tag` component entry. */
2426
+ interface UniTagOptions {
2427
+ borderRadius?: Radius;
2428
+ typeface?: Typeface;
2429
+ /** Space between the lead element, label and remove button. */
2430
+ gap?: NullableSize;
2431
+ /** Icon primitive for the remove affordance. */
2432
+ removeIcon?: IconName;
2433
+ /** Icon primitive shown in the lead slot when the chip is selected. */
2434
+ selectedIcon?: IconName;
2435
+ }
2436
+ /** The value a tag echoes back on `removed` / `activated`. */
2437
+ type UniTagValue = string | number | undefined;
2438
+
2439
+ /**
2440
+ * Compact chip for categories, states, filters and tokens.
2441
+ *
2442
+ * Two orthogonal style axes: `variant` picks the colour role and `tone` picks
2443
+ * the archetype (soft / solid / outline). Both live in the theme's `tag` entry,
2444
+ * so a theme restyles every chip in the app without touching markup.
2445
+ *
2446
+ * Structurally a chip is **body + trailing action as siblings**, never nested
2447
+ * buttons: an interactive chip whose body is a `<button>` cannot contain the
2448
+ * remove `<button>` (invalid HTML, and the inner control becomes unreachable
2449
+ * for keyboard users). Both stay independently operable.
2450
+ */
2451
+ declare class UniTagComponent extends BaseComponent<UniTagOptions> {
2452
+ size: _angular_core.InputSignal<Size>;
2453
+ tone: _angular_core.InputSignal<TagTone>;
2302
2454
  label: _angular_core.InputSignal<string>;
2303
2455
  value: _angular_core.InputSignal<string | number>;
2304
- close: _angular_core.OutputEmitterRef<string | number>;
2305
- handleClose(): void;
2456
+ /** Truncation budget, e.g. `'14ch'`. A number is treated as px. */
2457
+ maxWidth: _angular_core.InputSignal<string | number>;
2458
+ avatarSrc: _angular_core.InputSignal<string>;
2459
+ /** Initials fallback when `avatarSrc` is absent or fails to load. */
2460
+ avatarName: _angular_core.InputSignal<string>;
2461
+ /** Theme icon primitive — the preferred glyph path. */
2462
+ iconName: _angular_core.InputSignal<IconName>;
2463
+ /** Material Symbols ligature, for glyphs the theme's icon set doesn't carry. */
2464
+ symbolName: _angular_core.InputSignal<string>;
2465
+ /** Status dot in the current colour. */
2466
+ dot: _angular_core.InputSignal<boolean>;
2467
+ removable: _angular_core.InputSignal<boolean>;
2468
+ interactive: _angular_core.InputSignal<boolean>;
2469
+ /**
2470
+ * Toggle state. Left undefined the chip carries no `aria-pressed` at all —
2471
+ * an interactive chip is not always a toggle (inside a tag input it is
2472
+ * focusable so it can be removed), and announcing "not pressed" on a
2473
+ * recipient chip is worse than announcing nothing.
2474
+ */
2475
+ selected: _angular_core.InputSignal<boolean>;
2476
+ invalid: _angular_core.InputSignal<boolean>;
2477
+ disabled: _angular_core.InputSignal<boolean>;
2478
+ /** Accessible-name override for the remove button. */
2479
+ removeLabel: _angular_core.InputSignal<string>;
2480
+ /**
2481
+ * Tab position of the chip's controls. A composite that owns its own
2482
+ * roving focus — `uni-tag-input`, where the whole field is one tab stop —
2483
+ * passes `-1` so Tab does not walk through every chip to reach the next
2484
+ * control.
2485
+ */
2486
+ controlTabIndex: _angular_core.InputSignal<number>;
2487
+ removed: _angular_core.OutputEmitterRef<UniTagValue>;
2488
+ activated: _angular_core.OutputEmitterRef<UniTagValue>;
2489
+ /** A disabled chip wears the theme's `disabled` role, whatever its variant. */
2490
+ protected readonly resolvedVariant: _angular_core.Signal<_uni_design_system_uni_core.Variant>;
2491
+ protected readonly themeStyle: _angular_core.Signal<{
2492
+ [x: string]: string | number | _uni_design_system_uni_core.StyleExpression;
2493
+ }>;
2494
+ /** Lead elements derive from the chip height, so no second size token. */
2495
+ protected readonly leadSize: _angular_core.Signal<number>;
2496
+ /** Remove glyph, proportional to the chip rather than to the icon-button. */
2497
+ protected readonly removeGlyphSize: _angular_core.Signal<number>;
2498
+ protected readonly initials: _angular_core.Signal<string>;
2499
+ protected readonly hostClass: _angular_core.Signal<string>;
2500
+ /** Truncating label; `title` exposes the full text when a budget is set. */
2501
+ protected readonly labelClass: string;
2502
+ protected readonly bodyClass: _angular_core.Signal<string>;
2503
+ protected readonly leadClass: _angular_core.Signal<string>;
2504
+ protected readonly dotClass: _angular_core.Signal<string>;
2505
+ protected remove(): void;
2506
+ protected activate(): void;
2306
2507
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniTagComponent, never>;
2307
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniTagComponent, "uni-tag", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "close": "close"; }, never, never, true, never>;
2508
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniTagComponent, "uni-tag", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "tone": { "alias": "tone"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "maxWidth": { "alias": "maxWidth"; "required": false; "isSignal": true; }; "avatarSrc": { "alias": "avatarSrc"; "required": false; "isSignal": true; }; "avatarName": { "alias": "avatarName"; "required": false; "isSignal": true; }; "iconName": { "alias": "iconName"; "required": false; "isSignal": true; }; "symbolName": { "alias": "symbolName"; "required": false; "isSignal": true; }; "dot": { "alias": "dot"; "required": false; "isSignal": true; }; "removable": { "alias": "removable"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "removeLabel": { "alias": "removeLabel"; "required": false; "isSignal": true; }; "controlTabIndex": { "alias": "controlTabIndex"; "required": false; "isSignal": true; }; }, { "removed": "removed"; "activated": "activated"; }, never, ["[tag-lead]", "*"], true, never>;
2509
+ }
2510
+
2511
+ /**
2512
+ * One committed token. `value` is canonical — what a form submits — and
2513
+ * everything else is presentation the field may enrich from a suggestion.
2514
+ *
2515
+ * `{ value: 'a@b.com' }` is a complete item, so the least a caller has to write
2516
+ * is `[value]="[{ value: 'a@b.com' }]"`.
2517
+ */
2518
+ interface UniTagItem {
2519
+ /** Canonical value, e.g. an email address. */
2520
+ value: string;
2521
+ /** Display text; falls back to `value`. */
2522
+ label?: string;
2523
+ avatarSrc?: string;
2524
+ /**
2525
+ * Failed `validate()`. The item stays **in** the value rather than being
2526
+ * rejected — a field that silently swallows a typo'd address is worse than
2527
+ * one that shows it in red, and the user can click in to fix it.
2528
+ */
2529
+ invalid?: boolean;
2530
+ /** Locked token (e.g. a thread owner): rendered without a remove control. */
2531
+ disabled?: boolean;
2532
+ }
2533
+ /** A type-ahead entry. Same contract as `uni-search-input`: the app filters. */
2534
+ interface UniTagSuggestion {
2535
+ value: string;
2536
+ label?: string;
2537
+ description?: string;
2538
+ avatarSrc?: string;
2539
+ }
2540
+ /** Why a typed token did not become a chip. */
2541
+ interface UniTagRejection {
2542
+ raw: string;
2543
+ reason: 'duplicate' | 'max' | 'invalid';
2544
+ }
2545
+ /** Theme options for the `tagInput` component entry. */
2546
+ interface UniTagInputOptions {
2547
+ /** Space between chips. */
2548
+ chipGap?: NullableSize;
2549
+ chipSize?: Size;
2550
+ /** Keeps the text input usable when chips have wrapped. */
2551
+ minInputWidth?: string | number;
2552
+ listColor?: ContainerColorToken;
2553
+ listShadow?: Shadow;
2554
+ listBorderRadius?: Radius;
2555
+ maxSuggestions?: number;
2556
+ }
2557
+
2558
+ declare class UniTagInputComponent extends BaseComponent<UniTagInputOptions> implements FormValueControl<UniTagItem[]> {
2559
+ readonly value: _angular_core.ModelSignal<UniTagItem[]>;
2560
+ readonly disabled: _angular_core.InputSignal<boolean>;
2561
+ readonly touched: _angular_core.ModelSignal<boolean>;
2562
+ readonly invalid: _angular_core.InputSignal<boolean>;
2563
+ readonly dirty: _angular_core.InputSignal<boolean>;
2564
+ readonly required: _angular_core.InputSignal<boolean>;
2565
+ readonly ariaDescribedBy: _angular_core.InputSignal<string>;
2566
+ /** Accessible name for the field, e.g. "To". */
2567
+ label: _angular_core.InputSignal<string>;
2568
+ placeholder: _angular_core.InputSignal<string>;
2569
+ /** `email` wires an address validator, paste parser and space separator. */
2570
+ preset: _angular_core.InputSignal<"text" | "email">;
2571
+ separators: _angular_core.InputSignal<string[]>;
2572
+ commitOnBlur: _angular_core.InputSignal<boolean>;
2573
+ allowDuplicates: _angular_core.InputSignal<boolean>;
2574
+ max: _angular_core.InputSignal<number>;
2575
+ validate: _angular_core.InputSignal<(raw: string) => boolean>;
2576
+ parse: _angular_core.InputSignal<(pasted: string) => string[]>;
2577
+ tagVariant: _angular_core.InputSignal<Variant>;
2578
+ tagTone: _angular_core.InputSignal<TagTone>;
2579
+ tagSize: _angular_core.InputSignal<Size>;
2580
+ suggestions: _angular_core.InputSignal<UniTagSuggestion[]>;
2581
+ /** Debounced text the app should filter `suggestions` from. */
2582
+ query: _angular_core.OutputEmitterRef<string>;
2583
+ debounceTime: _angular_core.InputSignal<number>;
2584
+ added: _angular_core.OutputEmitterRef<UniTagItem>;
2585
+ removed: _angular_core.OutputEmitterRef<UniTagItem>;
2586
+ rejected: _angular_core.OutputEmitterRef<UniTagRejection>;
2587
+ private readonly inputRef;
2588
+ private readonly chipRefs;
2589
+ /** Uncommitted text in the field. */
2590
+ protected readonly draft: _angular_core.WritableSignal<string>;
2591
+ /** Index of the focused chip, or -1 when focus is in the text input. */
2592
+ protected readonly focusedChip: _angular_core.WritableSignal<number>;
2593
+ /** Announcement for the status region; add/remove are otherwise silent. */
2594
+ protected readonly announcement: _angular_core.WritableSignal<string>;
2595
+ protected readonly hintId: string;
2596
+ protected readonly srOnly: string;
2597
+ private queryTimer?;
2598
+ protected readonly visibleSuggestions: _angular_core.Signal<UniTagSuggestion[]>;
2599
+ /** Shared combobox bookkeeping — identical contract to uni-search-input. */
2600
+ protected readonly list: _uni_design_system_uni_angular.ListboxNavigation;
2601
+ protected readonly showError: _angular_core.Signal<boolean>;
2602
+ protected readonly separatorKeys: _angular_core.Signal<string[]>;
2603
+ protected readonly describedBy: _angular_core.Signal<string>;
2604
+ protected labelOf(item: UniTagItem | UniTagSuggestion): string;
2605
+ /** Split pasted text into candidate tokens. */
2606
+ private parseRaw;
2607
+ private isValid;
2608
+ /**
2609
+ * Turn typed text into a chip. Invalid entries are kept and flagged rather
2610
+ * than dropped; duplicates and over-max are refused with a reason.
2611
+ */
2612
+ protected commit(raw: string): boolean;
2613
+ private reject;
2614
+ protected removeAt(index: number, focus?: 'left' | 'right' | 'input'): void;
2615
+ private countNoun;
2616
+ private announce;
2617
+ protected focusInput(): void;
2618
+ private focusChip;
2619
+ protected onInputKeydown(event: KeyboardEvent): void;
2620
+ protected onInput(value: string): void;
2621
+ protected onPaste(event: ClipboardEvent): void;
2622
+ protected onBlur(): void;
2623
+ protected onFocusOut(event: FocusEvent): void;
2624
+ protected onChipKeydown(event: KeyboardEvent, index: number): void;
2625
+ /** Lift a chip back into the input for correction. */
2626
+ protected editChip(index: number): void;
2627
+ protected selectSuggestion(suggestion: UniTagSuggestion): void;
2628
+ private commitDraft;
2629
+ private setDraft;
2630
+ protected readonly className: _angular_core.Signal<string>;
2631
+ protected readonly fieldClass: _angular_core.Signal<string>;
2632
+ protected readonly inputClass: _angular_core.Signal<string>;
2633
+ protected readonly listClass: _angular_core.Signal<string>;
2634
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniTagInputComponent, never>;
2635
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniTagInputComponent, "uni-tag-input", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": true; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "preset": { "alias": "preset"; "required": false; "isSignal": true; }; "separators": { "alias": "separators"; "required": false; "isSignal": true; }; "commitOnBlur": { "alias": "commitOnBlur"; "required": false; "isSignal": true; }; "allowDuplicates": { "alias": "allowDuplicates"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "validate": { "alias": "validate"; "required": false; "isSignal": true; }; "parse": { "alias": "parse"; "required": false; "isSignal": true; }; "tagVariant": { "alias": "tagVariant"; "required": false; "isSignal": true; }; "tagTone": { "alias": "tagTone"; "required": false; "isSignal": true; }; "tagSize": { "alias": "tagSize"; "required": false; "isSignal": true; }; "suggestions": { "alias": "suggestions"; "required": false; "isSignal": true; }; "debounceTime": { "alias": "debounceTime"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; "query": "query"; "added": "added"; "removed": "removed"; "rejected": "rejected"; }, never, never, true, never>;
2308
2636
  }
2309
2637
 
2310
2638
  /**
@@ -2544,5 +2872,5 @@ declare class DragAndDropDirective {
2544
2872
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<DragAndDropDirective, "[uni-drag-n-drop], [dragAndDrop]", never, {}, { "onFileDropped": "onFileDropped"; }, never, never, true, never>;
2545
2873
  }
2546
2874
 
2547
- export { BodyRenderDirective, ConfirmationDialogComponent, DragAndDropDirective, FOCUSABLE_SELECTOR, LocalStorageService, NotificationService, NotificationsComponent, RippleDirective, ThemeService, UNI_THEMES, UniAlertComponent, UniAppBarComponent, UniAvatarComponent, UniAvatarGroupComponent, UniBackgroundComponent, UniBadgeComponent, UniBaseDatasource, UniBoxComponent, UniBreadcrumbComponent, UniButtonComponent, UniButtonGroupComponent, UniCardComponent, UniCardContentComponent, UniCardHeaderComponent, UniCenterComponent, UniCheckboxComponent, UniDataSearchComponent, UniDataTableComponent, UniDebounceInputComponent, UniDialogButtonsComponent, UniDialogComponent, UniDialogHeaderComponent, UniDividerComponent, UniDrawerComponent, UniDropdownComponent, UniExpandAreaComponent, UniExpandComponent, UniExpandToggleComponent, UniFileDropZoneComponent, UniGridAreaComponent, UniGridComponent, UniIconButtonComponent, UniIconComponent, UniInputBoxComponent, UniInputComponent, UniJsonViewComponent, UniMenuComponent, UniMultiSelectComponent, UniMultiSelectDropdownComponent, UniNotificationBadgeComponent, UniPaginatorComponent, UniPopoverComponent, UniProgressBarComponent, UniProgressGaugeComponent, UniRadioComponent, UniRecordDatasource, UniRowComponent, UniScrollAreaComponent, UniSearchInputComponent, UniSelectComponent, UniServerSideDatasource, UniSkeletonComponent, UniSliderComponent, UniSnackbarComponent, UniSortHeaderComponent, UniStackComponent, UniStatComponent, UniSymbolComponent, UniTabComponent, UniTabsComponent, UniTagComponent, UniTextComponent, UniTextareaComponent, UniThemeBuilderComponent, UniThemeSwitchComponent, UniToggleComponent, UniTooltipComponent, UniWrapComponent, acceptableFile, anchorArrowStyles, anchorStyles, getFileExtension, isDivider, motionSafe, newAnchorName, resolveFocusTarget, uniqueId, useTimer, visuallyHidden };
2548
- export type { Alert, AnchorOffset, BrandPaletteConfig, BreadcrumbItem, ButtonGroupConfig, ButtonGroupItem, ColumnDefinition, Confirmation, DataLoader, DrawerMode, DrawerPosition, ImagePosition, MenuDivider, MenuItem, MenuItemWithLabel, MenuItemWithTemplate, Option, Options, PageRequest, PageResponse, Placement, ScrollbarAppearance, SkeletonShape, Snackbar, Sort, SortDirection, UniAppBarOptions, UniAvatarGroupOptions, UniAvatarOptions, UniBreadcrumbOptions, UniCheckboxOptions, UniDataSearchOptions, UniDataTableOptions, UniDatasource, UniDrawerOptions, UniExpandOptions, UniInputBoxOptions, UniMenuItemOptions, UniMenuOptions, UniMultiSelectDropdownOptions, UniNotificationBadgeOptions, UniPaginatorOptions, UniRadioOption, UniRadioOptions, UniSearchInputOptions, UniSkeletonOptions, UniSliderOptions, UniStatOptions, UniTabsOptions, UniTextareaOptions, UniToggleOptions };
2875
+ export { BodyRenderDirective, ConfirmationDialogComponent, DragAndDropDirective, FOCUSABLE_SELECTOR, ListboxNavigation, LocalStorageService, NotificationService, NotificationsComponent, RippleDirective, ThemeService, UNI_THEMES, UniAlertComponent, UniAppBarComponent, UniAvatarComponent, UniAvatarGroupComponent, UniBackgroundComponent, UniBadgeComponent, UniBaseDatasource, UniBoxComponent, UniBreadcrumbComponent, UniButtonComponent, UniButtonGroupComponent, UniCardComponent, UniCardContentComponent, UniCardHeaderComponent, UniCenterComponent, UniCheckboxComponent, UniDataSearchComponent, UniDataTableComponent, UniDebounceInputComponent, UniDialogButtonsComponent, UniDialogComponent, UniDialogHeaderComponent, UniDividerComponent, UniDrawerComponent, UniDropdownComponent, UniExpandAreaComponent, UniExpandComponent, UniExpandToggleComponent, UniFileDropZoneComponent, UniGridAreaComponent, UniGridComponent, UniIconButtonComponent, UniIconComponent, UniInputBoxComponent, UniInputComponent, UniJsonViewComponent, UniMenuComponent, UniMultiSelectComponent, UniMultiSelectDropdownComponent, UniNotificationBadgeComponent, UniPaginatorComponent, UniPopoverComponent, UniProgressBarComponent, UniProgressGaugeComponent, UniRadioComponent, UniRecordDatasource, UniRowComponent, UniScrollAreaComponent, UniSearchInputComponent, UniSelectComponent, UniServerSideDatasource, UniSkeletonComponent, UniSliderComponent, UniSnackbarComponent, UniSortHeaderComponent, UniStackComponent, UniStatComponent, UniSymbolComponent, UniTabComponent, UniTabsComponent, UniTagComponent, UniTagInputComponent, UniTextComponent, UniTextareaComponent, UniThemeBuilderComponent, UniThemeSwitchComponent, UniToggleComponent, UniTooltipComponent, UniWrapComponent, acceptableFile, anchorArrowStyles, anchorStyles, createListboxNavigation, getFileExtension, isDivider, motionSafe, newAnchorName, resolveFocusTarget, uniqueId, useTimer, visuallyHidden };
2876
+ export type { Alert, AnchorOffset, BrandPaletteConfig, BreadcrumbItem, ButtonGroupConfig, ButtonGroupItem, ColumnDefinition, Confirmation, DataLoader, DrawerMode, DrawerPosition, ImagePosition, ListboxNavigationConfig, MenuDivider, MenuItem, MenuItemWithLabel, MenuItemWithTemplate, Option, Options, PageRequest, PageResponse, Placement, ScrollbarAppearance, SkeletonShape, Snackbar, Sort, SortDirection, UniAppBarOptions, UniAvatarGroupOptions, UniAvatarOptions, UniBreadcrumbOptions, UniCheckboxOptions, UniDataSearchOptions, UniDataTableOptions, UniDatasource, UniDrawerOptions, UniExpandOptions, UniInputBoxOptions, UniMenuItemOptions, UniMenuOptions, UniMultiSelectDropdownOptions, UniNotificationBadgeOptions, UniPaginatorOptions, UniRadioOption, UniRadioOptions, UniSearchInputOptions, UniSkeletonOptions, UniSliderOptions, UniStatOptions, UniTabsOptions, UniTagInputOptions, UniTagItem, UniTagOptions, UniTagRejection, UniTagSuggestion, UniTagValue, UniTextareaOptions, UniToggleOptions };