@uni-design-system/uni-mcp 10.2.1 → 10.3.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,8 +7,8 @@ import { z } from "zod";
7
7
  // src/data/uni-index.json
8
8
  var uni_index_default = {
9
9
  meta: {
10
- version: "10.2.1",
11
- builtAt: "2026-09-01T22:40:17.762Z",
10
+ version: "10.3.0",
11
+ builtAt: "2026-09-02T01:46:25.174Z",
12
12
  frameworks: [
13
13
  "angular"
14
14
  ],
@@ -27,7 +27,7 @@ var uni_index_default = {
27
27
  summary: "",
28
28
  description: "",
29
29
  category: "feedback",
30
- version: "10.2.1",
30
+ version: "10.3.0",
31
31
  bindings: {
32
32
  angular: {
33
33
  importPath: "@uni-design-system/uni-angular",
@@ -117,7 +117,7 @@ var uni_index_default = {
117
117
  summary: "Horizontal application bar: project leading controls (menu button, logo) with the `leading` attribute, actions with `trailing` (pushed to the far edge), and either pass `title` or project custom center content.",
118
118
  description: "Horizontal application bar: project leading controls (menu button, logo) with the `leading` attribute, actions with `trailing` (pushed to the far edge), and either pass `title` or project custom center content. Surface, divider, height, typography and spacing all resolve from `appBar` tokens. Place it inside your page's `<header>` landmark.",
119
119
  category: "components",
120
- version: "10.2.1",
120
+ version: "10.3.0",
121
121
  bindings: {
122
122
  angular: {
123
123
  importPath: "@uni-design-system/uni-angular",
@@ -190,7 +190,7 @@ var uni_index_default = {
190
190
  summary: "Identity avatar with a graceful fallback chain: image \u2192 initials from `name` \u2192 themed symbol.",
191
191
  description: "Identity avatar with a graceful fallback chain: image \u2192 initials from `name` \u2192 themed symbol. Coloring, radius, typeface and sizes all resolve from `avatar` theme tokens; `variant` picks the container palette.",
192
192
  category: "components",
193
- version: "10.2.1",
193
+ version: "10.3.0",
194
194
  bindings: {
195
195
  angular: {
196
196
  importPath: "@uni-design-system/uni-angular",
@@ -285,7 +285,7 @@ var uni_index_default = {
285
285
  summary: "Overlapping stack of avatars.",
286
286
  description: "Overlapping stack of avatars. `max` collapses the overflow into a themed \u201C+N\u201D chip (itself a `uni-avatar`). Overlap and separator ring resolve from `avatarGroup` theme tokens.",
287
287
  category: "components",
288
- version: "10.2.1",
288
+ version: "10.3.0",
289
289
  bindings: {
290
290
  angular: {
291
291
  importPath: "@uni-design-system/uni-angular",
@@ -334,7 +334,7 @@ var uni_index_default = {
334
334
  summary: "",
335
335
  description: "",
336
336
  category: "primitives",
337
- version: "10.2.1",
337
+ version: "10.3.0",
338
338
  bindings: {
339
339
  angular: {
340
340
  importPath: "@uni-design-system/uni-angular",
@@ -415,7 +415,7 @@ var uni_index_default = {
415
415
  summary: "",
416
416
  description: "",
417
417
  category: "feedback",
418
- version: "10.2.1",
418
+ version: "10.3.0",
419
419
  bindings: {
420
420
  angular: {
421
421
  importPath: "@uni-design-system/uni-angular",
@@ -512,7 +512,7 @@ var uni_index_default = {
512
512
  summary: "",
513
513
  description: "",
514
514
  category: "directives",
515
- version: "10.2.1",
515
+ version: "10.3.0",
516
516
  bindings: {
517
517
  angular: {
518
518
  importPath: "@uni-design-system/uni-angular",
@@ -536,7 +536,7 @@ var uni_index_default = {
536
536
  summary: 'The base layout primitive, applied as an attribute to any element so semantics stay yours: `<main box-layout [grow]="1" padding="md">`.',
537
537
  description: 'The base layout primitive, applied as an attribute to any element so semantics stay yours: `<main box-layout [grow]="1" padding="md">`. It is a directive, so it composes freely \u2014 with another layout attribute (`<div stack-layout uni-text="body-1-long">`) and with a component\'s own host element (`<uni-card box-layout padding="lg">`); Angular merges the host `class` bindings rather than letting one win. Sizing convention (height/width/min/max/inset): a **number is px and needs a binding** \u2014 `[height]="420"`; a **plain attribute is a CSS length string** \u2014 `height="420px"`. Spacing/radius/color inputs take theme tokens.',
538
538
  category: "layout",
539
- version: "10.2.1",
539
+ version: "10.3.0",
540
540
  bindings: {
541
541
  angular: {
542
542
  importPath: "@uni-design-system/uni-angular",
@@ -942,7 +942,7 @@ var uni_index_default = {
942
942
  summary: 'WAI-ARIA breadcrumb: a `nav` landmark wrapping an ordered list; the last item is the current page (`aria-current="page"`), separators are decorative.',
943
943
  description: 'WAI-ARIA breadcrumb: a `nav` landmark wrapping an ordered list; the last item is the current page (`aria-current="page"`), separators are decorative. Items with `href` render as real links; without one they render as link-styled buttons emitting `itemClicked` \u2014 wire that to your router.',
944
944
  category: "components",
945
- version: "10.2.1",
945
+ version: "10.3.0",
946
946
  bindings: {
947
947
  angular: {
948
948
  importPath: "@uni-design-system/uni-angular",
@@ -1027,7 +1027,7 @@ var uni_index_default = {
1027
1027
  summary: "",
1028
1028
  description: "",
1029
1029
  category: "primitives",
1030
- version: "10.2.1",
1030
+ version: "10.3.0",
1031
1031
  bindings: {
1032
1032
  angular: {
1033
1033
  importPath: "@uni-design-system/uni-angular",
@@ -1186,7 +1186,7 @@ var uni_index_default = {
1186
1186
  summary: "",
1187
1187
  description: "",
1188
1188
  category: "primitives",
1189
- version: "10.2.1",
1189
+ version: "10.3.0",
1190
1190
  bindings: {
1191
1191
  angular: {
1192
1192
  importPath: "@uni-design-system/uni-angular",
@@ -1218,7 +1218,7 @@ var uni_index_default = {
1218
1218
  summary: "Inline month calendar: single-date or start\u2013end range selection, day markers (availability dots), min/max fences and disabled dates.",
1219
1219
  description: "Inline month calendar: single-date or start\u2013end range selection, day markers (availability dots), min/max fences and disabled dates. One tab stop with a roving-tabindex `role=\"grid\"`; every day is a real button named with its full date. Values are plain ISO strings (`'YYYY-MM-DD'`), never `Date` objects, so bindings are timezone-free and serializable. Selection and today colours come from the theme's `primary` role pair; geometry and glyphs come from the `calendar` theme entry.",
1220
1220
  category: "forms",
1221
- version: "10.2.1",
1221
+ version: "10.3.0",
1222
1222
  bindings: {
1223
1223
  angular: {
1224
1224
  importPath: "@uni-design-system/uni-angular",
@@ -1452,7 +1452,7 @@ var uni_index_default = {
1452
1452
  summary: "Anchored coach-mark panel that dims the page and cuts a spotlight hole around its target.",
1453
1453
  description: 'Anchored coach-mark panel that dims the page and cuts a spotlight hole around its target. Both the scrim and the panel are `popover="manual"` elements shown in order, so they stack deterministically in the top layer above every app z-index, and every scrim piece is CSS-anchor-positioned to the target \u2014 the hole tracks scroll/resize/layout with zero listeners. The panel is a non-modal `role="dialog"` (deliberately no `aria-modal`): focus moves into it on open, Tab runs a "duet loop" over the panel\'s focusables plus the spotlit target while it stays interactive, and on close focus returns to the pre-open element \u2014 unless the user moved into the target, where it stays. Storage-free by rule: `key` and the `dismissed` output are the "don\'t show again" hooks; persistence is the app\'s business (e.g. cdk local-storage).',
1454
1454
  category: "components",
1455
- version: "10.2.1",
1455
+ version: "10.3.0",
1456
1456
  bindings: {
1457
1457
  angular: {
1458
1458
  importPath: "@uni-design-system/uni-angular",
@@ -1672,7 +1672,7 @@ var uni_index_default = {
1672
1672
  summary: "",
1673
1673
  description: "",
1674
1674
  category: "layout",
1675
- version: "10.2.1",
1675
+ version: "10.3.0",
1676
1676
  bindings: {
1677
1677
  angular: {
1678
1678
  importPath: "@uni-design-system/uni-angular",
@@ -1734,7 +1734,7 @@ var uni_index_default = {
1734
1734
  summary: "",
1735
1735
  description: "",
1736
1736
  category: "layout",
1737
- version: "10.2.1",
1737
+ version: "10.3.0",
1738
1738
  bindings: {
1739
1739
  angular: {
1740
1740
  importPath: "@uni-design-system/uni-angular",
@@ -1775,7 +1775,7 @@ var uni_index_default = {
1775
1775
  summary: "",
1776
1776
  description: "",
1777
1777
  category: "layout",
1778
- version: "10.2.1",
1778
+ version: "10.3.0",
1779
1779
  bindings: {
1780
1780
  angular: {
1781
1781
  importPath: "@uni-design-system/uni-angular",
@@ -1832,7 +1832,7 @@ var uni_index_default = {
1832
1832
  summary: "",
1833
1833
  description: "",
1834
1834
  category: "layout",
1835
- version: "10.2.1",
1835
+ version: "10.3.0",
1836
1836
  bindings: {
1837
1837
  angular: {
1838
1838
  importPath: "@uni-design-system/uni-angular",
@@ -1887,7 +1887,7 @@ var uni_index_default = {
1887
1887
  summary: "",
1888
1888
  description: "",
1889
1889
  category: "forms",
1890
- version: "10.2.1",
1890
+ version: "10.3.0",
1891
1891
  bindings: {
1892
1892
  angular: {
1893
1893
  importPath: "@uni-design-system/uni-angular",
@@ -2063,7 +2063,7 @@ var uni_index_default = {
2063
2063
  summary: "Form-bound, closed-set, single-select autocomplete: `FormValueControl<T | null>` over object `Options<T>`, type-to-filter, commit-on-select.",
2064
2064
  description: "Form-bound, closed-set, single-select autocomplete: `FormValueControl<T | null>` over object `Options<T>`, type-to-filter, commit-on-select. Typing produces a draft \u2014 a filter, never a value; the value changes only when an option commits, `clear()` runs, or the model is written from outside. Select semantics, not search: a real label, a chevron, no magnifier, nothing submits. For short lists with no need to type, prefer `uni-select` \u2014 the value contract is identical, so swapping is a template-only change.",
2065
2065
  category: "forms",
2066
- version: "10.2.1",
2066
+ version: "10.3.0",
2067
2067
  bindings: {
2068
2068
  angular: {
2069
2069
  importPath: "@uni-design-system/uni-angular",
@@ -2342,7 +2342,7 @@ emptyText="No countries found"
2342
2342
  summary: "",
2343
2343
  description: "",
2344
2344
  category: "feedback",
2345
- version: "10.2.1",
2345
+ version: "10.3.0",
2346
2346
  bindings: {
2347
2347
  angular: {
2348
2348
  importPath: "@uni-design-system/uni-angular",
@@ -2389,7 +2389,7 @@ emptyText="No countries found"
2389
2389
  summary: "",
2390
2390
  description: "",
2391
2391
  category: "forms",
2392
- version: "10.2.1",
2392
+ version: "10.3.0",
2393
2393
  bindings: {
2394
2394
  angular: {
2395
2395
  importPath: "@uni-design-system/uni-angular",
@@ -2488,7 +2488,7 @@ emptyText="No countries found"
2488
2488
  summary: "",
2489
2489
  description: "",
2490
2490
  category: "data",
2491
- version: "10.2.1",
2491
+ version: "10.3.0",
2492
2492
  bindings: {
2493
2493
  angular: {
2494
2494
  importPath: "@uni-design-system/uni-angular",
@@ -2728,7 +2728,7 @@ emptyText="No countries found"
2728
2728
  summary: "Date field with free-typed parsing and a popup calendar.",
2729
2729
  description: "Date field with free-typed parsing and a popup calendar. Type `aug 20`, `8/20/2026` or `2026-08-20`, or pick from the grid \u2014 the form gets the same canonical `'YYYY-MM-DD'` string either way. Parsing is `Intl`-driven (locale digit order and month names, never hardcoded); unreadable text stays in the field, flagged, with a `rejected` event. The popup is a native popover hosting the same `uni-calendar` an app could render inline.",
2730
2730
  category: "forms",
2731
- version: "10.2.1",
2731
+ version: "10.3.0",
2732
2732
  bindings: {
2733
2733
  angular: {
2734
2734
  importPath: "@uni-design-system/uni-angular",
@@ -2952,7 +2952,7 @@ emptyText="No countries found"
2952
2952
  summary: "One field for a date and a time: a thin composer seating a uni-date-input and a uni-time-input in one input-box chrome under one label, yielding one combined `'YYYY-MM-DDTHH:mm'` value.",
2953
2953
  description: "One field for a date and a time: a thin composer seating a uni-date-input and a uni-time-input in one input-box chrome under one label, yielding one combined `'YYYY-MM-DDTHH:mm'` value. The value emits only when both parts are set \u2014 a time without a day is not an answer \u2014 and clearing the date clears it. With `slotsFor`, the time part stays disabled until a day is chosen and offers exactly that day's slots: the scheduling flow in one attribute. Two honest tab stops (it is two questions); apps needing a different arrangement compose the primitives directly.",
2954
2954
  category: "forms",
2955
- version: "10.2.1",
2955
+ version: "10.3.0",
2956
2956
  bindings: {
2957
2957
  angular: {
2958
2958
  importPath: "@uni-design-system/uni-angular",
@@ -3138,7 +3138,7 @@ emptyText="No countries found"
3138
3138
  summary: "Text input that emits `change` only after the user pauses typing.",
3139
3139
  description: "Text input that emits `change` only after the user pauses typing. Wears the shared input chrome (themed color, border, typeface, focus ring) via `uni-input-box`; project adornments with the `pre-input` / `post-input` slots, matching `uni-input`'s convention. The ARIA passthrough inputs let a wrapping composite (e.g. SearchInput's combobox) annotate the real input element.",
3140
3140
  category: "forms",
3141
- version: "10.2.1",
3141
+ version: "10.3.0",
3142
3142
  bindings: {
3143
3143
  angular: {
3144
3144
  importPath: "@uni-design-system/uni-angular",
@@ -3286,7 +3286,7 @@ emptyText="No countries found"
3286
3286
  summary: "",
3287
3287
  description: "",
3288
3288
  category: "feedback",
3289
- version: "10.2.1",
3289
+ version: "10.3.0",
3290
3290
  bindings: {
3291
3291
  angular: {
3292
3292
  importPath: "@uni-design-system/uni-angular",
@@ -3380,7 +3380,7 @@ emptyText="No countries found"
3380
3380
  summary: "",
3381
3381
  description: "",
3382
3382
  category: "feedback",
3383
- version: "10.2.1",
3383
+ version: "10.3.0",
3384
3384
  bindings: {
3385
3385
  angular: {
3386
3386
  importPath: "@uni-design-system/uni-angular",
@@ -3484,7 +3484,7 @@ emptyText="No countries found"
3484
3484
  summary: "",
3485
3485
  description: "",
3486
3486
  category: "feedback",
3487
- version: "10.2.1",
3487
+ version: "10.3.0",
3488
3488
  bindings: {
3489
3489
  angular: {
3490
3490
  importPath: "@uni-design-system/uni-angular",
@@ -3525,7 +3525,7 @@ emptyText="No countries found"
3525
3525
  summary: "",
3526
3526
  description: "",
3527
3527
  category: "layout",
3528
- version: "10.2.1",
3528
+ version: "10.3.0",
3529
3529
  bindings: {
3530
3530
  angular: {
3531
3531
  importPath: "@uni-design-system/uni-angular",
@@ -3581,7 +3581,7 @@ emptyText="No countries found"
3581
3581
  summary: "",
3582
3582
  description: "",
3583
3583
  category: "directives",
3584
- version: "10.2.1",
3584
+ version: "10.3.0",
3585
3585
  bindings: {
3586
3586
  angular: {
3587
3587
  importPath: "@uni-design-system/uni-angular",
@@ -3613,7 +3613,7 @@ emptyText="No countries found"
3613
3613
  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.",
3614
3614
  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.",
3615
3615
  category: "components",
3616
- version: "10.2.1",
3616
+ version: "10.3.0",
3617
3617
  bindings: {
3618
3618
  angular: {
3619
3619
  importPath: "@uni-design-system/uni-angular",
@@ -3803,7 +3803,7 @@ initialFocus="input"
3803
3803
  summary: "The drawer's pinned footer action row \u2014 the save bar of an editor panel.",
3804
3804
  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.",
3805
3805
  category: "primitives",
3806
- version: "10.2.1",
3806
+ version: "10.3.0",
3807
3807
  bindings: {
3808
3808
  angular: {
3809
3809
  importPath: "@uni-design-system/uni-angular",
@@ -3900,7 +3900,7 @@ initialFocus="input"
3900
3900
  summary: "The drawer's pinned header row: a title, and optionally a close button.",
3901
3901
  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.",
3902
3902
  category: "components",
3903
- version: "10.2.1",
3903
+ version: "10.3.0",
3904
3904
  bindings: {
3905
3905
  angular: {
3906
3906
  importPath: "@uni-design-system/uni-angular",
@@ -3948,7 +3948,7 @@ initialFocus="input"
3948
3948
  summary: "",
3949
3949
  description: "",
3950
3950
  category: "components",
3951
- version: "10.2.1",
3951
+ version: "10.3.0",
3952
3952
  bindings: {
3953
3953
  angular: {
3954
3954
  importPath: "@uni-design-system/uni-angular",
@@ -4082,7 +4082,7 @@ initialFocus="input"
4082
4082
  summary: "",
4083
4083
  description: "",
4084
4084
  category: "layout",
4085
- version: "10.2.1",
4085
+ version: "10.3.0",
4086
4086
  bindings: {
4087
4087
  angular: {
4088
4088
  importPath: "@uni-design-system/uni-angular",
@@ -4186,7 +4186,7 @@ initialFocus="input"
4186
4186
  summary: "",
4187
4187
  description: "",
4188
4188
  category: "layout",
4189
- version: "10.2.1",
4189
+ version: "10.3.0",
4190
4190
  bindings: {
4191
4191
  angular: {
4192
4192
  importPath: "@uni-design-system/uni-angular",
@@ -4257,7 +4257,7 @@ initialFocus="input"
4257
4257
  summary: "Trigger for a {@link UniExpandComponent} region.",
4258
4258
  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.",
4259
4259
  category: "layout",
4260
- version: "10.2.1",
4260
+ version: "10.3.0",
4261
4261
  bindings: {
4262
4262
  angular: {
4263
4263
  importPath: "@uni-design-system/uni-angular",
@@ -4342,7 +4342,7 @@ initialFocus="input"
4342
4342
  summary: "",
4343
4343
  description: "",
4344
4344
  category: "forms",
4345
- version: "10.2.1",
4345
+ version: "10.3.0",
4346
4346
  bindings: {
4347
4347
  angular: {
4348
4348
  importPath: "@uni-design-system/uni-angular",
@@ -4500,7 +4500,7 @@ initialFocus="input"
4500
4500
  summary: "",
4501
4501
  description: "",
4502
4502
  category: "layout",
4503
- version: "10.2.1",
4503
+ version: "10.3.0",
4504
4504
  bindings: {
4505
4505
  angular: {
4506
4506
  importPath: "@uni-design-system/uni-angular",
@@ -4597,7 +4597,7 @@ initialFocus="input"
4597
4597
  summary: "",
4598
4598
  description: "",
4599
4599
  category: "layout",
4600
- version: "10.2.1",
4600
+ version: "10.3.0",
4601
4601
  bindings: {
4602
4602
  angular: {
4603
4603
  importPath: "@uni-design-system/uni-angular",
@@ -4629,7 +4629,7 @@ initialFocus="input"
4629
4629
  summary: "",
4630
4630
  description: "",
4631
4631
  category: "primitives",
4632
- version: "10.2.1",
4632
+ version: "10.3.0",
4633
4633
  bindings: {
4634
4634
  angular: {
4635
4635
  importPath: "@uni-design-system/uni-angular",
@@ -4689,7 +4689,7 @@ initialFocus="input"
4689
4689
  summary: "",
4690
4690
  description: "",
4691
4691
  category: "primitives",
4692
- version: "10.2.1",
4692
+ version: "10.3.0",
4693
4693
  bindings: {
4694
4694
  angular: {
4695
4695
  importPath: "@uni-design-system/uni-angular",
@@ -4792,7 +4792,7 @@ initialFocus="input"
4792
4792
  summary: "",
4793
4793
  description: "",
4794
4794
  category: "forms",
4795
- version: "10.2.1",
4795
+ version: "10.3.0",
4796
4796
  bindings: {
4797
4797
  angular: {
4798
4798
  importPath: "@uni-design-system/uni-angular",
@@ -5070,7 +5070,7 @@ initialFocus="input"
5070
5070
  summary: "",
5071
5071
  description: "",
5072
5072
  category: "forms",
5073
- version: "10.2.1",
5073
+ version: "10.3.0",
5074
5074
  bindings: {
5075
5075
  angular: {
5076
5076
  importPath: "@uni-design-system/uni-angular",
@@ -5191,7 +5191,7 @@ initialFocus="input"
5191
5191
  summary: "",
5192
5192
  description: "",
5193
5193
  category: "components",
5194
- version: "10.2.1",
5194
+ version: "10.3.0",
5195
5195
  bindings: {
5196
5196
  angular: {
5197
5197
  importPath: "@uni-design-system/uni-angular",
@@ -5261,7 +5261,7 @@ initialFocus="input"
5261
5261
  summary: "",
5262
5262
  description: "",
5263
5263
  category: "layout",
5264
- version: "10.2.1",
5264
+ version: "10.3.0",
5265
5265
  bindings: {
5266
5266
  angular: {
5267
5267
  importPath: "@uni-design-system/uni-angular",
@@ -5365,7 +5365,7 @@ initialFocus="input"
5365
5365
  summary: "",
5366
5366
  description: "",
5367
5367
  category: "layout",
5368
- version: "10.2.1",
5368
+ version: "10.3.0",
5369
5369
  bindings: {
5370
5370
  angular: {
5371
5371
  importPath: "@uni-design-system/uni-angular",
@@ -5447,7 +5447,7 @@ initialFocus="input"
5447
5447
  summary: "",
5448
5448
  description: "",
5449
5449
  category: "forms",
5450
- version: "10.2.1",
5450
+ version: "10.3.0",
5451
5451
  bindings: {
5452
5452
  angular: {
5453
5453
  importPath: "@uni-design-system/uni-angular",
@@ -5541,7 +5541,7 @@ initialFocus="input"
5541
5541
  summary: "",
5542
5542
  description: "",
5543
5543
  category: "forms",
5544
- version: "10.2.1",
5544
+ version: "10.3.0",
5545
5545
  bindings: {
5546
5546
  angular: {
5547
5547
  importPath: "@uni-design-system/uni-angular",
@@ -5713,7 +5713,7 @@ initialFocus="input"
5713
5713
  summary: "",
5714
5714
  description: "",
5715
5715
  category: "feedback",
5716
- version: "10.2.1",
5716
+ version: "10.3.0",
5717
5717
  bindings: {
5718
5718
  angular: {
5719
5719
  importPath: "@uni-design-system/uni-angular",
@@ -5973,7 +5973,7 @@ initialFocus="input"
5973
5973
  summary: "",
5974
5974
  description: "",
5975
5975
  category: "feedback",
5976
- version: "10.2.1",
5976
+ version: "10.3.0",
5977
5977
  bindings: {
5978
5978
  angular: {
5979
5979
  importPath: "@uni-design-system/uni-angular",
@@ -5997,7 +5997,7 @@ initialFocus="input"
5997
5997
  summary: "Numeric field with locale-aware parsing, `Intl` formatting on commit, prefix/suffix adornments and steppers that hold to repeat.",
5998
5998
  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.',
5999
5999
  category: "forms",
6000
- version: "10.2.1",
6000
+ version: "10.3.0",
6001
6001
  bindings: {
6002
6002
  angular: {
6003
6003
  importPath: "@uni-design-system/uni-angular",
@@ -6416,7 +6416,7 @@ initialFocus="input"
6416
6416
  summary: "Two linked numeric fields in one chrome, with one `{ start, end }` value \u2014 price filters, thresholds, tolerances.",
6417
6417
  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.",
6418
6418
  category: "forms",
6419
- version: "10.2.1",
6419
+ version: "10.3.0",
6420
6420
  bindings: {
6421
6421
  angular: {
6422
6422
  importPath: "@uni-design-system/uni-angular",
@@ -6698,7 +6698,7 @@ initialFocus="input"
6698
6698
  summary: "",
6699
6699
  description: "",
6700
6700
  category: "data",
6701
- version: "10.2.1",
6701
+ version: "10.3.0",
6702
6702
  bindings: {
6703
6703
  angular: {
6704
6704
  importPath: "@uni-design-system/uni-angular",
@@ -6799,7 +6799,7 @@ initialFocus="input"
6799
6799
  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.",
6800
6800
  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.',
6801
6801
  category: "layout",
6802
- version: "10.2.1",
6802
+ version: "10.3.0",
6803
6803
  bindings: {
6804
6804
  angular: {
6805
6805
  importPath: "@uni-design-system/uni-angular",
@@ -6991,7 +6991,7 @@ initialFocus="input"
6991
6991
  summary: "",
6992
6992
  description: "",
6993
6993
  category: "feedback",
6994
- version: "10.2.1",
6994
+ version: "10.3.0",
6995
6995
  bindings: {
6996
6996
  angular: {
6997
6997
  importPath: "@uni-design-system/uni-angular",
@@ -7055,7 +7055,7 @@ initialFocus="input"
7055
7055
  summary: "",
7056
7056
  description: "",
7057
7057
  category: "feedback",
7058
- version: "10.2.1",
7058
+ version: "10.3.0",
7059
7059
  bindings: {
7060
7060
  angular: {
7061
7061
  importPath: "@uni-design-system/uni-angular",
@@ -7127,7 +7127,7 @@ initialFocus="input"
7127
7127
  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.",
7128
7128
  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.',
7129
7129
  category: "forms",
7130
- version: "10.2.1",
7130
+ version: "10.3.0",
7131
7131
  bindings: {
7132
7132
  angular: {
7133
7133
  importPath: "@uni-design-system/uni-angular",
@@ -7323,7 +7323,7 @@ initialFocus="input"
7323
7323
  summary: "",
7324
7324
  description: "",
7325
7325
  category: "forms",
7326
- version: "10.2.1",
7326
+ version: "10.3.0",
7327
7327
  bindings: {
7328
7328
  angular: {
7329
7329
  importPath: "@uni-design-system/uni-angular",
@@ -7514,7 +7514,7 @@ initialFocus="input"
7514
7514
  summary: "",
7515
7515
  description: "",
7516
7516
  category: "directives",
7517
- version: "10.2.1",
7517
+ version: "10.3.0",
7518
7518
  bindings: {
7519
7519
  angular: {
7520
7520
  importPath: "@uni-design-system/uni-angular",
@@ -7538,7 +7538,7 @@ initialFocus="input"
7538
7538
  summary: "",
7539
7539
  description: "",
7540
7540
  category: "layout",
7541
- version: "10.2.1",
7541
+ version: "10.3.0",
7542
7542
  bindings: {
7543
7543
  angular: {
7544
7544
  importPath: "@uni-design-system/uni-angular",
@@ -7593,7 +7593,7 @@ initialFocus="input"
7593
7593
  summary: "Native scroll area with theme-driven scrollbar styling.",
7594
7594
  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.",
7595
7595
  category: "layout",
7596
- version: "10.2.1",
7596
+ version: "10.3.0",
7597
7597
  bindings: {
7598
7598
  angular: {
7599
7599
  importPath: "@uni-design-system/uni-angular",
@@ -7740,7 +7740,7 @@ initialFocus="input"
7740
7740
  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.",
7741
7741
  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.",
7742
7742
  category: "forms",
7743
- version: "10.2.1",
7743
+ version: "10.3.0",
7744
7744
  bindings: {
7745
7745
  angular: {
7746
7746
  importPath: "@uni-design-system/uni-angular",
@@ -7867,7 +7867,7 @@ initialFocus="input"
7867
7867
  summary: "",
7868
7868
  description: "",
7869
7869
  category: "forms",
7870
- version: "10.2.1",
7870
+ version: "10.3.0",
7871
7871
  bindings: {
7872
7872
  angular: {
7873
7873
  importPath: "@uni-design-system/uni-angular",
@@ -8033,7 +8033,7 @@ initialFocus="input"
8033
8033
  summary: "Loading placeholder painted with surface tokens.",
8034
8034
  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.",
8035
8035
  category: "components",
8036
- version: "10.2.1",
8036
+ version: "10.3.0",
8037
8037
  bindings: {
8038
8038
  angular: {
8039
8039
  importPath: "@uni-design-system/uni-angular",
@@ -8184,7 +8184,7 @@ initialFocus="input"
8184
8184
  summary: "Bounded numeric input by pointer, for values where the *position* is the information: volume, opacity, weightings, price filters.",
8185
8185
  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.",
8186
8186
  category: "forms",
8187
- version: "10.2.1",
8187
+ version: "10.3.0",
8188
8188
  bindings: {
8189
8189
  angular: {
8190
8190
  importPath: "@uni-design-system/uni-angular",
@@ -8451,7 +8451,7 @@ initialFocus="input"
8451
8451
  summary: "",
8452
8452
  description: "",
8453
8453
  category: "feedback",
8454
- version: "10.2.1",
8454
+ version: "10.3.0",
8455
8455
  bindings: {
8456
8456
  angular: {
8457
8457
  importPath: "@uni-design-system/uni-angular",
@@ -8563,7 +8563,7 @@ initialFocus="input"
8563
8563
  summary: "",
8564
8564
  description: "",
8565
8565
  category: "data",
8566
- version: "10.2.1",
8566
+ version: "10.3.0",
8567
8567
  bindings: {
8568
8568
  angular: {
8569
8569
  importPath: "@uni-design-system/uni-angular",
@@ -8622,7 +8622,7 @@ initialFocus="input"
8622
8622
  summary: "",
8623
8623
  description: "",
8624
8624
  category: "layout",
8625
- version: "10.2.1",
8625
+ version: "10.3.0",
8626
8626
  bindings: {
8627
8627
  angular: {
8628
8628
  importPath: "@uni-design-system/uni-angular",
@@ -8677,7 +8677,7 @@ initialFocus="input"
8677
8677
  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.',
8678
8678
  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.',
8679
8679
  category: "components",
8680
- version: "10.2.1",
8680
+ version: "10.3.0",
8681
8681
  bindings: {
8682
8682
  angular: {
8683
8683
  importPath: "@uni-design-system/uni-angular",
@@ -8795,7 +8795,7 @@ initialFocus="input"
8795
8795
  summary: "",
8796
8796
  description: "",
8797
8797
  category: "primitives",
8798
- version: "10.2.1",
8798
+ version: "10.3.0",
8799
8799
  bindings: {
8800
8800
  angular: {
8801
8801
  importPath: "@uni-design-system/uni-angular",
@@ -8884,7 +8884,7 @@ initialFocus="input"
8884
8884
  summary: "One tab inside `uni-tabs`: a label for the tablist plus projected panel content.",
8885
8885
  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.",
8886
8886
  category: "components",
8887
- version: "10.2.1",
8887
+ version: "10.3.0",
8888
8888
  bindings: {
8889
8889
  angular: {
8890
8890
  importPath: "@uni-design-system/uni-angular",
@@ -8924,7 +8924,7 @@ initialFocus="input"
8924
8924
  summary: "WAI-ARIA tabs: roving tabindex, automatic activation (arrow keys move focus and select), Home/End, disabled tabs skipped.",
8925
8925
  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.",
8926
8926
  category: "components",
8927
- version: "10.2.1",
8927
+ version: "10.3.0",
8928
8928
  bindings: {
8929
8929
  angular: {
8930
8930
  importPath: "@uni-design-system/uni-angular",
@@ -9004,7 +9004,7 @@ initialFocus="input"
9004
9004
  summary: "Compact chip for categories, states, filters and tokens.",
9005
9005
  description: "Compact chip for categories, states, filters and tokens. Two orthogonal style axes: `variant` picks the colour role and `tone` picks the archetype (soft / solid / outline). Both live in the theme's `tag` entry, so a theme restyles every chip in the app without touching markup. Structurally a chip is **body + trailing action as siblings**, never nested buttons: an interactive chip whose body is a `<button>` cannot contain the remove `<button>` (invalid HTML, and the inner control becomes unreachable for keyboard users). Both stay independently operable.",
9006
9006
  category: "data",
9007
- version: "10.2.1",
9007
+ version: "10.3.0",
9008
9008
  bindings: {
9009
9009
  angular: {
9010
9010
  importPath: "@uni-design-system/uni-angular",
@@ -9361,7 +9361,7 @@ initialFocus="input"
9361
9361
  summary: "",
9362
9362
  description: "",
9363
9363
  category: "forms",
9364
- version: "10.2.1",
9364
+ version: "10.3.0",
9365
9365
  bindings: {
9366
9366
  angular: {
9367
9367
  importPath: "@uni-design-system/uni-angular",
@@ -9694,7 +9694,7 @@ placeholder="Name or address\u2026"
9694
9694
  summary: "The typography primitive, applied as an attribute to any element so semantics stay yours.",
9695
9695
  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.',
9696
9696
  category: "primitives",
9697
- version: "10.2.1",
9697
+ version: "10.3.0",
9698
9698
  bindings: {
9699
9699
  angular: {
9700
9700
  importPath: "@uni-design-system/uni-angular",
@@ -9796,7 +9796,7 @@ placeholder="Name or address\u2026"
9796
9796
  summary: "",
9797
9797
  description: "",
9798
9798
  category: "forms",
9799
- version: "10.2.1",
9799
+ version: "10.3.0",
9800
9800
  bindings: {
9801
9801
  angular: {
9802
9802
  importPath: "@uni-design-system/uni-angular",
@@ -9996,7 +9996,7 @@ placeholder="Name or address\u2026"
9996
9996
  summary: "",
9997
9997
  description: "",
9998
9998
  category: "primitives",
9999
- version: "10.2.1",
9999
+ version: "10.3.0",
10000
10000
  bindings: {
10001
10001
  angular: {
10002
10002
  importPath: "@uni-design-system/uni-angular",
@@ -10026,7 +10026,7 @@ placeholder="Name or address\u2026"
10026
10026
  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).",
10027
10027
  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).",
10028
10028
  category: "components",
10029
- version: "10.2.1",
10029
+ version: "10.3.0",
10030
10030
  bindings: {
10031
10031
  angular: {
10032
10032
  importPath: "@uni-design-system/uni-angular",
@@ -10084,7 +10084,7 @@ placeholder="Name or address\u2026"
10084
10084
  summary: "Time field: a combobox over time options \u2014 the same listbox contract as uni-search-input and uni-tag-input.",
10085
10085
  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.",
10086
10086
  category: "forms",
10087
- version: "10.2.1",
10087
+ version: "10.3.0",
10088
10088
  bindings: {
10089
10089
  angular: {
10090
10090
  importPath: "@uni-design-system/uni-angular",
@@ -10292,7 +10292,7 @@ placeholder="Name or address\u2026"
10292
10292
  summary: "",
10293
10293
  description: "",
10294
10294
  category: "forms",
10295
- version: "10.2.1",
10295
+ version: "10.3.0",
10296
10296
  bindings: {
10297
10297
  angular: {
10298
10298
  importPath: "@uni-design-system/uni-angular",
@@ -10515,7 +10515,7 @@ placeholder="Name or address\u2026"
10515
10515
  summary: "",
10516
10516
  description: "",
10517
10517
  category: "feedback",
10518
- version: "10.2.1",
10518
+ version: "10.3.0",
10519
10519
  bindings: {
10520
10520
  angular: {
10521
10521
  importPath: "@uni-design-system/uni-angular",
@@ -10602,7 +10602,7 @@ placeholder="Name or address\u2026"
10602
10602
  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).',
10603
10603
  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.',
10604
10604
  category: "components",
10605
- version: "10.2.1",
10605
+ version: "10.3.0",
10606
10606
  bindings: {
10607
10607
  angular: {
10608
10608
  importPath: "@uni-design-system/uni-angular",
@@ -10729,7 +10729,7 @@ placeholder="Name or address\u2026"
10729
10729
  summary: "",
10730
10730
  description: "",
10731
10731
  category: "layout",
10732
- version: "10.2.1",
10732
+ version: "10.3.0",
10733
10733
  bindings: {
10734
10734
  angular: {
10735
10735
  importPath: "@uni-design-system/uni-angular",
@@ -17225,6 +17225,18 @@ placeholder="Name or address\u2026"
17225
17225
  {
17226
17226
  package: "@uni-design-system/uni-angular",
17227
17227
  releases: [
17228
+ {
17229
+ version: "10.3.0",
17230
+ entries: [
17231
+ {
17232
+ bump: "minor",
17233
+ title: "`uni-button`: the focus ring is themed, and the theme now outranks the reset.",
17234
+ body: "**Five of the twelve variants had no visible keyboard focus ring.** The ring\nresolved the variant _name_ as a colour token \u2014 the pattern 10.2.0 removed from\ncheckbox, radio and toggle, missed on the one component where it costs an\naccessibility failure rather than a wrong colour:\n\n```ts\noutline: `2px solid ${this.theme.colors()[this.variant()]}`;\n```\n\n`ghost` resolves to `transparent`, so its ring was drawn invisibly.\n`light`, `onLight`, `dark` and `onDark` have no colour token at all, so the\ndeclaration became `2px solid undefined` and the parser dropped it \u2014 as would\nany intent a consumer registers. In every case `outline-offset` survived, so\nthe element still shifted on focus and the missing ring went unnoticed. This\nwas live without the registry involved.\n\nThe colour now comes from the variant's theme entry via `variantOptions`, the\nmechanism the selection controls already use, and falls back to the reserved\n`primary` accent rather than to nothing. Each variant keeps the ring colour it\nhad; `ghost` gains a visible one. The ring also routes through the shared\n`focusRingStyle`, so a theme defining `focusRing` primitives restyles the button\nalongside every other control.\n\n**A theme could not give a button a border.** `border`, `outline`, `overflow`\nand `transition` were applied _after_ the theme's styles, so a variant\ndeclaring a border was silently erased and `!important` was the only way\nthrough \u2014 which then spread to every state adjusting that border, since the\nshorthand outranks the longhand.\n\nThe base theme was caught by its own reset: `secondary` is commented \"Hollow\"\nand declares `1px solid`, and has been rendering borderless. **It now renders\nits border** \u2014 the one visible change here for anyone on the default theme.\n\nThose four properties move ahead of the theme's styles, resolving the\n`TODO: Set priority on theme-defined styles` that sat on this line. Structure\nthe component genuinely owns \u2014 `position` for the ripple, the symbol slots \u2014\nstays after, and the reset still applies to every variant that does not\noverride it.\n\n**`uni-icon-button`'s hover moved to the theme too.** It branched on\n`variant() === 'ghost'` to choose between a raised shadow and a translucent\nwash, after the theme's own styles. Being a binary partition, every intent a\nconsumer registered fell into the not-ghost half and was given a lift whether\nor not it suited \u2014 a recessive intent included \u2014 and no theme could correct it.\nBoth themes in this repo declare a ghost hover and had it silently overridden.\n\nBoth treatments now live in `iconButton.variants` beside the colours they belong\nwith. Rendering is unchanged for the variants the theme styles; a variant it\ndoes not style no longer receives a hover it never asked for, and the `disabled`\nvariant loses one it should never have had, since its block is also spread into\n`&:disabled`.\n\n**`uni-icon-button` had no focus indicator at all.** Its structural block cleared\nthe user-agent outline and put nothing back, in every variant \u2014 so the close\naffordance in every dialog and drawer header was unreachable-looking under\nkeyboard navigation. This was not reported; it was found while verifying the\nbutton fix above.\n\nIt now draws the shared ring, with its colour read from the same\n`variantOptions.focusColor` the button uses. The indicator is applied last on\npurpose: its appearance is the theme's, through `focusColor` and the `focusRing`\nprimitives, but whether one exists is not a style a theme should be able to\nswitch off by accident.",
17235
+ commit: "ab1689a"
17236
+ }
17237
+ ],
17238
+ dependencyBumps: []
17239
+ },
17228
17240
  {
17229
17241
  version: "10.2.1",
17230
17242
  entries: [],
@@ -17989,6 +18001,18 @@ placeholder="Name or address\u2026"
17989
18001
  {
17990
18002
  package: "@uni-design-system/uni-core",
17991
18003
  releases: [
18004
+ {
18005
+ version: "10.3.0",
18006
+ entries: [
18007
+ {
18008
+ bump: "minor",
18009
+ title: "`uni-button`: the focus ring is themed, and the theme now outranks the reset.",
18010
+ body: "**Five of the twelve variants had no visible keyboard focus ring.** The ring\nresolved the variant _name_ as a colour token \u2014 the pattern 10.2.0 removed from\ncheckbox, radio and toggle, missed on the one component where it costs an\naccessibility failure rather than a wrong colour:\n\n```ts\noutline: `2px solid ${this.theme.colors()[this.variant()]}`;\n```\n\n`ghost` resolves to `transparent`, so its ring was drawn invisibly.\n`light`, `onLight`, `dark` and `onDark` have no colour token at all, so the\ndeclaration became `2px solid undefined` and the parser dropped it \u2014 as would\nany intent a consumer registers. In every case `outline-offset` survived, so\nthe element still shifted on focus and the missing ring went unnoticed. This\nwas live without the registry involved.\n\nThe colour now comes from the variant's theme entry via `variantOptions`, the\nmechanism the selection controls already use, and falls back to the reserved\n`primary` accent rather than to nothing. Each variant keeps the ring colour it\nhad; `ghost` gains a visible one. The ring also routes through the shared\n`focusRingStyle`, so a theme defining `focusRing` primitives restyles the button\nalongside every other control.\n\n**A theme could not give a button a border.** `border`, `outline`, `overflow`\nand `transition` were applied _after_ the theme's styles, so a variant\ndeclaring a border was silently erased and `!important` was the only way\nthrough \u2014 which then spread to every state adjusting that border, since the\nshorthand outranks the longhand.\n\nThe base theme was caught by its own reset: `secondary` is commented \"Hollow\"\nand declares `1px solid`, and has been rendering borderless. **It now renders\nits border** \u2014 the one visible change here for anyone on the default theme.\n\nThose four properties move ahead of the theme's styles, resolving the\n`TODO: Set priority on theme-defined styles` that sat on this line. Structure\nthe component genuinely owns \u2014 `position` for the ripple, the symbol slots \u2014\nstays after, and the reset still applies to every variant that does not\noverride it.\n\n**`uni-icon-button`'s hover moved to the theme too.** It branched on\n`variant() === 'ghost'` to choose between a raised shadow and a translucent\nwash, after the theme's own styles. Being a binary partition, every intent a\nconsumer registered fell into the not-ghost half and was given a lift whether\nor not it suited \u2014 a recessive intent included \u2014 and no theme could correct it.\nBoth themes in this repo declare a ghost hover and had it silently overridden.\n\nBoth treatments now live in `iconButton.variants` beside the colours they belong\nwith. Rendering is unchanged for the variants the theme styles; a variant it\ndoes not style no longer receives a hover it never asked for, and the `disabled`\nvariant loses one it should never have had, since its block is also spread into\n`&:disabled`.\n\n**`uni-icon-button` had no focus indicator at all.** Its structural block cleared\nthe user-agent outline and put nothing back, in every variant \u2014 so the close\naffordance in every dialog and drawer header was unreachable-looking under\nkeyboard navigation. This was not reported; it was found while verifying the\nbutton fix above.\n\nIt now draws the shared ring, with its colour read from the same\n`variantOptions.focusColor` the button uses. The indicator is applied last on\npurpose: its appearance is the theme's, through `focusColor` and the `focusRing`\nprimitives, but whether one exists is not a style a theme should be able to\nswitch off by accident.",
18011
+ commit: "ab1689a"
18012
+ }
18013
+ ],
18014
+ dependencyBumps: []
18015
+ },
17992
18016
  {
17993
18017
  version: "10.2.1",
17994
18018
  entries: [],
@@ -18525,6 +18549,11 @@ placeholder="Name or address\u2026"
18525
18549
  {
18526
18550
  package: "@uni-design-system/uni-react",
18527
18551
  releases: [
18552
+ {
18553
+ version: "10.3.0",
18554
+ entries: [],
18555
+ dependencyBumps: []
18556
+ },
18528
18557
  {
18529
18558
  version: "10.2.1",
18530
18559
  entries: [],
@@ -18768,6 +18797,11 @@ placeholder="Name or address\u2026"
18768
18797
  {
18769
18798
  package: "@uni-design-system/uni-mcp",
18770
18799
  releases: [
18800
+ {
18801
+ version: "10.3.0",
18802
+ entries: [],
18803
+ dependencyBumps: []
18804
+ },
18771
18805
  {
18772
18806
  version: "10.2.1",
18773
18807
  entries: [
@@ -20542,6 +20576,15 @@ var buildComponents = (c) => ({
20542
20576
  cursor: "pointer",
20543
20577
  transition: "all 0.28s ease"
20544
20578
  },
20579
+ variantOptions: {
20580
+ primary: { focusColor: "primary" },
20581
+ secondary: { focusColor: "secondary" },
20582
+ tertiary: { focusColor: "tertiary" },
20583
+ warn: { focusColor: "warn" },
20584
+ success: { focusColor: "success" },
20585
+ disabled: { focusColor: "disabled" },
20586
+ ghost: { focusColor: "primary" }
20587
+ },
20545
20588
  variants: {
20546
20589
  ghost: {
20547
20590
  backgroundColor: "transparent",
@@ -20613,30 +20656,45 @@ var buildComponents = (c) => ({
20613
20656
  },
20614
20657
  iconButton: {
20615
20658
  options: { borderRadius: "max" },
20659
+ variantOptions: {
20660
+ primary: { focusColor: "primary" },
20661
+ secondary: { focusColor: "secondary" },
20662
+ tertiary: { focusColor: "tertiary" },
20663
+ warn: { focusColor: "warn" },
20664
+ success: { focusColor: "success" },
20665
+ disabled: { focusColor: "disabled" },
20666
+ ghost: { focusColor: "primary" }
20667
+ },
20616
20668
  variants: {
20617
20669
  ghost: {
20618
20670
  backgroundColor: "transparent",
20619
- color: "currentcolor"
20671
+ color: "currentcolor",
20672
+ "&:hover": { backgroundColor: "rgba(0,0,0,0.1)" }
20620
20673
  },
20621
20674
  primary: {
20622
20675
  backgroundColor: c.primary,
20623
- color: c["on-primary"]
20676
+ color: c["on-primary"],
20677
+ "&:hover": { boxShadow: BaseShadows.raised }
20624
20678
  },
20625
20679
  secondary: {
20626
20680
  backgroundColor: c.secondary,
20627
- color: c["on-secondary"]
20681
+ color: c["on-secondary"],
20682
+ "&:hover": { boxShadow: BaseShadows.raised }
20628
20683
  },
20629
20684
  tertiary: {
20630
20685
  backgroundColor: c.tertiary,
20631
- color: c["on-tertiary"]
20686
+ color: c["on-tertiary"],
20687
+ "&:hover": { boxShadow: BaseShadows.raised }
20632
20688
  },
20633
20689
  warn: {
20634
20690
  backgroundColor: c.warn,
20635
- color: c["on-warn"]
20691
+ color: c["on-warn"],
20692
+ "&:hover": { boxShadow: BaseShadows.raised }
20636
20693
  },
20637
20694
  success: {
20638
20695
  backgroundColor: c.success,
20639
- color: c["on-success"]
20696
+ color: c["on-success"],
20697
+ "&:hover": { boxShadow: BaseShadows.raised }
20640
20698
  },
20641
20699
  disabled: {
20642
20700
  backgroundColor: "transparent !important",
@@ -22258,4 +22316,4 @@ export {
22258
22316
  buildStoredTheme,
22259
22317
  createUniServer
22260
22318
  };
22261
- //# sourceMappingURL=chunk-JMAG4RA3.js.map
22319
+ //# sourceMappingURL=chunk-UAV4NZYN.js.map