@uni-design-system/uni-mcp 11.5.0 → 11.7.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.5.0",
11
- builtAt: "2026-10-02T22:31:37.604Z",
10
+ version: "11.7.0",
11
+ builtAt: "2026-10-22T04:29:01.107Z",
12
12
  frameworks: [
13
13
  "angular"
14
14
  ],
15
15
  counts: {
16
- components: 87,
17
- tokens: 494,
16
+ components: 88,
17
+ tokens: 511,
18
18
  themes: 2,
19
- examples: 246,
19
+ examples: 256,
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.5.0",
31
+ version: "11.7.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.5.0",
121
+ version: "11.7.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.5.0",
194
+ version: "11.7.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.5.0",
289
+ version: "11.7.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.5.0",
338
+ version: "11.7.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.5.0",
419
+ version: "11.7.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.5.0",
516
+ version: "11.7.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.5.0",
540
+ version: "11.7.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.5.0",
948
+ version: "11.7.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.5.0",
1033
+ version: "11.7.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.5.0",
1201
+ version: "11.7.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.5.0",
1233
+ version: "11.7.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.5.0",
1474
+ version: "11.7.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.5.0",
1694
+ version: "11.7.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.5.0",
1756
+ version: "11.7.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.5.0",
1797
+ version: "11.7.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.5.0",
1854
+ version: "11.7.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.5.0",
1909
+ version: "11.7.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.5.0",
2131
+ version: "11.7.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",
@@ -2258,6 +2274,14 @@ var uni_index_default = {
2258
2274
  default: "250",
2259
2275
  description: ""
2260
2276
  },
2277
+ {
2278
+ name: "openOnFocus",
2279
+ kind: "input",
2280
+ type: "boolean",
2281
+ required: false,
2282
+ default: "false",
2283
+ description: "Open the list when the field takes focus, not only on click or ArrowDown. Off by default \u2014 a form tabbed through should not spray popups."
2284
+ },
2261
2285
  {
2262
2286
  name: "query",
2263
2287
  kind: "output",
@@ -2371,7 +2395,7 @@ emptyText="No countries found"
2371
2395
  }
2372
2396
  ],
