@uni-design-system/uni-mcp 11.4.0 → 11.5.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,17 @@ import { z } from "zod";
7
7
  // src/data/uni-index.json
8
8
  var uni_index_default = {
9
9
  meta: {
10
- version: "11.4.0",
11
- builtAt: "2026-09-28T18:43:53.255Z",
10
+ version: "11.5.0",
11
+ builtAt: "2026-10-02T22:31:37.604Z",
12
12
  frameworks: [
13
13
  "angular"
14
14
  ],
15
15
  counts: {
16
16
  components: 87,
17
- tokens: 493,
17
+ tokens: 494,
18
18
  themes: 2,
19
- examples: 245
19
+ examples: 246,
20
+ utilities: 122
20
21
  }
21
22
  },
22
23
  components: [
@@ -27,7 +28,7 @@ var uni_index_default = {
27
28
  summary: "",
28
29
  description: "",
29
30
  category: "feedback",
30
- version: "11.4.0",
31
+ version: "11.5.0",
31
32
  bindings: {
32
33
  angular: {
33
34
  importPath: "@uni-design-system/uni-angular",
@@ -117,7 +118,7 @@ var uni_index_default = {
117
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.",
118
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.",
119
120
  category: "components",
120
- version: "11.4.0",
121
+ version: "11.5.0",
121
122
  bindings: {
122
123
  angular: {
123
124
  importPath: "@uni-design-system/uni-angular",
@@ -190,7 +191,7 @@ var uni_index_default = {
190
191
  summary: "Identity avatar with a graceful fallback chain: image \u2192 initials from `name` \u2192 themed symbol.",
191
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.",
192
193
  category: "components",
193
- version: "11.4.0",
194
+ version: "11.5.0",
194
195
  bindings: {
195
196
  angular: {
196
197
  importPath: "@uni-design-system/uni-angular",
@@ -285,7 +286,7 @@ var uni_index_default = {
285
286
  summary: "Overlapping stack of avatars.",
286
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.",
287
288
  category: "components",
288
- version: "11.4.0",
289
+ version: "11.5.0",
289
290
  bindings: {
290
291
  angular: {
291
292
  importPath: "@uni-design-system/uni-angular",
@@ -334,7 +335,7 @@ var uni_index_default = {
334
335
  summary: "",
335
336
  description: "",
336
337
  category: "primitives",
337
- version: "11.4.0",
338
+ version: "11.5.0",
338
339
  bindings: {
339
340
  angular: {
340
341
  importPath: "@uni-design-system/uni-angular",
@@ -415,7 +416,7 @@ var uni_index_default = {
415
416
  summary: "",
416
417
  description: "",
417
418
  category: "feedback",
418
- version: "11.4.0",
419
+ version: "11.5.0",
419
420
  bindings: {
420
421
  angular: {
421
422
  importPath: "@uni-design-system/uni-angular",
@@ -512,7 +513,7 @@ var uni_index_default = {
512
513
  summary: "",
513
514
  description: "",
514
515
  category: "directives",
515
- version: "11.4.0",
516
+ version: "11.5.0",
516
517
  bindings: {
517
518
  angular: {
518
519
  importPath: "@uni-design-system/uni-angular",
@@ -536,7 +537,7 @@ var uni_index_default = {
536
537
  summary: 'The base layout primitive, applied as an attribute to any element so semantics stay yours: `<main box-layout [grow]="1" padding="md">`.',
537
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.',
538
539
  category: "layout",
539
- version: "11.4.0",
540
+ version: "11.5.0",
540
541
  bindings: {
541
542
  angular: {
542
543
  importPath: "@uni-design-system/uni-angular",
@@ -944,7 +945,7 @@ var uni_index_default = {
944
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.',
945
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.',
946
947
  category: "components",
947
- version: "11.4.0",
948
+ version: "11.5.0",
948
949
  bindings: {
949
950
  angular: {
950
951
  importPath: "@uni-design-system/uni-angular",
@@ -1029,7 +1030,7 @@ var uni_index_default = {
1029
1030
  summary: "",
1030
1031
  description: "",
1031
1032
  category: "primitives",
1032
- version: "11.4.0",
1033
+ version: "11.5.0",
1033
1034
  bindings: {
1034
1035
  angular: {
1035
1036
  importPath: "@uni-design-system/uni-angular",
@@ -1189,7 +1190,7 @@ var uni_index_default = {
1189
1190
  summary: "",
1190
1191
  description: "",
1191
1192
  category: "primitives",
1192
- version: "11.4.0",
1193
+ version: "11.5.0",
1193
1194
  bindings: {
1194
1195
  angular: {
1195
1196
  importPath: "@uni-design-system/uni-angular",
@@ -1221,7 +1222,7 @@ var uni_index_default = {
1221
1222
  summary: "Inline month calendar: single-date or start\u2013end range selection, day markers (availability dots), min/max fences and disabled dates.",
1222
1223
  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.",
1223
1224
  category: "forms",
1224
- version: "11.4.0",
1225
+ version: "11.5.0",
1225
1226
  bindings: {
1226
1227
  angular: {
1227
1228
  importPath: "@uni-design-system/uni-angular",
@@ -1462,7 +1463,7 @@ var uni_index_default = {
1462
1463
  summary: "Anchored coach-mark panel that dims the page and cuts a spotlight hole around its target.",
1463
1464
  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).',
1464
1465
  category: "components",
1465
- version: "11.4.0",
1466
+ version: "11.5.0",
1466
1467
  bindings: {
1467
1468
  angular: {
1468
1469
  importPath: "@uni-design-system/uni-angular",
@@ -1682,7 +1683,7 @@ var uni_index_default = {
1682
1683
  summary: "",
1683
1684
  description: "",
1684
1685
  category: "layout",
1685
- version: "11.4.0",
1686
+ version: "11.5.0",
1686
1687
  bindings: {
1687
1688
  angular: {
1688
1689
  importPath: "@uni-design-system/uni-angular",
@@ -1744,7 +1745,7 @@ var uni_index_default = {
1744
1745
  summary: "",
1745
1746
  description: "",
1746
1747
  category: "layout",
1747
- version: "11.4.0",
1748
+ version: "11.5.0",
1748
1749
  bindings: {
1749
1750
  angular: {
1750
1751
  importPath: "@uni-design-system/uni-angular",
@@ -1785,7 +1786,7 @@ var uni_index_default = {
1785
1786
  summary: "",
1786
1787
  description: "",
1787
1788
  category: "layout",
1788
- version: "11.4.0",
1789
+ version: "11.5.0",
1789
1790
  bindings: {
1790
1791
  angular: {
1791
1792
  importPath: "@uni-design-system/uni-angular",
@@ -1842,7 +1843,7 @@ var uni_index_default = {
1842
1843
  summary: "",
1843
1844
  description: "",
1844
1845
  category: "layout",
1845
- version: "11.4.0",
1846
+ version: "11.5.0",
1846
1847
  bindings: {
1847
1848
  angular: {
1848
1849
  importPath: "@uni-design-system/uni-angular",
@@ -1897,7 +1898,7 @@ var uni_index_default = {
1897
1898
  summary: "",
1898
1899
  description: "",
1899
1900
  category: "forms",
1900
- version: "11.4.0",
1901
+ version: "11.5.0",
1901
1902
  bindings: {
1902
1903
  angular: {
1903
1904
  importPath: "@uni-design-system/uni-angular",
@@ -2119,7 +2120,7 @@ var uni_index_default = {
2119
2120
  summary: "Form-bound, closed-set, single-select autocomplete: `FormValueControl<T | null>` over object `Options<T>`, type-to-filter, commit-on-select.",
2120
2121
  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.",
2121
2122
  category: "forms",
2122
- version: "11.4.0",
2123
+ version: "11.5.0",
2123
2124
  bindings: {
2124
2125
  angular: {
2125
2126
  importPath: "@uni-design-system/uni-angular",
@@ -2405,7 +2406,7 @@ emptyText="No countries found"
2405
2406
  summary: "",
2406
2407
  description: "",
2407
2408
  category: "feedback",
2408
- version: "11.4.0",
2409
+ version: "11.5.0",
2409
2410
  bindings: {
2410
2411
  angular: {
2411
2412
  importPath: "@uni-design-system/uni-angular",
@@ -2452,7 +2453,7 @@ emptyText="No countries found"
2452
2453
  summary: "",
2453
2454
  description: "",
2454
2455
  category: "forms",
2455
- version: "11.4.0",
2456
+ version: "11.5.0",
2456
2457
  bindings: {
2457
2458
  angular: {
2458
2459
  importPath: "@uni-design-system/uni-angular",
@@ -2551,7 +2552,7 @@ emptyText="No countries found"
2551
2552
  summary: "",
2552
2553
  description: "",
2553
2554
  category: "data",
2554
- version: "11.4.0",
2555
+ version: "11.5.0",
2555
2556
  bindings: {
2556
2557
  angular: {
2557
2558
  importPath: "@uni-design-system/uni-angular",
@@ -2791,7 +2792,7 @@ emptyText="No countries found"
2791
2792
  summary: "Date field with free-typed parsing and a popup calendar.",
2792
2793
  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.",
2793
2794
  category: "forms",
2794
- version: "11.4.0",
2795
+ version: "11.5.0",
2795
2796
  bindings: {
2796
2797
  angular: {
2797
2798
  importPath: "@uni-design-system/uni-angular",
@@ -3022,7 +3023,7 @@ emptyText="No countries found"
3022
3023
  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.",
3023
3024
  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.",
3024
3025
  category: "forms",
3025
- version: "11.4.0",
3026
+ version: "11.5.0",
3026
3027
  bindings: {
3027
3028
  angular: {
3028
3029
  importPath: "@uni-design-system/uni-angular",
@@ -3215,7 +3216,7 @@ emptyText="No countries found"
3215
3216
  summary: "Text input that emits `change` only after the user pauses typing.",
3216
3217
  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.",
3217
3218
  category: "forms",
3218
- version: "11.4.0",
3219
+ version: "11.5.0",
3219
3220
  bindings: {
3220
3221
  angular: {
3221
3222
  importPath: "@uni-design-system/uni-angular",
@@ -3363,7 +3364,7 @@ emptyText="No countries found"
3363
3364
  summary: "Modal dialog on the native `<dialog>` element, laid out as three rows: an optional `[dialog-header]`, the projected body, an optional `[dialog-buttons]`.",
3364
3365
  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.",
3365
3366
  category: "feedback",
3366
- version: "11.4.0",
3367
+ version: "11.5.0",
3367
3368
  bindings: {
3368
3369
  angular: {
3369
3370
  importPath: "@uni-design-system/uni-angular",
@@ -3516,7 +3517,7 @@ uni-dialog
3516
3517
  summary: "",
3517
3518
  description: "",
3518
3519
  category: "feedback",
3519
- version: "11.4.0",
3520
+ version: "11.5.0",
3520
3521
  bindings: {
3521
3522
  angular: {
3522
3523
  importPath: "@uni-design-system/uni-angular",
@@ -3620,7 +3621,7 @@ uni-dialog
3620
3621
  summary: "",
3621
3622
  description: "",
3622
3623
  category: "feedback",
3623
- version: "11.4.0",
3624
+ version: "11.5.0",
3624
3625
  bindings: {
3625
3626
  angular: {
3626
3627
  importPath: "@uni-design-system/uni-angular",
@@ -3661,7 +3662,7 @@ uni-dialog
3661
3662
  summary: "",
3662
3663
  description: "",
3663
3664
  category: "layout",
3664
- version: "11.4.0",
3665
+ version: "11.5.0",
3665
3666
  bindings: {
3666
3667
  angular: {
3667
3668
  importPath: "@uni-design-system/uni-angular",
@@ -3717,7 +3718,7 @@ uni-dialog
3717
3718
  summary: "",
3718
3719
  description: "",
3719
3720
  category: "directives",
3720
- version: "11.4.0",
3721
+ version: "11.5.0",
3721
3722
  bindings: {
3722
3723
  angular: {
3723
3724
  importPath: "@uni-design-system/uni-angular",
@@ -3749,7 +3750,7 @@ uni-dialog
3749
3750
  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.",
3750
3751
  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.",
3751
3752
  category: "components",
3752
- version: "11.4.0",
3753
+ version: "11.5.0",
3753
3754
  bindings: {
3754
3755
  angular: {
3755
3756
  importPath: "@uni-design-system/uni-angular",
@@ -3940,7 +3941,7 @@ initialFocus="input"
3940
3941
  summary: "The drawer's pinned footer action row \u2014 the save bar of an editor panel.",
3941
3942
  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.",
3942
3943
  category: "primitives",
3943
- version: "11.4.0",
3944
+ version: "11.5.0",
3944
3945
  bindings: {
3945
3946
  angular: {
3946
3947
  importPath: "@uni-design-system/uni-angular",
@@ -4037,7 +4038,7 @@ initialFocus="input"
4037
4038
  summary: "The drawer's pinned header row: a title, and optionally a close button.",
4038
4039
  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.",
4039
4040
  category: "components",
4040
- version: "11.4.0",
4041
+ version: "11.5.0",
4041
4042
  bindings: {
4042
4043
  angular: {
4043
4044
  importPath: "@uni-design-system/uni-angular",
@@ -4085,7 +4086,7 @@ initialFocus="input"
4085
4086
  summary: "",
4086
4087
  description: "",
4087
4088
  category: "components",
4088
- version: "11.4.0",
4089
+ version: "11.5.0",
4089
4090
  bindings: {
4090
4091
  angular: {
4091
4092
  importPath: "@uni-design-system/uni-angular",
@@ -4219,7 +4220,7 @@ initialFocus="input"
4219
4220
  summary: "",
4220
4221
  description: "",
4221
4222
  category: "layout",
4222
- version: "11.4.0",
4223
+ version: "11.5.0",
4223
4224
  bindings: {
4224
4225
  angular: {
4225
4226
  importPath: "@uni-design-system/uni-angular",
@@ -4323,7 +4324,7 @@ initialFocus="input"
4323
4324
  summary: "",
4324
4325
  description: "",
4325
4326
  category: "layout",
4326
- version: "11.4.0",
4327
+ version: "11.5.0",
4327
4328
  bindings: {
4328
4329
  angular: {
4329
4330
  importPath: "@uni-design-system/uni-angular",
@@ -4394,7 +4395,7 @@ initialFocus="input"
4394
4395
  summary: "Trigger for a {@link UniExpandComponent} region.",
4395
4396
  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.",
4396
4397
  category: "layout",
4397
- version: "11.4.0",
4398
+ version: "11.5.0",
4398
4399
  bindings: {
4399
4400
  angular: {
4400
4401
  importPath: "@uni-design-system/uni-angular",
@@ -4479,7 +4480,7 @@ initialFocus="input"
4479
4480
  summary: "",
4480
4481
  description: "",
4481
4482
  category: "forms",
4482
- version: "11.4.0",
4483
+ version: "11.5.0",
4483
4484
  bindings: {
4484
4485
  angular: {
4485
4486
  importPath: "@uni-design-system/uni-angular",
@@ -4637,7 +4638,7 @@ initialFocus="input"
4637
4638
  summary: "",
4638
4639
  description: "",
4639
4640
  category: "layout",
4640
- version: "11.4.0",
4641
+ version: "11.5.0",
4641
4642
  bindings: {
4642
4643
  angular: {
4643
4644
  importPath: "@uni-design-system/uni-angular",
@@ -4734,7 +4735,7 @@ initialFocus="input"
4734
4735
  summary: "",
4735
4736
  description: "",
4736
4737
  category: "layout",
4737
- version: "11.4.0",
4738
+ version: "11.5.0",
4738
4739
  bindings: {
4739
4740
  angular: {
4740
4741
  importPath: "@uni-design-system/uni-angular",
@@ -4766,7 +4767,7 @@ initialFocus="input"
4766
4767
  summary: "",
4767
4768
  description: "",
4768
4769
  category: "primitives",
4769
- version: "11.4.0",
4770
+ version: "11.5.0",
4770
4771
  bindings: {
4771
4772
  angular: {
4772
4773
  importPath: "@uni-design-system/uni-angular",
@@ -4826,7 +4827,7 @@ initialFocus="input"
4826
4827
  summary: "",
4827
4828
  description: "",
4828
4829
  category: "primitives",
4829
- version: "11.4.0",
4830
+ version: "11.5.0",
4830
4831
  bindings: {
4831
4832
  angular: {
4832
4833
  importPath: "@uni-design-system/uni-angular",
@@ -4929,7 +4930,7 @@ initialFocus="input"
4929
4930
  summary: "A button that lives inside a sentence.",
4930
4931
  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.",
4931
4932
  category: "primitives",
4932
- version: "11.4.0",
4933
+ version: "11.5.0",
4933
4934
  bindings: {
4934
4935
  angular: {
4935
4936
  importPath: "@uni-design-system/uni-angular",
@@ -5044,7 +5045,7 @@ initialFocus="input"
5044
5045
  summary: "",
5045
5046
  description: "",
5046
5047
  category: "forms",
5047
- version: "11.4.0",
5048
+ version: "11.5.0",
5048
5049
  bindings: {
5049
5050
  angular: {
5050
5051
  importPath: "@uni-design-system/uni-angular",
@@ -5329,7 +5330,7 @@ initialFocus="input"
5329
5330
  summary: "",
5330
5331
  description: "",
5331
5332
  category: "forms",
5332
- version: "11.4.0",
5333
+ version: "11.5.0",
5333
5334
  bindings: {
5334
5335
  angular: {
5335
5336
  importPath: "@uni-design-system/uni-angular",
@@ -5450,7 +5451,7 @@ initialFocus="input"
5450
5451
  summary: "",
5451
5452
  description: "",
5452
5453
  category: "components",
5453
- version: "11.4.0",
5454
+ version: "11.5.0",
5454
5455
  bindings: {
5455
5456
  angular: {
5456
5457
  importPath: "@uni-design-system/uni-angular",
@@ -5520,7 +5521,7 @@ initialFocus="input"
5520
5521
  summary: "",
5521
5522
  description: "",
5522
5523
  category: "layout",
5523
- version: "11.4.0",
5524
+ version: "11.5.0",
5524
5525
  bindings: {
5525
5526
  angular: {
5526
5527
  importPath: "@uni-design-system/uni-angular",
@@ -5624,7 +5625,7 @@ initialFocus="input"
5624
5625
  summary: "",
5625
5626
  description: "",
5626
5627
  category: "layout",
5627
- version: "11.4.0",
5628
+ version: "11.5.0",
5628
5629
  bindings: {
5629
5630
  angular: {
5630
5631
  importPath: "@uni-design-system/uni-angular",
@@ -5706,7 +5707,7 @@ initialFocus="input"
5706
5707
  summary: "",
5707
5708
  description: "",
5708
5709
  category: "forms",
5709
- version: "11.4.0",
5710
+ version: "11.5.0",
5710
5711
  bindings: {
5711
5712
  angular: {
5712
5713
  importPath: "@uni-design-system/uni-angular",
@@ -5800,7 +5801,7 @@ initialFocus="input"
5800
5801
  summary: "",
5801
5802
  description: "",
5802
5803
  category: "forms",
5803
- version: "11.4.0",
5804
+ version: "11.5.0",
5804
5805
  bindings: {
5805
5806
  angular: {
5806
5807
  importPath: "@uni-design-system/uni-angular",
@@ -5979,7 +5980,7 @@ initialFocus="input"
5979
5980
  summary: "",
5980
5981
  description: "",
5981
5982
  category: "feedback",
5982
- version: "11.4.0",
5983
+ version: "11.5.0",
5983
5984
  bindings: {
5984
5985
  angular: {
5985
5986
  importPath: "@uni-design-system/uni-angular",
@@ -6239,7 +6240,7 @@ initialFocus="input"
6239
6240
  summary: "",
6240
6241
  description: "",
6241
6242
  category: "feedback",
6242
- version: "11.4.0",
6243
+ version: "11.5.0",
6243
6244
  bindings: {
6244
6245
  angular: {
6245
6246
  importPath: "@uni-design-system/uni-angular",
@@ -6263,7 +6264,7 @@ initialFocus="input"
6263
6264
  summary: "Numeric field with locale-aware parsing, `Intl` formatting on commit, prefix/suffix adornments and steppers that hold to repeat.",
6264
6265
  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.',
6265
6266
  category: "forms",
6266
- version: "11.4.0",
6267
+ version: "11.5.0",
6267
6268
  bindings: {
6268
6269
  angular: {
6269
6270
  importPath: "@uni-design-system/uni-angular",
@@ -6689,7 +6690,7 @@ initialFocus="input"
6689
6690
  summary: "Two linked numeric fields in one chrome, with one `{ start, end }` value \u2014 price filters, thresholds, tolerances.",
6690
6691
  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.",
6691
6692
  category: "forms",
6692
- version: "11.4.0",
6693
+ version: "11.5.0",
6693
6694
  bindings: {
6694
6695
  angular: {
6695
6696
  importPath: "@uni-design-system/uni-angular",
@@ -6980,7 +6981,7 @@ initialFocus="input"
6980
6981
  summary: "",
6981
6982
  description: "",
6982
6983
  category: "data",
6983
- version: "11.4.0",
6984
+ version: "11.5.0",
6984
6985
  bindings: {
6985
6986
  angular: {
6986
6987
  importPath: "@uni-design-system/uni-angular",
@@ -7081,7 +7082,7 @@ initialFocus="input"
7081
7082
  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.",
7082
7083
  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.',
7083
7084
  category: "layout",
7084
- version: "11.4.0",
7085
+ version: "11.5.0",
7085
7086
  bindings: {
7086
7087
  angular: {
7087
7088
  importPath: "@uni-design-system/uni-angular",
@@ -7273,7 +7274,7 @@ initialFocus="input"
7273
7274
  summary: "",
7274
7275
  description: "",
7275
7276
  category: "feedback",
7276
- version: "11.4.0",
7277
+ version: "11.5.0",
7277
7278
  bindings: {
7278
7279
  angular: {
7279
7280
  importPath: "@uni-design-system/uni-angular",
@@ -7337,7 +7338,7 @@ initialFocus="input"
7337
7338
  summary: "",
7338
7339
  description: "",
7339
7340
  category: "feedback",
7340
- version: "11.4.0",
7341
+ version: "11.5.0",
7341
7342
  bindings: {
7342
7343
  angular: {
7343
7344
  importPath: "@uni-design-system/uni-angular",
@@ -7409,7 +7410,7 @@ initialFocus="input"
7409
7410
  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.",
7410
7411
  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.',
7411
7412
  category: "forms",
7412
- version: "11.4.0",
7413
+ version: "11.5.0",
7413
7414
  bindings: {
7414
7415
  angular: {
7415
7416
  importPath: "@uni-design-system/uni-angular",
@@ -7612,7 +7613,7 @@ initialFocus="input"
7612
7613
  summary: "",
7613
7614
  description: "",
7614
7615
  category: "forms",
7615
- version: "11.4.0",
7616
+ version: "11.5.0",
7616
7617
  bindings: {
7617
7618
  angular: {
7618
7619
  importPath: "@uni-design-system/uni-angular",
@@ -7841,7 +7842,7 @@ initialFocus="input"
7841
7842
  summary: "Content for each of a radio group's options, in place of the plain label string.",
7842
7843
  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> ```',
7843
7844
  category: "forms",
7844
- version: "11.4.0",
7845
+ version: "11.5.0",
7845
7846
  bindings: {
7846
7847
  angular: {
7847
7848
  importPath: "@uni-design-system/uni-angular",
@@ -7865,7 +7866,7 @@ initialFocus="input"
7865
7866
  summary: "",
7866
7867
  description: "",
7867
7868
  category: "directives",
7868
- version: "11.4.0",
7869
+ version: "11.5.0",
7869
7870
  bindings: {
7870
7871
  angular: {
7871
7872
  importPath: "@uni-design-system/uni-angular",
@@ -7889,7 +7890,7 @@ initialFocus="input"
7889
7890
  summary: "",
7890
7891
  description: "",
7891
7892
  category: "layout",
7892
- version: "11.4.0",
7893
+ version: "11.5.0",
7893
7894
  bindings: {
7894
7895
  angular: {
7895
7896
  importPath: "@uni-design-system/uni-angular",
@@ -7944,7 +7945,7 @@ initialFocus="input"
7944
7945
  summary: "Native scroll area with theme-driven scrollbar styling.",
7945
7946
  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.",
7946
7947
  category: "layout",
7947
- version: "11.4.0",
7948
+ version: "11.5.0",
7948
7949
  bindings: {
7949
7950
  angular: {
7950
7951
  importPath: "@uni-design-system/uni-angular",
@@ -8091,7 +8092,7 @@ initialFocus="input"
8091
8092
  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.",
8092
8093
  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.",
8093
8094
  category: "forms",
8094
- version: "11.4.0",
8095
+ version: "11.5.0",
8095
8096
  bindings: {
8096
8097
  angular: {
8097
8098
  importPath: "@uni-design-system/uni-angular",
@@ -8218,7 +8219,7 @@ initialFocus="input"
8218
8219
  summary: "",
8219
8220
  description: "",
8220
8221
  category: "forms",
8221
- version: "11.4.0",
8222
+ version: "11.5.0",
8222
8223
  bindings: {
8223
8224
  angular: {
8224
8225
  importPath: "@uni-design-system/uni-angular",
@@ -8388,7 +8389,7 @@ initialFocus="input"
8388
8389
  summary: "Loading placeholder painted with surface tokens.",
8389
8390
  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.",
8390
8391
  category: "components",
8391
- version: "11.4.0",
8392
+ version: "11.5.0",
8392
8393
  bindings: {
8393
8394
  angular: {
8394
8395
  importPath: "@uni-design-system/uni-angular",
@@ -8539,7 +8540,7 @@ initialFocus="input"
8539
8540
  summary: "Bounded numeric input by pointer, for values where the *position* is the information: volume, opacity, weightings, price filters.",
8540
8541
  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.",
8541
8542
  category: "forms",
8542
- version: "11.4.0",
8543
+ version: "11.5.0",
8543
8544
  bindings: {
8544
8545
  angular: {
8545
8546
  importPath: "@uni-design-system/uni-angular",
@@ -8816,7 +8817,7 @@ initialFocus="input"
8816
8817
  summary: "",
8817
8818
  description: "",
8818
8819
  category: "feedback",
8819
- version: "11.4.0",
8820
+ version: "11.5.0",
8820
8821
  bindings: {
8821
8822
  angular: {
8822
8823
  importPath: "@uni-design-system/uni-angular",
@@ -8928,7 +8929,7 @@ initialFocus="input"
8928
8929
  summary: "",
8929
8930
  description: "",
8930
8931
  category: "data",
8931
- version: "11.4.0",
8932
+ version: "11.5.0",
8932
8933
  bindings: {
8933
8934
  angular: {
8934
8935
  importPath: "@uni-design-system/uni-angular",
@@ -8987,7 +8988,7 @@ initialFocus="input"
8987
8988
  summary: "",
8988
8989
  description: "",
8989
8990
  category: "layout",
8990
- version: "11.4.0",
8991
+ version: "11.5.0",
8991
8992
  bindings: {
8992
8993
  angular: {
8993
8994
  importPath: "@uni-design-system/uni-angular",
@@ -9042,7 +9043,7 @@ initialFocus="input"
9042
9043
  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.',
9043
9044
  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.',
9044
9045
  category: "components",
9045
- version: "11.4.0",
9046
+ version: "11.5.0",
9046
9047
  bindings: {
9047
9048
  angular: {
9048
9049
  importPath: "@uni-design-system/uni-angular",
@@ -9160,7 +9161,7 @@ initialFocus="input"
9160
9161
  summary: "",
9161
9162
  description: "",
9162
9163
  category: "primitives",
9163
- version: "11.4.0",
9164
+ version: "11.5.0",
9164
9165
  bindings: {
9165
9166
  angular: {
9166
9167
  importPath: "@uni-design-system/uni-angular",
@@ -9249,7 +9250,7 @@ initialFocus="input"
9249
9250
  summary: "One tab inside `uni-tabs`: a label for the tablist plus projected panel content.",
9250
9251
  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.",
9251
9252
  category: "components",
9252
- version: "11.4.0",
9253
+ version: "11.5.0",
9253
9254
  bindings: {
9254
9255
  angular: {
9255
9256
  importPath: "@uni-design-system/uni-angular",
@@ -9287,9 +9288,9 @@ initialFocus="input"
9287
9288
  name: "Tabs",
9288
9289
  status: "stable",
9289
9290
  summary: "WAI-ARIA tabs: roving tabindex, automatic activation (arrow keys move focus and select), Home/End, disabled tabs skipped.",
9290
- 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.",
9291
+ 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.",
9291
9292
  category: "components",
9292
- version: "11.4.0",
9293
+ version: "11.5.0",
9293
9294
  bindings: {
9294
9295
  angular: {
9295
9296
  importPath: "@uni-design-system/uni-angular",
@@ -9326,16 +9327,21 @@ initialFocus="input"
9326
9327
  {
9327
9328
  title: "Default",
9328
9329
  framework: "angular",
9329
- code: '<!-- Storybook story: Default -->\n<uni-tabs [selectedIndex]="selectedIndex ?? 0">\n<uni-tab label="Overview">\n <span uni-text="body-1-long">\n Arrow keys move between tabs (disabled tabs are skipped), Home and End jump\n to the extremes, and only the selected panel is rendered.\n </span>\n</uni-tab>\n<uni-tab label="Activity">\n <span uni-text="body-1-long">Recent activity would render here.</span>\n</uni-tab>\n<uni-tab label="Settings">\n <span uni-text="body-1-long">Settings content, instantiated on selection.</span>\n</uni-tab>\n</uni-tabs>'
9330
+ code: '<!-- Storybook story: Default -->\n<uni-tabs [selectedIndex]="selectedIndex ?? 0">\n<uni-tab label="Overview">\n <span uni-text="body-1-long" style="display: block; padding-top: 16px">\n Arrow keys move between tabs (disabled tabs are skipped), Home and End jump\n to the extremes, and only the selected panel is rendered.\n </span>\n</uni-tab>\n<uni-tab label="Activity">\n <span uni-text="body-1-long" style="display: block; padding-top: 16px">Recent activity would render here.</span>\n</uni-tab>\n<uni-tab label="Settings">\n <span uni-text="body-1-long" style="display: block; padding-top: 16px">Settings content, instantiated on selection.</span>\n</uni-tab>\n</uni-tabs>'
9331
+ },
9332
+ {
9333
+ title: "Uneven Panels",
9334
+ framework: "angular",
9335
+ code: '<!-- Storybook story: Uneven Panels -->\n<uni-tabs>\n<uni-tab label="Summary">\n <span uni-text="body-1-long" style="display: block; padding-top: 16px">\n A single line.\n </span>\n</uni-tab>\n<uni-tab label="Details">\n <div style="padding-top: 16px">\n @for (line of [1, 2, 3, 4, 5, 6]; track line) {\n <p uni-text="body-1-long">Detail line {{ line }} of a much taller panel.</p>\n }\n </div>\n</uni-tab>\n<uni-tab label="Notes">\n <div style="padding-top: 16px">\n @for (line of [1, 2, 3]; track line) {\n <p uni-text="body-1-long">Note {{ line }}.</p>\n }\n </div>\n</uni-tab>\n</uni-tabs>\n<p uni-text="body-1-long">Content below the tabs moves with the panel.</p>'
9330
9336
  },
9331
9337
  {
9332
9338
  title: "With Disabled Tab",
9333
9339
  framework: "angular",
9334
- code: '<!-- Storybook story: With Disabled Tab -->\n<uni-tabs>\n<uni-tab label="Open"><span uni-text="body-1-long">Open items.</span></uni-tab>\n<uni-tab label="Archived" [disabled]="true">\n <span uni-text="body-1-long">Unreachable while disabled.</span>\n</uni-tab>\n<uni-tab label="All"><span uni-text="body-1-long">Everything.</span></uni-tab>\n</uni-tabs>'
9340
+ code: '<!-- Storybook story: With Disabled Tab -->\n<uni-tabs>\n<uni-tab label="Open"><span uni-text="body-1-long" style="display: block; padding-top: 16px">Open items.</span></uni-tab>\n<uni-tab label="Archived" [disabled]="true">\n <span uni-text="body-1-long" style="display: block; padding-top: 16px">Unreachable while disabled.</span>\n</uni-tab>\n<uni-tab label="All"><span uni-text="body-1-long" style="display: block; padding-top: 16px">Everything.</span></uni-tab>\n</uni-tabs>'
9335
9341
  }
9336
9342
  ],
9337
9343
  guidelines: {
9338
- whenToUse: "Tabs organize peer views behind a single switcher. Each `uni-tab` supplies a label and\nits panel content; only the selected panel is instantiated, so heavy tab content costs\nnothing until visited.\nThe default tokens render underline tabs; a theme that sets `borderRadius: 'max'` and\nan `activeColor` gets segmented pills without any component changes.",
9344
+ whenToUse: "Tabs organize peer views behind a single switcher. Each `uni-tab` supplies a label and\nits panel content; only the selected panel is instantiated, so heavy tab content costs\nnothing until visited.\nThe panel adds no padding of its own: content sits flush against the tablist, and\nthe spacing around it is yours to set on whatever you project.\nThe default tokens render underline tabs; a theme that sets `borderRadius: 'max'` and\nan `activeColor` gets segmented pills without any component changes.",
9339
9345
  dos: [
9340
9346
  "Use for peer views of the same subject (details, activity, settings)",
9341
9347
  "Keep labels to one or two words"
@@ -9347,11 +9353,13 @@ initialFocus="input"
9347
9353
  accessibility: [
9348
9354
  "Full WAI-ARIA tabs pattern: `tablist`/`tab`/`tabpanel` roles with wired",
9349
9355
  "Arrow keys move between tabs with selection following focus, wrapping at the ends;",
9350
- "Roving tabindex: only the selected tab sits in the tab order; the panel itself is"
9356
+ "Roving tabindex: only the selected tab sits in the tab order; the panel itself is",
9357
+ "The panel animation is skipped under `prefers-reduced-motion`."
9351
9358
  ]
9352
9359
  },
9353
9360
  relatedTokens: [
9354
9361
  "tabs.behavior.motion",
9362
+ "tabs.behavior.panelMotion",
9355
9363
  "tabs.behavior.typeface",
9356
9364
  "tabs.behavior.textColor",
9357
9365
  "tabs.behavior.activeTextColor",
@@ -9370,7 +9378,7 @@ initialFocus="input"
9370
9378
  summary: "Compact chip for categories, states, filters and tokens.",
9371
9379
  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.",
9372
9380
  category: "data",
9373
- version: "11.4.0",
9381
+ version: "11.5.0",
9374
9382
  bindings: {
9375
9383
  angular: {
9376
9384
  importPath: "@uni-design-system/uni-angular",
@@ -9748,7 +9756,7 @@ initialFocus="input"
9748
9756
  summary: "A row of chips the user picks from: filters, facets, a set of labels.",
9749
9757
  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.",
9750
9758
  category: "data",
9751
- version: "11.4.0",
9759
+ version: "11.5.0",
9752
9760
  bindings: {
9753
9761
  angular: {
9754
9762
  importPath: "@uni-design-system/uni-angular",
@@ -9946,7 +9954,7 @@ initialFocus="input"
9946
9954
  summary: "",
9947
9955
  description: "",
9948
9956
  category: "forms",
9949
- version: "11.4.0",
9957
+ version: "11.5.0",
9950
9958
  bindings: {
9951
9959
  angular: {
9952
9960
  importPath: "@uni-design-system/uni-angular",
@@ -10287,7 +10295,7 @@ placeholder="Name or address\u2026"
10287
10295
  summary: "The typography primitive, applied as an attribute to any element so semantics stay yours.",
10288
10296
  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.',
10289
10297
  category: "primitives",
10290
- version: "11.4.0",
10298
+ version: "11.5.0",
10291
10299
  bindings: {
10292
10300
  angular: {
10293
10301
  importPath: "@uni-design-system/uni-angular",
@@ -10397,7 +10405,7 @@ placeholder="Name or address\u2026"
10397
10405
  summary: "",
10398
10406
  description: "",
10399
10407
  category: "forms",
10400
- version: "11.4.0",
10408
+ version: "11.5.0",
10401
10409
  bindings: {
10402
10410
  angular: {
10403
10411
  importPath: "@uni-design-system/uni-angular",
@@ -10604,7 +10612,7 @@ placeholder="Name or address\u2026"
10604
10612
  summary: "",
10605
10613
  description: "",
10606
10614
  category: "primitives",
10607
- version: "11.4.0",
10615
+ version: "11.5.0",
10608
10616
  bindings: {
10609
10617
  angular: {
10610
10618
  importPath: "@uni-design-system/uni-angular",
@@ -10634,7 +10642,7 @@ placeholder="Name or address\u2026"
10634
10642
  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).",
10635
10643
  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).",
10636
10644
  category: "components",
10637
- version: "11.4.0",
10645
+ version: "11.5.0",
10638
10646
  bindings: {
10639
10647
  angular: {
10640
10648
  importPath: "@uni-design-system/uni-angular",
@@ -10692,7 +10700,7 @@ placeholder="Name or address\u2026"
10692
10700
  summary: "Time field: a combobox over time options \u2014 the same listbox contract as uni-search-input and uni-tag-input.",
10693
10701
  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.",
10694
10702
  category: "forms",
10695
- version: "11.4.0",
10703
+ version: "11.5.0",
10696
10704
  bindings: {
10697
10705
  angular: {
10698
10706
  importPath: "@uni-design-system/uni-angular",
@@ -10907,7 +10915,7 @@ placeholder="Name or address\u2026"
10907
10915
  summary: "",
10908
10916
  description: "",
10909
10917
  category: "forms",
10910
- version: "11.4.0",
10918
+ version: "11.5.0",
10911
10919
  bindings: {
10912
10920
  angular: {
10913
10921
  importPath: "@uni-design-system/uni-angular",
@@ -11169,7 +11177,7 @@ placeholder="Name or address\u2026"
11169
11177
  summary: "",
11170
11178
  description: "",
11171
11179
  category: "feedback",
11172
- version: "11.4.0",
11180
+ version: "11.5.0",
11173
11181
  bindings: {
11174
11182
  angular: {
11175
11183
  importPath: "@uni-design-system/uni-angular",
@@ -11257,7 +11265,7 @@ placeholder="Name or address\u2026"
11257
11265
  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).',
11258
11266
  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.',
11259
11267
  category: "components",
11260
- version: "11.4.0",
11268
+ version: "11.5.0",
11261
11269
  bindings: {
11262
11270
  angular: {
11263
11271
  importPath: "@uni-design-system/uni-angular",
@@ -11384,7 +11392,7 @@ placeholder="Name or address\u2026"
11384
11392
  summary: "",
11385
11393
  description: "",
11386
11394
  category: "layout",
11387
- version: "11.4.0",
11395
+ version: "11.5.0",
11388
11396
  bindings: {
11389
11397
  angular: {
11390
11398
  importPath: "@uni-design-system/uni-angular",
@@ -15054,6 +15062,18 @@ placeholder="Name or address\u2026"
15054
15062
  DarkTheme: "snap"
15055
15063
  }
15056
15064
  },
15065
+ {
15066
+ id: "tabs.behavior.panelMotion",
15067
+ value: "panel",
15068
+ type: "string",
15069
+ kind: "behavioral",
15070
+ target: "component-prop",
15071
+ appliesTo: "tabs",
15072
+ themeValues: {
15073
+ LightTheme: "panel",
15074
+ DarkTheme: "panel"
15075
+ }
15076
+ },
15057
15077
  {
15058
15078
  id: "tabs.behavior.typeface",
15059
15079
  value: "title-small",
@@ -17580,6 +17600,7 @@ placeholder="Name or address\u2026"
17580
17600
  },
17581
17601
  tabs: {
17582
17602
  motion: "snap",
17603
+ panelMotion: "panel",
17583
17604
  typeface: "title-small",
17584
17605
  textColor: "on-surface-variant",
17585
17606
  activeTextColor: "primary",
@@ -18193,6 +18214,7 @@ placeholder="Name or address\u2026"
18193
18214
  },
18194
18215
  tabs: {
18195
18216
  motion: "snap",
18217
+ panelMotion: "panel",
18196
18218
  typeface: "title-small",
18197
18219
  textColor: "on-surface-variant",
18198
18220
  activeTextColor: "primary",
@@ -18435,6 +18457,42 @@ placeholder="Name or address\u2026"
18435
18457
  {
18436
18458
  package: "@uni-design-system/uni-angular",
18437
18459
  releases: [
18460
+ {
18461
+ version: "11.5.0",
18462
+ entries: [
18463
+ {
18464
+ bump: "minor",
18465
+ title: "New CDK utility: `copyToClipboard`, for text and rich content.",
18466
+ body: "`copyToClipboard(content)` wraps the Async Clipboard API and never rejects. It resolves `'copied' | 'denied' | 'unsupported' | 'failed'`, so a caller can tell the user why a copy did not work. Pass a string for text, or a map of MIME type to data (`{ 'text/plain': \u2026, 'text/html': \u2026 }`, `{ 'image/png': blob }`) for rich content; a value may be a promise, for content that has to be fetched or rendered first.\n\nThe write starts synchronously inside the user gesture. The `clipboard-write` permission is consulted only after a refusal, to tell `denied` apart from `failed`: only Chromium answers that query, and waiting on it before the write can cost the gesture in other browsers.\n\n`PermissionService`, the `Permission` and `PermissionState` types, and a new plain function `queryPermission` are now exported; the docs already described the service as importable, but it was missing from the public API.",
18467
+ commit: "a5e4bd0"
18468
+ },
18469
+ {
18470
+ bump: "minor",
18471
+ title: "`uni-tabs` softens a tab switch: the incoming panel fades in while the panel animates between the two contents' heights.",
18472
+ body: "Switching between panels of different heights used to cut, and everything below the tabs jumped with it. The panel now travels from the outgoing content's height to the incoming one while the new content fades in. The new content is rendered and interactive from the first frame, so the animation never delays the switch, and a second switch mid-animation picks up from the height the first had reached.\n\nThe timing is a new `tabs` theme option, `panelMotion`, naming a motion primitive. The base theme sets it to `panel`, so **this is on by default**; set `panelMotion: undefined` in a theme to keep the instant switch. Under `prefers-reduced-motion` the switch is always instant.",
18473
+ commit: "ec2cc45"
18474
+ },
18475
+ {
18476
+ bump: "patch",
18477
+ title: "`uni-tabs` no longer pads its panel.",
18478
+ body: "The panel carried a hardcoded `md` top padding, which assumed every consumer wanted that gap between the tablist and their content. Full-bleed content (a table, a divider, a tinted surface) could not sit flush against the tablist without a negative margin. The panel now adds no padding; content that relied on the gap should set its own spacing.",
18479
+ commit: "9a51a28"
18480
+ }
18481
+ ],
18482
+ dependencyBumps: []
18483
+ },
18484
+ {
18485
+ version: "11.4.1",
18486
+ entries: [
18487
+ {
18488
+ bump: "patch",
18489
+ title: "`uni-slider` no longer shows the browser's default focus outline when the thumb is grabbed with a pointer.",
18490
+ body: "11.4.0 withheld the ring on a pointer grab by dropping the thumb's `:focus-visible` rule. But that rule is also what replaces the browser's own outline, so with it gone Chrome painted its default: a thick solid blue ring, worse than the themed one it replaced. A grab now keeps the rule and blanks it (`outline: none`, `box-shadow: none`). Keyboard focus rings as before. The specs now assert what the rule draws rather than whether it exists, since jsdom has no user-agent outline to expose the difference.",
18491
+ commit: "d61334b"
18492
+ }
18493
+ ],
18494
+ dependencyBumps: []
18495
+ },
18438
18496
  {
18439
18497
  version: "11.4.0",
18440
18498
  entries: [
@@ -19345,6 +19403,23 @@ placeholder="Name or address\u2026"
19345
19403
  {
19346
19404
  package: "@uni-design-system/uni-core",
19347
19405
  releases: [
19406
+ {
19407
+ version: "11.5.0",
19408
+ entries: [
19409
+ {
19410
+ bump: "minor",
19411
+ title: "`uni-tabs` softens a tab switch: the incoming panel fades in while the panel animates between the two contents' heights.",
19412
+ body: "Switching between panels of different heights used to cut, and everything below the tabs jumped with it. The panel now travels from the outgoing content's height to the incoming one while the new content fades in. The new content is rendered and interactive from the first frame, so the animation never delays the switch, and a second switch mid-animation picks up from the height the first had reached.\n\nThe timing is a new `tabs` theme option, `panelMotion`, naming a motion primitive. The base theme sets it to `panel`, so **this is on by default**; set `panelMotion: undefined` in a theme to keep the instant switch. Under `prefers-reduced-motion` the switch is always instant.",
19413
+ commit: "ec2cc45"
19414
+ }
19415
+ ],
19416
+ dependencyBumps: []
19417
+ },
19418
+ {
19419
+ version: "11.4.1",
19420
+ entries: [],
19421
+ dependencyBumps: []
19422
+ },
19348
19423
  {
19349
19424
  version: "11.4.0",
19350
19425
  entries: [],
@@ -19999,6 +20074,16 @@ placeholder="Name or address\u2026"
19999
20074
  {
20000
20075
  package: "@uni-design-system/uni-react",
20001
20076
  releases: [
20077
+ {
20078
+ version: "11.5.0",
20079
+ entries: [],
20080
+ dependencyBumps: []
20081
+ },
20082
+ {
20083
+ version: "11.4.1",
20084
+ entries: [],
20085
+ dependencyBumps: []
20086
+ },
20002
20087
  {
20003
20088
  version: "11.4.0",
20004
20089
  entries: [],
@@ -20295,6 +20380,23 @@ placeholder="Name or address\u2026"
20295
20380
  {
20296
20381
  package: "@uni-design-system/uni-mcp",
20297
20382
  releases: [
20383
+ {
20384
+ version: "11.5.0",
20385
+ entries: [
20386
+ {
20387
+ bump: "minor",
20388
+ title: "The MCP now covers the CDK \u2014 the non-visual half of `uni-angular`.",
20389
+ body: "Until now the index held components only, so `copyToClipboard`, `PermissionService`, the decimal helpers, the datasources and every other CDK export were invisible to an assistant: nothing in them has a selector. A new `cdk-adapter` walks the CDK barrel (`cdk/index.ts`) and indexes every exported function, injectable service, class, interface, type and const with its signature and JSDoc \u2014 read from the TypeScript AST, so arrow-function consts, generics and multi-line parameter lists come through as written. Each CDK module's docs page ships alongside as markdown.\n- **`list-utilities`** \u2014 the inventory, grouped by module; filter by `module` or `kind`.\n- **`get-utility`** \u2014 one export by id (`copy-to-clipboard`) or name (`copyToClipboard`): import line, signature, members, the other symbols in its module, and the module's docs page with usage examples.\n- **`search`** gains a `utility` kind, and **`uni://utilities/{id}`** serves the same card as a resource.\n\nThe server's instructions point assistants at these before they hand-roll a browser API call.",
20390
+ commit: "42aee9e"
20391
+ }
20392
+ ],
20393
+ dependencyBumps: []
20394
+ },
20395
+ {
20396
+ version: "11.4.1",
20397
+ entries: [],
20398
+ dependencyBumps: []
20399
+ },
20298
20400
  {
20299
20401
  version: "11.4.0",
20300
20402
  entries: [],
@@ -20530,199 +20632,3021 @@ placeholder="Name or address\u2026"
20530
20632
  }
20531
20633
  ]
20532
20634
  }
20533
- ]
20534
- };
20535
-
20536
- // src/server/store.ts
20537
- var index = uni_index_default;
20538
- var meta = index.meta;
20539
- function frameworksFor(c) {
20540
- return Object.keys(c.bindings);
20541
- }
20542
- function listComponents(filter = {}) {
20543
- return index.components.filter((c) => {
20544
- if (filter.framework && !c.bindings[filter.framework]) return false;
20545
- if (filter.category && c.category !== filter.category) return false;
20546
- if (filter.status && c.status !== filter.status) return false;
20547
- return true;
20548
- });
20549
- }
20550
- function getComponent(id) {
20551
- return index.components.find((c) => c.id === id);
20552
- }
20553
- function listTokens(filter = {}) {
20554
- return index.tokens.filter((t) => {
20555
- if (filter.type && t.type !== filter.type) return false;
20556
- if (filter.kind && t.kind !== filter.kind) return false;
20557
- if (filter.theme && !(t.themeValues && filter.theme in t.themeValues)) return false;
20558
- return true;
20559
- });
20560
- }
20561
- function getToken(id) {
20562
- return index.tokens.find((t) => t.id === id);
20563
- }
20564
- function listThemes() {
20565
- return index.themes;
20566
- }
20567
- function getTheme(id) {
20568
- return index.themes.find((t) => t.id === id);
20569
- }
20570
- function listChangelogs() {
20571
- return index.changelogs ?? [];
20572
- }
20573
- function getChangelog(pkg = "uni-angular") {
20574
- const q = pkg.trim().toLowerCase();
20575
- return listChangelogs().find((c) => {
20576
- const name = c.package.toLowerCase();
20577
- const short = name.split("/").pop() ?? name;
20578
- return name === q || short === q || short.replace(/^uni-/, "") === q;
20579
- });
20580
- }
20581
- function compareVersions(a, b) {
20582
- const nums = (v) => v.trim().replace(/^v/, "").split(".").map((s) => parseInt(s, 10) || 0);
20583
- const [pa, pb] = [nums(a), nums(b)];
20584
- for (let i = 0; i < Math.max(pa.length, pb.length); i++) {
20585
- const d = (pa[i] ?? 0) - (pb[i] ?? 0);
20586
- if (d) return d;
20587
- }
20588
- return 0;
20589
- }
20590
- function matchesVersion(version, query) {
20591
- const v = version.split(".");
20592
- const q = query.trim().replace(/^v/, "").split(".");
20593
- return q.every((seg, i) => v[i] === seg);
20594
- }
20595
- function selectReleases(cl, scope) {
20596
- if (scope.version) return cl.releases.filter((r) => matchesVersion(r.version, scope.version));
20597
- if (scope.since) return cl.releases.filter((r) => compareVersions(r.version, scope.since) > 0);
20598
- return cl.releases;
20599
- }
20600
- function search(query, kind) {
20601
- const q = query.toLowerCase().trim();
20602
- if (!q) return [];
20603
- const hits = [];
20604
- const match = (...fields) => fields.some((f) => f?.toLowerCase().includes(q));
20605
- if (!kind || kind === "component") {
20606
- for (const c of index.components) {
20607
- const apiNames = frameworksFor(c).flatMap((f) => c.bindings[f].api.map((a) => a.name));
20608
- if (match(c.id, c.name, c.summary, c.description, c.category, ...apiNames)) {
20609
- hits.push({ kind: "component", id: c.id, label: c.name, snippet: c.summary || c.description.slice(0, 120) });
20610
- }
20611
- }
20612
- }
20613
- if (!kind || kind === "token") {
20614
- for (const t of index.tokens) {
20615
- if (match(t.id, t.type, t.description, String(t.value))) {
20616
- hits.push({ kind: "token", id: t.id, label: t.id, snippet: `${t.type} = ${t.value}` });
20617
- }
20618
- }
20619
- }
20620
- if (!kind || kind === "theme") {
20621
- for (const t of index.themes) {
20622
- if (match(t.id, t.name, t.description)) {
20623
- hits.push({ kind: "theme", id: t.id, label: t.name, snippet: t.description });
20624
- }
20625
- }
20626
- }
20627
- if (!kind || kind === "guideline") {
20628
- for (const c of index.components) {
20629
- const g = c.guidelines;
20630
- if (match(g.whenToUse, ...g.dos, ...g.donts, ...g.accessibility)) {
20631
- hits.push({ kind: "guideline", id: c.id, label: `${c.name} guidelines`, snippet: g.whenToUse.slice(0, 120) });
20632
- }
20633
- }
20634
- }
20635
- return hits;
20636
- }
20637
- function formatComponentList(components) {
20638
- if (!components.length) return "No components match that filter.";
20639
- const rows = components.map((c) => {
20640
- const fw = frameworksFor(c).join(", ");
20641
- return `- **${c.name}** \`${c.id}\` - ${c.summary || "(no summary)"} _(${c.category}; ${fw})_`;
20642
- });
20643
- return `# Uni components (${components.length})
20644
-
20645
- ${rows.join("\n")}`;
20646
- }
20647
- function formatApiTable(members) {
20648
- const api = members?.api ?? [];
20649
- if (!api.length) return "_No documented inputs/props._";
20650
- return api.map((m) => {
20651
- const req = m.required ? " **(required)**" : "";
20652
- const def = m.default ? ` = \`${m.default}\`` : "";
20653
- const dep = m.deprecated ? ` (deprecated: ${m.deprecated})` : "";
20654
- const doc = m.description ? ` - ${m.description}` : "";
20655
- return `- \`${m.name}: ${m.type}\`${req}${def} _(${m.kind})_${doc}${dep}`;
20656
- }).join("\n");
20657
- }
20658
- function formatComponent(c, framework) {
20659
- const frameworks = framework ? [framework] : frameworksFor(c);
20660
- const out = [`# ${c.name} \`${c.id}\``];
20661
- out.push(`_${c.category} \xB7 status: ${c.status} \xB7 Uni v${c.version}_`);
20662
- if (c.description) out.push(`
20663
- ${c.description}`);
20664
- for (const f of frameworks) {
20665
- const b = c.bindings[f];
20666
- if (!b) {
20667
- out.push(`
20668
- ## ${f}
20669
- _Not yet available for ${f}._`);
20670
- continue;
20671
- }
20672
- out.push(`
20673
- ## ${f}`);
20674
- out.push(`- import: \`${b.importPath}\``);
20675
- out.push(`- selector/tag: \`${b.selectorOrTag}\``);
20676
- out.push(`
20677
- **API**
20678
- ${formatApiTable(b)}`);
20679
- }
20680
- if (c.relatedTokens.length) out.push(`
20681
- **Related tokens:** ${c.relatedTokens.map((t) => `\`${t}\``).join(", ")}`);
20682
- if (c.examples.length) {
20683
- const ex = c.examples[0];
20684
- out.push(`
20685
- **Example - ${ex.title} (${ex.framework})**
20686
- \`\`\`html
20687
- ${ex.code}
20688
- \`\`\``);
20689
- if (c.examples.length > 1) out.push(`_+${c.examples.length - 1} more via get-component-examples._`);
20690
- }
20691
- return out.join("\n");
20692
- }
20693
- function formatExamples(c, framework) {
20694
- const examples = framework ? c.examples.filter((e) => e.framework === framework) : c.examples;
20695
- if (!examples.length) return `No examples found for \`${c.id}\`${framework ? ` (${framework})` : ""}.`;
20696
- const blocks = examples.map((e) => {
20697
- const link = e.storybookUrl ? `
20698
- [Open in Storybook](${e.storybookUrl})` : "";
20699
- return `### ${e.title} _(${e.framework})_
20700
- \`\`\`html
20701
- ${e.code}
20702
- \`\`\`${link}`;
20703
- });
20704
- return `# ${c.name} - examples (${examples.length})
20705
-
20706
- ${blocks.join("\n\n")}`;
20707
- }
20708
- function formatToken(t) {
20709
- const out = [`# Token \`${t.id}\``];
20710
- out.push(`- value: \`${t.value}\``);
20711
- out.push(`- type: ${t.type}`);
20712
- out.push(`- kind: **${t.kind}** (${t.target})`);
20713
- if (t.appliesTo) out.push(`- applies to component: \`${t.appliesTo}\``);
20714
- if (t.aliasOf) out.push(`- alias of: \`${t.aliasOf}\``);
20715
- if (t.description) out.push(`
20716
- ${t.description}`);
20717
- if (t.themeValues && Object.keys(t.themeValues).length) {
20718
- out.push("\n**Per-theme values**");
20719
- for (const [theme, val] of Object.entries(t.themeValues)) out.push(`- ${theme}: \`${val}\``);
20720
- }
20721
- const hint = t.kind === "style" ? "\n_Style token - consumed by Emotion to generate CSS. Reference via the theme, not a raw value._" : "\n_Behavioral token - set as a component input/prop, not as CSS._";
20722
- out.push(hint);
20723
- return out.join("\n");
20724
- }
20725
- function formatTokenList(tokens) {
20635
+ ],
20636
+ utilities: [
20637
+ {
20638
+ id: "unique-id",
20639
+ name: "uniqueId",
20640
+ kind: "function",
20641
+ module: "a11y",
20642
+ importPath: "@uni-design-system/uni-angular",
20643
+ signature: "function uniqueId(prefix = 'uni'): string",
20644
+ summary: "Returns a document-unique id for wiring ARIA relationships (aria-controls, aria-describedby, aria-labelledby, ...).",
20645
+ description: "Returns a document-unique id for wiring ARIA relationships (aria-controls, aria-describedby, aria-labelledby, ...).",
20646
+ members: [],
20647
+ version: "11.5.0"
20648
+ },
20649
+ {
20650
+ id: "focusable-selector",
20651
+ name: "FOCUSABLE_SELECTOR",
20652
+ kind: "const",
20653
+ module: "a11y",
20654
+ importPath: "@uni-design-system/uni-angular",
20655
+ signature: `const FOCUSABLE_SELECTOR = 'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'`,
20656
+ summary: "Selector matching natively focusable elements.",
20657
+ 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
+ members: [],
20659
+ version: "11.5.0"
20660
+ },
20661
+ {
20662
+ id: "resolve-focus-target",
20663
+ name: "resolveFocusTarget",
20664
+ kind: "function",
20665
+ module: "a11y",
20666
+ importPath: "@uni-design-system/uni-angular",
20667
+ signature: "function resolveFocusTarget(element: HTMLElement): HTMLElement",
20668
+ summary: "Resolves the element that should carry ARIA state for a trigger: the element itself when focusable, otherwise its first focusable descendant.",
20669
+ description: "Resolves the element that should carry ARIA state for a trigger: the element itself when focusable, otherwise its first focusable descendant.",
20670
+ members: [],
20671
+ version: "11.5.0"
20672
+ },
20673
+ {
20674
+ id: "visually-hidden",
20675
+ name: "visuallyHidden",
20676
+ kind: "const",
20677
+ module: "a11y",
20678
+ importPath: "@uni-design-system/uni-angular",
20679
+ signature: "const visuallyHidden = { position: 'fixed', width: 1, height: 1, padding: 0, margin: -1, overflow: 'hid\u2026",
20680
+ summary: "Visually hides content while keeping it available to screen readers.",
20681
+ 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
+ members: [],
20683
+ version: "11.5.0"
20684
+ },
20685
+ {
20686
+ id: "motion-safe",
20687
+ name: "motionSafe",
20688
+ kind: "function",
20689
+ module: "a11y",
20690
+ importPath: "@uni-design-system/uni-angular",
20691
+ signature: "function motionSafe<T extends object>(styles: T)",
20692
+ summary: "Wraps animation/transition styles so they only apply when the user has not requested reduced motion (WCAG 2.3.3).",
20693
+ description: "Wraps animation/transition styles so they only apply when the user has not requested reduced motion (WCAG 2.3.3).",
20694
+ members: [],
20695
+ version: "11.5.0"
20696
+ },
20697
+ {
20698
+ id: "announcer",
20699
+ name: "Announcer",
20700
+ kind: "interface",
20701
+ module: "a11y",
20702
+ importPath: "@uni-design-system/uni-angular",
20703
+ signature: "interface Announcer",
20704
+ summary: "",
20705
+ description: "",
20706
+ members: [
20707
+ {
20708
+ name: "message",
20709
+ kind: "property",
20710
+ signature: "readonly message: Signal<string>",
20711
+ description: 'Current live-region text. Bind it to a visually hidden element that is already in the DOM when the component renders \u2014 a region added at the moment it gains text is not reliably announced: ```html <span role="status" aria-live="polite" [class]="srOnly"> {{ announcer.message() }} </span> ```'
20712
+ },
20713
+ {
20714
+ name: "announce",
20715
+ kind: "method",
20716
+ signature: "announce(text: string): void",
20717
+ description: "Announce `text`, even when it repeats what was just announced."
20718
+ }
20719
+ ],
20720
+ version: "11.5.0"
20721
+ },
20722
+ {
20723
+ id: "create-announcer",
20724
+ name: "createAnnouncer",
20725
+ kind: "function",
20726
+ module: "a11y",
20727
+ importPath: "@uni-design-system/uni-angular",
20728
+ signature: "function createAnnouncer(): Announcer",
20729
+ 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
+ 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
+ members: [],
20732
+ version: "11.5.0"
20733
+ },
20734
+ {
20735
+ id: "uni-date",
20736
+ name: "UniDate",
20737
+ kind: "type",
20738
+ module: "datetime",
20739
+ importPath: "@uni-design-system/uni-angular",
20740
+ signature: "type UniDate = string",
20741
+ summary: "A calendar date, `'YYYY-MM-DD'`.",
20742
+ description: "A calendar date, `'YYYY-MM-DD'`.",
20743
+ members: [],
20744
+ version: "11.5.0"
20745
+ },
20746
+ {
20747
+ id: "uni-time",
20748
+ name: "UniTime",
20749
+ kind: "type",
20750
+ module: "datetime",
20751
+ importPath: "@uni-design-system/uni-angular",
20752
+ signature: "type UniTime = string",
20753
+ summary: "A wall-clock time, `'HH:mm'` (24-hour).",
20754
+ description: "A wall-clock time, `'HH:mm'` (24-hour). Display format is separate.",
20755
+ members: [],
20756
+ version: "11.5.0"
20757
+ },
20758
+ {
20759
+ id: "uni-date-time",
20760
+ name: "UniDateTime",
20761
+ kind: "type",
20762
+ module: "datetime",
20763
+ importPath: "@uni-design-system/uni-angular",
20764
+ signature: "type UniDateTime = string",
20765
+ summary: "A combined date and time, `'YYYY-MM-DDTHH:mm'`.",
20766
+ description: "A combined date and time, `'YYYY-MM-DDTHH:mm'`.",
20767
+ members: [],
20768
+ version: "11.5.0"
20769
+ },
20770
+ {
20771
+ id: "uni-date-range",
20772
+ name: "UniDateRange",
20773
+ kind: "interface",
20774
+ module: "datetime",
20775
+ importPath: "@uni-design-system/uni-angular",
20776
+ signature: "interface UniDateRange",
20777
+ summary: "A start\u2013end date range.",
20778
+ description: "A start\u2013end date range. Both ends are inclusive.",
20779
+ members: [
20780
+ {
20781
+ name: "start",
20782
+ kind: "property",
20783
+ signature: "start?: UniDate",
20784
+ description: ""
20785
+ },
20786
+ {
20787
+ name: "end",
20788
+ kind: "property",
20789
+ signature: "end?: UniDate",
20790
+ description: ""
20791
+ }
20792
+ ],
20793
+ version: "11.5.0"
20794
+ },
20795
+ {
20796
+ id: "iso-date",
20797
+ name: "isoDate",
20798
+ kind: "function",
20799
+ module: "datetime",
20800
+ importPath: "@uni-design-system/uni-angular",
20801
+ signature: "function isoDate(year: number, month: number, day: number): UniDate",
20802
+ summary: "`(2026, 8, 5)` \u2192 `'2026-08-05'`.",
20803
+ description: "`(2026, 8, 5)` \u2192 `'2026-08-05'`. Does not validate \u2014 see `isValidDate`.",
20804
+ members: [],
20805
+ version: "11.5.0"
20806
+ },
20807
+ {
20808
+ id: "is-valid-date",
20809
+ name: "isValidDate",
20810
+ kind: "function",
20811
+ module: "datetime",
20812
+ importPath: "@uni-design-system/uni-angular",
20813
+ signature: "function isValidDate(year: number, month: number, day: number): UniDate | null",
20814
+ summary: "The ISO date when the parts form a real calendar day, else `null`.",
20815
+ description: "The ISO date when the parts form a real calendar day, else `null`.",
20816
+ members: [],
20817
+ version: "11.5.0"
20818
+ },
20819
+ {
20820
+ id: "days-in-month",
20821
+ name: "daysInMonth",
20822
+ kind: "function",
20823
+ module: "datetime",
20824
+ importPath: "@uni-design-system/uni-angular",
20825
+ signature: "function daysInMonth(year: number, month: number): number",
20826
+ summary: "Days in a month, leap-year aware.",
20827
+ description: "Days in a month, leap-year aware.",
20828
+ members: [],
20829
+ version: "11.5.0"
20830
+ },
20831
+ {
20832
+ id: "add-days",
20833
+ name: "addDays",
20834
+ kind: "function",
20835
+ module: "datetime",
20836
+ importPath: "@uni-design-system/uni-angular",
20837
+ signature: "function addDays(date: UniDate, days: number): UniDate",
20838
+ summary: "",
20839
+ description: "",
20840
+ members: [],
20841
+ version: "11.5.0"
20842
+ },
20843
+ {
20844
+ id: "add-months",
20845
+ name: "addMonths",
20846
+ kind: "function",
20847
+ module: "datetime",
20848
+ importPath: "@uni-design-system/uni-angular",
20849
+ signature: "function addMonths(date: UniDate, months: number): UniDate",
20850
+ summary: "Same day \xB1 n months, clamping the day to the target month's length.",
20851
+ description: "Same day \xB1 n months, clamping the day to the target month's length.",
20852
+ members: [],
20853
+ version: "11.5.0"
20854
+ },
20855
+ {
20856
+ id: "day-of-week",
20857
+ name: "dayOfWeek",
20858
+ kind: "function",
20859
+ module: "datetime",
20860
+ importPath: "@uni-design-system/uni-angular",
20861
+ signature: "function dayOfWeek(date: UniDate): number",
20862
+ summary: "Day of week, 0 = Sunday \u2026 6 = Saturday.",
20863
+ description: "Day of week, 0 = Sunday \u2026 6 = Saturday.",
20864
+ members: [],
20865
+ version: "11.5.0"
20866
+ },
20867
+ {
20868
+ id: "month-of",
20869
+ name: "monthOf",
20870
+ kind: "function",
20871
+ module: "datetime",
20872
+ importPath: "@uni-design-system/uni-angular",
20873
+ signature: "function monthOf(date: UniDate): string",
20874
+ summary: "`'2026-08-20'` \u2192 `'2026-08'`.",
20875
+ description: "`'2026-08-20'` \u2192 `'2026-08'`.",
20876
+ members: [],
20877
+ version: "11.5.0"
20878
+ },
20879
+ {
20880
+ id: "today-iso",
20881
+ name: "todayIso",
20882
+ kind: "function",
20883
+ module: "datetime",
20884
+ importPath: "@uni-design-system/uni-angular",
20885
+ signature: "function todayIso(): UniDate",
20886
+ summary: "Today as a local-wall-clock ISO date (the one place local time matters).",
20887
+ description: "Today as a local-wall-clock ISO date (the one place local time matters).",
20888
+ members: [],
20889
+ version: "11.5.0"
20890
+ },
20891
+ {
20892
+ id: "inclusive-day-count",
20893
+ name: "inclusiveDayCount",
20894
+ kind: "function",
20895
+ module: "datetime",
20896
+ importPath: "@uni-design-system/uni-angular",
20897
+ signature: "function inclusiveDayCount(start: UniDate, end: UniDate): number",
20898
+ summary: "Inclusive day count of a range: `('-20', '-24')` \u2192 5.",
20899
+ description: "Inclusive day count of a range: `('-20', '-24')` \u2192 5.",
20900
+ members: [],
20901
+ version: "11.5.0"
20902
+ },
20903
+ {
20904
+ id: "uni-month-grid-cell",
20905
+ name: "UniMonthGridCell",
20906
+ kind: "interface",
20907
+ module: "datetime",
20908
+ importPath: "@uni-design-system/uni-angular",
20909
+ signature: "interface UniMonthGridCell",
20910
+ summary: "",
20911
+ description: "",
20912
+ members: [
20913
+ {
20914
+ name: "date",
20915
+ kind: "property",
20916
+ signature: "date: UniDate",
20917
+ description: ""
20918
+ },
20919
+ {
20920
+ name: "outside",
20921
+ kind: "property",
20922
+ signature: "outside: boolean",
20923
+ description: "True for leading/trailing cells that belong to the adjacent months."
20924
+ }
20925
+ ],
20926
+ version: "11.5.0"
20927
+ },
20928
+ {
20929
+ id: "build-month-grid",
20930
+ name: "buildMonthGrid",
20931
+ kind: "function",
20932
+ module: "datetime",
20933
+ importPath: "@uni-design-system/uni-angular",
20934
+ signature: "function buildMonthGrid(month: string, weekStart: number): UniMonthGridCell[][]",
20935
+ summary: "The week matrix a calendar renders: full weeks covering `'YYYY-MM'`, starting on `weekStart` (0 = Sunday).",
20936
+ 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
+ members: [],
20938
+ version: "11.5.0"
20939
+ },
20940
+ {
20941
+ id: "format-date",
20942
+ name: "formatDate",
20943
+ kind: "function",
20944
+ module: "datetime",
20945
+ importPath: "@uni-design-system/uni-angular",
20946
+ signature: "function formatDate(date: UniDate, locale: string, options: Intl.DateTimeFormatOptions = { dateStyle: 'medium' }): string",
20947
+ summary: "",
20948
+ description: "",
20949
+ members: [],
20950
+ version: "11.5.0"
20951
+ },
20952
+ {
20953
+ id: "format-month-heading",
20954
+ name: "formatMonthHeading",
20955
+ kind: "function",
20956
+ module: "datetime",
20957
+ importPath: "@uni-design-system/uni-angular",
20958
+ signature: "function formatMonthHeading(month: string, locale: string): string",
20959
+ summary: "`'2026-08'` \u2192 `'August 2026'` in the locale.",
20960
+ description: "`'2026-08'` \u2192 `'August 2026'` in the locale.",
20961
+ members: [],
20962
+ version: "11.5.0"
20963
+ },
20964
+ {
20965
+ id: "uni-weekday-name",
20966
+ name: "UniWeekdayName",
20967
+ kind: "interface",
20968
+ module: "datetime",
20969
+ importPath: "@uni-design-system/uni-angular",
20970
+ signature: "interface UniWeekdayName",
20971
+ summary: "",
20972
+ description: "",
20973
+ members: [
20974
+ {
20975
+ name: "label",
20976
+ kind: "property",
20977
+ signature: "label: string",
20978
+ description: "Column label in the requested format ('narrow' | 'short')."
20979
+ },
20980
+ {
20981
+ name: "full",
20982
+ kind: "property",
20983
+ signature: "full: string",
20984
+ description: "Full weekday name, for the columnheader's `abbr`."
20985
+ }
20986
+ ],
20987
+ version: "11.5.0"
20988
+ },
20989
+ {
20990
+ id: "weekday-names",
20991
+ name: "weekdayNames",
20992
+ kind: "const",
20993
+ module: "datetime",
20994
+ importPath: "@uni-design-system/uni-angular",
20995
+ signature: "const weekdayNames = memoize(\u2026)",
20996
+ summary: "Weekday header labels starting at `weekStart` (0 = Sunday).",
20997
+ description: "Weekday header labels starting at `weekStart` (0 = Sunday).",
20998
+ members: [],
20999
+ version: "11.5.0"
21000
+ },
21001
+ {
21002
+ id: "format-time",
21003
+ name: "formatTime",
21004
+ kind: "function",
21005
+ module: "datetime",
21006
+ importPath: "@uni-design-system/uni-angular",
21007
+ signature: "function formatTime(time: UniTime, locale: string, hour12: boolean): string",
21008
+ summary: "`'15:00'` \u2192 `'3:00 PM'` (or `'15:00'` when `hour12` is false).",
21009
+ description: "`'15:00'` \u2192 `'3:00 PM'` (or `'15:00'` when `hour12` is false).",
21010
+ members: [],
21011
+ version: "11.5.0"
21012
+ },
21013
+ {
21014
+ id: "locale-week-start",
21015
+ name: "localeWeekStart",
21016
+ kind: "const",
21017
+ module: "datetime",
21018
+ importPath: "@uni-design-system/uni-angular",
21019
+ signature: "const localeWeekStart = memoize(\u2026)",
21020
+ summary: "The locale's first day of week, 0 = Sunday \u2026 6 = Saturday.",
21021
+ 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
+ members: [],
21023
+ version: "11.5.0"
21024
+ },
21025
+ {
21026
+ id: "locale-default-hour12",
21027
+ name: "localeDefaultHour12",
21028
+ kind: "const",
21029
+ module: "datetime",
21030
+ importPath: "@uni-design-system/uni-angular",
21031
+ signature: "const localeDefaultHour12 = memoize(\u2026)",
21032
+ summary: "Whether the locale's default clock is 12-hour.",
21033
+ description: "Whether the locale's default clock is 12-hour.",
21034
+ members: [],
21035
+ version: "11.5.0"
21036
+ },
21037
+ {
21038
+ id: "locale-field-order",
21039
+ name: "localeFieldOrder",
21040
+ kind: "const",
21041
+ module: "datetime",
21042
+ importPath: "@uni-design-system/uni-angular",
21043
+ signature: "const localeFieldOrder = memoize(\u2026)",
21044
+ summary: "The locale's numeric-date field order, e.g.",
21045
+ description: "The locale's numeric-date field order, e.g. en-US \u2192 month, day, year.",
21046
+ members: [],
21047
+ version: "11.5.0"
21048
+ },
21049
+ {
21050
+ id: "locale-month-names",
21051
+ name: "localeMonthNames",
21052
+ kind: "const",
21053
+ module: "datetime",
21054
+ importPath: "@uni-design-system/uni-angular",
21055
+ signature: "const localeMonthNames = memoize(\u2026)",
21056
+ summary: "Long + short month names \u2192 month number, lowercased, dots stripped.",
21057
+ description: "Long + short month names \u2192 month number, lowercased, dots stripped.",
21058
+ members: [],
21059
+ version: "11.5.0"
21060
+ },
21061
+ {
21062
+ id: "locale-date-placeholder",
21063
+ name: "localeDatePlaceholder",
21064
+ kind: "const",
21065
+ module: "datetime",
21066
+ importPath: "@uni-design-system/uni-angular",
21067
+ signature: "const localeDatePlaceholder = memoize(\u2026)",
21068
+ summary: "The locale's digit pattern as a placeholder, e.g.",
21069
+ description: "The locale's digit pattern as a placeholder, e.g. `'MM/DD/YYYY'`.",
21070
+ members: [],
21071
+ version: "11.5.0"
21072
+ },
21073
+ {
21074
+ id: "parse-date-text",
21075
+ name: "parseDateText",
21076
+ kind: "function",
21077
+ module: "datetime",
21078
+ importPath: "@uni-design-system/uni-angular",
21079
+ signature: "function parseDateText(raw: string, locale: string, options: { today?: UniDate } = {}): UniDate | null",
21080
+ summary: "Free-typed date text \u2192 ISO date, or `null` when unreadable.",
21081
+ 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
+ members: [],
21083
+ version: "11.5.0"
21084
+ },
21085
+ {
21086
+ id: "parse-time-text",
21087
+ name: "parseTimeText",
21088
+ kind: "function",
21089
+ module: "datetime",
21090
+ importPath: "@uni-design-system/uni-angular",
21091
+ signature: "function parseTimeText(raw: string, hour12: boolean): UniTime | null",
21092
+ summary: "Free-typed time text \u2192 `'HH:mm'`, or `null`.",
21093
+ 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
+ members: [],
21095
+ version: "11.5.0"
21096
+ },
21097
+ {
21098
+ id: "time-slots",
21099
+ name: "timeSlots",
21100
+ kind: "function",
21101
+ module: "datetime",
21102
+ importPath: "@uni-design-system/uni-angular",
21103
+ signature: "function timeSlots(minuteStep: number, min?: UniTime, max?: UniTime): UniTime[]",
21104
+ summary: "Every `minuteStep` time between `min` and `max` (inclusive bounds).",
21105
+ description: "Every `minuteStep` time between `min` and `max` (inclusive bounds).",
21106
+ members: [],
21107
+ version: "11.5.0"
21108
+ },
21109
+ {
21110
+ id: "split-date-time",
21111
+ name: "splitDateTime",
21112
+ kind: "function",
21113
+ module: "datetime",
21114
+ importPath: "@uni-design-system/uni-angular",
21115
+ signature: "function splitDateTime(value?: UniDateTime): { date?: UniDate; time?: UniTime }",
21116
+ summary: "",
21117
+ description: "",
21118
+ members: [],
21119
+ version: "11.5.0"
21120
+ },
21121
+ {
21122
+ id: "join-date-time",
21123
+ name: "joinDateTime",
21124
+ kind: "function",
21125
+ module: "datetime",
21126
+ importPath: "@uni-design-system/uni-angular",
21127
+ signature: "function joinDateTime(date?: UniDate, time?: UniTime): UniDateTime | undefined",
21128
+ summary: "One combined value only when both parts are present.",
21129
+ description: "One combined value only when both parts are present.",
21130
+ members: [],
21131
+ version: "11.5.0"
21132
+ },
21133
+ {
21134
+ id: "uni-number-range",
21135
+ name: "UniNumberRange",
21136
+ kind: "interface",
21137
+ module: "number",
21138
+ importPath: "@uni-design-system/uni-angular",
21139
+ signature: "interface UniNumberRange",
21140
+ summary: "A start\u2013end numeric range.",
21141
+ description: "A start\u2013end numeric range. Either end alone is a valid value.",
21142
+ members: [
21143
+ {
21144
+ name: "start",
21145
+ kind: "property",
21146
+ signature: "start?: number",
21147
+ description: ""
21148
+ },
21149
+ {
21150
+ name: "end",
21151
+ kind: "property",
21152
+ signature: "end?: number",
21153
+ description: ""
21154
+ }
21155
+ ],
21156
+ version: "11.5.0"
21157
+ },
21158
+ {
21159
+ id: "uni-rounding-mode",
21160
+ name: "UniRoundingMode",
21161
+ kind: "type",
21162
+ module: "number",
21163
+ importPath: "@uni-design-system/uni-angular",
21164
+ signature: "type UniRoundingMode = 'half-up' | 'half-even' | 'ceil' | 'floor' | 'trunc'",
21165
+ summary: "How a tie is resolved when rounding to a fraction-digit count.",
21166
+ 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
+ members: [],
21168
+ version: "11.5.0"
21169
+ },
21170
+ {
21171
+ id: "uni-number-preset",
21172
+ name: "UniNumberPreset",
21173
+ kind: "type",
21174
+ module: "number",
21175
+ importPath: "@uni-design-system/uni-angular",
21176
+ signature: "type UniNumberPreset = 'decimal' | 'integer' | 'currency' | 'percent'",
21177
+ summary: "Format archetype.",
21178
+ description: "Format archetype. Supplies decimals, grouping, affix and `inputmode`.",
21179
+ members: [],
21180
+ version: "11.5.0"
21181
+ },
21182
+ {
21183
+ id: "uni-number-grouping",
21184
+ name: "UniNumberGrouping",
21185
+ kind: "type",
21186
+ module: "number",
21187
+ importPath: "@uni-design-system/uni-angular",
21188
+ signature: "type UniNumberGrouping = 'auto' | 'always' | 'min2' | false",
21189
+ summary: "Thousands-separator policy, mapped onto `Intl`'s `useGrouping`.",
21190
+ 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
+ members: [],
21192
+ version: "11.5.0"
21193
+ },
21194
+ {
21195
+ id: "uni-number-reject-reason",
21196
+ name: "UniNumberRejectReason",
21197
+ kind: "type",
21198
+ module: "number",
21199
+ importPath: "@uni-design-system/uni-angular",
21200
+ signature: "type UniNumberRejectReason = 'unparseable' | 'min' | 'max' | 'step' | 'precision' | 'not-integer'",
21201
+ summary: "Why a typed commit was refused.",
21202
+ description: "Why a typed commit was refused. The raw text stays in the field.",
21203
+ members: [],
21204
+ version: "11.5.0"
21205
+ },
21206
+ {
21207
+ id: "uni-number-step-config",
21208
+ name: "UniNumberStepConfig",
21209
+ kind: "interface",
21210
+ module: "number",
21211
+ importPath: "@uni-design-system/uni-angular",
21212
+ signature: "interface UniNumberStepConfig",
21213
+ summary: "Fences and snap grid for `stepDecimal`.",
21214
+ description: "Fences and snap grid for `stepDecimal`.",
21215
+ members: [
21216
+ {
21217
+ name: "step",
21218
+ kind: "property",
21219
+ signature: "step?: number | string",
21220
+ description: "Grid spacing. Steps land on `origin + n \xB7 step`. Default `1`."
21221
+ },
21222
+ {
21223
+ name: "min",
21224
+ kind: "property",
21225
+ signature: "min?: number | string",
21226
+ description: ""
21227
+ },
21228
+ {
21229
+ name: "max",
21230
+ kind: "property",
21231
+ signature: "max?: number | string",
21232
+ description: ""
21233
+ },
21234
+ {
21235
+ name: "stepOrigin",
21236
+ kind: "property",
21237
+ signature: "stepOrigin?: 'min' | 'zero'",
21238
+ description: "Snap-grid anchor. `'min'` matches the platform's `<input type=\"number\">` (a field with `min=5, step=10` steps 5 \u2192 15 \u2192 25); `'zero'` anchors the grid at 0 regardless of the fence."
21239
+ },
21240
+ {
21241
+ name: "wrap",
21242
+ kind: "property",
21243
+ signature: "wrap?: boolean",
21244
+ 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
+ }
21246
+ ],
21247
+ version: "11.5.0"
21248
+ },
21249
+ {
21250
+ id: "uni-number-clamp",
21251
+ name: "UniNumberClamp",
21252
+ kind: "interface",
21253
+ module: "number",
21254
+ importPath: "@uni-design-system/uni-angular",
21255
+ signature: "interface UniNumberClamp",
21256
+ summary: "The outcome of clamping a value to its fences.",
21257
+ description: "The outcome of clamping a value to its fences.",
21258
+ members: [
21259
+ {
21260
+ name: "value",
21261
+ kind: "property",
21262
+ signature: "value: string",
21263
+ description: "The clamped canonical decimal."
21264
+ },
21265
+ {
21266
+ name: "hit",
21267
+ kind: "property",
21268
+ signature: "hit: 'min' | 'max' | null",
21269
+ description: "Which fence was hit, or `null` when the value was already in range."
21270
+ }
21271
+ ],
21272
+ version: "11.5.0"
21273
+ },
21274
+ {
21275
+ id: "uni-locale-number-parts",
21276
+ name: "UniLocaleNumberParts",
21277
+ kind: "interface",
21278
+ module: "number",
21279
+ importPath: "@uni-design-system/uni-angular",
21280
+ signature: "interface UniLocaleNumberParts",
21281
+ summary: "Separators, currency placement and fraction digits read out of `Intl` for a locale.",
21282
+ description: "Separators, currency placement and fraction digits read out of `Intl` for a locale. Nothing here is hardcoded per language \u2014 `1.234,56` is German input, not malformed input, and only the locale knows that.",
21283
+ members: [
21284
+ {
21285
+ name: "group",
21286
+ kind: "property",
21287
+ signature: "group: string",
21288
+ description: "Thousands separator: `','` (en), `'.'` (de), a narrow no-break space (fr)."
21289
+ },
21290
+ {
21291
+ name: "decimal",
21292
+ kind: "property",
21293
+ signature: "decimal: string",
21294
+ description: "Decimal separator: `'.'` (en), `','` (de)."
21295
+ },
21296
+ {
21297
+ name: "currencySymbol",
21298
+ kind: "property",
21299
+ signature: "currencySymbol: string",
21300
+ description: "Currency symbol, when a currency was given: `'$'`, `'\u20AC'`, `'\xA5'`."
21301
+ },
21302
+ {
21303
+ name: "currencyLeading",
21304
+ kind: "property",
21305
+ signature: "currencyLeading: boolean",
21306
+ description: "True when the locale writes the symbol before the number."
21307
+ },
21308
+ {
21309
+ name: "currencyDecimals",
21310
+ kind: "property",
21311
+ signature: "currencyDecimals: number",
21312
+ description: "Fraction digits `Intl` uses for the currency \u2014 JPY 0, USD 2."
21313
+ }
21314
+ ],
21315
+ version: "11.5.0"
21316
+ },
21317
+ {
21318
+ id: "uni-number-format-config",
21319
+ name: "UniNumberFormatConfig",
21320
+ kind: "interface",
21321
+ module: "number",
21322
+ importPath: "@uni-design-system/uni-angular",
21323
+ signature: "interface UniNumberFormatConfig",
21324
+ summary: "What a component knows about its own formatting, before resolution.",
21325
+ description: "What a component knows about its own formatting, before resolution. Mirrors the component inputs so a control can forward its signals almost verbatim.",
21326
+ members: [
21327
+ {
21328
+ name: "preset",
21329
+ kind: "property",
21330
+ signature: "preset?: UniNumberPreset",
21331
+ description: ""
21332
+ },
21333
+ {
21334
+ name: "currency",
21335
+ kind: "property",
21336
+ signature: "currency?: string",
21337
+ description: "ISO 4217 code, e.g. `'USD'`. Implies the `currency` preset."
21338
+ },
21339
+ {
21340
+ name: "locale",
21341
+ kind: "property",
21342
+ signature: "locale?: string",
21343
+ description: "BCP 47 tag. Defaults to `'en-US'`; components pass the document's."
21344
+ },
21345
+ {
21346
+ name: "decimals",
21347
+ kind: "property",
21348
+ signature: "decimals?: number | [min: number, max: number]",
21349
+ description: "Fixed fraction digits, or `[min, max]`. Overrides the preset."
21350
+ },
21351
+ {
21352
+ name: "grouping",
21353
+ kind: "property",
21354
+ signature: "grouping?: UniNumberGrouping",
21355
+ description: ""
21356
+ },
21357
+ {
21358
+ name: "prefix",
21359
+ kind: "property",
21360
+ signature: "prefix?: string",
21361
+ description: "Static adornment, rendered outside the editable text."
21362
+ },
21363
+ {
21364
+ name: "suffix",
21365
+ kind: "property",
21366
+ signature: "suffix?: string",
21367
+ description: ""
21368
+ },
21369
+ {
21370
+ name: "roundingMode",
21371
+ kind: "property",
21372
+ signature: "roundingMode?: UniRoundingMode",
21373
+ description: ""
21374
+ },
21375
+ {
21376
+ name: "valueIsFraction",
21377
+ kind: "property",
21378
+ signature: "valueIsFraction?: boolean",
21379
+ description: "The model is a fraction: `0.15` displays as `15`. Without it, a percent field displays `15` for `15` and never divides behind the user's back."
21380
+ },
21381
+ {
21382
+ name: "numberFormat",
21383
+ kind: "property",
21384
+ signature: "numberFormat?: Intl.NumberFormatOptions",
21385
+ description: "Escape hatch, merged over the preset. Only `notation` is read today."
21386
+ },
21387
+ {
21388
+ name: "min",
21389
+ kind: "property",
21390
+ signature: "min?: number",
21391
+ description: "Read only to decide `inputmode` \u2014 a field that can go negative needs `-`."
21392
+ },
21393
+ {
21394
+ name: "unitAnnouncement",
21395
+ kind: "property",
21396
+ signature: "unitAnnouncement?: string",
21397
+ description: "Spoken long form of an abbreviated suffix, for `aria-valuetext`."
21398
+ }
21399
+ ],
21400
+ version: "11.5.0"
21401
+ },
21402
+ {
21403
+ id: "uni-resolved-number-format",
21404
+ name: "UniResolvedNumberFormat",
21405
+ kind: "interface",
21406
+ module: "number",
21407
+ importPath: "@uni-design-system/uni-angular",
21408
+ signature: "interface UniResolvedNumberFormat",
21409
+ summary: "A format config with every preset and locale default filled in.",
21410
+ description: "A format config with every preset and locale default filled in.",
21411
+ members: [
21412
+ {
21413
+ name: "locale",
21414
+ kind: "property",
21415
+ signature: "locale: string",
21416
+ description: ""
21417
+ },
21418
+ {
21419
+ name: "parts",
21420
+ kind: "property",
21421
+ signature: "parts: UniLocaleNumberParts",
21422
+ description: ""
21423
+ },
21424
+ {
21425
+ name: "prefix",
21426
+ kind: "property",
21427
+ signature: "prefix: string",
21428
+ description: ""
21429
+ },
21430
+ {
21431
+ name: "suffix",
21432
+ kind: "property",
21433
+ signature: "suffix: string",
21434
+ description: ""
21435
+ },
21436
+ {
21437
+ name: "minimumFractionDigits",
21438
+ kind: "property",
21439
+ signature: "minimumFractionDigits: number",
21440
+ description: ""
21441
+ },
21442
+ {
21443
+ name: "maximumFractionDigits",
21444
+ kind: "property",
21445
+ signature: "maximumFractionDigits: number",
21446
+ description: ""
21447
+ },
21448
+ {
21449
+ name: "grouping",
21450
+ kind: "property",
21451
+ signature: "grouping: UniNumberGrouping",
21452
+ description: ""
21453
+ },
21454
+ {
21455
+ name: "compact",
21456
+ kind: "property",
21457
+ signature: "compact: boolean",
21458
+ description: "`1.5k` in, `1.5K` out."
21459
+ },
21460
+ {
21461
+ name: "isInteger",
21462
+ kind: "property",
21463
+ signature: "isInteger: boolean",
21464
+ description: "Fraction entry is refused outright rather than rounded away."
21465
+ },
21466
+ {
21467
+ name: "shift",
21468
+ kind: "property",
21469
+ signature: "shift: number",
21470
+ description: "Display value is the model value \xD7 `10^shift`."
21471
+ },
21472
+ {
21473
+ name: "roundingMode",
21474
+ kind: "property",
21475
+ signature: "roundingMode: UniRoundingMode",
21476
+ description: ""
21477
+ },
21478
+ {
21479
+ name: "inputMode",
21480
+ kind: "property",
21481
+ signature: "inputMode: 'decimal' | 'numeric'",
21482
+ description: "`numeric` only when negatives and decimals are both impossible."
21483
+ },
21484
+ {
21485
+ name: "unitAnnouncement",
21486
+ kind: "property",
21487
+ signature: "unitAnnouncement?: string",
21488
+ description: ""
21489
+ }
21490
+ ],
21491
+ version: "11.5.0"
21492
+ },
21493
+ {
21494
+ id: "uni-number-parse-result",
21495
+ name: "UniNumberParseResult",
21496
+ kind: "type",
21497
+ module: "number",
21498
+ importPath: "@uni-design-system/uni-angular",
21499
+ signature: "type UniNumberParseResult = { status: 'empty' } | { status: 'ok'; value: string; viaExpression: boolean } | { status: 'error'; reason: UniNumberRejectReason }",
21500
+ summary: "The outcome of reading a user's text.",
21501
+ 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
+ members: [],
21503
+ version: "11.5.0"
21504
+ },
21505
+ {
21506
+ id: "is-canonical-decimal",
21507
+ name: "isCanonicalDecimal",
21508
+ kind: "function",
21509
+ module: "number",
21510
+ importPath: "@uni-design-system/uni-angular",
21511
+ signature: "function isCanonicalDecimal(text: string): boolean",
21512
+ summary: "True when `text` is already a canonical decimal (leading/trailing space allowed).",
21513
+ description: "True when `text` is already a canonical decimal (leading/trailing space allowed).",
21514
+ members: [],
21515
+ version: "11.5.0"
21516
+ },
21517
+ {
21518
+ id: "decimal-scale",
21519
+ name: "decimalScale",
21520
+ kind: "function",
21521
+ module: "number",
21522
+ importPath: "@uni-design-system/uni-angular",
21523
+ signature: "function decimalScale(value: string): number",
21524
+ summary: "Fraction-digit count.",
21525
+ description: "Fraction-digit count. `'1.250'` \u2192 3, `'12'` \u2192 0, `'5.'` \u2192 0.",
21526
+ members: [],
21527
+ version: "11.5.0"
21528
+ },
21529
+ {
21530
+ id: "to-scaled",
21531
+ name: "toScaled",
21532
+ kind: "function",
21533
+ module: "number",
21534
+ importPath: "@uni-design-system/uni-angular",
21535
+ signature: "function toScaled(value: string, scale: number): bigint",
21536
+ summary: "Canonical decimal \u2192 integer scaled by `10^scale`.",
21537
+ 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
+ members: [],
21539
+ version: "11.5.0"
21540
+ },
21541
+ {
21542
+ id: "from-scaled",
21543
+ name: "fromScaled",
21544
+ kind: "function",
21545
+ module: "number",
21546
+ importPath: "@uni-design-system/uni-angular",
21547
+ signature: "function fromScaled(scaled: bigint, scale: number): string",
21548
+ summary: "Scaled integer \u2192 canonical decimal, with trailing fraction zeros trimmed.",
21549
+ description: "Scaled integer \u2192 canonical decimal, with trailing fraction zeros trimmed.",
21550
+ members: [],
21551
+ version: "11.5.0"
21552
+ },
21553
+ {
21554
+ id: "normalize-decimal",
21555
+ name: "normalizeDecimal",
21556
+ kind: "function",
21557
+ module: "number",
21558
+ importPath: "@uni-design-system/uni-angular",
21559
+ signature: "function normalizeDecimal(value: string): string",
21560
+ summary: "Strip a leading `+`, leading zeros and trailing fraction zeros: `'+01.50'` \u2192 `'1.5'`.",
21561
+ description: "Strip a leading `+`, leading zeros and trailing fraction zeros: `'+01.50'` \u2192 `'1.5'`. Requires a canonical decimal; guard with `isCanonicalDecimal`.",
21562
+ members: [],
21563
+ version: "11.5.0"
21564
+ },
21565
+ {
21566
+ id: "to-decimal",
21567
+ name: "toDecimal",
21568
+ kind: "function",
21569
+ module: "number",
21570
+ importPath: "@uni-design-system/uni-angular",
21571
+ signature: "function toDecimal(value: number | string): string",
21572
+ summary: "Any numeric input \u2192 canonical decimal, expanding the exponential notation `String(number)` produces outside 1e-7\u20261e21.",
21573
+ 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
+ members: [],
21575
+ version: "11.5.0"
21576
+ },
21577
+ {
21578
+ id: "compare-decimal",
21579
+ name: "compareDecimal",
21580
+ kind: "function",
21581
+ module: "number",
21582
+ importPath: "@uni-design-system/uni-angular",
21583
+ signature: "function compareDecimal(a: string, b: string): -1 | 0 | 1",
21584
+ summary: "`-1` when `a < b`, `1` when `a > b`, `0` when equal.",
21585
+ description: "`-1` when `a < b`, `1` when `a > b`, `0` when equal. `'1.50'` equals `'1.5'`.",
21586
+ members: [],
21587
+ version: "11.5.0"
21588
+ },
21589
+ {
21590
+ id: "round-decimal",
21591
+ name: "roundDecimal",
21592
+ kind: "function",
21593
+ module: "number",
21594
+ importPath: "@uni-design-system/uni-angular",
21595
+ signature: "function roundDecimal(value: string, fractionDigits: number, mode: UniRoundingMode = 'half-up'): string",
21596
+ summary: "Round to `fractionDigits`, breaking ties per `mode`.",
21597
+ description: "Round to `fractionDigits`, breaking ties per `mode`. Exact where `Number.prototype.toFixed` is not \u2014 see the file header.",
21598
+ members: [],
21599
+ version: "11.5.0"
21600
+ },
21601
+ {
21602
+ id: "shift-decimal",
21603
+ name: "shiftDecimal",
21604
+ kind: "function",
21605
+ module: "number",
21606
+ importPath: "@uni-design-system/uni-angular",
21607
+ signature: "function shiftDecimal(value: string, places: number): string",
21608
+ summary: "Multiply by `10^places`, exactly.",
21609
+ 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
+ members: [],
21611
+ version: "11.5.0"
21612
+ },
21613
+ {
21614
+ id: "clamp-decimal",
21615
+ name: "clampDecimal",
21616
+ kind: "function",
21617
+ module: "number",
21618
+ importPath: "@uni-design-system/uni-angular",
21619
+ signature: "function clampDecimal(value: string, min?: number | string, max?: number | string): UniNumberClamp",
21620
+ summary: "Hold a value inside its fences, reporting which one it hit so the caller can announce it.",
21621
+ 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
+ members: [],
21623
+ version: "11.5.0"
21624
+ },
21625
+ {
21626
+ id: "step-decimal",
21627
+ name: "stepDecimal",
21628
+ kind: "function",
21629
+ module: "number",
21630
+ importPath: "@uni-design-system/uni-angular",
21631
+ signature: "function stepDecimal(current: string, direction: 1 | -1, config: UniNumberStepConfig = {}): string",
21632
+ summary: "One step from `current`, in `direction` (`1` up, `-1` down).",
21633
+ 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
+ members: [],
21635
+ version: "11.5.0"
21636
+ },
21637
+ {
21638
+ id: "locale-number-parts",
21639
+ name: "localeNumberParts",
21640
+ kind: "const",
21641
+ module: "number",
21642
+ importPath: "@uni-design-system/uni-angular",
21643
+ signature: "const localeNumberParts = memoize(\u2026)",
21644
+ summary: "Locale separators plus, when a currency is given, its symbol, side and fraction digits.",
21645
+ 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
+ members: [],
21647
+ version: "11.5.0"
21648
+ },
21649
+ {
21650
+ id: "to-ascii-digits",
21651
+ name: "toAsciiDigits",
21652
+ kind: "function",
21653
+ module: "number",
21654
+ importPath: "@uni-design-system/uni-angular",
21655
+ signature: "function toAsciiDigits(text: string): string",
21656
+ 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
+ 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
+ members: [],
21659
+ version: "11.5.0"
21660
+ },
21661
+ {
21662
+ id: "evaluate-expression",
21663
+ name: "evaluateExpression",
21664
+ kind: "function",
21665
+ module: "number",
21666
+ importPath: "@uni-design-system/uni-angular",
21667
+ signature: "function evaluateExpression(text: string): string | null",
21668
+ summary: "Evaluate `+ \u2212 \xD7 \xF7 ( )` over decimal literals \u2014 shunting-yard, roughly thirty lines, and **never `eval`**.",
21669
+ 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
+ members: [],
21671
+ version: "11.5.0"
21672
+ },
21673
+ {
21674
+ id: "resolve-number-format",
21675
+ name: "resolveNumberFormat",
21676
+ kind: "function",
21677
+ module: "number",
21678
+ importPath: "@uni-design-system/uni-angular",
21679
+ signature: "function resolveNumberFormat(config: UniNumberFormatConfig = {}): UniResolvedNumberFormat",
21680
+ summary: "Fill in every preset, locale and currency default.",
21681
+ description: "Fill in every preset, locale and currency default.",
21682
+ members: [],
21683
+ version: "11.5.0"
21684
+ },
21685
+ {
21686
+ id: "parse-number",
21687
+ name: "parseNumber",
21688
+ kind: "function",
21689
+ module: "number",
21690
+ importPath: "@uni-design-system/uni-angular",
21691
+ signature: "function parseNumber(raw: string, format: UniResolvedNumberFormat, options: { allowExpressions?: boolean; currency?: string } = {}): UniNumberParseResult",
21692
+ summary: "Read a user's text into a canonical decimal in **model units**.",
21693
+ 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
+ members: [],
21695
+ version: "11.5.0"
21696
+ },
21697
+ {
21698
+ id: "format-number",
21699
+ name: "formatNumber",
21700
+ kind: "function",
21701
+ module: "number",
21702
+ importPath: "@uni-design-system/uni-angular",
21703
+ signature: "function formatNumber(canonical: string, format: UniResolvedNumberFormat): string",
21704
+ summary: "Canonical decimal (model units) \u2192 the display number, without affixes.",
21705
+ 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
+ members: [],
21707
+ version: "11.5.0"
21708
+ },
21709
+ {
21710
+ id: "raw-number-text",
21711
+ name: "rawNumberText",
21712
+ kind: "function",
21713
+ module: "number",
21714
+ importPath: "@uni-design-system/uni-angular",
21715
+ signature: "function rawNumberText(canonical: string, format: UniResolvedNumberFormat): string",
21716
+ 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
+ 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
+ members: [],
21719
+ version: "11.5.0"
21720
+ },
21721
+ {
21722
+ id: "settle-number",
21723
+ name: "settleNumber",
21724
+ kind: "function",
21725
+ module: "number",
21726
+ importPath: "@uni-design-system/uni-angular",
21727
+ signature: "function settleNumber(canonical: string, format: UniResolvedNumberFormat): string",
21728
+ summary: "Round a committed value to the field's precision, in model units.",
21729
+ description: "Round a committed value to the field's precision, in model units.",
21730
+ members: [],
21731
+ version: "11.5.0"
21732
+ },
21733
+ {
21734
+ id: "speak-number",
21735
+ name: "speakNumber",
21736
+ kind: "function",
21737
+ module: "number",
21738
+ importPath: "@uni-design-system/uni-angular",
21739
+ signature: "function speakNumber(canonical: string | null, format: UniResolvedNumberFormat, emptyText = 'Empty'): string",
21740
+ summary: "The `aria-valuetext` string: the formatted number with its affixes spoken.",
21741
+ 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
+ members: [],
21743
+ version: "11.5.0"
21744
+ },
21745
+ {
21746
+ id: "to-number",
21747
+ name: "toNumber",
21748
+ kind: "function",
21749
+ module: "number",
21750
+ importPath: "@uni-design-system/uni-angular",
21751
+ signature: "function toNumber(canonical: string): number",
21752
+ summary: "Model-units canonical decimal \u2192 the bound `number`.",
21753
+ description: "Model-units canonical decimal \u2192 the bound `number`.",
21754
+ members: [],
21755
+ version: "11.5.0"
21756
+ },
21757
+ {
21758
+ id: "loses-precision",
21759
+ name: "losesPrecision",
21760
+ kind: "function",
21761
+ module: "number",
21762
+ importPath: "@uni-design-system/uni-angular",
21763
+ signature: "function losesPrecision(value: number | string): boolean",
21764
+ 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
+ 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
+ members: [],
21767
+ version: "11.5.0"
21768
+ },
21769
+ {
21770
+ id: "press-repeat-timing",
21771
+ name: "PressRepeatTiming",
21772
+ kind: "interface",
21773
+ module: "number",
21774
+ importPath: "@uni-design-system/uni-angular",
21775
+ signature: "interface PressRepeatTiming",
21776
+ summary: "Repeat timings, normally sourced from a component's theme options.",
21777
+ description: "Repeat timings, normally sourced from a component's theme options.",
21778
+ members: [
21779
+ {
21780
+ name: "delayMs",
21781
+ kind: "property",
21782
+ signature: "delayMs?: number",
21783
+ description: ""
21784
+ },
21785
+ {
21786
+ name: "intervalMs",
21787
+ kind: "property",
21788
+ signature: "intervalMs?: number",
21789
+ description: ""
21790
+ },
21791
+ {
21792
+ name: "fastIntervalMs",
21793
+ kind: "property",
21794
+ signature: "fastIntervalMs?: number",
21795
+ description: ""
21796
+ },
21797
+ {
21798
+ name: "rampMs",
21799
+ kind: "property",
21800
+ signature: "rampMs?: number",
21801
+ description: ""
21802
+ }
21803
+ ],
21804
+ version: "11.5.0"
21805
+ },
21806
+ {
21807
+ id: "press-repeat-config",
21808
+ name: "PressRepeatConfig",
21809
+ kind: "interface",
21810
+ module: "number",
21811
+ importPath: "@uni-design-system/uni-angular",
21812
+ signature: "interface PressRepeatConfig",
21813
+ summary: "",
21814
+ description: "",
21815
+ members: [
21816
+ {
21817
+ name: "onStep",
21818
+ kind: "property",
21819
+ signature: "onStep: (repeat: boolean) => void",
21820
+ description: "Perform one step. `repeat` is `false` for the initial press and `true` for every automatic repeat, so a caller can stay silent during the run."
21821
+ },
21822
+ {
21823
+ name: "onRelease",
21824
+ kind: "property",
21825
+ signature: "onRelease?: (repeated: boolean) => void",
21826
+ description: "The hold ended. `repeated` says whether it ever auto-repeated, which is the cue to announce the final value: a screen reader narrating two hundred intermediate values is a denial of service, so announcing belongs here and not in `onStep`."
21827
+ },
21828
+ {
21829
+ name: "disabled",
21830
+ kind: "property",
21831
+ signature: "disabled?: () => boolean",
21832
+ description: "Consulted on press; a disabled button must not start a run."
21833
+ },
21834
+ {
21835
+ name: "focus",
21836
+ kind: "property",
21837
+ signature: "focus?: (button: HTMLElement | null) => void",
21838
+ description: "Put focus where it belongs for this control \u2014 normally its text field, the way a native spinner does. Called on press, because taking pointer capture means preventing the default, which would otherwise leave focus nowhere. Receives the pressed button, as a fallback for controls with no field to focus."
21839
+ },
21840
+ {
21841
+ name: "repeat",
21842
+ kind: "property",
21843
+ signature: "repeat?: () => boolean",
21844
+ description: "When this returns `false`, a press steps exactly once and the repeat timer is never armed \u2014 `onRelease` still fires, with `repeated: false`. Lets a caller turn hold-to-repeat off without a second set of event bindings."
21845
+ },
21846
+ {
21847
+ name: "timing",
21848
+ kind: "property",
21849
+ signature: "timing?: () => PressRepeatTiming",
21850
+ description: ""
21851
+ }
21852
+ ],
21853
+ version: "11.5.0"
21854
+ },
21855
+ {
21856
+ id: "press-repeat",
21857
+ name: "PressRepeat",
21858
+ kind: "interface",
21859
+ module: "number",
21860
+ importPath: "@uni-design-system/uni-angular",
21861
+ signature: "interface PressRepeat",
21862
+ summary: "",
21863
+ description: "",
21864
+ members: [
21865
+ {
21866
+ name: "holding",
21867
+ kind: "property",
21868
+ signature: "readonly holding: Signal<boolean>",
21869
+ description: "True while a press is in flight \u2014 bind it to the button's pressed state."
21870
+ },
21871
+ {
21872
+ name: "press",
21873
+ kind: "method",
21874
+ signature: "press(event?: PointerEvent): void",
21875
+ description: "Begin a hold and step once immediately. Given a pointer event, it also takes pointer capture, so sliding off the button mid-hold neither strands the repeat nor drops the release."
21876
+ },
21877
+ {
21878
+ name: "release",
21879
+ kind: "method",
21880
+ signature: "release(): void",
21881
+ description: "End a hold normally, firing `onRelease`."
21882
+ },
21883
+ {
21884
+ name: "cancel",
21885
+ kind: "method",
21886
+ signature: "cancel(): void",
21887
+ description: "End a hold without firing `onRelease` \u2014 for `Escape` and `pointercancel`."
21888
+ }
21889
+ ],
21890
+ version: "11.5.0"
21891
+ },
21892
+ {
21893
+ id: "create-press-repeat",
21894
+ name: "createPressRepeat",
21895
+ kind: "function",
21896
+ module: "number",
21897
+ importPath: "@uni-design-system/uni-angular",
21898
+ signature: "function createPressRepeat(config: PressRepeatConfig): PressRepeat",
21899
+ summary: "",
21900
+ description: "",
21901
+ members: [],
21902
+ version: "11.5.0"
21903
+ },
21904
+ {
21905
+ id: "listbox-navigation-config",
21906
+ name: "ListboxNavigationConfig",
21907
+ kind: "interface",
21908
+ module: "listbox",
21909
+ importPath: "@uni-design-system/uni-angular",
21910
+ signature: "interface ListboxNavigationConfig",
21911
+ summary: "",
21912
+ description: "",
21913
+ members: [
21914
+ {
21915
+ name: "count",
21916
+ kind: "property",
21917
+ signature: "count: () => number",
21918
+ description: "How many options are currently navigable. Read reactively."
21919
+ },
21920
+ {
21921
+ name: "idPrefix",
21922
+ kind: "property",
21923
+ signature: "idPrefix?: string",
21924
+ description: "Id prefix for the listbox and its options."
21925
+ },
21926
+ {
21927
+ name: "wrap",
21928
+ kind: "property",
21929
+ signature: "wrap?: boolean",
21930
+ description: "Wrap past the ends. Default true."
21931
+ },
21932
+ {
21933
+ name: "disabled",
21934
+ kind: "property",
21935
+ signature: "disabled?: (index: number) => boolean",
21936
+ description: "Non-navigable options. Arrows step over them; Home/End land on the nearest enabled option; an all-disabled list never activates."
21937
+ },
21938
+ {
21939
+ name: "homeEndNavigates",
21940
+ kind: "property",
21941
+ signature: "homeEndNavigates?: boolean",
21942
+ 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
+ }
21944
+ ],
21945
+ version: "11.5.0"
21946
+ },
21947
+ {
21948
+ id: "listbox-navigation",
21949
+ name: "ListboxNavigation",
21950
+ kind: "class",
21951
+ module: "listbox",
21952
+ importPath: "@uni-design-system/uni-angular",
21953
+ signature: "class ListboxNavigation",
21954
+ summary: "The keyboard and ARIA bookkeeping shared by every combobox-style popup: open state, the active option index, and the `aria-activedescendant` id wiring.",
21955
+ description: "The keyboard and ARIA bookkeeping shared by every combobox-style popup: open state, the active option index, and the `aria-activedescendant` id wiring. Deliberately owns no markup and no filtering \u2014 each control renders its own options and decides what a suggestion *is*. Extracted because three controls need the identical contract (`uni-search-input`, `uni-tag-input`, and the multi-select upgrade), and the parts that silently drift between hand-rolled copies all live here: the wrap-around arithmetic and keeping the active id in sync with the option list. Home/End are opt-in (`homeEndNavigates`) because a text field's caret has the better claim on them. `Enter` and `Escape` are deliberately *not* handled: what they mean depends on the control (submit a search, commit a typed token, clear the field), and `activeIndex()` is all a caller needs to decide.",
21956
+ members: [
21957
+ {
21958
+ name: "listboxId",
21959
+ kind: "property",
21960
+ signature: "readonly listboxId: string",
21961
+ description: 'Id for the `role="listbox"` element; wire as `aria-controls`.'
21962
+ },
21963
+ {
21964
+ name: "open",
21965
+ kind: "property",
21966
+ signature: "readonly open: Signal<boolean>",
21967
+ description: "Whether the popup is showing. Also false when there is nothing to show."
21968
+ },
21969
+ {
21970
+ name: "activeIndex",
21971
+ kind: "property",
21972
+ signature: "readonly activeIndex: Signal<number>",
21973
+ description: "Index of the highlighted option, or -1 when none is active."
21974
+ },
21975
+ {
21976
+ name: "activeDescendantId",
21977
+ kind: "property",
21978
+ signature: "readonly activeDescendantId: Signal<string | null>",
21979
+ description: "Value for `aria-activedescendant`, or null when nothing is active."
21980
+ },
21981
+ {
21982
+ name: "optionId",
21983
+ kind: "method",
21984
+ signature: "optionId(index: number): string",
21985
+ description: 'Stable per-option id, for `role="option"` elements.'
21986
+ },
21987
+ {
21988
+ name: "show",
21989
+ kind: "method",
21990
+ signature: "show(): void",
21991
+ description: ""
21992
+ },
21993
+ {
21994
+ name: "hide",
21995
+ kind: "method",
21996
+ signature: "hide(): void",
21997
+ description: "Close and drop the active option, so reopening starts clean."
21998
+ },
21999
+ {
22000
+ name: "setActive",
22001
+ kind: "method",
22002
+ signature: "setActive(index: number): void",
22003
+ description: ""
22004
+ },
22005
+ {
22006
+ name: "navigate",
22007
+ kind: "method",
22008
+ signature: "navigate(event: KeyboardEvent): boolean",
22009
+ description: "Handle ArrowDown / ArrowUp \u2014 and Home / End where `homeEndNavigates` is on. Opens the popup if needed. Returns true when the key was consumed, so a caller can fall through to its own handling for everything else."
22010
+ },
22011
+ {
22012
+ name: "closeOnFocusOut",
22013
+ kind: "method",
22014
+ signature: "closeOnFocusOut(event: FocusEvent): void",
22015
+ description: "Close when focus leaves the control entirely (not on internal moves)."
22016
+ }
22017
+ ],
22018
+ version: "11.5.0"
22019
+ },
22020
+ {
22021
+ id: "create-listbox-navigation",
22022
+ name: "createListboxNavigation",
22023
+ kind: "function",
22024
+ module: "listbox",
22025
+ importPath: "@uni-design-system/uni-angular",
22026
+ signature: "function createListboxNavigation(config: ListboxNavigationConfig): ListboxNavigation",
22027
+ summary: "Factory mirroring the signal-API style used elsewhere in the CDK.",
22028
+ description: "Factory mirroring the signal-API style used elsewhere in the CDK.",
22029
+ members: [],
22030
+ version: "11.5.0"
22031
+ },
22032
+ {
22033
+ id: "placement",
22034
+ name: "Placement",
22035
+ kind: "type",
22036
+ module: "position",
22037
+ importPath: "@uni-design-system/uni-angular",
22038
+ signature: "type Placement = 'top' | 'right' | 'bottom' | 'left' | 'top-start' | 'right-start' | 'bottom-start' | 'left-start' | 'top-end' | 'right-end' | 'bottom-end' | 'left-end'",
22039
+ summary: "Native CSS Anchor Positioning helpers (Baseline 2026).",
22040
+ description: "Native CSS Anchor Positioning helpers (Baseline 2026). These replace the former",
22041
+ members: [],
22042
+ version: "11.5.0"
22043
+ },
22044
+ {
22045
+ id: "anchor-offset",
22046
+ name: "AnchorOffset",
22047
+ kind: "interface",
22048
+ module: "position",
22049
+ importPath: "@uni-design-system/uni-angular",
22050
+ signature: "interface AnchorOffset",
22051
+ summary: "Distances between the anchor and the positioned panel, in px.",
22052
+ description: "Distances between the anchor and the positioned panel, in px.",
22053
+ members: [
22054
+ {
22055
+ name: "mainAxis",
22056
+ kind: "property",
22057
+ signature: "mainAxis?: number",
22058
+ description: "Gap along the placement axis (anchor \u2192 panel)."
22059
+ },
22060
+ {
22061
+ name: "alignmentAxis",
22062
+ kind: "property",
22063
+ signature: "alignmentAxis?: number",
22064
+ description: "Shift along the cross axis, from the aligned edge."
22065
+ }
22066
+ ],
22067
+ version: "11.5.0"
22068
+ },
22069
+ {
22070
+ id: "new-anchor-name",
22071
+ name: "newAnchorName",
22072
+ kind: "function",
22073
+ module: "position",
22074
+ importPath: "@uni-design-system/uni-angular",
22075
+ signature: "function newAnchorName(): string",
22076
+ summary: "Returns a document-unique dashed-ident usable as a CSS `anchor-name`.",
22077
+ description: "Returns a document-unique dashed-ident usable as a CSS `anchor-name`.",
22078
+ members: [],
22079
+ version: "11.5.0"
22080
+ },
22081
+ {
22082
+ id: "anchor-styles",
22083
+ name: "anchorStyles",
22084
+ kind: "function",
22085
+ module: "position",
22086
+ importPath: "@uni-design-system/uni-angular",
22087
+ signature: "function anchorStyles(anchor: string, placement: Placement, offset: AnchorOffset = {}): Record<string, string | number>",
22088
+ summary: "Emotion style object anchoring a panel to `anchor` at `placement`.",
22089
+ 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
+ members: [],
22091
+ version: "11.5.0"
22092
+ },
22093
+ {
22094
+ id: "anchor-arrow-styles",
22095
+ name: "anchorArrowStyles",
22096
+ kind: "function",
22097
+ module: "position",
22098
+ importPath: "@uni-design-system/uni-angular",
22099
+ signature: "function anchorArrowStyles(placement: Placement, size = 8, overlap = 0): Record<string, string | number>",
22100
+ summary: "Absolute positioning for a rotated-square arrow sitting on the panel edge that faces the anchor.",
22101
+ 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
+ members: [],
22103
+ version: "11.5.0"
22104
+ },
22105
+ {
22106
+ id: "spotlight-options",
22107
+ name: "SpotlightOptions",
22108
+ kind: "interface",
22109
+ module: "position",
22110
+ importPath: "@uni-design-system/uni-angular",
22111
+ signature: "interface SpotlightOptions",
22112
+ summary: "",
22113
+ description: "",
22114
+ members: [
22115
+ {
22116
+ name: "pad",
22117
+ kind: "property",
22118
+ signature: "pad?: number",
22119
+ description: "Gap between the target's box and the hole edge, px."
22120
+ },
22121
+ {
22122
+ name: "ringWidth",
22123
+ kind: "property",
22124
+ signature: "ringWidth?: number",
22125
+ description: "Ring border width, px \u2014 border-color and radius come from the caller."
22126
+ },
22127
+ {
22128
+ name: "scrimColor",
22129
+ kind: "property",
22130
+ signature: "scrimColor?: string",
22131
+ description: "Scrim paint; scheme-invariant by convention, like `::backdrop`."
22132
+ }
22133
+ ],
22134
+ version: "11.5.0"
22135
+ },
22136
+ {
22137
+ id: "spotlight-styles",
22138
+ name: "SpotlightStyles",
22139
+ kind: "interface",
22140
+ module: "position",
22141
+ importPath: "@uni-design-system/uni-angular",
22142
+ signature: "interface SpotlightStyles",
22143
+ summary: "",
22144
+ description: "",
22145
+ members: [
22146
+ {
22147
+ name: "window",
22148
+ kind: "property",
22149
+ signature: "window: Record<string, string | number>",
22150
+ description: "Paints the scrim + ring. `pointer-events: none` \u2014 purely visual."
22151
+ },
22152
+ {
22153
+ name: "strips",
22154
+ kind: "property",
22155
+ signature: "strips: Record<'top' | 'bottom' | 'left' | 'right', Record<string, string | number>>",
22156
+ description: "Click-blockers surrounding the hole; the hole itself is genuinely empty."
22157
+ },
22158
+ {
22159
+ name: "cover",
22160
+ kind: "property",
22161
+ signature: "cover: Record<string, string | number>",
22162
+ description: "Hole-sized click-blocker, shown when the target must not be interactive."
22163
+ }
22164
+ ],
22165
+ version: "11.5.0"
22166
+ },
22167
+ {
22168
+ id: "anchor-rect",
22169
+ name: "AnchorRect",
22170
+ kind: "interface",
22171
+ module: "position",
22172
+ importPath: "@uni-design-system/uni-angular",
22173
+ signature: "interface AnchorRect",
22174
+ summary: "The rect fields the origin computation reads \u2014 satisfied by DOMRect.",
22175
+ description: "The rect fields the origin computation reads \u2014 satisfied by DOMRect.",
22176
+ members: [
22177
+ {
22178
+ name: "top",
22179
+ kind: "property",
22180
+ signature: "top: number",
22181
+ description: ""
22182
+ },
22183
+ {
22184
+ name: "right",
22185
+ kind: "property",
22186
+ signature: "right: number",
22187
+ description: ""
22188
+ },
22189
+ {
22190
+ name: "bottom",
22191
+ kind: "property",
22192
+ signature: "bottom: number",
22193
+ description: ""
22194
+ },
22195
+ {
22196
+ name: "left",
22197
+ kind: "property",
22198
+ signature: "left: number",
22199
+ description: ""
22200
+ },
22201
+ {
22202
+ name: "width",
22203
+ kind: "property",
22204
+ signature: "width: number",
22205
+ description: ""
22206
+ },
22207
+ {
22208
+ name: "height",
22209
+ kind: "property",
22210
+ signature: "height: number",
22211
+ description: ""
22212
+ }
22213
+ ],
22214
+ version: "11.5.0"
22215
+ },
22216
+ {
22217
+ id: "transform-origin-for",
22218
+ name: "transformOriginFor",
22219
+ kind: "function",
22220
+ module: "position",
22221
+ importPath: "@uni-design-system/uni-angular",
22222
+ signature: "function transformOriginFor(panel: AnchorRect, trigger: AnchorRect): string | null",
22223
+ 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
+ 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
+ members: [],
22226
+ version: "11.5.0"
22227
+ },
22228
+ {
22229
+ id: "transform-origins",
22230
+ name: "TRANSFORM_ORIGINS",
22231
+ kind: "const",
22232
+ module: "overlay",
22233
+ importPath: "@uni-design-system/uni-angular",
22234
+ signature: "const TRANSFORM_ORIGINS: Record<Placement, string>",
22235
+ summary: "Placement \u2192 `transform-origin`, so scale animations grow from the anchor.",
22236
+ description: "Placement \u2192 `transform-origin`, so scale animations grow from the anchor.",
22237
+ members: [],
22238
+ version: "11.5.0"
22239
+ },
22240
+ {
22241
+ id: "set-anchor-name",
22242
+ name: "setAnchorName",
22243
+ kind: "function",
22244
+ module: "overlay",
22245
+ importPath: "@uni-design-system/uni-angular",
22246
+ signature: "function setAnchorName(el: HTMLElement, name: string): void",
22247
+ summary: "Write a CSS `anchor-name` onto an element (detached anchors and targets).",
22248
+ description: "Write a CSS `anchor-name` onto an element (detached anchors and targets).",
22249
+ members: [],
22250
+ version: "11.5.0"
22251
+ },
22252
+ {
22253
+ id: "clear-anchor-name",
22254
+ name: "clearAnchorName",
22255
+ kind: "function",
22256
+ module: "overlay",
22257
+ importPath: "@uni-design-system/uni-angular",
22258
+ signature: "function clearAnchorName(el: HTMLElement): void",
22259
+ summary: "",
22260
+ description: "",
22261
+ members: [],
22262
+ version: "11.5.0"
22263
+ },
22264
+ {
22265
+ id: "resolve-element",
22266
+ name: "resolveElement",
22267
+ kind: "function",
22268
+ module: "overlay",
22269
+ importPath: "@uni-design-system/uni-angular",
22270
+ signature: "function resolveElement(ref: HTMLElement | string | null | undefined): HTMLElement | null",
22271
+ summary: "Resolve an element-or-id reference.",
22272
+ 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
+ members: [],
22274
+ version: "11.5.0"
22275
+ },
22276
+ {
22277
+ id: "is-toggle-open",
22278
+ name: "isToggleOpen",
22279
+ kind: "function",
22280
+ module: "overlay",
22281
+ importPath: "@uni-design-system/uni-angular",
22282
+ signature: "function isToggleOpen(event: Event): boolean",
22283
+ summary: "True when a native `toggle` event reports the overlay opening.",
22284
+ description: "True when a native `toggle` event reports the overlay opening.",
22285
+ members: [],
22286
+ version: "11.5.0"
22287
+ },
22288
+ {
22289
+ id: "discrete-overlay-transition",
22290
+ name: "discreteOverlayTransition",
22291
+ kind: "function",
22292
+ module: "overlay",
22293
+ importPath: "@uni-design-system/uni-angular",
22294
+ signature: "function discreteOverlayTransition(durationMs: number, hidden: Record<string, string | number>, shown: Record<string, string | number>, timingFunction?: string): Record<string, unknown>",
22295
+ 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
+ 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
+ members: [],
22298
+ version: "11.5.0"
22299
+ },
22300
+ {
22301
+ id: "restore-overlay-focus",
22302
+ name: "restoreOverlayFocus",
22303
+ kind: "function",
22304
+ module: "overlay",
22305
+ importPath: "@uni-design-system/uni-angular",
22306
+ signature: "function restoreOverlayFocus(panel: HTMLElement, target: HTMLElement | null): void",
22307
+ 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
+ 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
+ members: [],
22310
+ version: "11.5.0"
22311
+ },
22312
+ {
22313
+ id: "focusable-elements",
22314
+ name: "focusableElements",
22315
+ kind: "function",
22316
+ module: "overlay",
22317
+ importPath: "@uni-design-system/uni-angular",
22318
+ signature: "function focusableElements(root: HTMLElement): HTMLElement[]",
22319
+ summary: "The focusable elements inside `root`, in DOM order.",
22320
+ 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
+ members: [],
22322
+ version: "11.5.0"
22323
+ },
22324
+ {
22325
+ id: "backdrop-dismiss",
22326
+ name: "BackdropDismiss",
22327
+ kind: "class",
22328
+ module: "overlay",
22329
+ importPath: "@uni-design-system/uni-angular",
22330
+ signature: "class BackdropDismiss",
22331
+ summary: "Decides whether a click on a modal `<dialog>` was a click on its `::backdrop` \u2014 shared by `dialog[uni-dialog]` and `uni-drawer` (`over`), so the rule cannot drift between the two again.",
22332
+ description: 'Decides whether a click on a modal `<dialog>` was a click on its `::backdrop` \u2014 shared by `dialog[uni-dialog]` and `uni-drawer` (`over`), so the rule cannot drift between the two again. The click\'s target alone cannot tell. A `click` is dispatched to the nearest common ancestor of the press and the release, and the `::backdrop` belongs to the `<dialog>`: a text selection that starts in a field and is released over the scrim therefore produces a click whose target *is* the `<dialog>`, and used to close the surface \u2014 taking the user\'s unsaved input with it. Only where the press began separates the two, so a backdrop click is one that was both pressed and clicked on the dialog itself. Both checks compare against `currentTarget` rather than `nodeName`, so a nested `<dialog>` in projected content never counts as this one\'s backdrop. ```ts readonly backdrop = new BackdropDismiss(); // (pointerdown)="backdrop.press($event)" // (click)="backdrop.isBackdropClick($event) && close()" ```',
22333
+ members: [
22334
+ {
22335
+ name: "press",
22336
+ kind: "method",
22337
+ signature: "press(event: Event): void",
22338
+ description: "Record where the press began. `pointerdown` covers mouse, touch and pen."
22339
+ },
22340
+ {
22341
+ name: "isBackdropClick",
22342
+ kind: "method",
22343
+ signature: "isBackdropClick(event: Event): boolean",
22344
+ description: "True only when both the press and the click landed on the dialog itself."
22345
+ }
22346
+ ],
22347
+ version: "11.5.0"
22348
+ },
22349
+ {
22350
+ id: "sort-direction",
22351
+ name: "SortDirection",
22352
+ kind: "type",
22353
+ module: "datasource",
22354
+ importPath: "@uni-design-system/uni-angular",
22355
+ signature: "type SortDirection = 'asc' | 'desc' | 'indet'",
22356
+ summary: "",
22357
+ description: "",
22358
+ members: [],
22359
+ version: "11.5.0"
22360
+ },
22361
+ {
22362
+ id: "sort",
22363
+ name: "Sort",
22364
+ kind: "interface",
22365
+ module: "datasource",
22366
+ importPath: "@uni-design-system/uni-angular",
22367
+ signature: "interface Sort<T>",
22368
+ summary: "",
22369
+ description: "",
22370
+ members: [
22371
+ {
22372
+ name: "column",
22373
+ kind: "property",
22374
+ signature: "column?: keyof T",
22375
+ description: ""
22376
+ },
22377
+ {
22378
+ name: "direction",
22379
+ kind: "property",
22380
+ signature: "direction: SortDirection",
22381
+ description: ""
22382
+ }
22383
+ ],
22384
+ version: "11.5.0"
22385
+ },
22386
+ {
22387
+ id: "uni-base-datasource",
22388
+ name: "UniBaseDatasource",
22389
+ kind: "class",
22390
+ module: "datasource",
22391
+ importPath: "@uni-design-system/uni-angular",
22392
+ signature: "class UniBaseDatasource<T>",
22393
+ summary: "",
22394
+ description: "",
22395
+ members: [
22396
+ {
22397
+ name: "records",
22398
+ kind: "property",
22399
+ signature: "abstract records: Signal<T[]>",
22400
+ description: ""
22401
+ },
22402
+ {
22403
+ name: "recordCount",
22404
+ kind: "property",
22405
+ signature: "abstract recordCount: Signal<number>",
22406
+ description: ""
22407
+ },
22408
+ {
22409
+ name: "selections",
22410
+ kind: "property",
22411
+ signature: "selections = signal<T[]>([])",
22412
+ description: ""
22413
+ },
22414
+ {
22415
+ name: "sort",
22416
+ kind: "property",
22417
+ signature: "sort: WritableSignal<Sort<T>>",
22418
+ description: ""
22419
+ },
22420
+ {
22421
+ name: "sortColumn",
22422
+ kind: "property",
22423
+ signature: "sortColumn = computed(() => this.sort().column)",
22424
+ description: ""
22425
+ },
22426
+ {
22427
+ name: "sortDirection",
22428
+ kind: "property",
22429
+ signature: "sortDirection = computed(() => this.sort().direction)",
22430
+ description: ""
22431
+ },
22432
+ {
22433
+ name: "pageIndex",
22434
+ kind: "property",
22435
+ signature: "abstract pageIndex: Signal<number>",
22436
+ description: ""
22437
+ },
22438
+ {
22439
+ name: "pageSize",
22440
+ kind: "property",
22441
+ signature: "abstract pageSize: Signal<number>",
22442
+ description: ""
22443
+ },
22444
+ {
22445
+ name: "pageCount",
22446
+ kind: "property",
22447
+ signature: "abstract pageCount: Signal<number>",
22448
+ description: ""
22449
+ },
22450
+ {
22451
+ name: "pages",
22452
+ kind: "property",
22453
+ signature: "pages = computed(\u2026)",
22454
+ description: ""
22455
+ },
22456
+ {
22457
+ name: "startIndex",
22458
+ kind: "property",
22459
+ signature: "startIndex = computed(\u2026)",
22460
+ description: ""
22461
+ },
22462
+ {
22463
+ name: "endIndex",
22464
+ kind: "property",
22465
+ signature: "endIndex = computed(\u2026)",
22466
+ description: ""
22467
+ },
22468
+ {
22469
+ name: "disablePrevious",
22470
+ kind: "property",
22471
+ signature: "disablePrevious = computed(\u2026)",
22472
+ description: ""
22473
+ },
22474
+ {
22475
+ name: "disableNext",
22476
+ kind: "property",
22477
+ signature: "disableNext = computed(\u2026)",
22478
+ description: ""
22479
+ },
22480
+ {
22481
+ name: "truncatedPages",
22482
+ kind: "property",
22483
+ signature: "truncatedPages = computed(\u2026)",
22484
+ description: ""
22485
+ },
22486
+ {
22487
+ name: "isSelected",
22488
+ kind: "method",
22489
+ signature: "isSelected(row: T): boolean",
22490
+ description: ""
22491
+ },
22492
+ {
22493
+ name: "toggleSelection",
22494
+ kind: "method",
22495
+ signature: "toggleSelection(row: T)",
22496
+ description: ""
22497
+ },
22498
+ {
22499
+ name: "clearSelections",
22500
+ kind: "method",
22501
+ signature: "clearSelections()",
22502
+ description: ""
22503
+ },
22504
+ {
22505
+ name: "selectAll",
22506
+ kind: "method",
22507
+ signature: "selectAll()",
22508
+ description: ""
22509
+ },
22510
+ {
22511
+ name: "sortRecords",
22512
+ kind: "method",
22513
+ signature: "abstract sortRecords(sort: Sort<T>): void",
22514
+ description: ""
22515
+ },
22516
+ {
22517
+ name: "firstPage",
22518
+ kind: "method",
22519
+ signature: "abstract firstPage(): void",
22520
+ description: ""
22521
+ },
22522
+ {
22523
+ name: "nextPage",
22524
+ kind: "method",
22525
+ signature: "abstract nextPage(): void",
22526
+ description: ""
22527
+ },
22528
+ {
22529
+ name: "previousPage",
22530
+ kind: "method",
22531
+ signature: "abstract previousPage(): void",
22532
+ description: ""
22533
+ },
22534
+ {
22535
+ name: "lastPage",
22536
+ kind: "method",
22537
+ signature: "abstract lastPage(): void",
22538
+ description: ""
22539
+ },
22540
+ {
22541
+ name: "jumpToPage",
22542
+ kind: "method",
22543
+ signature: "abstract jumpToPage(page: number): void",
22544
+ description: ""
22545
+ },
22546
+ {
22547
+ name: "setPageSize",
22548
+ kind: "method",
22549
+ signature: "abstract setPageSize(size: number): void",
22550
+ description: ""
22551
+ }
22552
+ ],
22553
+ version: "11.5.0"
22554
+ },
22555
+ {
22556
+ id: "page-request",
22557
+ name: "PageRequest",
22558
+ kind: "interface",
22559
+ module: "datasource",
22560
+ importPath: "@uni-design-system/uni-angular",
22561
+ signature: "interface PageRequest",
22562
+ summary: "",
22563
+ description: "",
22564
+ members: [
22565
+ {
22566
+ name: "pageNumber",
22567
+ kind: "property",
22568
+ signature: "pageNumber: number",
22569
+ description: ""
22570
+ },
22571
+ {
22572
+ name: "pageSize",
22573
+ kind: "property",
22574
+ signature: "pageSize: number",
22575
+ description: ""
22576
+ },
22577
+ {
22578
+ name: "sortColumn",
22579
+ kind: "property",
22580
+ signature: "sortColumn?: string",
22581
+ description: ""
22582
+ },
22583
+ {
22584
+ name: "sortDirection",
22585
+ kind: "property",
22586
+ signature: "sortDirection?: SortDirection",
22587
+ description: ""
22588
+ },
22589
+ {
22590
+ name: "filter",
22591
+ kind: "property",
22592
+ signature: "filter?: Record<string, any>",
22593
+ description: ""
22594
+ }
22595
+ ],
22596
+ version: "11.5.0"
22597
+ },
22598
+ {
22599
+ id: "page-response",
22600
+ name: "PageResponse",
22601
+ kind: "interface",
22602
+ module: "datasource",
22603
+ importPath: "@uni-design-system/uni-angular",
22604
+ signature: "interface PageResponse<T>",
22605
+ summary: "",
22606
+ description: "",
22607
+ members: [
22608
+ {
22609
+ name: "data",
22610
+ kind: "property",
22611
+ signature: "data: T[]",
22612
+ description: ""
22613
+ },
22614
+ {
22615
+ name: "totalRecords",
22616
+ kind: "property",
22617
+ signature: "totalRecords: number",
22618
+ description: ""
22619
+ },
22620
+ {
22621
+ name: "pageNumber",
22622
+ kind: "property",
22623
+ signature: "pageNumber: number",
22624
+ description: ""
22625
+ },
22626
+ {
22627
+ name: "pageSize",
22628
+ kind: "property",
22629
+ signature: "pageSize: number",
22630
+ description: ""
22631
+ }
22632
+ ],
22633
+ version: "11.5.0"
22634
+ },
22635
+ {
22636
+ id: "data-loader",
22637
+ name: "DataLoader",
22638
+ kind: "type",
22639
+ module: "datasource",
22640
+ importPath: "@uni-design-system/uni-angular",
22641
+ signature: "type DataLoader<T> = (request: PageRequest) => Promise<PageResponse<T>>",
22642
+ summary: "",
22643
+ description: "",
22644
+ members: [],
22645
+ version: "11.5.0"
22646
+ },
22647
+ {
22648
+ id: "uni-server-side-datasource",
22649
+ name: "UniServerSideDatasource",
22650
+ kind: "class",
22651
+ module: "datasource",
22652
+ importPath: "@uni-design-system/uni-angular",
22653
+ signature: "class UniServerSideDatasource<T> extends UniBaseDatasource<T>",
22654
+ summary: "",
22655
+ description: "",
22656
+ members: [
22657
+ {
22658
+ name: "sortColumn",
22659
+ kind: "property",
22660
+ signature: "sortColumn = computed(() => this._sortColumn())",
22661
+ description: ""
22662
+ },
22663
+ {
22664
+ name: "sortDirection",
22665
+ kind: "property",
22666
+ signature: "sortDirection = computed(() => this._sortDirection())",
22667
+ description: ""
22668
+ },
22669
+ {
22670
+ name: "pageIndex",
22671
+ kind: "property",
22672
+ signature: "pageIndex = computed(() => this._pageNumber() - 1)",
22673
+ description: ""
22674
+ },
22675
+ {
22676
+ name: "pageSize",
22677
+ kind: "property",
22678
+ signature: "pageSize = computed(() => this._pageSize())",
22679
+ description: ""
22680
+ },
22681
+ {
22682
+ name: "pageCount",
22683
+ kind: "property",
22684
+ signature: "pageCount = computed(\u2026)",
22685
+ description: ""
22686
+ },
22687
+ {
22688
+ name: "records",
22689
+ kind: "property",
22690
+ signature: "records = this._records.asReadonly()",
22691
+ description: ""
22692
+ },
22693
+ {
22694
+ name: "recordCount",
22695
+ kind: "property",
22696
+ signature: "recordCount = computed(() => this.totalRecords())",
22697
+ description: ""
22698
+ },
22699
+ {
22700
+ name: "isLoading",
22701
+ kind: "property",
22702
+ signature: "isLoading = computed(() => this.dataResource.isLoading())",
22703
+ description: ""
22704
+ },
22705
+ {
22706
+ name: "error",
22707
+ kind: "property",
22708
+ signature: "error = computed(() => this.dataResource.error())",
22709
+ description: ""
22710
+ },
22711
+ {
22712
+ name: "hasError",
22713
+ kind: "property",
22714
+ signature: "hasError = computed(\u2026)",
22715
+ description: ""
22716
+ },
22717
+ {
22718
+ name: "sortRecords",
22719
+ kind: "method",
22720
+ signature: "sortRecords(sort: Sort<T>)",
22721
+ description: ""
22722
+ },
22723
+ {
22724
+ name: "firstPage",
22725
+ kind: "method",
22726
+ signature: "firstPage()",
22727
+ description: ""
22728
+ },
22729
+ {
22730
+ name: "nextPage",
22731
+ kind: "method",
22732
+ signature: "nextPage()",
22733
+ description: ""
22734
+ },
22735
+ {
22736
+ name: "previousPage",
22737
+ kind: "method",
22738
+ signature: "previousPage()",
22739
+ description: ""
22740
+ },
22741
+ {
22742
+ name: "lastPage",
22743
+ kind: "method",
22744
+ signature: "lastPage()",
22745
+ description: ""
22746
+ },
22747
+ {
22748
+ name: "jumpToPage",
22749
+ kind: "method",
22750
+ signature: "jumpToPage(page: number)",
22751
+ description: ""
22752
+ },
22753
+ {
22754
+ name: "setPageSize",
22755
+ kind: "method",
22756
+ signature: "setPageSize(size: number)",
22757
+ description: ""
22758
+ },
22759
+ {
22760
+ name: "setFilter",
22761
+ kind: "method",
22762
+ signature: "setFilter(filterValues: Record<string, any>)",
22763
+ description: ""
22764
+ },
22765
+ {
22766
+ name: "clearFilter",
22767
+ kind: "method",
22768
+ signature: "clearFilter()",
22769
+ description: ""
22770
+ },
22771
+ {
22772
+ name: "refresh",
22773
+ kind: "method",
22774
+ signature: "refresh()",
22775
+ description: ""
22776
+ },
22777
+ {
22778
+ name: "getPageRequest",
22779
+ kind: "method",
22780
+ signature: "getPageRequest(): PageRequest",
22781
+ description: ""
22782
+ }
22783
+ ],
22784
+ version: "11.5.0"
22785
+ },
22786
+ {
22787
+ id: "uni-datasource",
22788
+ name: "UniDatasource",
22789
+ kind: "type",
22790
+ module: "datasource",
22791
+ importPath: "@uni-design-system/uni-angular",
22792
+ signature: "type UniDatasource<T> = UniBaseDatasource<T>",
22793
+ summary: "",
22794
+ description: "",
22795
+ members: [],
22796
+ version: "11.5.0"
22797
+ },
22798
+ {
22799
+ id: "uni-record-datasource",
22800
+ name: "UniRecordDatasource",
22801
+ kind: "class",
22802
+ module: "datasource",
22803
+ importPath: "@uni-design-system/uni-angular",
22804
+ signature: "class UniRecordDatasource<T> extends UniBaseDatasource<T>",
22805
+ summary: "",
22806
+ description: "",
22807
+ members: [
22808
+ {
22809
+ name: "initialRecords",
22810
+ kind: "property",
22811
+ signature: "initialRecords = signal<T[]>([])",
22812
+ description: ""
22813
+ },
22814
+ {
22815
+ name: "recordCount",
22816
+ kind: "property",
22817
+ signature: "recordCount = computed((): number => this.initialRecords().filter(this.filter()).length)",
22818
+ description: ""
22819
+ },
22820
+ {
22821
+ name: "filter",
22822
+ kind: "property",
22823
+ signature: "filter = signal<(value: T) => boolean>((value) => true)",
22824
+ description: ""
22825
+ },
22826
+ {
22827
+ name: "pageIndex",
22828
+ kind: "property",
22829
+ signature: "pageIndex = signal<number>(0)",
22830
+ description: ""
22831
+ },
22832
+ {
22833
+ name: "pageSize",
22834
+ kind: "property",
22835
+ signature: "pageSize = computed(() => this._pageSize())",
22836
+ description: ""
22837
+ },
22838
+ {
22839
+ name: "pageCount",
22840
+ kind: "property",
22841
+ signature: "pageCount = computed(\u2026)",
22842
+ description: ""
22843
+ },
22844
+ {
22845
+ name: "records",
22846
+ kind: "property",
22847
+ signature: "records = computed(\u2026)",
22848
+ description: ""
22849
+ },
22850
+ {
22851
+ name: "sortRecords",
22852
+ kind: "method",
22853
+ signature: "sortRecords(sort: Sort<T>)",
22854
+ description: ""
22855
+ },
22856
+ {
22857
+ name: "firstPage",
22858
+ kind: "method",
22859
+ signature: "firstPage()",
22860
+ description: ""
22861
+ },
22862
+ {
22863
+ name: "nextPage",
22864
+ kind: "method",
22865
+ signature: "nextPage()",
22866
+ description: ""
22867
+ },
22868
+ {
22869
+ name: "previousPage",
22870
+ kind: "method",
22871
+ signature: "previousPage()",
22872
+ description: ""
22873
+ },
22874
+ {
22875
+ name: "lastPage",
22876
+ kind: "method",
22877
+ signature: "lastPage()",
22878
+ description: ""
22879
+ },
22880
+ {
22881
+ name: "jumpToPage",
22882
+ kind: "method",
22883
+ signature: "jumpToPage(page: number)",
22884
+ description: ""
22885
+ },
22886
+ {
22887
+ name: "setPageSize",
22888
+ kind: "method",
22889
+ signature: "setPageSize(size: number)",
22890
+ description: ""
22891
+ },
22892
+ {
22893
+ name: "setFilter",
22894
+ kind: "method",
22895
+ signature: "setFilter(filter: (value: T) => boolean)",
22896
+ description: ""
22897
+ },
22898
+ {
22899
+ name: "clearFilter",
22900
+ kind: "method",
22901
+ signature: "clearFilter()",
22902
+ description: ""
22903
+ }
22904
+ ],
22905
+ version: "11.5.0"
22906
+ },
22907
+ {
22908
+ id: "local-storage-service",
22909
+ name: "LocalStorageService",
22910
+ kind: "service",
22911
+ module: "local-storage",
22912
+ importPath: "@uni-design-system/uni-angular",
22913
+ signature: "class LocalStorageService",
22914
+ summary: "",
22915
+ description: "",
22916
+ members: [
22917
+ {
22918
+ name: "setItem",
22919
+ kind: "method",
22920
+ signature: "setItem<T>(key: string, value: T): boolean",
22921
+ description: ""
22922
+ },
22923
+ {
22924
+ name: "getItem",
22925
+ kind: "method",
22926
+ signature: "getItem<T>(key: string): T | null",
22927
+ description: ""
22928
+ },
22929
+ {
22930
+ name: "removeItem",
22931
+ kind: "method",
22932
+ signature: "removeItem(key: string): boolean",
22933
+ description: ""
22934
+ },
22935
+ {
22936
+ name: "clear",
22937
+ kind: "method",
22938
+ signature: "clear(): boolean",
22939
+ description: ""
22940
+ },
22941
+ {
22942
+ name: "hasKey",
22943
+ kind: "method",
22944
+ signature: "hasKey(key: string): boolean",
22945
+ description: ""
22946
+ },
22947
+ {
22948
+ name: "getAllKeys",
22949
+ kind: "method",
22950
+ signature: "getAllKeys(): string[]",
22951
+ description: ""
22952
+ },
22953
+ {
22954
+ name: "getSize",
22955
+ kind: "method",
22956
+ signature: "getSize(): number",
22957
+ description: ""
22958
+ }
22959
+ ],
22960
+ version: "11.5.0"
22961
+ },
22962
+ {
22963
+ id: "alert",
22964
+ name: "Alert",
22965
+ kind: "interface",
22966
+ module: "notification",
22967
+ importPath: "@uni-design-system/uni-angular",
22968
+ signature: "interface Alert",
22969
+ summary: "",
22970
+ description: "",
22971
+ members: [
22972
+ {
22973
+ name: "message",
22974
+ kind: "property",
22975
+ signature: "message: string",
22976
+ description: ""
22977
+ },
22978
+ {
22979
+ name: "iconName",
22980
+ kind: "property",
22981
+ signature: "iconName?: IconName",
22982
+ description: ""
22983
+ },
22984
+ {
22985
+ name: "symbolName",
22986
+ kind: "property",
22987
+ signature: "symbolName?: string",
22988
+ description: ""
22989
+ },
22990
+ {
22991
+ name: "variant",
22992
+ kind: "property",
22993
+ signature: "variant?: Variant",
22994
+ description: ""
22995
+ },
22996
+ {
22997
+ name: "action",
22998
+ kind: "property",
22999
+ signature: "action?: () => void",
23000
+ description: ""
23001
+ },
23002
+ {
23003
+ name: "actionLabel",
23004
+ kind: "property",
23005
+ signature: "actionLabel?: string",
23006
+ description: ""
23007
+ },
23008
+ {
23009
+ name: "topPosition",
23010
+ kind: "property",
23011
+ signature: "topPosition?: number",
23012
+ description: ""
23013
+ }
23014
+ ],
23015
+ version: "11.5.0"
23016
+ },
23017
+ {
23018
+ id: "snackbar",
23019
+ name: "Snackbar",
23020
+ kind: "interface",
23021
+ module: "notification",
23022
+ importPath: "@uni-design-system/uni-angular",
23023
+ signature: "interface Snackbar",
23024
+ summary: "",
23025
+ description: "",
23026
+ members: [
23027
+ {
23028
+ name: "message",
23029
+ kind: "property",
23030
+ signature: "message: string",
23031
+ description: ""
23032
+ },
23033
+ {
23034
+ name: "action",
23035
+ kind: "property",
23036
+ signature: "action?: () => void",
23037
+ description: ""
23038
+ },
23039
+ {
23040
+ name: "actionLabel",
23041
+ kind: "property",
23042
+ signature: "actionLabel?: string",
23043
+ description: ""
23044
+ },
23045
+ {
23046
+ name: "iconName",
23047
+ kind: "property",
23048
+ signature: "iconName?: IconName",
23049
+ description: ""
23050
+ },
23051
+ {
23052
+ name: "symbolName",
23053
+ kind: "property",
23054
+ signature: "symbolName?: string",
23055
+ description: ""
23056
+ },
23057
+ {
23058
+ name: "variant",
23059
+ kind: "property",
23060
+ signature: "variant?: Variant",
23061
+ description: ""
23062
+ },
23063
+ {
23064
+ name: "timeout",
23065
+ kind: "property",
23066
+ signature: "timeout?: number | string | 'disabled'",
23067
+ description: ""
23068
+ }
23069
+ ],
23070
+ version: "11.5.0"
23071
+ },
23072
+ {
23073
+ id: "confirmation",
23074
+ name: "Confirmation",
23075
+ kind: "interface",
23076
+ module: "notification",
23077
+ importPath: "@uni-design-system/uni-angular",
23078
+ signature: "interface Confirmation",
23079
+ summary: "",
23080
+ description: "",
23081
+ members: [
23082
+ {
23083
+ name: "title",
23084
+ kind: "property",
23085
+ signature: "title: string",
23086
+ description: ""
23087
+ },
23088
+ {
23089
+ name: "message",
23090
+ kind: "property",
23091
+ signature: "message: string",
23092
+ description: ""
23093
+ },
23094
+ {
23095
+ name: "action",
23096
+ kind: "property",
23097
+ signature: "action: () => void",
23098
+ description: ""
23099
+ },
23100
+ {
23101
+ name: "actionLabel",
23102
+ kind: "property",
23103
+ signature: "actionLabel?: string",
23104
+ description: ""
23105
+ },
23106
+ {
23107
+ name: "dismissLabel",
23108
+ kind: "property",
23109
+ signature: "dismissLabel?: string",
23110
+ description: ""
23111
+ },
23112
+ {
23113
+ name: "color",
23114
+ kind: "property",
23115
+ signature: "color?: ContainerColorToken",
23116
+ description: ""
23117
+ }
23118
+ ],
23119
+ version: "11.5.0"
23120
+ },
23121
+ {
23122
+ id: "notification-service",
23123
+ name: "NotificationService",
23124
+ kind: "service",
23125
+ module: "notification",
23126
+ importPath: "@uni-design-system/uni-angular",
23127
+ signature: "class NotificationService",
23128
+ summary: "",
23129
+ description: "",
23130
+ members: [
23131
+ {
23132
+ name: "alert",
23133
+ kind: "property",
23134
+ signature: "alert = signal<Alert | undefined>(undefined)",
23135
+ description: ""
23136
+ },
23137
+ {
23138
+ name: "showAlert",
23139
+ kind: "method",
23140
+ signature: "showAlert(alert: Alert)",
23141
+ description: ""
23142
+ },
23143
+ {
23144
+ name: "hideAlert",
23145
+ kind: "method",
23146
+ signature: "hideAlert()",
23147
+ description: ""
23148
+ },
23149
+ {
23150
+ name: "snackbar",
23151
+ kind: "property",
23152
+ signature: "snackbar = signal<Snackbar | undefined>(undefined)",
23153
+ description: ""
23154
+ },
23155
+ {
23156
+ name: "showSnackbar",
23157
+ kind: "method",
23158
+ signature: "showSnackbar(snackbar: Snackbar)",
23159
+ description: ""
23160
+ },
23161
+ {
23162
+ name: "hideSnackbar",
23163
+ kind: "method",
23164
+ signature: "hideSnackbar()",
23165
+ description: ""
23166
+ },
23167
+ {
23168
+ name: "confirmation",
23169
+ kind: "property",
23170
+ signature: "confirmation = signal<Confirmation | undefined>(undefined)",
23171
+ description: ""
23172
+ },
23173
+ {
23174
+ name: "showConfirmation",
23175
+ kind: "method",
23176
+ signature: "showConfirmation(confirmation: Confirmation)",
23177
+ description: ""
23178
+ },
23179
+ {
23180
+ name: "hideConfirmation",
23181
+ kind: "method",
23182
+ signature: "hideConfirmation()",
23183
+ description: ""
23184
+ }
23185
+ ],
23186
+ version: "11.5.0"
23187
+ },
23188
+ {
23189
+ id: "option",
23190
+ name: "Option",
23191
+ kind: "interface",
23192
+ module: "option",
23193
+ importPath: "@uni-design-system/uni-angular",
23194
+ signature: "interface Option<T = unknown>",
23195
+ summary: "",
23196
+ description: "",
23197
+ members: [
23198
+ {
23199
+ name: "label",
23200
+ kind: "property",
23201
+ signature: "label: string",
23202
+ description: ""
23203
+ },
23204
+ {
23205
+ name: "value",
23206
+ kind: "property",
23207
+ signature: "value: T",
23208
+ description: ""
23209
+ },
23210
+ {
23211
+ name: "description",
23212
+ kind: "property",
23213
+ signature: "description?: string",
23214
+ description: "Secondary line, e.g. an email under a name. Read as part of the option's name."
23215
+ },
23216
+ {
23217
+ name: "disabled",
23218
+ kind: "property",
23219
+ signature: "disabled?: boolean",
23220
+ description: "Visible and announced, but not committable; listbox navigation skips it."
23221
+ }
23222
+ ],
23223
+ version: "11.5.0"
23224
+ },
23225
+ {
23226
+ id: "options",
23227
+ name: "Options",
23228
+ kind: "type",
23229
+ module: "option",
23230
+ importPath: "@uni-design-system/uni-angular",
23231
+ signature: "type Options<T = unknown> = Option<T>[]",
23232
+ summary: "",
23233
+ description: "",
23234
+ members: [],
23235
+ version: "11.5.0"
23236
+ },
23237
+ {
23238
+ id: "use-timer",
23239
+ name: "useTimer",
23240
+ kind: "function",
23241
+ module: "timer",
23242
+ importPath: "@uni-design-system/uni-angular",
23243
+ signature: "function useTimer()",
23244
+ summary: "",
23245
+ description: "",
23246
+ members: [],
23247
+ version: "11.5.0"
23248
+ },
23249
+ {
23250
+ id: "acceptable-file",
23251
+ name: "acceptableFile",
23252
+ kind: "function",
23253
+ module: "file",
23254
+ importPath: "@uni-design-system/uni-angular",
23255
+ signature: "function acceptableFile(file: File, acceptedFileExtensions: string[] | undefined): boolean",
23256
+ summary: "",
23257
+ description: "",
23258
+ members: [],
23259
+ version: "11.5.0"
23260
+ },
23261
+ {
23262
+ id: "get-file-extension",
23263
+ name: "getFileExtension",
23264
+ kind: "function",
23265
+ module: "file",
23266
+ importPath: "@uni-design-system/uni-angular",
23267
+ signature: "function getFileExtension(file: File): string",
23268
+ summary: "",
23269
+ description: "",
23270
+ members: [],
23271
+ version: "11.5.0"
23272
+ },
23273
+ {
23274
+ id: "query-permission",
23275
+ name: "queryPermission",
23276
+ kind: "function",
23277
+ module: "permission",
23278
+ importPath: "@uni-design-system/uni-angular",
23279
+ signature: "async function queryPermission(permission: Permission): Promise<PermissionState>",
23280
+ summary: "The current state of a browser permission.",
23281
+ 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
+ members: [],
23283
+ version: "11.5.0"
23284
+ },
23285
+ {
23286
+ id: "permission-service",
23287
+ name: "PermissionService",
23288
+ kind: "service",
23289
+ module: "permission",
23290
+ importPath: "@uni-design-system/uni-angular",
23291
+ signature: "class PermissionService",
23292
+ summary: "",
23293
+ description: "",
23294
+ members: [
23295
+ {
23296
+ name: "getPermissionState",
23297
+ kind: "method",
23298
+ signature: "getPermissionState(permission: Permission): Promise<PermissionState>",
23299
+ description: ""
23300
+ },
23301
+ {
23302
+ name: "isAllowed",
23303
+ kind: "method",
23304
+ signature: "async isAllowed(permission: Permission)",
23305
+ description: ""
23306
+ }
23307
+ ],
23308
+ version: "11.5.0"
23309
+ },
23310
+ {
23311
+ id: "permission",
23312
+ name: "Permission",
23313
+ kind: "type",
23314
+ module: "permission",
23315
+ importPath: "@uni-design-system/uni-angular",
23316
+ signature: "type Permission = 'accelerometer' | 'ambient-light-sensor' | 'background-fetch' | 'background-sync' | 'bluetooth' | 'camera' | 'clipboard-read' | 'clipboard-write' | 'compute-pressure' | 'device-info' | 'display-capture' | 'geolocation' | 'gyroscope' | 'local-fonts' | 'magnetometer' | 'microphone' | 'midi' | 'nfc' | 'notifications' | 'payment-handler' | 'persistent-storage' | 'push' | 'screen-wake-lock' | 'speaker' | 'storage-access' | 'top-level-storage-access' | 'window-management'",
23317
+ summary: "",
23318
+ description: "",
23319
+ members: [],
23320
+ version: "11.5.0"
23321
+ },
23322
+ {
23323
+ id: "permission-state",
23324
+ name: "PermissionState",
23325
+ kind: "type",
23326
+ module: "permission",
23327
+ importPath: "@uni-design-system/uni-angular",
23328
+ signature: "type PermissionState = 'granted' | 'prompt' | 'denied' | 'unsupported'",
23329
+ summary: "",
23330
+ description: "",
23331
+ members: [],
23332
+ version: "11.5.0"
23333
+ },
23334
+ {
23335
+ id: "clipboard-copy-result",
23336
+ name: "ClipboardCopyResult",
23337
+ kind: "type",
23338
+ module: "clipboard",
23339
+ importPath: "@uni-design-system/uni-angular",
23340
+ signature: "type ClipboardCopyResult = 'copied' | 'denied' | 'unsupported' | 'failed'",
23341
+ summary: "How a copy ended: - `copied` \u2014 the content is on the clipboard.",
23342
+ 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
+ members: [],
23344
+ version: "11.5.0"
23345
+ },
23346
+ {
23347
+ id: "clipboard-data",
23348
+ name: "ClipboardData",
23349
+ kind: "type",
23350
+ module: "clipboard",
23351
+ importPath: "@uni-design-system/uni-angular",
23352
+ signature: "type ClipboardData = string | Blob | PromiseLike<string | Blob>",
23353
+ summary: "One clipboard representation; a promise lets the data arrive after the gesture.",
23354
+ description: "One clipboard representation; a promise lets the data arrive after the gesture.",
23355
+ members: [],
23356
+ version: "11.5.0"
23357
+ },
23358
+ {
23359
+ id: "clipboard-content",
23360
+ name: "ClipboardContent",
23361
+ kind: "type",
23362
+ module: "clipboard",
23363
+ importPath: "@uni-design-system/uni-angular",
23364
+ signature: "type ClipboardContent = string | Record<string, ClipboardData>",
23365
+ 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
+ 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
+ members: [],
23368
+ version: "11.5.0"
23369
+ },
23370
+ {
23371
+ id: "copy-to-clipboard",
23372
+ name: "copyToClipboard",
23373
+ kind: "function",
23374
+ module: "clipboard",
23375
+ importPath: "@uni-design-system/uni-angular",
23376
+ signature: "async function copyToClipboard(content: ClipboardContent): Promise<ClipboardCopyResult>",
23377
+ summary: "Copies text or rich content with the Async Clipboard API.",
23378
+ 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
+ members: [],
23380
+ version: "11.5.0"
23381
+ }
23382
+ ],
23383
+ utilityDocs: [
23384
+ {
23385
+ module: "datasource",
23386
+ title: "Datasource",
23387
+ markdown: "# Datasource\n\nThe Datasource system provides a flexible and reactive way to manage data collections in Angular applications. It supports both client-side and server-side data operations with a unified API.\n\n## Architecture\n\nThe datasource system consists of three main classes:\n\n- **`UniBaseDatasource<T>`**: Abstract base class defining the common interface\n- **`UniRecordDatasource<T>`**: Client-side datasource for in-memory data operations\n- **`UniServerSideDatasource<T>`**: Server-side datasource using Angular's resource signal\n\n## Features\n\n- **Reactive State Management**: Built with Angular signals for efficient reactivity\n- **Unified API**: Both client-side and server-side datasources implement the same interface\n- **Sorting**: Sort data by any column in ascending or descending order\n- **Filtering**: Apply filters with appropriate handling for client vs server-side\n- **Pagination**: Navigate through data with built-in pagination controls\n- **Selection**: Track and manage selected items\n- **Loading States**: Server-side datasource provides loading and error states\n\n## Client-Side Datasource\n\nFor in-memory data operations, use `UniRecordDatasource`:\n\n```typescript\nimport { UniRecordDatasource } from '@uni-design-system/uni-angular';\n\ninterface User {\n id: number;\n name: string;\n email: string;\n age: number;\n}\n\n@Component({...})\nclass ClientSideComponent {\n // Static data for client-side operations\n users: User[] = [\n { id: 1, name: 'John Doe', email: 'john@example.com', age: 30 },\n { id: 2, name: 'Jane Smith', email: 'jane@example.com', age: 25 },\n // more users...\n ];\n\n datasource = new UniRecordDatasource<User>(this.users);\n\n constructor() {\n // Set page size for pagination\n this.datasource.setPageSize(10);\n\n // Apply a filter function (client-side filtering)\n this.datasource.setFilter(user => user.age > 18);\n\n // Sort by a column\n this.datasource.sortRecords({\n column: 'name',\n direction: 'asc'\n });\n }\n\n // Handle row selection\n onRowClick(user: User) {\n this.datasource.toggleSelection(user);\n }\n\n // Navigate to next page\n nextPage() {\n this.datasource.nextPage();\n }\n}\n```\n\n## Server-Side Datasource\n\nFor server-side operations with automatic loading states, use `UniServerSideDatasource`:\n\n```typescript\nimport { UniServerSideDatasource, PageRequest, PageResponse } from '@uni-design-system/uni-angular';\n\n@Component({...})\nclass ServerSideComponent {\n datasource = new UniServerSideDatasource<User>(\n // Data loader function\n async (request: PageRequest): Promise<PageResponse<User>> => {\n const response = await this.userService.getUsers({\n page: request.pageNumber,\n size: request.pageSize,\n sort: request.sortColumn,\n order: request.sortDirection,\n filter: request.filter\n });\n\n return {\n data: response.users,\n totalRecords: response.total,\n pageNumber: request.pageNumber,\n pageSize: request.pageSize\n };\n },\n 10 // initial page size\n );\n\n constructor() {\n // Apply server-side filter (sends filter object to server)\n this.datasource.setFilter({ department: 'Engineering', active: true });\n\n // Sort by a column (triggers server request)\n this.datasource.sortRecords({\n column: 'name',\n direction: 'asc'\n });\n }\n\n // Access loading and error states\n get isLoading() {\n return this.datasource.isLoading();\n }\n\n get hasError() {\n return this.datasource.hasError();\n }\n\n // Refresh data from server\n refreshData() {\n this.datasource.refresh();\n }\n}\n```\n\n## API Reference\n\n### Common Properties (Both Datasources)\n\n- `records`: Signal containing the current page's filtered and sorted records\n- `recordCount`: Signal with the count of filtered records\n- `selections`: Signal containing currently selected items\n- `sort`: Signal containing the current sort configuration\n- `sortColumn`: Computed signal with the current sort column\n- `sortDirection`: Computed signal with the current sort direction\n- `pageIndex`: Signal with the current page index (zero-based)\n- `pageSize`: Signal with the number of items per page\n- `pageCount`: Signal with the total number of pages\n- `pages`: Signal with array of page numbers for pagination UI\n- `truncatedPages`: Signal with truncated page numbers (includes ellipsis)\n- `disablePrevious`: Signal indicating if previous button should be disabled\n- `disableNext`: Signal indicating if next button should be disabled\n\n### Common Methods (Both Datasources)\n\n- `isSelected(row)`: Checks if a row is selected\n- `toggleSelection(row)`: Toggles selection state of a row\n- `clearSelections()`: Clears all selections\n- `selectAll()`: Selects all records on current page\n- `sortRecords(sort)`: Sets the sort configuration\n- `firstPage()`, `nextPage()`, `previousPage()`, `lastPage()`: Navigation methods\n- `jumpToPage(page)`: Jumps to a specific page\n- `setPageSize(size)`: Sets the page size and resets to first page\n\n### Record Datasource Specific\n\n**Properties:**\n\n- `initialRecords`: Signal containing the original unfiltered data\n- `filter`: Signal containing the current filter function\n\n**Methods:**\n\n- `setFilter(predicate: (item: T) => boolean)`: Sets a filter function for client-side filtering\n- `clearFilter()`: Clears the current filter (shows all records)\n\n### Server-Side Datasource Specific\n\n**Properties:**\n\n- `isLoading`: Signal indicating if data is currently being loaded\n- `error`: Signal containing any loading errors\n- `hasError`: Signal indicating if there's an error state\n\n**Methods:**\n\n- `setFilter(filterObj: Record<string, any>)`: Sets filter parameters sent to server\n- `clearFilter()`: Clears all filter parameters\n- `refresh()`: Manually triggers a data reload from server\n- `getPageRequest()`: Returns the current page request parameters\n\n### Types\n\n```typescript\ninterface PageRequest {\n pageNumber: number;\n pageSize: number;\n sortColumn?: string;\n sortDirection?: SortDirection;\n filter?: Record<string, any>;\n}\n\ninterface PageResponse<T> {\n data: T[];\n totalRecords: number;\n pageNumber: number;\n pageSize: number;\n}\n\ntype DataLoader<T> = (request: PageRequest) => Promise<PageResponse<T>>;\n\ntype SortDirection = 'asc' | 'desc' | 'indet';\n\ninterface Sort<T> {\n column?: keyof T;\n direction: SortDirection;\n}\n```\n\n## Examples\n\n_Live demo on the Storybook page._"
23388
+ },
23389
+ {
23390
+ module: "local-storage",
23391
+ title: "LocalStorage",
23392
+ markdown: "# LocalStorage\n\nThe LocalStorage Service provides a safe, type-safe wrapper around the browser's localStorage API with enhanced error handling and utility methods. It includes availability checking to ensure localStorage is accessible in the current environment and provides methods for storage operations.\n\n## Key Features\n\n- **Availability Checking**: Automatically detects if localStorage is available before operations\n- **Type Safety**: Generic methods support typed data storage and retrieval\n- **Error Handling**: Try-catch blocks with console logging for debugging\n- **JSON Support**: Automatic JSON serialization/deserialization for objects\n- **Utility Methods**: Additional methods for key management, storage size calculation, and existence checking\n\n## Example Implementation\n\n```typescript\nimport { LocalStorageService } from '@uni-design-system/uni-angular';\n\n@Component({...})\nclass MyComponent {\n\n constructor(private localStorage: LocalStorageService) {}\n\n // Store different data types\n saveUserPreferences() {\n const preferences = { theme: 'dark', language: 'en' };\n const success = this.localStorage.setItem('user-prefs', preferences);\n console.log('Save successful:', success);\n }\n\n // Retrieve with type safety\n getUserPreferences() {\n const prefs = this.localStorage.getItem<{theme: string, language: string}>('user-prefs');\n return prefs || { theme: 'light', language: 'en' }; // fallback if null\n }\n\n // Check if data exists\n hasUserData() {\n return this.localStorage.hasKey('user-prefs');\n }\n\n // Clean up storage\n clearUserData() {\n this.localStorage.removeItem('user-prefs');\n }\n}\n```\n\n## API Methods\n\n### Core Operations\n\n- `setItem<T>(key: string, value: T): boolean` - Store any data type with JSON serialization\n- `getItem<T>(key: string): T | null` - Retrieve data with automatic type casting\n- `removeItem(key: string): boolean` - Remove a specific item\n- `clear(): boolean` - Clear all localStorage data\n\n### Utility Methods\n\n- `hasKey(key: string): boolean` - Check if a key exists in storage\n- `getAllKeys(): string[]` - Get array of all storage keys\n- `getSize(): number` - Calculate total storage size in characters\n\nAll methods return boolean success indicators for operations and handle localStorage unavailability gracefully.\n\n## Examples\n\n_Live demo on the Storybook page._"
23393
+ },
23394
+ {
23395
+ module: "notification",
23396
+ title: "Notifications",
23397
+ markdown: "# Notifications\n\nThe Notification service is designed to be used alongside a single instance of\nthe `<uni-notifications>` component, which renders whatever the service emits.\nPlace one near the root of your layout, then call the service's methods from\nanywhere to present the notifications below.\n\n## Example Implementations\n\n### Alert\n\n_Live demo on the Storybook page._\n\n_Note: The [alert component](?path=/docs/components-feedback-alert--alert) can be implemented independently._\n\n```\nimport { NotificationService, Alert } from '@uni-design-system/uni-angular';\n\n@Component({...})\nclass MyComponent {\n constructor(notifications: NotificationService) {}\n\n const alert: Alert = {\n\n }\n\n showAlert = () => this.notifications.showAlert(alert);\n\n}\n```\n\n### Snackbar\n\n_Live demo on the Storybook page._\n\n```\nimport { NotificationService, Snackbar } from '@uni-design-system/uni-angular';\n\n@Component({...})\nclass MyComponent {\n constructor(notifications: NotificationService) {}\n\n const snackbar: Snackbar = {\n message: 'The record has been deleted.',\n action?: () => undoDelete();\n actionLabel: 'Undo';\n symbolName: 'delete';\n variant: 'warn';\n }\n\n showDeleteSnackbar = () => this.notifications.showSnackbar(snackbar);\n\n}\n```\n\n### Confirmation\n\n_Live demo on the Storybook page._\n\n```\nimport { NotificationService, Confirmation } from '@uni-design-system/uni-angular';\n\n@Component({...})\nclass MyComponent {\n constructor(notifications: NotificationService) {}\n\n const confirmation: Confirmation = {\n title: 'Delete Record',\n message: 'Are you sure you want to delete this record?',\n action: () => deleteRecord(),\n actionLabel: 'Yes',\n dismissLabel: 'No',\n color: 'warn'\n }\n\n confirmDelete = () => this.notifications.showConfirmation(confirmation);\n\n}\n```"
23398
+ },
23399
+ {
23400
+ module: "timer",
23401
+ title: "Timer",
23402
+ markdown: "# Timer\n\nThe Timer utility provides a reusable, reactive timer service with start, pause, resume, and stop functionality. It's built using Angular signals for reactive state management and automatically handles cleanup through Angular's DestroyRef to prevent memory leaks.\n\n## Key Features\n\n- **Reactive State**: Uses Angular signals for real-time timer updates\n- **Full Control**: Start, pause, resume, and stop operations\n- **Automatic Cleanup**: Automatically clears intervals on component destruction\n- **Completion Callbacks**: Execute custom functions when timer completes\n- **Multiple Time Units**: Access both milliseconds and seconds remaining\n- **Status Tracking**: Monitor active and paused states\n\n## Example Implementation\n\n```typescript\nimport { Component } from '@angular/core';\nimport { useTimer } from '@uni-design-system/uni-angular';\n\n@Component({\n selector: 'app-countdown',\n template: `\n <div>\n <h3>Countdown: {{ timer.secondsRemaining() }}s</h3>\n <p>Status: {{ timer.isActive() ? 'Running' : 'Stopped' }}</p>\n <p>Paused: {{ timer.isPaused() ? 'Yes' : 'No' }}</p>\n\n <button (click)=\"startTimer()\">Start 30s Timer</button>\n <button (click)=\"pauseTimer()\">Pause</button>\n <button (click)=\"resumeTimer()\">Resume</button>\n <button (click)=\"stopTimer()\">Stop</button>\n </div>\n `,\n standalone: true,\n})\nexport class CountdownComponent {\n timer = useTimer();\n\n startTimer() {\n this.timer.start(30000, () => {\n console.log('Timer completed!');\n // Handle completion logic here\n });\n }\n\n pauseTimer() {\n this.timer.pause();\n }\n\n resumeTimer() {\n this.timer.resume();\n }\n\n stopTimer() {\n this.timer.stop();\n }\n}\n```\n\n## Auto-close Feature Example\n\nPerfect for notifications, modals, or temporary UI elements:\n\n```typescript\n@Component({\n selector: 'app-auto-close-notification',\n template: `\n <div *ngIf=\"isVisible\" class=\"notification\">\n <p>This notification will close in {{ timer.secondsRemaining() }}s</p>\n <button (click)=\"dismissNow()\">Dismiss Now</button>\n </div>\n `,\n standalone: true,\n})\nexport class AutoCloseNotificationComponent {\n timer = useTimer();\n isVisible = true;\n\n ngOnInit() {\n // Auto-close after 5 seconds\n this.timer.start(5000, () => {\n this.isVisible = false;\n });\n }\n\n dismissNow() {\n this.timer.stop();\n this.isVisible = false;\n }\n}\n```\n\n## Session Timeout Example\n\nUseful for authentication timeouts or activity tracking:\n\n```typescript\n@Component({...})\nexport class SessionManagerComponent {\n sessionTimer = useTimer();\n warningTimer = useTimer();\n\n private readonly SESSION_DURATION = 30 * 60 * 1000; // 30 minutes\n private readonly WARNING_DURATION = 5 * 60 * 1000; // 5 minutes\n\n startSession() {\n // Start main session timer\n this.sessionTimer.start(this.SESSION_DURATION, () => {\n this.handleSessionExpired();\n });\n\n // Start warning timer (triggers 5 min before session expires)\n this.warningTimer.start(this.SESSION_DURATION - this.WARNING_DURATION, () => {\n this.showSessionWarning();\n });\n }\n\n extendSession() {\n // User activity detected - restart timers\n this.sessionTimer.stop();\n this.warningTimer.stop();\n this.startSession();\n }\n\n private showSessionWarning() {\n console.log(`Session expires in ${this.sessionTimer.secondsRemaining()}s`);\n }\n\n private handleSessionExpired() {\n // Log out user or redirect to login\n this.logoutUser();\n }\n}\n```\n\n## API Reference\n\n### Core Methods\n\n- `start(durationMs: number, onComplete?: () => void): void` - Start timer with duration in milliseconds and optional completion callback\n- `pause(): void` - Pause the active timer (no-op if not active or already paused)\n- `resume(): void` - Resume paused timer (no-op if not paused)\n- `stop(): void` - Stop timer and reset remaining time to 0\n\n### Reactive Properties\n\n- `msRemaining: Signal<number>` - Milliseconds remaining (updates every 100ms)\n- `secondsRemaining: Signal<number>` - Seconds remaining (rounded up)\n- `isPaused: Signal<boolean>` - Whether timer is currently paused\n- `isActive: Signal<boolean>` - Whether timer has time remaining (computed from msRemaining > 0)\n\n### Behavior Notes\n\n- Timer updates every 100ms for smooth UI updates\n- `pause()` and `resume()` are safe to call - they check state before executing\n- `start()` automatically stops any existing timer before starting new one\n- Completion callback is optional and executes when timer reaches 0\n- Component destruction automatically cleans up active timers\n\n## Interactive Example\n\n_Live demo on the Storybook page._"
23403
+ },
23404
+ {
23405
+ module: "permission",
23406
+ title: "Permissions API",
23407
+ markdown: "# Permissions API\n\nThe Permissions API service is used to check if a specific feature or API is available for interaction within your code.\nFor instance, `copyToClipboard` checks `clipboard-write` after a refused copy to tell a blocked permission apart from any other failure.\nMany permissions cannot be queried in every browser (Firefox and Safari do not answer `clipboard-write`), and those report `unsupported`: treat that as \"can't tell\" rather than \"no\".\nIf the permission is in a `prompt` state, the API is available and the user will be prompted to approve the first execution of the associated method.\nIf a permission is not allowed or unsupported, this condition can be used to hide any associated functionality in your UI.\n\n## Example Implementation\n\n```\nimport { PermissionService } from '@uni-design-system/uni-angular';\n\n@Component({...})\nclass MyComponent {\n\n allowWriteToClipboard = false;\n\n constructor(private permissionService: PermissionService) {\n permissionService\n .isAllowed('clipboard-write')\n .then((allowed) => (this.allowWriteToClipboard = allowed));\n }\n\n}\n\n```\n\n## Permission manifest\n\nEvery permission name this service knows, with its current state on this device:\n\n_Live demo on the Storybook page._\n\n## Resources\n\n- [Permissions API](https://developer.mozilla.org/en-US/docs/Web/API/Permissions_API)"
23408
+ },
23409
+ {
23410
+ module: "clipboard",
23411
+ title: "Clipboard",
23412
+ markdown: "# Clipboard\n\n`copyToClipboard` copies text or rich content with the Async Clipboard API. It never\nrejects: it resolves with what happened, so you can tell the user why a copy did not work\ninstead of wrapping every call in a `try`/`catch`.\n\n`import { copyToClipboard } from '@uni-design-system/uni-angular';`\n\n_Live demo on the Storybook page._\n\n## Copying text\n\n```typescript\nprotected async copyLink(): Promise<void> {\n const result = await copyToClipboard(this.url());\n if (result === 'copied') this.copied.set(true);\n}\n```\n\n## Copying rich content\n\nPass one item as a map of MIME type to data. Applications that understand HTML paste the\nrich version; everything else falls back to the plain text.\n\n```typescript\nawait copyToClipboard({\n 'text/plain': 'Quarterly report',\n 'text/html': '<a href=\"https://example.com/report\">Quarterly report</a>',\n});\n```\n\nA value can be a string, a `Blob`, or a promise of either. Use a promise for content that\nhas to be fetched or rendered first, rather than awaiting it before the call:\n\n```typescript\nawait copyToClipboard({ 'image/png': this.chart.toBlob() });\n```\n\n## Results\n\n## Call it from the user gesture\n\nBrowsers only honor a clipboard write made inside a click or key handler. The write starts\nsynchronously when you call `copyToClipboard`, so call it directly from the handler; do not\n`await` other work first.\n\nThis is also why the `clipboard-write` permission is not checked up front. Only Chromium\ncan answer that query, and waiting on it can cost the gesture elsewhere. The permission is\nconsulted after a refusal, to tell `denied` apart from `failed`.\n\n## Resources\n\n- [Clipboard API](https://developer.mozilla.org/en-US/docs/Web/API/Clipboard_API)\n- [ClipboardItem](https://developer.mozilla.org/en-US/docs/Web/API/ClipboardItem)"
23413
+ }
23414
+ ]
23415
+ };
23416
+
23417
+ // src/server/store.ts
23418
+ var index = uni_index_default;
23419
+ var meta = index.meta;
23420
+ function frameworksFor(c) {
23421
+ return Object.keys(c.bindings);
23422
+ }
23423
+ function listComponents(filter = {}) {
23424
+ return index.components.filter((c) => {
23425
+ if (filter.framework && !c.bindings[filter.framework]) return false;
23426
+ if (filter.category && c.category !== filter.category) return false;
23427
+ if (filter.status && c.status !== filter.status) return false;
23428
+ return true;
23429
+ });
23430
+ }
23431
+ function getComponent(id) {
23432
+ return index.components.find((c) => c.id === id);
23433
+ }
23434
+ function listTokens(filter = {}) {
23435
+ return index.tokens.filter((t) => {
23436
+ if (filter.type && t.type !== filter.type) return false;
23437
+ if (filter.kind && t.kind !== filter.kind) return false;
23438
+ if (filter.theme && !(t.themeValues && filter.theme in t.themeValues)) return false;
23439
+ return true;
23440
+ });
23441
+ }
23442
+ function getToken(id) {
23443
+ return index.tokens.find((t) => t.id === id);
23444
+ }
23445
+ function listThemes() {
23446
+ return index.themes;
23447
+ }
23448
+ function getTheme(id) {
23449
+ return index.themes.find((t) => t.id === id);
23450
+ }
23451
+ function listChangelogs() {
23452
+ return index.changelogs ?? [];
23453
+ }
23454
+ function getChangelog(pkg = "uni-angular") {
23455
+ const q = pkg.trim().toLowerCase();
23456
+ return listChangelogs().find((c) => {
23457
+ const name = c.package.toLowerCase();
23458
+ const short = name.split("/").pop() ?? name;
23459
+ return name === q || short === q || short.replace(/^uni-/, "") === q;
23460
+ });
23461
+ }
23462
+ function compareVersions(a, b) {
23463
+ const nums = (v) => v.trim().replace(/^v/, "").split(".").map((s) => parseInt(s, 10) || 0);
23464
+ const [pa, pb] = [nums(a), nums(b)];
23465
+ for (let i = 0; i < Math.max(pa.length, pb.length); i++) {
23466
+ const d = (pa[i] ?? 0) - (pb[i] ?? 0);
23467
+ if (d) return d;
23468
+ }
23469
+ return 0;
23470
+ }
23471
+ function matchesVersion(version, query) {
23472
+ const v = version.split(".");
23473
+ const q = query.trim().replace(/^v/, "").split(".");
23474
+ return q.every((seg, i) => v[i] === seg);
23475
+ }
23476
+ function selectReleases(cl, scope) {
23477
+ if (scope.version) return cl.releases.filter((r) => matchesVersion(r.version, scope.version));
23478
+ if (scope.since) return cl.releases.filter((r) => compareVersions(r.version, scope.since) > 0);
23479
+ return cl.releases;
23480
+ }
23481
+ function listUtilities(filter = {}) {
23482
+ return (index.utilities ?? []).filter((u) => {
23483
+ if (filter.module && u.module !== filter.module) return false;
23484
+ if (filter.kind && u.kind !== filter.kind) return false;
23485
+ return true;
23486
+ });
23487
+ }
23488
+ function getUtility(idOrName) {
23489
+ const q = idOrName.trim();
23490
+ const lower = q.toLowerCase();
23491
+ return listUtilities().find(
23492
+ (u) => u.id === lower || u.name === q || u.name.toLowerCase() === lower
23493
+ );
23494
+ }
23495
+ function getUtilityDoc(module) {
23496
+ return (index.utilityDocs ?? []).find((d) => d.module === module);
23497
+ }
23498
+ function search(query, kind) {
23499
+ const q = query.toLowerCase().trim();
23500
+ if (!q) return [];
23501
+ const hits = [];
23502
+ const match = (...fields) => fields.some((f) => f?.toLowerCase().includes(q));
23503
+ if (!kind || kind === "component") {
23504
+ for (const c of index.components) {
23505
+ const apiNames = frameworksFor(c).flatMap((f) => c.bindings[f].api.map((a) => a.name));
23506
+ if (match(c.id, c.name, c.summary, c.description, c.category, ...apiNames)) {
23507
+ hits.push({
23508
+ kind: "component",
23509
+ id: c.id,
23510
+ label: c.name,
23511
+ snippet: c.summary || c.description.slice(0, 120)
23512
+ });
23513
+ }
23514
+ }
23515
+ }
23516
+ if (!kind || kind === "token") {
23517
+ for (const t of index.tokens) {
23518
+ if (match(t.id, t.type, t.description, String(t.value))) {
23519
+ hits.push({ kind: "token", id: t.id, label: t.id, snippet: `${t.type} = ${t.value}` });
23520
+ }
23521
+ }
23522
+ }
23523
+ if (!kind || kind === "theme") {
23524
+ for (const t of index.themes) {
23525
+ if (match(t.id, t.name, t.description)) {
23526
+ hits.push({ kind: "theme", id: t.id, label: t.name, snippet: t.description });
23527
+ }
23528
+ }
23529
+ }
23530
+ if (!kind || kind === "utility") {
23531
+ for (const u of index.utilities ?? []) {
23532
+ const memberNames = u.members.map((m) => m.name);
23533
+ if (match(u.id, u.name, u.module, u.summary, u.description, ...memberNames)) {
23534
+ hits.push({
23535
+ kind: "utility",
23536
+ id: u.id,
23537
+ label: `${u.name} (${u.module})`,
23538
+ snippet: u.summary || u.signature
23539
+ });
23540
+ }
23541
+ }
23542
+ }
23543
+ if (!kind || kind === "guideline") {
23544
+ for (const c of index.components) {
23545
+ const g = c.guidelines;
23546
+ if (match(g.whenToUse, ...g.dos, ...g.donts, ...g.accessibility)) {
23547
+ hits.push({
23548
+ kind: "guideline",
23549
+ id: c.id,
23550
+ label: `${c.name} guidelines`,
23551
+ snippet: g.whenToUse.slice(0, 120)
23552
+ });
23553
+ }
23554
+ }
23555
+ }
23556
+ return hits;
23557
+ }
23558
+ function formatComponentList(components) {
23559
+ if (!components.length) return "No components match that filter.";
23560
+ const rows = components.map((c) => {
23561
+ const fw = frameworksFor(c).join(", ");
23562
+ return `- **${c.name}** \`${c.id}\` - ${c.summary || "(no summary)"} _(${c.category}; ${fw})_`;
23563
+ });
23564
+ return `# Uni components (${components.length})
23565
+
23566
+ ${rows.join("\n")}`;
23567
+ }
23568
+ function formatApiTable(members) {
23569
+ const api = members?.api ?? [];
23570
+ if (!api.length) return "_No documented inputs/props._";
23571
+ return api.map((m) => {
23572
+ const req = m.required ? " **(required)**" : "";
23573
+ const def = m.default ? ` = \`${m.default}\`` : "";
23574
+ const dep = m.deprecated ? ` (deprecated: ${m.deprecated})` : "";
23575
+ const doc = m.description ? ` - ${m.description}` : "";
23576
+ return `- \`${m.name}: ${m.type}\`${req}${def} _(${m.kind})_${doc}${dep}`;
23577
+ }).join("\n");
23578
+ }
23579
+ function formatComponent(c, framework) {
23580
+ const frameworks = framework ? [framework] : frameworksFor(c);
23581
+ const out = [`# ${c.name} \`${c.id}\``];
23582
+ out.push(`_${c.category} \xB7 status: ${c.status} \xB7 Uni v${c.version}_`);
23583
+ if (c.description) out.push(`
23584
+ ${c.description}`);
23585
+ for (const f of frameworks) {
23586
+ const b = c.bindings[f];
23587
+ if (!b) {
23588
+ out.push(`
23589
+ ## ${f}
23590
+ _Not yet available for ${f}._`);
23591
+ continue;
23592
+ }
23593
+ out.push(`
23594
+ ## ${f}`);
23595
+ out.push(`- import: \`${b.importPath}\``);
23596
+ out.push(`- selector/tag: \`${b.selectorOrTag}\``);
23597
+ out.push(`
23598
+ **API**
23599
+ ${formatApiTable(b)}`);
23600
+ }
23601
+ if (c.relatedTokens.length)
23602
+ out.push(`
23603
+ **Related tokens:** ${c.relatedTokens.map((t) => `\`${t}\``).join(", ")}`);
23604
+ if (c.examples.length) {
23605
+ const ex = c.examples[0];
23606
+ out.push(`
23607
+ **Example - ${ex.title} (${ex.framework})**
23608
+ \`\`\`html
23609
+ ${ex.code}
23610
+ \`\`\``);
23611
+ if (c.examples.length > 1)
23612
+ out.push(`_+${c.examples.length - 1} more via get-component-examples._`);
23613
+ }
23614
+ return out.join("\n");
23615
+ }
23616
+ function formatExamples(c, framework) {
23617
+ const examples = framework ? c.examples.filter((e) => e.framework === framework) : c.examples;
23618
+ if (!examples.length)
23619
+ return `No examples found for \`${c.id}\`${framework ? ` (${framework})` : ""}.`;
23620
+ const blocks = examples.map((e) => {
23621
+ const link = e.storybookUrl ? `
23622
+ [Open in Storybook](${e.storybookUrl})` : "";
23623
+ return `### ${e.title} _(${e.framework})_
23624
+ \`\`\`html
23625
+ ${e.code}
23626
+ \`\`\`${link}`;
23627
+ });
23628
+ return `# ${c.name} - examples (${examples.length})
23629
+
23630
+ ${blocks.join("\n\n")}`;
23631
+ }
23632
+ function formatToken(t) {
23633
+ const out = [`# Token \`${t.id}\``];
23634
+ out.push(`- value: \`${t.value}\``);
23635
+ out.push(`- type: ${t.type}`);
23636
+ out.push(`- kind: **${t.kind}** (${t.target})`);
23637
+ if (t.appliesTo) out.push(`- applies to component: \`${t.appliesTo}\``);
23638
+ if (t.aliasOf) out.push(`- alias of: \`${t.aliasOf}\``);
23639
+ if (t.description) out.push(`
23640
+ ${t.description}`);
23641
+ if (t.themeValues && Object.keys(t.themeValues).length) {
23642
+ out.push("\n**Per-theme values**");
23643
+ for (const [theme, val] of Object.entries(t.themeValues)) out.push(`- ${theme}: \`${val}\``);
23644
+ }
23645
+ const hint = t.kind === "style" ? "\n_Style token - consumed by Emotion to generate CSS. Reference via the theme, not a raw value._" : "\n_Behavioral token - set as a component input/prop, not as CSS._";
23646
+ out.push(hint);
23647
+ return out.join("\n");
23648
+ }
23649
+ function formatTokenList(tokens) {
20726
23650
  if (!tokens.length) return "No tokens match that filter.";
20727
23651
  const rows = tokens.map((t) => `- \`${t.id}\` - ${t.type} = \`${t.value}\` _(${t.kind})_`);
20728
23652
  return `# Uni tokens (${tokens.length})
@@ -20746,7 +23670,9 @@ function formatTheme(t) {
20746
23670
  out.push("\n## Component options (-> component inputs/props)");
20747
23671
  out.push("_Behavioral preferences. Pass as inputs/props, not CSS._");
20748
23672
  for (const [component, opts] of Object.entries(t.componentOptions)) {
20749
- out.push(`- **${component}**: ${Object.entries(opts).map(([k, v]) => `\`${k}=${v}\``).join(", ")}`);
23673
+ out.push(
23674
+ `- **${component}**: ${Object.entries(opts).map(([k, v]) => `\`${k}=${v}\``).join(", ")}`
23675
+ );
20750
23676
  }
20751
23677
  if (t.usage) out.push(`
20752
23678
  ## How to apply
@@ -20756,7 +23682,8 @@ ${t.usage}`);
20756
23682
  function formatGuidelines(c) {
20757
23683
  const g = c.guidelines;
20758
23684
  const has = g.whenToUse || g.dos.length || g.donts.length || g.accessibility.length;
20759
- if (!has) return `No authored guidelines yet for \`${c.id}\`. (Author them in the component's MDX.)`;
23685
+ if (!has)
23686
+ return `No authored guidelines yet for \`${c.id}\`. (Author them in the component's MDX.)`;
20760
23687
  const out = [`# ${c.name} - guidelines`];
20761
23688
  if (g.whenToUse) out.push(`
20762
23689
  **When to use**
@@ -20767,7 +23694,8 @@ ${g.dos.map((d) => `- ${d}`).join("\n")}`);
20767
23694
  if (g.donts.length) out.push(`
20768
23695
  **Don't**
20769
23696
  ${g.donts.map((d) => `- ${d}`).join("\n")}`);
20770
- if (g.accessibility.length) out.push(`
23697
+ if (g.accessibility.length)
23698
+ out.push(`
20771
23699
  **Accessibility**
20772
23700
  ${g.accessibility.map((a) => `- ${a}`).join("\n")}`);
20773
23701
  return out.join("\n");
@@ -20805,7 +23733,9 @@ function formatChangelog(cl, scope = {}) {
20805
23733
  const shown = full ? releases : releases.slice(0, 15);
20806
23734
  const out = [`# ${cl.package} \u2014 release notes`, ...shown.map((r) => formatRelease(r, full))];
20807
23735
  if (shown.length < releases.length) {
20808
- out.push(`_...and ${releases.length - shown.length} older releases. Pass \`version\` or \`since\` to scope._`);
23736
+ out.push(
23737
+ `_...and ${releases.length - shown.length} older releases. Pass \`version\` or \`since\` to scope._`
23738
+ );
20809
23739
  }
20810
23740
  return out.join("\n\n");
20811
23741
  }
@@ -20819,6 +23749,53 @@ _...and ${hits.length - 40} more. Narrow with \`kind\`._` : "";
20819
23749
 
20820
23750
  ${rows.join("\n")}${more}`;
20821
23751
  }
23752
+ function formatUtilityList(utilities) {
23753
+ if (!utilities.length) return "No utilities match that filter.";
23754
+ const byModule = /* @__PURE__ */ new Map();
23755
+ for (const u of utilities) byModule.set(u.module, [...byModule.get(u.module) ?? [], u]);
23756
+ const out = [
23757
+ `# Uni CDK utilities (${utilities.length})`,
23758
+ "",
23759
+ "Import every symbol from `@uni-design-system/uni-angular`."
23760
+ ];
23761
+ for (const [module, list] of byModule) {
23762
+ const doc = getUtilityDoc(module);
23763
+ out.push(`
23764
+ ## ${module}${doc ? ` \u2014 ${doc.title}` : ""}`);
23765
+ for (const u of list)
23766
+ out.push(`- **${u.name}** \`${u.id}\` _(${u.kind})_${u.summary ? ` - ${u.summary}` : ""}`);
23767
+ }
23768
+ return out.join("\n");
23769
+ }
23770
+ function formatUtility(u) {
23771
+ const out = [`# ${u.name} \`${u.id}\``];
23772
+ out.push(`_${u.kind} \xB7 cdk/${u.module} \xB7 Uni v${u.version}_`);
23773
+ if (u.description) out.push(`
23774
+ ${u.description}`);
23775
+ out.push(`
23776
+ - import: \`import { ${u.name} } from '${u.importPath}';\``);
23777
+ out.push(`
23778
+ \`\`\`ts
23779
+ ${u.signature}
23780
+ \`\`\``);
23781
+ if (u.members.length) {
23782
+ out.push("\n**Members**");
23783
+ for (const m of u.members)
23784
+ out.push(`- \`${m.signature}\`${m.description ? ` - ${m.description}` : ""}`);
23785
+ }
23786
+ const siblings = listUtilities({ module: u.module }).filter((s) => s.id !== u.id);
23787
+ if (siblings.length)
23788
+ out.push(`
23789
+ **Same module:** ${siblings.map((s) => `\`${s.name}\``).join(", ")}`);
23790
+ const doc = getUtilityDoc(u.module);
23791
+ if (doc) out.push(`
23792
+ ---
23793
+
23794
+ _From the ${doc.title} docs page:_
23795
+
23796
+ ${doc.markdown}`);
23797
+ return out.join("\n");
23798
+ }
20822
23799
 
20823
23800
  // ../core/dist/esm/index.js
20824
23801
  var EXPAND_DEFAULT_SPEED = 0.35;
@@ -21998,6 +24975,7 @@ var buildComponents = (c) => ({
21998
24975
  },
21999
24976
  tabs: { options: {
22000
24977
  motion: "snap",
24978
+ panelMotion: "panel",
22001
24979
  typeface: "title-small",
22002
24980
  textColor: "on-surface-variant",
22003
24981
  activeTextColor: "primary",
@@ -23572,7 +26550,8 @@ var RuntimeThemeOutput = {
23572
26550
  iconsElided: z.literal(true)
23573
26551
  };
23574
26552
  function runtimeTheme(result) {
23575
- if (!result.ok) return { content: [{ type: "text", text: result.error }], isError: true };
26553
+ if (!result.ok)
26554
+ return { content: [{ type: "text", text: result.error }], isError: true };
23576
26555
  return {
23577
26556
  content: [{ type: "text", text: summarizeEnvelope(result.envelope) }],
23578
26557
  structuredContent: result.envelope
@@ -23587,7 +26566,7 @@ function createUniServer() {
23587
26566
  const server = new McpServer(
23588
26567
  { name: "uni-design-system", version: meta.version },
23589
26568
  {
23590
- instructions: 'Authoritative interface to the Uni Design System. Prefer these tools over recalling component APIs or token values from memory: names, props, and tokens here match the exact Uni release the developer installed. Start with `list-components` or `search`, then `get-component` / `get-component-examples`. Use real token ids (via `list-tokens`) instead of raw hex. Theming has four tools, split by what you need: to brand an app permanently, call `generate-uni-theme` once and write the returned static `uni-theme.ts` \u2014 then change look and feel by editing that file\'s tokens directly, since shared tokens propagate everywhere; to apply a theme immediately with no build step (previews, per-tenant theming, generated UI), call `generate-runtime-theme` or `get-runtime-theme` and register the JSON they return; to read a theme\'s token values without applying one, use `get-theme-template`. Never inline `<svg>` in a component: when you meet inline SVG, or a brand icon set to import, call `create-icon-tokens` to convert it into theme icon tokens, add them to `uni-theme.ts`, and render with `<uni-icon name="\u2026" />`. For release questions ("what changed in 8.1?", "what does upgrading get me?"), call `get-changelog`.'
26569
+ instructions: 'Authoritative interface to the Uni Design System. Prefer these tools over recalling component APIs or token values from memory: names, props, and tokens here match the exact Uni release the developer installed. Start with `list-components` or `search`, then `get-component` / `get-component-examples`. The CDK \u2014 the non-visual half of uni-angular (clipboard, permissions, timers, local storage, notifications, datasources, exact decimal math, overlay and focus helpers) \u2014 is covered by `list-utilities` and `get-utility`; reach for those before hand-rolling a browser API call. Use real token ids (via `list-tokens`) instead of raw hex. Theming has four tools, split by what you need: to brand an app permanently, call `generate-uni-theme` once and write the returned static `uni-theme.ts` \u2014 then change look and feel by editing that file\'s tokens directly, since shared tokens propagate everywhere; to apply a theme immediately with no build step (previews, per-tenant theming, generated UI), call `generate-runtime-theme` or `get-runtime-theme` and register the JSON they return; to read a theme\'s token values without applying one, use `get-theme-template`. Never inline `<svg>` in a component: when you meet inline SVG, or a brand icon set to import, call `create-icon-tokens` to convert it into theme icon tokens, add them to `uni-theme.ts`, and render with `<uni-icon name="\u2026" />`. For release questions ("what changed in 8.1?", "what does upgrading get me?"), call `get-changelog`.'
23591
26570
  }
23592
26571
  );
23593
26572
  server.registerTool(
@@ -23630,6 +26609,30 @@ function createUniServer() {
23630
26609
  return c ? text(formatExamples(c, framework)) : notFound("component", id);
23631
26610
  }
23632
26611
  );
26612
+ server.registerTool(
26613
+ "list-utilities",
26614
+ {
26615
+ title: "List Uni CDK utilities",
26616
+ description: "Inventory of the CDK \u2014 the non-visual exports of uni-angular: functions, injectable services, classes and types, grouped by module (clipboard, permission, timer, local-storage, notification, datasource, number, datetime, overlay, a11y, \u2026). Filter by module or kind.",
26617
+ inputSchema: {
26618
+ module: z.string().optional().describe('CDK folder, e.g. "clipboard", "number", "datasource"'),
26619
+ kind: z.enum(["function", "service", "class", "interface", "type", "const"]).optional()
26620
+ }
26621
+ },
26622
+ async ({ module, kind }) => text(formatUtilityList(listUtilities({ module, kind })))
26623
+ );
26624
+ server.registerTool(
26625
+ "get-utility",
26626
+ {
26627
+ title: "Get a Uni CDK utility",
26628
+ description: `Full reference for one CDK export: description, import line, signature, members (for services and interfaces), the other symbols in its module, and the module's docs page with usage examples. Accepts the id ("copy-to-clipboard") or the exported name ("copyToClipboard").`,
26629
+ inputSchema: { id: z.string().describe("utility id or exported name") }
26630
+ },
26631
+ async ({ id }) => {
26632
+ const u = getUtility(id);
26633
+ return u ? text(formatUtility(u)) : notFound("utility", id);
26634
+ }
26635
+ );
23633
26636
  server.registerTool(
23634
26637
  "list-tokens",
23635
26638
  {
@@ -23740,7 +26743,8 @@ function createUniServer() {
23740
26743
  },
23741
26744
  async ({ theme }) => {
23742
26745
  const result = buildDtcgTokens(theme);
23743
- if (!result.ok) return { content: [{ type: "text", text: result.error }], isError: true };
26746
+ if (!result.ok)
26747
+ return { content: [{ type: "text", text: result.error }], isError: true };
23744
26748
  return text("```json\n" + result.json + "\n```");
23745
26749
  }
23746
26750
  );
@@ -23769,7 +26773,9 @@ function createUniServer() {
23769
26773
  title: "Get release notes",
23770
26774
  description: 'Release notes for the Uni packages, from their changesets changelogs. Answers "what changed in X?" and "what do I get by upgrading?". Pass `version` for one release\'s full notes ("8.1" matches every 8.1.x), `since` for the full notes of every release after an installed version (an upgrade diff), or neither for a compact release list.',
23771
26775
  inputSchema: {
23772
- package: z.string().optional().describe('npm name or short name, e.g. "uni-angular" (default), "uni-core", "uni-react", "uni-mcp".'),
26776
+ package: z.string().optional().describe(
26777
+ 'npm name or short name, e.g. "uni-angular" (default), "uni-core", "uni-react", "uni-mcp".'
26778
+ ),
23773
26779
  version: z.string().optional().describe('One release, e.g. "8.1.0" or "8.1".'),
23774
26780
  since: z.string().optional().describe('Every release newer than this version, e.g. the installed "8.0.0".')
23775
26781
  }
@@ -23787,10 +26793,10 @@ function createUniServer() {
23787
26793
  "search",
23788
26794
  {
23789
26795
  title: "Search the design system",
23790
- description: "Keyword search across components, tokens, themes, and guidelines. Narrow with `kind`.",
26796
+ description: "Keyword search across components, CDK utilities, tokens, themes, and guidelines. Narrow with `kind`.",
23791
26797
  inputSchema: {
23792
26798
  query: z.string(),
23793
- kind: z.enum(["component", "token", "theme", "guideline"]).optional()
26799
+ kind: z.enum(["component", "utility", "token", "theme", "guideline"]).optional()
23794
26800
  }
23795
26801
  },
23796
26802
  async ({ query, kind }) => text(formatSearch(query, search(query, kind)))
@@ -23838,6 +26844,35 @@ function registerResources(server) {
23838
26844
  };
23839
26845
  }
23840
26846
  );
26847
+ server.registerResource(
26848
+ "utility",
26849
+ new ResourceTemplate("uni://utilities/{id}", {
26850
+ list: async () => ({
26851
+ resources: listUtilities().map((u) => ({
26852
+ uri: `uni://utilities/${u.id}`,
26853
+ name: u.name,
26854
+ description: u.summary || u.signature
26855
+ }))
26856
+ })
26857
+ }),
26858
+ {
26859
+ title: "Uni CDK utility",
26860
+ description: "A CDK utility reference card, with its module docs.",
26861
+ mimeType: "text/markdown"
26862
+ },
26863
+ async (uri, { id }) => {
26864
+ const u = getUtility(String(id));
26865
+ return {
26866
+ contents: [
26867
+ {
26868
+ uri: uri.href,
26869
+ mimeType: "text/markdown",
26870
+ text: u ? formatUtility(u) : `Unknown utility: ${id}`
26871
+ }
26872
+ ]
26873
+ };
26874
+ }
26875
+ );
23841
26876
  server.registerResource(
23842
26877
  "token",
23843
26878
  new ResourceTemplate("uni://tokens/{id}", {
@@ -23954,4 +26989,4 @@ export {
23954
26989
  buildStoredTheme,
23955
26990
  createUniServer
23956
26991
  };
23957
- //# sourceMappingURL=chunk-NFG2QIJW.js.map
26992
+ //# sourceMappingURL=chunk-2FUM4CYC.js.map