@uni-design-system/uni-mcp 11.6.0 → 11.8.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: "11.6.0",
11
- builtAt: "2026-10-05T01:16:14.251Z",
10
+ version: "11.8.0",
11
+ builtAt: "2026-10-22T14:39:12.220Z",
12
12
  frameworks: [
13
13
  "angular"
14
14
  ],
15
15
  counts: {
16
- components: 88,
17
- tokens: 504,
16
+ components: 89,
17
+ tokens: 512,
18
18
  themes: 2,
19
- examples: 254,
19
+ examples: 261,
20
20
  utilities: 122
21
21
  }
22
22
  },
@@ -28,7 +28,7 @@ var uni_index_default = {
28
28
  summary: "",
29
29
  description: "",
30
30
  category: "feedback",
31
- version: "11.6.0",
31
+ version: "11.8.0",
32
32
  bindings: {
33
33
  angular: {
34
34
  importPath: "@uni-design-system/uni-angular",
@@ -118,7 +118,7 @@ var uni_index_default = {
118
118
  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.",
119
119
  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.",
120
120
  category: "components",
121
- version: "11.6.0",
121
+ version: "11.8.0",
122
122
  bindings: {
123
123
  angular: {
124
124
  importPath: "@uni-design-system/uni-angular",
@@ -191,7 +191,7 @@ var uni_index_default = {
191
191
  summary: "Identity avatar with a graceful fallback chain: image \u2192 initials from `name` \u2192 themed symbol.",
192
192
  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.",
193
193
  category: "components",
194
- version: "11.6.0",
194
+ version: "11.8.0",
195
195
  bindings: {
196
196
  angular: {
197
197
  importPath: "@uni-design-system/uni-angular",
@@ -286,7 +286,7 @@ var uni_index_default = {
286
286
  summary: "Overlapping stack of avatars.",
287
287
  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.",
288
288
  category: "components",
289
- version: "11.6.0",
289
+ version: "11.8.0",
290
290
  bindings: {
291
291
  angular: {
292
292
  importPath: "@uni-design-system/uni-angular",
@@ -335,7 +335,7 @@ var uni_index_default = {
335
335
  summary: "",
336
336
  description: "",
337
337
  category: "primitives",
338
- version: "11.6.0",
338
+ version: "11.8.0",
339
339
  bindings: {
340
340
  angular: {
341
341
  importPath: "@uni-design-system/uni-angular",
@@ -416,7 +416,7 @@ var uni_index_default = {
416
416
  summary: "",
417
417
  description: "",
418
418
  category: "feedback",
419
- version: "11.6.0",
419
+ version: "11.8.0",
420
420
  bindings: {
421
421
  angular: {
422
422
  importPath: "@uni-design-system/uni-angular",
@@ -513,7 +513,7 @@ var uni_index_default = {
513
513
  summary: "",
514
514
  description: "",
515
515
  category: "directives",
516
- version: "11.6.0",
516
+ version: "11.8.0",
517
517
  bindings: {
518
518
  angular: {
519
519
  importPath: "@uni-design-system/uni-angular",
@@ -537,7 +537,7 @@ var uni_index_default = {
537
537
  summary: 'The base layout primitive, applied as an attribute to any element so semantics stay yours: `<main box-layout [grow]="1" padding="md">`.',
538
538
  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.',
539
539
  category: "layout",
540
- version: "11.6.0",
540
+ version: "11.8.0",
541
541
  bindings: {
542
542
  angular: {
543
543
  importPath: "@uni-design-system/uni-angular",
@@ -945,7 +945,7 @@ var uni_index_default = {
945
945
  summary: 'WAI-ARIA breadcrumb: a `nav` landmark wrapping an ordered list; the last item is the current page (`aria-current="page"`), separators are decorative.',
946
946
  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.',
947
947
  category: "components",
948
- version: "11.6.0",
948
+ version: "11.8.0",
949
949
  bindings: {
950
950
  angular: {
951
951
  importPath: "@uni-design-system/uni-angular",
@@ -1030,7 +1030,7 @@ var uni_index_default = {
1030
1030
  summary: "",
1031
1031
  description: "",
1032
1032
  category: "primitives",
1033
- version: "11.6.0",
1033
+ version: "11.8.0",
1034
1034
  bindings: {
1035
1035
  angular: {
1036
1036
  importPath: "@uni-design-system/uni-angular",
@@ -1044,6 +1044,14 @@ var uni_index_default = {
1044
1044
  default: "false, { transform: booleanAttribute }",
1045
1045
  description: ""
1046
1046
  },
1047
+ {
1048
+ name: "disabled",
1049
+ kind: "input",
1050
+ type: "unknown",
1051
+ required: false,
1052
+ default: "false, { transform: booleanAttribute }",
1053
+ description: "The native name, accepted as an alias of `disable`. Every other Uni form control takes `disabled`, so consumers write it here too \u2014 and without this input the binding landed on the DOM property, where the host's own `disabled` attribute binding removed it on the first pass. The button rendered enabled, with no error. Either name now works."
1054
+ },
1047
1055
  {
1048
1056
  name: "loading",
1049
1057
  kind: "input",
@@ -1190,7 +1198,7 @@ var uni_index_default = {
1190
1198
  summary: "",
1191
1199
  description: "",
1192
1200
  category: "primitives",
1193
- version: "11.6.0",
1201
+ version: "11.8.0",
1194
1202
  bindings: {
1195
1203
  angular: {
1196
1204
  importPath: "@uni-design-system/uni-angular",
@@ -1222,7 +1230,7 @@ var uni_index_default = {
1222
1230
  summary: "Inline month calendar: single-date or start\u2013end range selection, day markers (availability dots), min/max fences and disabled dates.",
1223
1231
  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.",
1224
1232
  category: "forms",
1225
- version: "11.6.0",
1233
+ version: "11.8.0",
1226
1234
  bindings: {
1227
1235
  angular: {
1228
1236
  importPath: "@uni-design-system/uni-angular",
@@ -1463,7 +1471,7 @@ var uni_index_default = {
1463
1471
  summary: "Anchored coach-mark panel that dims the page and cuts a spotlight hole around its target.",
1464
1472
  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).',
1465
1473
  category: "components",
1466
- version: "11.6.0",
1474
+ version: "11.8.0",
1467
1475
  bindings: {
1468
1476
  angular: {
1469
1477
  importPath: "@uni-design-system/uni-angular",
@@ -1683,7 +1691,7 @@ var uni_index_default = {
1683
1691
  summary: "",
1684
1692
  description: "",
1685
1693
  category: "layout",
1686
- version: "11.6.0",
1694
+ version: "11.8.0",
1687
1695
  bindings: {
1688
1696
  angular: {
1689
1697
  importPath: "@uni-design-system/uni-angular",
@@ -1745,7 +1753,7 @@ var uni_index_default = {
1745
1753
  summary: "",
1746
1754
  description: "",
1747
1755
  category: "layout",
1748
- version: "11.6.0",
1756
+ version: "11.8.0",
1749
1757
  bindings: {
1750
1758
  angular: {
1751
1759
  importPath: "@uni-design-system/uni-angular",
@@ -1786,7 +1794,7 @@ var uni_index_default = {
1786
1794
  summary: "",
1787
1795
  description: "",
1788
1796
  category: "layout",
1789
- version: "11.6.0",
1797
+ version: "11.8.0",
1790
1798
  bindings: {
1791
1799
  angular: {
1792
1800
  importPath: "@uni-design-system/uni-angular",
@@ -1843,7 +1851,7 @@ var uni_index_default = {
1843
1851
  summary: "",
1844
1852
  description: "",
1845
1853
  category: "layout",
1846
- version: "11.6.0",
1854
+ version: "11.8.0",
1847
1855
  bindings: {
1848
1856
  angular: {
1849
1857
  importPath: "@uni-design-system/uni-angular",
@@ -1898,7 +1906,7 @@ var uni_index_default = {
1898
1906
  summary: "",
1899
1907
  description: "",
1900
1908
  category: "forms",
1901
- version: "11.6.0",
1909
+ version: "11.8.0",
1902
1910
  bindings: {
1903
1911
  angular: {
1904
1912
  importPath: "@uni-design-system/uni-angular",
@@ -2120,7 +2128,7 @@ var uni_index_default = {
2120
2128
  summary: "Form-bound, closed-set, single-select autocomplete: `FormValueControl<T | null>` over object `Options<T>`, type-to-filter, commit-on-select.",
2121
2129
  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.",
2122
2130
  category: "forms",
2123
- version: "11.6.0",
2131
+ version: "11.8.0",
2124
2132
  bindings: {
2125
2133
  angular: {
2126
2134
  importPath: "@uni-design-system/uni-angular",
@@ -2226,6 +2234,14 @@ var uni_index_default = {
2226
2234
  default: "true",
2227
2235
  description: "Show a \u2715 while a value is set; an emptied field on blur also clears."
2228
2236
  },
2237
+ {
2238
+ name: "emptyValue",
2239
+ kind: "input",
2240
+ type: "T | null",
2241
+ required: false,
2242
+ default: "null",
2243
+ description: "What \"nothing selected\" is written as. `null` by default \u2014 the control's contract is `FormValueControl<T | null>` \u2014 but a field bound to a plain `string` schema wants `''`, so a clear does not hand `null` to every reader of a string. A value equal to it reads as empty: no \u2715, no match."
2244
+ },
2229
2245
  {
2230
2246
  name: "commitOnBlur",
2231
2247
  kind: "input",
@@ -2379,7 +2395,7 @@ emptyText="No countries found"
2379
2395
  }
2380
2396
  ],
2381
2397
  guidelines: {
2382
- whenToUse: "The form-bound, **closed-set, single-select** autocomplete: object\n`Options<T>`, `FormValueControl<T | null>`, type-to-filter, commit-on-select.\nTyping produces a *draft* \u2014 a filter, never a value; the value changes only\nwhen an option commits, the field clears, or the model is written from\noutside. Select semantics, not search: a real label, a chevron, no magnifier,\nnothing submits.\nUnder ~10 options and no need to type \u2192 `uni-select`, the native, zero-JS,\nmobile-friendly answer. More options, or users know what they're looking for \u2192\n`uni-combobox`. The value contract is identical (`T | null`, `compareWith`),\nso swapping one for the other as a list grows is a template-only change \u2014 that\nis deliberate. For open sets, where typing *creates* values, use\n`uni-tag-input` (multi) or `uni-search-input` (queries); for closed multi\nsets, `uni-multi-select-dropdown`.",
2398
+ whenToUse: "The form-bound, **closed-set, single-select** autocomplete: object\n`Options<T>`, `FormValueControl<T | null>`, type-to-filter, commit-on-select.\nTyping produces a *draft* \u2014 a filter, never a value; the value changes only\nwhen an option commits, the field clears, or the model is written from\noutside. Select semantics, not search: a real label, a chevron, no magnifier,\nnothing submits.\nUnder ~10 options and no need to type \u2192 `uni-select`, the native, zero-JS,\nmobile-friendly answer. More options, or users know what they're looking for \u2192\n`uni-combobox`. The value contract is identical (`T | null`, `compareWith`),\nso swapping one for the other as a list grows is a template-only change \u2014 that\nis deliberate. A clear writes `null`; a field bound to a plain `string` schema\nsets `emptyValue=\"''\"` so its readers never meet a `null`. For open sets, where typing *creates* values, use\n`uni-tag-input` (multi) or `uni-search-input` (queries); for closed multi\nsets, `uni-multi-select-dropdown`.",
2383
2399
  dos: [],
2384
2400
  donts: [
2385
2401
  "Don't expect free text to commit implicitly \u2014 it never does. Offer creation",
@@ -2414,7 +2430,7 @@ emptyText="No countries found"
2414
2430
  summary: "",
2415
2431
  description: "",
2416
2432
  category: "feedback",
2417
- version: "11.6.0",
2433
+ version: "11.8.0",
2418
2434
  bindings: {
2419
2435
  angular: {
2420
2436
  importPath: "@uni-design-system/uni-angular",
@@ -2461,7 +2477,7 @@ emptyText="No countries found"
2461
2477
  summary: "Recipient field for picking people: removable chips, a text input, and a list of known contacts that opens on focus and narrows as the user types \u2014 each row drawn as a person (avatar, name, address, a trailing note).",
2462
2478
  description: "Recipient field for picking people: removable chips, a text input, and a list of known contacts that opens on focus and narrows as the user types \u2014 each row drawn as a person (avatar, name, address, a trailing note). A thin composition of `uni-tag-input` with a mail client's manners baked in: ArrowDown walks the matches and Enter picks the active one, Backspace in an empty field removes the last person, and text that is neither a known contact nor a valid address stays in the field to be fixed (`rejected` says why). Reach for `uni-tag-input` itself when the tokens are not people.",
2463
2479
  category: "forms",
2464
- version: "11.6.0",
2480
+ version: "11.8.0",
2465
2481
  bindings: {
2466
2482
  angular: {
2467
2483
  importPath: "@uni-design-system/uni-angular",
@@ -2559,6 +2575,14 @@ emptyText="No countries found"
2559
2575
  default: "true",
2560
2576
  description: "Accept a typed value that is not a known contact. On by default \u2014 a typed email address becomes a chip; `false` restricts the field to `contacts`."
2561
2577
  },
2578
+ {
2579
+ name: "chipAvatar",
2580
+ kind: "input",
2581
+ type: "boolean | undefined",
2582
+ required: false,
2583
+ default: "undefined",
2584
+ description: "Draw an initials avatar on each chip. Unbound, the `contactInput` theme entry's `chipAvatar` decides (on by default). Off, a chip is the name alone \u2014 in a narrow row of first names the initials only repeat it."
2585
+ },
2562
2586
  {
2563
2587
  name: "filterLocally",
2564
2588
  kind: "input",
@@ -2710,7 +2734,7 @@ emptyText="No countries found"
2710
2734
  }
2711
2735
  ],
2712
2736
  guidelines: {
2713
- whenToUse: "Recipient field for picking people: removable chips, a text input, and a list\nof known contacts that opens on focus and narrows as the user types. Each row\nis drawn as a person \u2014 avatar, name, address, and an optional note. Reach for\nit for a To line, a share dialog, assignees or mentions; for tokens that are\nnot people, use `uni-tag-input`, which this composes.\nIt behaves like a mail client: ArrowDown walks the matches and Enter picks\nthe active one, Backspace in an empty field removes the last person, and text\nthat is neither a known contact nor a valid address stays in the field to be\nfixed. Set `autoHighlight` to keep the first match active, so Enter or Tab\npicks it without arrowing. The chips come\nfrom the `tag` theme entry, the popup from `tagInput`, the field chrome from\n`input`, and the person row from `contactInput`.",
2737
+ whenToUse: "Recipient field for picking people: removable chips, a text input, and a list\nof known contacts that opens on focus and narrows as the user types. Each row\nis drawn as a person \u2014 avatar, name, address, and an optional note. Reach for\nit for a To line, a share dialog, assignees or mentions; for tokens that are\nnot people, use `uni-tag-input`, which this composes.\nIt behaves like a mail client: ArrowDown walks the matches and Enter picks\nthe active one, Backspace in an empty field removes the last person, and text\nthat is neither a known contact nor a valid address stays in the field to be\nfixed. Set `autoHighlight` to keep the first match active, so Enter or Tab\npicks it without arrowing. A paste splits on commas, semicolons, line breaks\nand whitespace, so a column copied from a spreadsheet becomes one chip per\naddress (`parse` takes over tokenizing when that is wrong). The chips come\nfrom the `tag` theme entry, the popup from `tagInput`, the field chrome from\n`input`, and the person row and chip avatar from `contactInput`.",
2714
2738
  dos: [
2715
2739
  "Order `contacts` most-relevant first; only the first few are shown.",
2716
2740
  "Set `filterLocally` to `false` and refresh `contacts` from `(query)` when",
@@ -2738,7 +2762,7 @@ emptyText="No countries found"
2738
2762
  summary: "",
2739
2763
  description: "",
2740
2764
  category: "forms",
2741
- version: "11.6.0",
2765
+ version: "11.8.0",
2742
2766
  bindings: {
2743
2767
  angular: {
2744
2768
  importPath: "@uni-design-system/uni-angular",
@@ -2837,7 +2861,7 @@ emptyText="No countries found"
2837
2861
  summary: "",
2838
2862
  description: "",
2839
2863
  category: "data",
2840
- version: "11.6.0",
2864
+ version: "11.8.0",
2841
2865
  bindings: {
2842
2866
  angular: {
2843
2867
  importPath: "@uni-design-system/uni-angular",
@@ -3056,6 +3080,23 @@ emptyText="No countries found"
3056
3080
  datasource: new UniRecordDatasource<any>(starWarsCharacters),
3057
3081
  }
3058
3082
  -->`
3083
+ },
3084
+ {
3085
+ title: "Column Options",
3086
+ framework: "angular",
3087
+ code: `<!-- Storybook story: Column Options -->
3088
+ <ng-template #nameCell let-row let-index="index">
3089
+ <div box-layout padding="sm" uni-text="title-small">{{ index + 1 }}. {{ row.name }}</div>
3090
+ </ng-template>
3091
+ <uni-data-table
3092
+ [datasource]="datasource"
3093
+ [useRowClick]="false"
3094
+ [columns]="[
3095
+ { columnDef: 'name', header: 'Name', textAlign: 'left', width: '50%', template: nameCell },
3096
+ base[0],
3097
+ base[1]
3098
+ ]"
3099
+ />`
3059
3100
  }
3060
3101
  ],
3061
3102
  guidelines: {
@@ -3063,7 +3104,7 @@ emptyText="No countries found"
3063
3104
  dos: [],
3064
3105
  donts: [],
3065
3106
  accessibility: [
3066
- 'Column headers use `scope="col"`; sortable headers are real buttons with `aria-sort` on the `<th>`.',
3107
+ 'Column headers use `scope="col"`; sortable headers are real buttons with `aria-sort` on the `<th>`. A `sortable: false` column is a plain heading with neither.',
3067
3108
  'The loading overlay is a `role="status"` region and the table is `aria-busy` while loading.',
3068
3109
  "Collapsed detail rows are `inert`, out of the accessibility tree until expanded."
3069
3110
  ]
@@ -3077,7 +3118,7 @@ emptyText="No countries found"
3077
3118
  summary: "Date field with free-typed parsing and a popup calendar.",
3078
3119
  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.",
3079
3120
  category: "forms",
3080
- version: "11.6.0",
3121
+ version: "11.8.0",
3081
3122
  bindings: {
3082
3123
  angular: {
3083
3124
  importPath: "@uni-design-system/uni-angular",
@@ -3308,7 +3349,7 @@ emptyText="No countries found"
3308
3349
  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.",
3309
3350
  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.",
3310
3351
  category: "forms",
3311
- version: "11.6.0",
3352
+ version: "11.8.0",
3312
3353
  bindings: {
3313
3354
  angular: {
3314
3355
  importPath: "@uni-design-system/uni-angular",
@@ -3501,7 +3542,7 @@ emptyText="No countries found"
3501
3542
  summary: "Text input that emits `change` only after the user pauses typing.",
3502
3543
  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.",
3503
3544
  category: "forms",
3504
- version: "11.6.0",
3545
+ version: "11.8.0",
3505
3546
  bindings: {
3506
3547
  angular: {
3507
3548
  importPath: "@uni-design-system/uni-angular",
@@ -3649,7 +3690,7 @@ emptyText="No countries found"
3649
3690
  summary: "Modal dialog on the native `<dialog>` element, laid out as three rows: an optional `[dialog-header]`, the projected body, an optional `[dialog-buttons]`.",
3650
3691
  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.",
3651
3692
  category: "feedback",
3652
- version: "11.6.0",
3693
+ version: "11.8.0",
3653
3694
  bindings: {
3654
3695
  angular: {
3655
3696
  importPath: "@uni-design-system/uni-angular",
@@ -3772,6 +3813,21 @@ uni-dialog
3772
3813
  </div>
3773
3814
  <footer dialog-buttons confirmButtonText="Save" cancelButtonText="Cancel"></footer>
3774
3815
  </dialog>`
3816
+ },
3817
+ {
3818
+ title: "Rich Head",
3819
+ framework: "angular",
3820
+ code: '<!-- Storybook story: Rich Head -->\n<button text-button variant="primary" (click)="show = true">Open dialog</button>\n<dialog uni-dialog [(show)]="show">\n<header dialog-header rich>\n <span uni-text="label" display="block" color="on-surface-variant">Custom work</span>\n <h2 uni-text="headline-small" dialog-title>Add custom work</h2>\n <span uni-text="body-2-long" display="block" color="on-surface-variant">\n Describe the piece, who it is for, and when it is needed.\n </span>\n</header>\n<div stack-layout gap="md" padding="md" [width]="420">\n <uni-input label="Piece" placeholder="What is being made" />\n <uni-input label="Client" placeholder="Who it is for" />\n</div>\n<footer dialog-buttons confirmButtonText="Add" cancelButtonText="Cancel"></footer>\n</dialog>'
3821
+ },
3822
+ {
3823
+ title: "Custom Footer",
3824
+ framework: "angular",
3825
+ code: '<!-- Storybook story: Custom Footer -->\n<button text-button variant="primary" (click)="show = true">Open dialog</button>\n<dialog uni-dialog [(show)]="show" #dialog>\n<header dialog-header>Confirm purchase order</header>\n<div box-layout padding="md" [width]="420">\n <span uni-text="body-1-long">Three line items, one vendor, delivery in two weeks.</span>\n</div>\n<footer dialog-buttons [closeOnConfirm]="false" [loading]="saving" (confirmed)="save(dialog)">\n <span dialog-footnote uni-text="caption" color="on-surface-variant">The order opens for your review.</span>\n</footer>\n</dialog>'
3826
+ },
3827
+ {
3828
+ title: "Projected Actions",
3829
+ framework: "angular",
3830
+ code: '<!-- Storybook story: Projected Actions -->\n<button text-button variant="primary" (click)="show = true">Open dialog</button>\n<dialog uni-dialog [(show)]="show" #dialog>\n<header dialog-header>Unsaved changes</header>\n<div box-layout padding="md" [width]="420">\n <span uni-text="body-1-long">Keep the draft, use the saved version, or discard both?</span>\n</div>\n<footer dialog-buttons justifyContent="flex-end">\n <button text-button variant="warn" (click)="dialog.close()">Discard</button>\n <button text-button variant="secondary" (click)="dialog.close()">Use saved</button>\n <button text-button variant="primary" (click)="dialog.close()">Keep draft</button>\n</footer>\n</dialog>'
3775
3831
  }
3776
3832
  ],
3777
3833
  guidelines: {
@@ -3781,7 +3837,8 @@ uni-dialog
3781
3837
  accessibility: [
3782
3838
  "Focus trapping and keyboard navigation (Tab, Escape, Enter)",
3783
3839
  "Screen reader announcements",
3784
- "Semantic dialog roles"
3840
+ "Semantic dialog roles",
3841
+ "A `[dialog-header]` labels the dialog; in a `rich` head, mark the headline"
3785
3842
  ]
3786
3843
  },
3787
3844
  relatedTokens: [
@@ -3790,6 +3847,7 @@ uni-dialog
3790
3847
  "dialog.behavior.border",
3791
3848
  "dialog.behavior.padding",
3792
3849
  "dialog.behavior.inset",
3850
+ "dialog.behavior.overscroll",
3793
3851
  "dialog.behavior.elevation",
3794
3852
  "dialog.behavior.backdrop",
3795
3853
  "dialog.behavior.motion"
@@ -3799,10 +3857,10 @@ uni-dialog
3799
3857
  id: "dialog-buttons",
3800
3858
  name: "DialogButtons",
3801
3859
  status: "stable",
3802
- summary: "",
3803
- description: "",
3860
+ summary: "The dialog's pinned footer action row.",
3861
+ description: "The dialog's pinned footer action row. Empty, it renders a Confirm/Cancel pair wired to the dialog. Project your own buttons and they replace the pair while keeping the row's chrome \u2014 padding, gap, justification, divider, `stretch` and `reverseOrder`. A `[dialog-footnote]` projects on the leading edge, pushing the actions to the trailing one.",
3804
3862
  category: "feedback",
3805
- version: "11.6.0",
3863
+ version: "11.8.0",
3806
3864
  bindings: {
3807
3865
  angular: {
3808
3866
  importPath: "@uni-design-system/uni-angular",
@@ -3843,6 +3901,22 @@ uni-dialog
3843
3901
  required: false,
3844
3902
  description: ""
3845
3903
  },
3904
+ {
3905
+ name: "closeOnConfirm",
3906
+ kind: "input",
3907
+ type: "unknown",
3908
+ required: false,
3909
+ default: "true, { transform: booleanAttribute }",
3910
+ description: "Whether Confirm closes the dialog as it emits `confirmed`. On by default. Off, the caller closes when its save resolves \u2014 a dialog that confirms asynchronously stays open with its error when the save fails."
3911
+ },
3912
+ {
3913
+ name: "loading",
3914
+ kind: "input",
3915
+ type: "unknown",
3916
+ required: false,
3917
+ default: "false, { transform: booleanAttribute }",
3918
+ description: "Passed to the Confirm button: a spinner, and no second click."
3919
+ },
3846
3920
  {
3847
3921
  name: "padding",
3848
3922
  kind: "input",
@@ -3903,15 +3977,23 @@ uni-dialog
3903
3977
  id: "dialog-header",
3904
3978
  name: "DialogHeader",
3905
3979
  status: "stable",
3906
- summary: "",
3907
- description: "",
3980
+ summary: "The dialog's pinned header row, in one of two shapes: - **Title bar** (default): one line of text, set in the theme's `textRole` and aligned by `textAlign`, beside a close button.",
3981
+ description: "The dialog's pinned header row, in one of two shapes: - **Title bar** (default): one line of text, set in the theme's `textRole` and aligned by `textAlign`, beside a close button. - **Rich** (`rich`): the projection is rendered as a block \u2014 an eyebrow, a headline, a blurb \u2014 beside the close button, in its own `richColor` and `richPadding`. Mark the headline `[dialog-title]` so it alone names the dialog.",
3908
3982
  category: "feedback",
3909
- version: "11.6.0",
3983
+ version: "11.8.0",
3910
3984
  bindings: {
3911
3985
  angular: {
3912
3986
  importPath: "@uni-design-system/uni-angular",
3913
3987
  selectorOrTag: "[uni-dialog-header], [dialog-header]",
3914
3988
  api: [
3989
+ {
3990
+ name: "rich",
3991
+ kind: "input",
3992
+ type: "unknown",
3993
+ required: false,
3994
+ default: "false, { transform: booleanAttribute }",
3995
+ description: "Render the projection as a block rather than one line of text. A sheet's head \u2014 eyebrow, headline, blurb \u2014 has nowhere to go in a title bar."
3996
+ },
3915
3997
  {
3916
3998
  name: "variant",
3917
3999
  kind: "input",
@@ -3940,6 +4022,30 @@ uni-dialog
3940
4022
  },
3941
4023
  relatedTokens: []
3942
4024
  },
4025
+ {
4026
+ id: "dialog-title",
4027
+ name: "DialogTitle",
4028
+ status: "stable",
4029
+ summary: "Marks the element that names the dialog inside a rich `[dialog-header]`.",
4030
+ description: "Marks the element that names the dialog inside a rich `[dialog-header]`. A rich head projects an eyebrow, a headline and a blurb; the dialog should be labelled by the headline alone, not read all three as its name. Put this on the headline and it carries the id the dialog's `aria-labelledby` points at. Without one, the whole projected block is the label.",
4031
+ category: "feedback",
4032
+ version: "11.8.0",
4033
+ bindings: {
4034
+ angular: {
4035
+ importPath: "@uni-design-system/uni-angular",
4036
+ selectorOrTag: "[uni-dialog-title], [dialog-title]",
4037
+ api: []
4038
+ }
4039
+ },
4040
+ examples: [],
4041
+ guidelines: {
4042
+ whenToUse: "",
4043
+ dos: [],
4044
+ donts: [],
4045
+ accessibility: []
4046
+ },
4047
+ relatedTokens: []
4048
+ },
3943
4049
  {
3944
4050
  id: "divider",
3945
4051
  name: "Divider",
@@ -3947,7 +4053,7 @@ uni-dialog
3947
4053
  summary: "",
3948
4054
  description: "",
3949
4055
  category: "layout",
3950
- version: "11.6.0",
4056
+ version: "11.8.0",
3951
4057
  bindings: {
3952
4058
  angular: {
3953
4059
  importPath: "@uni-design-system/uni-angular",
@@ -4003,7 +4109,7 @@ uni-dialog
4003
4109
  summary: "",
4004
4110
  description: "",
4005
4111
  category: "directives",
4006
- version: "11.6.0",
4112
+ version: "11.8.0",
4007
4113
  bindings: {
4008
4114
  angular: {
4009
4115
  importPath: "@uni-design-system/uni-angular",
@@ -4033,9 +4139,9 @@ uni-dialog
4033
4139
  name: "Drawer",
4034
4140
  status: "stable",
4035
4141
  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.",
4036
- 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.",
4142
+ 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. With `modal` off it is shown as a `popover="manual"` instead: still the top layer, but no focus trap, no inert page and no backdrop \u2014 a workbench beside a live document. **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.',
4037
4143
  category: "components",
4038
- version: "11.6.0",
4144
+ version: "11.8.0",
4039
4145
  bindings: {
4040
4146
  angular: {
4041
4147
  importPath: "@uni-design-system/uni-angular",
@@ -4065,6 +4171,22 @@ uni-dialog
4065
4171
  default: "'start'",
4066
4172
  description: ""
4067
4173
  },
4174
+ {
4175
+ name: "modal",
4176
+ kind: "input",
4177
+ type: "unknown",
4178
+ required: false,
4179
+ default: "true, { transform: booleanAttribute }",
4180
+ description: 'Whether `over` mode is modal. On by default: `showModal()`, a focus trap, an inert page and a scrim. Off, the panel is a `popover="manual"` \u2014 in the top layer, so nothing can clip or cover it, but the page behind stays live: a settings panel beside the canvas it changes. Escape still asks to close through `closeRequest`; `scrim` has no backdrop to paint and is ignored; see `closeOnOutsideClick` for clicks beyond the panel.'
4181
+ },
4182
+ {
4183
+ name: "closeOnOutsideClick",
4184
+ kind: "input",
4185
+ type: "unknown",
4186
+ required: false,
4187
+ default: "false, { transform: booleanAttribute }",
4188
+ description: "Non-modal only: ask to close (`reason: 'outside'`) on a click beyond the panel. Off by default \u2014 for a workbench the canvas *is* the outside."
4189
+ },
4068
4190
  {
4069
4191
  name: "ariaLabel",
4070
4192
  kind: "input",
@@ -4193,10 +4315,32 @@ initialFocus="input"
4193
4315
  title: "Overlay",
4194
4316
  framework: "angular",
4195
4317
  code: '<!-- Storybook story: Overlay -->\n<button text-button variant="primary" size="md" (click)="open = true">Open drawer</button>\n<uni-drawer mode="over" position="start" [(open)]="open" ariaLabel="Main navigation">\n<span uni-text="title-small" display="block">Dashboard</span>\n<span uni-text="title-small" display="block">Reports</span>\n<span uni-text="title-small" display="block">Settings</span>\n<button text-button variant="secondary" size="sm" (click)="open = false">Close</button>\n</uni-drawer>'
4318
+ },
4319
+ {
4320
+ title: "Non Modal",
4321
+ framework: "angular",
4322
+ code: '<!-- Storybook story: Non Modal -->\n<div box-layout padding="md">\n<h2 uni-text="headline-small">Presentation preview</h2>\n<span uni-text="body-1-long" display="block">\n Change a setting in the panel and judge the result here, without closing it.\n</span>\n<div row-layout gap="sm" alignItems="center">\n <button text-button variant="secondary" size="md" (click)="clicks = clicks + 1">\n Still clickable\n </button>\n <span uni-text="body-2">Clicked {{ clicks }} times</span>\n</div>\n<button text-button variant="primary" size="md" (click)="open = true">Open settings</button>\n</div>\n<uni-drawer\nmode="over"\nposition="end"\n[modal]="false"\n[width]="360"\nheadline="Settings"\ninitialFocus="input"\n[(open)]="open"\n>\n<div stack-layout gap="md">\n <uni-input label="Cover title" placeholder="Spring collection" />\n <uni-input label="Subtitle" placeholder="For the Hartley residence" />\n</div>\n<div drawer-buttons confirmButtonText="Apply"></div>\n</uni-drawer>'
4323
+ },
4324
+ {
4325
+ title: "Custom Footer",
4326
+ framework: "angular",
4327
+ code: `<!-- Storybook story: Custom Footer -->
4328
+ <button text-button variant="primary" size="md" (click)="open = true">Edit quote</button>
4329
+ <uni-drawer mode="over" position="end" [width]="480" headline="Edit quote" [(open)]="open" #drawer>
4330
+ <div stack-layout gap="md">
4331
+ <uni-input label="Line" placeholder="Describe the line" />
4332
+ <uni-number-input label="Unit price" [value]="24.5" />
4333
+ </div>
4334
+ <div drawer-buttons>
4335
+ <span drawer-footnote uni-text="label">Total 1,204.00 USD</span>
4336
+ <button text-button variant="warn" size="md" (click)="drawer.requestClose('close-button')">Discard</button>
4337
+ <button text-button variant="primary" size="md" (click)="open = false">Save</button>
4338
+ </div>
4339
+ </uni-drawer>`
4196
4340
  }
4197
4341
  ],
4198
4342
  guidelines: {
4199
- whenToUse: "A panel attached to an edge of the page, in one of two modes:\n- **`side`** renders an in-flow `<aside>` that pushes page content \u2014 the classic\n dashboard sidenav. Opening and closing animates its width; a divider border primitive\n separates it from the content, and it is hidden from assistive tech while closed.\n- **`over`** renders a native `<dialog>` in the top layer: focus trapping, Escape, and\n the scrim backdrop come from the platform, and the panel slides in from its edge\n (`position`: `start` or `end`).\n`[(open)]` is two-way; Escape and backdrop clicks keep it in sync.",
4343
+ whenToUse: 'A panel attached to an edge of the page, in one of two modes:\n- **`side`** renders an in-flow `<aside>` that pushes page content \u2014 the classic\n dashboard sidenav. Opening and closing animates its width; a divider border primitive\n separates it from the content, and it is hidden from assistive tech while closed.\n- **`over`** renders a native `<dialog>` in the top layer: focus trapping, Escape, and\n the scrim backdrop come from the platform, and the panel slides in from its edge\n (`position`: `start` or `end`). With `modal` off it is a `popover="manual"`\n instead \u2014 still the top layer, but the page behind stays live.\n`[(open)]` is two-way; Escape and backdrop clicks keep it in sync.',
4200
4344
  dos: [],
4201
4345
  donts: [],
4202
4346
  accessibility: [
@@ -4204,6 +4348,7 @@ initialFocus="input"
4204
4348
  'A drawer with a header is labelled by that header\'s title via `aria-labelledby`. Without one, give it an `ariaLabel`. There is deliberately no default: a panel that inherited the name "Navigation" would announce itself as something it is not, and a wrong accessible name is worse than a missing one.',
4205
4349
  "`initialFocus` matters more here than in a dialog. The platform focuses the first focusable element, which in a panel with a header is the close button; point it at the first field instead.",
4206
4350
  "`scrim: false` keeps the drawer modal \u2014 focus is still trapped, the page behind is still inert \u2014 while leaving the backdrop transparent. Do not read a missing scrim as a non-modal drawer.",
4351
+ '`modal: false` is the non-modal drawer: a `popover="manual"` `<dialog>` with no `aria-modal`, no focus trap and a live page behind it. Escape asks to close only while focus is inside the panel; nothing else dismisses it unless `closeOnOutsideClick` is set.',
4207
4352
  "A closed side drawer is `aria-hidden`, so its links leave the accessibility tree."
4208
4353
  ]
4209
4354
  },
@@ -4224,9 +4369,9 @@ initialFocus="input"
4224
4369
  name: "DrawerButtons",
4225
4370
  status: "stable",
4226
4371
  summary: "The drawer's pinned footer action row \u2014 the save bar of an editor panel.",
4227
- 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.",
4372
+ 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. Empty, it renders a Cancel/Save pair wired to the drawer. Project your own buttons and they replace the pair while keeping the row's chrome; a `[drawer-footnote]` projects on the leading edge.",
4228
4373
  category: "primitives",
4229
- version: "11.6.0",
4374
+ version: "11.8.0",
4230
4375
  bindings: {
4231
4376
  angular: {
4232
4377
  importPath: "@uni-design-system/uni-angular",
@@ -4267,6 +4412,14 @@ initialFocus="input"
4267
4412
  required: false,
4268
4413
  description: ""
4269
4414
  },
4415
+ {
4416
+ name: "loading",
4417
+ kind: "input",
4418
+ type: "unknown",
4419
+ required: false,
4420
+ default: "false, { transform: booleanAttribute }",
4421
+ description: "Passed to the Save button: a spinner, and no second click."
4422
+ },
4270
4423
  {
4271
4424
  name: "padding",
4272
4425
  kind: "input",
@@ -4323,7 +4476,7 @@ initialFocus="input"
4323
4476
  summary: "The drawer's pinned header row: a title, and optionally a close button.",
4324
4477
  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.",
4325
4478
  category: "components",
4326
- version: "11.6.0",
4479
+ version: "11.8.0",
4327
4480
  bindings: {
4328
4481
  angular: {
4329
4482
  importPath: "@uni-design-system/uni-angular",
@@ -4371,7 +4524,7 @@ initialFocus="input"
4371
4524
  summary: "",
4372
4525
  description: "",
4373
4526
  category: "components",
4374
- version: "11.6.0",
4527
+ version: "11.8.0",
4375
4528
  bindings: {
4376
4529
  angular: {
4377
4530
  importPath: "@uni-design-system/uni-angular",
@@ -4505,7 +4658,7 @@ initialFocus="input"
4505
4658
  summary: "",
4506
4659
  description: "",
4507
4660
  category: "layout",
4508
- version: "11.6.0",
4661
+ version: "11.8.0",
4509
4662
  bindings: {
4510
4663
  angular: {
4511
4664
  importPath: "@uni-design-system/uni-angular",
@@ -4599,7 +4752,10 @@ initialFocus="input"
4599
4752
  ]
4600
4753
  },
4601
4754
  relatedTokens: [
4602
- "expand.behavior.motion"
4755
+ "expand.behavior.motion",
4756
+ "expand.behavior.textRole",
4757
+ "expand.behavior.sublabelRole",
4758
+ "expand.behavior.sublabelColor"
4603
4759
  ]
4604
4760
  },
4605
4761
  {
@@ -4609,7 +4765,7 @@ initialFocus="input"
4609
4765
  summary: "",
4610
4766
  description: "",
4611
4767
  category: "layout",
4612
- version: "11.6.0",
4768
+ version: "11.8.0",
4613
4769
  bindings: {
4614
4770
  angular: {
4615
4771
  importPath: "@uni-design-system/uni-angular",
@@ -4680,7 +4836,7 @@ initialFocus="input"
4680
4836
  summary: "Trigger for a {@link UniExpandComponent} region.",
4681
4837
  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.",
4682
4838
  category: "layout",
4683
- version: "11.6.0",
4839
+ version: "11.8.0",
4684
4840
  bindings: {
4685
4841
  angular: {
4686
4842
  importPath: "@uni-design-system/uni-angular",
@@ -4729,13 +4885,13 @@ initialFocus="input"
4729
4885
  {
4730
4886
  title: "Primary",
4731
4887
  framework: "angular",
4732
- code: '<!-- Storybook story: Primary -->\n<uni-expand-toggle [collapsed]="collapsed" #toggle />\n<div>Collapsed: {{ toggle.collapsed() }}</div>\n<!-- args:\n{\n collapsed: true,\n }\n-->'
4888
+ code: '<!-- Storybook story: Primary -->\n<uni-expand-toggle [collapsed]="collapsed" [label]="label" [sublabel]="sublabel" #toggle />\n<div>Collapsed: {{ toggle.collapsed() }}</div>\n<!-- args:\n{\n collapsed: true,\n }\n-->'
4733
4889
  },
4734
4890
  {
4735
4891
  title: "Labelled",
4736
4892
  framework: "angular",
4737
4893
  code: `<!-- Storybook story: Labelled -->
4738
- <uni-expand-toggle [collapsed]="collapsed" #toggle />
4894
+ <uni-expand-toggle [collapsed]="collapsed" [label]="label" [sublabel]="sublabel" #toggle />
4739
4895
  <div>Collapsed: {{ toggle.collapsed() }}</div>
4740
4896
  <!-- args:
4741
4897
  {
@@ -4765,7 +4921,7 @@ initialFocus="input"
4765
4921
  summary: "",
4766
4922
  description: "",
4767
4923
  category: "forms",
4768
- version: "11.6.0",
4924
+ version: "11.8.0",
4769
4925
  bindings: {
4770
4926
  angular: {
4771
4927
  importPath: "@uni-design-system/uni-angular",
@@ -4923,7 +5079,7 @@ initialFocus="input"
4923
5079
  summary: "",
4924
5080
  description: "",
4925
5081
  category: "layout",
4926
- version: "11.6.0",
5082
+ version: "11.8.0",
4927
5083
  bindings: {
4928
5084
  angular: {
4929
5085
  importPath: "@uni-design-system/uni-angular",
@@ -5020,7 +5176,7 @@ initialFocus="input"
5020
5176
  summary: "",
5021
5177
  description: "",
5022
5178
  category: "layout",
5023
- version: "11.6.0",
5179
+ version: "11.8.0",
5024
5180
  bindings: {
5025
5181
  angular: {
5026
5182
  importPath: "@uni-design-system/uni-angular",
@@ -5052,7 +5208,7 @@ initialFocus="input"
5052
5208
  summary: "",
5053
5209
  description: "",
5054
5210
  category: "primitives",
5055
- version: "11.6.0",
5211
+ version: "11.8.0",
5056
5212
  bindings: {
5057
5213
  angular: {
5058
5214
  importPath: "@uni-design-system/uni-angular",
@@ -5112,7 +5268,7 @@ initialFocus="input"
5112
5268
  summary: "",
5113
5269
  description: "",
5114
5270
  category: "primitives",
5115
- version: "11.6.0",
5271
+ version: "11.8.0",
5116
5272
  bindings: {
5117
5273
  angular: {
5118
5274
  importPath: "@uni-design-system/uni-angular",
@@ -5158,15 +5314,25 @@ initialFocus="input"
5158
5314
  {
5159
5315
  name: "disable",
5160
5316
  kind: "input",
5161
- type: "boolean",
5317
+ type: "unknown",
5162
5318
  required: false,
5163
- description: ""
5319
+ default: "false, { transform: booleanAttribute }",
5320
+ description: "A bare `disable` attribute reads as true, as `uni-button`'s does; `undefined` as false."
5321
+ },
5322
+ {
5323
+ name: "disabled",
5324
+ kind: "input",
5325
+ type: "unknown",
5326
+ required: false,
5327
+ default: "false, { transform: booleanAttribute }",
5328
+ description: "The native name, accepted as an alias of `disable` \u2014 see `uni-button`."
5164
5329
  },
5165
5330
  {
5166
5331
  name: "loading",
5167
5332
  kind: "input",
5168
- type: "boolean",
5333
+ type: "unknown",
5169
5334
  required: false,
5335
+ default: "false, { transform: booleanAttribute }",
5170
5336
  description: ""
5171
5337
  },
5172
5338
  {
@@ -5215,7 +5381,7 @@ initialFocus="input"
5215
5381
  summary: "A button that lives inside a sentence.",
5216
5382
  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.",
5217
5383
  category: "primitives",
5218
- version: "11.6.0",
5384
+ version: "11.8.0",
5219
5385
  bindings: {
5220
5386
  angular: {
5221
5387
  importPath: "@uni-design-system/uni-angular",
@@ -5330,7 +5496,7 @@ initialFocus="input"
5330
5496
  summary: "",
5331
5497
  description: "",
5332
5498
  category: "forms",
5333
- version: "11.6.0",
5499
+ version: "11.8.0",
5334
5500
  bindings: {
5335
5501
  angular: {
5336
5502
  importPath: "@uni-design-system/uni-angular",
@@ -5535,6 +5701,21 @@ initialFocus="input"
5535
5701
  required: false,
5536
5702
  default: "undefined",
5537
5703
  description: ""
5704
+ },
5705
+ {
5706
+ name: "unframed",
5707
+ kind: "input",
5708
+ type: "unknown",
5709
+ required: false,
5710
+ default: "false, { transform: booleanAttribute }",
5711
+ description: "Drop the field chrome and render the bare input \u2014 see `uni-input-box`."
5712
+ },
5713
+ {
5714
+ name: "align",
5715
+ kind: "input",
5716
+ type: "'start' | 'center' | 'end'",
5717
+ required: false,
5718
+ description: "Text alignment, as `uni-number-input`'s. Default: `start`."
5538
5719
  }
5539
5720
  ]
5540
5721
  }
@@ -5615,7 +5796,7 @@ initialFocus="input"
5615
5796
  summary: "",
5616
5797
  description: "",
5617
5798
  category: "forms",
5618
- version: "11.6.0",
5799
+ version: "11.8.0",
5619
5800
  bindings: {
5620
5801
  angular: {
5621
5802
  importPath: "@uni-design-system/uni-angular",
@@ -5685,6 +5866,14 @@ initialFocus="input"
5685
5866
  default: "false",
5686
5867
  description: "Stop applying the themed leading inset to the inner control, for fields that place it themselves. The inset normally rides the `<input>`, which is right while the text is the field's leading edge. It is wrong the moment an adornment sits in front: a currency prefix would hug the border while the number it belongs to is indented past it. A field with adornments takes the inset over and puts it on whichever element is actually first."
5687
5868
  },
5869
+ {
5870
+ name: "unframed",
5871
+ kind: "input",
5872
+ type: "unknown",
5873
+ required: false,
5874
+ default: "false, { transform: booleanAttribute }",
5875
+ description: "Drop the field chrome \u2014 border, fill, radius, shadow, leading inset and the focus treatment \u2014 and render the bare row. For fields drawn as an email client draws them: unframed lines with a hairline between. The surrounding layout draws any focus cue; the error state is still exposed through `aria-invalid` on the control inside. Same meaning as `uni-tag-input`'s."
5876
+ },
5688
5877
  {
5689
5878
  name: "variant",
5690
5879
  kind: "input",
@@ -5736,7 +5925,7 @@ initialFocus="input"
5736
5925
  summary: "",
5737
5926
  description: "",
5738
5927
  category: "components",
5739
- version: "11.6.0",
5928
+ version: "11.8.0",
5740
5929
  bindings: {
5741
5930
  angular: {
5742
5931
  importPath: "@uni-design-system/uni-angular",
@@ -5806,7 +5995,7 @@ initialFocus="input"
5806
5995
  summary: "",
5807
5996
  description: "",
5808
5997
  category: "layout",
5809
- version: "11.6.0",
5998
+ version: "11.8.0",
5810
5999
  bindings: {
5811
6000
  angular: {
5812
6001
  importPath: "@uni-design-system/uni-angular",
@@ -5910,7 +6099,7 @@ initialFocus="input"
5910
6099
  summary: "",
5911
6100
  description: "",
5912
6101
  category: "layout",
5913
- version: "11.6.0",
6102
+ version: "11.8.0",
5914
6103
  bindings: {
5915
6104
  angular: {
5916
6105
  importPath: "@uni-design-system/uni-angular",
@@ -5992,7 +6181,7 @@ initialFocus="input"
5992
6181
  summary: "",
5993
6182
  description: "",
5994
6183
  category: "forms",
5995
- version: "11.6.0",
6184
+ version: "11.8.0",
5996
6185
  bindings: {
5997
6186
  angular: {
5998
6187
  importPath: "@uni-design-system/uni-angular",
@@ -6086,7 +6275,7 @@ initialFocus="input"
6086
6275
  summary: "",
6087
6276
  description: "",
6088
6277
  category: "forms",
6089
- version: "11.6.0",
6278
+ version: "11.8.0",
6090
6279
  bindings: {
6091
6280
  angular: {
6092
6281
  importPath: "@uni-design-system/uni-angular",
@@ -6265,7 +6454,7 @@ initialFocus="input"
6265
6454
  summary: "",
6266
6455
  description: "",
6267
6456
  category: "feedback",
6268
- version: "11.6.0",
6457
+ version: "11.8.0",
6269
6458
  bindings: {
6270
6459
  angular: {
6271
6460
  importPath: "@uni-design-system/uni-angular",
@@ -6506,7 +6695,7 @@ initialFocus="input"
6506
6695
  }
6507
6696
  ],
6508
6697
  guidelines: {
6509
- whenToUse: 'Attention indicator anchored to whatever it wraps \u2014 an icon button, a nav item, an\navatar. Three shapes: `dot` (something is new), `count` (how many), and `pill`\n(counts that need room); `maxCount` caps the display ("99+"). Position it on any\ncorner of the wrapped content.\nRadius and offset resolve from the `notificationBadge` theme options; the badge\nwears the active `variant` color.',
6698
+ whenToUse: "Attention indicator anchored to whatever it wraps \u2014 an icon button, a nav item, an\navatar. Three shapes: `dot` (something is new), `count` (how many), and `pill`\n(counts that need room); `maxCount` caps the display (\"99+\"). Position it on any\ncorner of the wrapped content.\nRadius, offset and the count's typeface resolve from the `notificationBadge`\ntheme options, and the disc's size from its `sizes` block through the `size`\ninput (a `sm` badge for a 12px nav label, `lg` for an icon button); the badge\nwears the active `variant` color. The wrapper is inline-flex, so it never moves\nthe element it wraps.",
6510
6699
  dos: [],
6511
6700
  donts: [
6512
6701
  "Convey urgency by color alone \u2014 the count/dot shape carries the signal"
@@ -6525,7 +6714,7 @@ initialFocus="input"
6525
6714
  summary: "",
6526
6715
  description: "",
6527
6716
  category: "feedback",
6528
- version: "11.6.0",
6717
+ version: "11.8.0",
6529
6718
  bindings: {
6530
6719
  angular: {
6531
6720
  importPath: "@uni-design-system/uni-angular",
@@ -6549,7 +6738,7 @@ initialFocus="input"
6549
6738
  summary: "Numeric field with locale-aware parsing, `Intl` formatting on commit, prefix/suffix adornments and steppers that hold to repeat.",
6550
6739
  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.',
6551
6740
  category: "forms",
6552
- version: "11.6.0",
6741
+ version: "11.8.0",
6553
6742
  bindings: {
6554
6743
  angular: {
6555
6744
  importPath: "@uni-design-system/uni-angular",
@@ -6742,6 +6931,14 @@ initialFocus="input"
6742
6931
  default: "false",
6743
6932
  description: "Renders without its own input-box chrome, for composers like uni-slider."
6744
6933
  },
6934
+ {
6935
+ name: "unframed",
6936
+ kind: "input",
6937
+ type: "unknown",
6938
+ required: false,
6939
+ default: "false, { transform: booleanAttribute }",
6940
+ description: "Keep the box but drop its chrome \u2014 border, fill, inset, focus treatment \u2014 as `uni-input`'s `unframed` does. Unlike `embedded`, the field still owns its row and its steppers."
6941
+ },
6745
6942
  {
6746
6943
  name: "min",
6747
6944
  kind: "input",
@@ -6975,7 +7172,7 @@ initialFocus="input"
6975
7172
  summary: "Two linked numeric fields in one chrome, with one `{ start, end }` value \u2014 price filters, thresholds, tolerances.",
6976
7173
  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.",
6977
7174
  category: "forms",
6978
- version: "11.6.0",
7175
+ version: "11.8.0",
6979
7176
  bindings: {
6980
7177
  angular: {
6981
7178
  importPath: "@uni-design-system/uni-angular",
@@ -7266,7 +7463,7 @@ initialFocus="input"
7266
7463
  summary: "",
7267
7464
  description: "",
7268
7465
  category: "data",
7269
- version: "11.6.0",
7466
+ version: "11.8.0",
7270
7467
  bindings: {
7271
7468
  angular: {
7272
7469
  importPath: "@uni-design-system/uni-angular",
@@ -7367,7 +7564,7 @@ initialFocus="input"
7367
7564
  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.",
7368
7565
  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.',
7369
7566
  category: "layout",
7370
- version: "11.6.0",
7567
+ version: "11.8.0",
7371
7568
  bindings: {
7372
7569
  angular: {
7373
7570
  importPath: "@uni-design-system/uni-angular",
@@ -7559,7 +7756,7 @@ initialFocus="input"
7559
7756
  summary: "",
7560
7757
  description: "",
7561
7758
  category: "feedback",
7562
- version: "11.6.0",
7759
+ version: "11.8.0",
7563
7760
  bindings: {
7564
7761
  angular: {
7565
7762
  importPath: "@uni-design-system/uni-angular",
@@ -7623,7 +7820,7 @@ initialFocus="input"
7623
7820
  summary: "",
7624
7821
  description: "",
7625
7822
  category: "feedback",
7626
- version: "11.6.0",
7823
+ version: "11.8.0",
7627
7824
  bindings: {
7628
7825
  angular: {
7629
7826
  importPath: "@uni-design-system/uni-angular",
@@ -7695,7 +7892,7 @@ initialFocus="input"
7695
7892
  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.",
7696
7893
  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.',
7697
7894
  category: "forms",
7698
- version: "11.6.0",
7895
+ version: "11.8.0",
7699
7896
  bindings: {
7700
7897
  angular: {
7701
7898
  importPath: "@uni-design-system/uni-angular",
@@ -7898,7 +8095,7 @@ initialFocus="input"
7898
8095
  summary: "",
7899
8096
  description: "",
7900
8097
  category: "forms",
7901
- version: "11.6.0",
8098
+ version: "11.8.0",
7902
8099
  bindings: {
7903
8100
  angular: {
7904
8101
  importPath: "@uni-design-system/uni-angular",
@@ -8127,7 +8324,7 @@ initialFocus="input"
8127
8324
  summary: "Content for each of a radio group's options, in place of the plain label string.",
8128
8325
  description: 'Content for each of a radio group\'s options, in place of the plain label string. A group renders N labels from an `options` array, so it cannot take `<ng-content />` the way `uni-checkbox` and `uni-toggle` do \u2014 there is no single slot to project into. A template is the shape that survives the repetition: it is instantiated once per option and handed that option, so a row can carry a description, a price or a badge and still be part of the `<label>` that drives the input. ```html <uni-radio [options]="plans"> <ng-template uniRadioOption let-option> <span uni-text="body-2-long">{{ option.label }}</span> </ng-template> </uni-radio> ```',
8129
8326
  category: "forms",
8130
- version: "11.6.0",
8327
+ version: "11.8.0",
8131
8328
  bindings: {
8132
8329
  angular: {
8133
8330
  importPath: "@uni-design-system/uni-angular",
@@ -8151,7 +8348,7 @@ initialFocus="input"
8151
8348
  summary: "",
8152
8349
  description: "",
8153
8350
  category: "directives",
8154
- version: "11.6.0",
8351
+ version: "11.8.0",
8155
8352
  bindings: {
8156
8353
  angular: {
8157
8354
  importPath: "@uni-design-system/uni-angular",
@@ -8175,7 +8372,7 @@ initialFocus="input"
8175
8372
  summary: "",
8176
8373
  description: "",
8177
8374
  category: "layout",
8178
- version: "11.6.0",
8375
+ version: "11.8.0",
8179
8376
  bindings: {
8180
8377
  angular: {
8181
8378
  importPath: "@uni-design-system/uni-angular",
@@ -8230,7 +8427,7 @@ initialFocus="input"
8230
8427
  summary: "Native scroll area with theme-driven scrollbar styling.",
8231
8428
  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.",
8232
8429
  category: "layout",
8233
- version: "11.6.0",
8430
+ version: "11.8.0",
8234
8431
  bindings: {
8235
8432
  angular: {
8236
8433
  importPath: "@uni-design-system/uni-angular",
@@ -8314,6 +8511,21 @@ initialFocus="input"
8314
8511
  required: false,
8315
8512
  description: ""
8316
8513
  },
8514
+ {
8515
+ name: "maxHeight",
8516
+ kind: "input",
8517
+ type: "OptionalValue",
8518
+ required: false,
8519
+ description: "Grow with the content up to this height, then scroll. The shape a dialog body wants: as tall as the form until it would leave the viewport. With `height` unset the area is otherwise content-sized and never scrolls."
8520
+ },
8521
+ {
8522
+ name: "fill",
8523
+ kind: "input",
8524
+ type: "unknown",
8525
+ required: false,
8526
+ default: "false, { transform: booleanAttribute }",
8527
+ description: "Take the room a flex-column parent leaves (`flex: 1 1 auto; min-height: 0`) and scroll within it \u2014 the body of a dialog or drawer without a wrapper."
8528
+ },
8317
8529
  {
8318
8530
  name: "width",
8319
8531
  kind: "input",
@@ -8360,10 +8572,15 @@ initialFocus="input"
8360
8572
  title: "Primary",
8361
8573
  framework: "angular",
8362
8574
  code: '<!-- Storybook story: Primary -->\n<div scroll-area ${argsToTemplate(props)} #scrollArea>\n <button size="sm" text-button variant="ghost" symbolLeft="arrow_downward" (click)="scrollArea.scrollToBottom()">Scroll to bottom</button>\n ${ngContent}\n <button size="sm" text-button variant="ghost" symbolLeft="arrow_upward" (click)="scrollArea.scrollToTop()">Back to top</button>\n</div>\n<!-- args:\n{\n border: \'quaternary\',\n containerColor: \'tertiary-surface\',\n height: 200,\n ngContent: `\n <span uni-text="headline-medium">Lorem ipsum dolor sit amet, consectetur adipisicing elit.</span>\n <span uni-text="body-1-long">\n <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quis facere debitis ullam, quae quidem, impedit\n culpa nam\n repellat in voluptatibus esse ab harum, hic? Aliquam nesciunt voluptates repellendus assumenda labore.\n </p>\n <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Porro quos voluptate doloribus. Optio unde\n inventore, tempore\n nemo repellat expedita! Quod, accusamus nobis iure. Aliquam quibusdam, nemo explicabo ipsum provident\n asperiores.</p>\n <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quaerat, qui, rem! Debitis cum maiores iste,\n possimus!\n Obcaecati accusamus eaque expedita quo soluta quis, repudiandae similique, veritatis repellendus facere\n suscipit!\n Et!</p>\n <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Harum doloremque repellat praesentium quae et\n consectetur\n iure quos porro, provident voluptates reprehenderit a. Accusamus ut, quaerat asperiores blanditiis\n voluptate, sint\n facilis.</p>\n <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusamus beatae inventore nobis esse\n temporibus\n exercitationem\n eos illo minima non magnam, provident sit doloribus maiores odio in animi quidem unde. Perferendis.</p>\n\n </span>\n\n\n `,\n }\n-->'
8575
+ },
8576
+ {
8577
+ title: "Max Height",
8578
+ framework: "angular",
8579
+ code: '<!-- Storybook story: Max Height -->\n<div scroll-area ${argsToTemplate(props)} #scrollArea>\n <button size="sm" text-button variant="ghost" symbolLeft="arrow_downward" (click)="scrollArea.scrollToBottom()">Scroll to bottom</button>\n ${ngContent}\n <button size="sm" text-button variant="ghost" symbolLeft="arrow_upward" (click)="scrollArea.scrollToTop()">Back to top</button>\n</div>\n<!-- args:\n{ ...Primary.args, height: undefined, maxHeight: 160 }\n-->'
8363
8580
  }
8364
8581
  ],
8365
8582
  guidelines: {
8366
- whenToUse: "A scroll container with themed, consistent scrollbars across browsers \u2014 thin\nEmotion-styled WebKit scrollbars with a `scrollbar-width`/`scrollbar-color`\nfallback. It detects scrollable state via ResizeObserver (the `scrollable` output)\nand offers `scrollToTop`/`scrollToBottom` for programmatic control.",
8583
+ whenToUse: "A scroll container with themed, consistent scrollbars across browsers \u2014 thin\nEmotion-styled WebKit scrollbars with a `scrollbar-width`/`scrollbar-color`\nfallback. It detects scrollable state via ResizeObserver (the `scrollable` output)\nand offers `scrollToTop`/`scrollToBottom` for programmatic control.\nThree ways to size it: `height` fixes it; `maxHeight` lets it grow with its\ncontent up to a cap, then scroll; `fill` takes the room a flex-column parent\nleaves and scrolls within it \u2014 the body of a dialog without a wrapper. With none\nof them the area is content-sized and never scrolls.",
8367
8584
  dos: [],
8368
8585
  donts: [],
8369
8586
  accessibility: []
@@ -8377,7 +8594,7 @@ initialFocus="input"
8377
8594
  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.",
8378
8595
  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.",
8379
8596
  category: "forms",
8380
- version: "11.6.0",
8597
+ version: "11.8.0",
8381
8598
  bindings: {
8382
8599
  angular: {
8383
8600
  importPath: "@uni-design-system/uni-angular",
@@ -8512,7 +8729,7 @@ initialFocus="input"
8512
8729
  summary: "",
8513
8730
  description: "",
8514
8731
  category: "forms",
8515
- version: "11.6.0",
8732
+ version: "11.8.0",
8516
8733
  bindings: {
8517
8734
  angular: {
8518
8735
  importPath: "@uni-design-system/uni-angular",
@@ -8660,9 +8877,11 @@ initialFocus="input"
8660
8877
  }
8661
8878
  ],
8662
8879
  guidelines: {
8663
- whenToUse: "Single choice from a list, on a native `<select>` \u2014 platform pickers on mobile,\nplatform keyboard behavior everywhere. Options are typed generically\n(`options: T[]` with `optionLabel`/`optionValue` accessors), and the component\nimplements `FormValueControl` for the Signal Forms `[formField]` directive. Errors\nstyle the field only after interaction, matching Input.\nFor choosing several, use Multi Select. When the list outgrows ~10 options, or\nusers know what they're looking for and want to type it, use Combobox \u2014 the\nvalue contract is identical (`T | null`, `compareWith`), so the swap is a\ntemplate-only change.",
8880
+ whenToUse: "Single choice from a list, on a native `<select>` \u2014 platform pickers on mobile,\nplatform keyboard behavior everywhere. Options are typed generically\n(`options: T[]` with `optionLabel`/`optionValue` accessors), and the component\nimplements `FormValueControl` for the Signal Forms `[formField]` directive. Errors\nstyle the field only after interaction, matching Input.\nThe value contract is `T | null`: `null` is \"nothing selected\". A value that no\noption stands for \u2014 `''`, a stale id \u2014 renders as empty too, never as the first\noption, and is reported with a dev-mode warning once the options have loaded.\nFor choosing several, use Multi Select. When the list outgrows ~10 options, or\nusers know what they're looking for and want to type it, use Combobox \u2014 the\nvalue contract is identical (`T | null`, `compareWith`), so the swap is a\ntemplate-only change.",
8664
8881
  dos: [],
8665
- donts: [],
8882
+ donts: [
8883
+ "Bind `''` to mean \"nothing selected\" \u2014 the contract is `null`. The field shows"
8884
+ ],
8666
8885
  accessibility: [
8667
8886
  "Native `<select>`: platform keyboard interaction and mobile pickers for free.",
8668
8887
  "`label` becomes the accessible name; `aria-invalid` reflects the touched error state.",
@@ -8682,7 +8901,7 @@ initialFocus="input"
8682
8901
  summary: "Loading placeholder painted with surface tokens.",
8683
8902
  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.",
8684
8903
  category: "components",
8685
- version: "11.6.0",
8904
+ version: "11.8.0",
8686
8905
  bindings: {
8687
8906
  angular: {
8688
8907
  importPath: "@uni-design-system/uni-angular",
@@ -8833,7 +9052,7 @@ initialFocus="input"
8833
9052
  summary: "Bounded numeric input by pointer, for values where the *position* is the information: volume, opacity, weightings, price filters.",
8834
9053
  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.",
8835
9054
  category: "forms",
8836
- version: "11.6.0",
9055
+ version: "11.8.0",
8837
9056
  bindings: {
8838
9057
  angular: {
8839
9058
  importPath: "@uni-design-system/uni-angular",
@@ -9110,7 +9329,7 @@ initialFocus="input"
9110
9329
  summary: "",
9111
9330
  description: "",
9112
9331
  category: "feedback",
9113
- version: "11.6.0",
9332
+ version: "11.8.0",
9114
9333
  bindings: {
9115
9334
  angular: {
9116
9335
  importPath: "@uni-design-system/uni-angular",
@@ -9222,7 +9441,7 @@ initialFocus="input"
9222
9441
  summary: "",
9223
9442
  description: "",
9224
9443
  category: "data",
9225
- version: "11.6.0",
9444
+ version: "11.8.0",
9226
9445
  bindings: {
9227
9446
  angular: {
9228
9447
  importPath: "@uni-design-system/uni-angular",
@@ -9241,6 +9460,21 @@ initialFocus="input"
9241
9460
  type: "UniDatasource<T>",
9242
9461
  required: false,
9243
9462
  description: ""
9463
+ },
9464
+ {
9465
+ name: "iconName",
9466
+ kind: "input",
9467
+ type: "IconName",
9468
+ required: false,
9469
+ default: "'arrowUp'",
9470
+ description: "The glyph shown while sorted. One icon serves both directions \u2014 it is drawn as given for descending and rotated half a turn for ascending \u2014 so pick an arrow or chevron that reads either way up."
9471
+ },
9472
+ {
9473
+ name: "align",
9474
+ kind: "input",
9475
+ type: "'left' | 'right' | 'center'",
9476
+ required: false,
9477
+ description: "The column's text alignment. The arrow hangs outside the label so the label stays flush with the cells under it; in a right-aligned column it moves to the leading side, where it cannot push past the table's edge."
9244
9478
  }
9245
9479
  ]
9246
9480
  }
@@ -9281,7 +9515,7 @@ initialFocus="input"
9281
9515
  summary: "",
9282
9516
  description: "",
9283
9517
  category: "layout",
9284
- version: "11.6.0",
9518
+ version: "11.8.0",
9285
9519
  bindings: {
9286
9520
  angular: {
9287
9521
  importPath: "@uni-design-system/uni-angular",
@@ -9336,7 +9570,7 @@ initialFocus="input"
9336
9570
  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.',
9337
9571
  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.',
9338
9572
  category: "components",
9339
- version: "11.6.0",
9573
+ version: "11.8.0",
9340
9574
  bindings: {
9341
9575
  angular: {
9342
9576
  importPath: "@uni-design-system/uni-angular",
@@ -9454,7 +9688,7 @@ initialFocus="input"
9454
9688
  summary: "",
9455
9689
  description: "",
9456
9690
  category: "primitives",
9457
- version: "11.6.0",
9691
+ version: "11.8.0",
9458
9692
  bindings: {
9459
9693
  angular: {
9460
9694
  importPath: "@uni-design-system/uni-angular",
@@ -9543,7 +9777,7 @@ initialFocus="input"
9543
9777
  summary: "One tab inside `uni-tabs`: a label for the tablist plus projected panel content.",
9544
9778
  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.",
9545
9779
  category: "components",
9546
- version: "11.6.0",
9780
+ version: "11.8.0",
9547
9781
  bindings: {
9548
9782
  angular: {
9549
9783
  importPath: "@uni-design-system/uni-angular",
@@ -9583,7 +9817,7 @@ initialFocus="input"
9583
9817
  summary: "WAI-ARIA tabs: roving tabindex, automatic activation (arrow keys move focus and select), Home/End, disabled tabs skipped.",
9584
9818
  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. A tab switch is softened by the `panelMotion` option: the incoming content fades in while the panel animates from the outgoing content's height to its own. The new content is live from the first frame \u2014 nothing waits on the animation.",
9585
9819
  category: "components",
9586
- version: "11.6.0",
9820
+ version: "11.8.0",
9587
9821
  bindings: {
9588
9822
  angular: {
9589
9823
  importPath: "@uni-design-system/uni-angular",
@@ -9671,7 +9905,7 @@ initialFocus="input"
9671
9905
  summary: "Compact chip for categories, states, filters and tokens.",
9672
9906
  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.",
9673
9907
  category: "data",
9674
- version: "11.6.0",
9908
+ version: "11.8.0",
9675
9909
  bindings: {
9676
9910
  angular: {
9677
9911
  importPath: "@uni-design-system/uni-angular",
@@ -10049,7 +10283,7 @@ initialFocus="input"
10049
10283
  summary: "A row of chips the user picks from: filters, facets, a set of labels.",
10050
10284
  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.",
10051
10285
  category: "data",
10052
- version: "11.6.0",
10286
+ version: "11.8.0",
10053
10287
  bindings: {
10054
10288
  angular: {
10055
10289
  importPath: "@uni-design-system/uni-angular",
@@ -10247,7 +10481,7 @@ initialFocus="input"
10247
10481
  summary: "",
10248
10482
  description: "",
10249
10483
  category: "forms",
10250
- version: "11.6.0",
10484
+ version: "11.8.0",
10251
10485
  bindings: {
10252
10486
  angular: {
10253
10487
  importPath: "@uni-design-system/uni-angular",
@@ -10698,7 +10932,7 @@ placeholder="Name or address\u2026"
10698
10932
  summary: "The typography primitive, applied as an attribute to any element so semantics stay yours.",
10699
10933
  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.',
10700
10934
  category: "primitives",
10701
- version: "11.6.0",
10935
+ version: "11.8.0",
10702
10936
  bindings: {
10703
10937
  angular: {
10704
10938
  importPath: "@uni-design-system/uni-angular",
@@ -10808,7 +11042,7 @@ placeholder="Name or address\u2026"
10808
11042
  summary: "",
10809
11043
  description: "",
10810
11044
  category: "forms",
10811
- version: "11.6.0",
11045
+ version: "11.8.0",
10812
11046
  bindings: {
10813
11047
  angular: {
10814
11048
  importPath: "@uni-design-system/uni-angular",
@@ -10968,6 +11202,14 @@ placeholder="Name or address\u2026"
10968
11202
  required: false,
10969
11203
  default: "undefined",
10970
11204
  description: ""
11205
+ },
11206
+ {
11207
+ name: "unframed",
11208
+ kind: "input",
11209
+ type: "unknown",
11210
+ required: false,
11211
+ default: "false, { transform: booleanAttribute }",
11212
+ description: "Drop the field chrome and render the bare textarea \u2014 see `uni-input-box`."
10971
11213
  }
10972
11214
  ]
10973
11215
  }
@@ -11015,7 +11257,7 @@ placeholder="Name or address\u2026"
11015
11257
  summary: "",
11016
11258
  description: "",
11017
11259
  category: "primitives",
11018
- version: "11.6.0",
11260
+ version: "11.8.0",
11019
11261
  bindings: {
11020
11262
  angular: {
11021
11263
  importPath: "@uni-design-system/uni-angular",
@@ -11045,7 +11287,7 @@ placeholder="Name or address\u2026"
11045
11287
  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).",
11046
11288
  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).",
11047
11289
  category: "components",
11048
- version: "11.6.0",
11290
+ version: "11.8.0",
11049
11291
  bindings: {
11050
11292
  angular: {
11051
11293
  importPath: "@uni-design-system/uni-angular",
@@ -11103,7 +11345,7 @@ placeholder="Name or address\u2026"
11103
11345
  summary: "Time field: a combobox over time options \u2014 the same listbox contract as uni-search-input and uni-tag-input.",
11104
11346
  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.",
11105
11347
  category: "forms",
11106
- version: "11.6.0",
11348
+ version: "11.8.0",
11107
11349
  bindings: {
11108
11350
  angular: {
11109
11351
  importPath: "@uni-design-system/uni-angular",
@@ -11318,7 +11560,7 @@ placeholder="Name or address\u2026"
11318
11560
  summary: "",
11319
11561
  description: "",
11320
11562
  category: "forms",
11321
- version: "11.6.0",
11563
+ version: "11.8.0",
11322
11564
  bindings: {
11323
11565
  angular: {
11324
11566
  importPath: "@uni-design-system/uni-angular",
@@ -11580,7 +11822,7 @@ placeholder="Name or address\u2026"
11580
11822
  summary: "",
11581
11823
  description: "",
11582
11824
  category: "feedback",
11583
- version: "11.6.0",
11825
+ version: "11.8.0",
11584
11826
  bindings: {
11585
11827
  angular: {
11586
11828
  importPath: "@uni-design-system/uni-angular",
@@ -11668,7 +11910,7 @@ placeholder="Name or address\u2026"
11668
11910
  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).',
11669
11911
  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.',
11670
11912
  category: "components",
11671
- version: "11.6.0",
11913
+ version: "11.8.0",
11672
11914
  bindings: {
11673
11915
  angular: {
11674
11916
  importPath: "@uni-design-system/uni-angular",
@@ -11689,6 +11931,13 @@ placeholder="Name or address\u2026"
11689
11931
  default: "null",
11690
11932
  description: "The presented step index, or null when the tour is not running."
11691
11933
  },
11934
+ {
11935
+ name: "progressStyle",
11936
+ kind: "input",
11937
+ type: "'dots' | 'fraction' | 'none'",
11938
+ required: false,
11939
+ description: "Per-instance override of the `progressStyle` theme option, so a one-off pointer can differ from the app's tours without a second theme entry. A one-step tour renders no progress whatever this says \u2014 one dot beside Done counts nothing."
11940
+ },
11692
11941
  {
11693
11942
  name: "nextLabel",
11694
11943
  kind: "input",
@@ -11726,14 +11975,14 @@ placeholder="Name or address\u2026"
11726
11975
  kind: "output",
11727
11976
  type: "void",
11728
11977
  required: false,
11729
- description: ""
11978
+ description: "The first step of a run was presented \u2014 from `start()` or from a write to `active`."
11730
11979
  },
11731
11980
  {
11732
11981
  name: "finished",
11733
11982
  kind: "output",
11734
11983
  type: "void",
11735
11984
  required: false,
11736
- description: ""
11985
+ description: "The run walked past its last step. Never emitted for a run in which no step was presented (empty `steps`, every target missing): a tour that never opened did not finish."
11737
11986
  },
11738
11987
  {
11739
11988
  name: "variant",
@@ -11767,10 +12016,10 @@ placeholder="Name or address\u2026"
11767
12016
  }
11768
12017
  ],
11769
12018
  guidelines: {
11770
- whenToUse: 'Tour sequences one `uni-callout` through a list of steps: spotlight targets,\ndim interludes, and interaction gates. A step with `advanceOn` locks Next\nuntil the user performs the gesture on its target \u2014 clicks auto-advance\n(the gesture is complete), anything else unlocks Next and announces it\nthrough one polite `role="status"` region, so nobody is yanked forward\nmid-typing. Steps whose declared target cannot be found are skipped in the\ndirection of travel with a dev warning, never an error. `active` is a\ntwo-way model, so tours are deep-linkable; Escape or the close button skips\nand reports the step through `skipped`.',
12019
+ whenToUse: 'Tour sequences one `uni-callout` through a list of steps: spotlight targets,\ndim interludes, and interaction gates. A step with `advanceOn` locks Next\nuntil the user performs the gesture on its target \u2014 clicks auto-advance\n(the gesture is complete), anything else unlocks Next and announces it\nthrough one polite `role="status"` region, so nobody is yanked forward\nmid-typing. Steps whose declared target cannot be found are skipped in the\ndirection of travel with a dev warning, never an error. `active` is a\ntwo-way model, so tours are deep-linkable; Escape or the close button skips\nand reports the step through `skipped`.\n`started` fires when the first step of a run is presented \u2014 through `start()`\nor a write to `active` \u2014 and `finished` only for a run that presented at least\none step. A `start()` issued before `steps` are bound waits for them, so a host\nthat loads steps from a service and starts in the same turn still opens on the\nfirst one. A step without a `body` renders its title alone, and a one-step tour\ndraws no progress.',
11771
12020
  dos: [
11772
12021
  "Keep tours short and gate only steps whose gesture teaches something",
11773
- "Handle `skipped`/`finished` and persist them \u2014 the tour holds no storage"
12022
+ "Handle `skipped`/`finished` and persist them \u2014 the tour holds no storage;"
11774
12023
  ],
11775
12024
  donts: [
11776
12025
  "Point steps at elements that may not exist without accepting the skip",
@@ -11795,7 +12044,7 @@ placeholder="Name or address\u2026"
11795
12044
  summary: "",
11796
12045
  description: "",
11797
12046
  category: "layout",
11798
- version: "11.6.0",
12047
+ version: "11.8.0",
11799
12048
  bindings: {
11800
12049
  angular: {
11801
12050
  importPath: "@uni-design-system/uni-angular",
@@ -14217,6 +14466,18 @@ placeholder="Name or address\u2026"
14217
14466
  DarkTheme: "lg"
14218
14467
  }
14219
14468
  },
14469
+ {
14470
+ id: "dialog.behavior.overscroll",
14471
+ value: "contain",
14472
+ type: "string",
14473
+ kind: "behavioral",
14474
+ target: "component-prop",
14475
+ appliesTo: "dialog",
14476
+ themeValues: {
14477
+ LightTheme: "contain",
14478
+ DarkTheme: "contain"
14479
+ }
14480
+ },
14220
14481
  {
14221
14482
  id: "dialog.behavior.elevation",
14222
14483
  value: "dialog",
@@ -14445,6 +14706,18 @@ placeholder="Name or address\u2026"
14445
14706
  DarkTheme: "md"
14446
14707
  }
14447
14708
  },
14709
+ {
14710
+ id: "dialogHeader.behavior.richPadding",
14711
+ value: "md",
14712
+ type: "string",
14713
+ kind: "behavioral",
14714
+ target: "component-prop",
14715
+ appliesTo: "dialogHeader",
14716
+ themeValues: {
14717
+ LightTheme: "md",
14718
+ DarkTheme: "md"
14719
+ }
14720
+ },
14448
14721
  {
14449
14722
  id: "select.behavior.toggleIcon",
14450
14723
  value: "chevronDown",
@@ -14973,6 +15246,42 @@ placeholder="Name or address\u2026"
14973
15246
  DarkTheme: "reveal"
14974
15247
  }
14975
15248
  },
15249
+ {
15250
+ id: "expand.behavior.textRole",
15251
+ value: "label",
15252
+ type: "string",
15253
+ kind: "behavioral",
15254
+ target: "component-prop",
15255
+ appliesTo: "expand",
15256
+ themeValues: {
15257
+ LightTheme: "label",
15258
+ DarkTheme: "label"
15259
+ }
15260
+ },
15261
+ {
15262
+ id: "expand.behavior.sublabelRole",
15263
+ value: "caption",
15264
+ type: "string",
15265
+ kind: "behavioral",
15266
+ target: "component-prop",
15267
+ appliesTo: "expand",
15268
+ themeValues: {
15269
+ LightTheme: "caption",
15270
+ DarkTheme: "caption"
15271
+ }
15272
+ },
15273
+ {
15274
+ id: "expand.behavior.sublabelColor",
15275
+ value: "on-background-variant",
15276
+ type: "string",
15277
+ kind: "behavioral",
15278
+ target: "component-prop",
15279
+ appliesTo: "expand",
15280
+ themeValues: {
15281
+ LightTheme: "on-background-variant",
15282
+ DarkTheme: "on-background-variant"
15283
+ }
15284
+ },
14976
15285
  {
14977
15286
  id: "input.behavior.typeface",
14978
15287
  value: "input",
@@ -16005,6 +16314,18 @@ placeholder="Name or address\u2026"
16005
16314
  DarkTheme: "sm"
16006
16315
  }
16007
16316
  },
16317
+ {
16318
+ id: "contactInput.behavior.chipAvatar",
16319
+ value: true,
16320
+ type: "boolean",
16321
+ kind: "behavioral",
16322
+ target: "component-prop",
16323
+ appliesTo: "contactInput",
16324
+ themeValues: {
16325
+ LightTheme: true,
16326
+ DarkTheme: true
16327
+ }
16328
+ },
16008
16329
  {
16009
16330
  id: "calendar.behavior.dayBorderRadius",
16010
16331
  value: "max",
@@ -16665,6 +16986,18 @@ placeholder="Name or address\u2026"
16665
16986
  DarkTheme: "sm"
16666
16987
  }
16667
16988
  },
16989
+ {
16990
+ id: "dataTable.behavior.sortIcon",
16991
+ value: "arrowUp",
16992
+ type: "string",
16993
+ kind: "behavioral",
16994
+ target: "component-prop",
16995
+ appliesTo: "dataTable",
16996
+ themeValues: {
16997
+ LightTheme: "arrowUp",
16998
+ DarkTheme: "arrowUp"
16999
+ }
17000
+ },
16668
17001
  {
16669
17002
  id: "dataTable.behavior.tdTextRole",
16670
17003
  value: "title-small",
@@ -16809,6 +17142,18 @@ placeholder="Name or address\u2026"
16809
17142
  DarkTheme: -10
16810
17143
  }
16811
17144
  },
17145
+ {
17146
+ id: "notificationBadge.behavior.typeface",
17147
+ value: "overline",
17148
+ type: "string",
17149
+ kind: "behavioral",
17150
+ target: "component-prop",
17151
+ appliesTo: "notificationBadge",
17152
+ themeValues: {
17153
+ LightTheme: "overline",
17154
+ DarkTheme: "overline"
17155
+ }
17156
+ },
16812
17157
  {
16813
17158
  id: "paginator.behavior.gap",
16814
17159
  value: "xs",
@@ -17987,6 +18332,7 @@ placeholder="Name or address\u2026"
17987
18332
  border: "quaternary",
17988
18333
  padding: "sm",
17989
18334
  inset: "lg",
18335
+ overscroll: "contain",
17990
18336
  elevation: "dialog",
17991
18337
  backdrop: "scrim",
17992
18338
  motion: "panel"
@@ -18009,7 +18355,8 @@ placeholder="Name or address\u2026"
18009
18355
  textRole: "title-large",
18010
18356
  textAlign: "center",
18011
18357
  closeButtonIcon: "close",
18012
- closeButtonSize: "md"
18358
+ closeButtonSize: "md",
18359
+ richPadding: "md"
18013
18360
  },
18014
18361
  select: {
18015
18362
  toggleIcon: "chevronDown",
@@ -18069,7 +18416,10 @@ placeholder="Name or address\u2026"
18069
18416
  motion: "panel"
18070
18417
  },
18071
18418
  expand: {
18072
- motion: "reveal"
18419
+ motion: "reveal",
18420
+ textRole: "label",
18421
+ sublabelRole: "caption",
18422
+ sublabelColor: "on-background-variant"
18073
18423
  },
18074
18424
  input: {
18075
18425
  typeface: "input",
@@ -18179,7 +18529,8 @@ placeholder="Name or address\u2026"
18179
18529
  avatarVariant: "primary",
18180
18530
  nameTypeface: "body-2-short",
18181
18531
  detailTypeface: "caption",
18182
- rowGap: "sm"
18532
+ rowGap: "sm",
18533
+ chipAvatar: true
18183
18534
  },
18184
18535
  calendar: {
18185
18536
  dayBorderRadius: "max",
@@ -18257,6 +18608,7 @@ placeholder="Name or address\u2026"
18257
18608
  thVerticalBorder: "dotted",
18258
18609
  thHorizontalBorder: "light",
18259
18610
  thPadding: "sm",
18611
+ sortIcon: "arrowUp",
18260
18612
  tdTextRole: "title-small",
18261
18613
  tdColor: "primary-surface",
18262
18614
  tdStickyColor: "primary-container",
@@ -18270,7 +18622,8 @@ placeholder="Name or address\u2026"
18270
18622
  },
18271
18623
  notificationBadge: {
18272
18624
  borderRadius: "sm",
18273
- offset: -10
18625
+ offset: -10,
18626
+ typeface: "overline"
18274
18627
  },
18275
18628
  paginator: {
18276
18629
  gap: "xs",
@@ -18613,6 +18966,7 @@ placeholder="Name or address\u2026"
18613
18966
  border: "quaternary",
18614
18967
  padding: "sm",
18615
18968
  inset: "lg",
18969
+ overscroll: "contain",
18616
18970
  elevation: "dialog",
18617
18971
  backdrop: "scrim",
18618
18972
  motion: "panel"
@@ -18635,7 +18989,8 @@ placeholder="Name or address\u2026"
18635
18989
  textRole: "title-large",
18636
18990
  textAlign: "center",
18637
18991
  closeButtonIcon: "close",
18638
- closeButtonSize: "md"
18992
+ closeButtonSize: "md",
18993
+ richPadding: "md"
18639
18994
  },
18640
18995
  select: {
18641
18996
  toggleIcon: "chevronDown",
@@ -18695,7 +19050,10 @@ placeholder="Name or address\u2026"
18695
19050
  motion: "panel"
18696
19051
  },
18697
19052
  expand: {
18698
- motion: "reveal"
19053
+ motion: "reveal",
19054
+ textRole: "label",
19055
+ sublabelRole: "caption",
19056
+ sublabelColor: "on-background-variant"
18699
19057
  },
18700
19058
  input: {
18701
19059
  typeface: "input",
@@ -18805,7 +19163,8 @@ placeholder="Name or address\u2026"
18805
19163
  avatarVariant: "primary",
18806
19164
  nameTypeface: "body-2-short",
18807
19165
  detailTypeface: "caption",
18808
- rowGap: "sm"
19166
+ rowGap: "sm",
19167
+ chipAvatar: true
18809
19168
  },
18810
19169
  calendar: {
18811
19170
  dayBorderRadius: "max",
@@ -18883,6 +19242,7 @@ placeholder="Name or address\u2026"
18883
19242
  thVerticalBorder: "dotted",
18884
19243
  thHorizontalBorder: "light",
18885
19244
  thPadding: "sm",
19245
+ sortIcon: "arrowUp",
18886
19246
  tdTextRole: "title-small",
18887
19247
  tdColor: "primary-surface",
18888
19248
  tdStickyColor: "primary-container",
@@ -18896,7 +19256,8 @@ placeholder="Name or address\u2026"
18896
19256
  },
18897
19257
  notificationBadge: {
18898
19258
  borderRadius: "sm",
18899
- offset: -10
19259
+ offset: -10,
19260
+ typeface: "overline"
18900
19261
  },
18901
19262
  paginator: {
18902
19263
  gap: "xs",
@@ -19004,6 +19365,36 @@ placeholder="Name or address\u2026"
19004
19365
  {
19005
19366
  package: "@uni-design-system/uni-angular",
19006
19367
  releases: [
19368
+ {
19369
+ version: "11.8.0",
19370
+ entries: [
19371
+ {
19372
+ bump: "minor",
19373
+ title: "The dialog and drawer release: footers that take your own actions, a rich dialog head, and a non-modal overlay drawer.",
19374
+ body: "- **`[dialog-buttons]`, `[drawer-buttons]`**: an `<ng-content>` inside the row. Empty, each renders its pair (Confirm/Cancel, Cancel/Save) as before; project your own buttons and they replace the pair while keeping the row's chrome \u2014 padding, gap, `justifyContent`, the divider, `stretch`, `reverseOrder`. Until now importing either component silently discarded whatever a consumer projected, which is why apps carried the slot attribute _without_ the import to keep a real footer. A `[dialog-footnote]` / `[drawer-footnote]` projects on the leading edge and pushes the actions to the trailing one. `loading` puts the spinner on the confirm button; on the dialog, `closeOnConfirm` (default `true`) can be turned off so an asynchronous save closes the dialog itself \u2014 and a failed one leaves it open with its error.\n- **`[dialog-header]`**: a `rich` input renders the projection as a block beside the close button \u2014 an eyebrow, a headline, a blurb \u2014 instead of one centred line. Two `dialogHeader` theme options dress it: `richColor` (unset by default: the head is part of the sheet, not a pill on it) and `richPadding` (`md`). The new **`[dialog-title]`** directive marks the headline inside a rich head so it alone is the dialog's accessible name; without one the whole block is. The title bar is unchanged.\n- **`uni-drawer`**: `modal` (default `true`) on `over` mode. Off, the panel is shown as a `popover=\"manual\"` \u2014 still the top layer, where nothing can clip or cover it, but no focus trap, no inert page and no backdrop: a workbench beside the live document it changes, and the reason a toast's Undo stays clickable while a panel is open. Escape still asks to close through `closeRequest` (while focus is inside the panel), so `disableAutoClose` vetoes it as in modal mode; `scrim` is ignored with a dev-mode warning; and `closeOnOutsideClick` (default `false`, reason `'outside'`) opts into dismissal on a click beyond the panel. `DrawerCloseReason` gains `'outside'`.\n- **`uni-callout`** (and so `uni-tour`): every retarget re-shows the scrim and panel, so a panel opened by the previous step's click \u2014 which entered the top layer after them and covered them \u2014 ends up beneath them again, and the next step can point inside it. The panel has to be non-modal for that: a `showModal()` dialog makes everything outside it inert, which no stacking undoes. That is what `modal: false` on the drawer is for.\n\nBase theme: `dialogHeader.options.richColor` (undefined) and `richPadding` (`md`).",
19375
+ commit: "fa02607"
19376
+ }
19377
+ ],
19378
+ dependencyBumps: []
19379
+ },
19380
+ {
19381
+ version: "11.7.0",
19382
+ entries: [
19383
+ {
19384
+ bump: "minor",
19385
+ title: "Data table refinements from the Wellsourced adoption.",
19386
+ body: '- **Phantom scrollbar fixed**: a right-aligned last column no longer grows a horizontal scrollbar. The sort arrow now sits on the leading side of the label in right-aligned columns, and header cells clip the arrow instead of letting it widen the scroll area.\n- **`ColumnDefinition`**: `width` (a preferred column width) and `sortable` (default `true`; `false` renders a plain heading with no sort button or `aria-sort`).\n- **Cell templates** receive the row as `$implicit` and its `index`, alongside the row\'s fields by name, so `let-row` works and existing `let-name="name"` templates are unchanged. The context type is exported as `UniDataTableCellContext<T>`.\n- **`dataTable` theme options**: `thPaddingVertical` / `thPaddingHorizontal` and `tdPaddingVertical` / `tdPaddingHorizontal` override `thPadding` / `tdPadding` per axis; `sortIcon` picks the sort glyph (default `arrowUp`).\n- **`uni-sort-header`**: `iconName` and `align` inputs.',
19387
+ commit: "ffe2080"
19388
+ },
19389
+ {
19390
+ bump: "minor",
19391
+ title: 'Close the first two tiers of the Wellsourced change-request queue: six silent-failure fixes and five "the theme could not reach it" gaps, all additive.',
19392
+ body: "- **`uni-select`**: a value no option stands for \u2014 `''`, a stale id, or `null` with no `placeholder` \u2014 now renders as empty instead of as the first option. A native `<select>` with no selected `<option>` shows its first entry, so the field used to display a choice the model did not hold. A hidden \"nothing selected\" row is rendered whenever the model is unmatched (the placeholder, when there is one), and a dev-mode warning names a bound value that matches no option once the options have loaded.\n- **`uni-button`, `uni-icon-button`**: `disabled` is accepted as an alias of `disable`. The native name \u2014 the one every other Uni control uses \u2014 used to land on the DOM property, where the host's own attribute binding removed it on the first pass, so a button that had to start disabled rendered enabled with no error. `icon-button`'s `disable` and `loading` gain the `booleanAttribute` transform `text-button`'s already had: `<button icon-button disable>` works, and an optional chain (`[disable]=\"x()?.saving\"`) no longer needs a `!!`.\n- **`uni-tour`**: `finished` is only emitted for a run that presented at least one step, and `started` fires when the first step is presented \u2014 from `start()` or from a write to `active` \u2014 rather than at the call. A `start()` issued before `steps` are bound waits for them, so a host that loads steps from a service and starts in the same turn opens on the first one instead of reporting a finish for a tour that never opened. A one-step tour draws no progress, `progressStyle` accepts `'none'` and has a per-instance input, and a step may omit `body`.\n- **`uni-notification-badge`**: the `typeface` option is read (it was declared and never wired), the host is `inline-flex` so it no longer drops a wrapped link under its flex siblings, and the disc takes its size from a new `sizes` block (`sm` 14 / `md` 16 / `lg` 20px, keyed by `size`; `lg` is the default and the 20px it always drew). A count may widen rather than clip inside a fixed square. `offset` documents how it should scale with the wrapped element.\n- **`uni-contact-input`**: forwards `parse`; a `chipAvatar` input and theme option (default `true`) draw the chip as the name alone when the initials would only repeat it. **`uni-tag-input`** under `preset=\"email\"` now splits a paste on whitespace too \u2014 a column copied from a spreadsheet becomes one chip per address \u2014 while keeping the words of `Name <address>` together; and `openOnFocus` opens the list when suggestions arrive _after_ focus, so a field focused while its contacts are still loading shows them the moment they land (unless Escape dismissed the list in between).\n- **`uni-toggle`**: the hidden native input uses the shared `visuallyHidden` recipe \u2014 the last hidden helper in the library still on a private `position: absolute`.\n- **`uni-expand-toggle`**: the labelled trigger's type is themable through the `expand` entry \u2014 `textRole` / `textColor` and `sublabelRole` / `sublabelColor`, defaulting to the `label` / `caption` it hardcoded. The checkbox finding from 11.2.0, closed here.\n- **`uni-input`, `uni-textarea`, `uni-number-input`**: `unframed` drops the field chrome (border, fill, radius, shadow, inset and focus treatment) and renders the bare control, the same meaning it has on `uni-tag-input`; it lives on `uni-input-box` and is forwarded. `uni-input` also gains `align`, as `uni-number-input` has. (`labelHidden` was asked for too: the text fields never draw their `label` \u2014 it is the accessible name only \u2014 so there is nothing to hide.)\n- **`uni-dialog`**: an `overscroll` theme option (`auto` / `contain` / `none`, default `contain`, which is what the body hardcoded) for the scrolling body row.\n- **`uni-scroll-area`**: `maxHeight` lets the area grow with its content up to a cap and then scroll; `fill` takes the room a flex-column parent leaves. Either makes it the body of a dialog without a wrapper. With neither (or `height`) the layout is unchanged.\n- **`uni-combobox`**: `emptyValue` is what a clear writes \u2014 `null` by default, `''` for a field bound to a plain `string` schema, whose readers no longer meet a `null` after the \u2715.\n\nTheme-level additions in uni-core's base theme: `notificationBadge.sizes` and `options.typeface`, `expand.options.textRole` / `sublabelRole` / `sublabelColor`, `dialog.options.overscroll`, `contactInput.options.chipAvatar`. Every default reproduces what the component previously hardcoded.",
19393
+ commit: "9ff14bc"
19394
+ }
19395
+ ],
19396
+ dependencyBumps: []
19397
+ },
19007
19398
  {
19008
19399
  version: "11.6.0",
19009
19400
  entries: [
@@ -19962,6 +20353,36 @@ placeholder="Name or address\u2026"
19962
20353
  {
19963
20354
  package: "@uni-design-system/uni-core",
19964
20355
  releases: [
20356
+ {
20357
+ version: "11.8.0",
20358
+ entries: [
20359
+ {
20360
+ bump: "minor",
20361
+ title: "The dialog and drawer release: footers that take your own actions, a rich dialog head, and a non-modal overlay drawer.",
20362
+ body: "- **`[dialog-buttons]`, `[drawer-buttons]`**: an `<ng-content>` inside the row. Empty, each renders its pair (Confirm/Cancel, Cancel/Save) as before; project your own buttons and they replace the pair while keeping the row's chrome \u2014 padding, gap, `justifyContent`, the divider, `stretch`, `reverseOrder`. Until now importing either component silently discarded whatever a consumer projected, which is why apps carried the slot attribute _without_ the import to keep a real footer. A `[dialog-footnote]` / `[drawer-footnote]` projects on the leading edge and pushes the actions to the trailing one. `loading` puts the spinner on the confirm button; on the dialog, `closeOnConfirm` (default `true`) can be turned off so an asynchronous save closes the dialog itself \u2014 and a failed one leaves it open with its error.\n- **`[dialog-header]`**: a `rich` input renders the projection as a block beside the close button \u2014 an eyebrow, a headline, a blurb \u2014 instead of one centred line. Two `dialogHeader` theme options dress it: `richColor` (unset by default: the head is part of the sheet, not a pill on it) and `richPadding` (`md`). The new **`[dialog-title]`** directive marks the headline inside a rich head so it alone is the dialog's accessible name; without one the whole block is. The title bar is unchanged.\n- **`uni-drawer`**: `modal` (default `true`) on `over` mode. Off, the panel is shown as a `popover=\"manual\"` \u2014 still the top layer, where nothing can clip or cover it, but no focus trap, no inert page and no backdrop: a workbench beside the live document it changes, and the reason a toast's Undo stays clickable while a panel is open. Escape still asks to close through `closeRequest` (while focus is inside the panel), so `disableAutoClose` vetoes it as in modal mode; `scrim` is ignored with a dev-mode warning; and `closeOnOutsideClick` (default `false`, reason `'outside'`) opts into dismissal on a click beyond the panel. `DrawerCloseReason` gains `'outside'`.\n- **`uni-callout`** (and so `uni-tour`): every retarget re-shows the scrim and panel, so a panel opened by the previous step's click \u2014 which entered the top layer after them and covered them \u2014 ends up beneath them again, and the next step can point inside it. The panel has to be non-modal for that: a `showModal()` dialog makes everything outside it inert, which no stacking undoes. That is what `modal: false` on the drawer is for.\n\nBase theme: `dialogHeader.options.richColor` (undefined) and `richPadding` (`md`).",
20363
+ commit: "fa02607"
20364
+ }
20365
+ ],
20366
+ dependencyBumps: []
20367
+ },
20368
+ {
20369
+ version: "11.7.0",
20370
+ entries: [
20371
+ {
20372
+ bump: "minor",
20373
+ title: "Data table refinements from the Wellsourced adoption.",
20374
+ body: '- **Phantom scrollbar fixed**: a right-aligned last column no longer grows a horizontal scrollbar. The sort arrow now sits on the leading side of the label in right-aligned columns, and header cells clip the arrow instead of letting it widen the scroll area.\n- **`ColumnDefinition`**: `width` (a preferred column width) and `sortable` (default `true`; `false` renders a plain heading with no sort button or `aria-sort`).\n- **Cell templates** receive the row as `$implicit` and its `index`, alongside the row\'s fields by name, so `let-row` works and existing `let-name="name"` templates are unchanged. The context type is exported as `UniDataTableCellContext<T>`.\n- **`dataTable` theme options**: `thPaddingVertical` / `thPaddingHorizontal` and `tdPaddingVertical` / `tdPaddingHorizontal` override `thPadding` / `tdPadding` per axis; `sortIcon` picks the sort glyph (default `arrowUp`).\n- **`uni-sort-header`**: `iconName` and `align` inputs.',
20375
+ commit: "ffe2080"
20376
+ },
20377
+ {
20378
+ bump: "minor",
20379
+ title: 'Close the first two tiers of the Wellsourced change-request queue: six silent-failure fixes and five "the theme could not reach it" gaps, all additive.',
20380
+ body: "- **`uni-select`**: a value no option stands for \u2014 `''`, a stale id, or `null` with no `placeholder` \u2014 now renders as empty instead of as the first option. A native `<select>` with no selected `<option>` shows its first entry, so the field used to display a choice the model did not hold. A hidden \"nothing selected\" row is rendered whenever the model is unmatched (the placeholder, when there is one), and a dev-mode warning names a bound value that matches no option once the options have loaded.\n- **`uni-button`, `uni-icon-button`**: `disabled` is accepted as an alias of `disable`. The native name \u2014 the one every other Uni control uses \u2014 used to land on the DOM property, where the host's own attribute binding removed it on the first pass, so a button that had to start disabled rendered enabled with no error. `icon-button`'s `disable` and `loading` gain the `booleanAttribute` transform `text-button`'s already had: `<button icon-button disable>` works, and an optional chain (`[disable]=\"x()?.saving\"`) no longer needs a `!!`.\n- **`uni-tour`**: `finished` is only emitted for a run that presented at least one step, and `started` fires when the first step is presented \u2014 from `start()` or from a write to `active` \u2014 rather than at the call. A `start()` issued before `steps` are bound waits for them, so a host that loads steps from a service and starts in the same turn opens on the first one instead of reporting a finish for a tour that never opened. A one-step tour draws no progress, `progressStyle` accepts `'none'` and has a per-instance input, and a step may omit `body`.\n- **`uni-notification-badge`**: the `typeface` option is read (it was declared and never wired), the host is `inline-flex` so it no longer drops a wrapped link under its flex siblings, and the disc takes its size from a new `sizes` block (`sm` 14 / `md` 16 / `lg` 20px, keyed by `size`; `lg` is the default and the 20px it always drew). A count may widen rather than clip inside a fixed square. `offset` documents how it should scale with the wrapped element.\n- **`uni-contact-input`**: forwards `parse`; a `chipAvatar` input and theme option (default `true`) draw the chip as the name alone when the initials would only repeat it. **`uni-tag-input`** under `preset=\"email\"` now splits a paste on whitespace too \u2014 a column copied from a spreadsheet becomes one chip per address \u2014 while keeping the words of `Name <address>` together; and `openOnFocus` opens the list when suggestions arrive _after_ focus, so a field focused while its contacts are still loading shows them the moment they land (unless Escape dismissed the list in between).\n- **`uni-toggle`**: the hidden native input uses the shared `visuallyHidden` recipe \u2014 the last hidden helper in the library still on a private `position: absolute`.\n- **`uni-expand-toggle`**: the labelled trigger's type is themable through the `expand` entry \u2014 `textRole` / `textColor` and `sublabelRole` / `sublabelColor`, defaulting to the `label` / `caption` it hardcoded. The checkbox finding from 11.2.0, closed here.\n- **`uni-input`, `uni-textarea`, `uni-number-input`**: `unframed` drops the field chrome (border, fill, radius, shadow, inset and focus treatment) and renders the bare control, the same meaning it has on `uni-tag-input`; it lives on `uni-input-box` and is forwarded. `uni-input` also gains `align`, as `uni-number-input` has. (`labelHidden` was asked for too: the text fields never draw their `label` \u2014 it is the accessible name only \u2014 so there is nothing to hide.)\n- **`uni-dialog`**: an `overscroll` theme option (`auto` / `contain` / `none`, default `contain`, which is what the body hardcoded) for the scrolling body row.\n- **`uni-scroll-area`**: `maxHeight` lets the area grow with its content up to a cap and then scroll; `fill` takes the room a flex-column parent leaves. Either makes it the body of a dialog without a wrapper. With neither (or `height`) the layout is unchanged.\n- **`uni-combobox`**: `emptyValue` is what a clear writes \u2014 `null` by default, `''` for a field bound to a plain `string` schema, whose readers no longer meet a `null` after the \u2715.\n\nTheme-level additions in uni-core's base theme: `notificationBadge.sizes` and `options.typeface`, `expand.options.textRole` / `sublabelRole` / `sublabelColor`, `dialog.options.overscroll`, `contactInput.options.chipAvatar`. Every default reproduces what the component previously hardcoded.",
20381
+ commit: "9ff14bc"
20382
+ }
20383
+ ],
20384
+ dependencyBumps: []
20385
+ },
19965
20386
  {
19966
20387
  version: "11.6.0",
19967
20388
  entries: [
@@ -20645,6 +21066,16 @@ placeholder="Name or address\u2026"
20645
21066
  {
20646
21067
  package: "@uni-design-system/uni-react",
20647
21068
  releases: [
21069
+ {
21070
+ version: "11.8.0",
21071
+ entries: [],
21072
+ dependencyBumps: []
21073
+ },
21074
+ {
21075
+ version: "11.7.0",
21076
+ entries: [],
21077
+ dependencyBumps: []
21078
+ },
20648
21079
  {
20649
21080
  version: "11.6.0",
20650
21081
  entries: [],
@@ -20956,6 +21387,16 @@ placeholder="Name or address\u2026"
20956
21387
  {
20957
21388
  package: "@uni-design-system/uni-mcp",
20958
21389
  releases: [
21390
+ {
21391
+ version: "11.8.0",
21392
+ entries: [],
21393
+ dependencyBumps: []
21394
+ },
21395
+ {
21396
+ version: "11.7.0",
21397
+ entries: [],
21398
+ dependencyBumps: []
21399
+ },
20959
21400
  {
20960
21401
  version: "11.6.0",
20961
21402
  entries: [],
@@ -21225,7 +21666,7 @@ placeholder="Name or address\u2026"
21225
21666
  summary: "Returns a document-unique id for wiring ARIA relationships (aria-controls, aria-describedby, aria-labelledby, ...).",
21226
21667
  description: "Returns a document-unique id for wiring ARIA relationships (aria-controls, aria-describedby, aria-labelledby, ...).",
21227
21668
  members: [],
21228
- version: "11.6.0"
21669
+ version: "11.8.0"
21229
21670
  },
21230
21671
  {
21231
21672
  id: "focusable-selector",
@@ -21237,7 +21678,7 @@ placeholder="Name or address\u2026"
21237
21678
  summary: "Selector matching natively focusable elements.",
21238
21679
  description: "Selector matching natively focusable elements. Used to locate the interactive element inside a projected trigger so ARIA attributes land on the element that actually receives focus.",
21239
21680
  members: [],
21240
- version: "11.6.0"
21681
+ version: "11.8.0"
21241
21682
  },
21242
21683
  {
21243
21684
  id: "resolve-focus-target",
@@ -21249,7 +21690,7 @@ placeholder="Name or address\u2026"
21249
21690
  summary: "Resolves the element that should carry ARIA state for a trigger: the element itself when focusable, otherwise its first focusable descendant.",
21250
21691
  description: "Resolves the element that should carry ARIA state for a trigger: the element itself when focusable, otherwise its first focusable descendant.",
21251
21692
  members: [],
21252
- version: "11.6.0"
21693
+ version: "11.8.0"
21253
21694
  },
21254
21695
  {
21255
21696
  id: "visually-hidden",
@@ -21261,7 +21702,7 @@ placeholder="Name or address\u2026"
21261
21702
  summary: "Visually hides content while keeping it available to screen readers.",
21262
21703
  description: "Visually hides content while keeping it available to screen readers. Use for text alternatives (e.g. badge counts, icon-only affordances). `fixed`, not `absolute`, and that is load-bearing. An absolutely positioned box resolves its containing block to the nearest *positioned* ancestor \u2014 which, since the controls emitting these spans are `position: static`, is whatever positioned box happens to be above them in the consumer's layout, often several scroll containers up. The span then skips every intervening `overflow: auto` and lands in that distant ancestor's scrollable overflow, turning 1x1 of invisible text into real scrollable distance in a box that never opted into scrolling. A fixed box's containing block is the viewport, so it joins no ancestor's scrollable overflow at all. Caveat: inside a `transform`ed (or `filter`ed/`contain`ed) ancestor a fixed box re-anchors to that ancestor. Harmless here \u2014 the element is 1x1 and clipped to nothing, so where it lands never matters, only what it overflows.",
21263
21704
  members: [],
21264
- version: "11.6.0"
21705
+ version: "11.8.0"
21265
21706
  },
21266
21707
  {
21267
21708
  id: "motion-safe",
@@ -21273,7 +21714,7 @@ placeholder="Name or address\u2026"
21273
21714
  summary: "Wraps animation/transition styles so they only apply when the user has not requested reduced motion (WCAG 2.3.3).",
21274
21715
  description: "Wraps animation/transition styles so they only apply when the user has not requested reduced motion (WCAG 2.3.3).",
21275
21716
  members: [],
21276
- version: "11.6.0"
21717
+ version: "11.8.0"
21277
21718
  },
21278
21719
  {
21279
21720
  id: "announcer",
@@ -21298,7 +21739,7 @@ placeholder="Name or address\u2026"
21298
21739
  description: "Announce `text`, even when it repeats what was just announced."
21299
21740
  }
21300
21741
  ],
21301
- version: "11.6.0"
21742
+ version: "11.8.0"
21302
21743
  },
21303
21744
  {
21304
21745
  id: "create-announcer",
@@ -21310,7 +21751,7 @@ placeholder="Name or address\u2026"
21310
21751
  summary: "A polite live region's text, for the running commentary a form control owes a screen reader: commits, clears, refused entries, result counts \u2014 changes a sighted user sees but that are otherwise silent.",
21311
21752
  description: "A polite live region's text, for the running commentary a form control owes a screen reader: commits, clears, refused entries, result counts \u2014 changes a sighted user sees but that are otherwise silent. Extracted because five controls (`uni-combobox`, `uni-tag-input`, `uni-time-input`, `uni-date-input`, `uni-calendar`) carried byte-identical copies, including the repeat trick below \u2014 the kind of subtlety that is quietly dropped when the sixth control hand-rolls its own. Announcing the same text twice must still be heard: assistive tech reads a live region when its content *changes*, so setting an identical string is a no-op and the second \"No match.\" would be silent. A trailing space breaks the equality without changing a word of what is read. Successive repeats alternate between the padded and unpadded form, so nothing accumulates. Deliberately holds no DOM and no styling: the region belongs to the component's own template, where its placement and visually-hidden class are already the component's business.",
21312
21753
  members: [],
21313
- version: "11.6.0"
21754
+ version: "11.8.0"
21314
21755
  },
21315
21756
  {
21316
21757
  id: "uni-date",
@@ -21322,7 +21763,7 @@ placeholder="Name or address\u2026"
21322
21763
  summary: "A calendar date, `'YYYY-MM-DD'`.",
21323
21764
  description: "A calendar date, `'YYYY-MM-DD'`.",
21324
21765
  members: [],
21325
- version: "11.6.0"
21766
+ version: "11.8.0"
21326
21767
  },
21327
21768
  {
21328
21769
  id: "uni-time",
@@ -21334,7 +21775,7 @@ placeholder="Name or address\u2026"
21334
21775
  summary: "A wall-clock time, `'HH:mm'` (24-hour).",
21335
21776
  description: "A wall-clock time, `'HH:mm'` (24-hour). Display format is separate.",
21336
21777
  members: [],
21337
- version: "11.6.0"
21778
+ version: "11.8.0"
21338
21779
  },
21339
21780
  {
21340
21781
  id: "uni-date-time",
@@ -21346,7 +21787,7 @@ placeholder="Name or address\u2026"
21346
21787
  summary: "A combined date and time, `'YYYY-MM-DDTHH:mm'`.",
21347
21788
  description: "A combined date and time, `'YYYY-MM-DDTHH:mm'`.",
21348
21789
  members: [],
21349
- version: "11.6.0"
21790
+ version: "11.8.0"
21350
21791
  },
21351
21792
  {
21352
21793
  id: "uni-date-range",
@@ -21371,7 +21812,7 @@ placeholder="Name or address\u2026"
21371
21812
  description: ""
21372
21813
  }
21373
21814
  ],
21374
- version: "11.6.0"
21815
+ version: "11.8.0"
21375
21816
  },
21376
21817
  {
21377
21818
  id: "iso-date",
@@ -21383,7 +21824,7 @@ placeholder="Name or address\u2026"
21383
21824
  summary: "`(2026, 8, 5)` \u2192 `'2026-08-05'`.",
21384
21825
  description: "`(2026, 8, 5)` \u2192 `'2026-08-05'`. Does not validate \u2014 see `isValidDate`.",
21385
21826
  members: [],
21386
- version: "11.6.0"
21827
+ version: "11.8.0"
21387
21828
  },
21388
21829
  {
21389
21830
  id: "is-valid-date",
@@ -21395,7 +21836,7 @@ placeholder="Name or address\u2026"
21395
21836
  summary: "The ISO date when the parts form a real calendar day, else `null`.",
21396
21837
  description: "The ISO date when the parts form a real calendar day, else `null`.",
21397
21838
  members: [],
21398
- version: "11.6.0"
21839
+ version: "11.8.0"
21399
21840
  },
21400
21841
  {
21401
21842
  id: "days-in-month",
@@ -21407,7 +21848,7 @@ placeholder="Name or address\u2026"
21407
21848
  summary: "Days in a month, leap-year aware.",
21408
21849
  description: "Days in a month, leap-year aware.",
21409
21850
  members: [],
21410
- version: "11.6.0"
21851
+ version: "11.8.0"
21411
21852
  },
21412
21853
  {
21413
21854
  id: "add-days",
@@ -21419,7 +21860,7 @@ placeholder="Name or address\u2026"
21419
21860
  summary: "",
21420
21861
  description: "",
21421
21862
  members: [],
21422
- version: "11.6.0"
21863
+ version: "11.8.0"
21423
21864
  },
21424
21865
  {
21425
21866
  id: "add-months",
@@ -21431,7 +21872,7 @@ placeholder="Name or address\u2026"
21431
21872
  summary: "Same day \xB1 n months, clamping the day to the target month's length.",
21432
21873
  description: "Same day \xB1 n months, clamping the day to the target month's length.",
21433
21874
  members: [],
21434
- version: "11.6.0"
21875
+ version: "11.8.0"
21435
21876
  },
21436
21877
  {
21437
21878
  id: "day-of-week",
@@ -21443,7 +21884,7 @@ placeholder="Name or address\u2026"
21443
21884
  summary: "Day of week, 0 = Sunday \u2026 6 = Saturday.",
21444
21885
  description: "Day of week, 0 = Sunday \u2026 6 = Saturday.",
21445
21886
  members: [],
21446
- version: "11.6.0"
21887
+ version: "11.8.0"
21447
21888
  },
21448
21889
  {
21449
21890
  id: "month-of",
@@ -21455,7 +21896,7 @@ placeholder="Name or address\u2026"
21455
21896
  summary: "`'2026-08-20'` \u2192 `'2026-08'`.",
21456
21897
  description: "`'2026-08-20'` \u2192 `'2026-08'`.",
21457
21898
  members: [],
21458
- version: "11.6.0"
21899
+ version: "11.8.0"
21459
21900
  },
21460
21901
  {
21461
21902
  id: "today-iso",
@@ -21467,7 +21908,7 @@ placeholder="Name or address\u2026"
21467
21908
  summary: "Today as a local-wall-clock ISO date (the one place local time matters).",
21468
21909
  description: "Today as a local-wall-clock ISO date (the one place local time matters).",
21469
21910
  members: [],
21470
- version: "11.6.0"
21911
+ version: "11.8.0"
21471
21912
  },
21472
21913
  {
21473
21914
  id: "inclusive-day-count",
@@ -21479,7 +21920,7 @@ placeholder="Name or address\u2026"
21479
21920
  summary: "Inclusive day count of a range: `('-20', '-24')` \u2192 5.",
21480
21921
  description: "Inclusive day count of a range: `('-20', '-24')` \u2192 5.",
21481
21922
  members: [],
21482
- version: "11.6.0"
21923
+ version: "11.8.0"
21483
21924
  },
21484
21925
  {
21485
21926
  id: "uni-month-grid-cell",
@@ -21504,7 +21945,7 @@ placeholder="Name or address\u2026"
21504
21945
  description: "True for leading/trailing cells that belong to the adjacent months."
21505
21946
  }
21506
21947
  ],
21507
- version: "11.6.0"
21948
+ version: "11.8.0"
21508
21949
  },
21509
21950
  {
21510
21951
  id: "build-month-grid",
@@ -21516,7 +21957,7 @@ placeholder="Name or address\u2026"
21516
21957
  summary: "The week matrix a calendar renders: full weeks covering `'YYYY-MM'`, starting on `weekStart` (0 = Sunday).",
21517
21958
  description: "The week matrix a calendar renders: full weeks covering `'YYYY-MM'`, starting on `weekStart` (0 = Sunday). Outside cells are always present so showing or hiding them is a pure render decision.",
21518
21959
  members: [],
21519
- version: "11.6.0"
21960
+ version: "11.8.0"
21520
21961
  },
21521
21962
  {
21522
21963
  id: "format-date",
@@ -21528,7 +21969,7 @@ placeholder="Name or address\u2026"
21528
21969
  summary: "",
21529
21970
  description: "",
21530
21971
  members: [],
21531
- version: "11.6.0"
21972
+ version: "11.8.0"
21532
21973
  },
21533
21974
  {
21534
21975
  id: "format-month-heading",
@@ -21540,7 +21981,7 @@ placeholder="Name or address\u2026"
21540
21981
  summary: "`'2026-08'` \u2192 `'August 2026'` in the locale.",
21541
21982
  description: "`'2026-08'` \u2192 `'August 2026'` in the locale.",
21542
21983
  members: [],
21543
- version: "11.6.0"
21984
+ version: "11.8.0"
21544
21985
  },
21545
21986
  {
21546
21987
  id: "uni-weekday-name",
@@ -21565,7 +22006,7 @@ placeholder="Name or address\u2026"
21565
22006
  description: "Full weekday name, for the columnheader's `abbr`."
21566
22007
  }
21567
22008
  ],
21568
- version: "11.6.0"
22009
+ version: "11.8.0"
21569
22010
  },
21570
22011
  {
21571
22012
  id: "weekday-names",
@@ -21577,7 +22018,7 @@ placeholder="Name or address\u2026"
21577
22018
  summary: "Weekday header labels starting at `weekStart` (0 = Sunday).",
21578
22019
  description: "Weekday header labels starting at `weekStart` (0 = Sunday).",
21579
22020
  members: [],
21580
- version: "11.6.0"
22021
+ version: "11.8.0"
21581
22022
  },
21582
22023
  {
21583
22024
  id: "format-time",
@@ -21589,7 +22030,7 @@ placeholder="Name or address\u2026"
21589
22030
  summary: "`'15:00'` \u2192 `'3:00 PM'` (or `'15:00'` when `hour12` is false).",
21590
22031
  description: "`'15:00'` \u2192 `'3:00 PM'` (or `'15:00'` when `hour12` is false).",
21591
22032
  members: [],
21592
- version: "11.6.0"
22033
+ version: "11.8.0"
21593
22034
  },
21594
22035
  {
21595
22036
  id: "locale-week-start",
@@ -21601,7 +22042,7 @@ placeholder="Name or address\u2026"
21601
22042
  summary: "The locale's first day of week, 0 = Sunday \u2026 6 = Saturday.",
21602
22043
  description: "The locale's first day of week, 0 = Sunday \u2026 6 = Saturday. Falls back to Sunday where `Intl.Locale` week info is unavailable.",
21603
22044
  members: [],
21604
- version: "11.6.0"
22045
+ version: "11.8.0"
21605
22046
  },
21606
22047
  {
21607
22048
  id: "locale-default-hour12",
@@ -21613,7 +22054,7 @@ placeholder="Name or address\u2026"
21613
22054
  summary: "Whether the locale's default clock is 12-hour.",
21614
22055
  description: "Whether the locale's default clock is 12-hour.",
21615
22056
  members: [],
21616
- version: "11.6.0"
22057
+ version: "11.8.0"
21617
22058
  },
21618
22059
  {
21619
22060
  id: "locale-field-order",
@@ -21625,7 +22066,7 @@ placeholder="Name or address\u2026"
21625
22066
  summary: "The locale's numeric-date field order, e.g.",
21626
22067
  description: "The locale's numeric-date field order, e.g. en-US \u2192 month, day, year.",
21627
22068
  members: [],
21628
- version: "11.6.0"
22069
+ version: "11.8.0"
21629
22070
  },
21630
22071
  {
21631
22072
  id: "locale-month-names",
@@ -21637,7 +22078,7 @@ placeholder="Name or address\u2026"
21637
22078
  summary: "Long + short month names \u2192 month number, lowercased, dots stripped.",
21638
22079
  description: "Long + short month names \u2192 month number, lowercased, dots stripped.",
21639
22080
  members: [],
21640
- version: "11.6.0"
22081
+ version: "11.8.0"
21641
22082
  },
21642
22083
  {
21643
22084
  id: "locale-date-placeholder",
@@ -21649,7 +22090,7 @@ placeholder="Name or address\u2026"
21649
22090
  summary: "The locale's digit pattern as a placeholder, e.g.",
21650
22091
  description: "The locale's digit pattern as a placeholder, e.g. `'MM/DD/YYYY'`.",
21651
22092
  members: [],
21652
- version: "11.6.0"
22093
+ version: "11.8.0"
21653
22094
  },
21654
22095
  {
21655
22096
  id: "parse-date-text",
@@ -21661,7 +22102,7 @@ placeholder="Name or address\u2026"
21661
22102
  summary: "Free-typed date text \u2192 ISO date, or `null` when unreadable.",
21662
22103
  description: "Free-typed date text \u2192 ISO date, or `null` when unreadable. Accepts, in order: ISO (`2026-08-20`), a month name from the locale's own long/short lists (`aug 20`, `20 aug 2026`, `August 20th`), and locale-numeric text (`8/20/2026`, `20.8.2026`, `08-20`) with the digit order taken from `Intl.DateTimeFormat(locale).formatToParts()`. A missing year resolves to the next occurrence; two-digit years are refused rather than guessed.",
21663
22104
  members: [],
21664
- version: "11.6.0"
22105
+ version: "11.8.0"
21665
22106
  },
21666
22107
  {
21667
22108
  id: "parse-time-text",
@@ -21673,7 +22114,7 @@ placeholder="Name or address\u2026"
21673
22114
  summary: "Free-typed time text \u2192 `'HH:mm'`, or `null`.",
21674
22115
  description: "Free-typed time text \u2192 `'HH:mm'`, or `null`. Accepts `9`, `930`, `9:30`, `9.30`, `9 30`, `3p`, `3pm`, `3 PM`, `15:00`. Bare hours 1\u20137 with no meridiem lean PM when `hour12` \u2014 typing `3` into an appointment field means 15:00, not 03:00.",
21675
22116
  members: [],
21676
- version: "11.6.0"
22117
+ version: "11.8.0"
21677
22118
  },
21678
22119
  {
21679
22120
  id: "time-slots",
@@ -21685,7 +22126,7 @@ placeholder="Name or address\u2026"
21685
22126
  summary: "Every `minuteStep` time between `min` and `max` (inclusive bounds).",
21686
22127
  description: "Every `minuteStep` time between `min` and `max` (inclusive bounds).",
21687
22128
  members: [],
21688
- version: "11.6.0"
22129
+ version: "11.8.0"
21689
22130
  },
21690
22131
  {
21691
22132
  id: "split-date-time",
@@ -21697,7 +22138,7 @@ placeholder="Name or address\u2026"
21697
22138
  summary: "",
21698
22139
  description: "",
21699
22140
  members: [],
21700
- version: "11.6.0"
22141
+ version: "11.8.0"
21701
22142
  },
21702
22143
  {
21703
22144
  id: "join-date-time",
@@ -21709,7 +22150,7 @@ placeholder="Name or address\u2026"
21709
22150
  summary: "One combined value only when both parts are present.",
21710
22151
  description: "One combined value only when both parts are present.",
21711
22152
  members: [],
21712
- version: "11.6.0"
22153
+ version: "11.8.0"
21713
22154
  },
21714
22155
  {
21715
22156
  id: "uni-number-range",
@@ -21734,7 +22175,7 @@ placeholder="Name or address\u2026"
21734
22175
  description: ""
21735
22176
  }
21736
22177
  ],
21737
- version: "11.6.0"
22178
+ version: "11.8.0"
21738
22179
  },
21739
22180
  {
21740
22181
  id: "uni-rounding-mode",
@@ -21746,7 +22187,7 @@ placeholder="Name or address\u2026"
21746
22187
  summary: "How a tie is resolved when rounding to a fraction-digit count.",
21747
22188
  description: "How a tie is resolved when rounding to a fraction-digit count. `half-up` is the invoice default (ties away from zero: `1.15` \u2192 `1.2`); `half-even` is banker's rounding, which removes the upward bias across a column of figures (`1.25` \u2192 `1.2`, `1.35` \u2192 `1.4`).",
21748
22189
  members: [],
21749
- version: "11.6.0"
22190
+ version: "11.8.0"
21750
22191
  },
21751
22192
  {
21752
22193
  id: "uni-number-preset",
@@ -21758,7 +22199,7 @@ placeholder="Name or address\u2026"
21758
22199
  summary: "Format archetype.",
21759
22200
  description: "Format archetype. Supplies decimals, grouping, affix and `inputmode`.",
21760
22201
  members: [],
21761
- version: "11.6.0"
22202
+ version: "11.8.0"
21762
22203
  },
21763
22204
  {
21764
22205
  id: "uni-number-grouping",
@@ -21770,7 +22211,7 @@ placeholder="Name or address\u2026"
21770
22211
  summary: "Thousands-separator policy, mapped onto `Intl`'s `useGrouping`.",
21771
22212
  description: "Thousands-separator policy, mapped onto `Intl`'s `useGrouping`. `min2` \u2014 the default \u2014 groups only from five integer digits, so a year renders `2026` rather than `2,026` while a price still renders `10,000`.",
21772
22213
  members: [],
21773
- version: "11.6.0"
22214
+ version: "11.8.0"
21774
22215
  },
21775
22216
  {
21776
22217
  id: "uni-number-reject-reason",
@@ -21782,7 +22223,7 @@ placeholder="Name or address\u2026"
21782
22223
  summary: "Why a typed commit was refused.",
21783
22224
  description: "Why a typed commit was refused. The raw text stays in the field.",
21784
22225
  members: [],
21785
- version: "11.6.0"
22226
+ version: "11.8.0"
21786
22227
  },
21787
22228
  {
21788
22229
  id: "uni-number-step-config",
@@ -21825,7 +22266,7 @@ placeholder="Name or address\u2026"
21825
22266
  description: "Cycle past a fence instead of stopping at it \u2014 for genuinely cyclic fields only (23 \u2192 0 hours, 359 \u2192 0 degrees). Needs both `min` and `max`."
21826
22267
  }
21827
22268
  ],
21828
- version: "11.6.0"
22269
+ version: "11.8.0"
21829
22270
  },
21830
22271
  {
21831
22272
  id: "uni-number-clamp",
@@ -21850,7 +22291,7 @@ placeholder="Name or address\u2026"
21850
22291
  description: "Which fence was hit, or `null` when the value was already in range."
21851
22292
  }
21852
22293
  ],
21853
- version: "11.6.0"
22294
+ version: "11.8.0"
21854
22295
  },
21855
22296
  {
21856
22297
  id: "uni-locale-number-parts",
@@ -21893,7 +22334,7 @@ placeholder="Name or address\u2026"
21893
22334
  description: "Fraction digits `Intl` uses for the currency \u2014 JPY 0, USD 2."
21894
22335
  }
21895
22336
  ],
21896
- version: "11.6.0"
22337
+ version: "11.8.0"
21897
22338
  },
21898
22339
  {
21899
22340
  id: "uni-number-format-config",
@@ -21978,7 +22419,7 @@ placeholder="Name or address\u2026"
21978
22419
  description: "Spoken long form of an abbreviated suffix, for `aria-valuetext`."
21979
22420
  }
21980
22421
  ],
21981
- version: "11.6.0"
22422
+ version: "11.8.0"
21982
22423
  },
21983
22424
  {
21984
22425
  id: "uni-resolved-number-format",
@@ -22069,7 +22510,7 @@ placeholder="Name or address\u2026"
22069
22510
  description: ""
22070
22511
  }
22071
22512
  ],
22072
- version: "11.6.0"
22513
+ version: "11.8.0"
22073
22514
  },
22074
22515
  {
22075
22516
  id: "uni-number-parse-result",
@@ -22081,7 +22522,7 @@ placeholder="Name or address\u2026"
22081
22522
  summary: "The outcome of reading a user's text.",
22082
22523
  description: "The outcome of reading a user's text. Refused text is never swallowed: the caller keeps it in the field and flags it, so nobody loses their work to a silently emptied box.",
22083
22524
  members: [],
22084
- version: "11.6.0"
22525
+ version: "11.8.0"
22085
22526
  },
22086
22527
  {
22087
22528
  id: "is-canonical-decimal",
@@ -22093,7 +22534,7 @@ placeholder="Name or address\u2026"
22093
22534
  summary: "True when `text` is already a canonical decimal (leading/trailing space allowed).",
22094
22535
  description: "True when `text` is already a canonical decimal (leading/trailing space allowed).",
22095
22536
  members: [],
22096
- version: "11.6.0"
22537
+ version: "11.8.0"
22097
22538
  },
22098
22539
  {
22099
22540
  id: "decimal-scale",
@@ -22105,7 +22546,7 @@ placeholder="Name or address\u2026"
22105
22546
  summary: "Fraction-digit count.",
22106
22547
  description: "Fraction-digit count. `'1.250'` \u2192 3, `'12'` \u2192 0, `'5.'` \u2192 0.",
22107
22548
  members: [],
22108
- version: "11.6.0"
22549
+ version: "11.8.0"
22109
22550
  },
22110
22551
  {
22111
22552
  id: "to-scaled",
@@ -22117,7 +22558,7 @@ placeholder="Name or address\u2026"
22117
22558
  summary: "Canonical decimal \u2192 integer scaled by `10^scale`.",
22118
22559
  description: "Canonical decimal \u2192 integer scaled by `10^scale`. Fraction digits beyond `scale` are truncated, so callers that must not lose them pass a `scale` at least `decimalScale(value)`.",
22119
22560
  members: [],
22120
- version: "11.6.0"
22561
+ version: "11.8.0"
22121
22562
  },
22122
22563
  {
22123
22564
  id: "from-scaled",
@@ -22129,7 +22570,7 @@ placeholder="Name or address\u2026"
22129
22570
  summary: "Scaled integer \u2192 canonical decimal, with trailing fraction zeros trimmed.",
22130
22571
  description: "Scaled integer \u2192 canonical decimal, with trailing fraction zeros trimmed.",
22131
22572
  members: [],
22132
- version: "11.6.0"
22573
+ version: "11.8.0"
22133
22574
  },
22134
22575
  {
22135
22576
  id: "normalize-decimal",
@@ -22141,7 +22582,7 @@ placeholder="Name or address\u2026"
22141
22582
  summary: "Strip a leading `+`, leading zeros and trailing fraction zeros: `'+01.50'` \u2192 `'1.5'`.",
22142
22583
  description: "Strip a leading `+`, leading zeros and trailing fraction zeros: `'+01.50'` \u2192 `'1.5'`. Requires a canonical decimal; guard with `isCanonicalDecimal`.",
22143
22584
  members: [],
22144
- version: "11.6.0"
22585
+ version: "11.8.0"
22145
22586
  },
22146
22587
  {
22147
22588
  id: "to-decimal",
@@ -22153,7 +22594,7 @@ placeholder="Name or address\u2026"
22153
22594
  summary: "Any numeric input \u2192 canonical decimal, expanding the exponential notation `String(number)` produces outside 1e-7\u20261e21.",
22154
22595
  description: "Any numeric input \u2192 canonical decimal, expanding the exponential notation `String(number)` produces outside 1e-7\u20261e21. A `step` of `1e-7` would otherwise reach the arithmetic as the literal text `'1e-7'`. Throws on text that is not numeric at all \u2014 every caller here passes either a `number` input or text already cleared by the parser.",
22155
22596
  members: [],
22156
- version: "11.6.0"
22597
+ version: "11.8.0"
22157
22598
  },
22158
22599
  {
22159
22600
  id: "compare-decimal",
@@ -22165,7 +22606,7 @@ placeholder="Name or address\u2026"
22165
22606
  summary: "`-1` when `a < b`, `1` when `a > b`, `0` when equal.",
22166
22607
  description: "`-1` when `a < b`, `1` when `a > b`, `0` when equal. `'1.50'` equals `'1.5'`.",
22167
22608
  members: [],
22168
- version: "11.6.0"
22609
+ version: "11.8.0"
22169
22610
  },
22170
22611
  {
22171
22612
  id: "round-decimal",
@@ -22177,7 +22618,7 @@ placeholder="Name or address\u2026"
22177
22618
  summary: "Round to `fractionDigits`, breaking ties per `mode`.",
22178
22619
  description: "Round to `fractionDigits`, breaking ties per `mode`. Exact where `Number.prototype.toFixed` is not \u2014 see the file header.",
22179
22620
  members: [],
22180
- version: "11.6.0"
22621
+ version: "11.8.0"
22181
22622
  },
22182
22623
  {
22183
22624
  id: "shift-decimal",
@@ -22189,7 +22630,7 @@ placeholder="Name or address\u2026"
22189
22630
  summary: "Multiply by `10^places`, exactly.",
22190
22631
  description: "Multiply by `10^places`, exactly. Used for the percent preset's fraction \u21C4 display shift (`0.15` \u21C4 `15`) and for deriving a default large step of `step \xD7 10` without touching a float.",
22191
22632
  members: [],
22192
- version: "11.6.0"
22633
+ version: "11.8.0"
22193
22634
  },
22194
22635
  {
22195
22636
  id: "clamp-decimal",
@@ -22201,7 +22642,7 @@ placeholder="Name or address\u2026"
22201
22642
  summary: "Hold a value inside its fences, reporting which one it hit so the caller can announce it.",
22202
22643
  description: "Hold a value inside its fences, reporting which one it hit so the caller can announce it. Clamping belongs on commit, never per keystroke: a `min=10` field that clamps live can never be typed into, because the `1` becomes `10` before the `5` arrives.",
22203
22644
  members: [],
22204
- version: "11.6.0"
22645
+ version: "11.8.0"
22205
22646
  },
22206
22647
  {
22207
22648
  id: "step-decimal",
@@ -22213,7 +22654,7 @@ placeholder="Name or address\u2026"
22213
22654
  summary: "One step from `current`, in `direction` (`1` up, `-1` down).",
22214
22655
  description: "One step from `current`, in `direction` (`1` up, `-1` down). Steps land on the grid `origin + n \xB7 step`, where `origin` is `min` by default. A value that is *off* the grid snaps to the nearest grid point **in the direction of travel** rather than jumping past it: with `min=5, step=10` the grid is 5, 15, 25, and stepping up from 7 gives 15, not 17. Fences stop the value; they never wrap unless `wrap` is set and both bounds are defined. Returns `current` unchanged when `step` is zero.",
22215
22656
  members: [],
22216
- version: "11.6.0"
22657
+ version: "11.8.0"
22217
22658
  },
22218
22659
  {
22219
22660
  id: "locale-number-parts",
@@ -22225,7 +22666,7 @@ placeholder="Name or address\u2026"
22225
22666
  summary: "Locale separators plus, when a currency is given, its symbol, side and fraction digits.",
22226
22667
  description: "Locale separators plus, when a currency is given, its symbol, side and fraction digits. Memoized: constructing an `Intl.NumberFormat` is expensive and a field re-resolves this on every keystroke.",
22227
22668
  members: [],
22228
- version: "11.6.0"
22669
+ version: "11.8.0"
22229
22670
  },
22230
22671
  {
22231
22672
  id: "to-ascii-digits",
@@ -22237,7 +22678,7 @@ placeholder="Name or address\u2026"
22237
22678
  summary: "Map localized digits and Arabic separators to ASCII, so `\u0661\u0662\u0663\u0664\u066B\u0665` parses in `ar` and `\u0967\u0968\u0969\u096A.\u096B` in `hi`.",
22238
22679
  description: "Map localized digits and Arabic separators to ASCII, so `\u0661\u0662\u0663\u0664\u066B\u0665` parses in `ar` and `\u0967\u0968\u0969\u096A.\u096B` in `hi`.",
22239
22680
  members: [],
22240
- version: "11.6.0"
22681
+ version: "11.8.0"
22241
22682
  },
22242
22683
  {
22243
22684
  id: "evaluate-expression",
@@ -22249,7 +22690,7 @@ placeholder="Name or address\u2026"
22249
22690
  summary: "Evaluate `+ \u2212 \xD7 \xF7 ( )` over decimal literals \u2014 shunting-yard, roughly thirty lines, and **never `eval`**.",
22250
22691
  description: "Evaluate `+ \u2212 \xD7 \xF7 ( )` over decimal literals \u2014 shunting-yard, roughly thirty lines, and **never `eval`**. Returns a canonical decimal, or `null` when the text is not a well-formed expression. Floats are acceptable here in a way they are not elsewhere: this is a convenience path for spreadsheet muscle memory (`12*3`, `100/4+5`), and the result is settled to ten decimals before re-entering exact arithmetic. Division is the only operation that can produce a non-terminating decimal, and no exact representation would help there either.",
22251
22692
  members: [],
22252
- version: "11.6.0"
22693
+ version: "11.8.0"
22253
22694
  },
22254
22695
  {
22255
22696
  id: "resolve-number-format",
@@ -22261,7 +22702,7 @@ placeholder="Name or address\u2026"
22261
22702
  summary: "Fill in every preset, locale and currency default.",
22262
22703
  description: "Fill in every preset, locale and currency default.",
22263
22704
  members: [],
22264
- version: "11.6.0"
22705
+ version: "11.8.0"
22265
22706
  },
22266
22707
  {
22267
22708
  id: "parse-number",
@@ -22273,7 +22714,7 @@ placeholder="Name or address\u2026"
22273
22714
  summary: "Read a user's text into a canonical decimal in **model units**.",
22274
22715
  description: "Read a user's text into a canonical decimal in **model units**. Accepted, in order: canonical/ASCII (always, whatever the locale \u2014 it is what agents and APIs write), locale-grouped, affixed, localized digits, compact (`1.5k`), accounting negatives (`(1,234.56)` \u2192 `-1234.56`), and expressions when `allowExpressions` is set.",
22275
22716
  members: [],
22276
- version: "11.6.0"
22717
+ version: "11.8.0"
22277
22718
  },
22278
22719
  {
22279
22720
  id: "format-number",
@@ -22285,7 +22726,7 @@ placeholder="Name or address\u2026"
22285
22726
  summary: "Canonical decimal (model units) \u2192 the display number, without affixes.",
22286
22727
  description: "Canonical decimal (model units) \u2192 the display number, without affixes. `min2` grouping \u2014 the default \u2014 starts at five integer digits, so a year renders `2026` rather than `2,026` while a price still renders `10,000`.",
22287
22728
  members: [],
22288
- version: "11.6.0"
22729
+ version: "11.8.0"
22289
22730
  },
22290
22731
  {
22291
22732
  id: "raw-number-text",
@@ -22297,7 +22738,7 @@ placeholder="Name or address\u2026"
22297
22738
  summary: "The plain text the field shows while focused: the display number with no grouping and no affixes, so the caret never has to walk over a separator that appears and vanishes mid-word.",
22298
22739
  description: "The plain text the field shows while focused: the display number with no grouping and no affixes, so the caret never has to walk over a separator that appears and vanishes mid-word.",
22299
22740
  members: [],
22300
- version: "11.6.0"
22741
+ version: "11.8.0"
22301
22742
  },
22302
22743
  {
22303
22744
  id: "settle-number",
@@ -22309,7 +22750,7 @@ placeholder="Name or address\u2026"
22309
22750
  summary: "Round a committed value to the field's precision, in model units.",
22310
22751
  description: "Round a committed value to the field's precision, in model units.",
22311
22752
  members: [],
22312
- version: "11.6.0"
22753
+ version: "11.8.0"
22313
22754
  },
22314
22755
  {
22315
22756
  id: "speak-number",
@@ -22321,7 +22762,7 @@ placeholder="Name or address\u2026"
22321
22762
  summary: "The `aria-valuetext` string: the formatted number with its affixes spoken.",
22322
22763
  description: 'The `aria-valuetext` string: the formatted number with its affixes spoken. `aria-valuenow` alone announces "1234.56", which is the one thing about a money field that is not the point. An empty field says "Empty" per APG.',
22323
22764
  members: [],
22324
- version: "11.6.0"
22765
+ version: "11.8.0"
22325
22766
  },
22326
22767
  {
22327
22768
  id: "to-number",
@@ -22333,7 +22774,7 @@ placeholder="Name or address\u2026"
22333
22774
  summary: "Model-units canonical decimal \u2192 the bound `number`.",
22334
22775
  description: "Model-units canonical decimal \u2192 the bound `number`.",
22335
22776
  members: [],
22336
- version: "11.6.0"
22777
+ version: "11.8.0"
22337
22778
  },
22338
22779
  {
22339
22780
  id: "loses-precision",
@@ -22345,7 +22786,7 @@ placeholder="Name or address\u2026"
22345
22786
  summary: "True when a value cannot survive the trip through `number` \u2014 the reason the components also expose an exact `valueAsString` model, and the trigger for the dev-mode warning.",
22346
22787
  description: "True when a value cannot survive the trip through `number` \u2014 the reason the components also expose an exact `valueAsString` model, and the trigger for the dev-mode warning. Silent precision loss is the whole point of that second model, so it is worth saying out loud once. A `number` can only be checked for magnitude, since it has already lost whatever it was going to lose. A canonical string can be checked properly: `'9007199254740993'` comes back as `'9007199254740992'`.",
22347
22788
  members: [],
22348
- version: "11.6.0"
22789
+ version: "11.8.0"
22349
22790
  },
22350
22791
  {
22351
22792
  id: "press-repeat-timing",
@@ -22382,7 +22823,7 @@ placeholder="Name or address\u2026"
22382
22823
  description: ""
22383
22824
  }
22384
22825
  ],
22385
- version: "11.6.0"
22826
+ version: "11.8.0"
22386
22827
  },
22387
22828
  {
22388
22829
  id: "press-repeat-config",
@@ -22431,7 +22872,7 @@ placeholder="Name or address\u2026"
22431
22872
  description: ""
22432
22873
  }
22433
22874
  ],
22434
- version: "11.6.0"
22875
+ version: "11.8.0"
22435
22876
  },
22436
22877
  {
22437
22878
  id: "press-repeat",
@@ -22468,7 +22909,7 @@ placeholder="Name or address\u2026"
22468
22909
  description: "End a hold without firing `onRelease` \u2014 for `Escape` and `pointercancel`."
22469
22910
  }
22470
22911
  ],
22471
- version: "11.6.0"
22912
+ version: "11.8.0"
22472
22913
  },
22473
22914
  {
22474
22915
  id: "create-press-repeat",
@@ -22480,7 +22921,7 @@ placeholder="Name or address\u2026"
22480
22921
  summary: "",
22481
22922
  description: "",
22482
22923
  members: [],
22483
- version: "11.6.0"
22924
+ version: "11.8.0"
22484
22925
  },
22485
22926
  {
22486
22927
  id: "listbox-navigation-config",
@@ -22523,7 +22964,7 @@ placeholder="Name or address\u2026"
22523
22964
  description: "Let Home/End jump to the ends of the list. Default false. In an editable combobox those keys belong to the caret \u2014 APG reserves them for text editing, and a control that steals them makes the text un-navigable while its list is open. Opt in only where focus is *not* in a text field (uni-multi-select-dropdown, whose focus rides the option checkboxes). Nothing is lost by leaving it off: opening with ArrowUp already lands on the last option, ArrowDown on the first, and navigation wraps at both ends."
22524
22965
  }
22525
22966
  ],
22526
- version: "11.6.0"
22967
+ version: "11.8.0"
22527
22968
  },
22528
22969
  {
22529
22970
  id: "listbox-navigation",
@@ -22596,7 +23037,7 @@ placeholder="Name or address\u2026"
22596
23037
  description: "Close when focus leaves the control entirely (not on internal moves)."
22597
23038
  }
22598
23039
  ],
22599
- version: "11.6.0"
23040
+ version: "11.8.0"
22600
23041
  },
22601
23042
  {
22602
23043
  id: "create-listbox-navigation",
@@ -22608,7 +23049,7 @@ placeholder="Name or address\u2026"
22608
23049
  summary: "Factory mirroring the signal-API style used elsewhere in the CDK.",
22609
23050
  description: "Factory mirroring the signal-API style used elsewhere in the CDK.",
22610
23051
  members: [],
22611
- version: "11.6.0"
23052
+ version: "11.8.0"
22612
23053
  },
22613
23054
  {
22614
23055
  id: "placement",
@@ -22620,7 +23061,7 @@ placeholder="Name or address\u2026"
22620
23061
  summary: "Native CSS Anchor Positioning helpers (Baseline 2026).",
22621
23062
  description: "Native CSS Anchor Positioning helpers (Baseline 2026). These replace the former",
22622
23063
  members: [],
22623
- version: "11.6.0"
23064
+ version: "11.8.0"
22624
23065
  },
22625
23066
  {
22626
23067
  id: "anchor-offset",
@@ -22645,7 +23086,7 @@ placeholder="Name or address\u2026"
22645
23086
  description: "Shift along the cross axis, from the aligned edge."
22646
23087
  }
22647
23088
  ],
22648
- version: "11.6.0"
23089
+ version: "11.8.0"
22649
23090
  },
22650
23091
  {
22651
23092
  id: "new-anchor-name",
@@ -22657,7 +23098,7 @@ placeholder="Name or address\u2026"
22657
23098
  summary: "Returns a document-unique dashed-ident usable as a CSS `anchor-name`.",
22658
23099
  description: "Returns a document-unique dashed-ident usable as a CSS `anchor-name`.",
22659
23100
  members: [],
22660
- version: "11.6.0"
23101
+ version: "11.8.0"
22661
23102
  },
22662
23103
  {
22663
23104
  id: "anchor-styles",
@@ -22669,7 +23110,7 @@ placeholder="Name or address\u2026"
22669
23110
  summary: "Emotion style object anchoring a panel to `anchor` at `placement`.",
22670
23111
  description: "Emotion style object anchoring a panel to `anchor` at `placement`. Spread into the panel's `css()` styles. The trigger element must carry `anchor-name: <anchor>` (see `newAnchorName`).",
22671
23112
  members: [],
22672
- version: "11.6.0"
23113
+ version: "11.8.0"
22673
23114
  },
22674
23115
  {
22675
23116
  id: "anchor-arrow-styles",
@@ -22681,7 +23122,7 @@ placeholder="Name or address\u2026"
22681
23122
  summary: "Absolute positioning for a rotated-square arrow sitting on the panel edge that faces the anchor.",
22682
23123
  description: "Absolute positioning for a rotated-square arrow sitting on the panel edge that faces the anchor. Static per placement: if the browser flips the panel via position-try, the arrow stays on the configured side (cosmetic-only degradation, matching the flip-support caveat above). `overlap` (default 0 \u2014 cut exactly on the panel edge) extends the kept half into the panel; see for when that is ever wanted.",
22683
23124
  members: [],
22684
- version: "11.6.0"
23125
+ version: "11.8.0"
22685
23126
  },
22686
23127
  {
22687
23128
  id: "spotlight-options",
@@ -22712,7 +23153,7 @@ placeholder="Name or address\u2026"
22712
23153
  description: "Scrim paint; scheme-invariant by convention, like `::backdrop`."
22713
23154
  }
22714
23155
  ],
22715
- version: "11.6.0"
23156
+ version: "11.8.0"
22716
23157
  },
22717
23158
  {
22718
23159
  id: "spotlight-styles",
@@ -22743,7 +23184,7 @@ placeholder="Name or address\u2026"
22743
23184
  description: "Hole-sized click-blocker, shown when the target must not be interactive."
22744
23185
  }
22745
23186
  ],
22746
- version: "11.6.0"
23187
+ version: "11.8.0"
22747
23188
  },
22748
23189
  {
22749
23190
  id: "anchor-rect",
@@ -22792,7 +23233,7 @@ placeholder="Name or address\u2026"
22792
23233
  description: ""
22793
23234
  }
22794
23235
  ],
22795
- version: "11.6.0"
23236
+ version: "11.8.0"
22796
23237
  },
22797
23238
  {
22798
23239
  id: "transform-origin-for",
@@ -22804,7 +23245,7 @@ placeholder="Name or address\u2026"
22804
23245
  summary: "Transform origin for a panel's open/close scale animation, derived from where the panel **actually** rendered relative to its anchor \u2014 not from the requested placement.",
22805
23246
  description: "Transform origin for a panel's open/close scale animation, derived from where the panel **actually** rendered relative to its anchor \u2014 not from the requested placement. `position-try-fallbacks` lets the browser flip a panel at viewport edges, and a statically mapped origin then animates from the wrong corner (a `bottom-end` picker flipped above its field would still scale from `top right`). Measure after the popover is shown and apply the result as an inline style. Returns keyword pairs like `'top right'` / `'bottom center'`, or `null` when the panel has no box yet (e.g. `display: none`, or jsdom).",
22806
23247
  members: [],
22807
- version: "11.6.0"
23248
+ version: "11.8.0"
22808
23249
  },
22809
23250
  {
22810
23251
  id: "transform-origins",
@@ -22816,7 +23257,7 @@ placeholder="Name or address\u2026"
22816
23257
  summary: "Placement \u2192 `transform-origin`, so scale animations grow from the anchor.",
22817
23258
  description: "Placement \u2192 `transform-origin`, so scale animations grow from the anchor.",
22818
23259
  members: [],
22819
- version: "11.6.0"
23260
+ version: "11.8.0"
22820
23261
  },
22821
23262
  {
22822
23263
  id: "set-anchor-name",
@@ -22828,7 +23269,7 @@ placeholder="Name or address\u2026"
22828
23269
  summary: "Write a CSS `anchor-name` onto an element (detached anchors and targets).",
22829
23270
  description: "Write a CSS `anchor-name` onto an element (detached anchors and targets).",
22830
23271
  members: [],
22831
- version: "11.6.0"
23272
+ version: "11.8.0"
22832
23273
  },
22833
23274
  {
22834
23275
  id: "clear-anchor-name",
@@ -22840,7 +23281,7 @@ placeholder="Name or address\u2026"
22840
23281
  summary: "",
22841
23282
  description: "",
22842
23283
  members: [],
22843
- version: "11.6.0"
23284
+ version: "11.8.0"
22844
23285
  },
22845
23286
  {
22846
23287
  id: "resolve-element",
@@ -22852,7 +23293,7 @@ placeholder="Name or address\u2026"
22852
23293
  summary: "Resolve an element-or-id reference.",
22853
23294
  description: "Resolve an element-or-id reference. Id strings are looked up at call time \u2014 never cache the result across opens, the element may have been re-rendered. `''` and null-ish mean \"unset\" (falsy guard: an empty string is the only typeable empty for a string-typed input).",
22854
23295
  members: [],
22855
- version: "11.6.0"
23296
+ version: "11.8.0"
22856
23297
  },
22857
23298
  {
22858
23299
  id: "is-toggle-open",
@@ -22864,7 +23305,7 @@ placeholder="Name or address\u2026"
22864
23305
  summary: "True when a native `toggle` event reports the overlay opening.",
22865
23306
  description: "True when a native `toggle` event reports the overlay opening.",
22866
23307
  members: [],
22867
- version: "11.6.0"
23308
+ version: "11.8.0"
22868
23309
  },
22869
23310
  {
22870
23311
  id: "discrete-overlay-transition",
@@ -22876,7 +23317,7 @@ placeholder="Name or address\u2026"
22876
23317
  summary: "The discrete-transition block that animates an element into and out of the top layer: `transition-behavior: allow-discrete` over the `hidden` keys plus `display`/`overlay`, the shown state under `:popover-open`, and `@starting-style` so entry transitions run from the hidden state.",
22877
23318
  description: "The discrete-transition block that animates an element into and out of the top layer: `transition-behavior: allow-discrete` over the `hidden` keys plus `display`/`overlay`, the shown state under `:popover-open`, and `@starting-style` so entry transitions run from the hidden state. `display` and `overlay` must ride along or the element cannot animate into and out of the top layer at all \u2014 it would simply appear and vanish. `timingFunction` is omitted from the output when not given, leaving the CSS initial value (`ease`), so callers that never asked for one are unaffected.",
22878
23319
  members: [],
22879
- version: "11.6.0"
23320
+ version: "11.8.0"
22880
23321
  },
22881
23322
  {
22882
23323
  id: "restore-overlay-focus",
@@ -22888,7 +23329,7 @@ placeholder="Name or address\u2026"
22888
23329
  summary: "Returns focus to `target` when an overlay closes while focus was inside its panel (or was dropped on `<body>` by the top layer closing), so keyboard users are never stranded (WCAG 2.4.3).",
22889
23330
  description: "Returns focus to `target` when an overlay closes while focus was inside its panel (or was dropped on `<body>` by the top layer closing), so keyboard users are never stranded (WCAG 2.4.3). Focus resting anywhere else is left alone.",
22890
23331
  members: [],
22891
- version: "11.6.0"
23332
+ version: "11.8.0"
22892
23333
  },
22893
23334
  {
22894
23335
  id: "focusable-elements",
@@ -22900,7 +23341,7 @@ placeholder="Name or address\u2026"
22900
23341
  summary: "The focusable elements inside `root`, in DOM order.",
22901
23342
  description: "The focusable elements inside `root`, in DOM order. Filters disabled controls, and hidden ones where the environment can tell: jsdom reports `offsetParent` as null for every element, so the visibility filter applies only when the document actually lays out (some element has an offsetParent).",
22902
23343
  members: [],
22903
- version: "11.6.0"
23344
+ version: "11.8.0"
22904
23345
  },
22905
23346
  {
22906
23347
  id: "backdrop-dismiss",
@@ -22925,7 +23366,7 @@ placeholder="Name or address\u2026"
22925
23366
  description: "True only when both the press and the click landed on the dialog itself."
22926
23367
  }
22927
23368
  ],
22928
- version: "11.6.0"
23369
+ version: "11.8.0"
22929
23370
  },
22930
23371
  {
22931
23372
  id: "sort-direction",
@@ -22937,7 +23378,7 @@ placeholder="Name or address\u2026"
22937
23378
  summary: "",
22938
23379
  description: "",
22939
23380
  members: [],
22940
- version: "11.6.0"
23381
+ version: "11.8.0"
22941
23382
  },
22942
23383
  {
22943
23384
  id: "sort",
@@ -22962,7 +23403,7 @@ placeholder="Name or address\u2026"
22962
23403
  description: ""
22963
23404
  }
22964
23405
  ],
22965
- version: "11.6.0"
23406
+ version: "11.8.0"
22966
23407
  },
22967
23408
  {
22968
23409
  id: "uni-base-datasource",
@@ -23131,7 +23572,7 @@ placeholder="Name or address\u2026"
23131
23572
  description: ""
23132
23573
  }
23133
23574
  ],
23134
- version: "11.6.0"
23575
+ version: "11.8.0"
23135
23576
  },
23136
23577
  {
23137
23578
  id: "page-request",
@@ -23174,7 +23615,7 @@ placeholder="Name or address\u2026"
23174
23615
  description: ""
23175
23616
  }
23176
23617
  ],
23177
- version: "11.6.0"
23618
+ version: "11.8.0"
23178
23619
  },
23179
23620
  {
23180
23621
  id: "page-response",
@@ -23211,7 +23652,7 @@ placeholder="Name or address\u2026"
23211
23652
  description: ""
23212
23653
  }
23213
23654
  ],
23214
- version: "11.6.0"
23655
+ version: "11.8.0"
23215
23656
  },
23216
23657
  {
23217
23658
  id: "data-loader",
@@ -23223,7 +23664,7 @@ placeholder="Name or address\u2026"
23223
23664
  summary: "",
23224
23665
  description: "",
23225
23666
  members: [],
23226
- version: "11.6.0"
23667
+ version: "11.8.0"
23227
23668
  },
23228
23669
  {
23229
23670
  id: "uni-server-side-datasource",
@@ -23362,7 +23803,7 @@ placeholder="Name or address\u2026"
23362
23803
  description: ""
23363
23804
  }
23364
23805
  ],
23365
- version: "11.6.0"
23806
+ version: "11.8.0"
23366
23807
  },
23367
23808
  {
23368
23809
  id: "uni-datasource",
@@ -23374,7 +23815,7 @@ placeholder="Name or address\u2026"
23374
23815
  summary: "",
23375
23816
  description: "",
23376
23817
  members: [],
23377
- version: "11.6.0"
23818
+ version: "11.8.0"
23378
23819
  },
23379
23820
  {
23380
23821
  id: "uni-record-datasource",
@@ -23483,7 +23924,7 @@ placeholder="Name or address\u2026"
23483
23924
  description: ""
23484
23925
  }
23485
23926
  ],
23486
- version: "11.6.0"
23927
+ version: "11.8.0"
23487
23928
  },
23488
23929
  {
23489
23930
  id: "local-storage-service",
@@ -23538,7 +23979,7 @@ placeholder="Name or address\u2026"
23538
23979
  description: ""
23539
23980
  }
23540
23981
  ],
23541
- version: "11.6.0"
23982
+ version: "11.8.0"
23542
23983
  },
23543
23984
  {
23544
23985
  id: "alert",
@@ -23593,7 +24034,7 @@ placeholder="Name or address\u2026"
23593
24034
  description: ""
23594
24035
  }
23595
24036
  ],
23596
- version: "11.6.0"
24037
+ version: "11.8.0"
23597
24038
  },
23598
24039
  {
23599
24040
  id: "snackbar",
@@ -23648,7 +24089,7 @@ placeholder="Name or address\u2026"
23648
24089
  description: ""
23649
24090
  }
23650
24091
  ],
23651
- version: "11.6.0"
24092
+ version: "11.8.0"
23652
24093
  },
23653
24094
  {
23654
24095
  id: "confirmation",
@@ -23697,7 +24138,7 @@ placeholder="Name or address\u2026"
23697
24138
  description: ""
23698
24139
  }
23699
24140
  ],
23700
- version: "11.6.0"
24141
+ version: "11.8.0"
23701
24142
  },
23702
24143
  {
23703
24144
  id: "notification-service",
@@ -23764,7 +24205,7 @@ placeholder="Name or address\u2026"
23764
24205
  description: ""
23765
24206
  }
23766
24207
  ],
23767
- version: "11.6.0"
24208
+ version: "11.8.0"
23768
24209
  },
23769
24210
  {
23770
24211
  id: "option",
@@ -23801,7 +24242,7 @@ placeholder="Name or address\u2026"
23801
24242
  description: "Visible and announced, but not committable; listbox navigation skips it."
23802
24243
  }
23803
24244
  ],
23804
- version: "11.6.0"
24245
+ version: "11.8.0"
23805
24246
  },
23806
24247
  {
23807
24248
  id: "options",
@@ -23813,7 +24254,7 @@ placeholder="Name or address\u2026"
23813
24254
  summary: "",
23814
24255
  description: "",
23815
24256
  members: [],
23816
- version: "11.6.0"
24257
+ version: "11.8.0"
23817
24258
  },
23818
24259
  {
23819
24260
  id: "use-timer",
@@ -23825,7 +24266,7 @@ placeholder="Name or address\u2026"
23825
24266
  summary: "",
23826
24267
  description: "",
23827
24268
  members: [],
23828
- version: "11.6.0"
24269
+ version: "11.8.0"
23829
24270
  },
23830
24271
  {
23831
24272
  id: "acceptable-file",
@@ -23837,7 +24278,7 @@ placeholder="Name or address\u2026"
23837
24278
  summary: "",
23838
24279
  description: "",
23839
24280
  members: [],
23840
- version: "11.6.0"
24281
+ version: "11.8.0"
23841
24282
  },
23842
24283
  {
23843
24284
  id: "get-file-extension",
@@ -23849,7 +24290,7 @@ placeholder="Name or address\u2026"
23849
24290
  summary: "",
23850
24291
  description: "",
23851
24292
  members: [],
23852
- version: "11.6.0"
24293
+ version: "11.8.0"
23853
24294
  },
23854
24295
  {
23855
24296
  id: "query-permission",
@@ -23861,7 +24302,7 @@ placeholder="Name or address\u2026"
23861
24302
  summary: "The current state of a browser permission.",
23862
24303
  description: 'The current state of a browser permission. Resolves `unsupported` \u2014 never rejects \u2014 where the Permissions API is missing or does not know the name, which is the norm rather than the exception: Firefox and Safari reject `clipboard-write`, for one. Treat `unsupported` as "can\'t tell", not "no".',
23863
24304
  members: [],
23864
- version: "11.6.0"
24305
+ version: "11.8.0"
23865
24306
  },
23866
24307
  {
23867
24308
  id: "permission-service",
@@ -23886,7 +24327,7 @@ placeholder="Name or address\u2026"
23886
24327
  description: ""
23887
24328
  }
23888
24329
  ],
23889
- version: "11.6.0"
24330
+ version: "11.8.0"
23890
24331
  },
23891
24332
  {
23892
24333
  id: "permission",
@@ -23898,7 +24339,7 @@ placeholder="Name or address\u2026"
23898
24339
  summary: "",
23899
24340
  description: "",
23900
24341
  members: [],
23901
- version: "11.6.0"
24342
+ version: "11.8.0"
23902
24343
  },
23903
24344
  {
23904
24345
  id: "permission-state",
@@ -23910,7 +24351,7 @@ placeholder="Name or address\u2026"
23910
24351
  summary: "",
23911
24352
  description: "",
23912
24353
  members: [],
23913
- version: "11.6.0"
24354
+ version: "11.8.0"
23914
24355
  },
23915
24356
  {
23916
24357
  id: "clipboard-copy-result",
@@ -23922,7 +24363,7 @@ placeholder="Name or address\u2026"
23922
24363
  summary: "How a copy ended: - `copied` \u2014 the content is on the clipboard.",
23923
24364
  description: "How a copy ended: - `copied` \u2014 the content is on the clipboard. - `denied` \u2014 the user or a policy has blocked clipboard access for this site; only a change in the browser's site settings will fix it. - `unsupported` \u2014 no Clipboard API here (an insecure context, a server render, an old browser) or the browser cannot write one of the types. - `failed` \u2014 the browser refused this attempt for another reason, most often a call made outside a user gesture or from an unfocused document.",
23924
24365
  members: [],
23925
- version: "11.6.0"
24366
+ version: "11.8.0"
23926
24367
  },
23927
24368
  {
23928
24369
  id: "clipboard-data",
@@ -23934,7 +24375,7 @@ placeholder="Name or address\u2026"
23934
24375
  summary: "One clipboard representation; a promise lets the data arrive after the gesture.",
23935
24376
  description: "One clipboard representation; a promise lets the data arrive after the gesture.",
23936
24377
  members: [],
23937
- version: "11.6.0"
24378
+ version: "11.8.0"
23938
24379
  },
23939
24380
  {
23940
24381
  id: "clipboard-content",
@@ -23946,7 +24387,7 @@ placeholder="Name or address\u2026"
23946
24387
  summary: "What to copy: a plain string, or one item in several representations keyed by MIME type \u2014 `{ 'text/plain': \u2026, 'text/html': \u2026 }`, `{ 'image/png': blob }`.",
23947
24388
  description: "What to copy: a plain string, or one item in several representations keyed by MIME type \u2014 `{ 'text/plain': \u2026, 'text/html': \u2026 }`, `{ 'image/png': blob }`.",
23948
24389
  members: [],
23949
- version: "11.6.0"
24390
+ version: "11.8.0"
23950
24391
  },
23951
24392
  {
23952
24393
  id: "copy-to-clipboard",
@@ -23958,7 +24399,7 @@ placeholder="Name or address\u2026"
23958
24399
  summary: "Copies text or rich content with the Async Clipboard API.",
23959
24400
  description: "Copies text or rich content with the Async Clipboard API. Never rejects: the result says what happened, so a caller can tell the user why. Call it directly from the click or key handler. The write starts synchronously, before anything is awaited, because browsers only honor it inside the user gesture \u2014 which is also why the `clipboard-write` permission is consulted after a refusal, to explain it, rather than before the attempt. For content that has to be fetched or rendered first, pass a promise as the value instead of awaiting it yourself.",
23960
24401
  members: [],
23961
- version: "11.6.0"
24402
+ version: "11.8.0"
23962
24403
  }
23963
24404
  ],
23964
24405
  utilityDocs: [
@@ -25396,6 +25837,7 @@ var buildComponents = (c) => ({
25396
25837
  padding: "sm",
25397
25838
  bodyPadding: void 0,
25398
25839
  inset: "lg",
25840
+ overscroll: "contain",
25399
25841
  elevation: "dialog",
25400
25842
  backdrop: "scrim",
25401
25843
  motion: "panel"
@@ -25420,7 +25862,9 @@ var buildComponents = (c) => ({
25420
25862
  textAlign: "center",
25421
25863
  divider: void 0,
25422
25864
  closeButtonIcon: "close",
25423
- closeButtonSize: "md"
25865
+ closeButtonSize: "md",
25866
+ richColor: void 0,
25867
+ richPadding: "md"
25424
25868
  } },
25425
25869
  select: { options: {
25426
25870
  toggleIcon: "chevronDown",
@@ -25496,7 +25940,12 @@ var buildComponents = (c) => ({
25496
25940
  tooltipCloseDelay: 150,
25497
25941
  motion: "panel"
25498
25942
  } },
25499
- expand: { options: { motion: "reveal" } },
25943
+ expand: { options: {
25944
+ motion: "reveal",
25945
+ textRole: "label",
25946
+ sublabelRole: "caption",
25947
+ sublabelColor: "on-background-variant"
25948
+ } },
25500
25949
  input: { options: {
25501
25950
  typeface: "input",
25502
25951
  color: "primary-surface",
@@ -25686,7 +26135,8 @@ var buildComponents = (c) => ({
25686
26135
  avatarVariant: "primary",
25687
26136
  nameTypeface: "body-2-short",
25688
26137
  detailTypeface: "caption",
25689
- rowGap: "sm"
26138
+ rowGap: "sm",
26139
+ chipAvatar: true
25690
26140
  } },
25691
26141
  calendar: {
25692
26142
  options: {
@@ -26013,6 +26463,7 @@ var buildComponents = (c) => ({
26013
26463
  thVerticalBorder: "dotted",
26014
26464
  thHorizontalBorder: "light",
26015
26465
  thPadding: "sm",
26466
+ sortIcon: "arrowUp",
26016
26467
  tdTextRole: "title-small",
26017
26468
  tdColor: "primary-surface",
26018
26469
  tdStickyColor: "primary-container",
@@ -26024,10 +26475,18 @@ var buildComponents = (c) => ({
26024
26475
  loadingSpinnerColor: "primary",
26025
26476
  loadingSpinnerSize: 40
26026
26477
  } },
26027
- notificationBadge: { options: {
26028
- borderRadius: "sm",
26029
- offset: -10
26030
- } },
26478
+ notificationBadge: {
26479
+ options: {
26480
+ borderRadius: "sm",
26481
+ offset: -10,
26482
+ typeface: "overline"
26483
+ },
26484
+ sizes: {
26485
+ sm: { height: 14 },
26486
+ md: { height: 16 },
26487
+ lg: { height: 20 }
26488
+ }
26489
+ },
26031
26490
  paginator: { options: {
26032
26491
  gap: "xs",
26033
26492
  textRole: "label",
@@ -27582,4 +28041,4 @@ export {
27582
28041
  buildStoredTheme,
27583
28042
  createUniServer
27584
28043
  };
27585
- //# sourceMappingURL=chunk-INTB6KJ7.js.map
28044
+ //# sourceMappingURL=chunk-R4RLYWUY.js.map