@uni-design-system/uni-mcp 10.4.0 → 11.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -7,16 +7,16 @@ import { z } from "zod";
7
7
  // src/data/uni-index.json
8
8
  var uni_index_default = {
9
9
  meta: {
10
- version: "10.4.0",
11
- builtAt: "2026-09-04T18:00:08.990Z",
10
+ version: "11.1.0",
11
+ builtAt: "2026-09-10T16:48:25.514Z",
12
12
  frameworks: [
13
13
  "angular"
14
14
  ],
15
15
  counts: {
16
- components: 84,
17
- tokens: 458,
16
+ components: 86,
17
+ tokens: 485,
18
18
  themes: 2,
19
- examples: 229
19
+ examples: 238
20
20
  }
21
21
  },
22
22
  components: [
@@ -27,7 +27,7 @@ var uni_index_default = {
27
27
  summary: "",
28
28
  description: "",
29
29
  category: "feedback",
30
- version: "10.4.0",
30
+ version: "11.1.0",
31
31
  bindings: {
32
32
  angular: {
33
33
  importPath: "@uni-design-system/uni-angular",
@@ -117,7 +117,7 @@ var uni_index_default = {
117
117
  summary: "Horizontal application bar: project leading controls (menu button, logo) with the `leading` attribute, actions with `trailing` (pushed to the far edge), and either pass `title` or project custom center content.",
118
118
  description: "Horizontal application bar: project leading controls (menu button, logo) with the `leading` attribute, actions with `trailing` (pushed to the far edge), and either pass `title` or project custom center content. Surface, divider, height, typography and spacing all resolve from `appBar` tokens. Place it inside your page's `<header>` landmark.",
119
119
  category: "components",
120
- version: "10.4.0",
120
+ version: "11.1.0",
121
121
  bindings: {
122
122
  angular: {
123
123
  importPath: "@uni-design-system/uni-angular",
@@ -190,7 +190,7 @@ var uni_index_default = {
190
190
  summary: "Identity avatar with a graceful fallback chain: image \u2192 initials from `name` \u2192 themed symbol.",
191
191
  description: "Identity avatar with a graceful fallback chain: image \u2192 initials from `name` \u2192 themed symbol. Coloring, radius, typeface and sizes all resolve from `avatar` theme tokens; `variant` picks the container palette.",
192
192
  category: "components",
193
- version: "10.4.0",
193
+ version: "11.1.0",
194
194
  bindings: {
195
195
  angular: {
196
196
  importPath: "@uni-design-system/uni-angular",
@@ -275,7 +275,7 @@ var uni_index_default = {
275
275
  relatedTokens: [
276
276
  "avatar.behavior.borderRadius",
277
277
  "avatar.behavior.typeface",
278
- "avatar.behavior.fallbackSymbol"
278
+ "avatar.behavior.fallbackIcon"
279
279
  ]
280
280
  },
281
281
  {
@@ -285,7 +285,7 @@ var uni_index_default = {
285
285
  summary: "Overlapping stack of avatars.",
286
286
  description: "Overlapping stack of avatars. `max` collapses the overflow into a themed \u201C+N\u201D chip (itself a `uni-avatar`). Overlap and separator ring resolve from `avatarGroup` theme tokens.",
287
287
  category: "components",
288
- version: "10.4.0",
288
+ version: "11.1.0",
289
289
  bindings: {
290
290
  angular: {
291
291
  importPath: "@uni-design-system/uni-angular",
@@ -334,7 +334,7 @@ var uni_index_default = {
334
334
  summary: "",
335
335
  description: "",
336
336
  category: "primitives",
337
- version: "10.4.0",
337
+ version: "11.1.0",
338
338
  bindings: {
339
339
  angular: {
340
340
  importPath: "@uni-design-system/uni-angular",
@@ -415,7 +415,7 @@ var uni_index_default = {
415
415
  summary: "",
416
416
  description: "",
417
417
  category: "feedback",
418
- version: "10.4.0",
418
+ version: "11.1.0",
419
419
  bindings: {
420
420
  angular: {
421
421
  importPath: "@uni-design-system/uni-angular",
@@ -512,7 +512,7 @@ var uni_index_default = {
512
512
  summary: "",
513
513
  description: "",
514
514
  category: "directives",
515
- version: "10.4.0",
515
+ version: "11.1.0",
516
516
  bindings: {
517
517
  angular: {
518
518
  importPath: "@uni-design-system/uni-angular",
@@ -536,7 +536,7 @@ var uni_index_default = {
536
536
  summary: 'The base layout primitive, applied as an attribute to any element so semantics stay yours: `<main box-layout [grow]="1" padding="md">`.',
537
537
  description: 'The base layout primitive, applied as an attribute to any element so semantics stay yours: `<main box-layout [grow]="1" padding="md">`. It is a directive, so it composes freely \u2014 with another layout attribute (`<div stack-layout uni-text="body-1-long">`) and with a component\'s own host element (`<uni-card box-layout padding="lg">`); Angular merges the host `class` bindings rather than letting one win. Sizing convention (height/width/min/max/inset): a **number is px and needs a binding** \u2014 `[height]="420"`; a **plain attribute is a CSS length string** \u2014 `height="420px"`. Spacing/radius/color inputs take theme tokens.',
538
538
  category: "layout",
539
- version: "10.4.0",
539
+ version: "11.1.0",
540
540
  bindings: {
541
541
  angular: {
542
542
  importPath: "@uni-design-system/uni-angular",
@@ -942,7 +942,7 @@ var uni_index_default = {
942
942
  summary: 'WAI-ARIA breadcrumb: a `nav` landmark wrapping an ordered list; the last item is the current page (`aria-current="page"`), separators are decorative.',
943
943
  description: 'WAI-ARIA breadcrumb: a `nav` landmark wrapping an ordered list; the last item is the current page (`aria-current="page"`), separators are decorative. Items with `href` render as real links; without one they render as link-styled buttons emitting `itemClicked` \u2014 wire that to your router.',
944
944
  category: "components",
945
- version: "10.4.0",
945
+ version: "11.1.0",
946
946
  bindings: {
947
947
  angular: {
948
948
  importPath: "@uni-design-system/uni-angular",
@@ -1016,7 +1016,7 @@ var uni_index_default = {
1016
1016
  "breadcrumb.behavior.typeface",
1017
1017
  "breadcrumb.behavior.color",
1018
1018
  "breadcrumb.behavior.currentColor",
1019
- "breadcrumb.behavior.separatorSymbol",
1019
+ "breadcrumb.behavior.separatorIcon",
1020
1020
  "breadcrumb.behavior.gap"
1021
1021
  ]
1022
1022
  },
@@ -1027,7 +1027,7 @@ var uni_index_default = {
1027
1027
  summary: "",
1028
1028
  description: "",
1029
1029
  category: "primitives",
1030
- version: "10.4.0",
1030
+ version: "11.1.0",
1031
1031
  bindings: {
1032
1032
  angular: {
1033
1033
  importPath: "@uni-design-system/uni-angular",
@@ -1176,7 +1176,8 @@ var uni_index_default = {
1176
1176
  },
1177
1177
  relatedTokens: [
1178
1178
  "button.behavior.borderRadius",
1179
- "button.behavior.typeface"
1179
+ "button.behavior.typeface",
1180
+ "button.behavior.motion"
1180
1181
  ]
1181
1182
  },
1182
1183
  {
@@ -1186,7 +1187,7 @@ var uni_index_default = {
1186
1187
  summary: "",
1187
1188
  description: "",
1188
1189
  category: "primitives",
1189
- version: "10.4.0",
1190
+ version: "11.1.0",
1190
1191
  bindings: {
1191
1192
  angular: {
1192
1193
  importPath: "@uni-design-system/uni-angular",
@@ -1218,7 +1219,7 @@ var uni_index_default = {
1218
1219
  summary: "Inline month calendar: single-date or start\u2013end range selection, day markers (availability dots), min/max fences and disabled dates.",
1219
1220
  description: "Inline month calendar: single-date or start\u2013end range selection, day markers (availability dots), min/max fences and disabled dates. One tab stop with a roving-tabindex `role=\"grid\"`; every day is a real button named with its full date. Values are plain ISO strings (`'YYYY-MM-DD'`), never `Date` objects, so bindings are timezone-free and serializable. Selection and today colours come from the theme's `primary` role pair; geometry and glyphs come from the `calendar` theme entry.",
1220
1221
  category: "forms",
1221
- version: "10.4.0",
1222
+ version: "11.1.0",
1222
1223
  bindings: {
1223
1224
  angular: {
1224
1225
  importPath: "@uni-design-system/uni-angular",
@@ -1247,6 +1248,13 @@ var uni_index_default = {
1247
1248
  default: "false",
1248
1249
  description: ""
1249
1250
  },
1251
+ {
1252
+ name: "touch",
1253
+ kind: "output",
1254
+ type: "void",
1255
+ required: false,
1256
+ description: "Angular 22 marks the bound field touched through this output; the `touched` model above is bound inward by the directive and no longer propagates back out. Emitted wherever this control already decided the user was done with it."
1257
+ },
1250
1258
  {
1251
1259
  name: "invalid",
1252
1260
  kind: "input",
@@ -1438,8 +1446,8 @@ var uni_index_default = {
1438
1446
  "calendar.behavior.dayBorderRadius",
1439
1447
  "calendar.behavior.typeface",
1440
1448
  "calendar.behavior.gap",
1441
- "calendar.behavior.navPrevSymbol",
1442
- "calendar.behavior.navNextSymbol",
1449
+ "calendar.behavior.navPrevIcon",
1450
+ "calendar.behavior.navNextIcon",
1443
1451
  "calendar.behavior.weekdayFormat",
1444
1452
  "calendar.behavior.showOutsideDays",
1445
1453
  "calendar.behavior.todayStyle"
@@ -1452,7 +1460,7 @@ var uni_index_default = {
1452
1460
  summary: "Anchored coach-mark panel that dims the page and cuts a spotlight hole around its target.",
1453
1461
  description: 'Anchored coach-mark panel that dims the page and cuts a spotlight hole around its target. Both the scrim and the panel are `popover="manual"` elements shown in order, so they stack deterministically in the top layer above every app z-index, and every scrim piece is CSS-anchor-positioned to the target \u2014 the hole tracks scroll/resize/layout with zero listeners. The panel is a non-modal `role="dialog"` (deliberately no `aria-modal`): focus moves into it on open, Tab runs a "duet loop" over the panel\'s focusables plus the spotlit target while it stays interactive, and on close focus returns to the pre-open element \u2014 unless the user moved into the target, where it stays. Storage-free by rule: `key` and the `dismissed` output are the "don\'t show again" hooks; persistence is the app\'s business (e.g. cdk local-storage).',
1454
1462
  category: "components",
1455
- version: "10.4.0",
1463
+ version: "11.1.0",
1456
1464
  bindings: {
1457
1465
  angular: {
1458
1466
  importPath: "@uni-design-system/uni-angular",
@@ -1655,7 +1663,7 @@ var uni_index_default = {
1655
1663
  "callout.behavior.padding",
1656
1664
  "callout.behavior.headerTypeface",
1657
1665
  "callout.behavior.typeface",
1658
- "callout.behavior.closeSymbol",
1666
+ "callout.behavior.closeIcon",
1659
1667
  "callout.behavior.arrowSize",
1660
1668
  "callout.behavior.offset",
1661
1669
  "callout.behavior.scrimColor",
@@ -1672,7 +1680,7 @@ var uni_index_default = {
1672
1680
  summary: "",
1673
1681
  description: "",
1674
1682
  category: "layout",
1675
- version: "10.4.0",
1683
+ version: "11.1.0",
1676
1684
  bindings: {
1677
1685
  angular: {
1678
1686
  importPath: "@uni-design-system/uni-angular",
@@ -1734,7 +1742,7 @@ var uni_index_default = {
1734
1742
  summary: "",
1735
1743
  description: "",
1736
1744
  category: "layout",
1737
- version: "10.4.0",
1745
+ version: "11.1.0",
1738
1746
  bindings: {
1739
1747
  angular: {
1740
1748
  importPath: "@uni-design-system/uni-angular",
@@ -1775,7 +1783,7 @@ var uni_index_default = {
1775
1783
  summary: "",
1776
1784
  description: "",
1777
1785
  category: "layout",
1778
- version: "10.4.0",
1786
+ version: "11.1.0",
1779
1787
  bindings: {
1780
1788
  angular: {
1781
1789
  importPath: "@uni-design-system/uni-angular",
@@ -1832,7 +1840,7 @@ var uni_index_default = {
1832
1840
  summary: "",
1833
1841
  description: "",
1834
1842
  category: "layout",
1835
- version: "10.4.0",
1843
+ version: "11.1.0",
1836
1844
  bindings: {
1837
1845
  angular: {
1838
1846
  importPath: "@uni-design-system/uni-angular",
@@ -1887,7 +1895,7 @@ var uni_index_default = {
1887
1895
  summary: "",
1888
1896
  description: "",
1889
1897
  category: "forms",
1890
- version: "10.4.0",
1898
+ version: "11.1.0",
1891
1899
  bindings: {
1892
1900
  angular: {
1893
1901
  importPath: "@uni-design-system/uni-angular",
@@ -1917,6 +1925,13 @@ var uni_index_default = {
1917
1925
  default: "false",
1918
1926
  description: ""
1919
1927
  },
1928
+ {
1929
+ name: "touch",
1930
+ kind: "output",
1931
+ type: "void",
1932
+ required: false,
1933
+ description: "Angular 22 marks the bound field touched through this output; the `touched` model above is bound inward by the directive and no longer propagates back out. Emitted wherever this control already decided the user was done with it."
1934
+ },
1920
1935
  {
1921
1936
  name: "invalid",
1922
1937
  kind: "input",
@@ -2050,6 +2065,7 @@ var uni_index_default = {
2050
2065
  ]
2051
2066
  },
2052
2067
  relatedTokens: [
2068
+ "checkbox.behavior.motion",
2053
2069
  "checkbox.behavior.size",
2054
2070
  "checkbox.behavior.boxColor",
2055
2071
  "checkbox.behavior.borderRadius",
@@ -2063,7 +2079,7 @@ var uni_index_default = {
2063
2079
  summary: "Form-bound, closed-set, single-select autocomplete: `FormValueControl<T | null>` over object `Options<T>`, type-to-filter, commit-on-select.",
2064
2080
  description: "Form-bound, closed-set, single-select autocomplete: `FormValueControl<T | null>` over object `Options<T>`, type-to-filter, commit-on-select. Typing produces a draft \u2014 a filter, never a value; the value changes only when an option commits, `clear()` runs, or the model is written from outside. Select semantics, not search: a real label, a chevron, no magnifier, nothing submits. For short lists with no need to type, prefer `uni-select` \u2014 the value contract is identical, so swapping is a template-only change.",
2065
2081
  category: "forms",
2066
- version: "10.4.0",
2082
+ version: "11.1.0",
2067
2083
  bindings: {
2068
2084
  angular: {
2069
2085
  importPath: "@uni-design-system/uni-angular",
@@ -2093,6 +2109,13 @@ var uni_index_default = {
2093
2109
  default: "false",
2094
2110
  description: ""
2095
2111
  },
2112
+ {
2113
+ name: "touch",
2114
+ kind: "output",
2115
+ type: "void",
2116
+ required: false,
2117
+ description: "Angular 22 marks the bound field touched through this output; the `touched` model above is bound inward by the directive and no longer propagates back out. Emitted wherever this control already decided the user was done with it."
2118
+ },
2096
2119
  {
2097
2120
  name: "invalid",
2098
2121
  kind: "input",
@@ -2342,7 +2365,7 @@ emptyText="No countries found"
2342
2365
  summary: "",
2343
2366
  description: "",
2344
2367
  category: "feedback",
2345
- version: "10.4.0",
2368
+ version: "11.1.0",
2346
2369
  bindings: {
2347
2370
  angular: {
2348
2371
  importPath: "@uni-design-system/uni-angular",
@@ -2389,7 +2412,7 @@ emptyText="No countries found"
2389
2412
  summary: "",
2390
2413
  description: "",
2391
2414
  category: "forms",
2392
- version: "10.4.0",
2415
+ version: "11.1.0",
2393
2416
  bindings: {
2394
2417
  angular: {
2395
2418
  importPath: "@uni-design-system/uni-angular",
@@ -2488,7 +2511,7 @@ emptyText="No countries found"
2488
2511
  summary: "",
2489
2512
  description: "",
2490
2513
  category: "data",
2491
- version: "10.4.0",
2514
+ version: "11.1.0",
2492
2515
  bindings: {
2493
2516
  angular: {
2494
2517
  importPath: "@uni-design-system/uni-angular",
@@ -2728,7 +2751,7 @@ emptyText="No countries found"
2728
2751
  summary: "Date field with free-typed parsing and a popup calendar.",
2729
2752
  description: "Date field with free-typed parsing and a popup calendar. Type `aug 20`, `8/20/2026` or `2026-08-20`, or pick from the grid \u2014 the form gets the same canonical `'YYYY-MM-DD'` string either way. Parsing is `Intl`-driven (locale digit order and month names, never hardcoded); unreadable text stays in the field, flagged, with a `rejected` event. The popup is a native popover hosting the same `uni-calendar` an app could render inline.",
2730
2753
  category: "forms",
2731
- version: "10.4.0",
2754
+ version: "11.1.0",
2732
2755
  bindings: {
2733
2756
  angular: {
2734
2757
  importPath: "@uni-design-system/uni-angular",
@@ -2757,6 +2780,13 @@ emptyText="No countries found"
2757
2780
  default: "false",
2758
2781
  description: ""
2759
2782
  },
2783
+ {
2784
+ name: "touch",
2785
+ kind: "output",
2786
+ type: "void",
2787
+ required: false,
2788
+ description: "Angular 22 marks the bound field touched through this output; the `touched` model above is bound inward by the directive and no longer propagates back out. Emitted wherever this control already decided the user was done with it."
2789
+ },
2760
2790
  {
2761
2791
  name: "invalid",
2762
2792
  kind: "input",
@@ -2952,7 +2982,7 @@ emptyText="No countries found"
2952
2982
  summary: "One field for a date and a time: a thin composer seating a uni-date-input and a uni-time-input in one input-box chrome under one label, yielding one combined `'YYYY-MM-DDTHH:mm'` value.",
2953
2983
  description: "One field for a date and a time: a thin composer seating a uni-date-input and a uni-time-input in one input-box chrome under one label, yielding one combined `'YYYY-MM-DDTHH:mm'` value. The value emits only when both parts are set \u2014 a time without a day is not an answer \u2014 and clearing the date clears it. With `slotsFor`, the time part stays disabled until a day is chosen and offers exactly that day's slots: the scheduling flow in one attribute. Two honest tab stops (it is two questions); apps needing a different arrangement compose the primitives directly.",
2954
2984
  category: "forms",
2955
- version: "10.4.0",
2985
+ version: "11.1.0",
2956
2986
  bindings: {
2957
2987
  angular: {
2958
2988
  importPath: "@uni-design-system/uni-angular",
@@ -2981,6 +3011,13 @@ emptyText="No countries found"
2981
3011
  default: "false",
2982
3012
  description: ""
2983
3013
  },
3014
+ {
3015
+ name: "touch",
3016
+ kind: "output",
3017
+ type: "void",
3018
+ required: false,
3019
+ description: "Angular 22 marks the bound field touched through this output; the `touched` model above is bound inward by the directive and no longer propagates back out. Emitted wherever this control already decided the user was done with it."
3020
+ },
2984
3021
  {
2985
3022
  name: "invalid",
2986
3023
  kind: "input",
@@ -3138,7 +3175,7 @@ emptyText="No countries found"
3138
3175
  summary: "Text input that emits `change` only after the user pauses typing.",
3139
3176
  description: "Text input that emits `change` only after the user pauses typing. Wears the shared input chrome (themed color, border, typeface, focus ring) via `uni-input-box`; project adornments with the `pre-input` / `post-input` slots, matching `uni-input`'s convention. The ARIA passthrough inputs let a wrapping composite (e.g. SearchInput's combobox) annotate the real input element.",
3140
3177
  category: "forms",
3141
- version: "10.4.0",
3178
+ version: "11.1.0",
3142
3179
  bindings: {
3143
3180
  angular: {
3144
3181
  importPath: "@uni-design-system/uni-angular",
@@ -3286,7 +3323,7 @@ emptyText="No countries found"
3286
3323
  summary: "Modal dialog on the native `<dialog>` element, laid out as three rows: an optional `[dialog-header]`, the projected body, an optional `[dialog-buttons]`.",
3287
3324
  description: "Modal dialog on the native `<dialog>` element, laid out as three rows: an optional `[dialog-header]`, the projected body, an optional `[dialog-buttons]`. **The surface is never the scroll container.** It is a flex column that is `overflow: clip` on both axes; the header and buttons pin while only the body row scrolls. Unlike the drawer, which is deliberately viewport-tall, the dialog stays content-sized: it has no `height`, and grows until it hits `calc(100dvh - 2 x inset)` \u2014 the point at which the body starts to scroll. The theme's `padding` insets all three rows (which is what makes the default header read as a pill floating inside the surface); `bodyPadding` pads the scrolling row alone.",
3288
3325
  category: "feedback",
3289
- version: "10.4.0",
3326
+ version: "11.1.0",
3290
3327
  bindings: {
3291
3328
  angular: {
3292
3329
  importPath: "@uni-design-system/uni-angular",
@@ -3439,7 +3476,7 @@ uni-dialog
3439
3476
  summary: "",
3440
3477
  description: "",
3441
3478
  category: "feedback",
3442
- version: "10.4.0",
3479
+ version: "11.1.0",
3443
3480
  bindings: {
3444
3481
  angular: {
3445
3482
  importPath: "@uni-design-system/uni-angular",
@@ -3543,7 +3580,7 @@ uni-dialog
3543
3580
  summary: "",
3544
3581
  description: "",
3545
3582
  category: "feedback",
3546
- version: "10.4.0",
3583
+ version: "11.1.0",
3547
3584
  bindings: {
3548
3585
  angular: {
3549
3586
  importPath: "@uni-design-system/uni-angular",
@@ -3584,7 +3621,7 @@ uni-dialog
3584
3621
  summary: "",
3585
3622
  description: "",
3586
3623
  category: "layout",
3587
- version: "10.4.0",
3624
+ version: "11.1.0",
3588
3625
  bindings: {
3589
3626
  angular: {
3590
3627
  importPath: "@uni-design-system/uni-angular",
@@ -3640,7 +3677,7 @@ uni-dialog
3640
3677
  summary: "",
3641
3678
  description: "",
3642
3679
  category: "directives",
3643
- version: "10.4.0",
3680
+ version: "11.1.0",
3644
3681
  bindings: {
3645
3682
  angular: {
3646
3683
  importPath: "@uni-design-system/uni-angular",
@@ -3672,7 +3709,7 @@ uni-dialog
3672
3709
  summary: "Drawer with two modes sharing one three-row layout: - `side` \u2014 an in-flow `<aside>` that pushes content (dashboard sidenav); opening/closing animates its width, and the divider border primitive separates it from the page.",
3673
3710
  description: "Drawer with two modes sharing one three-row layout: - `side` \u2014 an in-flow `<aside>` that pushes content (dashboard sidenav); opening/closing animates its width, and the divider border primitive separates it from the page. - `over` \u2014 a native `<dialog>` in the top layer: focus trap, Escape and scrim backdrop come from the platform (same machinery as `uni-dialog`), sliding in from its edge. **The panel is never the scroll container.** It is a flex column of three rows \u2014 an optional `[uni-drawer-header]`, the projected body, an optional `[uni-drawer-buttons]` \u2014 and only the body scrolls. The panel itself is `overflow: clip` on both axes. That is what lets a header and a save bar pin while a long form scrolls between them, and it is why the theme's `padding` option lands on the body row rather than the panel: padding on a scrolling box scrolls away with its content. Surface, width, divider, elevation, padding, backdrop, scrim and background all resolve from `drawer` theme tokens.",
3674
3711
  category: "components",
3675
- version: "10.4.0",
3712
+ version: "11.1.0",
3676
3713
  bindings: {
3677
3714
  angular: {
3678
3715
  importPath: "@uni-design-system/uni-angular",
@@ -3863,7 +3900,7 @@ initialFocus="input"
3863
3900
  summary: "The drawer's pinned footer action row \u2014 the save bar of an editor panel.",
3864
3901
  description: "The drawer's pinned footer action row \u2014 the save bar of an editor panel. Sits outside the scrolling body, so the actions stay reachable however long the form is. Mirrors `[dialog-buttons]`; the difference is posture, which lives in the `drawerButtons` theme options rather than here.",
3865
3902
  category: "primitives",
3866
- version: "10.4.0",
3903
+ version: "11.1.0",
3867
3904
  bindings: {
3868
3905
  angular: {
3869
3906
  importPath: "@uni-design-system/uni-angular",
@@ -3960,7 +3997,7 @@ initialFocus="input"
3960
3997
  summary: "The drawer's pinned header row: a title, and optionally a close button.",
3961
3998
  description: "The drawer's pinned header row: a title, and optionally a close button. Sits outside the scrolling body, so it stays put while the form beneath it moves. Reached either by projecting it \u2014 `<div uni-drawer-header>` \u2014 or implicitly, by giving `uni-drawer` a `headline`, in which case the drawer renders one of these itself.",
3962
3999
  category: "components",
3963
- version: "10.4.0",
4000
+ version: "11.1.0",
3964
4001
  bindings: {
3965
4002
  angular: {
3966
4003
  importPath: "@uni-design-system/uni-angular",
@@ -4008,7 +4045,7 @@ initialFocus="input"
4008
4045
  summary: "",
4009
4046
  description: "",
4010
4047
  category: "components",
4011
- version: "10.4.0",
4048
+ version: "11.1.0",
4012
4049
  bindings: {
4013
4050
  angular: {
4014
4051
  importPath: "@uni-design-system/uni-angular",
@@ -4142,7 +4179,7 @@ initialFocus="input"
4142
4179
  summary: "",
4143
4180
  description: "",
4144
4181
  category: "layout",
4145
- version: "10.4.0",
4182
+ version: "11.1.0",
4146
4183
  bindings: {
4147
4184
  angular: {
4148
4185
  importPath: "@uni-design-system/uni-angular",
@@ -4246,7 +4283,7 @@ initialFocus="input"
4246
4283
  summary: "",
4247
4284
  description: "",
4248
4285
  category: "layout",
4249
- version: "10.4.0",
4286
+ version: "11.1.0",
4250
4287
  bindings: {
4251
4288
  angular: {
4252
4289
  importPath: "@uni-design-system/uni-angular",
@@ -4317,7 +4354,7 @@ initialFocus="input"
4317
4354
  summary: "Trigger for a {@link UniExpandComponent} region.",
4318
4355
  description: "Trigger for a {@link UniExpandComponent} region. Two shapes, chosen by whether `label` is set: - **Icon only** (default) \u2014 the bare chevron, sized for a Card Header. - **Labelled** \u2014 chevron plus a label and optional muted sublabel, as a single full-width button. Most real disclosures need a name for the section, and building that row by hand is the thing this saves; it also makes the label the button's accessible name rather than adjacent text.",
4319
4356
  category: "layout",
4320
- version: "10.4.0",
4357
+ version: "11.1.0",
4321
4358
  bindings: {
4322
4359
  angular: {
4323
4360
  importPath: "@uni-design-system/uni-angular",
@@ -4402,7 +4439,7 @@ initialFocus="input"
4402
4439
  summary: "",
4403
4440
  description: "",
4404
4441
  category: "forms",
4405
- version: "10.4.0",
4442
+ version: "11.1.0",
4406
4443
  bindings: {
4407
4444
  angular: {
4408
4445
  importPath: "@uni-design-system/uni-angular",
@@ -4560,7 +4597,7 @@ initialFocus="input"
4560
4597
  summary: "",
4561
4598
  description: "",
4562
4599
  category: "layout",
4563
- version: "10.4.0",
4600
+ version: "11.1.0",
4564
4601
  bindings: {
4565
4602
  angular: {
4566
4603
  importPath: "@uni-design-system/uni-angular",
@@ -4657,7 +4694,7 @@ initialFocus="input"
4657
4694
  summary: "",
4658
4695
  description: "",
4659
4696
  category: "layout",
4660
- version: "10.4.0",
4697
+ version: "11.1.0",
4661
4698
  bindings: {
4662
4699
  angular: {
4663
4700
  importPath: "@uni-design-system/uni-angular",
@@ -4689,7 +4726,7 @@ initialFocus="input"
4689
4726
  summary: "",
4690
4727
  description: "",
4691
4728
  category: "primitives",
4692
- version: "10.4.0",
4729
+ version: "11.1.0",
4693
4730
  bindings: {
4694
4731
  angular: {
4695
4732
  importPath: "@uni-design-system/uni-angular",
@@ -4749,7 +4786,7 @@ initialFocus="input"
4749
4786
  summary: "",
4750
4787
  description: "",
4751
4788
  category: "primitives",
4752
- version: "10.4.0",
4789
+ version: "11.1.0",
4753
4790
  bindings: {
4754
4791
  angular: {
4755
4792
  importPath: "@uni-design-system/uni-angular",
@@ -4845,6 +4882,121 @@ initialFocus="input"
4845
4882
  },
4846
4883
  relatedTokens: []
4847
4884
  },
4885
+ {
4886
+ id: "inline-button",
4887
+ name: "InlineButton",
4888
+ status: "stable",
4889
+ summary: "A button that lives inside a sentence.",
4890
+ description: "A button that lives inside a sentence. Every other button in the library owns a box. Even `ghost` is a flex box with a hit area, horizontal padding and a type scale of its own, so dropping one into a sentence takes it out of the run of text entirely. This one inherits that type \u2014 family, size, weight, line height and colour \u2014 and adds no padding, so a paragraph reads as one continuous run with an action in the middle of it. It is always a real `<button>`: it can *look* like a link (`underline`, `link`) without claiming to be navigation, so Enter and Space activate it and assistive tech announces a button rather than an unfollowable link. A glyph may sit alongside the label without disturbing that: it is sized in `em`, so it scales with the type it lands in rather than pinning a px size into someone else's paragraph. One limit comes from the element itself. Browsers blockify a `<button>` to `inline-block` whatever `display` it asks for, so the control is an atomic inline box: its own label wraps inside it, but the run cannot split across a line break the way the words around it do. `display: contents` would buy that at the cost of the button being focusable at all, which is not a trade worth making \u2014 keep labels to a few words, which is what an inline action wants anyway.",
4891
+ category: "primitives",
4892
+ version: "11.1.0",
4893
+ bindings: {
4894
+ angular: {
4895
+ importPath: "@uni-design-system/uni-angular",
4896
+ selectorOrTag: "button[uni-inline-button], button[inline-button]",
4897
+ api: [
4898
+ {
4899
+ name: "iconName",
4900
+ kind: "input",
4901
+ type: "IconName",
4902
+ required: false,
4903
+ description: "Theme icon token rendered beside the label. Prefer this over `symbolName`."
4904
+ },
4905
+ {
4906
+ name: "symbolName",
4907
+ kind: "input",
4908
+ type: "string",
4909
+ required: false,
4910
+ description: "Material Symbols ligature, for glyphs the theme's icon set doesn't carry."
4911
+ },
4912
+ {
4913
+ name: "iconPosition",
4914
+ kind: "input",
4915
+ type: "'start' | 'end'",
4916
+ required: false,
4917
+ default: "'start'",
4918
+ description: "Which side of the label the glyph sits on."
4919
+ },
4920
+ {
4921
+ name: "link",
4922
+ kind: "input",
4923
+ type: "unknown",
4924
+ required: false,
4925
+ default: "false, { transform: booleanAttribute }",
4926
+ description: "Paint the label with the theme's link colour instead of inheriting the ink."
4927
+ },
4928
+ {
4929
+ name: "disable",
4930
+ kind: "input",
4931
+ type: "unknown",
4932
+ required: false,
4933
+ default: "false, { transform: booleanAttribute }",
4934
+ description: ""
4935
+ },
4936
+ {
4937
+ name: "variant",
4938
+ kind: "input",
4939
+ type: "Variant",
4940
+ required: false,
4941
+ default: "'primary'",
4942
+ description: "Style archetype from the theme. Inherited from BaseComponent."
4943
+ },
4944
+ {
4945
+ name: "size",
4946
+ kind: "input",
4947
+ type: "Size",
4948
+ required: false,
4949
+ default: "'lg'",
4950
+ description: "Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block."
4951
+ }
4952
+ ]
4953
+ }
4954
+ },
4955
+ examples: [
4956
+ {
4957
+ title: "In Prose",
4958
+ framework: "angular",
4959
+ code: '<!-- Storybook story: In Prose -->\n<p uni-text="body-1-long" style="max-width: 46ch">\nYour data is processed under the terms you accepted at sign-up. You can\n<button inline-button [underline]="underline" [link]="link" [disable]="disable"\n [iconName]="iconName" [symbolName]="symbolName" [iconPosition]="iconPosition">review them</button>\nat any time, or\n<button inline-button [underline]="underline" [link]="link">export everything</button>\nas a single archive.\n</p>\n<!-- args:\n{ underline: true, link: true }\n-->'
4960
+ },
4961
+ {
4962
+ title: "Against A Ghost Button",
4963
+ framework: "angular",
4964
+ code: '<!-- Storybook story: Against A Ghost Button -->\n<div style="display: grid; gap: 16px; max-width: 46ch">\n<p uni-text="body-1-long">\n Inline button: read the <button inline-button underline>privacy policy</button> before continuing.\n</p>\n<p uni-text="body-1-long">\n Ghost button: read the <button text-button variant="ghost">privacy policy</button> before continuing.\n</p>\n</div>'
4965
+ },
4966
+ {
4967
+ title: "With A Glyph",
4968
+ framework: "angular",
4969
+ code: '<!-- Storybook story: With A Glyph -->\n<div style="display: grid; gap: 16px; max-width: 46ch">\n<p uni-text="body-1-long">\n Opens elsewhere:\n <button inline-button link underline iconName="externalLink" iconPosition="end">the full report</button>.\n</p>\n<p uni-text="caption">\n Same control at caption size:\n <button inline-button link underline iconName="externalLink" iconPosition="end">the full report</button>.\n</p>\n<p uni-text="headline-small">\n And in a headline:\n <button inline-button link underline iconName="externalLink" iconPosition="end">the full report</button>.\n</p>\n</div>'
4970
+ },
4971
+ {
4972
+ title: "Long Labels Stay Whole",
4973
+ framework: "angular",
4974
+ code: '<!-- Storybook story: Long Labels Stay Whole -->\n<div style="display: grid; gap: 16px; max-width: 20ch">\n<p uni-text="body-1-long">\n Short label: <button inline-button underline>review terms</button> whenever you like.\n</p>\n<p uni-text="body-1-long">\n Long label: <button inline-button underline>review the terms of processing</button> whenever you like.\n</p>\n</div>'
4975
+ }
4976
+ ],
4977
+ guidelines: {
4978
+ whenToUse: "An action that lives **inside a sentence**.\nEvery other button in the library owns a box. Even `ghost` is a flex box with a\nhit area, horizontal padding and its own type scale, so dropping one into a\nparagraph takes it out of the run of text and onto a line of its own. This one\nadds no box at all: it inherits the surrounding type \u2014 family, size, weight,\nline height, letter spacing and colour \u2014 and renders as part of the sentence.",
4979
+ dos: [
4980
+ "Use it for actions inside running text: opening a dialog, revealing a section, undoing the last change",
4981
+ "Keep the label to a few words, so it never has to wrap",
4982
+ "Pair `link` with `underline`, so the action is not marked by colour alone",
4983
+ "Write a label that says what the action does on its own \u2014 it is the accessible name"
4984
+ ],
4985
+ donts: [
4986
+ "Reach for it where a link belongs; if the thing goes somewhere, use an `<a>`",
4987
+ "Set a px size on the glyph \u2014 the `em` sizing is what lets one markup read correctly from caption to headline",
4988
+ "Leave it undecorated *and* turn `underlineOnHover` off, which hides the action entirely",
4989
+ "Use it as a primary action; a paragraph is not where a form's Submit lives"
4990
+ ],
4991
+ accessibility: [
4992
+ "A real `<button>`: native focus, Enter/Space activation and `disabled` semantics, so nothing has to be re-implemented with key handlers",
4993
+ "The focus ring is the library's shared ring, drawn on the control rather than on the paragraph, and `focusColor` retunes it per theme",
4994
+ "The glyph is decorative and hidden from assistive tech; the label carries the accessible name",
4995
+ "Underlining is a visual affordance only \u2014 do not rely on colour alone to mark the action"
4996
+ ]
4997
+ },
4998
+ relatedTokens: []
4999
+ },
4848
5000
  {
4849
5001
  id: "input",
4850
5002
  name: "Input",
@@ -4852,7 +5004,7 @@ initialFocus="input"
4852
5004
  summary: "",
4853
5005
  description: "",
4854
5006
  category: "forms",
4855
- version: "10.4.0",
5007
+ version: "11.1.0",
4856
5008
  bindings: {
4857
5009
  angular: {
4858
5010
  importPath: "@uni-design-system/uni-angular",
@@ -4882,6 +5034,13 @@ initialFocus="input"
4882
5034
  default: "false",
4883
5035
  description: ""
4884
5036
  },
5037
+ {
5038
+ name: "touch",
5039
+ kind: "output",
5040
+ type: "void",
5041
+ required: false,
5042
+ description: "Angular 22 marks the bound field touched through this output; the `touched` model above is bound inward by the directive and no longer propagates back out. Emitted wherever this control already decided the user was done with it."
5043
+ },
4885
5044
  {
4886
5045
  name: "invalid",
4887
5046
  kind: "input",
@@ -4953,19 +5112,19 @@ initialFocus="input"
4953
5112
  description: ""
4954
5113
  },
4955
5114
  {
4956
- name: "min",
5115
+ name: "minAttr",
4957
5116
  kind: "input",
4958
5117
  type: "number | undefined",
4959
5118
  required: false,
4960
- default: "undefined",
5119
+ default: "undefined, { alias: 'min' }",
4961
5120
  description: ""
4962
5121
  },
4963
5122
  {
4964
- name: "max",
5123
+ name: "maxAttr",
4965
5124
  kind: "input",
4966
5125
  type: "number | undefined",
4967
5126
  required: false,
4968
- default: "undefined",
5127
+ default: "undefined, { alias: 'max' }",
4969
5128
  description: ""
4970
5129
  },
4971
5130
  {
@@ -5130,7 +5289,7 @@ initialFocus="input"
5130
5289
  summary: "",
5131
5290
  description: "",
5132
5291
  category: "forms",
5133
- version: "10.4.0",
5292
+ version: "11.1.0",
5134
5293
  bindings: {
5135
5294
  angular: {
5136
5295
  importPath: "@uni-design-system/uni-angular",
@@ -5251,7 +5410,7 @@ initialFocus="input"
5251
5410
  summary: "",
5252
5411
  description: "",
5253
5412
  category: "components",
5254
- version: "10.4.0",
5413
+ version: "11.1.0",
5255
5414
  bindings: {
5256
5415
  angular: {
5257
5416
  importPath: "@uni-design-system/uni-angular",
@@ -5321,7 +5480,7 @@ initialFocus="input"
5321
5480
  summary: "",
5322
5481
  description: "",
5323
5482
  category: "layout",
5324
- version: "10.4.0",
5483
+ version: "11.1.0",
5325
5484
  bindings: {
5326
5485
  angular: {
5327
5486
  importPath: "@uni-design-system/uni-angular",
@@ -5425,7 +5584,7 @@ initialFocus="input"
5425
5584
  summary: "",
5426
5585
  description: "",
5427
5586
  category: "layout",
5428
- version: "10.4.0",
5587
+ version: "11.1.0",
5429
5588
  bindings: {
5430
5589
  angular: {
5431
5590
  importPath: "@uni-design-system/uni-angular",
@@ -5507,7 +5666,7 @@ initialFocus="input"
5507
5666
  summary: "",
5508
5667
  description: "",
5509
5668
  category: "forms",
5510
- version: "10.4.0",
5669
+ version: "11.1.0",
5511
5670
  bindings: {
5512
5671
  angular: {
5513
5672
  importPath: "@uni-design-system/uni-angular",
@@ -5601,7 +5760,7 @@ initialFocus="input"
5601
5760
  summary: "",
5602
5761
  description: "",
5603
5762
  category: "forms",
5604
- version: "10.4.0",
5763
+ version: "11.1.0",
5605
5764
  bindings: {
5606
5765
  angular: {
5607
5766
  importPath: "@uni-design-system/uni-angular",
@@ -5631,6 +5790,13 @@ initialFocus="input"
5631
5790
  default: "false",
5632
5791
  description: ""
5633
5792
  },
5793
+ {
5794
+ name: "touch",
5795
+ kind: "output",
5796
+ type: "void",
5797
+ required: false,
5798
+ description: "Angular 22 marks the bound field touched through this output; the `touched` model above is bound inward by the directive and no longer propagates back out. Emitted wherever this control already decided the user was done with it."
5799
+ },
5634
5800
  {
5635
5801
  name: "invalid",
5636
5802
  kind: "input",
@@ -5773,7 +5939,7 @@ initialFocus="input"
5773
5939
  summary: "",
5774
5940
  description: "",
5775
5941
  category: "feedback",
5776
- version: "10.4.0",
5942
+ version: "11.1.0",
5777
5943
  bindings: {
5778
5944
  angular: {
5779
5945
  importPath: "@uni-design-system/uni-angular",
@@ -6033,7 +6199,7 @@ initialFocus="input"
6033
6199
  summary: "",
6034
6200
  description: "",
6035
6201
  category: "feedback",
6036
- version: "10.4.0",
6202
+ version: "11.1.0",
6037
6203
  bindings: {
6038
6204
  angular: {
6039
6205
  importPath: "@uni-design-system/uni-angular",
@@ -6057,7 +6223,7 @@ initialFocus="input"
6057
6223
  summary: "Numeric field with locale-aware parsing, `Intl` formatting on commit, prefix/suffix adornments and steppers that hold to repeat.",
6058
6224
  description: 'Numeric field with locale-aware parsing, `Intl` formatting on commit, prefix/suffix adornments and steppers that hold to repeat. Not `<input type="number">`, and the first reason is a data-loss bug: per the HTML value sanitization algorithm, a number input whose text is not a valid floating-point number reports `value === \'\'`. Type `12,50` as most of Europe does, or paste `1,234.56` from a spreadsheet, and the app reads an empty field. This is `type="text"` with `role="spinbutton"`, which is the only way to keep the user\'s malformed text on screen and tell them about it. Chrome comes from `uni-input-box`, so error, disabled and focus states match every other field. All arithmetic runs on the cdk\'s exact decimal helpers.',
6059
6225
  category: "forms",
6060
- version: "10.4.0",
6226
+ version: "11.1.0",
6061
6227
  bindings: {
6062
6228
  angular: {
6063
6229
  importPath: "@uni-design-system/uni-angular",
@@ -6087,6 +6253,13 @@ initialFocus="input"
6087
6253
  default: "false",
6088
6254
  description: ""
6089
6255
  },
6256
+ {
6257
+ name: "touch",
6258
+ kind: "output",
6259
+ type: "void",
6260
+ required: false,
6261
+ description: "Angular 22 marks the bound field touched through this output; the `touched` model above is bound inward by the directive and no longer propagates back out. Emitted wherever this control already decided the user was done with it."
6262
+ },
6090
6263
  {
6091
6264
  name: "invalid",
6092
6265
  kind: "input",
@@ -6476,7 +6649,7 @@ initialFocus="input"
6476
6649
  summary: "Two linked numeric fields in one chrome, with one `{ start, end }` value \u2014 price filters, thresholds, tolerances.",
6477
6650
  description: "Two linked numeric fields in one chrome, with one `{ start, end }` value \u2014 price filters, thresholds, tolerances. `start`/`end` deliberately match `UniDateRange`, so the library has one range vocabulary, and they avoid colliding with the `min`/`max` **inputs**, which mean the fence rather than the value. It owns its commit path rather than nesting two `uni-number-input`s, because the two behaviours the spec asks for need *different* bounds: a stepper must be fenced at the other end, while a typed commit must reach the parent un-clamped so a backwards range can be swapped instead of destroyed. A child field applies one bound pair to both. The arithmetic, parsing and formatting are still the cdk's, shared with every other numeric control.",
6478
6651
  category: "forms",
6479
- version: "10.4.0",
6652
+ version: "11.1.0",
6480
6653
  bindings: {
6481
6654
  angular: {
6482
6655
  importPath: "@uni-design-system/uni-angular",
@@ -6506,6 +6679,13 @@ initialFocus="input"
6506
6679
  default: "false",
6507
6680
  description: ""
6508
6681
  },
6682
+ {
6683
+ name: "touch",
6684
+ kind: "output",
6685
+ type: "void",
6686
+ required: false,
6687
+ description: "Angular 22 marks the bound field touched through this output; the `touched` model above is bound inward by the directive and no longer propagates back out. Emitted wherever this control already decided the user was done with it."
6688
+ },
6509
6689
  {
6510
6690
  name: "invalid",
6511
6691
  kind: "input",
@@ -6633,17 +6813,19 @@ initialFocus="input"
6633
6813
  description: ""
6634
6814
  },
6635
6815
  {
6636
- name: "min",
6816
+ name: "minValue",
6637
6817
  kind: "input",
6638
6818
  type: "number | undefined",
6639
6819
  required: false,
6820
+ default: "undefined, { alias: 'min' }",
6640
6821
  description: ""
6641
6822
  },
6642
6823
  {
6643
- name: "max",
6824
+ name: "maxValue",
6644
6825
  kind: "input",
6645
6826
  type: "number | undefined",
6646
6827
  required: false,
6828
+ default: "undefined, { alias: 'max' }",
6647
6829
  description: ""
6648
6830
  },
6649
6831
  {
@@ -6698,17 +6880,17 @@ initialFocus="input"
6698
6880
  {
6699
6881
  title: "Primary",
6700
6882
  framework: "angular",
6701
- code: "<!-- Storybook story: Primary -->\n<!-- args:\n{\n label: 'Price range',\n currency: 'USD',\n min: 0,\n max: 5000,\n step: 10,\n value: { start: 200, end: 1500 },\n }\n-->"
6883
+ code: "<!-- Storybook story: Primary -->\n<!-- args:\n{\n label: 'Price range',\n currency: 'USD',\n minValue: 0,\n maxValue: 5000,\n step: 10,\n value: { start: 200, end: 1500 },\n }\n-->"
6702
6884
  },
6703
6885
  {
6704
6886
  title: "Price Filter",
6705
6887
  framework: "angular",
6706
- code: "<!-- Storybook story: Price Filter -->\n<!-- args:\n{\n label: 'Price range',\n currency: 'USD',\n min: 0,\n max: 5000,\n step: 10,\n value: { start: 200, end: 1500 },\n }\n-->"
6888
+ code: "<!-- Storybook story: Price Filter -->\n<!-- args:\n{\n label: 'Price range',\n currency: 'USD',\n minValue: 0,\n maxValue: 5000,\n step: 10,\n value: { start: 200, end: 1500 },\n }\n-->"
6707
6889
  },
6708
6890
  {
6709
6891
  title: "Minimum Gap",
6710
6892
  framework: "angular",
6711
- code: "<!-- Storybook story: Minimum Gap -->\n<!-- args:\n{ label: 'Temperature tolerance', suffix: '\xB0C', min: -20, max: 40, minGap: 5, value: { start: 5, end: 20 } }\n-->"
6893
+ code: "<!-- Storybook story: Minimum Gap -->\n<!-- args:\n{ label: 'Temperature tolerance', suffix: '\xB0C', minValue: -20, maxValue: 40, minGap: 5, value: { start: 5, end: 20 } }\n-->"
6712
6894
  },
6713
6895
  {
6714
6896
  title: "Open Ended",
@@ -6718,7 +6900,7 @@ initialFocus="input"
6718
6900
  {
6719
6901
  title: "Custom End Labels",
6720
6902
  framework: "angular",
6721
- code: "<!-- Storybook story: Custom End Labels -->\n<!-- args:\n{ label: 'Delivery window', suffix: ' days', startLabel: 'From', endLabel: 'To', min: 0, value: { start: 2, end: 7 } }\n-->"
6903
+ code: "<!-- Storybook story: Custom End Labels -->\n<!-- args:\n{ label: 'Delivery window', suffix: ' days', startLabel: 'From', endLabel: 'To', minValue: 0, value: { start: 2, end: 7 } }\n-->"
6722
6904
  },
6723
6905
  {
6724
6906
  title: "Disabled",
@@ -6758,7 +6940,7 @@ initialFocus="input"
6758
6940
  summary: "",
6759
6941
  description: "",
6760
6942
  category: "data",
6761
- version: "10.4.0",
6943
+ version: "11.1.0",
6762
6944
  bindings: {
6763
6945
  angular: {
6764
6946
  importPath: "@uni-design-system/uni-angular",
@@ -6859,7 +7041,7 @@ initialFocus="input"
6859
7041
  summary: "Anchored, top-layer panel on the native `popover` element \u2014 the browser owns positioning (CSS anchor positioning), stacking, and, in rich mode, light dismissal.",
6860
7042
  description: 'Anchored, top-layer panel on the native `popover` element \u2014 the browser owns positioning (CSS anchor positioning), stacking, and, in rich mode, light dismissal. Two modes share one implementation: - `rich` (default): a click-toggled disclosure. The projected `[trigger]` carries `aria-expanded`/`aria-controls`; with no trigger content the app drives `open` and no element claims controller ARIA. Focus stays on the trigger (APG disclosure) unless the panel marks an `[autofocus]` field, and returns to the trigger on close. - `tooltip`: hover/focus-triggered, `role="tooltip"` + `aria-describedby`, WCAG 1.4.13 dismissable/hoverable/persistent. Content must not contain focusable elements. Anchoring and control are separate: `anchor` re-anchors the panel to any element (or id) while the trigger keeps the disclosure semantics.',
6861
7043
  category: "layout",
6862
- version: "10.4.0",
7044
+ version: "11.1.0",
6863
7045
  bindings: {
6864
7046
  angular: {
6865
7047
  importPath: "@uni-design-system/uni-angular",
@@ -7036,7 +7218,7 @@ initialFocus="input"
7036
7218
  "popover.behavior.maxWidth",
7037
7219
  "popover.behavior.offset",
7038
7220
  "popover.behavior.arrowSize",
7039
- "popover.behavior.closeSymbol",
7221
+ "popover.behavior.closeIcon",
7040
7222
  "popover.behavior.headerTypeface",
7041
7223
  "popover.behavior.tooltipPadding",
7042
7224
  "popover.behavior.tooltipOpenDelay",
@@ -7051,7 +7233,7 @@ initialFocus="input"
7051
7233
  summary: "",
7052
7234
  description: "",
7053
7235
  category: "feedback",
7054
- version: "10.4.0",
7236
+ version: "11.1.0",
7055
7237
  bindings: {
7056
7238
  angular: {
7057
7239
  importPath: "@uni-design-system/uni-angular",
@@ -7115,7 +7297,7 @@ initialFocus="input"
7115
7297
  summary: "",
7116
7298
  description: "",
7117
7299
  category: "feedback",
7118
- version: "10.4.0",
7300
+ version: "11.1.0",
7119
7301
  bindings: {
7120
7302
  angular: {
7121
7303
  importPath: "@uni-design-system/uni-angular",
@@ -7187,7 +7369,7 @@ initialFocus="input"
7187
7369
  summary: "`\u2212 3 +` for cart lines, table cells and seat counts: the numeric core with no field chrome, no label and no room for either.",
7188
7370
  description: '`\u2212 3 +` for cart lines, table cells and seat counts: the numeric core with no field chrome, no label and no room for either. A separate component rather than a `chrome="bare"` flag on `uni-number-input`, because this control is defined by what it does *not* have \u2014 presets, affixes, expressions, four stepper layouts \u2014 and eight inputs are easier to write correctly than forty with a list of which ones to leave alone. The arithmetic, parsing and hold-to-repeat are the cdk\'s, shared with the field, so `1,200` and the keyboard map behave identically in both. The middle stays a real input by default: typing `12` beats tapping `+` eleven times. `editable=false` is for read-mostly tables.',
7189
7371
  category: "forms",
7190
- version: "10.4.0",
7372
+ version: "11.1.0",
7191
7373
  bindings: {
7192
7374
  angular: {
7193
7375
  importPath: "@uni-design-system/uni-angular",
@@ -7217,6 +7399,13 @@ initialFocus="input"
7217
7399
  default: "false",
7218
7400
  description: ""
7219
7401
  },
7402
+ {
7403
+ name: "touch",
7404
+ kind: "output",
7405
+ type: "void",
7406
+ required: false,
7407
+ description: "Angular 22 marks the bound field touched through this output; the `touched` model above is bound inward by the directive and no longer propagates back out. Emitted wherever this control already decided the user was done with it."
7408
+ },
7220
7409
  {
7221
7410
  name: "invalid",
7222
7411
  kind: "input",
@@ -7383,7 +7572,7 @@ initialFocus="input"
7383
7572
  summary: "",
7384
7573
  description: "",
7385
7574
  category: "forms",
7386
- version: "10.4.0",
7575
+ version: "11.1.0",
7387
7576
  bindings: {
7388
7577
  angular: {
7389
7578
  importPath: "@uni-design-system/uni-angular",
@@ -7413,6 +7602,13 @@ initialFocus="input"
7413
7602
  default: "false",
7414
7603
  description: ""
7415
7604
  },
7605
+ {
7606
+ name: "touch",
7607
+ kind: "output",
7608
+ type: "void",
7609
+ required: false,
7610
+ description: "Angular 22 marks the bound field touched through this output; the `touched` model above is bound inward by the directive and no longer propagates back out. Emitted wherever this control already decided the user was done with it."
7611
+ },
7416
7612
  {
7417
7613
  name: "invalid",
7418
7614
  kind: "input",
@@ -7574,7 +7770,7 @@ initialFocus="input"
7574
7770
  summary: "",
7575
7771
  description: "",
7576
7772
  category: "directives",
7577
- version: "10.4.0",
7773
+ version: "11.1.0",
7578
7774
  bindings: {
7579
7775
  angular: {
7580
7776
  importPath: "@uni-design-system/uni-angular",
@@ -7598,7 +7794,7 @@ initialFocus="input"
7598
7794
  summary: "",
7599
7795
  description: "",
7600
7796
  category: "layout",
7601
- version: "10.4.0",
7797
+ version: "11.1.0",
7602
7798
  bindings: {
7603
7799
  angular: {
7604
7800
  importPath: "@uni-design-system/uni-angular",
@@ -7653,7 +7849,7 @@ initialFocus="input"
7653
7849
  summary: "Native scroll area with theme-driven scrollbar styling.",
7654
7850
  description: "Native scroll area with theme-driven scrollbar styling. Scrollbars are styled entirely through Emotion-generated CSS: `::-webkit-scrollbar` rules cover Chromium/Safari, with a `scrollbar-width`/`scrollbar-color` fallback for Firefox.",
7655
7851
  category: "layout",
7656
- version: "10.4.0",
7852
+ version: "11.1.0",
7657
7853
  bindings: {
7658
7854
  angular: {
7659
7855
  importPath: "@uni-design-system/uni-angular",
@@ -7800,7 +7996,7 @@ initialFocus="input"
7800
7996
  summary: "Generic search field: shared input chrome with a leading magnifier, a clear button while there's a query, Enter to submit, and optional type-ahead \u2014 pass `suggestions` (refresh them from `change`) and the field becomes an ARIA combobox with a keyboard-navigable listbox.",
7801
7997
  description: "Generic search field: shared input chrome with a leading magnifier, a clear button while there's a query, Enter to submit, and optional type-ahead \u2014 pass `suggestions` (refresh them from `change`) and the field becomes an ARIA combobox with a keyboard-navigable listbox. Escape closes the list first, then clears the query.",
7802
7998
  category: "forms",
7803
- version: "10.4.0",
7999
+ version: "11.1.0",
7804
8000
  bindings: {
7805
8001
  angular: {
7806
8002
  importPath: "@uni-design-system/uni-angular",
@@ -7927,7 +8123,7 @@ initialFocus="input"
7927
8123
  summary: "",
7928
8124
  description: "",
7929
8125
  category: "forms",
7930
- version: "10.4.0",
8126
+ version: "11.1.0",
7931
8127
  bindings: {
7932
8128
  angular: {
7933
8129
  importPath: "@uni-design-system/uni-angular",
@@ -8084,7 +8280,11 @@ initialFocus="input"
8084
8280
  "Disabled options are rendered and announced, not hidden \u2014 removing them would"
8085
8281
  ]
8086
8282
  },
8087
- relatedTokens: []
8283
+ relatedTokens: [
8284
+ "select.behavior.toggleIcon",
8285
+ "select.behavior.toggleColor",
8286
+ "select.behavior.toggleSize"
8287
+ ]
8088
8288
  },
8089
8289
  {
8090
8290
  id: "skeleton",
@@ -8093,7 +8293,7 @@ initialFocus="input"
8093
8293
  summary: "Loading placeholder painted with surface tokens.",
8094
8294
  description: "Loading placeholder painted with surface tokens. `text` renders one or more lines (the last line shortened, as real text would be), `rect` and `circle` render fixed shapes. The shimmer only animates when the user allows motion; it degrades to static blocks under `prefers-reduced-motion`. Color and radius are theme options with per-instance overrides, because one app routinely needs several: skeletons on a card and on the page background want different tints, and a pill placeholder wants a different corner than the text bars beside it.",
8095
8295
  category: "components",
8096
- version: "10.4.0",
8296
+ version: "11.1.0",
8097
8297
  bindings: {
8098
8298
  angular: {
8099
8299
  importPath: "@uni-design-system/uni-angular",
@@ -8244,7 +8444,7 @@ initialFocus="input"
8244
8444
  summary: "Bounded numeric input by pointer, for values where the *position* is the information: volume, opacity, weightings, price filters.",
8245
8445
  description: "Bounded numeric input by pointer, for values where the *position* is the information: volume, opacity, weightings, price filters. Custom thumbs rather than `<input type=\"range\">`, which the previous version used: one native range input cannot carry two thumbs, marks or a tooltip, and a second component for the range case would mean two keyboard maps to keep in step. The step model and the keyboard map are the cdk's, shared with the numeric fields, so nothing new is learned moving between them. All arithmetic on values runs through the cdk's exact decimal helpers \u2014 stepping `0.1` never yields `0.30000000000000004`. Only pointer *positions* use floats, and they are snapped to the grid before becoming a value.",
8246
8446
  category: "forms",
8247
- version: "10.4.0",
8447
+ version: "11.1.0",
8248
8448
  bindings: {
8249
8449
  angular: {
8250
8450
  importPath: "@uni-design-system/uni-angular",
@@ -8274,6 +8474,13 @@ initialFocus="input"
8274
8474
  default: "false",
8275
8475
  description: ""
8276
8476
  },
8477
+ {
8478
+ name: "touch",
8479
+ kind: "output",
8480
+ type: "void",
8481
+ required: false,
8482
+ description: "Angular 22 marks the bound field touched through this output; the `touched` model above is bound inward by the directive and no longer propagates back out. Emitted wherever this control already decided the user was done with it."
8483
+ },
8277
8484
  {
8278
8485
  name: "invalid",
8279
8486
  kind: "input",
@@ -8323,7 +8530,7 @@ initialFocus="input"
8323
8530
  {
8324
8531
  name: "min",
8325
8532
  kind: "input",
8326
- type: "number | undefined",
8533
+ type: "number | UniNumberRange | undefined",
8327
8534
  required: false,
8328
8535
  default: "0",
8329
8536
  description: ""
@@ -8331,7 +8538,7 @@ initialFocus="input"
8331
8538
  {
8332
8539
  name: "max",
8333
8540
  kind: "input",
8334
- type: "number | undefined",
8541
+ type: "number | UniNumberRange | undefined",
8335
8542
  required: false,
8336
8543
  default: "100",
8337
8544
  description: ""
@@ -8501,7 +8708,7 @@ initialFocus="input"
8501
8708
  "slider.behavior.tooltipTextColor",
8502
8709
  "slider.behavior.tooltipShadow",
8503
8710
  "slider.behavior.tooltipBorderRadius",
8504
- "slider.behavior.transitionMs"
8711
+ "slider.behavior.motion"
8505
8712
  ]
8506
8713
  },
8507
8714
  {
@@ -8511,7 +8718,7 @@ initialFocus="input"
8511
8718
  summary: "",
8512
8719
  description: "",
8513
8720
  category: "feedback",
8514
- version: "10.4.0",
8721
+ version: "11.1.0",
8515
8722
  bindings: {
8516
8723
  angular: {
8517
8724
  importPath: "@uni-design-system/uni-angular",
@@ -8623,7 +8830,7 @@ initialFocus="input"
8623
8830
  summary: "",
8624
8831
  description: "",
8625
8832
  category: "data",
8626
- version: "10.4.0",
8833
+ version: "11.1.0",
8627
8834
  bindings: {
8628
8835
  angular: {
8629
8836
  importPath: "@uni-design-system/uni-angular",
@@ -8682,7 +8889,7 @@ initialFocus="input"
8682
8889
  summary: "",
8683
8890
  description: "",
8684
8891
  category: "layout",
8685
- version: "10.4.0",
8892
+ version: "11.1.0",
8686
8893
  bindings: {
8687
8894
  angular: {
8688
8895
  importPath: "@uni-design-system/uni-angular",
@@ -8737,7 +8944,7 @@ initialFocus="input"
8737
8944
  summary: 'KPI stat tile: muted label, large value (numbers auto-compact: 48234 \u2192 "48.2K"), an optional delta whose ink is decided by *direction \xD7 whether up is good* (never direction alone \u2014 churn going down is good news), and an optional decorative sparkline.',
8738
8945
  description: 'KPI stat tile: muted label, large value (numbers auto-compact: 48234 \u2192 "48.2K"), an optional delta whose ink is decided by *direction \xD7 whether up is good* (never direction alone \u2014 churn going down is good news), and an optional decorative sparkline. Frame, typography and inks are all `stat` theme tokens.',
8739
8946
  category: "components",
8740
- version: "10.4.0",
8947
+ version: "11.1.0",
8741
8948
  bindings: {
8742
8949
  angular: {
8743
8950
  importPath: "@uni-design-system/uni-angular",
@@ -8855,7 +9062,7 @@ initialFocus="input"
8855
9062
  summary: "",
8856
9063
  description: "",
8857
9064
  category: "primitives",
8858
- version: "10.4.0",
9065
+ version: "11.1.0",
8859
9066
  bindings: {
8860
9067
  angular: {
8861
9068
  importPath: "@uni-design-system/uni-angular",
@@ -8944,7 +9151,7 @@ initialFocus="input"
8944
9151
  summary: "One tab inside `uni-tabs`: a label for the tablist plus projected panel content.",
8945
9152
  description: "One tab inside `uni-tabs`: a label for the tablist plus projected panel content. Content is captured in a template and only instantiated while the tab is selected, so inactive panels cost nothing.",
8946
9153
  category: "components",
8947
- version: "10.4.0",
9154
+ version: "11.1.0",
8948
9155
  bindings: {
8949
9156
  angular: {
8950
9157
  importPath: "@uni-design-system/uni-angular",
@@ -8984,7 +9191,7 @@ initialFocus="input"
8984
9191
  summary: "WAI-ARIA tabs: roving tabindex, automatic activation (arrow keys move focus and select), Home/End, disabled tabs skipped.",
8985
9192
  description: "WAI-ARIA tabs: roving tabindex, automatic activation (arrow keys move focus and select), Home/End, disabled tabs skipped. Only the selected panel is instantiated. All styling resolves from `tabs` theme option tokens.",
8986
9193
  category: "components",
8987
- version: "10.4.0",
9194
+ version: "11.1.0",
8988
9195
  bindings: {
8989
9196
  angular: {
8990
9197
  importPath: "@uni-design-system/uni-angular",
@@ -9046,6 +9253,7 @@ initialFocus="input"
9046
9253
  ]
9047
9254
  },
9048
9255
  relatedTokens: [
9256
+ "tabs.behavior.motion",
9049
9257
  "tabs.behavior.typeface",
9050
9258
  "tabs.behavior.textColor",
9051
9259
  "tabs.behavior.activeTextColor",
@@ -9062,9 +9270,9 @@ initialFocus="input"
9062
9270
  name: "Tag",
9063
9271
  status: "stable",
9064
9272
  summary: "Compact chip for categories, states, filters and tokens.",
9065
- description: "Compact chip for categories, states, filters and tokens. Two orthogonal style axes: `variant` picks the colour role and `tone` picks the archetype (soft / solid / outline). Both live in the theme's `tag` entry, so a theme restyles every chip in the app without touching markup. Structurally a chip is **body + trailing action as siblings**, never nested buttons: an interactive chip whose body is a `<button>` cannot contain the remove `<button>` (invalid HTML, and the inner control becomes unreachable for keyboard users). Both stay independently operable.",
9273
+ description: "Compact chip for categories, states, filters and tokens. Two orthogonal style axes: `variant` picks the colour role and `tone` picks the archetype (soft / solid / outline). Both live in the theme's `tag` entry, so a theme restyles every chip in the app without touching markup. Two state classes ride alongside the tone class for the same reason: `tag-selected` and `tag-interactive` let the theme paint selection and hover beside the colours they belong to, instead of an app swapping `tone` by hand on every chip. Structurally a chip is **body + trailing action as siblings**, never nested buttons: an interactive chip whose body is a `<button>` cannot contain the remove `<button>` (invalid HTML, and the inner control becomes unreachable for keyboard users). Both stay independently operable.",
9066
9274
  category: "data",
9067
- version: "10.4.0",
9275
+ version: "11.1.0",
9068
9276
  bindings: {
9069
9277
  angular: {
9070
9278
  importPath: "@uni-design-system/uni-angular",
@@ -9096,7 +9304,7 @@ initialFocus="input"
9096
9304
  {
9097
9305
  name: "value",
9098
9306
  kind: "input",
9099
- type: "string | number",
9307
+ type: "T",
9100
9308
  required: false,
9101
9309
  description: ""
9102
9310
  },
@@ -9196,19 +9404,19 @@ initialFocus="input"
9196
9404
  type: "number",
9197
9405
  required: false,
9198
9406
  default: "0",
9199
- description: "Tab position of the chip's controls. A composite that owns its own roving focus \u2014 `uni-tag-input`, where the whole field is one tab stop \u2014 passes `-1` so Tab does not walk through every chip to reach the next control."
9407
+ description: "Tab position of the chip's controls. A composite that owns its own roving focus \u2014 `uni-tag-input` or `uni-tag-group`, where the whole thing is one tab stop \u2014 passes `-1` so Tab does not walk through every chip to reach the next control."
9200
9408
  },
9201
9409
  {
9202
9410
  name: "removed",
9203
9411
  kind: "output",
9204
- type: "UniTagValue",
9412
+ type: "T | undefined",
9205
9413
  required: false,
9206
9414
  description: ""
9207
9415
  },
9208
9416
  {
9209
9417
  name: "activated",
9210
9418
  kind: "output",
9211
- type: "UniTagValue",
9419
+ type: "T | undefined",
9212
9420
  required: false,
9213
9421
  description: ""
9214
9422
  },
@@ -9311,7 +9519,25 @@ initialFocus="input"
9311
9519
  }
9312
9520
  </div>
9313
9521
  <!-- args:
9314
- { interactive: true, selected: true, tone: 'solid' }
9522
+ { interactive: true, selected: true }
9523
+ -->`
9524
+ },
9525
+ {
9526
+ title: "Toggles",
9527
+ framework: "angular",
9528
+ code: `<!-- Storybook story: Toggles -->
9529
+ <div row-layout gap="sm" alignItems="center" style="flex-wrap:wrap">
9530
+ @for (facet of ['Design', 'Engineering', 'Legal', 'Finance']; track facet) {
9531
+ <uni-tag
9532
+ [interactive]="true"
9533
+ [label]="facet"
9534
+ [selected]="picked.includes(facet)"
9535
+ (activated)="toggle(facet)"
9536
+ />
9537
+ }
9538
+ </div>
9539
+ <!-- args:
9540
+ { label: 'nope@@x', invalid: true, removable: true, variant: 'warn' }
9315
9541
  -->`
9316
9542
  },
9317
9543
  {
@@ -9402,6 +9628,7 @@ initialFocus="input"
9402
9628
  "A static tag is **text, not a widget**: no role, no tab stop. Screen readers",
9403
9629
  "`removable` adds one real `<button>` named `Remove {label}`, overridable with",
9404
9630
  '`interactive` makes the body a `<button type="button">`; `selected` maps to',
9631
+ "`controlTabIndex` lets a composite that owns its own roving focus \u2014",
9405
9632
  "Icons, avatars, initials and dots are `aria-hidden` \u2014 the chip's text is its",
9406
9633
  "`invalid` sets `aria-invalid` and adds a non-colour cue."
9407
9634
  ]
@@ -9411,134 +9638,342 @@ initialFocus="input"
9411
9638
  "tag.behavior.typeface",
9412
9639
  "tag.behavior.gap",
9413
9640
  "tag.behavior.removeIcon",
9414
- "tag.behavior.selectedIcon"
9641
+ "tag.behavior.selectedIcon",
9642
+ "tag.behavior.motion",
9643
+ "tag.behavior.endInset"
9415
9644
  ]
9416
9645
  },
9417
9646
  {
9418
- id: "tag-input",
9419
- name: "TagInput",
9647
+ id: "tag-group",
9648
+ name: "TagGroup",
9420
9649
  status: "stable",
9421
- summary: "",
9422
- description: "",
9423
- category: "forms",
9424
- version: "10.4.0",
9650
+ summary: "A row of chips the user picks from: filters, facets, a set of labels.",
9651
+ description: "A row of chips the user picks from: filters, facets, a set of labels. The group **renders its own chips** from `items` rather than projecting them. That is what lets it own the things an app was otherwise wiring per chip \u2014 which one is selected, which one holds the tab stop \u2014 since a parent cannot write a projected child's inputs. `uni-tag` is unchanged by this component; `controlTabIndex` was already its hook for a composite that manages focus. Keyboard model is the toolbar pattern: one tab stop for the whole group, and the arrow keys move within it. Twelve filter chips should cost one Tab to pass, not twelve.",
9652
+ category: "data",
9653
+ version: "11.1.0",
9425
9654
  bindings: {
9426
9655
  angular: {
9427
9656
  importPath: "@uni-design-system/uni-angular",
9428
- selectorOrTag: "uni-tag-input",
9657
+ selectorOrTag: "uni-tag-group",
9429
9658
  api: [
9430
9659
  {
9431
- name: "value",
9432
- kind: "model",
9433
- type: "UniTagItem[]",
9660
+ name: "items",
9661
+ kind: "input",
9662
+ type: "readonly UniTagGroupItem<T>[]",
9434
9663
  required: false,
9435
9664
  default: "[]",
9436
9665
  description: ""
9437
9666
  },
9438
9667
  {
9439
- name: "disabled",
9668
+ name: "layout",
9440
9669
  kind: "input",
9441
- type: "boolean",
9442
- required: false,
9443
- default: "false",
9444
- description: ""
9445
- },
9446
- {
9447
- name: "touched",
9448
- kind: "model",
9449
- type: "boolean",
9670
+ type: "'wrap' | 'justify'",
9450
9671
  required: false,
9451
- default: "false",
9452
- description: ""
9672
+ default: "'wrap'",
9673
+ description: "`wrap` lets chips keep their natural widths. `justify` stretches each filled row flush to both edges, leaving the last row ragged; chips put the extra width around their labels, so tucked leads and remove controls stay tucked."
9453
9674
  },
9454
9675
  {
9455
- name: "invalid",
9676
+ name: "multiple",
9456
9677
  kind: "input",
9457
9678
  type: "boolean",
9458
9679
  required: false,
9459
9680
  default: "false",
9460
- description: ""
9681
+ description: "Allow more than one chip at a time. Single select replaces instead."
9461
9682
  },
9462
9683
  {
9463
- name: "dirty",
9464
- kind: "input",
9465
- type: "boolean",
9684
+ name: "value",
9685
+ kind: "model",
9686
+ type: "T[]",
9466
9687
  required: false,
9467
- default: "false",
9468
- description: ""
9688
+ default: "[]",
9689
+ description: "The selected values \u2014 one array in both modes, as `uni-tag-input` keeps one array for its items. Single select simply never holds more than one, which spares callers a `T[] | T | null` union at every call site."
9469
9690
  },
9470
9691
  {
9471
- name: "required",
9472
- kind: "input",
9473
- type: "boolean",
9692
+ name: "activated",
9693
+ kind: "output",
9694
+ type: "T | undefined",
9474
9695
  required: false,
9475
- default: "false",
9476
- description: ""
9696
+ description: "The chip the user just activated, selected or deselected."
9477
9697
  },
9478
9698
  {
9479
- name: "ariaDescribedBy",
9480
- kind: "input",
9481
- type: "string",
9699
+ name: "removed",
9700
+ kind: "output",
9701
+ type: "T | undefined",
9482
9702
  required: false,
9483
9703
  description: ""
9484
9704
  },
9485
9705
  {
9486
- name: "label",
9487
- kind: "input",
9488
- type: "string",
9489
- required: true,
9490
- description: 'Accessible name for the field, e.g. "To".'
9491
- },
9492
- {
9493
- name: "placeholder",
9706
+ name: "chipTone",
9494
9707
  kind: "input",
9495
- type: "string",
9708
+ type: "TagTone | undefined",
9496
9709
  required: false,
9710
+ default: "undefined",
9497
9711
  description: ""
9498
9712
  },
9499
9713
  {
9500
- name: "preset",
9501
- kind: "input",
9502
- type: "'text' | 'email'",
9503
- required: false,
9504
- default: "'text'",
9505
- description: "`email` wires an address validator, paste parser and space separator."
9506
- },
9507
- {
9508
- name: "separators",
9714
+ name: "chipSize",
9509
9715
  kind: "input",
9510
- type: "string[]",
9716
+ type: "Size | undefined",
9511
9717
  required: false,
9512
- default: "[',', ';']",
9718
+ default: "undefined",
9513
9719
  description: ""
9514
9720
  },
9515
9721
  {
9516
- name: "commitOnBlur",
9722
+ name: "chipVariant",
9517
9723
  kind: "input",
9518
- type: "boolean",
9724
+ type: "Variant | undefined",
9519
9725
  required: false,
9520
- default: "true",
9726
+ default: "undefined",
9521
9727
  description: ""
9522
9728
  },
9523
9729
  {
9524
- name: "allowDuplicates",
9730
+ name: "variant",
9525
9731
  kind: "input",
9526
- type: "boolean",
9732
+ type: "Variant",
9527
9733
  required: false,
9528
- default: "false",
9529
- description: ""
9734
+ default: "'primary'",
9735
+ description: "Style archetype from the theme. Inherited from BaseComponent."
9530
9736
  },
9531
9737
  {
9532
- name: "max",
9738
+ name: "size",
9533
9739
  kind: "input",
9534
- type: "number",
9740
+ type: "Size",
9535
9741
  required: false,
9536
- description: ""
9537
- },
9538
- {
9539
- name: "tagVariant",
9540
- kind: "input",
9541
- type: "Variant",
9742
+ default: "'lg'",
9743
+ description: "Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block."
9744
+ }
9745
+ ]
9746
+ }
9747
+ },
9748
+ examples: [
9749
+ {
9750
+ title: "Wrap",
9751
+ framework: "angular",
9752
+ code: `<!-- Storybook story: Wrap -->
9753
+ <div style="max-width: 520px">
9754
+ <uni-tag-group
9755
+ [items]="items"
9756
+ [value]="value"
9757
+ [multiple]="multiple"
9758
+ layout="justify"
9759
+ />
9760
+ </div>
9761
+ <!-- args:
9762
+ { value: ['engineering'] }
9763
+ -->`
9764
+ },
9765
+ {
9766
+ title: "Justify",
9767
+ framework: "angular",
9768
+ code: `<!-- Storybook story: Justify -->
9769
+ <div style="max-width: 520px">
9770
+ <uni-tag-group
9771
+ [items]="items"
9772
+ [value]="value"
9773
+ [multiple]="multiple"
9774
+ layout="justify"
9775
+ />
9776
+ </div>
9777
+ <!-- args:
9778
+ { layout: 'justify', value: ['design', 'security'] }
9779
+ -->`
9780
+ },
9781
+ {
9782
+ title: "Single Select",
9783
+ framework: "angular",
9784
+ code: `<!-- Storybook story: Single Select -->
9785
+ <div style="max-width: 520px">
9786
+ <uni-tag-group
9787
+ [items]="items"
9788
+ [value]="value"
9789
+ [multiple]="multiple"
9790
+ layout="justify"
9791
+ />
9792
+ </div>
9793
+ <!-- args:
9794
+ { multiple: false, value: ['legal'] }
9795
+ -->`
9796
+ },
9797
+ {
9798
+ title: "Mixed Chips",
9799
+ framework: "angular",
9800
+ code: `<!-- Storybook story: Mixed Chips -->
9801
+ <div style="max-width: 520px">
9802
+ <uni-tag-group
9803
+ [items]="items"
9804
+ [value]="value"
9805
+ [multiple]="multiple"
9806
+ layout="justify"
9807
+ />
9808
+ </div>
9809
+ <!-- args:
9810
+ {
9811
+ items: [
9812
+ { label: 'Starred', value: 'starred', iconName: 'star' },
9813
+ { label: 'Live', value: 'live', dot: true, variant: 'success' },
9814
+ { label: 'Alice Chen', value: 'alice', avatarName: 'Alice Chen' },
9815
+ { label: 'Blocked', value: 'blocked', variant: 'warn', tone: 'outline' },
9816
+ { label: 'Archived', value: 'archived', disabled: true },
9817
+ { label: 'Custom', value: 'custom', removable: true },
9818
+ ],
9819
+ }
9820
+ -->`
9821
+ }
9822
+ ],
9823
+ guidelines: {
9824
+ whenToUse: "A row of chips the user picks from: filters, facets, a set of labels. The group\nowns the two things an app was otherwise wiring on every chip \u2014 **which one is\nselected** and **which one holds the tab stop**.",
9825
+ dos: [
9826
+ "Give the group `multiple` when the filters combine, and leave it off when they",
9827
+ 'Reach for `layout="justify"` when the row is long enough to wrap \u2014 a single',
9828
+ "Put per-chip differences on the item (`variant`, `tone`, `iconName`)."
9829
+ ],
9830
+ donts: [
9831
+ "Don't bind `[selected]` on chips inside a group \u2014 that is the thing the group",
9832
+ "Don't use it for an open set the user types into; that is `uni-tag-input`.",
9833
+ "Don't reach for it as a generic chip row. With no selection to own it is just"
9834
+ ],
9835
+ accessibility: [
9836
+ '`role="toolbar"` with `aria-orientation="horizontal"`: one tab stop for the',
9837
+ "Arrow keys move within the group. Both axes work, because the row wraps \u2014",
9838
+ "The tab stop follows the last chip the user picked, so tabbing back into the",
9839
+ "Each chip announces its own state through `aria-pressed`, since each one is an"
9840
+ ]
9841
+ },
9842
+ relatedTokens: []
9843
+ },
9844
+ {
9845
+ id: "tag-input",
9846
+ name: "TagInput",
9847
+ status: "stable",
9848
+ summary: "",
9849
+ description: "",
9850
+ category: "forms",
9851
+ version: "11.1.0",
9852
+ bindings: {
9853
+ angular: {
9854
+ importPath: "@uni-design-system/uni-angular",
9855
+ selectorOrTag: "uni-tag-input",
9856
+ api: [
9857
+ {
9858
+ name: "value",
9859
+ kind: "model",
9860
+ type: "UniTagItem[]",
9861
+ required: false,
9862
+ default: "[]",
9863
+ description: ""
9864
+ },
9865
+ {
9866
+ name: "disabled",
9867
+ kind: "input",
9868
+ type: "boolean",
9869
+ required: false,
9870
+ default: "false",
9871
+ description: ""
9872
+ },
9873
+ {
9874
+ name: "touched",
9875
+ kind: "model",
9876
+ type: "boolean",
9877
+ required: false,
9878
+ default: "false",
9879
+ description: ""
9880
+ },
9881
+ {
9882
+ name: "touch",
9883
+ kind: "output",
9884
+ type: "void",
9885
+ required: false,
9886
+ description: "Angular 22 marks the bound field touched through this output; the `touched` model above is bound inward by the directive and no longer propagates back out. Emitted wherever this control already decided the user was done with it."
9887
+ },
9888
+ {
9889
+ name: "invalid",
9890
+ kind: "input",
9891
+ type: "boolean",
9892
+ required: false,
9893
+ default: "false",
9894
+ description: ""
9895
+ },
9896
+ {
9897
+ name: "dirty",
9898
+ kind: "input",
9899
+ type: "boolean",
9900
+ required: false,
9901
+ default: "false",
9902
+ description: ""
9903
+ },
9904
+ {
9905
+ name: "required",
9906
+ kind: "input",
9907
+ type: "boolean",
9908
+ required: false,
9909
+ default: "false",
9910
+ description: ""
9911
+ },
9912
+ {
9913
+ name: "ariaDescribedBy",
9914
+ kind: "input",
9915
+ type: "string",
9916
+ required: false,
9917
+ description: ""
9918
+ },
9919
+ {
9920
+ name: "label",
9921
+ kind: "input",
9922
+ type: "string",
9923
+ required: true,
9924
+ description: 'Accessible name for the field, e.g. "To".'
9925
+ },
9926
+ {
9927
+ name: "placeholder",
9928
+ kind: "input",
9929
+ type: "string",
9930
+ required: false,
9931
+ description: ""
9932
+ },
9933
+ {
9934
+ name: "preset",
9935
+ kind: "input",
9936
+ type: "'text' | 'email'",
9937
+ required: false,
9938
+ default: "'text'",
9939
+ description: "`email` wires an address validator, paste parser and space separator."
9940
+ },
9941
+ {
9942
+ name: "separators",
9943
+ kind: "input",
9944
+ type: "string[]",
9945
+ required: false,
9946
+ default: "[',', ';']",
9947
+ description: ""
9948
+ },
9949
+ {
9950
+ name: "commitOnBlur",
9951
+ kind: "input",
9952
+ type: "boolean",
9953
+ required: false,
9954
+ default: "true",
9955
+ description: ""
9956
+ },
9957
+ {
9958
+ name: "allowDuplicates",
9959
+ kind: "input",
9960
+ type: "boolean",
9961
+ required: false,
9962
+ default: "false",
9963
+ description: ""
9964
+ },
9965
+ {
9966
+ name: "maxLength",
9967
+ kind: "input",
9968
+ type: "number | undefined",
9969
+ required: false,
9970
+ default: "undefined, { alias: 'max' }",
9971
+ description: ""
9972
+ },
9973
+ {
9974
+ name: "tagVariant",
9975
+ kind: "input",
9976
+ type: "Variant",
9542
9977
  required: false,
9543
9978
  default: "'primary'",
9544
9979
  description: ""
@@ -9710,7 +10145,7 @@ placeholder="Name or address\u2026"
9710
10145
  (query)="onQuery($event)"
9711
10146
  />
9712
10147
  <!-- args:
9713
- { max: 3, value: [{ value: 'alpha' }, { value: 'beta' }] }
10148
+ { maxLength: 3, value: [{ value: 'alpha' }, { value: 'beta' }] }
9714
10149
  -->`
9715
10150
  },
9716
10151
  {
@@ -9754,7 +10189,7 @@ placeholder="Name or address\u2026"
9754
10189
  summary: "The typography primitive, applied as an attribute to any element so semantics stay yours.",
9755
10190
  description: 'The typography primitive, applied as an attribute to any element so semantics stay yours. The attribute value is the typeface: `<h1 uni-text="display-small">`, `<span uni-text="caption">`, dynamic via `[uni-text]="role()"`. With no value, the typeface is inferred from the host element (h1 \u2192 headline-large, p \u2192 body-1-long, \u2026), falling back to `title-small`; the `typeface` input remains as an explicit override. It is a directive, so it stacks with anything else on the element \u2014 a layout attribute (`<div stack-layout uni-text="title-small">`) or a component\'s own host \u2014 rather than colliding with it.',
9756
10191
  category: "primitives",
9757
- version: "10.4.0",
10192
+ version: "11.1.0",
9758
10193
  bindings: {
9759
10194
  angular: {
9760
10195
  importPath: "@uni-design-system/uni-angular",
@@ -9856,7 +10291,7 @@ placeholder="Name or address\u2026"
9856
10291
  summary: "",
9857
10292
  description: "",
9858
10293
  category: "forms",
9859
- version: "10.4.0",
10294
+ version: "11.1.0",
9860
10295
  bindings: {
9861
10296
  angular: {
9862
10297
  importPath: "@uni-design-system/uni-angular",
@@ -9886,6 +10321,13 @@ placeholder="Name or address\u2026"
9886
10321
  default: "false",
9887
10322
  description: ""
9888
10323
  },
10324
+ {
10325
+ name: "touch",
10326
+ kind: "output",
10327
+ type: "void",
10328
+ required: false,
10329
+ description: "Angular 22 marks the bound field touched through this output; the `touched` model above is bound inward by the directive and no longer propagates back out. Emitted wherever this control already decided the user was done with it."
10330
+ },
9889
10331
  {
9890
10332
  name: "invalid",
9891
10333
  kind: "input",
@@ -10056,7 +10498,7 @@ placeholder="Name or address\u2026"
10056
10498
  summary: "",
10057
10499
  description: "",
10058
10500
  category: "primitives",
10059
- version: "10.4.0",
10501
+ version: "11.1.0",
10060
10502
  bindings: {
10061
10503
  angular: {
10062
10504
  importPath: "@uni-design-system/uni-angular",
@@ -10086,7 +10528,7 @@ placeholder="Name or address\u2026"
10086
10528
  summary: "Drop-in switcher for the themes registered via `UNI_THEMES`: a select over `ThemeService.themeOptions` that applies the choice through `selectTheme` (so it persists across reloads like any other theme selection).",
10087
10529
  description: "Drop-in switcher for the themes registered via `UNI_THEMES`: a select over `ThemeService.themeOptions` that applies the choice through `selectTheme` (so it persists across reloads like any other theme selection).",
10088
10530
  category: "components",
10089
- version: "10.4.0",
10531
+ version: "11.1.0",
10090
10532
  bindings: {
10091
10533
  angular: {
10092
10534
  importPath: "@uni-design-system/uni-angular",
@@ -10144,7 +10586,7 @@ placeholder="Name or address\u2026"
10144
10586
  summary: "Time field: a combobox over time options \u2014 the same listbox contract as uni-search-input and uni-tag-input.",
10145
10587
  description: "Time field: a combobox over time options \u2014 the same listbox contract as uni-search-input and uni-tag-input. Type `3p`, `930` or `15:00`, or pick `3:00 PM` from the list; the form always gets 24-hour `'HH:mm'` (`hour12` affects display only). The list is assistive, not exhaustive: any parseable time commits, unless `slots` pins the choices (a slot picker) \u2014 then a typed time must match one. Unreadable or unavailable text stays in the field, flagged, with a `rejected` event.",
10146
10588
  category: "forms",
10147
- version: "10.4.0",
10589
+ version: "11.1.0",
10148
10590
  bindings: {
10149
10591
  angular: {
10150
10592
  importPath: "@uni-design-system/uni-angular",
@@ -10173,6 +10615,13 @@ placeholder="Name or address\u2026"
10173
10615
  default: "false",
10174
10616
  description: ""
10175
10617
  },
10618
+ {
10619
+ name: "touch",
10620
+ kind: "output",
10621
+ type: "void",
10622
+ required: false,
10623
+ description: "Angular 22 marks the bound field touched through this output; the `touched` model above is bound inward by the directive and no longer propagates back out. Emitted wherever this control already decided the user was done with it."
10624
+ },
10176
10625
  {
10177
10626
  name: "invalid",
10178
10627
  kind: "input",
@@ -10352,7 +10801,7 @@ placeholder="Name or address\u2026"
10352
10801
  summary: "",
10353
10802
  description: "",
10354
10803
  category: "forms",
10355
- version: "10.4.0",
10804
+ version: "11.1.0",
10356
10805
  bindings: {
10357
10806
  angular: {
10358
10807
  importPath: "@uni-design-system/uni-angular",
@@ -10382,6 +10831,13 @@ placeholder="Name or address\u2026"
10382
10831
  default: "false",
10383
10832
  description: ""
10384
10833
  },
10834
+ {
10835
+ name: "touch",
10836
+ kind: "output",
10837
+ type: "void",
10838
+ required: false,
10839
+ description: "Angular 22 marks the bound field touched through this output; the `touched` model above is bound inward by the directive and no longer propagates back out. Emitted wherever this control already decided the user was done with it."
10840
+ },
10385
10841
  {
10386
10842
  name: "invalid",
10387
10843
  kind: "input",
@@ -10575,7 +11031,7 @@ placeholder="Name or address\u2026"
10575
11031
  summary: "",
10576
11032
  description: "",
10577
11033
  category: "feedback",
10578
- version: "10.4.0",
11034
+ version: "11.1.0",
10579
11035
  bindings: {
10580
11036
  angular: {
10581
11037
  importPath: "@uni-design-system/uni-angular",
@@ -10649,6 +11105,7 @@ placeholder="Name or address\u2026"
10649
11105
  ]
10650
11106
  },
10651
11107
  relatedTokens: [
11108
+ "tooltip.behavior.motion",
10652
11109
  "tooltip.behavior.borderRadius",
10653
11110
  "tooltip.behavior.shadow",
10654
11111
  "tooltip.behavior.color",
@@ -10662,7 +11119,7 @@ placeholder="Name or address\u2026"
10662
11119
  summary: 'A thin sequencer over one `uni-callout`: steps spotlight their targets, a footer walks Next/Back with dots-or-fraction progress, and `advanceOn` gates a step behind an interaction with its target (auto-advancing for clicks, unlocking Next otherwise \u2014 announced through one `role="status"` region).',
10663
11120
  description: 'A thin sequencer over one `uni-callout`: steps spotlight their targets, a footer walks Next/Back with dots-or-fraction progress, and `advanceOn` gates a step behind an interaction with its target (auto-advancing for clicks, unlocking Next otherwise \u2014 announced through one `role="status"` region). Escape or the close button skips the tour and reports the step. `active` is a two-way model, so a tour is deep-linkable and inspectable; steps whose declared target cannot be resolved are skipped (with a dev warning) in the direction of travel rather than erroring.',
10664
11121
  category: "components",
10665
- version: "10.4.0",
11122
+ version: "11.1.0",
10666
11123
  bindings: {
10667
11124
  angular: {
10668
11125
  importPath: "@uni-design-system/uni-angular",
@@ -10789,7 +11246,7 @@ placeholder="Name or address\u2026"
10789
11246
  summary: "",
10790
11247
  description: "",
10791
11248
  category: "layout",
10792
- version: "10.4.0",
11249
+ version: "11.1.0",
10793
11250
  bindings: {
10794
11251
  angular: {
10795
11252
  importPath: "@uni-design-system/uni-angular",
@@ -11986,6 +12443,72 @@ placeholder="Name or address\u2026"
11986
12443
  DarkTheme: '{"background":"rgba(255, 255, 255, 0.6)","backdropFilter":"blur(2px)"}'
11987
12444
  }
11988
12445
  },
12446
+ {
12447
+ id: "motion.popup",
12448
+ value: '{"duration":100,"easing":"linear","scale":0.8}',
12449
+ type: "motion",
12450
+ kind: "style",
12451
+ target: "emotion-css",
12452
+ themeValues: {
12453
+ LightTheme: '{"duration":100,"easing":"linear","scale":0.8}',
12454
+ DarkTheme: '{"duration":100,"easing":"linear","scale":0.8}'
12455
+ }
12456
+ },
12457
+ {
12458
+ id: "motion.panel",
12459
+ value: '{"duration":250,"easing":"ease"}',
12460
+ type: "motion",
12461
+ kind: "style",
12462
+ target: "emotion-css",
12463
+ themeValues: {
12464
+ LightTheme: '{"duration":250,"easing":"ease"}',
12465
+ DarkTheme: '{"duration":250,"easing":"ease"}'
12466
+ }
12467
+ },
12468
+ {
12469
+ id: "motion.reveal",
12470
+ value: '{"duration":350,"easing":"ease-in-out"}',
12471
+ type: "motion",
12472
+ kind: "style",
12473
+ target: "emotion-css",
12474
+ themeValues: {
12475
+ LightTheme: '{"duration":350,"easing":"ease-in-out"}',
12476
+ DarkTheme: '{"duration":350,"easing":"ease-in-out"}'
12477
+ }
12478
+ },
12479
+ {
12480
+ id: "motion.notification",
12481
+ value: '{"duration":350,"easing":"ease-in-out"}',
12482
+ type: "motion",
12483
+ kind: "style",
12484
+ target: "emotion-css",
12485
+ themeValues: {
12486
+ LightTheme: '{"duration":350,"easing":"ease-in-out"}',
12487
+ DarkTheme: '{"duration":350,"easing":"ease-in-out"}'
12488
+ }
12489
+ },
12490
+ {
12491
+ id: "motion.control",
12492
+ value: '{"duration":300,"easing":"ease"}',
12493
+ type: "motion",
12494
+ kind: "style",
12495
+ target: "emotion-css",
12496
+ themeValues: {
12497
+ LightTheme: '{"duration":300,"easing":"ease"}',
12498
+ DarkTheme: '{"duration":300,"easing":"ease"}'
12499
+ }
12500
+ },
12501
+ {
12502
+ id: "motion.snap",
12503
+ value: '{"duration":120,"easing":"ease"}',
12504
+ type: "motion",
12505
+ kind: "style",
12506
+ target: "emotion-css",
12507
+ themeValues: {
12508
+ LightTheme: '{"duration":120,"easing":"ease"}',
12509
+ DarkTheme: '{"duration":120,"easing":"ease"}'
12510
+ }
12511
+ },
11989
12512
  {
11990
12513
  id: "thickness.thin",
11991
12514
  value: 1,
@@ -12285,13 +12808,13 @@ placeholder="Name or address\u2026"
12285
12808
  },
12286
12809
  {
12287
12810
  id: "typography.tag",
12288
- value: '{"fontFamily":"Red Hat Display","fontSize":15,"lineHeight":20,"fontWeight":600}',
12811
+ value: '{"fontFamily":"Red Hat Display","fontSize":15,"lineHeight":20,"fontWeight":500}',
12289
12812
  type: "typography",
12290
12813
  kind: "style",
12291
12814
  target: "emotion-css",
12292
12815
  themeValues: {
12293
- LightTheme: '{"fontFamily":"Red Hat Display","fontSize":15,"lineHeight":20,"fontWeight":600}',
12294
- DarkTheme: '{"fontFamily":"Red Hat Display","fontSize":15,"lineHeight":20,"fontWeight":600}'
12816
+ LightTheme: '{"fontFamily":"Red Hat Display","fontSize":15,"lineHeight":20,"fontWeight":500}',
12817
+ DarkTheme: '{"fontFamily":"Red Hat Display","fontSize":15,"lineHeight":20,"fontWeight":500}'
12295
12818
  }
12296
12819
  },
12297
12820
  {
@@ -12390,15 +12913,15 @@ placeholder="Name or address\u2026"
12390
12913
  }
12391
12914
  },
12392
12915
  {
12393
- id: "breadcrumb.behavior.separatorSymbol",
12394
- value: "chevron_right",
12916
+ id: "breadcrumb.behavior.separatorIcon",
12917
+ value: "chevronRight",
12395
12918
  type: "string",
12396
12919
  kind: "behavioral",
12397
12920
  target: "component-prop",
12398
12921
  appliesTo: "breadcrumb",
12399
12922
  themeValues: {
12400
- LightTheme: "chevron_right",
12401
- DarkTheme: "chevron_right"
12923
+ LightTheme: "chevronRight",
12924
+ DarkTheme: "chevronRight"
12402
12925
  }
12403
12926
  },
12404
12927
  {
@@ -12810,15 +13333,15 @@ placeholder="Name or address\u2026"
12810
13333
  }
12811
13334
  },
12812
13335
  {
12813
- id: "avatar.behavior.fallbackSymbol",
12814
- value: "person",
13336
+ id: "avatar.behavior.fallbackIcon",
13337
+ value: "profile",
12815
13338
  type: "string",
12816
13339
  kind: "behavioral",
12817
13340
  target: "component-prop",
12818
13341
  appliesTo: "avatar",
12819
13342
  themeValues: {
12820
- LightTheme: "person",
12821
- DarkTheme: "person"
13343
+ LightTheme: "profile",
13344
+ DarkTheme: "profile"
12822
13345
  }
12823
13346
  },
12824
13347
  {
@@ -12858,7 +13381,7 @@ placeholder="Name or address\u2026"
12858
13381
  }
12859
13382
  },
12860
13383
  {
12861
- id: "searchInput.behavior.searchSymbol",
13384
+ id: "searchInput.behavior.searchIcon",
12862
13385
  value: "search",
12863
13386
  type: "string",
12864
13387
  kind: "behavioral",
@@ -12870,7 +13393,7 @@ placeholder="Name or address\u2026"
12870
13393
  }
12871
13394
  },
12872
13395
  {
12873
- id: "searchInput.behavior.clearSymbol",
13396
+ id: "searchInput.behavior.clearIcon",
12874
13397
  value: "close",
12875
13398
  type: "string",
12876
13399
  kind: "behavioral",
@@ -12941,6 +13464,18 @@ placeholder="Name or address\u2026"
12941
13464
  DarkTheme: 8
12942
13465
  }
12943
13466
  },
13467
+ {
13468
+ id: "checkbox.behavior.motion",
13469
+ value: "control",
13470
+ type: "string",
13471
+ kind: "behavioral",
13472
+ target: "component-prop",
13473
+ appliesTo: "checkbox",
13474
+ themeValues: {
13475
+ LightTheme: "control",
13476
+ DarkTheme: "control"
13477
+ }
13478
+ },
12944
13479
  {
12945
13480
  id: "checkbox.behavior.size",
12946
13481
  value: 20,
@@ -13325,6 +13860,126 @@ placeholder="Name or address\u2026"
13325
13860
  DarkTheme: "md"
13326
13861
  }
13327
13862
  },
13863
+ {
13864
+ id: "select.behavior.toggleIcon",
13865
+ value: "chevronDown",
13866
+ type: "string",
13867
+ kind: "behavioral",
13868
+ target: "component-prop",
13869
+ appliesTo: "select",
13870
+ themeValues: {
13871
+ LightTheme: "chevronDown",
13872
+ DarkTheme: "chevronDown"
13873
+ }
13874
+ },
13875
+ {
13876
+ id: "select.behavior.toggleColor",
13877
+ value: "on-background-variant",
13878
+ type: "string",
13879
+ kind: "behavioral",
13880
+ target: "component-prop",
13881
+ appliesTo: "select",
13882
+ themeValues: {
13883
+ LightTheme: "on-background-variant",
13884
+ DarkTheme: "on-background-variant"
13885
+ }
13886
+ },
13887
+ {
13888
+ id: "select.behavior.toggleSize",
13889
+ value: 20,
13890
+ type: "number",
13891
+ kind: "behavioral",
13892
+ target: "component-prop",
13893
+ appliesTo: "select",
13894
+ themeValues: {
13895
+ LightTheme: 20,
13896
+ DarkTheme: 20
13897
+ }
13898
+ },
13899
+ {
13900
+ id: "buttonGroup.behavior.border",
13901
+ value: "quaternary",
13902
+ type: "string",
13903
+ kind: "behavioral",
13904
+ target: "component-prop",
13905
+ appliesTo: "buttonGroup",
13906
+ themeValues: {
13907
+ LightTheme: "quaternary",
13908
+ DarkTheme: "quaternary"
13909
+ }
13910
+ },
13911
+ {
13912
+ id: "buttonGroup.behavior.borderRadius",
13913
+ value: 4,
13914
+ type: "number",
13915
+ kind: "behavioral",
13916
+ target: "component-prop",
13917
+ appliesTo: "buttonGroup",
13918
+ themeValues: {
13919
+ LightTheme: 4,
13920
+ DarkTheme: 4
13921
+ }
13922
+ },
13923
+ {
13924
+ id: "progressBar.behavior.trackColor",
13925
+ value: "primary-surface",
13926
+ type: "string",
13927
+ kind: "behavioral",
13928
+ target: "component-prop",
13929
+ appliesTo: "progressBar",
13930
+ themeValues: {
13931
+ LightTheme: "primary-surface",
13932
+ DarkTheme: "primary-surface"
13933
+ }
13934
+ },
13935
+ {
13936
+ id: "progressBar.behavior.fillColor",
13937
+ value: "secondary-surface",
13938
+ type: "string",
13939
+ kind: "behavioral",
13940
+ target: "component-prop",
13941
+ appliesTo: "progressBar",
13942
+ themeValues: {
13943
+ LightTheme: "secondary-surface",
13944
+ DarkTheme: "secondary-surface"
13945
+ }
13946
+ },
13947
+ {
13948
+ id: "progressBar.behavior.completeColor",
13949
+ value: "secondary",
13950
+ type: "string",
13951
+ kind: "behavioral",
13952
+ target: "component-prop",
13953
+ appliesTo: "progressBar",
13954
+ themeValues: {
13955
+ LightTheme: "secondary",
13956
+ DarkTheme: "secondary"
13957
+ }
13958
+ },
13959
+ {
13960
+ id: "progressBar.behavior.borderColor",
13961
+ value: "on-background-variant",
13962
+ type: "string",
13963
+ kind: "behavioral",
13964
+ target: "component-prop",
13965
+ appliesTo: "progressBar",
13966
+ themeValues: {
13967
+ LightTheme: "on-background-variant",
13968
+ DarkTheme: "on-background-variant"
13969
+ }
13970
+ },
13971
+ {
13972
+ id: "progressBar.behavior.strokeWidth",
13973
+ value: 1,
13974
+ type: "number",
13975
+ kind: "behavioral",
13976
+ target: "component-prop",
13977
+ appliesTo: "progressBar",
13978
+ themeValues: {
13979
+ LightTheme: 1,
13980
+ DarkTheme: 1
13981
+ }
13982
+ },
13328
13983
  {
13329
13984
  id: "dropdown.behavior.border",
13330
13985
  value: "none",
@@ -13518,7 +14173,7 @@ placeholder="Name or address\u2026"
13518
14173
  }
13519
14174
  },
13520
14175
  {
13521
- id: "menuItem.behavior.activeSymbol",
14176
+ id: "menuItem.behavior.activeIcon",
13522
14177
  value: "check",
13523
14178
  type: "string",
13524
14179
  kind: "behavioral",
@@ -13650,7 +14305,7 @@ placeholder="Name or address\u2026"
13650
14305
  }
13651
14306
  },
13652
14307
  {
13653
- id: "popover.behavior.closeSymbol",
14308
+ id: "popover.behavior.closeIcon",
13654
14309
  value: "close",
13655
14310
  type: "string",
13656
14311
  kind: "behavioral",
@@ -13733,54 +14388,6 @@ placeholder="Name or address\u2026"
13733
14388
  DarkTheme: "reveal"
13734
14389
  }
13735
14390
  },
13736
- {
13737
- id: "footer.behavior.height",
13738
- value: 52,
13739
- type: "number",
13740
- kind: "behavioral",
13741
- target: "component-prop",
13742
- appliesTo: "footer",
13743
- themeValues: {
13744
- LightTheme: 52,
13745
- DarkTheme: 52
13746
- }
13747
- },
13748
- {
13749
- id: "footer.behavior.color",
13750
- value: "primary",
13751
- type: "string",
13752
- kind: "behavioral",
13753
- target: "component-prop",
13754
- appliesTo: "footer",
13755
- themeValues: {
13756
- LightTheme: "primary",
13757
- DarkTheme: "primary"
13758
- }
13759
- },
13760
- {
13761
- id: "footer.behavior.logoHeight",
13762
- value: 18.6,
13763
- type: "number",
13764
- kind: "behavioral",
13765
- target: "component-prop",
13766
- appliesTo: "footer",
13767
- themeValues: {
13768
- LightTheme: 18.6,
13769
- DarkTheme: 18.6
13770
- }
13771
- },
13772
- {
13773
- id: "footer.behavior.logoPadding",
13774
- value: "md",
13775
- type: "string",
13776
- kind: "behavioral",
13777
- target: "component-prop",
13778
- appliesTo: "footer",
13779
- themeValues: {
13780
- LightTheme: "md",
13781
- DarkTheme: "md"
13782
- }
13783
- },
13784
14391
  {
13785
14392
  id: "input.behavior.typeface",
13786
14393
  value: "input",
@@ -14261,6 +14868,18 @@ placeholder="Name or address\u2026"
14261
14868
  DarkTheme: "3ch"
14262
14869
  }
14263
14870
  },
14871
+ {
14872
+ id: "tabs.behavior.motion",
14873
+ value: "snap",
14874
+ type: "string",
14875
+ kind: "behavioral",
14876
+ target: "component-prop",
14877
+ appliesTo: "tabs",
14878
+ themeValues: {
14879
+ LightTheme: "snap",
14880
+ DarkTheme: "snap"
14881
+ }
14882
+ },
14264
14883
  {
14265
14884
  id: "tabs.behavior.typeface",
14266
14885
  value: "title-small",
@@ -14525,6 +15144,54 @@ placeholder="Name or address\u2026"
14525
15144
  DarkTheme: "check"
14526
15145
  }
14527
15146
  },
15147
+ {
15148
+ id: "tag.behavior.motion",
15149
+ value: "control",
15150
+ type: "string",
15151
+ kind: "behavioral",
15152
+ target: "component-prop",
15153
+ appliesTo: "tag",
15154
+ themeValues: {
15155
+ LightTheme: "control",
15156
+ DarkTheme: "control"
15157
+ }
15158
+ },
15159
+ {
15160
+ id: "tag.behavior.endInset",
15161
+ value: "auto",
15162
+ type: "string",
15163
+ kind: "behavioral",
15164
+ target: "component-prop",
15165
+ appliesTo: "tag",
15166
+ themeValues: {
15167
+ LightTheme: "auto",
15168
+ DarkTheme: "auto"
15169
+ }
15170
+ },
15171
+ {
15172
+ id: "tagGroup.behavior.gap",
15173
+ value: "xs",
15174
+ type: "string",
15175
+ kind: "behavioral",
15176
+ target: "component-prop",
15177
+ appliesTo: "tagGroup",
15178
+ themeValues: {
15179
+ LightTheme: "xs",
15180
+ DarkTheme: "xs"
15181
+ }
15182
+ },
15183
+ {
15184
+ id: "tagGroup.behavior.rowGap",
15185
+ value: "xs",
15186
+ type: "string",
15187
+ kind: "behavioral",
15188
+ target: "component-prop",
15189
+ appliesTo: "tagGroup",
15190
+ themeValues: {
15191
+ LightTheme: "xs",
15192
+ DarkTheme: "xs"
15193
+ }
15194
+ },
14528
15195
  {
14529
15196
  id: "tagInput.behavior.chipGap",
14530
15197
  value: "xs",
@@ -14658,27 +15325,27 @@ placeholder="Name or address\u2026"
14658
15325
  }
14659
15326
  },
14660
15327
  {
14661
- id: "calendar.behavior.navPrevSymbol",
14662
- value: "chevron_left",
15328
+ id: "calendar.behavior.navPrevIcon",
15329
+ value: "chevronLeft",
14663
15330
  type: "string",
14664
15331
  kind: "behavioral",
14665
15332
  target: "component-prop",
14666
15333
  appliesTo: "calendar",
14667
15334
  themeValues: {
14668
- LightTheme: "chevron_left",
14669
- DarkTheme: "chevron_left"
15335
+ LightTheme: "chevronLeft",
15336
+ DarkTheme: "chevronLeft"
14670
15337
  }
14671
15338
  },
14672
15339
  {
14673
- id: "calendar.behavior.navNextSymbol",
14674
- value: "chevron_right",
15340
+ id: "calendar.behavior.navNextIcon",
15341
+ value: "chevronRight",
14675
15342
  type: "string",
14676
15343
  kind: "behavioral",
14677
15344
  target: "component-prop",
14678
15345
  appliesTo: "calendar",
14679
15346
  themeValues: {
14680
- LightTheme: "chevron_right",
14681
- DarkTheme: "chevron_right"
15347
+ LightTheme: "chevronRight",
15348
+ DarkTheme: "chevronRight"
14682
15349
  }
14683
15350
  },
14684
15351
  {
@@ -14826,15 +15493,15 @@ placeholder="Name or address\u2026"
14826
15493
  }
14827
15494
  },
14828
15495
  {
14829
- id: "dateInput.behavior.toggleSymbol",
14830
- value: "calendar_month",
15496
+ id: "dateInput.behavior.toggleIcon",
15497
+ value: "calendar",
14831
15498
  type: "string",
14832
15499
  kind: "behavioral",
14833
15500
  target: "component-prop",
14834
15501
  appliesTo: "dateInput",
14835
15502
  themeValues: {
14836
- LightTheme: "calendar_month",
14837
- DarkTheme: "calendar_month"
15503
+ LightTheme: "calendar",
15504
+ DarkTheme: "calendar"
14838
15505
  }
14839
15506
  },
14840
15507
  {
@@ -14874,15 +15541,15 @@ placeholder="Name or address\u2026"
14874
15541
  }
14875
15542
  },
14876
15543
  {
14877
- id: "timeInput.behavior.toggleSymbol",
14878
- value: "schedule",
15544
+ id: "timeInput.behavior.toggleIcon",
15545
+ value: "clock",
14879
15546
  type: "string",
14880
15547
  kind: "behavioral",
14881
15548
  target: "component-prop",
14882
15549
  appliesTo: "timeInput",
14883
15550
  themeValues: {
14884
- LightTheme: "schedule",
14885
- DarkTheme: "schedule"
15551
+ LightTheme: "clock",
15552
+ DarkTheme: "clock"
14886
15553
  }
14887
15554
  },
14888
15555
  {
@@ -14993,6 +15660,18 @@ placeholder="Name or address\u2026"
14993
15660
  DarkTheme: "button"
14994
15661
  }
14995
15662
  },
15663
+ {
15664
+ id: "button.behavior.motion",
15665
+ value: "control",
15666
+ type: "string",
15667
+ kind: "behavioral",
15668
+ target: "component-prop",
15669
+ appliesTo: "button",
15670
+ themeValues: {
15671
+ LightTheme: "control",
15672
+ DarkTheme: "control"
15673
+ }
15674
+ },
14996
15675
  {
14997
15676
  id: "iconButton.behavior.borderRadius",
14998
15677
  value: "max",
@@ -15005,6 +15684,78 @@ placeholder="Name or address\u2026"
15005
15684
  DarkTheme: "max"
15006
15685
  }
15007
15686
  },
15687
+ {
15688
+ id: "iconButton.behavior.motion",
15689
+ value: "control",
15690
+ type: "string",
15691
+ kind: "behavioral",
15692
+ target: "component-prop",
15693
+ appliesTo: "iconButton",
15694
+ themeValues: {
15695
+ LightTheme: "control",
15696
+ DarkTheme: "control"
15697
+ }
15698
+ },
15699
+ {
15700
+ id: "inlineButton.behavior.linkColor",
15701
+ value: "primary",
15702
+ type: "string",
15703
+ kind: "behavioral",
15704
+ target: "component-prop",
15705
+ appliesTo: "inlineButton",
15706
+ themeValues: {
15707
+ LightTheme: "primary",
15708
+ DarkTheme: "primary"
15709
+ }
15710
+ },
15711
+ {
15712
+ id: "inlineButton.behavior.underline",
15713
+ value: false,
15714
+ type: "boolean",
15715
+ kind: "behavioral",
15716
+ target: "component-prop",
15717
+ appliesTo: "inlineButton",
15718
+ themeValues: {
15719
+ LightTheme: false,
15720
+ DarkTheme: false
15721
+ }
15722
+ },
15723
+ {
15724
+ id: "inlineButton.behavior.underlineOnHover",
15725
+ value: true,
15726
+ type: "boolean",
15727
+ kind: "behavioral",
15728
+ target: "component-prop",
15729
+ appliesTo: "inlineButton",
15730
+ themeValues: {
15731
+ LightTheme: true,
15732
+ DarkTheme: true
15733
+ }
15734
+ },
15735
+ {
15736
+ id: "inlineButton.behavior.underlineOffset",
15737
+ value: "0.15em",
15738
+ type: "string",
15739
+ kind: "behavioral",
15740
+ target: "component-prop",
15741
+ appliesTo: "inlineButton",
15742
+ themeValues: {
15743
+ LightTheme: "0.15em",
15744
+ DarkTheme: "0.15em"
15745
+ }
15746
+ },
15747
+ {
15748
+ id: "inlineButton.behavior.gap",
15749
+ value: "xxs",
15750
+ type: "string",
15751
+ kind: "behavioral",
15752
+ target: "component-prop",
15753
+ appliesTo: "inlineButton",
15754
+ themeValues: {
15755
+ LightTheme: "xxs",
15756
+ DarkTheme: "xxs"
15757
+ }
15758
+ },
15008
15759
  {
15009
15760
  id: "card.behavior.borderRadius",
15010
15761
  value: "xs",
@@ -15065,6 +15816,18 @@ placeholder="Name or address\u2026"
15065
15816
  DarkTheme: "disabled"
15066
15817
  }
15067
15818
  },
15819
+ {
15820
+ id: "dataTable.behavior.motion",
15821
+ value: "control",
15822
+ type: "string",
15823
+ kind: "behavioral",
15824
+ target: "component-prop",
15825
+ appliesTo: "dataTable",
15826
+ themeValues: {
15827
+ LightTheme: "control",
15828
+ DarkTheme: "control"
15829
+ }
15830
+ },
15068
15831
  {
15069
15832
  id: "dataTable.behavior.color",
15070
15833
  value: "primary-surface",
@@ -15714,15 +16477,15 @@ placeholder="Name or address\u2026"
15714
16477
  }
15715
16478
  },
15716
16479
  {
15717
- id: "slider.behavior.transitionMs",
15718
- value: 120,
15719
- type: "number",
16480
+ id: "slider.behavior.motion",
16481
+ value: "snap",
16482
+ type: "string",
15720
16483
  kind: "behavioral",
15721
16484
  target: "component-prop",
15722
16485
  appliesTo: "slider",
15723
16486
  themeValues: {
15724
- LightTheme: 120,
15725
- DarkTheme: 120
16487
+ LightTheme: "snap",
16488
+ DarkTheme: "snap"
15726
16489
  }
15727
16490
  },
15728
16491
  {
@@ -15941,6 +16704,18 @@ placeholder="Name or address\u2026"
15941
16704
  DarkTheme: "control"
15942
16705
  }
15943
16706
  },
16707
+ {
16708
+ id: "tooltip.behavior.motion",
16709
+ value: "notification",
16710
+ type: "string",
16711
+ kind: "behavioral",
16712
+ target: "component-prop",
16713
+ appliesTo: "tooltip",
16714
+ themeValues: {
16715
+ LightTheme: "notification",
16716
+ DarkTheme: "notification"
16717
+ }
16718
+ },
15944
16719
  {
15945
16720
  id: "tooltip.behavior.borderRadius",
15946
16721
  value: "xs",
@@ -16074,7 +16849,7 @@ placeholder="Name or address\u2026"
16074
16849
  }
16075
16850
  },
16076
16851
  {
16077
- id: "callout.behavior.closeSymbol",
16852
+ id: "callout.behavior.closeIcon",
16078
16853
  value: "close",
16079
16854
  type: "string",
16080
16855
  kind: "behavioral",
@@ -16305,6 +17080,12 @@ placeholder="Name or address\u2026"
16305
17080
  "shadow.dialog": "rgba(23, 25, 43, 0.2) 0px 3px 5px -1px, rgba(23, 25, 43, 0.14) 0px 6px 10px 0px, rgba(23, 25, 43, 0.12) 0px 1px 18px 0px",
16306
17081
  "shadow.warn": "0 0 5px rgba(204, 40, 39, 0.5), inset 0 0 5px rgba(204, 40, 39, 0.3)",
16307
17082
  "backdrop.scrim": '{"background":"rgba(255, 255, 255, 0.6)","backdropFilter":"blur(2px)"}',
17083
+ "motion.popup": '{"duration":100,"easing":"linear","scale":0.8}',
17084
+ "motion.panel": '{"duration":250,"easing":"ease"}',
17085
+ "motion.reveal": '{"duration":350,"easing":"ease-in-out"}',
17086
+ "motion.notification": '{"duration":350,"easing":"ease-in-out"}',
17087
+ "motion.control": '{"duration":300,"easing":"ease"}',
17088
+ "motion.snap": '{"duration":120,"easing":"ease"}',
16308
17089
  "thickness.thin": 1,
16309
17090
  "thickness.standard": 2,
16310
17091
  "thickness.thick": 4,
@@ -16332,7 +17113,7 @@ placeholder="Name or address\u2026"
16332
17113
  "typography.note": '{"fontFamily":"Roboto","fontSize":14,"lineHeight":22,"fontStyle":"italic"}',
16333
17114
  "typography.badge": '{"fontFamily":"Red Hat Display","fontSize":16,"lineHeight":24}',
16334
17115
  "typography.stat": '{"fontFamily":"Red Hat Display","fontSize":32,"lineHeight":38,"fontWeight":600,"letterSpacing":-0.32}',
16335
- "typography.tag": '{"fontFamily":"Red Hat Display","fontSize":15,"lineHeight":20,"fontWeight":600}',
17116
+ "typography.tag": '{"fontFamily":"Red Hat Display","fontSize":15,"lineHeight":20,"fontWeight":500}',
16336
17117
  "typography.input": '{"fontFamily":"Red Hat Display","fontSize":14,"lineHeight":24}'
16337
17118
  },
16338
17119
  componentOptions: {
@@ -16346,7 +17127,7 @@ placeholder="Name or address\u2026"
16346
17127
  typeface: "label",
16347
17128
  color: "on-background-variant",
16348
17129
  currentColor: "on-background",
16349
- separatorSymbol: "chevron_right",
17130
+ separatorIcon: "chevronRight",
16350
17131
  gap: "xs"
16351
17132
  },
16352
17133
  appBar: {
@@ -16391,7 +17172,7 @@ placeholder="Name or address\u2026"
16391
17172
  avatar: {
16392
17173
  borderRadius: "max",
16393
17174
  typeface: "subtitle-2",
16394
- fallbackSymbol: "person"
17175
+ fallbackIcon: "profile"
16395
17176
  },
16396
17177
  avatarGroup: {
16397
17178
  overlap: "sm",
@@ -16399,8 +17180,8 @@ placeholder="Name or address\u2026"
16399
17180
  ringWidth: 2
16400
17181
  },
16401
17182
  searchInput: {
16402
- searchSymbol: "search",
16403
- clearSymbol: "close",
17183
+ searchIcon: "search",
17184
+ clearIcon: "close",
16404
17185
  listColor: "primary-surface",
16405
17186
  listShadow: "menu",
16406
17187
  listBorderRadius: "xs",
@@ -16408,6 +17189,7 @@ placeholder="Name or address\u2026"
16408
17189
  maxSuggestions: 8
16409
17190
  },
16410
17191
  checkbox: {
17192
+ motion: "control",
16411
17193
  size: 20,
16412
17194
  boxColor: "surface",
16413
17195
  borderRadius: 2,
@@ -16449,6 +17231,22 @@ placeholder="Name or address\u2026"
16449
17231
  closeButtonIcon: "close",
16450
17232
  closeButtonSize: "md"
16451
17233
  },
17234
+ select: {
17235
+ toggleIcon: "chevronDown",
17236
+ toggleColor: "on-background-variant",
17237
+ toggleSize: 20
17238
+ },
17239
+ buttonGroup: {
17240
+ border: "quaternary",
17241
+ borderRadius: 4
17242
+ },
17243
+ progressBar: {
17244
+ trackColor: "primary-surface",
17245
+ fillColor: "secondary-surface",
17246
+ completeColor: "secondary",
17247
+ borderColor: "on-background-variant",
17248
+ strokeWidth: 1
17249
+ },
16452
17250
  dropdown: {
16453
17251
  border: "none",
16454
17252
  borderRadius: "xxs",
@@ -16470,7 +17268,7 @@ placeholder="Name or address\u2026"
16470
17268
  borderRadius: "none",
16471
17269
  typeface: "label",
16472
17270
  hoverColor: "primary-container",
16473
- activeSymbol: "check",
17271
+ activeIcon: "check",
16474
17272
  motion: "control"
16475
17273
  },
16476
17274
  popover: {
@@ -16483,7 +17281,7 @@ placeholder="Name or address\u2026"
16483
17281
  maxWidth: "38ch",
16484
17282
  offset: 7,
16485
17283
  arrowSize: 8,
16486
- closeSymbol: "close",
17284
+ closeIcon: "close",
16487
17285
  headerTypeface: "title-small",
16488
17286
  tooltipPadding: "4px 8px",
16489
17287
  tooltipOpenDelay: 500,
@@ -16493,12 +17291,6 @@ placeholder="Name or address\u2026"
16493
17291
  expand: {
16494
17292
  motion: "reveal"
16495
17293
  },
16496
- footer: {
16497
- height: 52,
16498
- color: "primary",
16499
- logoHeight: 18.6,
16500
- logoPadding: "md"
16501
- },
16502
17294
  input: {
16503
17295
  typeface: "input",
16504
17296
  color: "primary-surface",
@@ -16550,6 +17342,7 @@ placeholder="Name or address\u2026"
16550
17342
  valueWidth: "3ch"
16551
17343
  },
16552
17344
  tabs: {
17345
+ motion: "snap",
16553
17346
  typeface: "title-small",
16554
17347
  textColor: "on-surface-variant",
16555
17348
  activeTextColor: "primary",
@@ -16577,7 +17370,13 @@ placeholder="Name or address\u2026"
16577
17370
  typeface: "tag",
16578
17371
  gap: "xs",
16579
17372
  removeIcon: "close",
16580
- selectedIcon: "check"
17373
+ selectedIcon: "check",
17374
+ motion: "control",
17375
+ endInset: "auto"
17376
+ },
17377
+ tagGroup: {
17378
+ gap: "xs",
17379
+ rowGap: "xs"
16581
17380
  },
16582
17381
  tagInput: {
16583
17382
  chipGap: "xs",
@@ -16593,8 +17392,8 @@ placeholder="Name or address\u2026"
16593
17392
  dayBorderRadius: "max",
16594
17393
  typeface: "label",
16595
17394
  gap: "xxs",
16596
- navPrevSymbol: "chevron_left",
16597
- navNextSymbol: "chevron_right",
17395
+ navPrevIcon: "chevronLeft",
17396
+ navNextIcon: "chevronRight",
16598
17397
  weekdayFormat: "short",
16599
17398
  showOutsideDays: false,
16600
17399
  todayStyle: "outline"
@@ -16611,13 +17410,13 @@ placeholder="Name or address\u2026"
16611
17410
  descriptionColor: "on-primary-surface-variant"
16612
17411
  },
16613
17412
  dateInput: {
16614
- toggleSymbol: "calendar_month",
17413
+ toggleIcon: "calendar",
16615
17414
  popupShadow: "menu",
16616
17415
  popupBorderRadius: "xs",
16617
17416
  popupColor: "primary-surface"
16618
17417
  },
16619
17418
  timeInput: {
16620
- toggleSymbol: "schedule",
17419
+ toggleIcon: "clock",
16621
17420
  listColor: "primary-surface",
16622
17421
  listShadow: "menu",
16623
17422
  listBorderRadius: "xs",
@@ -16630,10 +17429,19 @@ placeholder="Name or address\u2026"
16630
17429
  },
16631
17430
  button: {
16632
17431
  borderRadius: "max",
16633
- typeface: "button"
17432
+ typeface: "button",
17433
+ motion: "control"
16634
17434
  },
16635
17435
  iconButton: {
16636
- borderRadius: "max"
17436
+ borderRadius: "max",
17437
+ motion: "control"
17438
+ },
17439
+ inlineButton: {
17440
+ linkColor: "primary",
17441
+ underline: false,
17442
+ underlineOnHover: true,
17443
+ underlineOffset: "0.15em",
17444
+ gap: "xxs"
16637
17445
  },
16638
17446
  card: {
16639
17447
  borderRadius: "xs"
@@ -16645,6 +17453,7 @@ placeholder="Name or address\u2026"
16645
17453
  placeholderColor: "disabled"
16646
17454
  },
16647
17455
  dataTable: {
17456
+ motion: "control",
16648
17457
  color: "primary-surface",
16649
17458
  border: "light",
16650
17459
  borderRadius: "sm",
@@ -16707,7 +17516,7 @@ placeholder="Name or address\u2026"
16707
17516
  tooltipTextColor: "on-inverse-surface",
16708
17517
  tooltipShadow: "menu",
16709
17518
  tooltipBorderRadius: "xs",
16710
- transitionMs: 120
17519
+ motion: "snap"
16711
17520
  },
16712
17521
  skeleton: {
16713
17522
  color: "surface-variant",
@@ -16736,6 +17545,7 @@ placeholder="Name or address\u2026"
16736
17545
  motion: "control"
16737
17546
  },
16738
17547
  tooltip: {
17548
+ motion: "notification",
16739
17549
  borderRadius: "xs",
16740
17550
  shadow: "raised",
16741
17551
  color: "inverse-surface",
@@ -16749,7 +17559,7 @@ placeholder="Name or address\u2026"
16749
17559
  padding: "16px",
16750
17560
  headerTypeface: "title-small",
16751
17561
  typeface: "label",
16752
- closeSymbol: "close",
17562
+ closeIcon: "close",
16753
17563
  arrowSize: 8,
16754
17564
  offset: 12,
16755
17565
  scrimColor: "rgba(0, 0, 0, 0.45)",
@@ -16875,6 +17685,12 @@ placeholder="Name or address\u2026"
16875
17685
  "shadow.dialog": "0px 8px 28px rgba(0, 0, 0, 0.55)",
16876
17686
  "shadow.warn": "0 0 5px rgba(255, 150, 138, 0.55), inset 0 0 5px rgba(255, 150, 138, 0.35)",
16877
17687
  "backdrop.scrim": '{"background":"rgba(255, 255, 255, 0.6)","backdropFilter":"blur(2px)"}',
17688
+ "motion.popup": '{"duration":100,"easing":"linear","scale":0.8}',
17689
+ "motion.panel": '{"duration":250,"easing":"ease"}',
17690
+ "motion.reveal": '{"duration":350,"easing":"ease-in-out"}',
17691
+ "motion.notification": '{"duration":350,"easing":"ease-in-out"}',
17692
+ "motion.control": '{"duration":300,"easing":"ease"}',
17693
+ "motion.snap": '{"duration":120,"easing":"ease"}',
16878
17694
  "thickness.thin": 1,
16879
17695
  "thickness.standard": 2,
16880
17696
  "thickness.thick": 4,
@@ -16902,7 +17718,7 @@ placeholder="Name or address\u2026"
16902
17718
  "typography.note": '{"fontFamily":"Roboto","fontSize":14,"lineHeight":22,"fontStyle":"italic"}',
16903
17719
  "typography.badge": '{"fontFamily":"Red Hat Display","fontSize":16,"lineHeight":24}',
16904
17720
  "typography.stat": '{"fontFamily":"Red Hat Display","fontSize":32,"lineHeight":38,"fontWeight":600,"letterSpacing":-0.32}',
16905
- "typography.tag": '{"fontFamily":"Red Hat Display","fontSize":15,"lineHeight":20,"fontWeight":600}',
17721
+ "typography.tag": '{"fontFamily":"Red Hat Display","fontSize":15,"lineHeight":20,"fontWeight":500}',
16906
17722
  "typography.input": '{"fontFamily":"Red Hat Display","fontSize":14,"lineHeight":24}'
16907
17723
  },
16908
17724
  componentOptions: {
@@ -16916,7 +17732,7 @@ placeholder="Name or address\u2026"
16916
17732
  typeface: "label",
16917
17733
  color: "on-background-variant",
16918
17734
  currentColor: "on-background",
16919
- separatorSymbol: "chevron_right",
17735
+ separatorIcon: "chevronRight",
16920
17736
  gap: "xs"
16921
17737
  },
16922
17738
  appBar: {
@@ -16961,7 +17777,7 @@ placeholder="Name or address\u2026"
16961
17777
  avatar: {
16962
17778
  borderRadius: "max",
16963
17779
  typeface: "subtitle-2",
16964
- fallbackSymbol: "person"
17780
+ fallbackIcon: "profile"
16965
17781
  },
16966
17782
  avatarGroup: {
16967
17783
  overlap: "sm",
@@ -16969,8 +17785,8 @@ placeholder="Name or address\u2026"
16969
17785
  ringWidth: 2
16970
17786
  },
16971
17787
  searchInput: {
16972
- searchSymbol: "search",
16973
- clearSymbol: "close",
17788
+ searchIcon: "search",
17789
+ clearIcon: "close",
16974
17790
  listColor: "primary-surface",
16975
17791
  listShadow: "menu",
16976
17792
  listBorderRadius: "xs",
@@ -16978,6 +17794,7 @@ placeholder="Name or address\u2026"
16978
17794
  maxSuggestions: 8
16979
17795
  },
16980
17796
  checkbox: {
17797
+ motion: "control",
16981
17798
  size: 20,
16982
17799
  boxColor: "surface",
16983
17800
  borderRadius: 2,
@@ -17019,6 +17836,22 @@ placeholder="Name or address\u2026"
17019
17836
  closeButtonIcon: "close",
17020
17837
  closeButtonSize: "md"
17021
17838
  },
17839
+ select: {
17840
+ toggleIcon: "chevronDown",
17841
+ toggleColor: "on-background-variant",
17842
+ toggleSize: 20
17843
+ },
17844
+ buttonGroup: {
17845
+ border: "quaternary",
17846
+ borderRadius: 4
17847
+ },
17848
+ progressBar: {
17849
+ trackColor: "primary-surface",
17850
+ fillColor: "secondary-surface",
17851
+ completeColor: "secondary",
17852
+ borderColor: "on-background-variant",
17853
+ strokeWidth: 1
17854
+ },
17022
17855
  dropdown: {
17023
17856
  border: "none",
17024
17857
  borderRadius: "xxs",
@@ -17040,7 +17873,7 @@ placeholder="Name or address\u2026"
17040
17873
  borderRadius: "none",
17041
17874
  typeface: "label",
17042
17875
  hoverColor: "primary-container",
17043
- activeSymbol: "check",
17876
+ activeIcon: "check",
17044
17877
  motion: "control"
17045
17878
  },
17046
17879
  popover: {
@@ -17053,7 +17886,7 @@ placeholder="Name or address\u2026"
17053
17886
  maxWidth: "38ch",
17054
17887
  offset: 7,
17055
17888
  arrowSize: 8,
17056
- closeSymbol: "close",
17889
+ closeIcon: "close",
17057
17890
  headerTypeface: "title-small",
17058
17891
  tooltipPadding: "4px 8px",
17059
17892
  tooltipOpenDelay: 500,
@@ -17063,12 +17896,6 @@ placeholder="Name or address\u2026"
17063
17896
  expand: {
17064
17897
  motion: "reveal"
17065
17898
  },
17066
- footer: {
17067
- height: 52,
17068
- color: "primary",
17069
- logoHeight: 18.6,
17070
- logoPadding: "md"
17071
- },
17072
17899
  input: {
17073
17900
  typeface: "input",
17074
17901
  color: "primary-surface",
@@ -17120,6 +17947,7 @@ placeholder="Name or address\u2026"
17120
17947
  valueWidth: "3ch"
17121
17948
  },
17122
17949
  tabs: {
17950
+ motion: "snap",
17123
17951
  typeface: "title-small",
17124
17952
  textColor: "on-surface-variant",
17125
17953
  activeTextColor: "primary",
@@ -17147,7 +17975,13 @@ placeholder="Name or address\u2026"
17147
17975
  typeface: "tag",
17148
17976
  gap: "xs",
17149
17977
  removeIcon: "close",
17150
- selectedIcon: "check"
17978
+ selectedIcon: "check",
17979
+ motion: "control",
17980
+ endInset: "auto"
17981
+ },
17982
+ tagGroup: {
17983
+ gap: "xs",
17984
+ rowGap: "xs"
17151
17985
  },
17152
17986
  tagInput: {
17153
17987
  chipGap: "xs",
@@ -17163,8 +17997,8 @@ placeholder="Name or address\u2026"
17163
17997
  dayBorderRadius: "max",
17164
17998
  typeface: "label",
17165
17999
  gap: "xxs",
17166
- navPrevSymbol: "chevron_left",
17167
- navNextSymbol: "chevron_right",
18000
+ navPrevIcon: "chevronLeft",
18001
+ navNextIcon: "chevronRight",
17168
18002
  weekdayFormat: "short",
17169
18003
  showOutsideDays: false,
17170
18004
  todayStyle: "outline"
@@ -17181,13 +18015,13 @@ placeholder="Name or address\u2026"
17181
18015
  descriptionColor: "on-primary-surface-variant"
17182
18016
  },
17183
18017
  dateInput: {
17184
- toggleSymbol: "calendar_month",
18018
+ toggleIcon: "calendar",
17185
18019
  popupShadow: "menu",
17186
18020
  popupBorderRadius: "xs",
17187
18021
  popupColor: "primary-surface"
17188
18022
  },
17189
18023
  timeInput: {
17190
- toggleSymbol: "schedule",
18024
+ toggleIcon: "clock",
17191
18025
  listColor: "primary-surface",
17192
18026
  listShadow: "menu",
17193
18027
  listBorderRadius: "xs",
@@ -17200,10 +18034,19 @@ placeholder="Name or address\u2026"
17200
18034
  },
17201
18035
  button: {
17202
18036
  borderRadius: "max",
17203
- typeface: "button"
18037
+ typeface: "button",
18038
+ motion: "control"
17204
18039
  },
17205
18040
  iconButton: {
17206
- borderRadius: "max"
18041
+ borderRadius: "max",
18042
+ motion: "control"
18043
+ },
18044
+ inlineButton: {
18045
+ linkColor: "primary",
18046
+ underline: false,
18047
+ underlineOnHover: true,
18048
+ underlineOffset: "0.15em",
18049
+ gap: "xxs"
17207
18050
  },
17208
18051
  card: {
17209
18052
  borderRadius: "xs"
@@ -17215,6 +18058,7 @@ placeholder="Name or address\u2026"
17215
18058
  placeholderColor: "disabled"
17216
18059
  },
17217
18060
  dataTable: {
18061
+ motion: "control",
17218
18062
  color: "primary-surface",
17219
18063
  border: "light",
17220
18064
  borderRadius: "sm",
@@ -17277,7 +18121,7 @@ placeholder="Name or address\u2026"
17277
18121
  tooltipTextColor: "on-inverse-surface",
17278
18122
  tooltipShadow: "menu",
17279
18123
  tooltipBorderRadius: "xs",
17280
- transitionMs: 120
18124
+ motion: "snap"
17281
18125
  },
17282
18126
  skeleton: {
17283
18127
  color: "surface-variant",
@@ -17306,6 +18150,7 @@ placeholder="Name or address\u2026"
17306
18150
  motion: "control"
17307
18151
  },
17308
18152
  tooltip: {
18153
+ motion: "notification",
17309
18154
  borderRadius: "xs",
17310
18155
  shadow: "raised",
17311
18156
  color: "inverse-surface",
@@ -17319,7 +18164,7 @@ placeholder="Name or address\u2026"
17319
18164
  padding: "16px",
17320
18165
  headerTypeface: "title-small",
17321
18166
  typeface: "label",
17322
- closeSymbol: "close",
18167
+ closeIcon: "close",
17323
18168
  arrowSize: 8,
17324
18169
  offset: 12,
17325
18170
  scrimColor: "rgba(0, 0, 0, 0.45)",
@@ -17340,6 +18185,62 @@ placeholder="Name or address\u2026"
17340
18185
  {
17341
18186
  package: "@uni-design-system/uni-angular",
17342
18187
  releases: [
18188
+ {
18189
+ version: "11.1.0",
18190
+ entries: [
18191
+ {
18192
+ bump: "minor",
18193
+ title: "Selection, hover and density become theme decisions on `uni-tag`, and add `uni-tag-group`.",
18194
+ body: "`uni-tag` had the right axes but made the app do the work. `selected` painted nothing \u2014 it set `aria-pressed` and swapped the lead glyph \u2014 so every toggle chip in app markup carried a `[tone]=\"on() ? 'solid' : 'soft'\"` of its own. Interactive chips had no hover state at all. The selected check was added rather than reserved, so picking a chip reflowed the whole row.\n\n**Selection paints itself.** A selected chip adds a `tag-selected` class and an interactive one adds `tag-interactive`, both as much public theme contract as `&.tone-*` already was. The base theme's `tag` variants use them: selection promotes a chip to its role's solid pair at every tone (`solid` deepens instead of refilling), and `&.tag-interactive:hover` is a `brightness(0.95)` wash that darkens fill, ink and edge together. A theme restyling either writes the rules per variant, beside the colours they belong to.\n\n**A toggle chip holds the check's place.** Bind `selected` and the chip reserves the glyph's footprint while unselected, so picking one never resizes it. A chip that already has a lead needs no slot \u2014 the check replaces the avatar or icon at identical width.\n\n**`uni-tag-group`** is a row of chips the user picks from. It renders its own chips from `items` and owns the two things an app was otherwise wiring per chip: which one is selected (`value`, plus `multiple`) and which one holds the tab stop. Keyboard model is the toolbar pattern \u2014 one tab stop for the whole row, arrow keys within it, on both axes because the row wraps. `layout=\"justify\"` stretches each filled row flush to both edges and leaves the last row at its natural widths, the way justified text leaves its last line alone. It is themed as **`tagGroup`** (`gap`, `rowGap`, `chipSize`, `chipTone`, `chipVariant`), layout only \u2014 every colour decision stays on the chips, so a group restyles with them.\n\n**Visual changes to every existing chip**, including the chips inside `uni-tag-input`:\n- A lead element and the remove control now **tuck into the rounded end** instead of starting where the radius ends \u2014 each sits concentric with the curve it is in, so a small status dot sits further in than a full lead box. A lead is balanced against, so the **label sits centred**; the tuck costs less than the old gutter did, so that balance is largely paid for rather than added. A remove control is not balanced against on its own, since it reads as an affordance rather than as content \u2014 a chip with nothing but a remove button keeps its gutter and simply tucks the glyph. A chip whose ends are too square to flow into (`borderRadius: 'xs'`) keeps the size token's gutter at both ends.\n- The `tag` typeface drops from **weight 600 to 500**. Geometry is unchanged; what made these chips read louder than the ones they replaced was the weight, not the size.\n- `border-color` and `filter` join the transition list, so an outline\u2194solid change fades its edge instead of snapping while the fill animates, and the hover wash fades in.\n\nNew `tag` theme option **`endInset`** (`number | 'auto'`) sets how far that tuck goes; `auto` derives it from the chip so the lead sits concentric with the cap. The `tag` size tokens now state `paddingInline` rather than a `padding` shorthand, since the chip reads that number back to balance the label \u2014 a theme still stating the shorthand is parsed as before.\n\n`UniTagComponent` is now generic in its value (`UniTagComponent<T extends UniTagValue = UniTagValue>`), so `value`, `removed` and `activated` carry an app's own type and `$event` flows without a closure. The default type parameter leaves every existing use compiling unchanged.",
18195
+ commit: "d00b2fe"
18196
+ }
18197
+ ],
18198
+ dependencyBumps: []
18199
+ },
18200
+ {
18201
+ version: "11.0.0",
18202
+ entries: [
18203
+ {
18204
+ bump: "major",
18205
+ title: "Require Angular 22. `@angular/common`, `@angular/core` and `@angular/forms` move from `^21.2.0` to `^22.0.0`, so 11.x tracks Angular 22 and 10.x remains the Angular 21 line \u2014 one major of this package per Angular major, as documented. The old range excluded v22 outright, so an app that had taken Angular 22 could not install this package without a peer override.",
18206
+ body: "Two consequences of the framework's own changes:\n\n**`touch` output on every form control.** Angular 22 marks a bound field touched through a dedicated `touch` output rather than through the `touched` model, which the `Field` directive now binds inward only. All sixteen controls that track touched state (input, textarea, checkbox, radio, toggle, select, combobox, multi-select, tag-input, calendar, date/date-time/time inputs, number/number-range inputs, quantity-stepper, slider) emit it wherever they already considered the user done with the control. Without it, `touched()` never flips and error display gated on it never appears.\n\n**`min` / `max` typing.** The contract now types `min`/`max` as the control's own value type rather than as numbers. Where that still fits, the input was widened (`uni-slider`). Where it does not \u2014 a text control's native numeric attributes (`uni-input`), a range control's scalar bounds (`uni-number-range-input`), a tag limit (`uni-tag-input`) \u2014 the class member steps aside and the public binding name is preserved by an alias, so **templates are unchanged**. Only code reaching these through a `ViewChild` instance is affected: `min`/`max` are now `minAttr`/`maxAttr` on `uni-input`, `minValue`/`maxValue` on `uni-number-range-input`, and `max` is `maxLength` on `uni-tag-input`. `uni-number-range-input`'s protected `valueOf()` is renamed `partValue()`, since `valueOf` collides with `Object.valueOf`.\n\nAngular 22 also makes `OnPush` the default change detection; every component here already set it explicitly.",
18207
+ commit: "8fef84f"
18208
+ },
18209
+ {
18210
+ bump: "major",
18211
+ title: "Add `uni-inline-button`, and remove the `footer` component name.",
18212
+ body: "**`uni-inline-button`** is an action that lives inside a sentence. Every other button in the library owns a box \u2014 even `ghost` carries padding and a hit area, so dropping one into a paragraph pushes the words apart and breaks the line's rhythm. This one adds no box: it inherits the surrounding type (family, size, weight, line height, letter spacing and colour) and renders as part of the run of text.\n\n```html\nYour data is processed under the terms you accepted. You can\n<button inline-button underline link>review them</button> at any time.\n```\n\nIt is always a real `<button>`, so it can _look_ like a link without claiming to be navigation: Enter and Space activate it and assistive tech announces a button rather than an unfollowable link. Reach for an `<a>` when the thing actually goes somewhere.\n\nInputs: `underline` and `link` (both tri-state against the theme's defaults, and both readable as bare attributes), `iconName` / `symbolName` with `iconPosition`, and `disable`. A glyph is sized in `em` rather than px, so the same markup reads correctly in a caption and in a headline and never changes the line height of the paragraph it sits in.\n\nIt is themed as **`inlineButton`**, with `linkColor`, `underline`, `underlineOnHover`, `underlineOffset`, `gap` and `focusColor`. This replaces the `textButton` name that had sat in `ComponentName` since before there was anything to put behind it \u2014 **`ComponentName`'s `'textButton'` is renamed to `'inlineButton'`, and the exported options type `UniTextButtonOptions` to `UniInlineButtonOptions`.** Nothing shipped a `textButton` entry, so a theme only needs the rename if it had reached for the unbacked name.\n\nOne documented limit: browsers blockify every `<button>` to `inline-block` whatever `display` it asks for, so the control is an atomic inline box. A long label wraps inside it, but the run moves to the next line whole rather than splitting where the surrounding words would. `display: contents` would fix that and cost the button its focusability, so labels should stay to a few words.\n\n**`footer` is removed** from `ComponentName` and from the base theme. It was declared and themed but never built, so a theme could set options that reached nothing. Themes that state a `footer` entry now fail to type-check; delete the entry.",
18213
+ commit: "403043a"
18214
+ },
18215
+ {
18216
+ bump: "major",
18217
+ title: "Put every remaining hardcoded animation duration on the `motion` scale. Seventeen sites across twelve components carried their own literal, so a theme could retime some of the library and not the rest.",
18218
+ body: "New `motion` options, each defaulting to the token named: `button`, `iconButton`, `checkbox`, `tabs`, `tooltip`, `dataTable`, `tag`. `uni-sort-header` names `control` directly \u2014 it has no theme entry to hang an option on. `combobox`'s chevron now turns with the popup it opens, reading that component's existing `motion` option.\n\nTimings move where the literal and the token disagreed:\n\n| | before | after | token |\n| ----------------------------------------- | ----------------- | ----------------- | -------------- |\n| button, icon-button, data-table row hover | 280ms ease | 300ms ease | `control` |\n| checkbox box and dash | 200ms ease | 300ms ease | `control` |\n| checkbox tick (drawn, trails the box) | 500ms ease | 350ms ease-in-out | `reveal` |\n| tabs ink and indicator | 150ms ease | 120ms ease | `snap` |\n| combobox chevron | 150ms ease | 100ms linear | `popup` |\n| tag fill and ink | 200ms ease | 300ms ease | `control` |\n| sort-header arrow | 350ms ease-in-out | 300ms ease | `control` |\n| alert, snackbar dismiss | 300ms | 350ms | `notification` |\n| data-table detail expand | 300ms ease | 350ms ease-in-out | `reveal` |\n| tooltip fade, data-table loading overlay | 350ms | unchanged | `notification` |\n\nTwo of these lived in the theme rather than in a component: `button.fixed` and `tag.fixed` each baked a `transition`, and the button's won over the component that had already been migrated \u2014 so the button kept its old timing regardless. Both are gone; the components own their transitions and follow the token at runtime. A spec now fails if any shipped theme states a duration in a style block.\n\n`uni-skeleton` still stays out: its shimmer is a loop, not a transition.",
18219
+ commit: "2e4a6a4"
18220
+ },
18221
+ {
18222
+ bump: "major",
18223
+ title: "Move `uni-slider`'s click-to-jump timing onto the `motion` scale. The `slider.transitionMs` theme option is removed; use `slider.motion` \u2014 a token name \u2014 instead.",
18224
+ body: "It was the last duration option outside the scale. The other eight went in 9.0.0, but the slider was rewritten for the numeric family afterwards and reintroduced its own, so a theme could retime every animated component except this one.\n\nThe scale gains a sixth token for it, `snap` (120ms `ease`), which is the slider's exact previous timing \u2014 nothing moves faster or slower than before. It is a separate token rather than a reuse of `control` because the two describe different motion: `control` times a state change in place (a hover fill, a check mark) and runs 300ms, where a slider thumb covers distance to a value the user just chose and at 300ms reads as lagging the input rather than answering it. A drag is still never animated.\n\nThemes setting `slider.transitionMs` should set `motion.snap` instead, which also retimes anything else pointed at that token.",
18225
+ commit: "2dc4fb5"
18226
+ },
18227
+ {
18228
+ bump: "major",
18229
+ title: "Composite components now render their glyphs through `uni-icon` theme tokens instead of `uni-symbol` ligatures, completing the rule set in `AGENTS.md`. Thirteen theme options are renamed and retyped from `string` to `IconName`:",
18230
+ body: "| Component | before | after |\n| ---------------------- | --------------------------------- | ------------------------------------- |\n| date-input, time-input | `toggleSymbol` | `toggleIcon` (`calendar`, `clock`) |\n| calendar | `navPrevSymbol` / `navNextSymbol` | `navPrevIcon` / `navNextIcon` |\n| menu-item | `activeSymbol` | `activeIcon` |\n| avatar | `fallbackSymbol` | `fallbackIcon` (`person` \u2192 `profile`) |\n| breadcrumb | `separatorSymbol` | `separatorIcon` |\n| search-input | `searchSymbol` / `clearSymbol` | `searchIcon` / `clearIcon` |\n| callout, popover | `closeSymbol` | `closeIcon` |\n\n`drawer-header` and `dialog-header` shipped both `closeButtonIcon` and `closeButtonSymbol`; the `*Symbol` half is removed, and since `symbolName` outranked `iconName` inside the icon button, those two headers were still rendering the ligature path until now.\n\nFour glyphs join `BaseIcons` (65 total): `arrowUp`/`arrowDown` and `chevronsLeft`/`chevronsRight`, which is what unblocked `uni-sort-header` and `uni-paginator`. `select-input`, `multi-select-dropdown` and `data-search` also stopped hardcoding ligatures.\n\n**Migrating:** rename the option in your theme and swap the Material ligature for an icon token \u2014 `activeSymbol: 'check'` becomes `activeIcon: 'check'`, `toggleSymbol: 'calendar_month'` becomes `toggleIcon: 'calendar'`. Any glyph you need that `BaseIcons` lacks can be registered through `createTheme({ icons })`.\n\n`uni-symbol` is unchanged and still the right tool for app-facing inputs that take arbitrary ligature names \u2014 `symbolName` on icon-button, tag, alert, snackbar and menu-item, and `symbolLeft`/`symbolRight` on button. One consequence worth knowing: `uni-icon` has no variable-font axes, so a theme setting `symbol: { options: { weight } }` no longer affects these composites' glyphs \u2014 they take the icon set's weight (300). The Wellsourced theme, which sets weight 200, has accepted this.",
18231
+ commit: "44feb5d"
18232
+ },
18233
+ {
18234
+ bump: "major",
18235
+ title: "Remove the deprecated `toggle.size` theme option and wire up three component names that were declared but unreachable.",
18236
+ body: "`toggle.size` was the last `@deprecated` API in the library \u2014 the pre-`sizes` geometry (width 2x, knob 0.8x) that outranked the size block for every instance regardless of a toggle's own `size` input. No shipped theme set it. Use the `toggle.sizes` block, which gives each size token its own `width` / `height` / `padding`.\n\n`select`, `buttonGroup` and `progressBar` were listed in `ComponentName` with no theme entry and no `COMPONENT_NAME` provider behind them, so a theme could not dress them however it tried. Each now has an entry whose defaults are exactly what the component previously hardcoded, so nothing moves:\n- **`select`** \u2014 `toggleIcon`, `toggleColor`, `toggleSize` for the dropdown affordance, matching `uni-combobox`'s (`chevronDown`, `on-background-variant`, 20).\n- **`buttonGroup`** \u2014 `border` and `borderRadius` for the segmented frame, previously a literal `quaternary` border and 4px corners.\n- **`progressBar`** \u2014 `trackColor`, `fillColor`, `completeColor`, `borderColor` and `strokeWidth`, previously read straight off the palette.\n\nThe two remaining names are dealt with separately: `textButton` is renamed `inlineButton` and now backs the new `uni-inline-button`, and `footer` is removed from `ComponentName` altogether.",
18237
+ commit: "0b1c528"
18238
+ }
18239
+ ],
18240
+ dependencyBumps: [
18241
+ "@uni-design-system/uni-core@11.0.0"
18242
+ ]
18243
+ },
17343
18244
  {
17344
18245
  version: "10.4.0",
17345
18246
  entries: [
@@ -18128,6 +19029,66 @@ placeholder="Name or address\u2026"
18128
19029
  {
18129
19030
  package: "@uni-design-system/uni-core",
18130
19031
  releases: [
19032
+ {
19033
+ version: "11.1.0",
19034
+ entries: [
19035
+ {
19036
+ bump: "minor",
19037
+ title: "Selection, hover and density become theme decisions on `uni-tag`, and add `uni-tag-group`.",
19038
+ body: "`uni-tag` had the right axes but made the app do the work. `selected` painted nothing \u2014 it set `aria-pressed` and swapped the lead glyph \u2014 so every toggle chip in app markup carried a `[tone]=\"on() ? 'solid' : 'soft'\"` of its own. Interactive chips had no hover state at all. The selected check was added rather than reserved, so picking a chip reflowed the whole row.\n\n**Selection paints itself.** A selected chip adds a `tag-selected` class and an interactive one adds `tag-interactive`, both as much public theme contract as `&.tone-*` already was. The base theme's `tag` variants use them: selection promotes a chip to its role's solid pair at every tone (`solid` deepens instead of refilling), and `&.tag-interactive:hover` is a `brightness(0.95)` wash that darkens fill, ink and edge together. A theme restyling either writes the rules per variant, beside the colours they belong to.\n\n**A toggle chip holds the check's place.** Bind `selected` and the chip reserves the glyph's footprint while unselected, so picking one never resizes it. A chip that already has a lead needs no slot \u2014 the check replaces the avatar or icon at identical width.\n\n**`uni-tag-group`** is a row of chips the user picks from. It renders its own chips from `items` and owns the two things an app was otherwise wiring per chip: which one is selected (`value`, plus `multiple`) and which one holds the tab stop. Keyboard model is the toolbar pattern \u2014 one tab stop for the whole row, arrow keys within it, on both axes because the row wraps. `layout=\"justify\"` stretches each filled row flush to both edges and leaves the last row at its natural widths, the way justified text leaves its last line alone. It is themed as **`tagGroup`** (`gap`, `rowGap`, `chipSize`, `chipTone`, `chipVariant`), layout only \u2014 every colour decision stays on the chips, so a group restyles with them.\n\n**Visual changes to every existing chip**, including the chips inside `uni-tag-input`:\n- A lead element and the remove control now **tuck into the rounded end** instead of starting where the radius ends \u2014 each sits concentric with the curve it is in, so a small status dot sits further in than a full lead box. A lead is balanced against, so the **label sits centred**; the tuck costs less than the old gutter did, so that balance is largely paid for rather than added. A remove control is not balanced against on its own, since it reads as an affordance rather than as content \u2014 a chip with nothing but a remove button keeps its gutter and simply tucks the glyph. A chip whose ends are too square to flow into (`borderRadius: 'xs'`) keeps the size token's gutter at both ends.\n- The `tag` typeface drops from **weight 600 to 500**. Geometry is unchanged; what made these chips read louder than the ones they replaced was the weight, not the size.\n- `border-color` and `filter` join the transition list, so an outline\u2194solid change fades its edge instead of snapping while the fill animates, and the hover wash fades in.\n\nNew `tag` theme option **`endInset`** (`number | 'auto'`) sets how far that tuck goes; `auto` derives it from the chip so the lead sits concentric with the cap. The `tag` size tokens now state `paddingInline` rather than a `padding` shorthand, since the chip reads that number back to balance the label \u2014 a theme still stating the shorthand is parsed as before.\n\n`UniTagComponent` is now generic in its value (`UniTagComponent<T extends UniTagValue = UniTagValue>`), so `value`, `removed` and `activated` carry an app's own type and `$event` flows without a closure. The default type parameter leaves every existing use compiling unchanged.",
19039
+ commit: "d00b2fe"
19040
+ }
19041
+ ],
19042
+ dependencyBumps: []
19043
+ },
19044
+ {
19045
+ version: "11.0.0",
19046
+ entries: [
19047
+ {
19048
+ bump: "major",
19049
+ title: "Require Angular 22. `@angular/common`, `@angular/core` and `@angular/forms` move from `^21.2.0` to `^22.0.0`, so 11.x tracks Angular 22 and 10.x remains the Angular 21 line \u2014 one major of this package per Angular major, as documented. The old range excluded v22 outright, so an app that had taken Angular 22 could not install this package without a peer override.",
19050
+ body: "Two consequences of the framework's own changes:\n\n**`touch` output on every form control.** Angular 22 marks a bound field touched through a dedicated `touch` output rather than through the `touched` model, which the `Field` directive now binds inward only. All sixteen controls that track touched state (input, textarea, checkbox, radio, toggle, select, combobox, multi-select, tag-input, calendar, date/date-time/time inputs, number/number-range inputs, quantity-stepper, slider) emit it wherever they already considered the user done with the control. Without it, `touched()` never flips and error display gated on it never appears.\n\n**`min` / `max` typing.** The contract now types `min`/`max` as the control's own value type rather than as numbers. Where that still fits, the input was widened (`uni-slider`). Where it does not \u2014 a text control's native numeric attributes (`uni-input`), a range control's scalar bounds (`uni-number-range-input`), a tag limit (`uni-tag-input`) \u2014 the class member steps aside and the public binding name is preserved by an alias, so **templates are unchanged**. Only code reaching these through a `ViewChild` instance is affected: `min`/`max` are now `minAttr`/`maxAttr` on `uni-input`, `minValue`/`maxValue` on `uni-number-range-input`, and `max` is `maxLength` on `uni-tag-input`. `uni-number-range-input`'s protected `valueOf()` is renamed `partValue()`, since `valueOf` collides with `Object.valueOf`.\n\nAngular 22 also makes `OnPush` the default change detection; every component here already set it explicitly.",
19051
+ commit: "8fef84f"
19052
+ },
19053
+ {
19054
+ bump: "major",
19055
+ title: "Add `uni-inline-button`, and remove the `footer` component name.",
19056
+ body: "**`uni-inline-button`** is an action that lives inside a sentence. Every other button in the library owns a box \u2014 even `ghost` carries padding and a hit area, so dropping one into a paragraph pushes the words apart and breaks the line's rhythm. This one adds no box: it inherits the surrounding type (family, size, weight, line height, letter spacing and colour) and renders as part of the run of text.\n\n```html\nYour data is processed under the terms you accepted. You can\n<button inline-button underline link>review them</button> at any time.\n```\n\nIt is always a real `<button>`, so it can _look_ like a link without claiming to be navigation: Enter and Space activate it and assistive tech announces a button rather than an unfollowable link. Reach for an `<a>` when the thing actually goes somewhere.\n\nInputs: `underline` and `link` (both tri-state against the theme's defaults, and both readable as bare attributes), `iconName` / `symbolName` with `iconPosition`, and `disable`. A glyph is sized in `em` rather than px, so the same markup reads correctly in a caption and in a headline and never changes the line height of the paragraph it sits in.\n\nIt is themed as **`inlineButton`**, with `linkColor`, `underline`, `underlineOnHover`, `underlineOffset`, `gap` and `focusColor`. This replaces the `textButton` name that had sat in `ComponentName` since before there was anything to put behind it \u2014 **`ComponentName`'s `'textButton'` is renamed to `'inlineButton'`, and the exported options type `UniTextButtonOptions` to `UniInlineButtonOptions`.** Nothing shipped a `textButton` entry, so a theme only needs the rename if it had reached for the unbacked name.\n\nOne documented limit: browsers blockify every `<button>` to `inline-block` whatever `display` it asks for, so the control is an atomic inline box. A long label wraps inside it, but the run moves to the next line whole rather than splitting where the surrounding words would. `display: contents` would fix that and cost the button its focusability, so labels should stay to a few words.\n\n**`footer` is removed** from `ComponentName` and from the base theme. It was declared and themed but never built, so a theme could set options that reached nothing. Themes that state a `footer` entry now fail to type-check; delete the entry.",
19057
+ commit: "403043a"
19058
+ },
19059
+ {
19060
+ bump: "major",
19061
+ title: "Put every remaining hardcoded animation duration on the `motion` scale. Seventeen sites across twelve components carried their own literal, so a theme could retime some of the library and not the rest.",
19062
+ body: "New `motion` options, each defaulting to the token named: `button`, `iconButton`, `checkbox`, `tabs`, `tooltip`, `dataTable`, `tag`. `uni-sort-header` names `control` directly \u2014 it has no theme entry to hang an option on. `combobox`'s chevron now turns with the popup it opens, reading that component's existing `motion` option.\n\nTimings move where the literal and the token disagreed:\n\n| | before | after | token |\n| ----------------------------------------- | ----------------- | ----------------- | -------------- |\n| button, icon-button, data-table row hover | 280ms ease | 300ms ease | `control` |\n| checkbox box and dash | 200ms ease | 300ms ease | `control` |\n| checkbox tick (drawn, trails the box) | 500ms ease | 350ms ease-in-out | `reveal` |\n| tabs ink and indicator | 150ms ease | 120ms ease | `snap` |\n| combobox chevron | 150ms ease | 100ms linear | `popup` |\n| tag fill and ink | 200ms ease | 300ms ease | `control` |\n| sort-header arrow | 350ms ease-in-out | 300ms ease | `control` |\n| alert, snackbar dismiss | 300ms | 350ms | `notification` |\n| data-table detail expand | 300ms ease | 350ms ease-in-out | `reveal` |\n| tooltip fade, data-table loading overlay | 350ms | unchanged | `notification` |\n\nTwo of these lived in the theme rather than in a component: `button.fixed` and `tag.fixed` each baked a `transition`, and the button's won over the component that had already been migrated \u2014 so the button kept its old timing regardless. Both are gone; the components own their transitions and follow the token at runtime. A spec now fails if any shipped theme states a duration in a style block.\n\n`uni-skeleton` still stays out: its shimmer is a loop, not a transition.",
19063
+ commit: "2e4a6a4"
19064
+ },
19065
+ {
19066
+ bump: "major",
19067
+ title: "Move `uni-slider`'s click-to-jump timing onto the `motion` scale. The `slider.transitionMs` theme option is removed; use `slider.motion` \u2014 a token name \u2014 instead.",
19068
+ body: "It was the last duration option outside the scale. The other eight went in 9.0.0, but the slider was rewritten for the numeric family afterwards and reintroduced its own, so a theme could retime every animated component except this one.\n\nThe scale gains a sixth token for it, `snap` (120ms `ease`), which is the slider's exact previous timing \u2014 nothing moves faster or slower than before. It is a separate token rather than a reuse of `control` because the two describe different motion: `control` times a state change in place (a hover fill, a check mark) and runs 300ms, where a slider thumb covers distance to a value the user just chose and at 300ms reads as lagging the input rather than answering it. A drag is still never animated.\n\nThemes setting `slider.transitionMs` should set `motion.snap` instead, which also retimes anything else pointed at that token.",
19069
+ commit: "2dc4fb5"
19070
+ },
19071
+ {
19072
+ bump: "major",
19073
+ title: "Composite components now render their glyphs through `uni-icon` theme tokens instead of `uni-symbol` ligatures, completing the rule set in `AGENTS.md`. Thirteen theme options are renamed and retyped from `string` to `IconName`:",
19074
+ body: "| Component | before | after |\n| ---------------------- | --------------------------------- | ------------------------------------- |\n| date-input, time-input | `toggleSymbol` | `toggleIcon` (`calendar`, `clock`) |\n| calendar | `navPrevSymbol` / `navNextSymbol` | `navPrevIcon` / `navNextIcon` |\n| menu-item | `activeSymbol` | `activeIcon` |\n| avatar | `fallbackSymbol` | `fallbackIcon` (`person` \u2192 `profile`) |\n| breadcrumb | `separatorSymbol` | `separatorIcon` |\n| search-input | `searchSymbol` / `clearSymbol` | `searchIcon` / `clearIcon` |\n| callout, popover | `closeSymbol` | `closeIcon` |\n\n`drawer-header` and `dialog-header` shipped both `closeButtonIcon` and `closeButtonSymbol`; the `*Symbol` half is removed, and since `symbolName` outranked `iconName` inside the icon button, those two headers were still rendering the ligature path until now.\n\nFour glyphs join `BaseIcons` (65 total): `arrowUp`/`arrowDown` and `chevronsLeft`/`chevronsRight`, which is what unblocked `uni-sort-header` and `uni-paginator`. `select-input`, `multi-select-dropdown` and `data-search` also stopped hardcoding ligatures.\n\n**Migrating:** rename the option in your theme and swap the Material ligature for an icon token \u2014 `activeSymbol: 'check'` becomes `activeIcon: 'check'`, `toggleSymbol: 'calendar_month'` becomes `toggleIcon: 'calendar'`. Any glyph you need that `BaseIcons` lacks can be registered through `createTheme({ icons })`.\n\n`uni-symbol` is unchanged and still the right tool for app-facing inputs that take arbitrary ligature names \u2014 `symbolName` on icon-button, tag, alert, snackbar and menu-item, and `symbolLeft`/`symbolRight` on button. One consequence worth knowing: `uni-icon` has no variable-font axes, so a theme setting `symbol: { options: { weight } }` no longer affects these composites' glyphs \u2014 they take the icon set's weight (300). The Wellsourced theme, which sets weight 200, has accepted this.",
19075
+ commit: "44feb5d"
19076
+ },
19077
+ {
19078
+ bump: "major",
19079
+ title: "Remove the deprecated `toggle.size` theme option and wire up three component names that were declared but unreachable.",
19080
+ body: "`toggle.size` was the last `@deprecated` API in the library \u2014 the pre-`sizes` geometry (width 2x, knob 0.8x) that outranked the size block for every instance regardless of a toggle's own `size` input. No shipped theme set it. Use the `toggle.sizes` block, which gives each size token its own `width` / `height` / `padding`.\n\n`select`, `buttonGroup` and `progressBar` were listed in `ComponentName` with no theme entry and no `COMPONENT_NAME` provider behind them, so a theme could not dress them however it tried. Each now has an entry whose defaults are exactly what the component previously hardcoded, so nothing moves:\n- **`select`** \u2014 `toggleIcon`, `toggleColor`, `toggleSize` for the dropdown affordance, matching `uni-combobox`'s (`chevronDown`, `on-background-variant`, 20).\n- **`buttonGroup`** \u2014 `border` and `borderRadius` for the segmented frame, previously a literal `quaternary` border and 4px corners.\n- **`progressBar`** \u2014 `trackColor`, `fillColor`, `completeColor`, `borderColor` and `strokeWidth`, previously read straight off the palette.\n\nThe two remaining names are dealt with separately: `textButton` is renamed `inlineButton` and now backs the new `uni-inline-button`, and `footer` is removed from `ComponentName` altogether.",
19081
+ commit: "0b1c528"
19082
+ },
19083
+ {
19084
+ bump: "patch",
19085
+ title: "Fix unreadable text in `uni-card` under dark themes. The card's theme entry painted `backgroundColor` without the matching `color`, so any unstyled text inside it fell back to the user-agent default black. On a light theme that happened to read; on every dark theme it rendered black on a near-black surface \u2014 1.11:1 against a 4.5:1 AA requirement, reported from the theme switcher's preview card.",
19086
+ body: "The card now states `on-background` alongside its background, as `cardHeader` already did for each of its variants. All six registered themes measure between 13.8:1 and 18.1:1 on that text.\n\nAdded with the fix: a spec asserting the invariant across every component entry in the shipped themes \u2014 anything that paints a `backgroundColor` must also state a `color` \u2014 so the next half-painted surface fails a test rather than reaching a consumer.",
19087
+ commit: "85a1ec5"
19088
+ }
19089
+ ],
19090
+ dependencyBumps: []
19091
+ },
18131
19092
  {
18132
19093
  version: "10.4.0",
18133
19094
  entries: [
@@ -18688,6 +19649,29 @@ placeholder="Name or address\u2026"
18688
19649
  {
18689
19650
  package: "@uni-design-system/uni-react",
18690
19651
  releases: [
19652
+ {
19653
+ version: "11.1.0",
19654
+ entries: [],
19655
+ dependencyBumps: []
19656
+ },
19657
+ {
19658
+ version: "11.0.0",
19659
+ entries: [
19660
+ {
19661
+ bump: "major",
19662
+ title: "Require Angular 22. `@angular/common`, `@angular/core` and `@angular/forms` move from `^21.2.0` to `^22.0.0`, so 11.x tracks Angular 22 and 10.x remains the Angular 21 line \u2014 one major of this package per Angular major, as documented. The old range excluded v22 outright, so an app that had taken Angular 22 could not install this package without a peer override.",
19663
+ body: "Two consequences of the framework's own changes:\n\n**`touch` output on every form control.** Angular 22 marks a bound field touched through a dedicated `touch` output rather than through the `touched` model, which the `Field` directive now binds inward only. All sixteen controls that track touched state (input, textarea, checkbox, radio, toggle, select, combobox, multi-select, tag-input, calendar, date/date-time/time inputs, number/number-range inputs, quantity-stepper, slider) emit it wherever they already considered the user done with the control. Without it, `touched()` never flips and error display gated on it never appears.\n\n**`min` / `max` typing.** The contract now types `min`/`max` as the control's own value type rather than as numbers. Where that still fits, the input was widened (`uni-slider`). Where it does not \u2014 a text control's native numeric attributes (`uni-input`), a range control's scalar bounds (`uni-number-range-input`), a tag limit (`uni-tag-input`) \u2014 the class member steps aside and the public binding name is preserved by an alias, so **templates are unchanged**. Only code reaching these through a `ViewChild` instance is affected: `min`/`max` are now `minAttr`/`maxAttr` on `uni-input`, `minValue`/`maxValue` on `uni-number-range-input`, and `max` is `maxLength` on `uni-tag-input`. `uni-number-range-input`'s protected `valueOf()` is renamed `partValue()`, since `valueOf` collides with `Object.valueOf`.\n\nAngular 22 also makes `OnPush` the default change detection; every component here already set it explicitly.",
19664
+ commit: "8fef84f"
19665
+ },
19666
+ {
19667
+ bump: "patch",
19668
+ title: "Mark the React package experimental. It shares a version number with `@uni-design-system/uni-angular` because the packages release together as a fixed group, not because they are at parity \u2014 React implements roughly a sixth of the Angular library's components and carries a single spec file. The version was reading as a maturity signal it had not earned.",
19669
+ body: "The package description and a README banner now say so; nothing about the code changes, and it stays published.",
19670
+ commit: "0b1c528"
19671
+ }
19672
+ ],
19673
+ dependencyBumps: []
19674
+ },
18691
19675
  {
18692
19676
  version: "10.4.0",
18693
19677
  entries: [],
@@ -18941,6 +19925,23 @@ placeholder="Name or address\u2026"
18941
19925
  {
18942
19926
  package: "@uni-design-system/uni-mcp",
18943
19927
  releases: [
19928
+ {
19929
+ version: "11.1.0",
19930
+ entries: [],
19931
+ dependencyBumps: []
19932
+ },
19933
+ {
19934
+ version: "11.0.0",
19935
+ entries: [
19936
+ {
19937
+ bump: "major",
19938
+ title: "Require Angular 22. `@angular/common`, `@angular/core` and `@angular/forms` move from `^21.2.0` to `^22.0.0`, so 11.x tracks Angular 22 and 10.x remains the Angular 21 line \u2014 one major of this package per Angular major, as documented. The old range excluded v22 outright, so an app that had taken Angular 22 could not install this package without a peer override.",
19939
+ body: "Two consequences of the framework's own changes:\n\n**`touch` output on every form control.** Angular 22 marks a bound field touched through a dedicated `touch` output rather than through the `touched` model, which the `Field` directive now binds inward only. All sixteen controls that track touched state (input, textarea, checkbox, radio, toggle, select, combobox, multi-select, tag-input, calendar, date/date-time/time inputs, number/number-range inputs, quantity-stepper, slider) emit it wherever they already considered the user done with the control. Without it, `touched()` never flips and error display gated on it never appears.\n\n**`min` / `max` typing.** The contract now types `min`/`max` as the control's own value type rather than as numbers. Where that still fits, the input was widened (`uni-slider`). Where it does not \u2014 a text control's native numeric attributes (`uni-input`), a range control's scalar bounds (`uni-number-range-input`), a tag limit (`uni-tag-input`) \u2014 the class member steps aside and the public binding name is preserved by an alias, so **templates are unchanged**. Only code reaching these through a `ViewChild` instance is affected: `min`/`max` are now `minAttr`/`maxAttr` on `uni-input`, `minValue`/`maxValue` on `uni-number-range-input`, and `max` is `maxLength` on `uni-tag-input`. `uni-number-range-input`'s protected `valueOf()` is renamed `partValue()`, since `valueOf` collides with `Object.valueOf`.\n\nAngular 22 also makes `OnPush` the default change detection; every component here already set it explicitly.",
19940
+ commit: "8fef84f"
19941
+ }
19942
+ ],
19943
+ dependencyBumps: []
19944
+ },
18944
19945
  {
18945
19946
  version: "10.4.0",
18946
19947
  entries: [],
@@ -19959,6 +20960,10 @@ var BaseIcons = {
19959
20960
  chevronRight: "data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='m517.85-480-184-184L376-706.15 602.15-480 376-253.85 333.85-296l184-184Z'/%3e%3c/svg%3e",
19960
20961
  arrowLeft: "data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='m294.92-450 227.85 227.85L480-180 180-480l300-300 42.77 42.15L294.92-510H780v60H294.92Z'/%3e%3c/svg%3e",
19961
20962
  arrowRight: "data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M665.08-450H180v-60h485.08L437.23-737.85 480-780l300 300-300 300-42.77-42.15L665.08-450Z'/%3e%3c/svg%3e",
20963
+ arrowUp: "data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M450-180v-485.08L222.15-437.23 180-480l300-300 300 300-42.15 42.77L510-665.08V-180h-60Z'/%3e%3c/svg%3e",
20964
+ arrowDown: "data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M450-780v485.08L222.15-522.77 180-480l300 300 300-300-42.15-42.77L510-294.92V-780h-60Z'/%3e%3c/svg%3e",
20965
+ chevronsLeft: "data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M445-253.85 218.85-480 445-706.15 487.15-664 303.77-480l183.38 184L445-253.85Zm254 0L472.85-480 699-706.15 741.15-664 557.77-480l183.38 184L699-253.85Z'/%3e%3c/svg%3e",
20966
+ chevronsRight: "data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M402.23-480 218.85-664 261-706.15 487.15-480 261-253.85 218.85-296l183.38-184Zm254 0L472.85-664 515-706.15 741.15-480 515-253.85 472.85-296l183.38-184Z'/%3e%3c/svg%3e",
19962
20967
  home: "data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M240-200h133.85v-237.69h212.3V-200H720v-360L480-740.77 240-560v360Zm-60 60v-450l300-225.77L780-590v450H526.15v-237.69h-92.3V-140H180Zm300-330.38Z'/%3e%3c/svg%3e",
19963
20968
  building: "data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M130-136.92v-540h160v-160h380v320h160v380H530v-160H430v160H130Zm60-60h100v-100H190v100Zm0-160h100v-100H190v100Zm0-160h100v-100H190v100Zm160 160h100v-100H350v100Zm0-160h100v-100H350v100Zm0-160h100v-100H350v100Zm160 320h100v-100H510v100Zm0-160h100v-100H510v100Zm0-160h100v-100H510v100Zm160 480h100v-100H670v100Zm0-160h100v-100H670v100Z'/%3e%3c/svg%3e",
19964
20969
  externalLink: "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-21h252.3v60h-252.3q-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.85h535.38q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46v-252.3h60v252.3Q820-182 799-161q-21 21-51.31 21H212.31Zm176.46-206.62-42.15-42.15L717.85-760H560v-60h260v260h-60v-157.85L388.77-346.62Z'/%3e%3c/svg%3e",
@@ -20163,7 +21168,7 @@ var BaseTypography = {
20163
21168
  fontFamily: "Red Hat Display",
20164
21169
  fontSize: 15,
20165
21170
  lineHeight: 20,
20166
- fontWeight: 600
21171
+ fontWeight: 500
20167
21172
  },
20168
21173
  input: {
20169
21174
  fontFamily: "Red Hat Display",
@@ -20213,6 +21218,10 @@ var BaseMotion = {
20213
21218
  control: {
20214
21219
  duration: 300,
20215
21220
  easing: "ease"
21221
+ },
21222
+ snap: {
21223
+ duration: 120,
21224
+ easing: "ease"
20216
21225
  }
20217
21226
  };
20218
21227
  var BaseBackdrops = { scrim: {
@@ -20254,14 +21263,26 @@ var SELECTION_ACCENTS = {
20254
21263
  var tagVariant = (c, role) => ({ [role]: {
20255
21264
  backgroundColor: c[`${role}-container`],
20256
21265
  color: c[`on-${role}-container`],
20257
- "&.tone-solid": {
21266
+ "&.tag-selected": {
20258
21267
  backgroundColor: c[role],
20259
21268
  color: c[`on-${role}`]
20260
21269
  },
21270
+ "&.tag-interactive:hover": { filter: "brightness(0.95)" },
21271
+ "&.tone-solid": {
21272
+ backgroundColor: c[role],
21273
+ color: c[`on-${role}`],
21274
+ "&.tag-selected": { filter: "brightness(0.9)" },
21275
+ "&.tag-selected.tag-interactive:hover": { filter: "brightness(0.85)" }
21276
+ },
20261
21277
  "&.tone-outline": {
20262
21278
  backgroundColor: "transparent",
20263
21279
  color: c[role],
20264
- borderColor: c[`on-${role}-container-border`] ?? c[role]
21280
+ borderColor: c[`on-${role}-container-border`] ?? c[role],
21281
+ "&.tag-selected": {
21282
+ backgroundColor: c[role],
21283
+ color: c[`on-${role}`],
21284
+ borderColor: c[role]
21285
+ }
20265
21286
  }
20266
21287
  } });
20267
21288
  var buildComponents = (c) => ({
@@ -20275,7 +21296,7 @@ var buildComponents = (c) => ({
20275
21296
  typeface: "label",
20276
21297
  color: "on-background-variant",
20277
21298
  currentColor: "on-background",
20278
- separatorSymbol: "chevron_right",
21299
+ separatorIcon: "chevronRight",
20279
21300
  gap: "xs"
20280
21301
  } },
20281
21302
  appBar: { options: {
@@ -20323,7 +21344,7 @@ var buildComponents = (c) => ({
20323
21344
  options: {
20324
21345
  borderRadius: "max",
20325
21346
  typeface: "subtitle-2",
20326
- fallbackSymbol: "person"
21347
+ fallbackIcon: "profile"
20327
21348
  },
20328
21349
  variants: {
20329
21350
  primary: {
@@ -20380,8 +21401,8 @@ var buildComponents = (c) => ({
20380
21401
  ringWidth: 2
20381
21402
  } },
20382
21403
  searchInput: { options: {
20383
- searchSymbol: "search",
20384
- clearSymbol: "close",
21404
+ searchIcon: "search",
21405
+ clearIcon: "close",
20385
21406
  listColor: "primary-surface",
20386
21407
  listShadow: "menu",
20387
21408
  listBorderRadius: "xs",
@@ -20390,6 +21411,7 @@ var buildComponents = (c) => ({
20390
21411
  } },
20391
21412
  checkbox: {
20392
21413
  options: {
21414
+ motion: "control",
20393
21415
  size: 20,
20394
21416
  boxColor: "surface",
20395
21417
  borderRadius: 2,
@@ -20439,6 +21461,22 @@ var buildComponents = (c) => ({
20439
21461
  closeButtonIcon: "close",
20440
21462
  closeButtonSize: "md"
20441
21463
  } },
21464
+ select: { options: {
21465
+ toggleIcon: "chevronDown",
21466
+ toggleColor: "on-background-variant",
21467
+ toggleSize: 20
21468
+ } },
21469
+ buttonGroup: { options: {
21470
+ border: "quaternary",
21471
+ borderRadius: 4
21472
+ } },
21473
+ progressBar: { options: {
21474
+ trackColor: "primary-surface",
21475
+ fillColor: "secondary-surface",
21476
+ completeColor: "secondary",
21477
+ borderColor: "on-background-variant",
21478
+ strokeWidth: 1
21479
+ } },
20442
21480
  dropdown: { options: {
20443
21481
  border: "none",
20444
21482
  borderRadius: "xxs",
@@ -20466,7 +21504,7 @@ var buildComponents = (c) => ({
20466
21504
  typeface: "label",
20467
21505
  textColor: void 0,
20468
21506
  hoverColor: "primary-container",
20469
- activeSymbol: "check",
21507
+ activeIcon: "check",
20470
21508
  motion: "control"
20471
21509
  },
20472
21510
  variants: {
@@ -20490,7 +21528,7 @@ var buildComponents = (c) => ({
20490
21528
  maxWidth: "38ch",
20491
21529
  offset: 7,
20492
21530
  arrowSize: 8,
20493
- closeSymbol: "close",
21531
+ closeIcon: "close",
20494
21532
  headerTypeface: "title-small",
20495
21533
  tooltipPadding: "4px 8px",
20496
21534
  tooltipOpenDelay: 500,
@@ -20498,12 +21536,6 @@ var buildComponents = (c) => ({
20498
21536
  motion: "panel"
20499
21537
  } },
20500
21538
  expand: { options: { motion: "reveal" } },
20501
- footer: { options: {
20502
- height: 52,
20503
- color: "primary",
20504
- logoHeight: 18.6,
20505
- logoPadding: "md"
20506
- } },
20507
21539
  input: { options: {
20508
21540
  typeface: "input",
20509
21541
  color: "primary-surface",
@@ -20562,6 +21594,7 @@ var buildComponents = (c) => ({
20562
21594
  }
20563
21595
  },
20564
21596
  tabs: { options: {
21597
+ motion: "snap",
20565
21598
  typeface: "title-small",
20566
21599
  textColor: "on-surface-variant",
20567
21600
  activeTextColor: "primary",
@@ -20589,14 +21622,15 @@ var buildComponents = (c) => ({
20589
21622
  typeface: "tag",
20590
21623
  gap: "xs",
20591
21624
  removeIcon: "close",
20592
- selectedIcon: "check"
21625
+ selectedIcon: "check",
21626
+ motion: "control",
21627
+ endInset: "auto"
20593
21628
  },
20594
21629
  fixed: {
20595
21630
  display: "inline-flex",
20596
21631
  alignItems: "center",
20597
21632
  maxWidth: "100%",
20598
- border: "1px solid transparent",
20599
- transition: "background-color .2s ease, color .2s ease"
21633
+ border: "1px solid transparent"
20600
21634
  },
20601
21635
  variants: {
20602
21636
  ...tagVariant(c, "primary"),
@@ -20607,13 +21641,25 @@ var buildComponents = (c) => ({
20607
21641
  ghost: {
20608
21642
  backgroundColor: "transparent",
20609
21643
  color: c["on-background"],
20610
- "&.tone-solid": {
21644
+ "&.tag-selected": {
20611
21645
  backgroundColor: c["surface-variant"],
20612
21646
  color: c["on-surface-variant"]
20613
21647
  },
21648
+ "&.tag-interactive:hover": { filter: "brightness(0.95)" },
21649
+ "&.tone-solid": {
21650
+ backgroundColor: c["surface-variant"],
21651
+ color: c["on-surface-variant"],
21652
+ "&.tag-selected": { filter: "brightness(0.9)" },
21653
+ "&.tag-selected.tag-interactive:hover": { filter: "brightness(0.85)" }
21654
+ },
20614
21655
  "&.tone-outline": {
20615
21656
  backgroundColor: "transparent",
20616
- borderColor: c.outline
21657
+ borderColor: c.outline,
21658
+ "&.tag-selected": {
21659
+ backgroundColor: c["surface-variant"],
21660
+ color: c["on-surface-variant"],
21661
+ borderColor: c.outline
21662
+ }
20617
21663
  }
20618
21664
  },
20619
21665
  disabled: {
@@ -20633,20 +21679,31 @@ var buildComponents = (c) => ({
20633
21679
  sm: {
20634
21680
  height: 20,
20635
21681
  fontSize: 12,
20636
- padding: "0 8px"
21682
+ paddingInline: 8
20637
21683
  },
20638
21684
  md: {
20639
21685
  height: 24,
20640
21686
  fontSize: 13,
20641
- padding: "0 10px"
21687
+ paddingInline: 10
20642
21688
  },
20643
21689
  lg: {
20644
21690
  height: 32,
20645
21691
  fontSize: 15,
20646
- padding: "0 12px"
21692
+ paddingInline: 12
20647
21693
  }
20648
21694
  }
20649
21695
  },
21696
+ tagGroup: {
21697
+ options: {
21698
+ gap: "xs",
21699
+ rowGap: "xs"
21700
+ },
21701
+ fixed: {
21702
+ display: "flex",
21703
+ flexWrap: "wrap",
21704
+ alignItems: "center"
21705
+ }
21706
+ },
20650
21707
  tagInput: { options: {
20651
21708
  chipGap: "xs",
20652
21709
  chipSize: "md",
@@ -20662,8 +21719,8 @@ var buildComponents = (c) => ({
20662
21719
  dayBorderRadius: "max",
20663
21720
  typeface: "label",
20664
21721
  gap: "xxs",
20665
- navPrevSymbol: "chevron_left",
20666
- navNextSymbol: "chevron_right",
21722
+ navPrevIcon: "chevronLeft",
21723
+ navNextIcon: "chevronRight",
20667
21724
  weekdayFormat: "short",
20668
21725
  showOutsideDays: false,
20669
21726
  todayStyle: "outline"
@@ -20702,13 +21759,13 @@ var buildComponents = (c) => ({
20702
21759
  descriptionColor: "on-primary-surface-variant"
20703
21760
  } },
20704
21761
  dateInput: { options: {
20705
- toggleSymbol: "calendar_month",
21762
+ toggleIcon: "calendar",
20706
21763
  popupShadow: "menu",
20707
21764
  popupBorderRadius: "xs",
20708
21765
  popupColor: "primary-surface"
20709
21766
  } },
20710
21767
  timeInput: { options: {
20711
- toggleSymbol: "schedule",
21768
+ toggleIcon: "clock",
20712
21769
  listColor: "primary-surface",
20713
21770
  listShadow: "menu",
20714
21771
  listBorderRadius: "xs",
@@ -20722,15 +21779,15 @@ var buildComponents = (c) => ({
20722
21779
  button: {
20723
21780
  options: {
20724
21781
  borderRadius: "max",
20725
- typeface: "button"
21782
+ typeface: "button",
21783
+ motion: "control"
20726
21784
  },
20727
21785
  fixed: {
20728
21786
  position: "relative",
20729
21787
  overflow: "hidden",
20730
21788
  outline: "0",
20731
21789
  border: "0",
20732
- cursor: "pointer",
20733
- transition: "all 0.28s ease"
21790
+ cursor: "pointer"
20734
21791
  },
20735
21792
  variantOptions: {
20736
21793
  primary: { focusColor: "primary" },
@@ -20811,7 +21868,10 @@ var buildComponents = (c) => ({
20811
21868
  }
20812
21869
  },
20813
21870
  iconButton: {
20814
- options: { borderRadius: "max" },
21871
+ options: {
21872
+ borderRadius: "max",
21873
+ motion: "control"
21874
+ },
20815
21875
  variantOptions: {
20816
21876
  primary: { focusColor: "primary" },
20817
21877
  secondary: { focusColor: "secondary" },
@@ -20888,6 +21948,13 @@ var buildComponents = (c) => ({
20888
21948
  }
20889
21949
  }
20890
21950
  },
21951
+ inlineButton: { options: {
21952
+ linkColor: "primary",
21953
+ underline: false,
21954
+ underlineOnHover: true,
21955
+ underlineOffset: "0.15em",
21956
+ gap: "xxs"
21957
+ } },
20891
21958
  progressGauge: {
20892
21959
  fixed: { textFill: c["on-background"] },
20893
21960
  variants: {
@@ -20923,7 +21990,8 @@ var buildComponents = (c) => ({
20923
21990
  options: { borderRadius: "xs" },
20924
21991
  fixed: {
20925
21992
  overflow: "hidden",
20926
- backgroundColor: c.background
21993
+ backgroundColor: c.background,
21994
+ color: c["on-background"]
20927
21995
  }
20928
21996
  },
20929
21997
  cardHeader: {
@@ -20959,6 +22027,7 @@ var buildComponents = (c) => ({
20959
22027
  placeholderColor: "disabled"
20960
22028
  } },
20961
22029
  dataTable: { options: {
22030
+ motion: "control",
20962
22031
  color: "primary-surface",
20963
22032
  border: "light",
20964
22033
  borderRadius: "sm",
@@ -21022,7 +22091,7 @@ var buildComponents = (c) => ({
21022
22091
  tooltipTextColor: "on-inverse-surface",
21023
22092
  tooltipShadow: "menu",
21024
22093
  tooltipBorderRadius: "xs",
21025
- transitionMs: 120
22094
+ motion: "snap"
21026
22095
  } },
21027
22096
  skeleton: { options: {
21028
22097
  color: "surface-variant",
@@ -21071,6 +22140,7 @@ var buildComponents = (c) => ({
21071
22140
  }
21072
22141
  },
21073
22142
  tooltip: { options: {
22143
+ motion: "notification",
21074
22144
  border: void 0,
21075
22145
  borderRadius: "xs",
21076
22146
  shadow: "raised",
@@ -21085,7 +22155,7 @@ var buildComponents = (c) => ({
21085
22155
  padding: "16px",
21086
22156
  headerTypeface: "title-small",
21087
22157
  typeface: "label",
21088
- closeSymbol: "close",
22158
+ closeIcon: "close",
21089
22159
  arrowSize: 8,
21090
22160
  offset: 12,
21091
22161
  scrimColor: "rgba(0, 0, 0, 0.45)",
@@ -22156,7 +23226,7 @@ function createUniServer() {
22156
23226
  "list-tokens",
22157
23227
  {
22158
23228
  title: "List design tokens",
22159
- description: "Inventory of Uni design tokens. Filter by `type` (color, spacing, radius, shadow, border, backdrop, thickness, typography, ...), `kind` (style|behavioral), or `theme`.",
23229
+ description: "Inventory of Uni design tokens. Filter by `type` (color, spacing, radius, shadow, border, backdrop, motion, thickness, typography, ...), `kind` (style|behavioral), or `theme`.",
22160
23230
  inputSchema: {
22161
23231
  type: z.string().optional(),
22162
23232
  kind: z.enum(["style", "behavioral"]).optional(),
@@ -22476,4 +23546,4 @@ export {
22476
23546
  buildStoredTheme,
22477
23547
  createUniServer
22478
23548
  };
22479
- //# sourceMappingURL=chunk-QZ5TESCY.js.map
23549
+ //# sourceMappingURL=chunk-G5LYVS3L.js.map