2373
2397
  guidelines: {
2374
- 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`.",
2375
2399
  dos: [],
2376
2400
  donts: [
2377
2401
  "Don't expect free text to commit implicitly \u2014 it never does. Offer creation",
@@ -2406,7 +2430,7 @@ emptyText="No countries found"
2406
2430
  summary: "",
2407
2431
  description: "",
2408
2432
  category: "feedback",
2409
- version: "11.5.0",
2433
+ version: "11.7.0",
2410
2434
  bindings: {
2411
2435
  angular: {
2412
2436
  importPath: "@uni-design-system/uni-angular",
@@ -2446,6 +2470,291 @@ emptyText="No countries found"
2446
2470
  },
2447
2471
  relatedTokens: []
2448
2472
  },
2473
+ {
2474
+ id: "contact-input",
2475
+ name: "ContactInput",
2476
+ status: "stable",
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).",
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.",
2479
+ category: "forms",
2480
+ version: "11.7.0",
2481
+ bindings: {
2482
+ angular: {
2483
+ importPath: "@uni-design-system/uni-angular",
2484
+ selectorOrTag: "uni-contact-input, ContactInput",
2485
+ api: [
2486
+ {
2487
+ name: "value",
2488
+ kind: "model",
2489
+ type: "UniContact[]",
2490
+ required: false,
2491
+ default: "[]",
2492
+ description: ""
2493
+ },
2494
+ {
2495
+ name: "disabled",
2496
+ kind: "input",
2497
+ type: "boolean",
2498
+ required: false,
2499
+ default: "false",
2500
+ description: ""
2501
+ },
2502
+ {
2503
+ name: "touched",
2504
+ kind: "model",
2505
+ type: "boolean",
2506
+ required: false,
2507
+ default: "false",
2508
+ description: ""
2509
+ },
2510
+ {
2511
+ name: "touch",
2512
+ kind: "output",
2513
+ type: "void",
2514
+ required: false,
2515
+ description: "Angular 22 marks the bound field touched through this output."
2516
+ },
2517
+ {
2518
+ name: "invalid",
2519
+ kind: "input",
2520
+ type: "boolean",
2521
+ required: false,
2522
+ default: "false",
2523
+ description: ""
2524
+ },
2525
+ {
2526
+ name: "dirty",
2527
+ kind: "input",
2528
+ type: "boolean",
2529
+ required: false,
2530
+ default: "false",
2531
+ description: ""
2532
+ },
2533
+ {
2534
+ name: "required",
2535
+ kind: "input",
2536
+ type: "boolean",
2537
+ required: false,
2538
+ default: "false",
2539
+ description: ""
2540
+ },
2541
+ {
2542
+ name: "ariaDescribedBy",
2543
+ kind: "input",
2544
+ type: "string",
2545
+ required: false,
2546
+ description: ""
2547
+ },
2548
+ {
2549
+ name: "label",
2550
+ kind: "input",
2551
+ type: "string",
2552
+ required: true,
2553
+ description: 'Accessible name for the field, e.g. "To".'
2554
+ },
2555
+ {
2556
+ name: "placeholder",
2557
+ kind: "input",
2558
+ type: "string",
2559
+ required: false,
2560
+ description: ""
2561
+ },
2562
+ {
2563
+ name: "contacts",
2564
+ kind: "input",
2565
+ type: "UniContact[]",
2566
+ required: false,
2567
+ default: "[]",
2568
+ description: "Everyone who can be suggested, in the order (and groups) to offer them."
2569
+ },
2570
+ {
2571
+ name: "allowCustom",
2572
+ kind: "input",
2573
+ type: "boolean",
2574
+ required: false,
2575
+ default: "true",
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`."
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
+ },
2586
+ {
2587
+ name: "filterLocally",
2588
+ kind: "input",
2589
+ type: "boolean",
2590
+ required: false,
2591
+ default: "true",
2592
+ description: "`false` renders `contacts` verbatim; narrow them app-side from `(query)` when the directory lives on a server."
2593
+ },
2594
+ {
2595
+ name: "autoHighlight",
2596
+ kind: "input",
2597
+ type: "boolean",
2598
+ required: false,
2599
+ default: "false",
2600
+ description: "Keep the first match highlighted so Enter or Tab picks it without arrowing. Off by default: nothing is highlighted until ArrowDown, and Enter commits what is typed."
2601
+ },
2602
+ {
2603
+ name: "debounceTime",
2604
+ kind: "input",
2605
+ type: "number",
2606
+ required: false,
2607
+ default: "250",
2608
+ description: ""
2609
+ },
2610
+ {
2611
+ name: "maxLength",
2612
+ kind: "input",
2613
+ type: "number | undefined",
2614
+ required: false,
2615
+ default: "undefined, { alias: 'max' }",
2616
+ description: ""
2617
+ },
2618
+ {
2619
+ name: "unframed",
2620
+ kind: "input",
2621
+ type: "unknown",
2622
+ required: false,
2623
+ default: "false, { transform: booleanAttribute }",
2624
+ description: "Drop the field chrome and render a bare row \u2014 an email client's To line."
2625
+ },
2626
+ {
2627
+ name: "autocomplete",
2628
+ kind: "input",
2629
+ type: "string",
2630
+ required: false,
2631
+ default: "'off'",
2632
+ description: "The text field's `autocomplete` token; see `uni-tag-input`."
2633
+ },
2634
+ {
2635
+ name: "tagVariant",
2636
+ kind: "input",
2637
+ type: "Variant",
2638
+ required: false,
2639
+ description: ""
2640
+ },
2641
+ {
2642
+ name: "tagTone",
2643
+ kind: "input",
2644
+ type: "TagTone",
2645
+ required: false,
2646
+ description: ""
2647
+ },
2648
+ {
2649
+ name: "tagSize",
2650
+ kind: "input",
2651
+ type: "Size",
2652
+ required: false,
2653
+ description: ""
2654
+ },
2655
+ {
2656
+ name: "added",
2657
+ kind: "output",
2658
+ type: "UniContact",
2659
+ required: false,
2660
+ description: ""
2661
+ },
2662
+ {
2663
+ name: "removed",
2664
+ kind: "output",
2665
+ type: "UniContact",
2666
+ required: false,
2667
+ description: ""
2668
+ },
2669
+ {
2670
+ name: "rejected",
2671
+ kind: "output",
2672
+ type: "UniTagRejection",
2673
+ required: false,
2674
+ description: "Typed text that did not become a person; an `invalid` one stays in the field."
2675
+ },
2676
+ {
2677
+ name: "query",
2678
+ kind: "output",
2679
+ type: "string",
2680
+ required: false,
2681
+ description: "Debounced typed text, for loading contacts remotely."
2682
+ },
2683
+ {
2684
+ name: "draftChange",
2685
+ kind: "output",
2686
+ type: "string",
2687
+ required: false,
2688
+ description: "Typed text on every change \u2014 e.g. to clear an error once it is edited."
2689
+ },
2690
+ {
2691
+ name: "variant",
2692
+ kind: "input",
2693
+ type: "Variant",
2694
+ required: false,
2695
+ default: "'primary'",
2696
+ description: "Style archetype from the theme. Inherited from BaseComponent."
2697
+ },
2698
+ {
2699
+ name: "size",
2700
+ kind: "input",
2701
+ type: "Size",
2702
+ required: false,
2703
+ default: "'lg'",
2704
+ description: "Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block."
2705
+ }
2706
+ ]
2707
+ }
2708
+ },
2709
+ examples: [
2710
+ {
2711
+ title: "Primary",
2712
+ framework: "angular",
2713
+ code: "<!-- Storybook story: Primary -->\n<!-- args:\n{ value: [{ value: 'alice@uni.dev', name: 'Alice Chen' }] }\n-->"
2714
+ },
2715
+ {
2716
+ title: "Grouped Contacts",
2717
+ framework: "angular",
2718
+ code: "<!-- Storybook story: Grouped Contacts -->\n<!-- args:\n{ contacts: GROUPED }\n-->"
2719
+ },
2720
+ {
2721
+ title: "Unframed",
2722
+ framework: "angular",
2723
+ code: "<!-- Storybook story: Unframed -->\n<!-- args:\n{ unframed: true, value: [{ value: 'alice@uni.dev', name: 'Alice Chen' }] }\n-->"
2724
+ },
2725
+ {
2726
+ title: "Known Contacts Only",
2727
+ framework: "angular",
2728
+ code: "<!-- Storybook story: Known Contacts Only -->\n<!-- args:\n{ allowCustom: false, placeholder: 'Search people\u2026' }\n-->"
2729
+ },
2730
+ {
2731
+ title: "Disabled",
2732
+ framework: "angular",
2733
+ code: "<!-- Storybook story: Disabled -->\n<!-- args:\n{ disabled: true, value: [{ value: 'alice@uni.dev', name: 'Alice Chen' }] }\n-->"
2734
+ }
2735
+ ],
2736
+ guidelines: {
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`.",
2738
+ dos: [
2739
+ "Order `contacts` most-relevant first; only the first few are shown.",
2740
+ "Set `filterLocally` to `false` and refresh `contacts` from `(query)` when",
2741
+ "Clear your error message from `(draftChange)` once the user edits the text."
2742
+ ],
2743
+ donts: [
2744
+ "Don't use it for tokens that are not people \u2014 that is `uni-tag-input`.",
2745
+ "Don't use it to pick one person from a closed list \u2014 that is `uni-combobox`.",
2746
+ "Don't rely on `autocomplete=\"off\"` alone if Chrome's address autofill still"
2747
+ ],
2748
+ accessibility: [
2749
+ 'The text input is `role="combobox"` over a `role="listbox"` popup; nothing',
2750
+ "The whole field is one tab stop. Enter picks the active contact, otherwise",
2751
+ 'Adds, removes and refusals announce through a `role="status"` live region.',
2752
+ "The control renders no validation message: handle `(rejected)`, render the",
2753
+ "`unframed` removes the focus ring along with the chrome; show focus on the"
2754
+ ]
2755
+ },
2756
+ relatedTokens: []
2757
+ },
2449
2758
  {
2450
2759
  id: "data-search",
2451
2760
  name: "DataSearch",
@@ -2453,7 +2762,7 @@ emptyText="No countries found"
2453
2762
  summary: "",
2454
2763
  description: "",
2455
2764
  category: "forms",
2456
- version: "11.5.0",
2765
+ version: "11.7.0",
2457
2766
  bindings: {
2458
2767
  angular: {
2459
2768
  importPath: "@uni-design-system/uni-angular",
@@ -2552,7 +2861,7 @@ emptyText="No countries found"
2552
2861
  summary: "",
2553
2862
  description: "",
2554
2863
  category: "data",
2555
- version: "11.5.0",
2864
+ version: "11.7.0",
2556
2865
  bindings: {
2557
2866
  angular: {
2558
2867
  importPath: "@uni-design-system/uni-angular",
@@ -2771,6 +3080,23 @@ emptyText="No countries found"
2771
3080
  datasource: new UniRecordDatasource<any>(starWarsCharacters),
2772
3081
  }
2773
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
+ />`
2774
3100
  }
2775
3101
  ],
2776
3102
  guidelines: {
@@ -2778,7 +3104,7 @@ emptyText="No countries found"
2778
3104
  dos: [],
2779
3105
  donts: [],
2780
3106
  accessibility: [
2781
- '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.',
2782
3108
  'The loading overlay is a `role="status"` region and the table is `aria-busy` while loading.',
2783
3109
  "Collapsed detail rows are `inert`, out of the accessibility tree until expanded."
2784
3110
  ]
@@ -2792,7 +3118,7 @@ emptyText="No countries found"
2792
3118
  summary: "Date field with free-typed parsing and a popup calendar.",
2793
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.",
2794
3120
  category: "forms",
2795
- version: "11.5.0",
3121
+ version: "11.7.0",
2796
3122
  bindings: {
2797
3123
  angular: {
2798
3124
  importPath: "@uni-design-system/uni-angular",
@@ -3023,7 +3349,7 @@ emptyText="No countries found"
3023
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.",
3024
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.",
3025
3351
  category: "forms",
3026
- version: "11.5.0",
3352
+ version: "11.7.0",
3027
3353
  bindings: {
3028
3354
  angular: {
3029
3355
  importPath: "@uni-design-system/uni-angular",
@@ -3216,7 +3542,7 @@ emptyText="No countries found"
3216
3542
  summary: "Text input that emits `change` only after the user pauses typing.",
3217
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.",
3218
3544
  category: "forms",
3219
- version: "11.5.0",
3545
+ version: "11.7.0",
3220
3546
  bindings: {
3221
3547
  angular: {
3222
3548
  importPath: "@uni-design-system/uni-angular",
@@ -3364,7 +3690,7 @@ emptyText="No countries found"
3364
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]`.",
3365
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.",
3366
3692
  category: "feedback",
3367
- version: "11.5.0",
3693
+ version: "11.7.0",
3368
3694
  bindings: {
3369
3695
  angular: {
3370
3696
  importPath: "@uni-design-system/uni-angular",
@@ -3505,6 +3831,7 @@ uni-dialog
3505
3831
  "dialog.behavior.border",
3506
3832
  "dialog.behavior.padding",
3507
3833
  "dialog.behavior.inset",
3834
+ "dialog.behavior.overscroll",
3508
3835
  "dialog.behavior.elevation",
3509
3836
  "dialog.behavior.backdrop",
3510
3837
  "dialog.behavior.motion"
@@ -3517,7 +3844,7 @@ uni-dialog
3517
3844
  summary: "",
3518
3845
  description: "",
3519
3846
  category: "feedback",
3520
- version: "11.5.0",
3847
+ version: "11.7.0",
3521
3848
  bindings: {
3522
3849
  angular: {
3523
3850
  importPath: "@uni-design-system/uni-angular",
@@ -3621,7 +3948,7 @@ uni-dialog
3621
3948
  summary: "",
3622
3949
  description: "",
3623
3950
  category: "feedback",
3624
- version: "11.5.0",
3951
+ version: "11.7.0",
3625
3952
  bindings: {
3626
3953
  angular: {
3627
3954
  importPath: "@uni-design-system/uni-angular",
@@ -3662,7 +3989,7 @@ uni-dialog
3662
3989
  summary: "",
3663
3990
  description: "",
3664
3991
  category: "layout",
3665
- version: "11.5.0",
3992
+ version: "11.7.0",
3666
3993
  bindings: {
3667
3994
  angular: {
3668
3995
  importPath: "@uni-design-system/uni-angular",
@@ -3718,7 +4045,7 @@ uni-dialog
3718
4045
  summary: "",
3719
4046
  description: "",
3720
4047
  category: "directives",
3721
- version: "11.5.0",
4048
+ version: "11.7.0",
3722
4049
  bindings: {
3723
4050
  angular: {
3724
4051
  importPath: "@uni-design-system/uni-angular",
@@ -3750,7 +4077,7 @@ uni-dialog
3750
4077
  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.",
3751
4078
  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.",
3752
4079
  category: "components",
3753
- version: "11.5.0",
4080
+ version: "11.7.0",
3754
4081
  bindings: {
3755
4082
  angular: {
3756
4083
  importPath: "@uni-design-system/uni-angular",
@@ -3941,7 +4268,7 @@ initialFocus="input"
3941
4268
  summary: "The drawer's pinned footer action row \u2014 the save bar of an editor panel.",
3942
4269
  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.",
3943
4270
  category: "primitives",
3944
- version: "11.5.0",
4271
+ version: "11.7.0",
3945
4272
  bindings: {
3946
4273
  angular: {
3947
4274
  importPath: "@uni-design-system/uni-angular",
@@ -4038,7 +4365,7 @@ initialFocus="input"
4038
4365
  summary: "The drawer's pinned header row: a title, and optionally a close button.",
4039
4366
  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.",
4040
4367
  category: "components",
4041
- version: "11.5.0",
4368
+ version: "11.7.0",
4042
4369
  bindings: {
4043
4370
  angular: {
4044
4371
  importPath: "@uni-design-system/uni-angular",
@@ -4086,7 +4413,7 @@ initialFocus="input"
4086
4413
  summary: "",
4087
4414
  description: "",
4088
4415
  category: "components",
4089
- version: "11.5.0",
4416
+ version: "11.7.0",
4090
4417
  bindings: {
4091
4418
  angular: {
4092
4419
  importPath: "@uni-design-system/uni-angular",
@@ -4220,7 +4547,7 @@ initialFocus="input"
4220
4547
  summary: "",
4221
4548
  description: "",
4222
4549
  category: "layout",
4223
- version: "11.5.0",
4550
+ version: "11.7.0",
4224
4551
  bindings: {
4225
4552
  angular: {
4226
4553
  importPath: "@uni-design-system/uni-angular",
@@ -4314,7 +4641,10 @@ initialFocus="input"
4314
4641
  ]
4315
4642
  },
4316
4643
  relatedTokens: [
4317
- "expand.behavior.motion"
4644
+ "expand.behavior.motion",
4645
+ "expand.behavior.textRole",
4646
+ "expand.behavior.sublabelRole",
4647
+ "expand.behavior.sublabelColor"
4318
4648
  ]
4319
4649
  },
4320
4650
  {
@@ -4324,7 +4654,7 @@ initialFocus="input"
4324
4654
  summary: "",
4325
4655
  description: "",
4326
4656
  category: "layout",
4327
- version: "11.5.0",
4657
+ version: "11.7.0",
4328
4658
  bindings: {
4329
4659
  angular: {
4330
4660
  importPath: "@uni-design-system/uni-angular",
@@ -4395,7 +4725,7 @@ initialFocus="input"
4395
4725
  summary: "Trigger for a {@link UniExpandComponent} region.",
4396
4726
  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.",
4397
4727
  category: "layout",
4398
- version: "11.5.0",
4728
+ version: "11.7.0",
4399
4729
  bindings: {
4400
4730
  angular: {
4401
4731
  importPath: "@uni-design-system/uni-angular",
@@ -4444,13 +4774,13 @@ initialFocus="input"
4444
4774
  {
4445
4775
  title: "Primary",
4446
4776
  framework: "angular",
4447
- 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-->'
4777
+ 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-->'
4448
4778
  },
4449
4779
  {
4450
4780
  title: "Labelled",
4451
4781
  framework: "angular",
4452
4782
  code: `<!-- Storybook story: Labelled -->
4453
- <uni-expand-toggle [collapsed]="collapsed" #toggle />
4783
+ <uni-expand-toggle [collapsed]="collapsed" [label]="label" [sublabel]="sublabel" #toggle />
4454
4784
  <div>Collapsed: {{ toggle.collapsed() }}</div>
4455
4785
  <!-- args:
4456
4786
  {
@@ -4480,7 +4810,7 @@ initialFocus="input"
4480
4810
  summary: "",
4481
4811
  description: "",
4482
4812
  category: "forms",
4483
- version: "11.5.0",
4813
+ version: "11.7.0",
4484
4814
  bindings: {
4485
4815
  angular: {
4486
4816
  importPath: "@uni-design-system/uni-angular",
@@ -4638,7 +4968,7 @@ initialFocus="input"
4638
4968
  summary: "",
4639
4969
  description: "",
4640
4970
  category: "layout",
4641
- version: "11.5.0",
4971
+ version: "11.7.0",
4642
4972
  bindings: {
4643
4973
  angular: {
4644
4974
  importPath: "@uni-design-system/uni-angular",
@@ -4735,7 +5065,7 @@ initialFocus="input"
4735
5065
  summary: "",
4736
5066
  description: "",
4737
5067
  category: "layout",
4738
- version: "11.5.0",
5068
+ version: "11.7.0",
4739
5069
  bindings: {
4740
5070
  angular: {
4741
5071
  importPath: "@uni-design-system/uni-angular",
@@ -4767,7 +5097,7 @@ initialFocus="input"
4767
5097
  summary: "",
4768
5098
  description: "",
4769
5099
  category: "primitives",
4770
- version: "11.5.0",
5100
+ version: "11.7.0",
4771
5101
  bindings: {
4772
5102
  angular: {
4773
5103
  importPath: "@uni-design-system/uni-angular",
@@ -4827,7 +5157,7 @@ initialFocus="input"
4827
5157
  summary: "",
4828
5158
  description: "",
4829
5159
  category: "primitives",
4830
- version: "11.5.0",
5160
+ version: "11.7.0",
4831
5161
  bindings: {
4832
5162
  angular: {
4833
5163
  importPath: "@uni-design-system/uni-angular",
@@ -4873,15 +5203,25 @@ initialFocus="input"
4873
5203
  {
4874
5204
  name: "disable",
4875
5205
  kind: "input",
4876
- type: "boolean",
5206
+ type: "unknown",
4877
5207
  required: false,
4878
- description: ""
5208
+ default: "false, { transform: booleanAttribute }",
5209
+ description: "A bare `disable` attribute reads as true, as `uni-button`'s does; `undefined` as false."
5210
+ },
5211
+ {
5212
+ name: "disabled",
5213
+ kind: "input",
5214
+ type: "unknown",
5215
+ required: false,
5216
+ default: "false, { transform: booleanAttribute }",
5217
+ description: "The native name, accepted as an alias of `disable` \u2014 see `uni-button`."
4879
5218
  },
4880
5219
  {
4881
5220
  name: "loading",
4882
5221
  kind: "input",
4883
- type: "boolean",
5222
+ type: "unknown",
4884
5223
  required: false,
5224
+ default: "false, { transform: booleanAttribute }",
4885
5225
  description: ""
4886
5226
  },
4887
5227
  {
@@ -4930,7 +5270,7 @@ initialFocus="input"
4930
5270
  summary: "A button that lives inside a sentence.",
4931
5271
  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.",
4932
5272
  category: "primitives",
4933
- version: "11.5.0",
5273
+ version: "11.7.0",
4934
5274
  bindings: {
4935
5275
  angular: {
4936
5276
  importPath: "@uni-design-system/uni-angular",
@@ -5045,7 +5385,7 @@ initialFocus="input"
5045
5385
  summary: "",
5046
5386
  description: "",
5047
5387
  category: "forms",
5048
- version: "11.5.0",
5388
+ version: "11.7.0",
5049
5389
  bindings: {
5050
5390
  angular: {
5051
5391
  importPath: "@uni-design-system/uni-angular",
@@ -5250,6 +5590,21 @@ initialFocus="input"
5250
5590
  required: false,
5251
5591
  default: "undefined",
5252
5592
  description: ""
5593
+ },
5594
+ {
5595
+ name: "unframed",
5596
+ kind: "input",
5597
+ type: "unknown",
5598
+ required: false,
5599
+ default: "false, { transform: booleanAttribute }",
5600
+ description: "Drop the field chrome and render the bare input \u2014 see `uni-input-box`."
5601
+ },
5602
+ {
5603
+ name: "align",
5604
+ kind: "input",
5605
+ type: "'start' | 'center' | 'end'",
5606
+ required: false,
5607
+ description: "Text alignment, as `uni-number-input`'s. Default: `start`."
5253
5608
  }
5254
5609
  ]
5255
5610
  }
@@ -5330,7 +5685,7 @@ initialFocus="input"
5330
5685
  summary: "",
5331
5686
  description: "",
5332
5687
  category: "forms",
5333
- version: "11.5.0",
5688
+ version: "11.7.0",
5334
5689
  bindings: {
5335
5690
  angular: {
5336
5691
  importPath: "@uni-design-system/uni-angular",
@@ -5400,6 +5755,14 @@ initialFocus="input"
5400
5755
  default: "false",
5401
5756
  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."
5402
5757
  },
5758
+ {
5759
+ name: "unframed",
5760
+ kind: "input",
5761
+ type: "unknown",
5762
+ required: false,
5763
+ default: "false, { transform: booleanAttribute }",
5764
+ 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."
5765
+ },
5403
5766
  {
5404
5767
  name: "variant",
5405
5768
  kind: "input",
@@ -5451,7 +5814,7 @@ initialFocus="input"
5451
5814
  summary: "",
5452
5815
  description: "",
5453
5816
  category: "components",
5454
- version: "11.5.0",
5817
+ version: "11.7.0",
5455
5818
  bindings: {
5456
5819
  angular: {
5457
5820
  importPath: "@uni-design-system/uni-angular",
@@ -5521,7 +5884,7 @@ initialFocus="input"
5521
5884
  summary: "",
5522
5885
  description: "",
5523
5886
  category: "layout",
5524
- version: "11.5.0",
5887
+ version: "11.7.0",
5525
5888
  bindings: {
5526
5889
  angular: {
5527
5890
  importPath: "@uni-design-system/uni-angular",
@@ -5625,7 +5988,7 @@ initialFocus="input"
5625
5988
  summary: "",
5626
5989
  description: "",
5627
5990
  category: "layout",
5628
- version: "11.5.0",
5991
+ version: "11.7.0",
5629
5992
  bindings: {
5630
5993
  angular: {
5631
5994
  importPath: "@uni-design-system/uni-angular",
@@ -5707,7 +6070,7 @@ initialFocus="input"
5707
6070
  summary: "",
5708
6071
  description: "",
5709
6072
  category: "forms",
5710
- version: "11.5.0",
6073
+ version: "11.7.0",
5711
6074
  bindings: {
5712
6075
  angular: {
5713
6076
  importPath: "@uni-design-system/uni-angular",
@@ -5801,7 +6164,7 @@ initialFocus="input"
5801
6164
  summary: "",
5802
6165
  description: "",
5803
6166
  category: "forms",
5804
- version: "11.5.0",
6167
+ version: "11.7.0",
5805
6168
  bindings: {
5806
6169
  angular: {
5807
6170
  importPath: "@uni-design-system/uni-angular",
@@ -5980,7 +6343,7 @@ initialFocus="input"
5980
6343
  summary: "",
5981
6344
  description: "",
5982
6345
  category: "feedback",
5983
- version: "11.5.0",
6346
+ version: "11.7.0",
5984
6347
  bindings: {
5985
6348
  angular: {
5986
6349
  importPath: "@uni-design-system/uni-angular",
@@ -6221,7 +6584,7 @@ initialFocus="input"
6221
6584
  }
6222
6585
  ],
6223
6586
  guidelines: {
6224
- 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.',
6587
+ 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.",
6225
6588
  dos: [],
6226
6589
  donts: [
6227
6590
  "Convey urgency by color alone \u2014 the count/dot shape carries the signal"
@@ -6240,7 +6603,7 @@ initialFocus="input"
6240
6603
  summary: "",
6241
6604
  description: "",
6242
6605
  category: "feedback",
6243
- version: "11.5.0",
6606
+ version: "11.7.0",
6244
6607
  bindings: {
6245
6608
  angular: {
6246
6609
  importPath: "@uni-design-system/uni-angular",
@@ -6264,7 +6627,7 @@ initialFocus="input"
6264
6627
  summary: "Numeric field with locale-aware parsing, `Intl` formatting on commit, prefix/suffix adornments and steppers that hold to repeat.",
6265
6628
  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.',
6266
6629
  category: "forms",
6267
- version: "11.5.0",
6630
+ version: "11.7.0",
6268
6631
  bindings: {
6269
6632
  angular: {
6270
6633
  importPath: "@uni-design-system/uni-angular",
@@ -6457,6 +6820,14 @@ initialFocus="input"
6457
6820
  default: "false",
6458
6821
  description: "Renders without its own input-box chrome, for composers like uni-slider."
6459
6822
  },
6823
+ {
6824
+ name: "unframed",
6825
+ kind: "input",
6826
+ type: "unknown",
6827
+ required: false,
6828
+ default: "false, { transform: booleanAttribute }",
6829
+ 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."
6830
+ },
6460
6831
  {
6461
6832
  name: "min",
6462
6833
  kind: "input",
@@ -6690,7 +7061,7 @@ initialFocus="input"
6690
7061
  summary: "Two linked numeric fields in one chrome, with one `{ start, end }` value \u2014 price filters, thresholds, tolerances.",
6691
7062
  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.",
6692
7063
  category: "forms",
6693
- version: "11.5.0",
7064
+ version: "11.7.0",
6694
7065
  bindings: {
6695
7066
  angular: {
6696
7067
  importPath: "@uni-design-system/uni-angular",
@@ -6981,7 +7352,7 @@ initialFocus="input"
6981
7352
  summary: "",
6982
7353
  description: "",
6983
7354
  category: "data",
6984
- version: "11.5.0",
7355
+ version: "11.7.0",
6985
7356
  bindings: {
6986
7357
  angular: {
6987
7358
  importPath: "@uni-design-system/uni-angular",
@@ -7082,7 +7453,7 @@ initialFocus="input"
7082
7453
  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.",
7083
7454
  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.',
7084
7455
  category: "layout",
7085
- version: "11.5.0",
7456
+ version: "11.7.0",
7086
7457
  bindings: {
7087
7458
  angular: {
7088
7459
  importPath: "@uni-design-system/uni-angular",
@@ -7274,7 +7645,7 @@ initialFocus="input"
7274
7645
  summary: "",
7275
7646
  description: "",
7276
7647
  category: "feedback",
7277
- version: "11.5.0",
7648
+ version: "11.7.0",
7278
7649
  bindings: {
7279
7650
  angular: {
7280
7651
  importPath: "@uni-design-system/uni-angular",
@@ -7338,7 +7709,7 @@ initialFocus="input"
7338
7709
  summary: "",
7339
7710
  description: "",
7340
7711
  category: "feedback",
7341
- version: "11.5.0",
7712
+ version: "11.7.0",
7342
7713
  bindings: {
7343
7714
  angular: {
7344
7715
  importPath: "@uni-design-system/uni-angular",
@@ -7410,7 +7781,7 @@ initialFocus="input"
7410
7781
  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.",
7411
7782
  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.',
7412
7783
  category: "forms",
7413
- version: "11.5.0",
7784
+ version: "11.7.0",
7414
7785
  bindings: {
7415
7786
  angular: {
7416
7787
  importPath: "@uni-design-system/uni-angular",
@@ -7613,7 +7984,7 @@ initialFocus="input"
7613
7984
  summary: "",
7614
7985
  description: "",
7615
7986
  category: "forms",
7616
- version: "11.5.0",
7987
+ version: "11.7.0",
7617
7988
  bindings: {
7618
7989
  angular: {
7619
7990
  importPath: "@uni-design-system/uni-angular",
@@ -7842,7 +8213,7 @@ initialFocus="input"
7842
8213
  summary: "Content for each of a radio group's options, in place of the plain label string.",
7843
8214
  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> ```',
7844
8215
  category: "forms",
7845
- version: "11.5.0",
8216
+ version: "11.7.0",
7846
8217
  bindings: {
7847
8218
  angular: {
7848
8219
  importPath: "@uni-design-system/uni-angular",
@@ -7866,7 +8237,7 @@ initialFocus="input"
7866
8237
  summary: "",
7867
8238
  description: "",
7868
8239
  category: "directives",
7869
- version: "11.5.0",
8240
+ version: "11.7.0",
7870
8241
  bindings: {
7871
8242
  angular: {
7872
8243
  importPath: "@uni-design-system/uni-angular",
@@ -7890,7 +8261,7 @@ initialFocus="input"
7890
8261
  summary: "",
7891
8262
  description: "",
7892
8263
  category: "layout",
7893
- version: "11.5.0",
8264
+ version: "11.7.0",
7894
8265
  bindings: {
7895
8266
  angular: {
7896
8267
  importPath: "@uni-design-system/uni-angular",
@@ -7945,7 +8316,7 @@ initialFocus="input"
7945
8316
  summary: "Native scroll area with theme-driven scrollbar styling.",
7946
8317
  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.",
7947
8318
  category: "layout",
7948
- version: "11.5.0",
8319
+ version: "11.7.0",
7949
8320
  bindings: {
7950
8321
  angular: {
7951
8322
  importPath: "@uni-design-system/uni-angular",
@@ -8029,6 +8400,21 @@ initialFocus="input"
8029
8400
  required: false,
8030
8401
  description: ""
8031
8402
  },
8403
+ {
8404
+ name: "maxHeight",
8405
+ kind: "input",
8406
+ type: "OptionalValue",
8407
+ required: false,
8408
+ 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."
8409
+ },
8410
+ {
8411
+ name: "fill",
8412
+ kind: "input",
8413
+ type: "unknown",
8414
+ required: false,
8415
+ default: "false, { transform: booleanAttribute }",
8416
+ 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."
8417
+ },
8032
8418
  {
8033
8419
  name: "width",
8034
8420
  kind: "input",
@@ -8075,10 +8461,15 @@ initialFocus="input"
8075
8461
  title: "Primary",
8076
8462
  framework: "angular",
8077
8463
  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-->'
8464
+ },
8465
+ {
8466
+ title: "Max Height",
8467
+ framework: "angular",
8468
+ 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-->'
8078
8469
  }
8079
8470
  ],
8080
8471
  guidelines: {
8081
- 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.",
8472
+ 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.",
8082
8473
  dos: [],
8083
8474
  donts: [],
8084
8475
  accessibility: []
@@ -8092,7 +8483,7 @@ initialFocus="input"
8092
8483
  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.",
8093
8484
  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.",
8094
8485
  category: "forms",
8095
- version: "11.5.0",
8486
+ version: "11.7.0",
8096
8487
  bindings: {
8097
8488
  angular: {
8098
8489
  importPath: "@uni-design-system/uni-angular",
@@ -8136,6 +8527,14 @@ initialFocus="input"
8136
8527
  default: "[]",
8137
8528
  description: "Type-ahead entries. Keep them fresh from `change` emissions; the list shows while the field has focus and entries exist."
8138
8529
  },
8530
+ {
8531
+ name: "openOnFocus",
8532
+ kind: "input",
8533
+ type: "boolean",
8534
+ required: false,
8535
+ default: "false",
8536
+ description: "Show the suggestions on focus and on click, before anything is typed."
8537
+ },
8139
8538
  {
8140
8539
  name: "searchChange",
8141
8540
  kind: "output",
@@ -8219,7 +8618,7 @@ initialFocus="input"
8219
8618
  summary: "",
8220
8619
  description: "",
8221
8620
  category: "forms",
8222
- version: "11.5.0",
8621
+ version: "11.7.0",
8223
8622
  bindings: {
8224
8623
  angular: {
8225
8624
  importPath: "@uni-design-system/uni-angular",
@@ -8367,9 +8766,11 @@ initialFocus="input"
8367
8766
  }
8368
8767
  ],
8369
8768
  guidelines: {
8370
- 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.",
8769
+ 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.",
8371
8770
  dos: [],
8372
- donts: [],
8771
+ donts: [
8772
+ "Bind `''` to mean \"nothing selected\" \u2014 the contract is `null`. The field shows"
8773
+ ],
8373
8774
  accessibility: [
8374
8775
  "Native `<select>`: platform keyboard interaction and mobile pickers for free.",
8375
8776
  "`label` becomes the accessible name; `aria-invalid` reflects the touched error state.",
@@ -8389,7 +8790,7 @@ initialFocus="input"
8389
8790
  summary: "Loading placeholder painted with surface tokens.",
8390
8791
  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.",
8391
8792
  category: "components",
8392
- version: "11.5.0",
8793
+ version: "11.7.0",
8393
8794
  bindings: {
8394
8795
  angular: {
8395
8796
  importPath: "@uni-design-system/uni-angular",
@@ -8540,7 +8941,7 @@ initialFocus="input"
8540
8941
  summary: "Bounded numeric input by pointer, for values where the *position* is the information: volume, opacity, weightings, price filters.",
8541
8942
  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.",
8542
8943
  category: "forms",
8543
- version: "11.5.0",
8944
+ version: "11.7.0",
8544
8945
  bindings: {
8545
8946
  angular: {
8546
8947
  importPath: "@uni-design-system/uni-angular",
@@ -8817,7 +9218,7 @@ initialFocus="input"
8817
9218
  summary: "",
8818
9219
  description: "",
8819
9220
  category: "feedback",
8820
- version: "11.5.0",
9221
+ version: "11.7.0",
8821
9222
  bindings: {
8822
9223
  angular: {
8823
9224
  importPath: "@uni-design-system/uni-angular",
@@ -8929,7 +9330,7 @@ initialFocus="input"
8929
9330
  summary: "",
8930
9331
  description: "",
8931
9332
  category: "data",
8932
- version: "11.5.0",
9333
+ version: "11.7.0",
8933
9334
  bindings: {
8934
9335
  angular: {
8935
9336
  importPath: "@uni-design-system/uni-angular",
@@ -8948,6 +9349,21 @@ initialFocus="input"
8948
9349
  type: "UniDatasource<T>",
8949
9350
  required: false,
8950
9351
  description: ""
9352
+ },
9353
+ {
9354
+ name: "iconName",
9355
+ kind: "input",
9356
+ type: "IconName",
9357
+ required: false,
9358
+ default: "'arrowUp'",
9359
+ 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."
9360
+ },
9361
+ {
9362
+ name: "align",
9363
+ kind: "input",
9364
+ type: "'left' | 'right' | 'center'",
9365
+ required: false,
9366
+ 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."
8951
9367
  }
8952
9368
  ]
8953
9369
  }
@@ -8988,7 +9404,7 @@ initialFocus="input"
8988
9404
  summary: "",
8989
9405
  description: "",
8990
9406
  category: "layout",
8991
- version: "11.5.0",
9407
+ version: "11.7.0",
8992
9408
  bindings: {
8993
9409
  angular: {
8994
9410
  importPath: "@uni-design-system/uni-angular",
@@ -9043,7 +9459,7 @@ initialFocus="input"
9043
9459
  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.',
9044
9460
  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.',
9045
9461
  category: "components",
9046
- version: "11.5.0",
9462
+ version: "11.7.0",
9047
9463
  bindings: {
9048
9464
  angular: {
9049
9465
  importPath: "@uni-design-system/uni-angular",
@@ -9161,7 +9577,7 @@ initialFocus="input"
9161
9577
  summary: "",
9162
9578
  description: "",
9163
9579
  category: "primitives",
9164
- version: "11.5.0",
9580
+ version: "11.7.0",
9165
9581
  bindings: {
9166
9582
  angular: {
9167
9583
  importPath: "@uni-design-system/uni-angular",
@@ -9250,7 +9666,7 @@ initialFocus="input"
9250
9666
  summary: "One tab inside `uni-tabs`: a label for the tablist plus projected panel content.",
9251
9667
  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.",
9252
9668
  category: "components",
9253
- version: "11.5.0",
9669
+ version: "11.7.0",
9254
9670
  bindings: {
9255
9671
  angular: {
9256
9672
  importPath: "@uni-design-system/uni-angular",
@@ -9290,7 +9706,7 @@ initialFocus="input"
9290
9706
  summary: "WAI-ARIA tabs: roving tabindex, automatic activation (arrow keys move focus and select), Home/End, disabled tabs skipped.",
9291
9707
  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.",
9292
9708
  category: "components",
9293
- version: "11.5.0",
9709
+ version: "11.7.0",
9294
9710
  bindings: {
9295
9711
  angular: {
9296
9712
  importPath: "@uni-design-system/uni-angular",
@@ -9378,7 +9794,7 @@ initialFocus="input"
9378
9794
  summary: "Compact chip for categories, states, filters and tokens.",
9379
9795
  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.",
9380
9796
  category: "data",
9381
- version: "11.5.0",
9797
+ version: "11.7.0",
9382
9798
  bindings: {
9383
9799
  angular: {
9384
9800
  importPath: "@uni-design-system/uni-angular",
@@ -9756,7 +10172,7 @@ initialFocus="input"
9756
10172
  summary: "A row of chips the user picks from: filters, facets, a set of labels.",
9757
10173
  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.",
9758
10174
  category: "data",
9759
- version: "11.5.0",
10175
+ version: "11.7.0",
9760
10176
  bindings: {
9761
10177
  angular: {
9762
10178
  importPath: "@uni-design-system/uni-angular",
@@ -9954,7 +10370,7 @@ initialFocus="input"
9954
10370
  summary: "",
9955
10371
  description: "",
9956
10372
  category: "forms",
9957
- version: "11.5.0",
10373
+ version: "11.7.0",
9958
10374
  bindings: {
9959
10375
  angular: {
9960
10376
  importPath: "@uni-design-system/uni-angular",
@@ -10076,12 +10492,43 @@ initialFocus="input"
10076
10492
  default: "undefined, { alias: 'max' }",
10077
10493
  description: ""
10078
10494
  },
10495
+ {
10496
+ name: "unframed",
10497
+ kind: "input",
10498
+ type: "unknown",
10499
+ required: false,
10500
+ default: "false, { transform: booleanAttribute }",
10501
+ description: "Drop the field chrome (border, fill, inset) and render the bare chip row \u2014 an email client's To line. The surrounding layout draws any hairline and focus cue; the error state is still exposed through `aria-invalid`."
10502
+ },
10503
+ {
10504
+ name: "backspaceRemoves",
10505
+ kind: "input",
10506
+ type: "boolean",
10507
+ required: false,
10508
+ default: "false",
10509
+ description: "Backspace in an empty field removes the last tag outright, as mail clients do. Off by default: the two-step (focus the chip, then remove) never deletes blind."
10510
+ },
10511
+ {
10512
+ name: "keepInvalidText",
10513
+ kind: "input",
10514
+ type: "boolean",
10515
+ required: false,
10516
+ default: "false",
10517
+ description: "Refuse a draft that fails validation instead of committing it as a flagged chip: the text stays in the field to be fixed and `rejected` fires with `reason: 'invalid'`."
10518
+ },
10519
+ {
10520
+ name: "autocomplete",
10521
+ kind: "input",
10522
+ type: "string",
10523
+ required: false,
10524
+ default: "'off'",
10525
+ description: "The text field's `autocomplete` token. The field has its own suggestion list, so browser autofill is off by default and password managers are told to skip it. Chrome can still ignore `off` on a field it takes for an email or address; pass another token if its dropdown competes with yours."
10526
+ },
10079
10527
  {
10080
10528
  name: "tagVariant",
10081
10529
  kind: "input",
10082
10530
  type: "Variant",
10083
10531
  required: false,
10084
- default: "'primary'",
10085
10532
  description: ""
10086
10533
  },
10087
10534
  {
@@ -10089,7 +10536,6 @@ initialFocus="input"
10089
10536
  kind: "input",
10090
10537
  type: "TagTone",
10091
10538
  required: false,
10092
- default: "'soft'",
10093
10539
  description: ""
10094
10540
  },
10095
10541
  {
@@ -10122,6 +10568,29 @@ initialFocus="input"
10122
10568
  default: "250",
10123
10569
  description: ""
10124
10570
  },
10571
+ {
10572
+ name: "openOnFocus",
10573
+ kind: "input",
10574
+ type: "boolean",
10575
+ required: false,
10576
+ default: "false",
10577
+ description: "Show the suggestions on focus and on click, before anything is typed."
10578
+ },
10579
+ {
10580
+ name: "autoHighlight",
10581
+ kind: "input",
10582
+ type: "boolean",
10583
+ required: false,
10584
+ default: "false",
10585
+ description: "Keep the first suggestion active while the list is open, so Enter or Tab picks it without arrowing. A draft that is already valid under the field's validator still commits as typed."
10586
+ },
10587
+ {
10588
+ name: "draftChange",
10589
+ kind: "output",
10590
+ type: "string",
10591
+ required: false,
10592
+ description: "Uncommitted text, on every change and undebounced (cf. `query`)."
10593
+ },
10125
10594
  {
10126
10595
  name: "added",
10127
10596
  kind: "output",
@@ -10251,13 +10720,65 @@ placeholder="Name or address\u2026"
10251
10720
  (query)="onQuery($event)"
10252
10721
  />
10253
10722
  <!-- args:
10254
- { maxLength: 3, value: [{ value: 'alpha' }, { value: 'beta' }] }
10723
+ { maxLength: 3, value: [{ value: 'alpha' }, { value: 'beta' }] }
10724
+ -->`
10725
+ },
10726
+ {
10727
+ title: "Disabled",
10728
+ framework: "angular",
10729
+ code: `<!-- Storybook story: Disabled -->
10730
+ <uni-tag-input
10731
+ label="To"
10732
+ preset="email"
10733
+ placeholder="Name or address\u2026"
10734
+ [value]="value"
10735
+ [suggestions]="suggestions"
10736
+ (query)="onQuery($event)"
10737
+ />
10738
+ <!-- args:
10739
+ { disabled: true, value: [{ value: 'alpha' }, { value: 'beta' }] }
10740
+ -->`
10741
+ },
10742
+ {
10743
+ title: "Grouped Suggestions",
10744
+ framework: "angular",
10745
+ code: `<!-- Storybook story: Grouped Suggestions -->
10746
+ <uni-tag-input
10747
+ label="To"
10748
+ preset="email"
10749
+ placeholder="Name or address\u2026"
10750
+ [openOnFocus]="true"
10751
+ [suggestions]="suggestions"
10752
+ />
10753
+ <!-- args:
10754
+ {
10755
+ unframed: true,
10756
+ preset: 'email',
10757
+ value: [{ value: 'alice@uni.dev', label: 'Alice Chen', avatarName: 'Alice Chen' }],
10758
+ }
10759
+ -->`
10760
+ },
10761
+ {
10762
+ title: "Suggestion Template",
10763
+ framework: "angular",
10764
+ code: `<!-- Storybook story: Suggestion Template -->
10765
+ <uni-tag-input label="To" preset="email" [openOnFocus]="true" [suggestions]="suggestions">
10766
+ <ng-template uniTagSuggestion let-person let-index="index">
10767
+ {{ index + 1 }}. {{ person.label }} \u2014 {{ person.value }}
10768
+ </ng-template>
10769
+ </uni-tag-input>
10770
+ <!-- args:
10771
+ {
10772
+ unframed: true,
10773
+ preset: 'email',
10774
+ value: [{ value: 'alice@uni.dev', label: 'Alice Chen', avatarName: 'Alice Chen' }],
10775
+ }
10255
10776
  -->`
10256
10777
  },
10257
10778
  {
10258
- title: "Disabled",
10779
+ title: "Unframed",
10259
10780
  framework: "angular",
10260
- code: `<!-- Storybook story: Disabled -->
10781
+ code: `<!-- Storybook story: Unframed -->
10261
10782
  <uni-tag-input
10262
10783
  label="To"
10263
10784
  preset="email"
@@ -10267,7 +10788,11 @@ placeholder="Name or address\u2026"
10267
10788
  (query)="onQuery($event)"
10268
10789
  />
10269
10790
  <!-- args:
10270
- { disabled: true, value: [{ value: 'alpha' }, { value: 'beta' }] }
10791
+ {
10792
+ unframed: true,
10793
+ preset: 'email',
10794
+ value: [{ value: 'alice@uni.dev', label: 'Alice Chen', avatarName: 'Alice Chen' }],
10795
+ }
10271
10796
  -->`
10272
10797
  }
10273
10798
  ],
@@ -10277,6 +10802,7 @@ placeholder="Name or address\u2026"
10277
10802
  donts: [
10278
10803
  "Don't use it to pick from a closed list \u2014 that is `uni-multi-select-dropdown`.",
10279
10804
  "Don't filter `suggestions` inside the component; drive them from `(query)`.",
10805
+ "Don't rebuild a people picker on it \u2014 `uni-contact-input` already is one.",
10280
10806
  "Don't set `preset=\"email\"` for people's names: Space would split them."
10281
10807
  ],
10282
10808
  accessibility: [
@@ -10295,7 +10821,7 @@ placeholder="Name or address\u2026"
10295
10821
  summary: "The typography primitive, applied as an attribute to any element so semantics stay yours.",
10296
10822
  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.',
10297
10823
  category: "primitives",
10298
- version: "11.5.0",
10824
+ version: "11.7.0",
10299
10825
  bindings: {
10300
10826
  angular: {
10301
10827
  importPath: "@uni-design-system/uni-angular",
@@ -10405,7 +10931,7 @@ placeholder="Name or address\u2026"
10405
10931
  summary: "",
10406
10932
  description: "",
10407
10933
  category: "forms",
10408
- version: "11.5.0",
10934
+ version: "11.7.0",
10409
10935
  bindings: {
10410
10936
  angular: {
10411
10937
  importPath: "@uni-design-system/uni-angular",
@@ -10565,6 +11091,14 @@ placeholder="Name or address\u2026"
10565
11091
  required: false,
10566
11092
  default: "undefined",
10567
11093
  description: ""
11094
+ },
11095
+ {
11096
+ name: "unframed",
11097
+ kind: "input",
11098
+ type: "unknown",
11099
+ required: false,
11100
+ default: "false, { transform: booleanAttribute }",
11101
+ description: "Drop the field chrome and render the bare textarea \u2014 see `uni-input-box`."
10568
11102
  }
10569
11103
  ]
10570
11104
  }
@@ -10612,7 +11146,7 @@ placeholder="Name or address\u2026"
10612
11146
  summary: "",
10613
11147
  description: "",
10614
11148
  category: "primitives",
10615
- version: "11.5.0",
11149
+ version: "11.7.0",
10616
11150
  bindings: {
10617
11151
  angular: {
10618
11152
  importPath: "@uni-design-system/uni-angular",
@@ -10642,7 +11176,7 @@ placeholder="Name or address\u2026"
10642
11176
  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).",
10643
11177
  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).",
10644
11178
  category: "components",
10645
- version: "11.5.0",
11179
+ version: "11.7.0",
10646
11180
  bindings: {
10647
11181
  angular: {
10648
11182
  importPath: "@uni-design-system/uni-angular",
@@ -10700,7 +11234,7 @@ placeholder="Name or address\u2026"
10700
11234
  summary: "Time field: a combobox over time options \u2014 the same listbox contract as uni-search-input and uni-tag-input.",
10701
11235
  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.",
10702
11236
  category: "forms",
10703
- version: "11.5.0",
11237
+ version: "11.7.0",
10704
11238
  bindings: {
10705
11239
  angular: {
10706
11240
  importPath: "@uni-design-system/uni-angular",
@@ -10915,7 +11449,7 @@ placeholder="Name or address\u2026"
10915
11449
  summary: "",
10916
11450
  description: "",
10917
11451
  category: "forms",
10918
- version: "11.5.0",
11452
+ version: "11.7.0",
10919
11453
  bindings: {
10920
11454
  angular: {
10921
11455
  importPath: "@uni-design-system/uni-angular",
@@ -11177,7 +11711,7 @@ placeholder="Name or address\u2026"
11177
11711
  summary: "",
11178
11712
  description: "",
11179
11713
  category: "feedback",
11180
- version: "11.5.0",
11714
+ version: "11.7.0",
11181
11715
  bindings: {
11182
11716
  angular: {
11183
11717
  importPath: "@uni-design-system/uni-angular",
@@ -11265,7 +11799,7 @@ placeholder="Name or address\u2026"
11265
11799
  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).',
11266
11800
  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.',
11267
11801
  category: "components",
11268
- version: "11.5.0",
11802
+ version: "11.7.0",
11269
11803
  bindings: {
11270
11804
  angular: {
11271
11805
  importPath: "@uni-design-system/uni-angular",
@@ -11286,6 +11820,13 @@ placeholder="Name or address\u2026"
11286
11820
  default: "null",
11287
11821
  description: "The presented step index, or null when the tour is not running."
11288
11822
  },
11823
+ {
11824
+ name: "progressStyle",
11825
+ kind: "input",
11826
+ type: "'dots' | 'fraction' | 'none'",
11827
+ required: false,
11828
+ 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."
11829
+ },
11289
11830
  {
11290
11831
  name: "nextLabel",
11291
11832
  kind: "input",
@@ -11323,14 +11864,14 @@ placeholder="Name or address\u2026"
11323
11864
  kind: "output",
11324
11865
  type: "void",
11325
11866
  required: false,
11326
- description: ""
11867
+ description: "The first step of a run was presented \u2014 from `start()` or from a write to `active`."
11327
11868
  },
11328
11869
  {
11329
11870
  name: "finished",
11330
11871
  kind: "output",
11331
11872
  type: "void",
11332
11873
  required: false,
11333
- description: ""
11874
+ 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."
11334
11875
  },
11335
11876
  {
11336
11877
  name: "variant",
@@ -11364,10 +11905,10 @@ placeholder="Name or address\u2026"
11364
11905
  }
11365
11906
  ],
11366
11907
  guidelines: {
11367
- 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`.',
11908
+ 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.',
11368
11909
  dos: [
11369
11910
  "Keep tours short and gate only steps whose gesture teaches something",
11370
- "Handle `skipped`/`finished` and persist them \u2014 the tour holds no storage"
11911
+ "Handle `skipped`/`finished` and persist them \u2014 the tour holds no storage;"
11371
11912
  ],
11372
11913
  donts: [
11373
11914
  "Point steps at elements that may not exist without accepting the skip",
@@ -11392,7 +11933,7 @@ placeholder="Name or address\u2026"
11392
11933
  summary: "",
11393
11934
  description: "",
11394
11935
  category: "layout",
11395
- version: "11.5.0",
11936
+ version: "11.7.0",
11396
11937
  bindings: {
11397
11938
  angular: {
11398
11939
  importPath: "@uni-design-system/uni-angular",
@@ -13814,6 +14355,18 @@ placeholder="Name or address\u2026"
13814
14355
  DarkTheme: "lg"
13815
14356
  }
13816
14357
  },
14358
+ {
14359
+ id: "dialog.behavior.overscroll",
14360
+ value: "contain",
14361
+ type: "string",
14362
+ kind: "behavioral",
14363
+ target: "component-prop",
14364
+ appliesTo: "dialog",
14365
+ themeValues: {
14366
+ LightTheme: "contain",
14367
+ DarkTheme: "contain"
14368
+ }
14369
+ },
13817
14370
  {
13818
14371
  id: "dialog.behavior.elevation",
13819
14372
  value: "dialog",
@@ -14570,6 +15123,42 @@ placeholder="Name or address\u2026"
14570
15123
  DarkTheme: "reveal"
14571
15124
  }
14572
15125
  },
15126
+ {
15127
+ id: "expand.behavior.textRole",
15128
+ value: "label",
15129
+ type: "string",
15130
+ kind: "behavioral",
15131
+ target: "component-prop",
15132
+ appliesTo: "expand",
15133
+ themeValues: {
15134
+ LightTheme: "label",
15135
+ DarkTheme: "label"
15136
+ }
15137
+ },
15138
+ {
15139
+ id: "expand.behavior.sublabelRole",
15140
+ value: "caption",
15141
+ type: "string",
15142
+ kind: "behavioral",
15143
+ target: "component-prop",
15144
+ appliesTo: "expand",
15145
+ themeValues: {
15146
+ LightTheme: "caption",
15147
+ DarkTheme: "caption"
15148
+ }
15149
+ },
15150
+ {
15151
+ id: "expand.behavior.sublabelColor",
15152
+ value: "on-background-variant",
15153
+ type: "string",
15154
+ kind: "behavioral",
15155
+ target: "component-prop",
15156
+ appliesTo: "expand",
15157
+ themeValues: {
15158
+ LightTheme: "on-background-variant",
15159
+ DarkTheme: "on-background-variant"
15160
+ }
15161
+ },
14573
15162
  {
14574
15163
  id: "input.behavior.typeface",
14575
15164
  value: "input",
@@ -15410,6 +15999,30 @@ placeholder="Name or address\u2026"
15410
15999
  DarkTheme: "md"
15411
16000
  }
15412
16001
  },
16002
+ {
16003
+ id: "tagInput.behavior.chipVariant",
16004
+ value: "primary",
16005
+ type: "string",
16006
+ kind: "behavioral",
16007
+ target: "component-prop",
16008
+ appliesTo: "tagInput",
16009
+ themeValues: {
16010
+ LightTheme: "primary",
16011
+ DarkTheme: "primary"
16012
+ }
16013
+ },
16014
+ {
16015
+ id: "tagInput.behavior.chipTone",
16016
+ value: "soft",
16017
+ type: "string",
16018
+ kind: "behavioral",
16019
+ target: "component-prop",
16020
+ appliesTo: "tagInput",
16021
+ themeValues: {
16022
+ LightTheme: "soft",
16023
+ DarkTheme: "soft"
16024
+ }
16025
+ },
15413
16026
  {
15414
16027
  id: "tagInput.behavior.minInputWidth",
15415
16028
  value: "12ch",
@@ -15482,6 +16095,114 @@ placeholder="Name or address\u2026"
15482
16095
  DarkTheme: 8
15483
16096
  }
15484
16097
  },
16098
+ {
16099
+ id: "tagInput.behavior.typeface",
16100
+ value: "label",
16101
+ type: "string",
16102
+ kind: "behavioral",
16103
+ target: "component-prop",
16104
+ appliesTo: "tagInput",
16105
+ themeValues: {
16106
+ LightTheme: "label",
16107
+ DarkTheme: "label"
16108
+ }
16109
+ },
16110
+ {
16111
+ id: "tagInput.behavior.headingTypeface",
16112
+ value: "caption",
16113
+ type: "string",
16114
+ kind: "behavioral",
16115
+ target: "component-prop",
16116
+ appliesTo: "tagInput",
16117
+ themeValues: {
16118
+ LightTheme: "caption",
16119
+ DarkTheme: "caption"
16120
+ }
16121
+ },
16122
+ {
16123
+ id: "tagInput.behavior.listWidth",
16124
+ value: "anchor",
16125
+ type: "string",
16126
+ kind: "behavioral",
16127
+ target: "component-prop",
16128
+ appliesTo: "tagInput",
16129
+ themeValues: {
16130
+ LightTheme: "anchor",
16131
+ DarkTheme: "anchor"
16132
+ }
16133
+ },
16134
+ {
16135
+ id: "contactInput.behavior.avatarSize",
16136
+ value: "md",
16137
+ type: "string",
16138
+ kind: "behavioral",
16139
+ target: "component-prop",
16140
+ appliesTo: "contactInput",
16141
+ themeValues: {
16142
+ LightTheme: "md",
16143
+ DarkTheme: "md"
16144
+ }
16145
+ },
16146
+ {
16147
+ id: "contactInput.behavior.avatarVariant",
16148
+ value: "primary",
16149
+ type: "string",
16150
+ kind: "behavioral",
16151
+ target: "component-prop",
16152
+ appliesTo: "contactInput",
16153
+ themeValues: {
16154
+ LightTheme: "primary",
16155
+ DarkTheme: "primary"
16156
+ }
16157
+ },
16158
+ {
16159
+ id: "contactInput.behavior.nameTypeface",
16160
+ value: "body-2-short",
16161
+ type: "string",
16162
+ kind: "behavioral",
16163
+ target: "component-prop",
16164
+ appliesTo: "contactInput",
16165
+ themeValues: {
16166
+ LightTheme: "body-2-short",
16167
+ DarkTheme: "body-2-short"
16168
+ }
16169
+ },
16170
+ {
16171
+ id: "contactInput.behavior.detailTypeface",
16172
+ value: "caption",
16173
+ type: "string",
16174
+ kind: "behavioral",
16175
+ target: "component-prop",
16176
+ appliesTo: "contactInput",
16177
+ themeValues: {
16178
+ LightTheme: "caption",
16179
+ DarkTheme: "caption"
16180
+ }
16181
+ },
16182
+ {
16183
+ id: "contactInput.behavior.rowGap",
16184
+ value: "sm",
16185
+ type: "string",
16186
+ kind: "behavioral",
16187
+ target: "component-prop",
16188
+ appliesTo: "contactInput",
16189
+ themeValues: {
16190
+ LightTheme: "sm",
16191
+ DarkTheme: "sm"
16192
+ }
16193
+ },
16194
+ {
16195
+ id: "contactInput.behavior.chipAvatar",
16196
+ value: true,
16197
+ type: "boolean",
16198
+ kind: "behavioral",
16199
+ target: "component-prop",
16200
+ appliesTo: "contactInput",
16201
+ themeValues: {
16202
+ LightTheme: true,
16203
+ DarkTheme: true
16204
+ }
16205
+ },
15485
16206
  {
15486
16207
  id: "calendar.behavior.dayBorderRadius",
15487
16208
  value: "max",
@@ -16142,6 +16863,18 @@ placeholder="Name or address\u2026"
16142
16863
  DarkTheme: "sm"
16143
16864
  }
16144
16865
  },
16866
+ {
16867
+ id: "dataTable.behavior.sortIcon",
16868
+ value: "arrowUp",
16869
+ type: "string",
16870
+ kind: "behavioral",
16871
+ target: "component-prop",
16872
+ appliesTo: "dataTable",
16873
+ themeValues: {
16874
+ LightTheme: "arrowUp",
16875
+ DarkTheme: "arrowUp"
16876
+ }
16877
+ },
16145
16878
  {
16146
16879
  id: "dataTable.behavior.tdTextRole",
16147
16880
  value: "title-small",
@@ -16286,6 +17019,18 @@ placeholder="Name or address\u2026"
16286
17019
  DarkTheme: -10
16287
17020
  }
16288
17021
  },
17022
+ {
17023
+ id: "notificationBadge.behavior.typeface",
17024
+ value: "overline",
17025
+ type: "string",
17026
+ kind: "behavioral",
17027
+ target: "component-prop",
17028
+ appliesTo: "notificationBadge",
17029
+ themeValues: {
17030
+ LightTheme: "overline",
17031
+ DarkTheme: "overline"
17032
+ }
17033
+ },
16289
17034
  {
16290
17035
  id: "paginator.behavior.gap",
16291
17036
  value: "xs",
@@ -17464,6 +18209,7 @@ placeholder="Name or address\u2026"
17464
18209
  border: "quaternary",
17465
18210
  padding: "sm",
17466
18211
  inset: "lg",
18212
+ overscroll: "contain",
17467
18213
  elevation: "dialog",
17468
18214
  backdrop: "scrim",
17469
18215
  motion: "panel"
@@ -17546,7 +18292,10 @@ placeholder="Name or address\u2026"
17546
18292
  motion: "panel"
17547
18293
  },
17548
18294
  expand: {
17549
- motion: "reveal"
18295
+ motion: "reveal",
18296
+ textRole: "label",
18297
+ sublabelRole: "caption",
18298
+ sublabelColor: "on-background-variant"
17550
18299
  },
17551
18300
  input: {
17552
18301
  typeface: "input",
@@ -17639,12 +18388,25 @@ placeholder="Name or address\u2026"
17639
18388
  tagInput: {
17640
18389
  chipGap: "xs",
17641
18390
  chipSize: "md",
18391
+ chipVariant: "primary",
18392
+ chipTone: "soft",
17642
18393
  minInputWidth: "12ch",
17643
18394
  listColor: "primary-surface",
17644
18395
  listShadow: "menu",
17645
18396
  listBorderRadius: "xs",
17646
18397
  activeColor: "primary-container",
17647
- maxSuggestions: 8
18398
+ maxSuggestions: 8,
18399
+ typeface: "label",
18400
+ headingTypeface: "caption",
18401
+ listWidth: "anchor"
18402
+ },
18403
+ contactInput: {
18404
+ avatarSize: "md",
18405
+ avatarVariant: "primary",
18406
+ nameTypeface: "body-2-short",
18407
+ detailTypeface: "caption",
18408
+ rowGap: "sm",
18409
+ chipAvatar: true
17648
18410
  },
17649
18411
  calendar: {
17650
18412
  dayBorderRadius: "max",
@@ -17722,6 +18484,7 @@ placeholder="Name or address\u2026"
17722
18484
  thVerticalBorder: "dotted",
17723
18485
  thHorizontalBorder: "light",
17724
18486
  thPadding: "sm",
18487
+ sortIcon: "arrowUp",
17725
18488
  tdTextRole: "title-small",
17726
18489
  tdColor: "primary-surface",
17727
18490
  tdStickyColor: "primary-container",
@@ -17735,7 +18498,8 @@ placeholder="Name or address\u2026"
17735
18498
  },
17736
18499
  notificationBadge: {
17737
18500
  borderRadius: "sm",
17738
- offset: -10
18501
+ offset: -10,
18502
+ typeface: "overline"
17739
18503
  },
17740
18504
  paginator: {
17741
18505
  gap: "xs",
@@ -18078,6 +18842,7 @@ placeholder="Name or address\u2026"
18078
18842
  border: "quaternary",
18079
18843
  padding: "sm",
18080
18844
  inset: "lg",
18845
+ overscroll: "contain",
18081
18846
  elevation: "dialog",
18082
18847
  backdrop: "scrim",
18083
18848
  motion: "panel"
@@ -18160,7 +18925,10 @@ placeholder="Name or address\u2026"
18160
18925
  motion: "panel"
18161
18926
  },
18162
18927
  expand: {
18163
- motion: "reveal"
18928
+ motion: "reveal",
18929
+ textRole: "label",
18930
+ sublabelRole: "caption",
18931
+ sublabelColor: "on-background-variant"
18164
18932
  },
18165
18933
  input: {
18166
18934
  typeface: "input",
@@ -18253,12 +19021,25 @@ placeholder="Name or address\u2026"
18253
19021
  tagInput: {
18254
19022
  chipGap: "xs",
18255
19023
  chipSize: "md",
19024
+ chipVariant: "primary",
19025
+ chipTone: "soft",
18256
19026
  minInputWidth: "12ch",
18257
19027
  listColor: "primary-surface",
18258
19028
  listShadow: "menu",
18259
19029
  listBorderRadius: "xs",
18260
19030
  activeColor: "primary-container",
18261
- maxSuggestions: 8
19031
+ maxSuggestions: 8,
19032
+ typeface: "label",
19033
+ headingTypeface: "caption",
19034
+ listWidth: "anchor"
19035
+ },
19036
+ contactInput: {
19037
+ avatarSize: "md",
19038
+ avatarVariant: "primary",
19039
+ nameTypeface: "body-2-short",
19040
+ detailTypeface: "caption",
19041
+ rowGap: "sm",
19042
+ chipAvatar: true
18262
19043
  },
18263
19044
  calendar: {
18264
19045
  dayBorderRadius: "max",
@@ -18336,6 +19117,7 @@ placeholder="Name or address\u2026"
18336
19117
  thVerticalBorder: "dotted",
18337
19118
  thHorizontalBorder: "light",
18338
19119
  thPadding: "sm",
19120
+ sortIcon: "arrowUp",
18339
19121
  tdTextRole: "title-small",
18340
19122
  tdColor: "primary-surface",
18341
19123
  tdStickyColor: "primary-container",
@@ -18349,7 +19131,8 @@ placeholder="Name or address\u2026"
18349
19131
  },
18350
19132
  notificationBadge: {
18351
19133
  borderRadius: "sm",
18352
- offset: -10
19134
+ offset: -10,
19135
+ typeface: "overline"
18353
19136
  },
18354
19137
  paginator: {
18355
19138
  gap: "xs",
@@ -18457,6 +19240,36 @@ placeholder="Name or address\u2026"
18457
19240
  {
18458
19241
  package: "@uni-design-system/uni-angular",
18459
19242
  releases: [
19243
+ {
19244
+ version: "11.7.0",
19245
+ entries: [
19246
+ {
19247
+ bump: "minor",
19248
+ title: "Data table refinements from the Wellsourced adoption.",
19249
+ 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.',
19250
+ commit: "ffe2080"
19251
+ },
19252
+ {
19253
+ bump: "minor",
19254
+ 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.',
19255
+ 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.",
19256
+ commit: "9ff14bc"
19257
+ }
19258
+ ],
19259
+ dependencyBumps: []
19260
+ },
19261
+ {
19262
+ version: "11.6.0",
19263
+ entries: [
19264
+ {
19265
+ bump: "minor",
19266
+ title: "Add `uni-contact-input`, a recipient field for picking people, and close the gaps that kept `uni-tag-input` from being an email client's To row.",
19267
+ body: "- **`uni-contact-input`** (new): chips plus a contact list that opens on focus, filters by name or address, groups under headings, and draws each row as a person (avatar, name, address, note). ArrowDown and Enter pick a match (`autoHighlight` makes Enter or Tab pick the first one without arrowing), Backspace removes the last person, and a typo stays in the field while `(rejected)` reports it. `allowCustom` controls whether typed addresses are accepted; `unframed` drops the field chrome. Themed through the new `contactInput` entry.\n- **`uni-tag-input`**: `uniTagSuggestion` row template; `group` headings and `avatarName` on suggestions; `openOnFocus`, `autoHighlight`, `backspaceRemoves`, `keepInvalidText`, `unframed` and `autocomplete` inputs; an undebounced `draftChange` output; a public `focus()`; `chipVariant` and `chipTone` theme options, so a theme sets the chip look once (`tagVariant` / `tagTone` still override per field). The default suggestion row now paints `description` (previously screen-reader only) and an avatar when one is given. The field opts out of password managers, and the first Escape that closes the list no longer reaches an enclosing dialog.\n- **Listbox popups** (`tagInput`, `combobox`, `searchInput`, `timeInput`): `typeface` and `listWidth` theme options. Defaults are unchanged (`label`, field width).\n- **`uni-combobox`, `uni-search-input`**: `openOnFocus` input.\n- **`uni-tag`**: an avatar image that fails to load now falls back to the `avatarName` initials.",
19268
+ commit: "3a41065"
19269
+ }
19270
+ ],
19271
+ dependencyBumps: []
19272
+ },
18460
19273
  {
18461
19274
  version: "11.5.0",
18462
19275
  entries: [
@@ -19403,6 +20216,36 @@ placeholder="Name or address\u2026"
19403
20216
  {
19404
20217
  package: "@uni-design-system/uni-core",
19405
20218
  releases: [
20219
+ {
20220
+ version: "11.7.0",
20221
+ entries: [
20222
+ {
20223
+ bump: "minor",
20224
+ title: "Data table refinements from the Wellsourced adoption.",
20225
+ 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.',
20226
+ commit: "ffe2080"
20227
+ },
20228
+ {
20229
+ bump: "minor",
20230
+ 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.',
20231
+ 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.",
20232
+ commit: "9ff14bc"
20233
+ }
20234
+ ],
20235
+ dependencyBumps: []
20236
+ },
20237
+ {
20238
+ version: "11.6.0",
20239
+ entries: [
20240
+ {
20241
+ bump: "minor",
20242
+ title: "Add `uni-contact-input`, a recipient field for picking people, and close the gaps that kept `uni-tag-input` from being an email client's To row.",
20243
+ body: "- **`uni-contact-input`** (new): chips plus a contact list that opens on focus, filters by name or address, groups under headings, and draws each row as a person (avatar, name, address, note). ArrowDown and Enter pick a match (`autoHighlight` makes Enter or Tab pick the first one without arrowing), Backspace removes the last person, and a typo stays in the field while `(rejected)` reports it. `allowCustom` controls whether typed addresses are accepted; `unframed` drops the field chrome. Themed through the new `contactInput` entry.\n- **`uni-tag-input`**: `uniTagSuggestion` row template; `group` headings and `avatarName` on suggestions; `openOnFocus`, `autoHighlight`, `backspaceRemoves`, `keepInvalidText`, `unframed` and `autocomplete` inputs; an undebounced `draftChange` output; a public `focus()`; `chipVariant` and `chipTone` theme options, so a theme sets the chip look once (`tagVariant` / `tagTone` still override per field). The default suggestion row now paints `description` (previously screen-reader only) and an avatar when one is given. The field opts out of password managers, and the first Escape that closes the list no longer reaches an enclosing dialog.\n- **Listbox popups** (`tagInput`, `combobox`, `searchInput`, `timeInput`): `typeface` and `listWidth` theme options. Defaults are unchanged (`label`, field width).\n- **`uni-combobox`, `uni-search-input`**: `openOnFocus` input.\n- **`uni-tag`**: an avatar image that fails to load now falls back to the `avatarName` initials.",
20244
+ commit: "3a41065"
20245
+ }
20246
+ ],
20247
+ dependencyBumps: []
20248
+ },
19406
20249
  {
19407
20250
  version: "11.5.0",
19408
20251
  entries: [
@@ -20074,6 +20917,16 @@ placeholder="Name or address\u2026"
20074
20917
  {
20075
20918
  package: "@uni-design-system/uni-react",
20076
20919
  releases: [
20920
+ {
20921
+ version: "11.7.0",
20922
+ entries: [],
20923
+ dependencyBumps: []
20924
+ },
20925
+ {
20926
+ version: "11.6.0",
20927
+ entries: [],
20928
+ dependencyBumps: []
20929
+ },
20077
20930
  {
20078
20931
  version: "11.5.0",
20079
20932
  entries: [],
@@ -20380,6 +21233,16 @@ placeholder="Name or address\u2026"
20380
21233
  {
20381
21234
  package: "@uni-design-system/uni-mcp",
20382
21235
  releases: [
21236
+ {
21237
+ version: "11.7.0",
21238
+ entries: [],
21239
+ dependencyBumps: []
21240
+ },
21241
+ {
21242
+ version: "11.6.0",
21243
+ entries: [],
21244
+ dependencyBumps: []
21245
+ },
20383
21246
  {
20384
21247
  version: "11.5.0",
20385
21248
  entries: [
@@ -20644,7 +21507,7 @@ placeholder="Name or address\u2026"
20644
21507
  summary: "Returns a document-unique id for wiring ARIA relationships (aria-controls, aria-describedby, aria-labelledby, ...).",
20645
21508
  description: "Returns a document-unique id for wiring ARIA relationships (aria-controls, aria-describedby, aria-labelledby, ...).",
20646
21509
  members: [],
20647
- version: "11.5.0"
21510
+ version: "11.7.0"
20648
21511
  },
20649
21512
  {
20650
21513
  id: "focusable-selector",
@@ -20656,7 +21519,7 @@ placeholder="Name or address\u2026"
20656
21519
  summary: "Selector matching natively focusable elements.",
20657
21520
  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.",
20658
21521
  members: [],
20659
- version: "11.5.0"
21522
+ version: "11.7.0"
20660
21523
  },
20661
21524
  {
20662
21525
  id: "resolve-focus-target",
@@ -20668,7 +21531,7 @@ placeholder="Name or address\u2026"
20668
21531
  summary: "Resolves the element that should carry ARIA state for a trigger: the element itself when focusable, otherwise its first focusable descendant.",
20669
21532
  description: "Resolves the element that should carry ARIA state for a trigger: the element itself when focusable, otherwise its first focusable descendant.",
20670
21533
  members: [],
20671
- version: "11.5.0"
21534
+ version: "11.7.0"
20672
21535
  },
20673
21536
  {
20674
21537
  id: "visually-hidden",
@@ -20680,7 +21543,7 @@ placeholder="Name or address\u2026"
20680
21543
  summary: "Visually hides content while keeping it available to screen readers.",
20681
21544
  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.",
20682
21545
  members: [],
20683
- version: "11.5.0"
21546
+ version: "11.7.0"
20684
21547
  },
20685
21548
  {
20686
21549
  id: "motion-safe",
@@ -20692,7 +21555,7 @@ placeholder="Name or address\u2026"
20692
21555
  summary: "Wraps animation/transition styles so they only apply when the user has not requested reduced motion (WCAG 2.3.3).",
20693
21556
  description: "Wraps animation/transition styles so they only apply when the user has not requested reduced motion (WCAG 2.3.3).",
20694
21557
  members: [],
20695
- version: "11.5.0"
21558
+ version: "11.7.0"
20696
21559
  },
20697
21560
  {
20698
21561
  id: "announcer",
@@ -20717,7 +21580,7 @@ placeholder="Name or address\u2026"
20717
21580
  description: "Announce `text`, even when it repeats what was just announced."
20718
21581
  }
20719
21582
  ],
20720
- version: "11.5.0"
21583
+ version: "11.7.0"
20721
21584
  },
20722
21585
  {
20723
21586
  id: "create-announcer",
@@ -20729,7 +21592,7 @@ placeholder="Name or address\u2026"
20729
21592
  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.",
20730
21593
  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.",
20731
21594
  members: [],
20732
- version: "11.5.0"
21595
+ version: "11.7.0"
20733
21596
  },
20734
21597
  {
20735
21598
  id: "uni-date",
@@ -20741,7 +21604,7 @@ placeholder="Name or address\u2026"
20741
21604
  summary: "A calendar date, `'YYYY-MM-DD'`.",
20742
21605
  description: "A calendar date, `'YYYY-MM-DD'`.",
20743
21606
  members: [],
20744
- version: "11.5.0"
21607
+ version: "11.7.0"
20745
21608
  },
20746
21609
  {
20747
21610
  id: "uni-time",
@@ -20753,7 +21616,7 @@ placeholder="Name or address\u2026"
20753
21616
  summary: "A wall-clock time, `'HH:mm'` (24-hour).",
20754
21617
  description: "A wall-clock time, `'HH:mm'` (24-hour). Display format is separate.",
20755
21618
  members: [],
20756
- version: "11.5.0"
21619
+ version: "11.7.0"
20757
21620
  },
20758
21621
  {
20759
21622
  id: "uni-date-time",
@@ -20765,7 +21628,7 @@ placeholder="Name or address\u2026"
20765
21628
  summary: "A combined date and time, `'YYYY-MM-DDTHH:mm'`.",
20766
21629
  description: "A combined date and time, `'YYYY-MM-DDTHH:mm'`.",
20767
21630
  members: [],
20768
- version: "11.5.0"
21631
+ version: "11.7.0"
20769
21632
  },
20770
21633
  {
20771
21634
  id: "uni-date-range",
@@ -20790,7 +21653,7 @@ placeholder="Name or address\u2026"
20790
21653
  description: ""
20791
21654
  }
20792
21655
  ],
20793
- version: "11.5.0"
21656
+ version: "11.7.0"
20794
21657
  },
20795
21658
  {
20796
21659
  id: "iso-date",
@@ -20802,7 +21665,7 @@ placeholder="Name or address\u2026"
20802
21665
  summary: "`(2026, 8, 5)` \u2192 `'2026-08-05'`.",
20803
21666
  description: "`(2026, 8, 5)` \u2192 `'2026-08-05'`. Does not validate \u2014 see `isValidDate`.",
20804
21667
  members: [],
20805
- version: "11.5.0"
21668
+ version: "11.7.0"
20806
21669
  },
20807
21670
  {
20808
21671
  id: "is-valid-date",
@@ -20814,7 +21677,7 @@ placeholder="Name or address\u2026"
20814
21677
  summary: "The ISO date when the parts form a real calendar day, else `null`.",
20815
21678
  description: "The ISO date when the parts form a real calendar day, else `null`.",
20816
21679
  members: [],
20817
- version: "11.5.0"
21680
+ version: "11.7.0"
20818
21681
  },
20819
21682
  {
20820
21683
  id: "days-in-month",
@@ -20826,7 +21689,7 @@ placeholder="Name or address\u2026"
20826
21689
  summary: "Days in a month, leap-year aware.",
20827
21690
  description: "Days in a month, leap-year aware.",
20828
21691
  members: [],
20829
- version: "11.5.0"
21692
+ version: "11.7.0"
20830
21693
  },
20831
21694
  {
20832
21695
  id: "add-days",
@@ -20838,7 +21701,7 @@ placeholder="Name or address\u2026"
20838
21701
  summary: "",
20839
21702
  description: "",
20840
21703
  members: [],
20841
- version: "11.5.0"
21704
+ version: "11.7.0"
20842
21705
  },
20843
21706
  {
20844
21707
  id: "add-months",
@@ -20850,7 +21713,7 @@ placeholder="Name or address\u2026"
20850
21713
  summary: "Same day \xB1 n months, clamping the day to the target month's length.",
20851
21714
  description: "Same day \xB1 n months, clamping the day to the target month's length.",
20852
21715
  members: [],
20853
- version: "11.5.0"
21716
+ version: "11.7.0"
20854
21717
  },
20855
21718
  {
20856
21719
  id: "day-of-week",
@@ -20862,7 +21725,7 @@ placeholder="Name or address\u2026"
20862
21725
  summary: "Day of week, 0 = Sunday \u2026 6 = Saturday.",
20863
21726
  description: "Day of week, 0 = Sunday \u2026 6 = Saturday.",
20864
21727
  members: [],
20865
- version: "11.5.0"
21728
+ version: "11.7.0"
20866
21729
  },
20867
21730
  {
20868
21731
  id: "month-of",
@@ -20874,7 +21737,7 @@ placeholder="Name or address\u2026"
20874
21737
  summary: "`'2026-08-20'` \u2192 `'2026-08'`.",
20875
21738
  description: "`'2026-08-20'` \u2192 `'2026-08'`.",
20876
21739
  members: [],
20877
- version: "11.5.0"
21740
+ version: "11.7.0"
20878
21741
  },
20879
21742
  {
20880
21743
  id: "today-iso",
@@ -20886,7 +21749,7 @@ placeholder="Name or address\u2026"
20886
21749
  summary: "Today as a local-wall-clock ISO date (the one place local time matters).",
20887
21750
  description: "Today as a local-wall-clock ISO date (the one place local time matters).",
20888
21751
  members: [],
20889
- version: "11.5.0"
21752
+ version: "11.7.0"
20890
21753
  },
20891
21754
  {
20892
21755
  id: "inclusive-day-count",
@@ -20898,7 +21761,7 @@ placeholder="Name or address\u2026"
20898
21761
  summary: "Inclusive day count of a range: `('-20', '-24')` \u2192 5.",
20899
21762
  description: "Inclusive day count of a range: `('-20', '-24')` \u2192 5.",
20900
21763
  members: [],
20901
- version: "11.5.0"
21764
+ version: "11.7.0"
20902
21765
  },
20903
21766
  {
20904
21767
  id: "uni-month-grid-cell",
@@ -20923,7 +21786,7 @@ placeholder="Name or address\u2026"
20923
21786
  description: "True for leading/trailing cells that belong to the adjacent months."
20924
21787
  }
20925
21788
  ],
20926
- version: "11.5.0"
21789
+ version: "11.7.0"
20927
21790
  },
20928
21791
  {
20929
21792
  id: "build-month-grid",
@@ -20935,7 +21798,7 @@ placeholder="Name or address\u2026"
20935
21798
  summary: "The week matrix a calendar renders: full weeks covering `'YYYY-MM'`, starting on `weekStart` (0 = Sunday).",
20936
21799
  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.",
20937
21800
  members: [],
20938
- version: "11.5.0"
21801
+ version: "11.7.0"
20939
21802
  },
20940
21803
  {
20941
21804
  id: "format-date",
@@ -20947,7 +21810,7 @@ placeholder="Name or address\u2026"
20947
21810
  summary: "",
20948
21811
  description: "",
20949
21812
  members: [],
20950
- version: "11.5.0"
21813
+ version: "11.7.0"
20951
21814
  },
20952
21815
  {
20953
21816
  id: "format-month-heading",
@@ -20959,7 +21822,7 @@ placeholder="Name or address\u2026"
20959
21822
  summary: "`'2026-08'` \u2192 `'August 2026'` in the locale.",
20960
21823
  description: "`'2026-08'` \u2192 `'August 2026'` in the locale.",
20961
21824
  members: [],
20962
- version: "11.5.0"
21825
+ version: "11.7.0"
20963
21826
  },
20964
21827
  {
20965
21828
  id: "uni-weekday-name",
@@ -20984,7 +21847,7 @@ placeholder="Name or address\u2026"
20984
21847
  description: "Full weekday name, for the columnheader's `abbr`."
20985
21848
  }
20986
21849
  ],
20987
- version: "11.5.0"
21850
+ version: "11.7.0"
20988
21851
  },
20989
21852
  {
20990
21853
  id: "weekday-names",
@@ -20996,7 +21859,7 @@ placeholder="Name or address\u2026"
20996
21859
  summary: "Weekday header labels starting at `weekStart` (0 = Sunday).",
20997
21860
  description: "Weekday header labels starting at `weekStart` (0 = Sunday).",
20998
21861
  members: [],
20999
- version: "11.5.0"
21862
+ version: "11.7.0"
21000
21863
  },
21001
21864
  {
21002
21865
  id: "format-time",
@@ -21008,7 +21871,7 @@ placeholder="Name or address\u2026"
21008
21871
  summary: "`'15:00'` \u2192 `'3:00 PM'` (or `'15:00'` when `hour12` is false).",
21009
21872
  description: "`'15:00'` \u2192 `'3:00 PM'` (or `'15:00'` when `hour12` is false).",
21010
21873
  members: [],
21011
- version: "11.5.0"
21874
+ version: "11.7.0"
21012
21875
  },
21013
21876
  {
21014
21877
  id: "locale-week-start",
@@ -21020,7 +21883,7 @@ placeholder="Name or address\u2026"
21020
21883
  summary: "The locale's first day of week, 0 = Sunday \u2026 6 = Saturday.",
21021
21884
  description: "The locale's first day of week, 0 = Sunday \u2026 6 = Saturday. Falls back to Sunday where `Intl.Locale` week info is unavailable.",
21022
21885
  members: [],
21023
- version: "11.5.0"
21886
+ version: "11.7.0"
21024
21887
  },
21025
21888
  {
21026
21889
  id: "locale-default-hour12",
@@ -21032,7 +21895,7 @@ placeholder="Name or address\u2026"
21032
21895
  summary: "Whether the locale's default clock is 12-hour.",
21033
21896
  description: "Whether the locale's default clock is 12-hour.",
21034
21897
  members: [],
21035
- version: "11.5.0"
21898
+ version: "11.7.0"
21036
21899
  },
21037
21900
  {
21038
21901
  id: "locale-field-order",
@@ -21044,7 +21907,7 @@ placeholder="Name or address\u2026"
21044
21907
  summary: "The locale's numeric-date field order, e.g.",
21045
21908
  description: "The locale's numeric-date field order, e.g. en-US \u2192 month, day, year.",
21046
21909
  members: [],
21047
- version: "11.5.0"
21910
+ version: "11.7.0"
21048
21911
  },
21049
21912
  {
21050
21913
  id: "locale-month-names",
@@ -21056,7 +21919,7 @@ placeholder="Name or address\u2026"
21056
21919
  summary: "Long + short month names \u2192 month number, lowercased, dots stripped.",
21057
21920
  description: "Long + short month names \u2192 month number, lowercased, dots stripped.",
21058
21921
  members: [],
21059
- version: "11.5.0"
21922
+ version: "11.7.0"
21060
21923
  },
21061
21924
  {
21062
21925
  id: "locale-date-placeholder",
@@ -21068,7 +21931,7 @@ placeholder="Name or address\u2026"
21068
21931
  summary: "The locale's digit pattern as a placeholder, e.g.",
21069
21932
  description: "The locale's digit pattern as a placeholder, e.g. `'MM/DD/YYYY'`.",
21070
21933
  members: [],
21071
- version: "11.5.0"
21934
+ version: "11.7.0"
21072
21935
  },
21073
21936
  {
21074
21937
  id: "parse-date-text",
@@ -21080,7 +21943,7 @@ placeholder="Name or address\u2026"
21080
21943
  summary: "Free-typed date text \u2192 ISO date, or `null` when unreadable.",
21081
21944
  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.",
21082
21945
  members: [],
21083
- version: "11.5.0"
21946
+ version: "11.7.0"
21084
21947
  },
21085
21948
  {
21086
21949
  id: "parse-time-text",
@@ -21092,7 +21955,7 @@ placeholder="Name or address\u2026"
21092
21955
  summary: "Free-typed time text \u2192 `'HH:mm'`, or `null`.",
21093
21956
  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.",
21094
21957
  members: [],
21095
- version: "11.5.0"
21958
+ version: "11.7.0"
21096
21959
  },
21097
21960
  {
21098
21961
  id: "time-slots",
@@ -21104,7 +21967,7 @@ placeholder="Name or address\u2026"
21104
21967
  summary: "Every `minuteStep` time between `min` and `max` (inclusive bounds).",
21105
21968
  description: "Every `minuteStep` time between `min` and `max` (inclusive bounds).",
21106
21969
  members: [],
21107
- version: "11.5.0"
21970
+ version: "11.7.0"
21108
21971
  },
21109
21972
  {
21110
21973
  id: "split-date-time",
@@ -21116,7 +21979,7 @@ placeholder="Name or address\u2026"
21116
21979
  summary: "",
21117
21980
  description: "",
21118
21981
  members: [],
21119
- version: "11.5.0"
21982
+ version: "11.7.0"
21120
21983
  },
21121
21984
  {
21122
21985
  id: "join-date-time",
@@ -21128,7 +21991,7 @@ placeholder="Name or address\u2026"
21128
21991
  summary: "One combined value only when both parts are present.",
21129
21992
  description: "One combined value only when both parts are present.",
21130
21993
  members: [],
21131
- version: "11.5.0"
21994
+ version: "11.7.0"
21132
21995
  },
21133
21996
  {
21134
21997
  id: "uni-number-range",
@@ -21153,7 +22016,7 @@ placeholder="Name or address\u2026"
21153
22016
  description: ""
21154
22017
  }
21155
22018
  ],
21156
- version: "11.5.0"
22019
+ version: "11.7.0"
21157
22020
  },
21158
22021
  {
21159
22022
  id: "uni-rounding-mode",
@@ -21165,7 +22028,7 @@ placeholder="Name or address\u2026"
21165
22028
  summary: "How a tie is resolved when rounding to a fraction-digit count.",
21166
22029
  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`).",
21167
22030
  members: [],
21168
- version: "11.5.0"
22031
+ version: "11.7.0"
21169
22032
  },
21170
22033
  {
21171
22034
  id: "uni-number-preset",
@@ -21177,7 +22040,7 @@ placeholder="Name or address\u2026"
21177
22040
  summary: "Format archetype.",
21178
22041
  description: "Format archetype. Supplies decimals, grouping, affix and `inputmode`.",
21179
22042
  members: [],
21180
- version: "11.5.0"
22043
+ version: "11.7.0"
21181
22044
  },
21182
22045
  {
21183
22046
  id: "uni-number-grouping",
@@ -21189,7 +22052,7 @@ placeholder="Name or address\u2026"
21189
22052
  summary: "Thousands-separator policy, mapped onto `Intl`'s `useGrouping`.",
21190
22053
  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`.",
21191
22054
  members: [],
21192
- version: "11.5.0"
22055
+ version: "11.7.0"
21193
22056
  },
21194
22057
  {
21195
22058
  id: "uni-number-reject-reason",
@@ -21201,7 +22064,7 @@ placeholder="Name or address\u2026"
21201
22064
  summary: "Why a typed commit was refused.",
21202
22065
  description: "Why a typed commit was refused. The raw text stays in the field.",
21203
22066
  members: [],
21204
- version: "11.5.0"
22067
+ version: "11.7.0"
21205
22068
  },
21206
22069
  {
21207
22070
  id: "uni-number-step-config",
@@ -21244,7 +22107,7 @@ placeholder="Name or address\u2026"
21244
22107
  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`."
21245
22108
  }
21246
22109
  ],
21247
- version: "11.5.0"
22110
+ version: "11.7.0"
21248
22111
  },
21249
22112
  {
21250
22113
  id: "uni-number-clamp",
@@ -21269,7 +22132,7 @@ placeholder="Name or address\u2026"
21269
22132
  description: "Which fence was hit, or `null` when the value was already in range."
21270
22133
  }
21271
22134
  ],
21272
- version: "11.5.0"
22135
+ version: "11.7.0"
21273
22136
  },
21274
22137
  {
21275
22138
  id: "uni-locale-number-parts",
@@ -21312,7 +22175,7 @@ placeholder="Name or address\u2026"
21312
22175
  description: "Fraction digits `Intl` uses for the currency \u2014 JPY 0, USD 2."
21313
22176
  }
21314
22177
  ],
21315
- version: "11.5.0"
22178
+ version: "11.7.0"
21316
22179
  },
21317
22180
  {
21318
22181
  id: "uni-number-format-config",
@@ -21397,7 +22260,7 @@ placeholder="Name or address\u2026"
21397
22260
  description: "Spoken long form of an abbreviated suffix, for `aria-valuetext`."
21398
22261
  }
21399
22262
  ],
21400
- version: "11.5.0"
22263
+ version: "11.7.0"
21401
22264
  },
21402
22265
  {
21403
22266
  id: "uni-resolved-number-format",
@@ -21488,7 +22351,7 @@ placeholder="Name or address\u2026"
21488
22351
  description: ""
21489
22352
  }
21490
22353
  ],
21491
- version: "11.5.0"
22354
+ version: "11.7.0"
21492
22355
  },
21493
22356
  {
21494
22357
  id: "uni-number-parse-result",
@@ -21500,7 +22363,7 @@ placeholder="Name or address\u2026"
21500
22363
  summary: "The outcome of reading a user's text.",
21501
22364
  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.",
21502
22365
  members: [],
21503
- version: "11.5.0"
22366
+ version: "11.7.0"
21504
22367
  },
21505
22368
  {
21506
22369
  id: "is-canonical-decimal",
@@ -21512,7 +22375,7 @@ placeholder="Name or address\u2026"
21512
22375
  summary: "True when `text` is already a canonical decimal (leading/trailing space allowed).",
21513
22376
  description: "True when `text` is already a canonical decimal (leading/trailing space allowed).",
21514
22377
  members: [],
21515
- version: "11.5.0"
22378
+ version: "11.7.0"
21516
22379
  },
21517
22380
  {
21518
22381
  id: "decimal-scale",
@@ -21524,7 +22387,7 @@ placeholder="Name or address\u2026"
21524
22387
  summary: "Fraction-digit count.",
21525
22388
  description: "Fraction-digit count. `'1.250'` \u2192 3, `'12'` \u2192 0, `'5.'` \u2192 0.",
21526
22389
  members: [],
21527
- version: "11.5.0"
22390
+ version: "11.7.0"
21528
22391
  },
21529
22392
  {
21530
22393
  id: "to-scaled",
@@ -21536,7 +22399,7 @@ placeholder="Name or address\u2026"
21536
22399
  summary: "Canonical decimal \u2192 integer scaled by `10^scale`.",
21537
22400
  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)`.",
21538
22401
  members: [],
21539
- version: "11.5.0"
22402
+ version: "11.7.0"
21540
22403
  },
21541
22404
  {
21542
22405
  id: "from-scaled",
@@ -21548,7 +22411,7 @@ placeholder="Name or address\u2026"
21548
22411
  summary: "Scaled integer \u2192 canonical decimal, with trailing fraction zeros trimmed.",
21549
22412
  description: "Scaled integer \u2192 canonical decimal, with trailing fraction zeros trimmed.",
21550
22413
  members: [],
21551
- version: "11.5.0"
22414
+ version: "11.7.0"
21552
22415
  },
21553
22416
  {
21554
22417
  id: "normalize-decimal",
@@ -21560,7 +22423,7 @@ placeholder="Name or address\u2026"
21560
22423
  summary: "Strip a leading `+`, leading zeros and trailing fraction zeros: `'+01.50'` \u2192 `'1.5'`.",
21561
22424
  description: "Strip a leading `+`, leading zeros and trailing fraction zeros: `'+01.50'` \u2192 `'1.5'`. Requires a canonical decimal; guard with `isCanonicalDecimal`.",
21562
22425
  members: [],
21563
- version: "11.5.0"
22426
+ version: "11.7.0"
21564
22427
  },
21565
22428
  {
21566
22429
  id: "to-decimal",
@@ -21572,7 +22435,7 @@ placeholder="Name or address\u2026"
21572
22435
  summary: "Any numeric input \u2192 canonical decimal, expanding the exponential notation `String(number)` produces outside 1e-7\u20261e21.",
21573
22436
  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.",
21574
22437
  members: [],
21575
- version: "11.5.0"
22438
+ version: "11.7.0"
21576
22439
  },
21577
22440
  {
21578
22441
  id: "compare-decimal",
@@ -21584,7 +22447,7 @@ placeholder="Name or address\u2026"
21584
22447
  summary: "`-1` when `a < b`, `1` when `a > b`, `0` when equal.",
21585
22448
  description: "`-1` when `a < b`, `1` when `a > b`, `0` when equal. `'1.50'` equals `'1.5'`.",
21586
22449
  members: [],
21587
- version: "11.5.0"
22450
+ version: "11.7.0"
21588
22451
  },
21589
22452
  {
21590
22453
  id: "round-decimal",
@@ -21596,7 +22459,7 @@ placeholder="Name or address\u2026"
21596
22459
  summary: "Round to `fractionDigits`, breaking ties per `mode`.",
21597
22460
  description: "Round to `fractionDigits`, breaking ties per `mode`. Exact where `Number.prototype.toFixed` is not \u2014 see the file header.",
21598
22461
  members: [],
21599
- version: "11.5.0"
22462
+ version: "11.7.0"
21600
22463
  },
21601
22464
  {
21602
22465
  id: "shift-decimal",
@@ -21608,7 +22471,7 @@ placeholder="Name or address\u2026"
21608
22471
  summary: "Multiply by `10^places`, exactly.",
21609
22472
  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.",
21610
22473
  members: [],
21611
- version: "11.5.0"
22474
+ version: "11.7.0"
21612
22475
  },
21613
22476
  {
21614
22477
  id: "clamp-decimal",
@@ -21620,7 +22483,7 @@ placeholder="Name or address\u2026"
21620
22483
  summary: "Hold a value inside its fences, reporting which one it hit so the caller can announce it.",
21621
22484
  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.",
21622
22485
  members: [],
21623
- version: "11.5.0"
22486
+ version: "11.7.0"
21624
22487
  },
21625
22488
  {
21626
22489
  id: "step-decimal",
@@ -21632,7 +22495,7 @@ placeholder="Name or address\u2026"
21632
22495
  summary: "One step from `current`, in `direction` (`1` up, `-1` down).",
21633
22496
  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.",
21634
22497
  members: [],
21635
- version: "11.5.0"
22498
+ version: "11.7.0"
21636
22499
  },
21637
22500
  {
21638
22501
  id: "locale-number-parts",
@@ -21644,7 +22507,7 @@ placeholder="Name or address\u2026"
21644
22507
  summary: "Locale separators plus, when a currency is given, its symbol, side and fraction digits.",
21645
22508
  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.",
21646
22509
  members: [],
21647
- version: "11.5.0"
22510
+ version: "11.7.0"
21648
22511
  },
21649
22512
  {
21650
22513
  id: "to-ascii-digits",
@@ -21656,7 +22519,7 @@ placeholder="Name or address\u2026"
21656
22519
  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`.",
21657
22520
  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`.",
21658
22521
  members: [],
21659
- version: "11.5.0"
22522
+ version: "11.7.0"
21660
22523
  },
21661
22524
  {
21662
22525
  id: "evaluate-expression",
@@ -21668,7 +22531,7 @@ placeholder="Name or address\u2026"
21668
22531
  summary: "Evaluate `+ \u2212 \xD7 \xF7 ( )` over decimal literals \u2014 shunting-yard, roughly thirty lines, and **never `eval`**.",
21669
22532
  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.",
21670
22533
  members: [],
21671
- version: "11.5.0"
22534
+ version: "11.7.0"
21672
22535
  },
21673
22536
  {
21674
22537
  id: "resolve-number-format",
@@ -21680,7 +22543,7 @@ placeholder="Name or address\u2026"
21680
22543
  summary: "Fill in every preset, locale and currency default.",
21681
22544
  description: "Fill in every preset, locale and currency default.",
21682
22545
  members: [],
21683
- version: "11.5.0"
22546
+ version: "11.7.0"
21684
22547
  },
21685
22548
  {
21686
22549
  id: "parse-number",
@@ -21692,7 +22555,7 @@ placeholder="Name or address\u2026"
21692
22555
  summary: "Read a user's text into a canonical decimal in **model units**.",
21693
22556
  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.",
21694
22557
  members: [],
21695
- version: "11.5.0"
22558
+ version: "11.7.0"
21696
22559
  },
21697
22560
  {
21698
22561
  id: "format-number",
@@ -21704,7 +22567,7 @@ placeholder="Name or address\u2026"
21704
22567
  summary: "Canonical decimal (model units) \u2192 the display number, without affixes.",
21705
22568
  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`.",
21706
22569
  members: [],
21707
- version: "11.5.0"
22570
+ version: "11.7.0"
21708
22571
  },
21709
22572
  {
21710
22573
  id: "raw-number-text",
@@ -21716,7 +22579,7 @@ placeholder="Name or address\u2026"
21716
22579
  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.",
21717
22580
  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.",
21718
22581
  members: [],
21719
- version: "11.5.0"
22582
+ version: "11.7.0"
21720
22583
  },
21721
22584
  {
21722
22585
  id: "settle-number",
@@ -21728,7 +22591,7 @@ placeholder="Name or address\u2026"
21728
22591
  summary: "Round a committed value to the field's precision, in model units.",
21729
22592
  description: "Round a committed value to the field's precision, in model units.",
21730
22593
  members: [],
21731
- version: "11.5.0"
22594
+ version: "11.7.0"
21732
22595
  },
21733
22596
  {
21734
22597
  id: "speak-number",
@@ -21740,7 +22603,7 @@ placeholder="Name or address\u2026"
21740
22603
  summary: "The `aria-valuetext` string: the formatted number with its affixes spoken.",
21741
22604
  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.',
21742
22605
  members: [],
21743
- version: "11.5.0"
22606
+ version: "11.7.0"
21744
22607
  },
21745
22608
  {
21746
22609
  id: "to-number",
@@ -21752,7 +22615,7 @@ placeholder="Name or address\u2026"
21752
22615
  summary: "Model-units canonical decimal \u2192 the bound `number`.",
21753
22616
  description: "Model-units canonical decimal \u2192 the bound `number`.",
21754
22617
  members: [],
21755
- version: "11.5.0"
22618
+ version: "11.7.0"
21756
22619
  },
21757
22620
  {
21758
22621
  id: "loses-precision",
@@ -21764,7 +22627,7 @@ placeholder="Name or address\u2026"
21764
22627
  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.",
21765
22628
  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'`.",
21766
22629
  members: [],
21767
- version: "11.5.0"
22630
+ version: "11.7.0"
21768
22631
  },
21769
22632
  {
21770
22633
  id: "press-repeat-timing",
@@ -21801,7 +22664,7 @@ placeholder="Name or address\u2026"
21801
22664
  description: ""
21802
22665
  }
21803
22666
  ],
21804
- version: "11.5.0"
22667
+ version: "11.7.0"
21805
22668
  },
21806
22669
  {
21807
22670
  id: "press-repeat-config",
@@ -21850,7 +22713,7 @@ placeholder="Name or address\u2026"
21850
22713
  description: ""
21851
22714
  }
21852
22715
  ],
21853
- version: "11.5.0"
22716
+ version: "11.7.0"
21854
22717
  },
21855
22718
  {
21856
22719
  id: "press-repeat",
@@ -21887,7 +22750,7 @@ placeholder="Name or address\u2026"
21887
22750
  description: "End a hold without firing `onRelease` \u2014 for `Escape` and `pointercancel`."
21888
22751
  }
21889
22752
  ],
21890
- version: "11.5.0"
22753
+ version: "11.7.0"
21891
22754
  },
21892
22755
  {
21893
22756
  id: "create-press-repeat",
@@ -21899,7 +22762,7 @@ placeholder="Name or address\u2026"
21899
22762
  summary: "",
21900
22763
  description: "",
21901
22764
  members: [],
21902
- version: "11.5.0"
22765
+ version: "11.7.0"
21903
22766
  },
21904
22767
  {
21905
22768
  id: "listbox-navigation-config",
@@ -21942,7 +22805,7 @@ placeholder="Name or address\u2026"
21942
22805
  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."
21943
22806
  }
21944
22807
  ],
21945
- version: "11.5.0"
22808
+ version: "11.7.0"
21946
22809
  },
21947
22810
  {
21948
22811
  id: "listbox-navigation",
@@ -22015,7 +22878,7 @@ placeholder="Name or address\u2026"
22015
22878
  description: "Close when focus leaves the control entirely (not on internal moves)."
22016
22879
  }
22017
22880
  ],
22018
- version: "11.5.0"
22881
+ version: "11.7.0"
22019
22882
  },
22020
22883
  {
22021
22884
  id: "create-listbox-navigation",
@@ -22027,7 +22890,7 @@ placeholder="Name or address\u2026"
22027
22890
  summary: "Factory mirroring the signal-API style used elsewhere in the CDK.",
22028
22891
  description: "Factory mirroring the signal-API style used elsewhere in the CDK.",
22029
22892
  members: [],
22030
- version: "11.5.0"
22893
+ version: "11.7.0"
22031
22894
  },
22032
22895
  {
22033
22896
  id: "placement",
@@ -22039,7 +22902,7 @@ placeholder="Name or address\u2026"
22039
22902
  summary: "Native CSS Anchor Positioning helpers (Baseline 2026).",
22040
22903
  description: "Native CSS Anchor Positioning helpers (Baseline 2026). These replace the former",
22041
22904
  members: [],
22042
- version: "11.5.0"
22905
+ version: "11.7.0"
22043
22906
  },
22044
22907
  {
22045
22908
  id: "anchor-offset",
@@ -22064,7 +22927,7 @@ placeholder="Name or address\u2026"
22064
22927
  description: "Shift along the cross axis, from the aligned edge."
22065
22928
  }
22066
22929
  ],
22067
- version: "11.5.0"
22930
+ version: "11.7.0"
22068
22931
  },
22069
22932
  {
22070
22933
  id: "new-anchor-name",
@@ -22076,7 +22939,7 @@ placeholder="Name or address\u2026"
22076
22939
  summary: "Returns a document-unique dashed-ident usable as a CSS `anchor-name`.",
22077
22940
  description: "Returns a document-unique dashed-ident usable as a CSS `anchor-name`.",
22078
22941
  members: [],
22079
- version: "11.5.0"
22942
+ version: "11.7.0"
22080
22943
  },
22081
22944
  {
22082
22945
  id: "anchor-styles",
@@ -22088,7 +22951,7 @@ placeholder="Name or address\u2026"
22088
22951
  summary: "Emotion style object anchoring a panel to `anchor` at `placement`.",
22089
22952
  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`).",
22090
22953
  members: [],
22091
- version: "11.5.0"
22954
+ version: "11.7.0"
22092
22955
  },
22093
22956
  {
22094
22957
  id: "anchor-arrow-styles",
@@ -22100,7 +22963,7 @@ placeholder="Name or address\u2026"
22100
22963
  summary: "Absolute positioning for a rotated-square arrow sitting on the panel edge that faces the anchor.",
22101
22964
  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.",
22102
22965
  members: [],
22103
- version: "11.5.0"
22966
+ version: "11.7.0"
22104
22967
  },
22105
22968
  {
22106
22969
  id: "spotlight-options",
@@ -22131,7 +22994,7 @@ placeholder="Name or address\u2026"
22131
22994
  description: "Scrim paint; scheme-invariant by convention, like `::backdrop`."
22132
22995
  }
22133
22996
  ],
22134
- version: "11.5.0"
22997
+ version: "11.7.0"
22135
22998
  },
22136
22999
  {
22137
23000
  id: "spotlight-styles",
@@ -22162,7 +23025,7 @@ placeholder="Name or address\u2026"
22162
23025
  description: "Hole-sized click-blocker, shown when the target must not be interactive."
22163
23026
  }
22164
23027
  ],
22165
- version: "11.5.0"
23028
+ version: "11.7.0"
22166
23029
  },
22167
23030
  {
22168
23031
  id: "anchor-rect",
@@ -22211,7 +23074,7 @@ placeholder="Name or address\u2026"
22211
23074
  description: ""
22212
23075
  }
22213
23076
  ],
22214
- version: "11.5.0"
23077
+ version: "11.7.0"
22215
23078
  },
22216
23079
  {
22217
23080
  id: "transform-origin-for",
@@ -22223,7 +23086,7 @@ placeholder="Name or address\u2026"
22223
23086
  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.",
22224
23087
  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).",
22225
23088
  members: [],
22226
- version: "11.5.0"
23089
+ version: "11.7.0"
22227
23090
  },
22228
23091
  {
22229
23092
  id: "transform-origins",
@@ -22235,7 +23098,7 @@ placeholder="Name or address\u2026"
22235
23098
  summary: "Placement \u2192 `transform-origin`, so scale animations grow from the anchor.",
22236
23099
  description: "Placement \u2192 `transform-origin`, so scale animations grow from the anchor.",
22237
23100
  members: [],
22238
- version: "11.5.0"
23101
+ version: "11.7.0"
22239
23102
  },
22240
23103
  {
22241
23104
  id: "set-anchor-name",
@@ -22247,7 +23110,7 @@ placeholder="Name or address\u2026"
22247
23110
  summary: "Write a CSS `anchor-name` onto an element (detached anchors and targets).",
22248
23111
  description: "Write a CSS `anchor-name` onto an element (detached anchors and targets).",
22249
23112
  members: [],
22250
- version: "11.5.0"
23113
+ version: "11.7.0"
22251
23114
  },
22252
23115
  {
22253
23116
  id: "clear-anchor-name",
@@ -22259,7 +23122,7 @@ placeholder="Name or address\u2026"
22259
23122
  summary: "",
22260
23123
  description: "",
22261
23124
  members: [],
22262
- version: "11.5.0"
23125
+ version: "11.7.0"
22263
23126
  },
22264
23127
  {
22265
23128
  id: "resolve-element",
@@ -22271,7 +23134,7 @@ placeholder="Name or address\u2026"
22271
23134
  summary: "Resolve an element-or-id reference.",
22272
23135
  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).",
22273
23136
  members: [],
22274
- version: "11.5.0"
23137
+ version: "11.7.0"
22275
23138
  },
22276
23139
  {
22277
23140
  id: "is-toggle-open",
@@ -22283,7 +23146,7 @@ placeholder="Name or address\u2026"
22283
23146
  summary: "True when a native `toggle` event reports the overlay opening.",
22284
23147
  description: "True when a native `toggle` event reports the overlay opening.",
22285
23148
  members: [],
22286
- version: "11.5.0"
23149
+ version: "11.7.0"
22287
23150
  },
22288
23151
  {
22289
23152
  id: "discrete-overlay-transition",
@@ -22295,7 +23158,7 @@ placeholder="Name or address\u2026"
22295
23158
  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.",
22296
23159
  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.",
22297
23160
  members: [],
22298
- version: "11.5.0"
23161
+ version: "11.7.0"
22299
23162
  },
22300
23163
  {
22301
23164
  id: "restore-overlay-focus",
@@ -22307,7 +23170,7 @@ placeholder="Name or address\u2026"
22307
23170
  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).",
22308
23171
  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.",
22309
23172
  members: [],
22310
- version: "11.5.0"
23173
+ version: "11.7.0"
22311
23174
  },
22312
23175
  {
22313
23176
  id: "focusable-elements",
@@ -22319,7 +23182,7 @@ placeholder="Name or address\u2026"
22319
23182
  summary: "The focusable elements inside `root`, in DOM order.",
22320
23183
  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).",
22321
23184
  members: [],
22322
- version: "11.5.0"
23185
+ version: "11.7.0"
22323
23186
  },
22324
23187
  {
22325
23188
  id: "backdrop-dismiss",
@@ -22344,7 +23207,7 @@ placeholder="Name or address\u2026"
22344
23207
  description: "True only when both the press and the click landed on the dialog itself."
22345
23208
  }
22346
23209
  ],
22347
- version: "11.5.0"
23210
+ version: "11.7.0"
22348
23211
  },
22349
23212
  {
22350
23213
  id: "sort-direction",
@@ -22356,7 +23219,7 @@ placeholder="Name or address\u2026"
22356
23219
  summary: "",
22357
23220
  description: "",
22358
23221
  members: [],
22359
- version: "11.5.0"
23222
+ version: "11.7.0"
22360
23223
  },
22361
23224
  {
22362
23225
  id: "sort",
@@ -22381,7 +23244,7 @@ placeholder="Name or address\u2026"
22381
23244
  description: ""
22382
23245
  }
22383
23246
  ],
22384
- version: "11.5.0"
23247
+ version: "11.7.0"
22385
23248
  },
22386
23249
  {
22387
23250
  id: "uni-base-datasource",
@@ -22550,7 +23413,7 @@ placeholder="Name or address\u2026"
22550
23413
  description: ""
22551
23414
  }
22552
23415
  ],
22553
- version: "11.5.0"
23416
+ version: "11.7.0"
22554
23417
  },
22555
23418
  {
22556
23419
  id: "page-request",
@@ -22593,7 +23456,7 @@ placeholder="Name or address\u2026"
22593
23456
  description: ""
22594
23457
  }
22595
23458
  ],
22596
- version: "11.5.0"
23459
+ version: "11.7.0"
22597
23460
  },
22598
23461
  {
22599
23462
  id: "page-response",
@@ -22630,7 +23493,7 @@ placeholder="Name or address\u2026"
22630
23493
  description: ""
22631
23494
  }
22632
23495
  ],
22633
- version: "11.5.0"
23496
+ version: "11.7.0"
22634
23497
  },
22635
23498
  {
22636
23499
  id: "data-loader",
@@ -22642,7 +23505,7 @@ placeholder="Name or address\u2026"
22642
23505
  summary: "",
22643
23506
  description: "",
22644
23507
  members: [],
22645
- version: "11.5.0"
23508
+ version: "11.7.0"
22646
23509
  },
22647
23510
  {
22648
23511
  id: "uni-server-side-datasource",
@@ -22781,7 +23644,7 @@ placeholder="Name or address\u2026"
22781
23644
  description: ""
22782
23645
  }
22783
23646
  ],
22784
- version: "11.5.0"
23647
+ version: "11.7.0"
22785
23648
  },
22786
23649
  {
22787
23650
  id: "uni-datasource",
@@ -22793,7 +23656,7 @@ placeholder="Name or address\u2026"
22793
23656
  summary: "",
22794
23657
  description: "",
22795
23658
  members: [],
22796
- version: "11.5.0"
23659
+ version: "11.7.0"
22797
23660
  },
22798
23661
  {
22799
23662
  id: "uni-record-datasource",
@@ -22902,7 +23765,7 @@ placeholder="Name or address\u2026"
22902
23765
  description: ""
22903
23766
  }
22904
23767
  ],
22905
- version: "11.5.0"
23768
+ version: "11.7.0"
22906
23769
  },
22907
23770
  {
22908
23771
  id: "local-storage-service",
@@ -22957,7 +23820,7 @@ placeholder="Name or address\u2026"
22957
23820
  description: ""
22958
23821
  }
22959
23822
  ],
22960
- version: "11.5.0"
23823
+ version: "11.7.0"
22961
23824
  },
22962
23825
  {
22963
23826
  id: "alert",
@@ -23012,7 +23875,7 @@ placeholder="Name or address\u2026"
23012
23875
  description: ""
23013
23876
  }
23014
23877
  ],
23015
- version: "11.5.0"
23878
+ version: "11.7.0"
23016
23879
  },
23017
23880
  {
23018
23881
  id: "snackbar",
@@ -23067,7 +23930,7 @@ placeholder="Name or address\u2026"
23067
23930
  description: ""
23068
23931
  }
23069
23932
  ],
23070
- version: "11.5.0"
23933
+ version: "11.7.0"
23071
23934
  },
23072
23935
  {
23073
23936
  id: "confirmation",
@@ -23116,7 +23979,7 @@ placeholder="Name or address\u2026"
23116
23979
  description: ""
23117
23980
  }
23118
23981
  ],
23119
- version: "11.5.0"
23982
+ version: "11.7.0"
23120
23983
  },
23121
23984
  {
23122
23985
  id: "notification-service",
@@ -23183,7 +24046,7 @@ placeholder="Name or address\u2026"
23183
24046
  description: ""
23184
24047
  }
23185
24048
  ],
23186
- version: "11.5.0"
24049
+ version: "11.7.0"
23187
24050
  },
23188
24051
  {
23189
24052
  id: "option",
@@ -23220,7 +24083,7 @@ placeholder="Name or address\u2026"
23220
24083
  description: "Visible and announced, but not committable; listbox navigation skips it."
23221
24084
  }
23222
24085
  ],
23223
- version: "11.5.0"
24086
+ version: "11.7.0"
23224
24087
  },
23225
24088
  {
23226
24089
  id: "options",
@@ -23232,7 +24095,7 @@ placeholder="Name or address\u2026"
23232
24095
  summary: "",
23233
24096
  description: "",
23234
24097
  members: [],
23235
- version: "11.5.0"
24098
+ version: "11.7.0"
23236
24099
  },
23237
24100
  {
23238
24101
  id: "use-timer",
@@ -23244,7 +24107,7 @@ placeholder="Name or address\u2026"
23244
24107
  summary: "",
23245
24108
  description: "",
23246
24109
  members: [],
23247
- version: "11.5.0"
24110
+ version: "11.7.0"
23248
24111
  },
23249
24112
  {
23250
24113
  id: "acceptable-file",
@@ -23256,7 +24119,7 @@ placeholder="Name or address\u2026"
23256
24119
  summary: "",
23257
24120
  description: "",
23258
24121
  members: [],
23259
- version: "11.5.0"
24122
+ version: "11.7.0"
23260
24123
  },
23261
24124
  {
23262
24125
  id: "get-file-extension",
@@ -23268,7 +24131,7 @@ placeholder="Name or address\u2026"
23268
24131
  summary: "",
23269
24132
  description: "",
23270
24133
  members: [],
23271
- version: "11.5.0"
24134
+ version: "11.7.0"
23272
24135
  },
23273
24136
  {
23274
24137
  id: "query-permission",
@@ -23280,7 +24143,7 @@ placeholder="Name or address\u2026"
23280
24143
  summary: "The current state of a browser permission.",
23281
24144
  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".',
23282
24145
  members: [],
23283
- version: "11.5.0"
24146
+ version: "11.7.0"
23284
24147
  },
23285
24148
  {
23286
24149
  id: "permission-service",
@@ -23305,7 +24168,7 @@ placeholder="Name or address\u2026"
23305
24168
  description: ""
23306
24169
  }
23307
24170
  ],
23308
- version: "11.5.0"
24171
+ version: "11.7.0"
23309
24172
  },
23310
24173
  {
23311
24174
  id: "permission",
@@ -23317,7 +24180,7 @@ placeholder="Name or address\u2026"
23317
24180
  summary: "",
23318
24181
  description: "",
23319
24182
  members: [],
23320
- version: "11.5.0"
24183
+ version: "11.7.0"
23321
24184
  },
23322
24185
  {
23323
24186
  id: "permission-state",
@@ -23329,7 +24192,7 @@ placeholder="Name or address\u2026"
23329
24192
  summary: "",
23330
24193
  description: "",
23331
24194
  members: [],
23332
- version: "11.5.0"
24195
+ version: "11.7.0"
23333
24196
  },
23334
24197
  {
23335
24198
  id: "clipboard-copy-result",
@@ -23341,7 +24204,7 @@ placeholder="Name or address\u2026"
23341
24204
  summary: "How a copy ended: - `copied` \u2014 the content is on the clipboard.",
23342
24205
  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.",
23343
24206
  members: [],
23344
- version: "11.5.0"
24207
+ version: "11.7.0"
23345
24208
  },
23346
24209
  {
23347
24210
  id: "clipboard-data",
@@ -23353,7 +24216,7 @@ placeholder="Name or address\u2026"
23353
24216
  summary: "One clipboard representation; a promise lets the data arrive after the gesture.",
23354
24217
  description: "One clipboard representation; a promise lets the data arrive after the gesture.",
23355
24218
  members: [],
23356
- version: "11.5.0"
24219
+ version: "11.7.0"
23357
24220
  },
23358
24221
  {
23359
24222
  id: "clipboard-content",
@@ -23365,7 +24228,7 @@ placeholder="Name or address\u2026"
23365
24228
  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 }`.",
23366
24229
  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 }`.",
23367
24230
  members: [],
23368
- version: "11.5.0"
24231
+ version: "11.7.0"
23369
24232
  },
23370
24233
  {
23371
24234
  id: "copy-to-clipboard",
@@ -23377,7 +24240,7 @@ placeholder="Name or address\u2026"
23377
24240
  summary: "Copies text or rich content with the Async Clipboard API.",
23378
24241
  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.",
23379
24242
  members: [],
23380
- version: "11.5.0"
24243
+ version: "11.7.0"
23381
24244
  }
23382
24245
  ],
23383
24246
  utilityDocs: [
@@ -24815,6 +25678,7 @@ var buildComponents = (c) => ({
24815
25678
  padding: "sm",
24816
25679
  bodyPadding: void 0,
24817
25680
  inset: "lg",
25681
+ overscroll: "contain",
24818
25682
  elevation: "dialog",
24819
25683
  backdrop: "scrim",
24820
25684
  motion: "panel"
@@ -24915,7 +25779,12 @@ var buildComponents = (c) => ({
24915
25779
  tooltipCloseDelay: 150,
24916
25780
  motion: "panel"
24917
25781
  } },
24918
- expand: { options: { motion: "reveal" } },
25782
+ expand: { options: {
25783
+ motion: "reveal",
25784
+ textRole: "label",
25785
+ sublabelRole: "caption",
25786
+ sublabelColor: "on-background-variant"
25787
+ } },
24919
25788
  input: { options: {
24920
25789
  typeface: "input",
24921
25790
  color: "primary-surface",
@@ -25088,12 +25957,25 @@ var buildComponents = (c) => ({
25088
25957
  tagInput: { options: {
25089
25958
  chipGap: "xs",
25090
25959
  chipSize: "md",
25960
+ chipVariant: "primary",
25961
+ chipTone: "soft",
25091
25962
  minInputWidth: "12ch",
25092
25963
  listColor: "primary-surface",
25093
25964
  listShadow: "menu",
25094
25965
  listBorderRadius: "xs",
25095
25966
  activeColor: "primary-container",
25096
- maxSuggestions: 8
25967
+ maxSuggestions: 8,
25968
+ typeface: "label",
25969
+ headingTypeface: "caption",
25970
+ listWidth: "anchor"
25971
+ } },
25972
+ contactInput: { options: {
25973
+ avatarSize: "md",
25974
+ avatarVariant: "primary",
25975
+ nameTypeface: "body-2-short",
25976
+ detailTypeface: "caption",
25977
+ rowGap: "sm",
25978
+ chipAvatar: true
25097
25979
  } },
25098
25980
  calendar: {
25099
25981
  options: {
@@ -25420,6 +26302,7 @@ var buildComponents = (c) => ({
25420
26302
  thVerticalBorder: "dotted",
25421
26303
  thHorizontalBorder: "light",
25422
26304
  thPadding: "sm",
26305
+ sortIcon: "arrowUp",
25423
26306
  tdTextRole: "title-small",
25424
26307
  tdColor: "primary-surface",
25425
26308
  tdStickyColor: "primary-container",
@@ -25431,10 +26314,18 @@ var buildComponents = (c) => ({
25431
26314
  loadingSpinnerColor: "primary",
25432
26315
  loadingSpinnerSize: 40
25433
26316
  } },
25434
- notificationBadge: { options: {
25435
- borderRadius: "sm",
25436
- offset: -10
25437
- } },
26317
+ notificationBadge: {
26318
+ options: {
26319
+ borderRadius: "sm",
26320
+ offset: -10,
26321
+ typeface: "overline"
26322
+ },
26323
+ sizes: {
26324
+ sm: { height: 14 },
26325
+ md: { height: 16 },
26326
+ lg: { height: 20 }
26327
+ }
26328
+ },
25438
26329
  paginator: { options: {
25439
26330
  gap: "xs",
25440
26331
  textRole: "label",
@@ -26989,4 +27880,4 @@ export {
26989
27880
  buildStoredTheme,
26990
27881
  createUniServer
26991
27882
  };
26992
- //# sourceMappingURL=chunk-2FUM4CYC.js.map
27883
+ //# sourceMappingURL=chunk-Y6SCKJEM.js.map