@uni-design-system/uni-mcp 11.4.1 → 11.6.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.1",
11
- builtAt: "2026-09-28T19:07:15.638Z",
10
+ version: "11.6.0",
11
+ builtAt: "2026-10-05T01:16:14.251Z",
12
12
  frameworks: [
13
13
  "angular"
14
14
  ],
15
15
  counts: {
16
- components: 87,
17
- tokens: 493,
16
+ components: 88,
17
+ tokens: 504,
18
18
  themes: 2,
19
- examples: 245
19
+ examples: 254,
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.1",
31
+ version: "11.6.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.1",
121
+ version: "11.6.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.1",
194
+ version: "11.6.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.1",
289
+ version: "11.6.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.1",
338
+ version: "11.6.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.1",
419
+ version: "11.6.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.1",
516
+ version: "11.6.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.1",
540
+ version: "11.6.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.1",
948
+ version: "11.6.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.1",
1033
+ version: "11.6.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.1",
1193
+ version: "11.6.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.1",
1225
+ version: "11.6.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.1",
1466
+ version: "11.6.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.1",
1686
+ version: "11.6.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.1",
1748
+ version: "11.6.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.1",
1789
+ version: "11.6.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.1",
1846
+ version: "11.6.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.1",
1901
+ version: "11.6.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.1",
2123
+ version: "11.6.0",
2123
2124
  bindings: {
2124
2125
  angular: {
2125
2126
  importPath: "@uni-design-system/uni-angular",
@@ -2257,6 +2258,14 @@ var uni_index_default = {
2257
2258
  default: "250",
2258
2259
  description: ""
2259
2260
  },
2261
+ {
2262
+ name: "openOnFocus",
2263
+ kind: "input",
2264
+ type: "boolean",
2265
+ required: false,
2266
+ default: "false",
2267
+ description: "Open the list when the field takes focus, not only on click or ArrowDown. Off by default \u2014 a form tabbed through should not spray popups."
2268
+ },
2260
2269
  {
2261
2270
  name: "query",
2262
2271
  kind: "output",
@@ -2405,7 +2414,7 @@ emptyText="No countries found"
2405
2414
  summary: "",
2406
2415
  description: "",
2407
2416
  category: "feedback",
2408
- version: "11.4.1",
2417
+ version: "11.6.0",
2409
2418
  bindings: {
2410
2419
  angular: {
2411
2420
  importPath: "@uni-design-system/uni-angular",
@@ -2445,6 +2454,283 @@ emptyText="No countries found"
2445
2454
  },
2446
2455
  relatedTokens: []
2447
2456
  },
2457
+ {
2458
+ id: "contact-input",
2459
+ name: "ContactInput",
2460
+ status: "stable",
2461
+ summary: "Recipient field for picking people: removable chips, a text input, and a list of known contacts that opens on focus and narrows as the user types \u2014 each row drawn as a person (avatar, name, address, a trailing note).",
2462
+ description: "Recipient field for picking people: removable chips, a text input, and a list of known contacts that opens on focus and narrows as the user types \u2014 each row drawn as a person (avatar, name, address, a trailing note). A thin composition of `uni-tag-input` with a mail client's manners baked in: ArrowDown walks the matches and Enter picks the active one, Backspace in an empty field removes the last person, and text that is neither a known contact nor a valid address stays in the field to be fixed (`rejected` says why). Reach for `uni-tag-input` itself when the tokens are not people.",
2463
+ category: "forms",
2464
+ version: "11.6.0",
2465
+ bindings: {
2466
+ angular: {
2467
+ importPath: "@uni-design-system/uni-angular",
2468
+ selectorOrTag: "uni-contact-input, ContactInput",
2469
+ api: [
2470
+ {
2471
+ name: "value",
2472
+ kind: "model",
2473
+ type: "UniContact[]",
2474
+ required: false,
2475
+ default: "[]",
2476
+ description: ""
2477
+ },
2478
+ {
2479
+ name: "disabled",
2480
+ kind: "input",
2481
+ type: "boolean",
2482
+ required: false,
2483
+ default: "false",
2484
+ description: ""
2485
+ },
2486
+ {
2487
+ name: "touched",
2488
+ kind: "model",
2489
+ type: "boolean",
2490
+ required: false,
2491
+ default: "false",
2492
+ description: ""
2493
+ },
2494
+ {
2495
+ name: "touch",
2496
+ kind: "output",
2497
+ type: "void",
2498
+ required: false,
2499
+ description: "Angular 22 marks the bound field touched through this output."
2500
+ },
2501
+ {
2502
+ name: "invalid",
2503
+ kind: "input",
2504
+ type: "boolean",
2505
+ required: false,
2506
+ default: "false",
2507
+ description: ""
2508
+ },
2509
+ {
2510
+ name: "dirty",
2511
+ kind: "input",
2512
+ type: "boolean",
2513
+ required: false,
2514
+ default: "false",
2515
+ description: ""
2516
+ },
2517
+ {
2518
+ name: "required",
2519
+ kind: "input",
2520
+ type: "boolean",
2521
+ required: false,
2522
+ default: "false",
2523
+ description: ""
2524
+ },
2525
+ {
2526
+ name: "ariaDescribedBy",
2527
+ kind: "input",
2528
+ type: "string",
2529
+ required: false,
2530
+ description: ""
2531
+ },
2532
+ {
2533
+ name: "label",
2534
+ kind: "input",
2535
+ type: "string",
2536
+ required: true,
2537
+ description: 'Accessible name for the field, e.g. "To".'
2538
+ },
2539
+ {
2540
+ name: "placeholder",
2541
+ kind: "input",
2542
+ type: "string",
2543
+ required: false,
2544
+ description: ""
2545
+ },
2546
+ {
2547
+ name: "contacts",
2548
+ kind: "input",
2549
+ type: "UniContact[]",
2550
+ required: false,
2551
+ default: "[]",
2552
+ description: "Everyone who can be suggested, in the order (and groups) to offer them."
2553
+ },
2554
+ {
2555
+ name: "allowCustom",
2556
+ kind: "input",
2557
+ type: "boolean",
2558
+ required: false,
2559
+ default: "true",
2560
+ description: "Accept a typed value that is not a known contact. On by default \u2014 a typed email address becomes a chip; `false` restricts the field to `contacts`."
2561
+ },
2562
+ {
2563
+ name: "filterLocally",
2564
+ kind: "input",
2565
+ type: "boolean",
2566
+ required: false,
2567
+ default: "true",
2568
+ description: "`false` renders `contacts` verbatim; narrow them app-side from `(query)` when the directory lives on a server."
2569
+ },
2570
+ {
2571
+ name: "autoHighlight",
2572
+ kind: "input",
2573
+ type: "boolean",
2574
+ required: false,
2575
+ default: "false",
2576
+ description: "Keep the first match highlighted so Enter or Tab picks it without arrowing. Off by default: nothing is highlighted until ArrowDown, and Enter commits what is typed."
2577
+ },
2578
+ {
2579
+ name: "debounceTime",
2580
+ kind: "input",
2581
+ type: "number",
2582
+ required: false,
2583
+ default: "250",
2584
+ description: ""
2585
+ },
2586
+ {
2587
+ name: "maxLength",
2588
+ kind: "input",
2589
+ type: "number | undefined",
2590
+ required: false,
2591
+ default: "undefined, { alias: 'max' }",
2592
+ description: ""
2593
+ },
2594
+ {
2595
+ name: "unframed",
2596
+ kind: "input",
2597
+ type: "unknown",
2598
+ required: false,
2599
+ default: "false, { transform: booleanAttribute }",
2600
+ description: "Drop the field chrome and render a bare row \u2014 an email client's To line."
2601
+ },
2602
+ {
2603
+ name: "autocomplete",
2604
+ kind: "input",
2605
+ type: "string",
2606
+ required: false,
2607
+ default: "'off'",
2608
+ description: "The text field's `autocomplete` token; see `uni-tag-input`."
2609
+ },
2610
+ {
2611
+ name: "tagVariant",
2612
+ kind: "input",
2613
+ type: "Variant",
2614
+ required: false,
2615
+ description: ""
2616
+ },
2617
+ {
2618
+ name: "tagTone",
2619
+ kind: "input",
2620
+ type: "TagTone",
2621
+ required: false,
2622
+ description: ""
2623
+ },
2624
+ {
2625
+ name: "tagSize",
2626
+ kind: "input",
2627
+ type: "Size",
2628
+ required: false,
2629
+ description: ""
2630
+ },
2631
+ {
2632
+ name: "added",
2633
+ kind: "output",
2634
+ type: "UniContact",
2635
+ required: false,
2636
+ description: ""
2637
+ },
2638
+ {
2639
+ name: "removed",
2640
+ kind: "output",
2641
+ type: "UniContact",
2642
+ required: false,
2643
+ description: ""
2644
+ },
2645
+ {
2646
+ name: "rejected",
2647
+ kind: "output",
2648
+ type: "UniTagRejection",
2649
+ required: false,
2650
+ description: "Typed text that did not become a person; an `invalid` one stays in the field."
2651
+ },
2652
+ {
2653
+ name: "query",
2654
+ kind: "output",
2655
+ type: "string",
2656
+ required: false,
2657
+ description: "Debounced typed text, for loading contacts remotely."
2658
+ },
2659
+ {
2660
+ name: "draftChange",
2661
+ kind: "output",
2662
+ type: "string",
2663
+ required: false,
2664
+ description: "Typed text on every change \u2014 e.g. to clear an error once it is edited."
2665
+ },
2666
+ {
2667
+ name: "variant",
2668
+ kind: "input",
2669
+ type: "Variant",
2670
+ required: false,
2671
+ default: "'primary'",
2672
+ description: "Style archetype from the theme. Inherited from BaseComponent."
2673
+ },
2674
+ {
2675
+ name: "size",
2676
+ kind: "input",
2677
+ type: "Size",
2678
+ required: false,
2679
+ default: "'lg'",
2680
+ description: "Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block."
2681
+ }
2682
+ ]
2683
+ }
2684
+ },
2685
+ examples: [
2686
+ {
2687
+ title: "Primary",
2688
+ framework: "angular",
2689
+ code: "<!-- Storybook story: Primary -->\n<!-- args:\n{ value: [{ value: 'alice@uni.dev', name: 'Alice Chen' }] }\n-->"
2690
+ },
2691
+ {
2692
+ title: "Grouped Contacts",
2693
+ framework: "angular",
2694
+ code: "<!-- Storybook story: Grouped Contacts -->\n<!-- args:\n{ contacts: GROUPED }\n-->"
2695
+ },
2696
+ {
2697
+ title: "Unframed",
2698
+ framework: "angular",
2699
+ code: "<!-- Storybook story: Unframed -->\n<!-- args:\n{ unframed: true, value: [{ value: 'alice@uni.dev', name: 'Alice Chen' }] }\n-->"
2700
+ },
2701
+ {
2702
+ title: "Known Contacts Only",
2703
+ framework: "angular",
2704
+ code: "<!-- Storybook story: Known Contacts Only -->\n<!-- args:\n{ allowCustom: false, placeholder: 'Search people\u2026' }\n-->"
2705
+ },
2706
+ {
2707
+ title: "Disabled",
2708
+ framework: "angular",
2709
+ code: "<!-- Storybook story: Disabled -->\n<!-- args:\n{ disabled: true, value: [{ value: 'alice@uni.dev', name: 'Alice Chen' }] }\n-->"
2710
+ }
2711
+ ],
2712
+ guidelines: {
2713
+ whenToUse: "Recipient field for picking people: removable chips, a text input, and a list\nof known contacts that opens on focus and narrows as the user types. Each row\nis drawn as a person \u2014 avatar, name, address, and an optional note. Reach for\nit for a To line, a share dialog, assignees or mentions; for tokens that are\nnot people, use `uni-tag-input`, which this composes.\nIt behaves like a mail client: ArrowDown walks the matches and Enter picks\nthe active one, Backspace in an empty field removes the last person, and text\nthat is neither a known contact nor a valid address stays in the field to be\nfixed. Set `autoHighlight` to keep the first match active, so Enter or Tab\npicks it without arrowing. The chips come\nfrom the `tag` theme entry, the popup from `tagInput`, the field chrome from\n`input`, and the person row from `contactInput`.",
2714
+ dos: [
2715
+ "Order `contacts` most-relevant first; only the first few are shown.",
2716
+ "Set `filterLocally` to `false` and refresh `contacts` from `(query)` when",
2717
+ "Clear your error message from `(draftChange)` once the user edits the text."
2718
+ ],
2719
+ donts: [
2720
+ "Don't use it for tokens that are not people \u2014 that is `uni-tag-input`.",
2721
+ "Don't use it to pick one person from a closed list \u2014 that is `uni-combobox`.",
2722
+ "Don't rely on `autocomplete=\"off\"` alone if Chrome's address autofill still"
2723
+ ],
2724
+ accessibility: [
2725
+ 'The text input is `role="combobox"` over a `role="listbox"` popup; nothing',
2726
+ "The whole field is one tab stop. Enter picks the active contact, otherwise",
2727
+ 'Adds, removes and refusals announce through a `role="status"` live region.',
2728
+ "The control renders no validation message: handle `(rejected)`, render the",
2729
+ "`unframed` removes the focus ring along with the chrome; show focus on the"
2730
+ ]
2731
+ },
2732
+ relatedTokens: []
2733
+ },
2448
2734
  {
2449
2735
  id: "data-search",
2450
2736
  name: "DataSearch",
@@ -2452,7 +2738,7 @@ emptyText="No countries found"
2452
2738
  summary: "",
2453
2739
  description: "",
2454
2740
  category: "forms",
2455
- version: "11.4.1",
2741
+ version: "11.6.0",
2456
2742
  bindings: {
2457
2743
  angular: {
2458
2744
  importPath: "@uni-design-system/uni-angular",
@@ -2551,7 +2837,7 @@ emptyText="No countries found"
2551
2837
  summary: "",
2552
2838
  description: "",
2553
2839
  category: "data",
2554
- version: "11.4.1",
2840
+ version: "11.6.0",
2555
2841
  bindings: {
2556
2842
  angular: {
2557
2843
  importPath: "@uni-design-system/uni-angular",
@@ -2791,7 +3077,7 @@ emptyText="No countries found"
2791
3077
  summary: "Date field with free-typed parsing and a popup calendar.",
2792
3078
  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
3079
  category: "forms",
2794
- version: "11.4.1",
3080
+ version: "11.6.0",
2795
3081
  bindings: {
2796
3082
  angular: {
2797
3083
  importPath: "@uni-design-system/uni-angular",
@@ -3022,7 +3308,7 @@ emptyText="No countries found"
3022
3308
  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
3309
  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
3310
  category: "forms",
3025
- version: "11.4.1",
3311
+ version: "11.6.0",
3026
3312
  bindings: {
3027
3313
  angular: {
3028
3314
  importPath: "@uni-design-system/uni-angular",
@@ -3215,7 +3501,7 @@ emptyText="No countries found"
3215
3501
  summary: "Text input that emits `change` only after the user pauses typing.",
3216
3502
  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
3503
  category: "forms",
3218
- version: "11.4.1",
3504
+ version: "11.6.0",
3219
3505
  bindings: {
3220
3506
  angular: {
3221
3507
  importPath: "@uni-design-system/uni-angular",
@@ -3363,7 +3649,7 @@ emptyText="No countries found"
3363
3649
  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
3650
  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
3651
  category: "feedback",
3366
- version: "11.4.1",
3652
+ version: "11.6.0",
3367
3653
  bindings: {
3368
3654
  angular: {
3369
3655
  importPath: "@uni-design-system/uni-angular",
@@ -3516,7 +3802,7 @@ uni-dialog
3516
3802
  summary: "",
3517
3803
  description: "",
3518
3804
  category: "feedback",
3519
- version: "11.4.1",
3805
+ version: "11.6.0",
3520
3806
  bindings: {
3521
3807
  angular: {
3522
3808
  importPath: "@uni-design-system/uni-angular",
@@ -3620,7 +3906,7 @@ uni-dialog
3620
3906
  summary: "",
3621
3907
  description: "",
3622
3908
  category: "feedback",
3623
- version: "11.4.1",
3909
+ version: "11.6.0",
3624
3910
  bindings: {
3625
3911
  angular: {
3626
3912
  importPath: "@uni-design-system/uni-angular",
@@ -3661,7 +3947,7 @@ uni-dialog
3661
3947
  summary: "",
3662
3948
  description: "",
3663
3949
  category: "layout",
3664
- version: "11.4.1",
3950
+ version: "11.6.0",
3665
3951
  bindings: {
3666
3952
  angular: {
3667
3953
  importPath: "@uni-design-system/uni-angular",
@@ -3717,7 +4003,7 @@ uni-dialog
3717
4003
  summary: "",
3718
4004
  description: "",
3719
4005
  category: "directives",
3720
- version: "11.4.1",
4006
+ version: "11.6.0",
3721
4007
  bindings: {
3722
4008
  angular: {
3723
4009
  importPath: "@uni-design-system/uni-angular",
@@ -3749,7 +4035,7 @@ uni-dialog
3749
4035
  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
4036
  description: "Drawer with two modes sharing one three-row layout: - `side` \u2014 an in-flow `<aside>` that pushes content (dashboard sidenav); opening/closing animates its width, and the divider border primitive separates it from the page. - `over` \u2014 a native `<dialog>` in the top layer: focus trap, Escape and scrim backdrop come from the platform (same machinery as `uni-dialog`), sliding in from its edge. **The panel is never the scroll container.** It is a flex column of three rows \u2014 an optional `[uni-drawer-header]`, the projected body, an optional `[uni-drawer-buttons]` \u2014 and only the body scrolls. The panel itself is `overflow: clip` on both axes. That is what lets a header and a save bar pin while a long form scrolls between them, and it is why the theme's `padding` option lands on the body row rather than the panel: padding on a scrolling box scrolls away with its content. Surface, width, divider, elevation, padding, backdrop, scrim and background all resolve from `drawer` theme tokens.",
3751
4037
  category: "components",
3752
- version: "11.4.1",
4038
+ version: "11.6.0",
3753
4039
  bindings: {
3754
4040
  angular: {
3755
4041
  importPath: "@uni-design-system/uni-angular",
@@ -3940,7 +4226,7 @@ initialFocus="input"
3940
4226
  summary: "The drawer's pinned footer action row \u2014 the save bar of an editor panel.",
3941
4227
  description: "The drawer's pinned footer action row \u2014 the save bar of an editor panel. Sits outside the scrolling body, so the actions stay reachable however long the form is. Mirrors `[dialog-buttons]`; the difference is posture, which lives in the `drawerButtons` theme options rather than here.",
3942
4228
  category: "primitives",
3943
- version: "11.4.1",
4229
+ version: "11.6.0",
3944
4230
  bindings: {
3945
4231
  angular: {
3946
4232
  importPath: "@uni-design-system/uni-angular",
@@ -4037,7 +4323,7 @@ initialFocus="input"
4037
4323
  summary: "The drawer's pinned header row: a title, and optionally a close button.",
4038
4324
  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
4325
  category: "components",
4040
- version: "11.4.1",
4326
+ version: "11.6.0",
4041
4327
  bindings: {
4042
4328
  angular: {
4043
4329
  importPath: "@uni-design-system/uni-angular",
@@ -4085,7 +4371,7 @@ initialFocus="input"
4085
4371
  summary: "",
4086
4372
  description: "",
4087
4373
  category: "components",
4088
- version: "11.4.1",
4374
+ version: "11.6.0",
4089
4375
  bindings: {
4090
4376
  angular: {
4091
4377
  importPath: "@uni-design-system/uni-angular",
@@ -4219,7 +4505,7 @@ initialFocus="input"
4219
4505
  summary: "",
4220
4506
  description: "",
4221
4507
  category: "layout",
4222
- version: "11.4.1",
4508
+ version: "11.6.0",
4223
4509
  bindings: {
4224
4510
  angular: {
4225
4511
  importPath: "@uni-design-system/uni-angular",
@@ -4323,7 +4609,7 @@ initialFocus="input"
4323
4609
  summary: "",
4324
4610
  description: "",
4325
4611
  category: "layout",
4326
- version: "11.4.1",
4612
+ version: "11.6.0",
4327
4613
  bindings: {
4328
4614
  angular: {
4329
4615
  importPath: "@uni-design-system/uni-angular",
@@ -4394,7 +4680,7 @@ initialFocus="input"
4394
4680
  summary: "Trigger for a {@link UniExpandComponent} region.",
4395
4681
  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
4682
  category: "layout",
4397
- version: "11.4.1",
4683
+ version: "11.6.0",
4398
4684
  bindings: {
4399
4685
  angular: {
4400
4686
  importPath: "@uni-design-system/uni-angular",
@@ -4479,7 +4765,7 @@ initialFocus="input"
4479
4765
  summary: "",
4480
4766
  description: "",
4481
4767
  category: "forms",
4482
- version: "11.4.1",
4768
+ version: "11.6.0",
4483
4769
  bindings: {
4484
4770
  angular: {
4485
4771
  importPath: "@uni-design-system/uni-angular",
@@ -4637,7 +4923,7 @@ initialFocus="input"
4637
4923
  summary: "",
4638
4924
  description: "",
4639
4925
  category: "layout",
4640
- version: "11.4.1",
4926
+ version: "11.6.0",
4641
4927
  bindings: {
4642
4928
  angular: {
4643
4929
  importPath: "@uni-design-system/uni-angular",
@@ -4734,7 +5020,7 @@ initialFocus="input"
4734
5020
  summary: "",
4735
5021
  description: "",
4736
5022
  category: "layout",
4737
- version: "11.4.1",
5023
+ version: "11.6.0",
4738
5024
  bindings: {
4739
5025
  angular: {
4740
5026
  importPath: "@uni-design-system/uni-angular",
@@ -4766,7 +5052,7 @@ initialFocus="input"
4766
5052
  summary: "",
4767
5053
  description: "",
4768
5054
  category: "primitives",
4769
- version: "11.4.1",
5055
+ version: "11.6.0",
4770
5056
  bindings: {
4771
5057
  angular: {
4772
5058
  importPath: "@uni-design-system/uni-angular",
@@ -4826,7 +5112,7 @@ initialFocus="input"
4826
5112
  summary: "",
4827
5113
  description: "",
4828
5114
  category: "primitives",
4829
- version: "11.4.1",
5115
+ version: "11.6.0",
4830
5116
  bindings: {
4831
5117
  angular: {
4832
5118
  importPath: "@uni-design-system/uni-angular",
@@ -4929,7 +5215,7 @@ initialFocus="input"
4929
5215
  summary: "A button that lives inside a sentence.",
4930
5216
  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
5217
  category: "primitives",
4932
- version: "11.4.1",
5218
+ version: "11.6.0",
4933
5219
  bindings: {
4934
5220
  angular: {
4935
5221
  importPath: "@uni-design-system/uni-angular",
@@ -5044,7 +5330,7 @@ initialFocus="input"
5044
5330
  summary: "",
5045
5331
  description: "",
5046
5332
  category: "forms",
5047
- version: "11.4.1",
5333
+ version: "11.6.0",
5048
5334
  bindings: {
5049
5335
  angular: {
5050
5336
  importPath: "@uni-design-system/uni-angular",
@@ -5329,7 +5615,7 @@ initialFocus="input"
5329
5615
  summary: "",
5330
5616
  description: "",
5331
5617
  category: "forms",
5332
- version: "11.4.1",
5618
+ version: "11.6.0",
5333
5619
  bindings: {
5334
5620
  angular: {
5335
5621
  importPath: "@uni-design-system/uni-angular",
@@ -5450,7 +5736,7 @@ initialFocus="input"
5450
5736
  summary: "",
5451
5737
  description: "",
5452
5738
  category: "components",
5453
- version: "11.4.1",
5739
+ version: "11.6.0",
5454
5740
  bindings: {
5455
5741
  angular: {
5456
5742
  importPath: "@uni-design-system/uni-angular",
@@ -5520,7 +5806,7 @@ initialFocus="input"
5520
5806
  summary: "",
5521
5807
  description: "",
5522
5808
  category: "layout",
5523
- version: "11.4.1",
5809
+ version: "11.6.0",
5524
5810
  bindings: {
5525
5811
  angular: {
5526
5812
  importPath: "@uni-design-system/uni-angular",
@@ -5624,7 +5910,7 @@ initialFocus="input"
5624
5910
  summary: "",
5625
5911
  description: "",
5626
5912
  category: "layout",
5627
- version: "11.4.1",
5913
+ version: "11.6.0",
5628
5914
  bindings: {
5629
5915
  angular: {
5630
5916
  importPath: "@uni-design-system/uni-angular",
@@ -5706,7 +5992,7 @@ initialFocus="input"
5706
5992
  summary: "",
5707
5993
  description: "",
5708
5994
  category: "forms",
5709
- version: "11.4.1",
5995
+ version: "11.6.0",
5710
5996
  bindings: {
5711
5997
  angular: {
5712
5998
  importPath: "@uni-design-system/uni-angular",
@@ -5800,7 +6086,7 @@ initialFocus="input"
5800
6086
  summary: "",
5801
6087
  description: "",
5802
6088
  category: "forms",
5803
- version: "11.4.1",
6089
+ version: "11.6.0",
5804
6090
  bindings: {
5805
6091
  angular: {
5806
6092
  importPath: "@uni-design-system/uni-angular",
@@ -5979,7 +6265,7 @@ initialFocus="input"
5979
6265
  summary: "",
5980
6266
  description: "",
5981
6267
  category: "feedback",
5982
- version: "11.4.1",
6268
+ version: "11.6.0",
5983
6269
  bindings: {
5984
6270
  angular: {
5985
6271
  importPath: "@uni-design-system/uni-angular",
@@ -6239,7 +6525,7 @@ initialFocus="input"
6239
6525
  summary: "",
6240
6526
  description: "",
6241
6527
  category: "feedback",
6242
- version: "11.4.1",
6528
+ version: "11.6.0",
6243
6529
  bindings: {
6244
6530
  angular: {
6245
6531
  importPath: "@uni-design-system/uni-angular",
@@ -6263,7 +6549,7 @@ initialFocus="input"
6263
6549
  summary: "Numeric field with locale-aware parsing, `Intl` formatting on commit, prefix/suffix adornments and steppers that hold to repeat.",
6264
6550
  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
6551
  category: "forms",
6266
- version: "11.4.1",
6552
+ version: "11.6.0",
6267
6553
  bindings: {
6268
6554
  angular: {
6269
6555
  importPath: "@uni-design-system/uni-angular",
@@ -6689,7 +6975,7 @@ initialFocus="input"
6689
6975
  summary: "Two linked numeric fields in one chrome, with one `{ start, end }` value \u2014 price filters, thresholds, tolerances.",
6690
6976
  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
6977
  category: "forms",
6692
- version: "11.4.1",
6978
+ version: "11.6.0",
6693
6979
  bindings: {
6694
6980
  angular: {
6695
6981
  importPath: "@uni-design-system/uni-angular",
@@ -6980,7 +7266,7 @@ initialFocus="input"
6980
7266
  summary: "",
6981
7267
  description: "",
6982
7268
  category: "data",
6983
- version: "11.4.1",
7269
+ version: "11.6.0",
6984
7270
  bindings: {
6985
7271
  angular: {
6986
7272
  importPath: "@uni-design-system/uni-angular",
@@ -7081,7 +7367,7 @@ initialFocus="input"
7081
7367
  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
7368
  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
7369
  category: "layout",
7084
- version: "11.4.1",
7370
+ version: "11.6.0",
7085
7371
  bindings: {
7086
7372
  angular: {
7087
7373
  importPath: "@uni-design-system/uni-angular",
@@ -7273,7 +7559,7 @@ initialFocus="input"
7273
7559
  summary: "",
7274
7560
  description: "",
7275
7561
  category: "feedback",
7276
- version: "11.4.1",
7562
+ version: "11.6.0",
7277
7563
  bindings: {
7278
7564
  angular: {
7279
7565
  importPath: "@uni-design-system/uni-angular",
@@ -7337,7 +7623,7 @@ initialFocus="input"
7337
7623
  summary: "",
7338
7624
  description: "",
7339
7625
  category: "feedback",
7340
- version: "11.4.1",
7626
+ version: "11.6.0",
7341
7627
  bindings: {
7342
7628
  angular: {
7343
7629
  importPath: "@uni-design-system/uni-angular",
@@ -7409,7 +7695,7 @@ initialFocus="input"
7409
7695
  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
7696
  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
7697
  category: "forms",
7412
- version: "11.4.1",
7698
+ version: "11.6.0",
7413
7699
  bindings: {
7414
7700
  angular: {
7415
7701
  importPath: "@uni-design-system/uni-angular",
@@ -7612,7 +7898,7 @@ initialFocus="input"
7612
7898
  summary: "",
7613
7899
  description: "",
7614
7900
  category: "forms",
7615
- version: "11.4.1",
7901
+ version: "11.6.0",
7616
7902
  bindings: {
7617
7903
  angular: {
7618
7904
  importPath: "@uni-design-system/uni-angular",
@@ -7841,7 +8127,7 @@ initialFocus="input"
7841
8127
  summary: "Content for each of a radio group's options, in place of the plain label string.",
7842
8128
  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
8129
  category: "forms",
7844
- version: "11.4.1",
8130
+ version: "11.6.0",
7845
8131
  bindings: {
7846
8132
  angular: {
7847
8133
  importPath: "@uni-design-system/uni-angular",
@@ -7865,7 +8151,7 @@ initialFocus="input"
7865
8151
  summary: "",
7866
8152
  description: "",
7867
8153
  category: "directives",
7868
- version: "11.4.1",
8154
+ version: "11.6.0",
7869
8155
  bindings: {
7870
8156
  angular: {
7871
8157
  importPath: "@uni-design-system/uni-angular",
@@ -7889,7 +8175,7 @@ initialFocus="input"
7889
8175
  summary: "",
7890
8176
  description: "",
7891
8177
  category: "layout",
7892
- version: "11.4.1",
8178
+ version: "11.6.0",
7893
8179
  bindings: {
7894
8180
  angular: {
7895
8181
  importPath: "@uni-design-system/uni-angular",
@@ -7944,7 +8230,7 @@ initialFocus="input"
7944
8230
  summary: "Native scroll area with theme-driven scrollbar styling.",
7945
8231
  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
8232
  category: "layout",
7947
- version: "11.4.1",
8233
+ version: "11.6.0",
7948
8234
  bindings: {
7949
8235
  angular: {
7950
8236
  importPath: "@uni-design-system/uni-angular",
@@ -8091,7 +8377,7 @@ initialFocus="input"
8091
8377
  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
8378
  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
8379
  category: "forms",
8094
- version: "11.4.1",
8380
+ version: "11.6.0",
8095
8381
  bindings: {
8096
8382
  angular: {
8097
8383
  importPath: "@uni-design-system/uni-angular",
@@ -8135,6 +8421,14 @@ initialFocus="input"
8135
8421
  default: "[]",
8136
8422
  description: "Type-ahead entries. Keep them fresh from `change` emissions; the list shows while the field has focus and entries exist."
8137
8423
  },
8424
+ {
8425
+ name: "openOnFocus",
8426
+ kind: "input",
8427
+ type: "boolean",
8428
+ required: false,
8429
+ default: "false",
8430
+ description: "Show the suggestions on focus and on click, before anything is typed."
8431
+ },
8138
8432
  {
8139
8433
  name: "searchChange",
8140
8434
  kind: "output",
@@ -8218,7 +8512,7 @@ initialFocus="input"
8218
8512
  summary: "",
8219
8513
  description: "",
8220
8514
  category: "forms",
8221
- version: "11.4.1",
8515
+ version: "11.6.0",
8222
8516
  bindings: {
8223
8517
  angular: {
8224
8518
  importPath: "@uni-design-system/uni-angular",
@@ -8388,7 +8682,7 @@ initialFocus="input"
8388
8682
  summary: "Loading placeholder painted with surface tokens.",
8389
8683
  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
8684
  category: "components",
8391
- version: "11.4.1",
8685
+ version: "11.6.0",
8392
8686
  bindings: {
8393
8687
  angular: {
8394
8688
  importPath: "@uni-design-system/uni-angular",
@@ -8539,7 +8833,7 @@ initialFocus="input"
8539
8833
  summary: "Bounded numeric input by pointer, for values where the *position* is the information: volume, opacity, weightings, price filters.",
8540
8834
  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
8835
  category: "forms",
8542
- version: "11.4.1",
8836
+ version: "11.6.0",
8543
8837
  bindings: {
8544
8838
  angular: {
8545
8839
  importPath: "@uni-design-system/uni-angular",
@@ -8816,7 +9110,7 @@ initialFocus="input"
8816
9110
  summary: "",
8817
9111
  description: "",
8818
9112
  category: "feedback",
8819
- version: "11.4.1",
9113
+ version: "11.6.0",
8820
9114
  bindings: {
8821
9115
  angular: {
8822
9116
  importPath: "@uni-design-system/uni-angular",
@@ -8928,7 +9222,7 @@ initialFocus="input"
8928
9222
  summary: "",
8929
9223
  description: "",
8930
9224
  category: "data",
8931
- version: "11.4.1",
9225
+ version: "11.6.0",
8932
9226
  bindings: {
8933
9227
  angular: {
8934
9228
  importPath: "@uni-design-system/uni-angular",
@@ -8987,7 +9281,7 @@ initialFocus="input"
8987
9281
  summary: "",
8988
9282
  description: "",
8989
9283
  category: "layout",
8990
- version: "11.4.1",
9284
+ version: "11.6.0",
8991
9285
  bindings: {
8992
9286
  angular: {
8993
9287
  importPath: "@uni-design-system/uni-angular",
@@ -9042,7 +9336,7 @@ initialFocus="input"
9042
9336
  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
9337
  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
9338
  category: "components",
9045
- version: "11.4.1",
9339
+ version: "11.6.0",
9046
9340
  bindings: {
9047
9341
  angular: {
9048
9342
  importPath: "@uni-design-system/uni-angular",
@@ -9160,7 +9454,7 @@ initialFocus="input"
9160
9454
  summary: "",
9161
9455
  description: "",
9162
9456
  category: "primitives",
9163
- version: "11.4.1",
9457
+ version: "11.6.0",
9164
9458
  bindings: {
9165
9459
  angular: {
9166
9460
  importPath: "@uni-design-system/uni-angular",
@@ -9249,7 +9543,7 @@ initialFocus="input"
9249
9543
  summary: "One tab inside `uni-tabs`: a label for the tablist plus projected panel content.",
9250
9544
  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
9545
  category: "components",
9252
- version: "11.4.1",
9546
+ version: "11.6.0",
9253
9547
  bindings: {
9254
9548
  angular: {
9255
9549
  importPath: "@uni-design-system/uni-angular",
@@ -9287,9 +9581,9 @@ initialFocus="input"
9287
9581
  name: "Tabs",
9288
9582
  status: "stable",
9289
9583
  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.",
9584
+ 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
9585
  category: "components",
9292
- version: "11.4.1",
9586
+ version: "11.6.0",
9293
9587
  bindings: {
9294
9588
  angular: {
9295
9589
  importPath: "@uni-design-system/uni-angular",
@@ -9326,16 +9620,21 @@ initialFocus="input"
9326
9620
  {
9327
9621
  title: "Default",
9328
9622
  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>'
9623
+ 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>'
9624
+ },
9625
+ {
9626
+ title: "Uneven Panels",
9627
+ framework: "angular",
9628
+ 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
9629
  },
9331
9630
  {
9332
9631
  title: "With Disabled Tab",
9333
9632
  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>'
9633
+ 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
9634
  }
9336
9635
  ],
9337
9636
  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.",
9637
+ 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
9638
  dos: [
9340
9639
  "Use for peer views of the same subject (details, activity, settings)",
9341
9640
  "Keep labels to one or two words"
@@ -9347,11 +9646,13 @@ initialFocus="input"
9347
9646
  accessibility: [
9348
9647
  "Full WAI-ARIA tabs pattern: `tablist`/`tab`/`tabpanel` roles with wired",
9349
9648
  "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"
9649
+ "Roving tabindex: only the selected tab sits in the tab order; the panel itself is",
9650
+ "The panel animation is skipped under `prefers-reduced-motion`."
9351
9651
  ]
9352
9652
  },
9353
9653
  relatedTokens: [
9354
9654
  "tabs.behavior.motion",
9655
+ "tabs.behavior.panelMotion",
9355
9656
  "tabs.behavior.typeface",
9356
9657
  "tabs.behavior.textColor",
9357
9658
  "tabs.behavior.activeTextColor",
@@ -9370,7 +9671,7 @@ initialFocus="input"
9370
9671
  summary: "Compact chip for categories, states, filters and tokens.",
9371
9672
  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
9673
  category: "data",
9373
- version: "11.4.1",
9674
+ version: "11.6.0",
9374
9675
  bindings: {
9375
9676
  angular: {
9376
9677
  importPath: "@uni-design-system/uni-angular",
@@ -9748,7 +10049,7 @@ initialFocus="input"
9748
10049
  summary: "A row of chips the user picks from: filters, facets, a set of labels.",
9749
10050
  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
10051
  category: "data",
9751
- version: "11.4.1",
10052
+ version: "11.6.0",
9752
10053
  bindings: {
9753
10054
  angular: {
9754
10055
  importPath: "@uni-design-system/uni-angular",
@@ -9946,7 +10247,7 @@ initialFocus="input"
9946
10247
  summary: "",
9947
10248
  description: "",
9948
10249
  category: "forms",
9949
- version: "11.4.1",
10250
+ version: "11.6.0",
9950
10251
  bindings: {
9951
10252
  angular: {
9952
10253
  importPath: "@uni-design-system/uni-angular",
@@ -10069,19 +10370,49 @@ initialFocus="input"
10069
10370
  description: ""
10070
10371
  },
10071
10372
  {
10072
- name: "tagVariant",
10373
+ name: "unframed",
10073
10374
  kind: "input",
10074
- type: "Variant",
10375
+ type: "unknown",
10075
10376
  required: false,
10076
- default: "'primary'",
10077
- description: ""
10377
+ default: "false, { transform: booleanAttribute }",
10378
+ description: "Drop the field chrome (border, fill, inset) and render the bare chip row \u2014 an email client's To line. The surrounding layout draws any hairline and focus cue; the error state is still exposed through `aria-invalid`."
10078
10379
  },
10079
10380
  {
10080
- name: "tagTone",
10381
+ name: "backspaceRemoves",
10081
10382
  kind: "input",
10082
- type: "TagTone",
10383
+ type: "boolean",
10384
+ required: false,
10385
+ default: "false",
10386
+ description: "Backspace in an empty field removes the last tag outright, as mail clients do. Off by default: the two-step (focus the chip, then remove) never deletes blind."
10387
+ },
10388
+ {
10389
+ name: "keepInvalidText",
10390
+ kind: "input",
10391
+ type: "boolean",
10392
+ required: false,
10393
+ default: "false",
10394
+ description: "Refuse a draft that fails validation instead of committing it as a flagged chip: the text stays in the field to be fixed and `rejected` fires with `reason: 'invalid'`."
10395
+ },
10396
+ {
10397
+ name: "autocomplete",
10398
+ kind: "input",
10399
+ type: "string",
10400
+ required: false,
10401
+ default: "'off'",
10402
+ description: "The text field's `autocomplete` token. The field has its own suggestion list, so browser autofill is off by default and password managers are told to skip it. Chrome can still ignore `off` on a field it takes for an email or address; pass another token if its dropdown competes with yours."
10403
+ },
10404
+ {
10405
+ name: "tagVariant",
10406
+ kind: "input",
10407
+ type: "Variant",
10408
+ required: false,
10409
+ description: ""
10410
+ },
10411
+ {
10412
+ name: "tagTone",
10413
+ kind: "input",
10414
+ type: "TagTone",
10083
10415
  required: false,
10084
- default: "'soft'",
10085
10416
  description: ""
10086
10417
  },
10087
10418
  {
@@ -10114,6 +10445,29 @@ initialFocus="input"
10114
10445
  default: "250",
10115
10446
  description: ""
10116
10447
  },
10448
+ {
10449
+ name: "openOnFocus",
10450
+ kind: "input",
10451
+ type: "boolean",
10452
+ required: false,
10453
+ default: "false",
10454
+ description: "Show the suggestions on focus and on click, before anything is typed."
10455
+ },
10456
+ {
10457
+ name: "autoHighlight",
10458
+ kind: "input",
10459
+ type: "boolean",
10460
+ required: false,
10461
+ default: "false",
10462
+ description: "Keep the first suggestion active while the list is open, so Enter or Tab picks it without arrowing. A draft that is already valid under the field's validator still commits as typed."
10463
+ },
10464
+ {
10465
+ name: "draftChange",
10466
+ kind: "output",
10467
+ type: "string",
10468
+ required: false,
10469
+ description: "Uncommitted text, on every change and undebounced (cf. `query`)."
10470
+ },
10117
10471
  {
10118
10472
  name: "added",
10119
10473
  kind: "output",
@@ -10260,6 +10614,62 @@ placeholder="Name or address\u2026"
10260
10614
  />
10261
10615
  <!-- args:
10262
10616
  { disabled: true, value: [{ value: 'alpha' }, { value: 'beta' }] }
10617
+ -->`
10618
+ },
10619
+ {
10620
+ title: "Grouped Suggestions",
10621
+ framework: "angular",
10622
+ code: `<!-- Storybook story: Grouped Suggestions -->
10623
+ <uni-tag-input
10624
+ label="To"
10625
+ preset="email"
10626
+ placeholder="Name or address\u2026"
10627
+ [openOnFocus]="true"
10628
+ [suggestions]="suggestions"
10629
+ />
10630
+ <!-- args:
10631
+ {
10632
+ unframed: true,
10633
+ preset: 'email',
10634
+ value: [{ value: 'alice@uni.dev', label: 'Alice Chen', avatarName: 'Alice Chen' }],
10635
+ }
10636
+ -->`
10637
+ },
10638
+ {
10639
+ title: "Suggestion Template",
10640
+ framework: "angular",
10641
+ code: `<!-- Storybook story: Suggestion Template -->
10642
+ <uni-tag-input label="To" preset="email" [openOnFocus]="true" [suggestions]="suggestions">
10643
+ <ng-template uniTagSuggestion let-person let-index="index">
10644
+ {{ index + 1 }}. {{ person.label }} \u2014 {{ person.value }}
10645
+ </ng-template>
10646
+ </uni-tag-input>
10647
+ <!-- args:
10648
+ {
10649
+ unframed: true,
10650
+ preset: 'email',
10651
+ value: [{ value: 'alice@uni.dev', label: 'Alice Chen', avatarName: 'Alice Chen' }],
10652
+ }
10653
+ -->`
10654
+ },
10655
+ {
10656
+ title: "Unframed",
10657
+ framework: "angular",
10658
+ code: `<!-- Storybook story: Unframed -->
10659
+ <uni-tag-input
10660
+ label="To"
10661
+ preset="email"
10662
+ placeholder="Name or address\u2026"
10663
+ [value]="value"
10664
+ [suggestions]="suggestions"
10665
+ (query)="onQuery($event)"
10666
+ />
10667
+ <!-- args:
10668
+ {
10669
+ unframed: true,
10670
+ preset: 'email',
10671
+ value: [{ value: 'alice@uni.dev', label: 'Alice Chen', avatarName: 'Alice Chen' }],
10672
+ }
10263
10673
  -->`
10264
10674
  }
10265
10675
  ],
@@ -10269,6 +10679,7 @@ placeholder="Name or address\u2026"
10269
10679
  donts: [
10270
10680
  "Don't use it to pick from a closed list \u2014 that is `uni-multi-select-dropdown`.",
10271
10681
  "Don't filter `suggestions` inside the component; drive them from `(query)`.",
10682
+ "Don't rebuild a people picker on it \u2014 `uni-contact-input` already is one.",
10272
10683
  "Don't set `preset=\"email\"` for people's names: Space would split them."
10273
10684
  ],
10274
10685
  accessibility: [
@@ -10287,7 +10698,7 @@ placeholder="Name or address\u2026"
10287
10698
  summary: "The typography primitive, applied as an attribute to any element so semantics stay yours.",
10288
10699
  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
10700
  category: "primitives",
10290
- version: "11.4.1",
10701
+ version: "11.6.0",
10291
10702
  bindings: {
10292
10703
  angular: {
10293
10704
  importPath: "@uni-design-system/uni-angular",
@@ -10397,7 +10808,7 @@ placeholder="Name or address\u2026"
10397
10808
  summary: "",
10398
10809
  description: "",
10399
10810
  category: "forms",
10400
- version: "11.4.1",
10811
+ version: "11.6.0",
10401
10812
  bindings: {
10402
10813
  angular: {
10403
10814
  importPath: "@uni-design-system/uni-angular",
@@ -10604,7 +11015,7 @@ placeholder="Name or address\u2026"
10604
11015
  summary: "",
10605
11016
  description: "",
10606
11017
  category: "primitives",
10607
- version: "11.4.1",
11018
+ version: "11.6.0",
10608
11019
  bindings: {
10609
11020
  angular: {
10610
11021
  importPath: "@uni-design-system/uni-angular",
@@ -10634,7 +11045,7 @@ placeholder="Name or address\u2026"
10634
11045
  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
11046
  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
11047
  category: "components",
10637
- version: "11.4.1",
11048
+ version: "11.6.0",
10638
11049
  bindings: {
10639
11050
  angular: {
10640
11051
  importPath: "@uni-design-system/uni-angular",
@@ -10692,7 +11103,7 @@ placeholder="Name or address\u2026"
10692
11103
  summary: "Time field: a combobox over time options \u2014 the same listbox contract as uni-search-input and uni-tag-input.",
10693
11104
  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
11105
  category: "forms",
10695
- version: "11.4.1",
11106
+ version: "11.6.0",
10696
11107
  bindings: {
10697
11108
  angular: {
10698
11109
  importPath: "@uni-design-system/uni-angular",
@@ -10907,7 +11318,7 @@ placeholder="Name or address\u2026"
10907
11318
  summary: "",
10908
11319
  description: "",
10909
11320
  category: "forms",
10910
- version: "11.4.1",
11321
+ version: "11.6.0",
10911
11322
  bindings: {
10912
11323
  angular: {
10913
11324
  importPath: "@uni-design-system/uni-angular",
@@ -11169,7 +11580,7 @@ placeholder="Name or address\u2026"
11169
11580
  summary: "",
11170
11581
  description: "",
11171
11582
  category: "feedback",
11172
- version: "11.4.1",
11583
+ version: "11.6.0",
11173
11584
  bindings: {
11174
11585
  angular: {
11175
11586
  importPath: "@uni-design-system/uni-angular",
@@ -11257,7 +11668,7 @@ placeholder="Name or address\u2026"
11257
11668
  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
11669
  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
11670
  category: "components",
11260
- version: "11.4.1",
11671
+ version: "11.6.0",
11261
11672
  bindings: {
11262
11673
  angular: {
11263
11674
  importPath: "@uni-design-system/uni-angular",
@@ -11384,7 +11795,7 @@ placeholder="Name or address\u2026"
11384
11795
  summary: "",
11385
11796
  description: "",
11386
11797
  category: "layout",
11387
- version: "11.4.1",
11798
+ version: "11.6.0",
11388
11799
  bindings: {
11389
11800
  angular: {
11390
11801
  importPath: "@uni-design-system/uni-angular",
@@ -15054,6 +15465,18 @@ placeholder="Name or address\u2026"
15054
15465
  DarkTheme: "snap"
15055
15466
  }
15056
15467
  },
15468
+ {
15469
+ id: "tabs.behavior.panelMotion",
15470
+ value: "panel",
15471
+ type: "string",
15472
+ kind: "behavioral",
15473
+ target: "component-prop",
15474
+ appliesTo: "tabs",
15475
+ themeValues: {
15476
+ LightTheme: "panel",
15477
+ DarkTheme: "panel"
15478
+ }
15479
+ },
15057
15480
  {
15058
15481
  id: "tabs.behavior.typeface",
15059
15482
  value: "title-small",
@@ -15390,6 +15813,30 @@ placeholder="Name or address\u2026"
15390
15813
  DarkTheme: "md"
15391
15814
  }
15392
15815
  },
15816
+ {
15817
+ id: "tagInput.behavior.chipVariant",
15818
+ value: "primary",
15819
+ type: "string",
15820
+ kind: "behavioral",
15821
+ target: "component-prop",
15822
+ appliesTo: "tagInput",
15823
+ themeValues: {
15824
+ LightTheme: "primary",
15825
+ DarkTheme: "primary"
15826
+ }
15827
+ },
15828
+ {
15829
+ id: "tagInput.behavior.chipTone",
15830
+ value: "soft",
15831
+ type: "string",
15832
+ kind: "behavioral",
15833
+ target: "component-prop",
15834
+ appliesTo: "tagInput",
15835
+ themeValues: {
15836
+ LightTheme: "soft",
15837
+ DarkTheme: "soft"
15838
+ }
15839
+ },
15393
15840
  {
15394
15841
  id: "tagInput.behavior.minInputWidth",
15395
15842
  value: "12ch",
@@ -15462,6 +15909,102 @@ placeholder="Name or address\u2026"
15462
15909
  DarkTheme: 8
15463
15910
  }
15464
15911
  },
15912
+ {
15913
+ id: "tagInput.behavior.typeface",
15914
+ value: "label",
15915
+ type: "string",
15916
+ kind: "behavioral",
15917
+ target: "component-prop",
15918
+ appliesTo: "tagInput",
15919
+ themeValues: {
15920
+ LightTheme: "label",
15921
+ DarkTheme: "label"
15922
+ }
15923
+ },
15924
+ {
15925
+ id: "tagInput.behavior.headingTypeface",
15926
+ value: "caption",
15927
+ type: "string",
15928
+ kind: "behavioral",
15929
+ target: "component-prop",
15930
+ appliesTo: "tagInput",
15931
+ themeValues: {
15932
+ LightTheme: "caption",
15933
+ DarkTheme: "caption"
15934
+ }
15935
+ },
15936
+ {
15937
+ id: "tagInput.behavior.listWidth",
15938
+ value: "anchor",
15939
+ type: "string",
15940
+ kind: "behavioral",
15941
+ target: "component-prop",
15942
+ appliesTo: "tagInput",
15943
+ themeValues: {
15944
+ LightTheme: "anchor",
15945
+ DarkTheme: "anchor"
15946
+ }
15947
+ },
15948
+ {
15949
+ id: "contactInput.behavior.avatarSize",
15950
+ value: "md",
15951
+ type: "string",
15952
+ kind: "behavioral",
15953
+ target: "component-prop",
15954
+ appliesTo: "contactInput",
15955
+ themeValues: {
15956
+ LightTheme: "md",
15957
+ DarkTheme: "md"
15958
+ }
15959
+ },
15960
+ {
15961
+ id: "contactInput.behavior.avatarVariant",
15962
+ value: "primary",
15963
+ type: "string",
15964
+ kind: "behavioral",
15965
+ target: "component-prop",
15966
+ appliesTo: "contactInput",
15967
+ themeValues: {
15968
+ LightTheme: "primary",
15969
+ DarkTheme: "primary"
15970
+ }
15971
+ },
15972
+ {
15973
+ id: "contactInput.behavior.nameTypeface",
15974
+ value: "body-2-short",
15975
+ type: "string",
15976
+ kind: "behavioral",
15977
+ target: "component-prop",
15978
+ appliesTo: "contactInput",
15979
+ themeValues: {
15980
+ LightTheme: "body-2-short",
15981
+ DarkTheme: "body-2-short"
15982
+ }
15983
+ },
15984
+ {
15985
+ id: "contactInput.behavior.detailTypeface",
15986
+ value: "caption",
15987
+ type: "string",
15988
+ kind: "behavioral",
15989
+ target: "component-prop",
15990
+ appliesTo: "contactInput",
15991
+ themeValues: {
15992
+ LightTheme: "caption",
15993
+ DarkTheme: "caption"
15994
+ }
15995
+ },
15996
+ {
15997
+ id: "contactInput.behavior.rowGap",
15998
+ value: "sm",
15999
+ type: "string",
16000
+ kind: "behavioral",
16001
+ target: "component-prop",
16002
+ appliesTo: "contactInput",
16003
+ themeValues: {
16004
+ LightTheme: "sm",
16005
+ DarkTheme: "sm"
16006
+ }
16007
+ },
15465
16008
  {
15466
16009
  id: "calendar.behavior.dayBorderRadius",
15467
16010
  value: "max",
@@ -17580,6 +18123,7 @@ placeholder="Name or address\u2026"
17580
18123
  },
17581
18124
  tabs: {
17582
18125
  motion: "snap",
18126
+ panelMotion: "panel",
17583
18127
  typeface: "title-small",
17584
18128
  textColor: "on-surface-variant",
17585
18129
  activeTextColor: "primary",
@@ -17618,12 +18162,24 @@ placeholder="Name or address\u2026"
17618
18162
  tagInput: {
17619
18163
  chipGap: "xs",
17620
18164
  chipSize: "md",
18165
+ chipVariant: "primary",
18166
+ chipTone: "soft",
17621
18167
  minInputWidth: "12ch",
17622
18168
  listColor: "primary-surface",
17623
18169
  listShadow: "menu",
17624
18170
  listBorderRadius: "xs",
17625
18171
  activeColor: "primary-container",
17626
- maxSuggestions: 8
18172
+ maxSuggestions: 8,
18173
+ typeface: "label",
18174
+ headingTypeface: "caption",
18175
+ listWidth: "anchor"
18176
+ },
18177
+ contactInput: {
18178
+ avatarSize: "md",
18179
+ avatarVariant: "primary",
18180
+ nameTypeface: "body-2-short",
18181
+ detailTypeface: "caption",
18182
+ rowGap: "sm"
17627
18183
  },
17628
18184
  calendar: {
17629
18185
  dayBorderRadius: "max",
@@ -18193,6 +18749,7 @@ placeholder="Name or address\u2026"
18193
18749
  },
18194
18750
  tabs: {
18195
18751
  motion: "snap",
18752
+ panelMotion: "panel",
18196
18753
  typeface: "title-small",
18197
18754
  textColor: "on-surface-variant",
18198
18755
  activeTextColor: "primary",
@@ -18231,12 +18788,24 @@ placeholder="Name or address\u2026"
18231
18788
  tagInput: {
18232
18789
  chipGap: "xs",
18233
18790
  chipSize: "md",
18791
+ chipVariant: "primary",
18792
+ chipTone: "soft",
18234
18793
  minInputWidth: "12ch",
18235
18794
  listColor: "primary-surface",
18236
18795
  listShadow: "menu",
18237
18796
  listBorderRadius: "xs",
18238
18797
  activeColor: "primary-container",
18239
- maxSuggestions: 8
18798
+ maxSuggestions: 8,
18799
+ typeface: "label",
18800
+ headingTypeface: "caption",
18801
+ listWidth: "anchor"
18802
+ },
18803
+ contactInput: {
18804
+ avatarSize: "md",
18805
+ avatarVariant: "primary",
18806
+ nameTypeface: "body-2-short",
18807
+ detailTypeface: "caption",
18808
+ rowGap: "sm"
18240
18809
  },
18241
18810
  calendar: {
18242
18811
  dayBorderRadius: "max",
@@ -18435,6 +19004,42 @@ placeholder="Name or address\u2026"
18435
19004
  {
18436
19005
  package: "@uni-design-system/uni-angular",
18437
19006
  releases: [
19007
+ {
19008
+ version: "11.6.0",
19009
+ entries: [
19010
+ {
19011
+ bump: "minor",
19012
+ title: "Add `uni-contact-input`, a recipient field for picking people, and close the gaps that kept `uni-tag-input` from being an email client's To row.",
19013
+ body: "- **`uni-contact-input`** (new): chips plus a contact list that opens on focus, filters by name or address, groups under headings, and draws each row as a person (avatar, name, address, note). ArrowDown and Enter pick a match (`autoHighlight` makes Enter or Tab pick the first one without arrowing), Backspace removes the last person, and a typo stays in the field while `(rejected)` reports it. `allowCustom` controls whether typed addresses are accepted; `unframed` drops the field chrome. Themed through the new `contactInput` entry.\n- **`uni-tag-input`**: `uniTagSuggestion` row template; `group` headings and `avatarName` on suggestions; `openOnFocus`, `autoHighlight`, `backspaceRemoves`, `keepInvalidText`, `unframed` and `autocomplete` inputs; an undebounced `draftChange` output; a public `focus()`; `chipVariant` and `chipTone` theme options, so a theme sets the chip look once (`tagVariant` / `tagTone` still override per field). The default suggestion row now paints `description` (previously screen-reader only) and an avatar when one is given. The field opts out of password managers, and the first Escape that closes the list no longer reaches an enclosing dialog.\n- **Listbox popups** (`tagInput`, `combobox`, `searchInput`, `timeInput`): `typeface` and `listWidth` theme options. Defaults are unchanged (`label`, field width).\n- **`uni-combobox`, `uni-search-input`**: `openOnFocus` input.\n- **`uni-tag`**: an avatar image that fails to load now falls back to the `avatarName` initials.",
19014
+ commit: "3a41065"
19015
+ }
19016
+ ],
19017
+ dependencyBumps: []
19018
+ },
19019
+ {
19020
+ version: "11.5.0",
19021
+ entries: [
19022
+ {
19023
+ bump: "minor",
19024
+ title: "New CDK utility: `copyToClipboard`, for text and rich content.",
19025
+ 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.",
19026
+ commit: "a5e4bd0"
19027
+ },
19028
+ {
19029
+ bump: "minor",
19030
+ title: "`uni-tabs` softens a tab switch: the incoming panel fades in while the panel animates between the two contents' heights.",
19031
+ 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.",
19032
+ commit: "ec2cc45"
19033
+ },
19034
+ {
19035
+ bump: "patch",
19036
+ title: "`uni-tabs` no longer pads its panel.",
19037
+ 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.",
19038
+ commit: "9a51a28"
19039
+ }
19040
+ ],
19041
+ dependencyBumps: []
19042
+ },
18438
19043
  {
18439
19044
  version: "11.4.1",
18440
19045
  entries: [
@@ -19357,6 +19962,30 @@ placeholder="Name or address\u2026"
19357
19962
  {
19358
19963
  package: "@uni-design-system/uni-core",
19359
19964
  releases: [
19965
+ {
19966
+ version: "11.6.0",
19967
+ entries: [
19968
+ {
19969
+ bump: "minor",
19970
+ title: "Add `uni-contact-input`, a recipient field for picking people, and close the gaps that kept `uni-tag-input` from being an email client's To row.",
19971
+ body: "- **`uni-contact-input`** (new): chips plus a contact list that opens on focus, filters by name or address, groups under headings, and draws each row as a person (avatar, name, address, note). ArrowDown and Enter pick a match (`autoHighlight` makes Enter or Tab pick the first one without arrowing), Backspace removes the last person, and a typo stays in the field while `(rejected)` reports it. `allowCustom` controls whether typed addresses are accepted; `unframed` drops the field chrome. Themed through the new `contactInput` entry.\n- **`uni-tag-input`**: `uniTagSuggestion` row template; `group` headings and `avatarName` on suggestions; `openOnFocus`, `autoHighlight`, `backspaceRemoves`, `keepInvalidText`, `unframed` and `autocomplete` inputs; an undebounced `draftChange` output; a public `focus()`; `chipVariant` and `chipTone` theme options, so a theme sets the chip look once (`tagVariant` / `tagTone` still override per field). The default suggestion row now paints `description` (previously screen-reader only) and an avatar when one is given. The field opts out of password managers, and the first Escape that closes the list no longer reaches an enclosing dialog.\n- **Listbox popups** (`tagInput`, `combobox`, `searchInput`, `timeInput`): `typeface` and `listWidth` theme options. Defaults are unchanged (`label`, field width).\n- **`uni-combobox`, `uni-search-input`**: `openOnFocus` input.\n- **`uni-tag`**: an avatar image that fails to load now falls back to the `avatarName` initials.",
19972
+ commit: "3a41065"
19973
+ }
19974
+ ],
19975
+ dependencyBumps: []
19976
+ },
19977
+ {
19978
+ version: "11.5.0",
19979
+ entries: [
19980
+ {
19981
+ bump: "minor",
19982
+ title: "`uni-tabs` softens a tab switch: the incoming panel fades in while the panel animates between the two contents' heights.",
19983
+ 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.",
19984
+ commit: "ec2cc45"
19985
+ }
19986
+ ],
19987
+ dependencyBumps: []
19988
+ },
19360
19989
  {
19361
19990
  version: "11.4.1",
19362
19991
  entries: [],
@@ -20016,6 +20645,16 @@ placeholder="Name or address\u2026"
20016
20645
  {
20017
20646
  package: "@uni-design-system/uni-react",
20018
20647
  releases: [
20648
+ {
20649
+ version: "11.6.0",
20650
+ entries: [],
20651
+ dependencyBumps: []
20652
+ },
20653
+ {
20654
+ version: "11.5.0",
20655
+ entries: [],
20656
+ dependencyBumps: []
20657
+ },
20019
20658
  {
20020
20659
  version: "11.4.1",
20021
20660
  entries: [],
@@ -20317,6 +20956,23 @@ placeholder="Name or address\u2026"
20317
20956
  {
20318
20957
  package: "@uni-design-system/uni-mcp",
20319
20958
  releases: [
20959
+ {
20960
+ version: "11.6.0",
20961
+ entries: [],
20962
+ dependencyBumps: []
20963
+ },
20964
+ {
20965
+ version: "11.5.0",
20966
+ entries: [
20967
+ {
20968
+ bump: "minor",
20969
+ title: "The MCP now covers the CDK \u2014 the non-visual half of `uni-angular`.",
20970
+ 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.",
20971
+ commit: "42aee9e"
20972
+ }
20973
+ ],
20974
+ dependencyBumps: []
20975
+ },
20320
20976
  {
20321
20977
  version: "11.4.1",
20322
20978
  entries: [],
@@ -20557,15 +21213,2794 @@ placeholder="Name or address\u2026"
20557
21213
  }
20558
21214
  ]
20559
21215
  }
20560
- ]
20561
- };
20562
-
20563
- // src/server/store.ts
20564
- var index = uni_index_default;
20565
- var meta = index.meta;
20566
- function frameworksFor(c) {
20567
- return Object.keys(c.bindings);
20568
- }
21216
+ ],
21217
+ utilities: [
21218
+ {
21219
+ id: "unique-id",
21220
+ name: "uniqueId",
21221
+ kind: "function",
21222
+ module: "a11y",
21223
+ importPath: "@uni-design-system/uni-angular",
21224
+ signature: "function uniqueId(prefix = 'uni'): string",
21225
+ summary: "Returns a document-unique id for wiring ARIA relationships (aria-controls, aria-describedby, aria-labelledby, ...).",
21226
+ description: "Returns a document-unique id for wiring ARIA relationships (aria-controls, aria-describedby, aria-labelledby, ...).",
21227
+ members: [],
21228
+ version: "11.6.0"
21229
+ },
21230
+ {
21231
+ id: "focusable-selector",
21232
+ name: "FOCUSABLE_SELECTOR",
21233
+ kind: "const",
21234
+ module: "a11y",
21235
+ importPath: "@uni-design-system/uni-angular",
21236
+ signature: `const FOCUSABLE_SELECTOR = 'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'`,
21237
+ summary: "Selector matching natively focusable elements.",
21238
+ description: "Selector matching natively focusable elements. Used to locate the interactive element inside a projected trigger so ARIA attributes land on the element that actually receives focus.",
21239
+ members: [],
21240
+ version: "11.6.0"
21241
+ },
21242
+ {
21243
+ id: "resolve-focus-target",
21244
+ name: "resolveFocusTarget",
21245
+ kind: "function",
21246
+ module: "a11y",
21247
+ importPath: "@uni-design-system/uni-angular",
21248
+ signature: "function resolveFocusTarget(element: HTMLElement): HTMLElement",
21249
+ summary: "Resolves the element that should carry ARIA state for a trigger: the element itself when focusable, otherwise its first focusable descendant.",
21250
+ description: "Resolves the element that should carry ARIA state for a trigger: the element itself when focusable, otherwise its first focusable descendant.",
21251
+ members: [],
21252
+ version: "11.6.0"
21253
+ },
21254
+ {
21255
+ id: "visually-hidden",
21256
+ name: "visuallyHidden",
21257
+ kind: "const",
21258
+ module: "a11y",
21259
+ importPath: "@uni-design-system/uni-angular",
21260
+ signature: "const visuallyHidden = { position: 'fixed', width: 1, height: 1, padding: 0, margin: -1, overflow: 'hid\u2026",
21261
+ summary: "Visually hides content while keeping it available to screen readers.",
21262
+ description: "Visually hides content while keeping it available to screen readers. Use for text alternatives (e.g. badge counts, icon-only affordances). `fixed`, not `absolute`, and that is load-bearing. An absolutely positioned box resolves its containing block to the nearest *positioned* ancestor \u2014 which, since the controls emitting these spans are `position: static`, is whatever positioned box happens to be above them in the consumer's layout, often several scroll containers up. The span then skips every intervening `overflow: auto` and lands in that distant ancestor's scrollable overflow, turning 1x1 of invisible text into real scrollable distance in a box that never opted into scrolling. A fixed box's containing block is the viewport, so it joins no ancestor's scrollable overflow at all. Caveat: inside a `transform`ed (or `filter`ed/`contain`ed) ancestor a fixed box re-anchors to that ancestor. Harmless here \u2014 the element is 1x1 and clipped to nothing, so where it lands never matters, only what it overflows.",
21263
+ members: [],
21264
+ version: "11.6.0"
21265
+ },
21266
+ {
21267
+ id: "motion-safe",
21268
+ name: "motionSafe",
21269
+ kind: "function",
21270
+ module: "a11y",
21271
+ importPath: "@uni-design-system/uni-angular",
21272
+ signature: "function motionSafe<T extends object>(styles: T)",
21273
+ summary: "Wraps animation/transition styles so they only apply when the user has not requested reduced motion (WCAG 2.3.3).",
21274
+ description: "Wraps animation/transition styles so they only apply when the user has not requested reduced motion (WCAG 2.3.3).",
21275
+ members: [],
21276
+ version: "11.6.0"
21277
+ },
21278
+ {
21279
+ id: "announcer",
21280
+ name: "Announcer",
21281
+ kind: "interface",
21282
+ module: "a11y",
21283
+ importPath: "@uni-design-system/uni-angular",
21284
+ signature: "interface Announcer",
21285
+ summary: "",
21286
+ description: "",
21287
+ members: [
21288
+ {
21289
+ name: "message",
21290
+ kind: "property",
21291
+ signature: "readonly message: Signal<string>",
21292
+ 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> ```'
21293
+ },
21294
+ {
21295
+ name: "announce",
21296
+ kind: "method",
21297
+ signature: "announce(text: string): void",
21298
+ description: "Announce `text`, even when it repeats what was just announced."
21299
+ }
21300
+ ],
21301
+ version: "11.6.0"
21302
+ },
21303
+ {
21304
+ id: "create-announcer",
21305
+ name: "createAnnouncer",
21306
+ kind: "function",
21307
+ module: "a11y",
21308
+ importPath: "@uni-design-system/uni-angular",
21309
+ signature: "function createAnnouncer(): Announcer",
21310
+ summary: "A polite live region's text, for the running commentary a form control owes a screen reader: commits, clears, refused entries, result counts \u2014 changes a sighted user sees but that are otherwise silent.",
21311
+ description: "A polite live region's text, for the running commentary a form control owes a screen reader: commits, clears, refused entries, result counts \u2014 changes a sighted user sees but that are otherwise silent. Extracted because five controls (`uni-combobox`, `uni-tag-input`, `uni-time-input`, `uni-date-input`, `uni-calendar`) carried byte-identical copies, including the repeat trick below \u2014 the kind of subtlety that is quietly dropped when the sixth control hand-rolls its own. Announcing the same text twice must still be heard: assistive tech reads a live region when its content *changes*, so setting an identical string is a no-op and the second \"No match.\" would be silent. A trailing space breaks the equality without changing a word of what is read. Successive repeats alternate between the padded and unpadded form, so nothing accumulates. Deliberately holds no DOM and no styling: the region belongs to the component's own template, where its placement and visually-hidden class are already the component's business.",
21312
+ members: [],
21313
+ version: "11.6.0"
21314
+ },
21315
+ {
21316
+ id: "uni-date",
21317
+ name: "UniDate",
21318
+ kind: "type",
21319
+ module: "datetime",
21320
+ importPath: "@uni-design-system/uni-angular",
21321
+ signature: "type UniDate = string",
21322
+ summary: "A calendar date, `'YYYY-MM-DD'`.",
21323
+ description: "A calendar date, `'YYYY-MM-DD'`.",
21324
+ members: [],
21325
+ version: "11.6.0"
21326
+ },
21327
+ {
21328
+ id: "uni-time",
21329
+ name: "UniTime",
21330
+ kind: "type",
21331
+ module: "datetime",
21332
+ importPath: "@uni-design-system/uni-angular",
21333
+ signature: "type UniTime = string",
21334
+ summary: "A wall-clock time, `'HH:mm'` (24-hour).",
21335
+ description: "A wall-clock time, `'HH:mm'` (24-hour). Display format is separate.",
21336
+ members: [],
21337
+ version: "11.6.0"
21338
+ },
21339
+ {
21340
+ id: "uni-date-time",
21341
+ name: "UniDateTime",
21342
+ kind: "type",
21343
+ module: "datetime",
21344
+ importPath: "@uni-design-system/uni-angular",
21345
+ signature: "type UniDateTime = string",
21346
+ summary: "A combined date and time, `'YYYY-MM-DDTHH:mm'`.",
21347
+ description: "A combined date and time, `'YYYY-MM-DDTHH:mm'`.",
21348
+ members: [],
21349
+ version: "11.6.0"
21350
+ },
21351
+ {
21352
+ id: "uni-date-range",
21353
+ name: "UniDateRange",
21354
+ kind: "interface",
21355
+ module: "datetime",
21356
+ importPath: "@uni-design-system/uni-angular",
21357
+ signature: "interface UniDateRange",
21358
+ summary: "A start\u2013end date range.",
21359
+ description: "A start\u2013end date range. Both ends are inclusive.",
21360
+ members: [
21361
+ {
21362
+ name: "start",
21363
+ kind: "property",
21364
+ signature: "start?: UniDate",
21365
+ description: ""
21366
+ },
21367
+ {
21368
+ name: "end",
21369
+ kind: "property",
21370
+ signature: "end?: UniDate",
21371
+ description: ""
21372
+ }
21373
+ ],
21374
+ version: "11.6.0"
21375
+ },
21376
+ {
21377
+ id: "iso-date",
21378
+ name: "isoDate",
21379
+ kind: "function",
21380
+ module: "datetime",
21381
+ importPath: "@uni-design-system/uni-angular",
21382
+ signature: "function isoDate(year: number, month: number, day: number): UniDate",
21383
+ summary: "`(2026, 8, 5)` \u2192 `'2026-08-05'`.",
21384
+ description: "`(2026, 8, 5)` \u2192 `'2026-08-05'`. Does not validate \u2014 see `isValidDate`.",
21385
+ members: [],
21386
+ version: "11.6.0"
21387
+ },
21388
+ {
21389
+ id: "is-valid-date",
21390
+ name: "isValidDate",
21391
+ kind: "function",
21392
+ module: "datetime",
21393
+ importPath: "@uni-design-system/uni-angular",
21394
+ signature: "function isValidDate(year: number, month: number, day: number): UniDate | null",
21395
+ summary: "The ISO date when the parts form a real calendar day, else `null`.",
21396
+ description: "The ISO date when the parts form a real calendar day, else `null`.",
21397
+ members: [],
21398
+ version: "11.6.0"
21399
+ },
21400
+ {
21401
+ id: "days-in-month",
21402
+ name: "daysInMonth",
21403
+ kind: "function",
21404
+ module: "datetime",
21405
+ importPath: "@uni-design-system/uni-angular",
21406
+ signature: "function daysInMonth(year: number, month: number): number",
21407
+ summary: "Days in a month, leap-year aware.",
21408
+ description: "Days in a month, leap-year aware.",
21409
+ members: [],
21410
+ version: "11.6.0"
21411
+ },
21412
+ {
21413
+ id: "add-days",
21414
+ name: "addDays",
21415
+ kind: "function",
21416
+ module: "datetime",
21417
+ importPath: "@uni-design-system/uni-angular",
21418
+ signature: "function addDays(date: UniDate, days: number): UniDate",
21419
+ summary: "",
21420
+ description: "",
21421
+ members: [],
21422
+ version: "11.6.0"
21423
+ },
21424
+ {
21425
+ id: "add-months",
21426
+ name: "addMonths",
21427
+ kind: "function",
21428
+ module: "datetime",
21429
+ importPath: "@uni-design-system/uni-angular",
21430
+ signature: "function addMonths(date: UniDate, months: number): UniDate",
21431
+ summary: "Same day \xB1 n months, clamping the day to the target month's length.",
21432
+ description: "Same day \xB1 n months, clamping the day to the target month's length.",
21433
+ members: [],
21434
+ version: "11.6.0"
21435
+ },
21436
+ {
21437
+ id: "day-of-week",
21438
+ name: "dayOfWeek",
21439
+ kind: "function",
21440
+ module: "datetime",
21441
+ importPath: "@uni-design-system/uni-angular",
21442
+ signature: "function dayOfWeek(date: UniDate): number",
21443
+ summary: "Day of week, 0 = Sunday \u2026 6 = Saturday.",
21444
+ description: "Day of week, 0 = Sunday \u2026 6 = Saturday.",
21445
+ members: [],
21446
+ version: "11.6.0"
21447
+ },
21448
+ {
21449
+ id: "month-of",
21450
+ name: "monthOf",
21451
+ kind: "function",
21452
+ module: "datetime",
21453
+ importPath: "@uni-design-system/uni-angular",
21454
+ signature: "function monthOf(date: UniDate): string",
21455
+ summary: "`'2026-08-20'` \u2192 `'2026-08'`.",
21456
+ description: "`'2026-08-20'` \u2192 `'2026-08'`.",
21457
+ members: [],
21458
+ version: "11.6.0"
21459
+ },
21460
+ {
21461
+ id: "today-iso",
21462
+ name: "todayIso",
21463
+ kind: "function",
21464
+ module: "datetime",
21465
+ importPath: "@uni-design-system/uni-angular",
21466
+ signature: "function todayIso(): UniDate",
21467
+ summary: "Today as a local-wall-clock ISO date (the one place local time matters).",
21468
+ description: "Today as a local-wall-clock ISO date (the one place local time matters).",
21469
+ members: [],
21470
+ version: "11.6.0"
21471
+ },
21472
+ {
21473
+ id: "inclusive-day-count",
21474
+ name: "inclusiveDayCount",
21475
+ kind: "function",
21476
+ module: "datetime",
21477
+ importPath: "@uni-design-system/uni-angular",
21478
+ signature: "function inclusiveDayCount(start: UniDate, end: UniDate): number",
21479
+ summary: "Inclusive day count of a range: `('-20', '-24')` \u2192 5.",
21480
+ description: "Inclusive day count of a range: `('-20', '-24')` \u2192 5.",
21481
+ members: [],
21482
+ version: "11.6.0"
21483
+ },
21484
+ {
21485
+ id: "uni-month-grid-cell",
21486
+ name: "UniMonthGridCell",
21487
+ kind: "interface",
21488
+ module: "datetime",
21489
+ importPath: "@uni-design-system/uni-angular",
21490
+ signature: "interface UniMonthGridCell",
21491
+ summary: "",
21492
+ description: "",
21493
+ members: [
21494
+ {
21495
+ name: "date",
21496
+ kind: "property",
21497
+ signature: "date: UniDate",
21498
+ description: ""
21499
+ },
21500
+ {
21501
+ name: "outside",
21502
+ kind: "property",
21503
+ signature: "outside: boolean",
21504
+ description: "True for leading/trailing cells that belong to the adjacent months."
21505
+ }
21506
+ ],
21507
+ version: "11.6.0"
21508
+ },
21509
+ {
21510
+ id: "build-month-grid",
21511
+ name: "buildMonthGrid",
21512
+ kind: "function",
21513
+ module: "datetime",
21514
+ importPath: "@uni-design-system/uni-angular",
21515
+ signature: "function buildMonthGrid(month: string, weekStart: number): UniMonthGridCell[][]",
21516
+ summary: "The week matrix a calendar renders: full weeks covering `'YYYY-MM'`, starting on `weekStart` (0 = Sunday).",
21517
+ description: "The week matrix a calendar renders: full weeks covering `'YYYY-MM'`, starting on `weekStart` (0 = Sunday). Outside cells are always present so showing or hiding them is a pure render decision.",
21518
+ members: [],
21519
+ version: "11.6.0"
21520
+ },
21521
+ {
21522
+ id: "format-date",
21523
+ name: "formatDate",
21524
+ kind: "function",
21525
+ module: "datetime",
21526
+ importPath: "@uni-design-system/uni-angular",
21527
+ signature: "function formatDate(date: UniDate, locale: string, options: Intl.DateTimeFormatOptions = { dateStyle: 'medium' }): string",
21528
+ summary: "",
21529
+ description: "",
21530
+ members: [],
21531
+ version: "11.6.0"
21532
+ },
21533
+ {
21534
+ id: "format-month-heading",
21535
+ name: "formatMonthHeading",
21536
+ kind: "function",
21537
+ module: "datetime",
21538
+ importPath: "@uni-design-system/uni-angular",
21539
+ signature: "function formatMonthHeading(month: string, locale: string): string",
21540
+ summary: "`'2026-08'` \u2192 `'August 2026'` in the locale.",
21541
+ description: "`'2026-08'` \u2192 `'August 2026'` in the locale.",
21542
+ members: [],
21543
+ version: "11.6.0"
21544
+ },
21545
+ {
21546
+ id: "uni-weekday-name",
21547
+ name: "UniWeekdayName",
21548
+ kind: "interface",
21549
+ module: "datetime",
21550
+ importPath: "@uni-design-system/uni-angular",
21551
+ signature: "interface UniWeekdayName",
21552
+ summary: "",
21553
+ description: "",
21554
+ members: [
21555
+ {
21556
+ name: "label",
21557
+ kind: "property",
21558
+ signature: "label: string",
21559
+ description: "Column label in the requested format ('narrow' | 'short')."
21560
+ },
21561
+ {
21562
+ name: "full",
21563
+ kind: "property",
21564
+ signature: "full: string",
21565
+ description: "Full weekday name, for the columnheader's `abbr`."
21566
+ }
21567
+ ],
21568
+ version: "11.6.0"
21569
+ },
21570
+ {
21571
+ id: "weekday-names",
21572
+ name: "weekdayNames",
21573
+ kind: "const",
21574
+ module: "datetime",
21575
+ importPath: "@uni-design-system/uni-angular",
21576
+ signature: "const weekdayNames = memoize(\u2026)",
21577
+ summary: "Weekday header labels starting at `weekStart` (0 = Sunday).",
21578
+ description: "Weekday header labels starting at `weekStart` (0 = Sunday).",
21579
+ members: [],
21580
+ version: "11.6.0"
21581
+ },
21582
+ {
21583
+ id: "format-time",
21584
+ name: "formatTime",
21585
+ kind: "function",
21586
+ module: "datetime",
21587
+ importPath: "@uni-design-system/uni-angular",
21588
+ signature: "function formatTime(time: UniTime, locale: string, hour12: boolean): string",
21589
+ summary: "`'15:00'` \u2192 `'3:00 PM'` (or `'15:00'` when `hour12` is false).",
21590
+ description: "`'15:00'` \u2192 `'3:00 PM'` (or `'15:00'` when `hour12` is false).",
21591
+ members: [],
21592
+ version: "11.6.0"
21593
+ },
21594
+ {
21595
+ id: "locale-week-start",
21596
+ name: "localeWeekStart",
21597
+ kind: "const",
21598
+ module: "datetime",
21599
+ importPath: "@uni-design-system/uni-angular",
21600
+ signature: "const localeWeekStart = memoize(\u2026)",
21601
+ summary: "The locale's first day of week, 0 = Sunday \u2026 6 = Saturday.",
21602
+ description: "The locale's first day of week, 0 = Sunday \u2026 6 = Saturday. Falls back to Sunday where `Intl.Locale` week info is unavailable.",
21603
+ members: [],
21604
+ version: "11.6.0"
21605
+ },
21606
+ {
21607
+ id: "locale-default-hour12",
21608
+ name: "localeDefaultHour12",
21609
+ kind: "const",
21610
+ module: "datetime",
21611
+ importPath: "@uni-design-system/uni-angular",
21612
+ signature: "const localeDefaultHour12 = memoize(\u2026)",
21613
+ summary: "Whether the locale's default clock is 12-hour.",
21614
+ description: "Whether the locale's default clock is 12-hour.",
21615
+ members: [],
21616
+ version: "11.6.0"
21617
+ },
21618
+ {
21619
+ id: "locale-field-order",
21620
+ name: "localeFieldOrder",
21621
+ kind: "const",
21622
+ module: "datetime",
21623
+ importPath: "@uni-design-system/uni-angular",
21624
+ signature: "const localeFieldOrder = memoize(\u2026)",
21625
+ summary: "The locale's numeric-date field order, e.g.",
21626
+ description: "The locale's numeric-date field order, e.g. en-US \u2192 month, day, year.",
21627
+ members: [],
21628
+ version: "11.6.0"
21629
+ },
21630
+ {
21631
+ id: "locale-month-names",
21632
+ name: "localeMonthNames",
21633
+ kind: "const",
21634
+ module: "datetime",
21635
+ importPath: "@uni-design-system/uni-angular",
21636
+ signature: "const localeMonthNames = memoize(\u2026)",
21637
+ summary: "Long + short month names \u2192 month number, lowercased, dots stripped.",
21638
+ description: "Long + short month names \u2192 month number, lowercased, dots stripped.",
21639
+ members: [],
21640
+ version: "11.6.0"
21641
+ },
21642
+ {
21643
+ id: "locale-date-placeholder",
21644
+ name: "localeDatePlaceholder",
21645
+ kind: "const",
21646
+ module: "datetime",
21647
+ importPath: "@uni-design-system/uni-angular",
21648
+ signature: "const localeDatePlaceholder = memoize(\u2026)",
21649
+ summary: "The locale's digit pattern as a placeholder, e.g.",
21650
+ description: "The locale's digit pattern as a placeholder, e.g. `'MM/DD/YYYY'`.",
21651
+ members: [],
21652
+ version: "11.6.0"
21653
+ },
21654
+ {
21655
+ id: "parse-date-text",
21656
+ name: "parseDateText",
21657
+ kind: "function",
21658
+ module: "datetime",
21659
+ importPath: "@uni-design-system/uni-angular",
21660
+ signature: "function parseDateText(raw: string, locale: string, options: { today?: UniDate } = {}): UniDate | null",
21661
+ summary: "Free-typed date text \u2192 ISO date, or `null` when unreadable.",
21662
+ description: "Free-typed date text \u2192 ISO date, or `null` when unreadable. Accepts, in order: ISO (`2026-08-20`), a month name from the locale's own long/short lists (`aug 20`, `20 aug 2026`, `August 20th`), and locale-numeric text (`8/20/2026`, `20.8.2026`, `08-20`) with the digit order taken from `Intl.DateTimeFormat(locale).formatToParts()`. A missing year resolves to the next occurrence; two-digit years are refused rather than guessed.",
21663
+ members: [],
21664
+ version: "11.6.0"
21665
+ },
21666
+ {
21667
+ id: "parse-time-text",
21668
+ name: "parseTimeText",
21669
+ kind: "function",
21670
+ module: "datetime",
21671
+ importPath: "@uni-design-system/uni-angular",
21672
+ signature: "function parseTimeText(raw: string, hour12: boolean): UniTime | null",
21673
+ summary: "Free-typed time text \u2192 `'HH:mm'`, or `null`.",
21674
+ description: "Free-typed time text \u2192 `'HH:mm'`, or `null`. Accepts `9`, `930`, `9:30`, `9.30`, `9 30`, `3p`, `3pm`, `3 PM`, `15:00`. Bare hours 1\u20137 with no meridiem lean PM when `hour12` \u2014 typing `3` into an appointment field means 15:00, not 03:00.",
21675
+ members: [],
21676
+ version: "11.6.0"
21677
+ },
21678
+ {
21679
+ id: "time-slots",
21680
+ name: "timeSlots",
21681
+ kind: "function",
21682
+ module: "datetime",
21683
+ importPath: "@uni-design-system/uni-angular",
21684
+ signature: "function timeSlots(minuteStep: number, min?: UniTime, max?: UniTime): UniTime[]",
21685
+ summary: "Every `minuteStep` time between `min` and `max` (inclusive bounds).",
21686
+ description: "Every `minuteStep` time between `min` and `max` (inclusive bounds).",
21687
+ members: [],
21688
+ version: "11.6.0"
21689
+ },
21690
+ {
21691
+ id: "split-date-time",
21692
+ name: "splitDateTime",
21693
+ kind: "function",
21694
+ module: "datetime",
21695
+ importPath: "@uni-design-system/uni-angular",
21696
+ signature: "function splitDateTime(value?: UniDateTime): { date?: UniDate; time?: UniTime }",
21697
+ summary: "",
21698
+ description: "",
21699
+ members: [],
21700
+ version: "11.6.0"
21701
+ },
21702
+ {
21703
+ id: "join-date-time",
21704
+ name: "joinDateTime",
21705
+ kind: "function",
21706
+ module: "datetime",
21707
+ importPath: "@uni-design-system/uni-angular",
21708
+ signature: "function joinDateTime(date?: UniDate, time?: UniTime): UniDateTime | undefined",
21709
+ summary: "One combined value only when both parts are present.",
21710
+ description: "One combined value only when both parts are present.",
21711
+ members: [],
21712
+ version: "11.6.0"
21713
+ },
21714
+ {
21715
+ id: "uni-number-range",
21716
+ name: "UniNumberRange",
21717
+ kind: "interface",
21718
+ module: "number",
21719
+ importPath: "@uni-design-system/uni-angular",
21720
+ signature: "interface UniNumberRange",
21721
+ summary: "A start\u2013end numeric range.",
21722
+ description: "A start\u2013end numeric range. Either end alone is a valid value.",
21723
+ members: [
21724
+ {
21725
+ name: "start",
21726
+ kind: "property",
21727
+ signature: "start?: number",
21728
+ description: ""
21729
+ },
21730
+ {
21731
+ name: "end",
21732
+ kind: "property",
21733
+ signature: "end?: number",
21734
+ description: ""
21735
+ }
21736
+ ],
21737
+ version: "11.6.0"
21738
+ },
21739
+ {
21740
+ id: "uni-rounding-mode",
21741
+ name: "UniRoundingMode",
21742
+ kind: "type",
21743
+ module: "number",
21744
+ importPath: "@uni-design-system/uni-angular",
21745
+ signature: "type UniRoundingMode = 'half-up' | 'half-even' | 'ceil' | 'floor' | 'trunc'",
21746
+ summary: "How a tie is resolved when rounding to a fraction-digit count.",
21747
+ description: "How a tie is resolved when rounding to a fraction-digit count. `half-up` is the invoice default (ties away from zero: `1.15` \u2192 `1.2`); `half-even` is banker's rounding, which removes the upward bias across a column of figures (`1.25` \u2192 `1.2`, `1.35` \u2192 `1.4`).",
21748
+ members: [],
21749
+ version: "11.6.0"
21750
+ },
21751
+ {
21752
+ id: "uni-number-preset",
21753
+ name: "UniNumberPreset",
21754
+ kind: "type",
21755
+ module: "number",
21756
+ importPath: "@uni-design-system/uni-angular",
21757
+ signature: "type UniNumberPreset = 'decimal' | 'integer' | 'currency' | 'percent'",
21758
+ summary: "Format archetype.",
21759
+ description: "Format archetype. Supplies decimals, grouping, affix and `inputmode`.",
21760
+ members: [],
21761
+ version: "11.6.0"
21762
+ },
21763
+ {
21764
+ id: "uni-number-grouping",
21765
+ name: "UniNumberGrouping",
21766
+ kind: "type",
21767
+ module: "number",
21768
+ importPath: "@uni-design-system/uni-angular",
21769
+ signature: "type UniNumberGrouping = 'auto' | 'always' | 'min2' | false",
21770
+ summary: "Thousands-separator policy, mapped onto `Intl`'s `useGrouping`.",
21771
+ description: "Thousands-separator policy, mapped onto `Intl`'s `useGrouping`. `min2` \u2014 the default \u2014 groups only from five integer digits, so a year renders `2026` rather than `2,026` while a price still renders `10,000`.",
21772
+ members: [],
21773
+ version: "11.6.0"
21774
+ },
21775
+ {
21776
+ id: "uni-number-reject-reason",
21777
+ name: "UniNumberRejectReason",
21778
+ kind: "type",
21779
+ module: "number",
21780
+ importPath: "@uni-design-system/uni-angular",
21781
+ signature: "type UniNumberRejectReason = 'unparseable' | 'min' | 'max' | 'step' | 'precision' | 'not-integer'",
21782
+ summary: "Why a typed commit was refused.",
21783
+ description: "Why a typed commit was refused. The raw text stays in the field.",
21784
+ members: [],
21785
+ version: "11.6.0"
21786
+ },
21787
+ {
21788
+ id: "uni-number-step-config",
21789
+ name: "UniNumberStepConfig",
21790
+ kind: "interface",
21791
+ module: "number",
21792
+ importPath: "@uni-design-system/uni-angular",
21793
+ signature: "interface UniNumberStepConfig",
21794
+ summary: "Fences and snap grid for `stepDecimal`.",
21795
+ description: "Fences and snap grid for `stepDecimal`.",
21796
+ members: [
21797
+ {
21798
+ name: "step",
21799
+ kind: "property",
21800
+ signature: "step?: number | string",
21801
+ description: "Grid spacing. Steps land on `origin + n \xB7 step`. Default `1`."
21802
+ },
21803
+ {
21804
+ name: "min",
21805
+ kind: "property",
21806
+ signature: "min?: number | string",
21807
+ description: ""
21808
+ },
21809
+ {
21810
+ name: "max",
21811
+ kind: "property",
21812
+ signature: "max?: number | string",
21813
+ description: ""
21814
+ },
21815
+ {
21816
+ name: "stepOrigin",
21817
+ kind: "property",
21818
+ signature: "stepOrigin?: 'min' | 'zero'",
21819
+ 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."
21820
+ },
21821
+ {
21822
+ name: "wrap",
21823
+ kind: "property",
21824
+ signature: "wrap?: boolean",
21825
+ description: "Cycle past a fence instead of stopping at it \u2014 for genuinely cyclic fields only (23 \u2192 0 hours, 359 \u2192 0 degrees). Needs both `min` and `max`."
21826
+ }
21827
+ ],
21828
+ version: "11.6.0"
21829
+ },
21830
+ {
21831
+ id: "uni-number-clamp",
21832
+ name: "UniNumberClamp",
21833
+ kind: "interface",
21834
+ module: "number",
21835
+ importPath: "@uni-design-system/uni-angular",
21836
+ signature: "interface UniNumberClamp",
21837
+ summary: "The outcome of clamping a value to its fences.",
21838
+ description: "The outcome of clamping a value to its fences.",
21839
+ members: [
21840
+ {
21841
+ name: "value",
21842
+ kind: "property",
21843
+ signature: "value: string",
21844
+ description: "The clamped canonical decimal."
21845
+ },
21846
+ {
21847
+ name: "hit",
21848
+ kind: "property",
21849
+ signature: "hit: 'min' | 'max' | null",
21850
+ description: "Which fence was hit, or `null` when the value was already in range."
21851
+ }
21852
+ ],
21853
+ version: "11.6.0"
21854
+ },
21855
+ {
21856
+ id: "uni-locale-number-parts",
21857
+ name: "UniLocaleNumberParts",
21858
+ kind: "interface",
21859
+ module: "number",
21860
+ importPath: "@uni-design-system/uni-angular",
21861
+ signature: "interface UniLocaleNumberParts",
21862
+ summary: "Separators, currency placement and fraction digits read out of `Intl` for a locale.",
21863
+ 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.",
21864
+ members: [
21865
+ {
21866
+ name: "group",
21867
+ kind: "property",
21868
+ signature: "group: string",
21869
+ description: "Thousands separator: `','` (en), `'.'` (de), a narrow no-break space (fr)."
21870
+ },
21871
+ {
21872
+ name: "decimal",
21873
+ kind: "property",
21874
+ signature: "decimal: string",
21875
+ description: "Decimal separator: `'.'` (en), `','` (de)."
21876
+ },
21877
+ {
21878
+ name: "currencySymbol",
21879
+ kind: "property",
21880
+ signature: "currencySymbol: string",
21881
+ description: "Currency symbol, when a currency was given: `'$'`, `'\u20AC'`, `'\xA5'`."
21882
+ },
21883
+ {
21884
+ name: "currencyLeading",
21885
+ kind: "property",
21886
+ signature: "currencyLeading: boolean",
21887
+ description: "True when the locale writes the symbol before the number."
21888
+ },
21889
+ {
21890
+ name: "currencyDecimals",
21891
+ kind: "property",
21892
+ signature: "currencyDecimals: number",
21893
+ description: "Fraction digits `Intl` uses for the currency \u2014 JPY 0, USD 2."
21894
+ }
21895
+ ],
21896
+ version: "11.6.0"
21897
+ },
21898
+ {
21899
+ id: "uni-number-format-config",
21900
+ name: "UniNumberFormatConfig",
21901
+ kind: "interface",
21902
+ module: "number",
21903
+ importPath: "@uni-design-system/uni-angular",
21904
+ signature: "interface UniNumberFormatConfig",
21905
+ summary: "What a component knows about its own formatting, before resolution.",
21906
+ description: "What a component knows about its own formatting, before resolution. Mirrors the component inputs so a control can forward its signals almost verbatim.",
21907
+ members: [
21908
+ {
21909
+ name: "preset",
21910
+ kind: "property",
21911
+ signature: "preset?: UniNumberPreset",
21912
+ description: ""
21913
+ },
21914
+ {
21915
+ name: "currency",
21916
+ kind: "property",
21917
+ signature: "currency?: string",
21918
+ description: "ISO 4217 code, e.g. `'USD'`. Implies the `currency` preset."
21919
+ },
21920
+ {
21921
+ name: "locale",
21922
+ kind: "property",
21923
+ signature: "locale?: string",
21924
+ description: "BCP 47 tag. Defaults to `'en-US'`; components pass the document's."
21925
+ },
21926
+ {
21927
+ name: "decimals",
21928
+ kind: "property",
21929
+ signature: "decimals?: number | [min: number, max: number]",
21930
+ description: "Fixed fraction digits, or `[min, max]`. Overrides the preset."
21931
+ },
21932
+ {
21933
+ name: "grouping",
21934
+ kind: "property",
21935
+ signature: "grouping?: UniNumberGrouping",
21936
+ description: ""
21937
+ },
21938
+ {
21939
+ name: "prefix",
21940
+ kind: "property",
21941
+ signature: "prefix?: string",
21942
+ description: "Static adornment, rendered outside the editable text."
21943
+ },
21944
+ {
21945
+ name: "suffix",
21946
+ kind: "property",
21947
+ signature: "suffix?: string",
21948
+ description: ""
21949
+ },
21950
+ {
21951
+ name: "roundingMode",
21952
+ kind: "property",
21953
+ signature: "roundingMode?: UniRoundingMode",
21954
+ description: ""
21955
+ },
21956
+ {
21957
+ name: "valueIsFraction",
21958
+ kind: "property",
21959
+ signature: "valueIsFraction?: boolean",
21960
+ 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."
21961
+ },
21962
+ {
21963
+ name: "numberFormat",
21964
+ kind: "property",
21965
+ signature: "numberFormat?: Intl.NumberFormatOptions",
21966
+ description: "Escape hatch, merged over the preset. Only `notation` is read today."
21967
+ },
21968
+ {
21969
+ name: "min",
21970
+ kind: "property",
21971
+ signature: "min?: number",
21972
+ description: "Read only to decide `inputmode` \u2014 a field that can go negative needs `-`."
21973
+ },
21974
+ {
21975
+ name: "unitAnnouncement",
21976
+ kind: "property",
21977
+ signature: "unitAnnouncement?: string",
21978
+ description: "Spoken long form of an abbreviated suffix, for `aria-valuetext`."
21979
+ }
21980
+ ],
21981
+ version: "11.6.0"
21982
+ },
21983
+ {
21984
+ id: "uni-resolved-number-format",
21985
+ name: "UniResolvedNumberFormat",
21986
+ kind: "interface",
21987
+ module: "number",
21988
+ importPath: "@uni-design-system/uni-angular",
21989
+ signature: "interface UniResolvedNumberFormat",
21990
+ summary: "A format config with every preset and locale default filled in.",
21991
+ description: "A format config with every preset and locale default filled in.",
21992
+ members: [
21993
+ {
21994
+ name: "locale",
21995
+ kind: "property",
21996
+ signature: "locale: string",
21997
+ description: ""
21998
+ },
21999
+ {
22000
+ name: "parts",
22001
+ kind: "property",
22002
+ signature: "parts: UniLocaleNumberParts",
22003
+ description: ""
22004
+ },
22005
+ {
22006
+ name: "prefix",
22007
+ kind: "property",
22008
+ signature: "prefix: string",
22009
+ description: ""
22010
+ },
22011
+ {
22012
+ name: "suffix",
22013
+ kind: "property",
22014
+ signature: "suffix: string",
22015
+ description: ""
22016
+ },
22017
+ {
22018
+ name: "minimumFractionDigits",
22019
+ kind: "property",
22020
+ signature: "minimumFractionDigits: number",
22021
+ description: ""
22022
+ },
22023
+ {
22024
+ name: "maximumFractionDigits",
22025
+ kind: "property",
22026
+ signature: "maximumFractionDigits: number",
22027
+ description: ""
22028
+ },
22029
+ {
22030
+ name: "grouping",
22031
+ kind: "property",
22032
+ signature: "grouping: UniNumberGrouping",
22033
+ description: ""
22034
+ },
22035
+ {
22036
+ name: "compact",
22037
+ kind: "property",
22038
+ signature: "compact: boolean",
22039
+ description: "`1.5k` in, `1.5K` out."
22040
+ },
22041
+ {
22042
+ name: "isInteger",
22043
+ kind: "property",
22044
+ signature: "isInteger: boolean",
22045
+ description: "Fraction entry is refused outright rather than rounded away."
22046
+ },
22047
+ {
22048
+ name: "shift",
22049
+ kind: "property",
22050
+ signature: "shift: number",
22051
+ description: "Display value is the model value \xD7 `10^shift`."
22052
+ },
22053
+ {
22054
+ name: "roundingMode",
22055
+ kind: "property",
22056
+ signature: "roundingMode: UniRoundingMode",
22057
+ description: ""
22058
+ },
22059
+ {
22060
+ name: "inputMode",
22061
+ kind: "property",
22062
+ signature: "inputMode: 'decimal' | 'numeric'",
22063
+ description: "`numeric` only when negatives and decimals are both impossible."
22064
+ },
22065
+ {
22066
+ name: "unitAnnouncement",
22067
+ kind: "property",
22068
+ signature: "unitAnnouncement?: string",
22069
+ description: ""
22070
+ }
22071
+ ],
22072
+ version: "11.6.0"
22073
+ },
22074
+ {
22075
+ id: "uni-number-parse-result",
22076
+ name: "UniNumberParseResult",
22077
+ kind: "type",
22078
+ module: "number",
22079
+ importPath: "@uni-design-system/uni-angular",
22080
+ signature: "type UniNumberParseResult = { status: 'empty' } | { status: 'ok'; value: string; viaExpression: boolean } | { status: 'error'; reason: UniNumberRejectReason }",
22081
+ summary: "The outcome of reading a user's text.",
22082
+ description: "The outcome of reading a user's text. Refused text is never swallowed: the caller keeps it in the field and flags it, so nobody loses their work to a silently emptied box.",
22083
+ members: [],
22084
+ version: "11.6.0"
22085
+ },
22086
+ {
22087
+ id: "is-canonical-decimal",
22088
+ name: "isCanonicalDecimal",
22089
+ kind: "function",
22090
+ module: "number",
22091
+ importPath: "@uni-design-system/uni-angular",
22092
+ signature: "function isCanonicalDecimal(text: string): boolean",
22093
+ summary: "True when `text` is already a canonical decimal (leading/trailing space allowed).",
22094
+ description: "True when `text` is already a canonical decimal (leading/trailing space allowed).",
22095
+ members: [],
22096
+ version: "11.6.0"
22097
+ },
22098
+ {
22099
+ id: "decimal-scale",
22100
+ name: "decimalScale",
22101
+ kind: "function",
22102
+ module: "number",
22103
+ importPath: "@uni-design-system/uni-angular",
22104
+ signature: "function decimalScale(value: string): number",
22105
+ summary: "Fraction-digit count.",
22106
+ description: "Fraction-digit count. `'1.250'` \u2192 3, `'12'` \u2192 0, `'5.'` \u2192 0.",
22107
+ members: [],
22108
+ version: "11.6.0"
22109
+ },
22110
+ {
22111
+ id: "to-scaled",
22112
+ name: "toScaled",
22113
+ kind: "function",
22114
+ module: "number",
22115
+ importPath: "@uni-design-system/uni-angular",
22116
+ signature: "function toScaled(value: string, scale: number): bigint",
22117
+ summary: "Canonical decimal \u2192 integer scaled by `10^scale`.",
22118
+ description: "Canonical decimal \u2192 integer scaled by `10^scale`. Fraction digits beyond `scale` are truncated, so callers that must not lose them pass a `scale` at least `decimalScale(value)`.",
22119
+ members: [],
22120
+ version: "11.6.0"
22121
+ },
22122
+ {
22123
+ id: "from-scaled",
22124
+ name: "fromScaled",
22125
+ kind: "function",
22126
+ module: "number",
22127
+ importPath: "@uni-design-system/uni-angular",
22128
+ signature: "function fromScaled(scaled: bigint, scale: number): string",
22129
+ summary: "Scaled integer \u2192 canonical decimal, with trailing fraction zeros trimmed.",
22130
+ description: "Scaled integer \u2192 canonical decimal, with trailing fraction zeros trimmed.",
22131
+ members: [],
22132
+ version: "11.6.0"
22133
+ },
22134
+ {
22135
+ id: "normalize-decimal",
22136
+ name: "normalizeDecimal",
22137
+ kind: "function",
22138
+ module: "number",
22139
+ importPath: "@uni-design-system/uni-angular",
22140
+ signature: "function normalizeDecimal(value: string): string",
22141
+ summary: "Strip a leading `+`, leading zeros and trailing fraction zeros: `'+01.50'` \u2192 `'1.5'`.",
22142
+ description: "Strip a leading `+`, leading zeros and trailing fraction zeros: `'+01.50'` \u2192 `'1.5'`. Requires a canonical decimal; guard with `isCanonicalDecimal`.",
22143
+ members: [],
22144
+ version: "11.6.0"
22145
+ },
22146
+ {
22147
+ id: "to-decimal",
22148
+ name: "toDecimal",
22149
+ kind: "function",
22150
+ module: "number",
22151
+ importPath: "@uni-design-system/uni-angular",
22152
+ signature: "function toDecimal(value: number | string): string",
22153
+ summary: "Any numeric input \u2192 canonical decimal, expanding the exponential notation `String(number)` produces outside 1e-7\u20261e21.",
22154
+ description: "Any numeric input \u2192 canonical decimal, expanding the exponential notation `String(number)` produces outside 1e-7\u20261e21. A `step` of `1e-7` would otherwise reach the arithmetic as the literal text `'1e-7'`. Throws on text that is not numeric at all \u2014 every caller here passes either a `number` input or text already cleared by the parser.",
22155
+ members: [],
22156
+ version: "11.6.0"
22157
+ },
22158
+ {
22159
+ id: "compare-decimal",
22160
+ name: "compareDecimal",
22161
+ kind: "function",
22162
+ module: "number",
22163
+ importPath: "@uni-design-system/uni-angular",
22164
+ signature: "function compareDecimal(a: string, b: string): -1 | 0 | 1",
22165
+ summary: "`-1` when `a < b`, `1` when `a > b`, `0` when equal.",
22166
+ description: "`-1` when `a < b`, `1` when `a > b`, `0` when equal. `'1.50'` equals `'1.5'`.",
22167
+ members: [],
22168
+ version: "11.6.0"
22169
+ },
22170
+ {
22171
+ id: "round-decimal",
22172
+ name: "roundDecimal",
22173
+ kind: "function",
22174
+ module: "number",
22175
+ importPath: "@uni-design-system/uni-angular",
22176
+ signature: "function roundDecimal(value: string, fractionDigits: number, mode: UniRoundingMode = 'half-up'): string",
22177
+ summary: "Round to `fractionDigits`, breaking ties per `mode`.",
22178
+ description: "Round to `fractionDigits`, breaking ties per `mode`. Exact where `Number.prototype.toFixed` is not \u2014 see the file header.",
22179
+ members: [],
22180
+ version: "11.6.0"
22181
+ },
22182
+ {
22183
+ id: "shift-decimal",
22184
+ name: "shiftDecimal",
22185
+ kind: "function",
22186
+ module: "number",
22187
+ importPath: "@uni-design-system/uni-angular",
22188
+ signature: "function shiftDecimal(value: string, places: number): string",
22189
+ summary: "Multiply by `10^places`, exactly.",
22190
+ description: "Multiply by `10^places`, exactly. Used for the percent preset's fraction \u21C4 display shift (`0.15` \u21C4 `15`) and for deriving a default large step of `step \xD7 10` without touching a float.",
22191
+ members: [],
22192
+ version: "11.6.0"
22193
+ },
22194
+ {
22195
+ id: "clamp-decimal",
22196
+ name: "clampDecimal",
22197
+ kind: "function",
22198
+ module: "number",
22199
+ importPath: "@uni-design-system/uni-angular",
22200
+ signature: "function clampDecimal(value: string, min?: number | string, max?: number | string): UniNumberClamp",
22201
+ summary: "Hold a value inside its fences, reporting which one it hit so the caller can announce it.",
22202
+ description: "Hold a value inside its fences, reporting which one it hit so the caller can announce it. Clamping belongs on commit, never per keystroke: a `min=10` field that clamps live can never be typed into, because the `1` becomes `10` before the `5` arrives.",
22203
+ members: [],
22204
+ version: "11.6.0"
22205
+ },
22206
+ {
22207
+ id: "step-decimal",
22208
+ name: "stepDecimal",
22209
+ kind: "function",
22210
+ module: "number",
22211
+ importPath: "@uni-design-system/uni-angular",
22212
+ signature: "function stepDecimal(current: string, direction: 1 | -1, config: UniNumberStepConfig = {}): string",
22213
+ summary: "One step from `current`, in `direction` (`1` up, `-1` down).",
22214
+ description: "One step from `current`, in `direction` (`1` up, `-1` down). Steps land on the grid `origin + n \xB7 step`, where `origin` is `min` by default. A value that is *off* the grid snaps to the nearest grid point **in the direction of travel** rather than jumping past it: with `min=5, step=10` the grid is 5, 15, 25, and stepping up from 7 gives 15, not 17. Fences stop the value; they never wrap unless `wrap` is set and both bounds are defined. Returns `current` unchanged when `step` is zero.",
22215
+ members: [],
22216
+ version: "11.6.0"
22217
+ },
22218
+ {
22219
+ id: "locale-number-parts",
22220
+ name: "localeNumberParts",
22221
+ kind: "const",
22222
+ module: "number",
22223
+ importPath: "@uni-design-system/uni-angular",
22224
+ signature: "const localeNumberParts = memoize(\u2026)",
22225
+ summary: "Locale separators plus, when a currency is given, its symbol, side and fraction digits.",
22226
+ description: "Locale separators plus, when a currency is given, its symbol, side and fraction digits. Memoized: constructing an `Intl.NumberFormat` is expensive and a field re-resolves this on every keystroke.",
22227
+ members: [],
22228
+ version: "11.6.0"
22229
+ },
22230
+ {
22231
+ id: "to-ascii-digits",
22232
+ name: "toAsciiDigits",
22233
+ kind: "function",
22234
+ module: "number",
22235
+ importPath: "@uni-design-system/uni-angular",
22236
+ signature: "function toAsciiDigits(text: string): string",
22237
+ summary: "Map localized digits and Arabic separators to ASCII, so `\u0661\u0662\u0663\u0664\u066B\u0665` parses in `ar` and `\u0967\u0968\u0969\u096A.\u096B` in `hi`.",
22238
+ description: "Map localized digits and Arabic separators to ASCII, so `\u0661\u0662\u0663\u0664\u066B\u0665` parses in `ar` and `\u0967\u0968\u0969\u096A.\u096B` in `hi`.",
22239
+ members: [],
22240
+ version: "11.6.0"
22241
+ },
22242
+ {
22243
+ id: "evaluate-expression",
22244
+ name: "evaluateExpression",
22245
+ kind: "function",
22246
+ module: "number",
22247
+ importPath: "@uni-design-system/uni-angular",
22248
+ signature: "function evaluateExpression(text: string): string | null",
22249
+ summary: "Evaluate `+ \u2212 \xD7 \xF7 ( )` over decimal literals \u2014 shunting-yard, roughly thirty lines, and **never `eval`**.",
22250
+ description: "Evaluate `+ \u2212 \xD7 \xF7 ( )` over decimal literals \u2014 shunting-yard, roughly thirty lines, and **never `eval`**. Returns a canonical decimal, or `null` when the text is not a well-formed expression. Floats are acceptable here in a way they are not elsewhere: this is a convenience path for spreadsheet muscle memory (`12*3`, `100/4+5`), and the result is settled to ten decimals before re-entering exact arithmetic. Division is the only operation that can produce a non-terminating decimal, and no exact representation would help there either.",
22251
+ members: [],
22252
+ version: "11.6.0"
22253
+ },
22254
+ {
22255
+ id: "resolve-number-format",
22256
+ name: "resolveNumberFormat",
22257
+ kind: "function",
22258
+ module: "number",
22259
+ importPath: "@uni-design-system/uni-angular",
22260
+ signature: "function resolveNumberFormat(config: UniNumberFormatConfig = {}): UniResolvedNumberFormat",
22261
+ summary: "Fill in every preset, locale and currency default.",
22262
+ description: "Fill in every preset, locale and currency default.",
22263
+ members: [],
22264
+ version: "11.6.0"
22265
+ },
22266
+ {
22267
+ id: "parse-number",
22268
+ name: "parseNumber",
22269
+ kind: "function",
22270
+ module: "number",
22271
+ importPath: "@uni-design-system/uni-angular",
22272
+ signature: "function parseNumber(raw: string, format: UniResolvedNumberFormat, options: { allowExpressions?: boolean; currency?: string } = {}): UniNumberParseResult",
22273
+ summary: "Read a user's text into a canonical decimal in **model units**.",
22274
+ description: "Read a user's text into a canonical decimal in **model units**. Accepted, in order: canonical/ASCII (always, whatever the locale \u2014 it is what agents and APIs write), locale-grouped, affixed, localized digits, compact (`1.5k`), accounting negatives (`(1,234.56)` \u2192 `-1234.56`), and expressions when `allowExpressions` is set.",
22275
+ members: [],
22276
+ version: "11.6.0"
22277
+ },
22278
+ {
22279
+ id: "format-number",
22280
+ name: "formatNumber",
22281
+ kind: "function",
22282
+ module: "number",
22283
+ importPath: "@uni-design-system/uni-angular",
22284
+ signature: "function formatNumber(canonical: string, format: UniResolvedNumberFormat): string",
22285
+ summary: "Canonical decimal (model units) \u2192 the display number, without affixes.",
22286
+ description: "Canonical decimal (model units) \u2192 the display number, without affixes. `min2` grouping \u2014 the default \u2014 starts at five integer digits, so a year renders `2026` rather than `2,026` while a price still renders `10,000`.",
22287
+ members: [],
22288
+ version: "11.6.0"
22289
+ },
22290
+ {
22291
+ id: "raw-number-text",
22292
+ name: "rawNumberText",
22293
+ kind: "function",
22294
+ module: "number",
22295
+ importPath: "@uni-design-system/uni-angular",
22296
+ signature: "function rawNumberText(canonical: string, format: UniResolvedNumberFormat): string",
22297
+ summary: "The plain text the field shows while focused: the display number with no grouping and no affixes, so the caret never has to walk over a separator that appears and vanishes mid-word.",
22298
+ description: "The plain text the field shows while focused: the display number with no grouping and no affixes, so the caret never has to walk over a separator that appears and vanishes mid-word.",
22299
+ members: [],
22300
+ version: "11.6.0"
22301
+ },
22302
+ {
22303
+ id: "settle-number",
22304
+ name: "settleNumber",
22305
+ kind: "function",
22306
+ module: "number",
22307
+ importPath: "@uni-design-system/uni-angular",
22308
+ signature: "function settleNumber(canonical: string, format: UniResolvedNumberFormat): string",
22309
+ summary: "Round a committed value to the field's precision, in model units.",
22310
+ description: "Round a committed value to the field's precision, in model units.",
22311
+ members: [],
22312
+ version: "11.6.0"
22313
+ },
22314
+ {
22315
+ id: "speak-number",
22316
+ name: "speakNumber",
22317
+ kind: "function",
22318
+ module: "number",
22319
+ importPath: "@uni-design-system/uni-angular",
22320
+ signature: "function speakNumber(canonical: string | null, format: UniResolvedNumberFormat, emptyText = 'Empty'): string",
22321
+ summary: "The `aria-valuetext` string: the formatted number with its affixes spoken.",
22322
+ description: 'The `aria-valuetext` string: the formatted number with its affixes spoken. `aria-valuenow` alone announces "1234.56", which is the one thing about a money field that is not the point. An empty field says "Empty" per APG.',
22323
+ members: [],
22324
+ version: "11.6.0"
22325
+ },
22326
+ {
22327
+ id: "to-number",
22328
+ name: "toNumber",
22329
+ kind: "function",
22330
+ module: "number",
22331
+ importPath: "@uni-design-system/uni-angular",
22332
+ signature: "function toNumber(canonical: string): number",
22333
+ summary: "Model-units canonical decimal \u2192 the bound `number`.",
22334
+ description: "Model-units canonical decimal \u2192 the bound `number`.",
22335
+ members: [],
22336
+ version: "11.6.0"
22337
+ },
22338
+ {
22339
+ id: "loses-precision",
22340
+ name: "losesPrecision",
22341
+ kind: "function",
22342
+ module: "number",
22343
+ importPath: "@uni-design-system/uni-angular",
22344
+ signature: "function losesPrecision(value: number | string): boolean",
22345
+ summary: "True when a value cannot survive the trip through `number` \u2014 the reason the components also expose an exact `valueAsString` model, and the trigger for the dev-mode warning.",
22346
+ description: "True when a value cannot survive the trip through `number` \u2014 the reason the components also expose an exact `valueAsString` model, and the trigger for the dev-mode warning. Silent precision loss is the whole point of that second model, so it is worth saying out loud once. A `number` can only be checked for magnitude, since it has already lost whatever it was going to lose. A canonical string can be checked properly: `'9007199254740993'` comes back as `'9007199254740992'`.",
22347
+ members: [],
22348
+ version: "11.6.0"
22349
+ },
22350
+ {
22351
+ id: "press-repeat-timing",
22352
+ name: "PressRepeatTiming",
22353
+ kind: "interface",
22354
+ module: "number",
22355
+ importPath: "@uni-design-system/uni-angular",
22356
+ signature: "interface PressRepeatTiming",
22357
+ summary: "Repeat timings, normally sourced from a component's theme options.",
22358
+ description: "Repeat timings, normally sourced from a component's theme options.",
22359
+ members: [
22360
+ {
22361
+ name: "delayMs",
22362
+ kind: "property",
22363
+ signature: "delayMs?: number",
22364
+ description: ""
22365
+ },
22366
+ {
22367
+ name: "intervalMs",
22368
+ kind: "property",
22369
+ signature: "intervalMs?: number",
22370
+ description: ""
22371
+ },
22372
+ {
22373
+ name: "fastIntervalMs",
22374
+ kind: "property",
22375
+ signature: "fastIntervalMs?: number",
22376
+ description: ""
22377
+ },
22378
+ {
22379
+ name: "rampMs",
22380
+ kind: "property",
22381
+ signature: "rampMs?: number",
22382
+ description: ""
22383
+ }
22384
+ ],
22385
+ version: "11.6.0"
22386
+ },
22387
+ {
22388
+ id: "press-repeat-config",
22389
+ name: "PressRepeatConfig",
22390
+ kind: "interface",
22391
+ module: "number",
22392
+ importPath: "@uni-design-system/uni-angular",
22393
+ signature: "interface PressRepeatConfig",
22394
+ summary: "",
22395
+ description: "",
22396
+ members: [
22397
+ {
22398
+ name: "onStep",
22399
+ kind: "property",
22400
+ signature: "onStep: (repeat: boolean) => void",
22401
+ 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."
22402
+ },
22403
+ {
22404
+ name: "onRelease",
22405
+ kind: "property",
22406
+ signature: "onRelease?: (repeated: boolean) => void",
22407
+ 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`."
22408
+ },
22409
+ {
22410
+ name: "disabled",
22411
+ kind: "property",
22412
+ signature: "disabled?: () => boolean",
22413
+ description: "Consulted on press; a disabled button must not start a run."
22414
+ },
22415
+ {
22416
+ name: "focus",
22417
+ kind: "property",
22418
+ signature: "focus?: (button: HTMLElement | null) => void",
22419
+ 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."
22420
+ },
22421
+ {
22422
+ name: "repeat",
22423
+ kind: "property",
22424
+ signature: "repeat?: () => boolean",
22425
+ 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."
22426
+ },
22427
+ {
22428
+ name: "timing",
22429
+ kind: "property",
22430
+ signature: "timing?: () => PressRepeatTiming",
22431
+ description: ""
22432
+ }
22433
+ ],
22434
+ version: "11.6.0"
22435
+ },
22436
+ {
22437
+ id: "press-repeat",
22438
+ name: "PressRepeat",
22439
+ kind: "interface",
22440
+ module: "number",
22441
+ importPath: "@uni-design-system/uni-angular",
22442
+ signature: "interface PressRepeat",
22443
+ summary: "",
22444
+ description: "",
22445
+ members: [
22446
+ {
22447
+ name: "holding",
22448
+ kind: "property",
22449
+ signature: "readonly holding: Signal<boolean>",
22450
+ description: "True while a press is in flight \u2014 bind it to the button's pressed state."
22451
+ },
22452
+ {
22453
+ name: "press",
22454
+ kind: "method",
22455
+ signature: "press(event?: PointerEvent): void",
22456
+ 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."
22457
+ },
22458
+ {
22459
+ name: "release",
22460
+ kind: "method",
22461
+ signature: "release(): void",
22462
+ description: "End a hold normally, firing `onRelease`."
22463
+ },
22464
+ {
22465
+ name: "cancel",
22466
+ kind: "method",
22467
+ signature: "cancel(): void",
22468
+ description: "End a hold without firing `onRelease` \u2014 for `Escape` and `pointercancel`."
22469
+ }
22470
+ ],
22471
+ version: "11.6.0"
22472
+ },
22473
+ {
22474
+ id: "create-press-repeat",
22475
+ name: "createPressRepeat",
22476
+ kind: "function",
22477
+ module: "number",
22478
+ importPath: "@uni-design-system/uni-angular",
22479
+ signature: "function createPressRepeat(config: PressRepeatConfig): PressRepeat",
22480
+ summary: "",
22481
+ description: "",
22482
+ members: [],
22483
+ version: "11.6.0"
22484
+ },
22485
+ {
22486
+ id: "listbox-navigation-config",
22487
+ name: "ListboxNavigationConfig",
22488
+ kind: "interface",
22489
+ module: "listbox",
22490
+ importPath: "@uni-design-system/uni-angular",
22491
+ signature: "interface ListboxNavigationConfig",
22492
+ summary: "",
22493
+ description: "",
22494
+ members: [
22495
+ {
22496
+ name: "count",
22497
+ kind: "property",
22498
+ signature: "count: () => number",
22499
+ description: "How many options are currently navigable. Read reactively."
22500
+ },
22501
+ {
22502
+ name: "idPrefix",
22503
+ kind: "property",
22504
+ signature: "idPrefix?: string",
22505
+ description: "Id prefix for the listbox and its options."
22506
+ },
22507
+ {
22508
+ name: "wrap",
22509
+ kind: "property",
22510
+ signature: "wrap?: boolean",
22511
+ description: "Wrap past the ends. Default true."
22512
+ },
22513
+ {
22514
+ name: "disabled",
22515
+ kind: "property",
22516
+ signature: "disabled?: (index: number) => boolean",
22517
+ description: "Non-navigable options. Arrows step over them; Home/End land on the nearest enabled option; an all-disabled list never activates."
22518
+ },
22519
+ {
22520
+ name: "homeEndNavigates",
22521
+ kind: "property",
22522
+ signature: "homeEndNavigates?: boolean",
22523
+ description: "Let Home/End jump to the ends of the list. Default false. In an editable combobox those keys belong to the caret \u2014 APG reserves them for text editing, and a control that steals them makes the text un-navigable while its list is open. Opt in only where focus is *not* in a text field (uni-multi-select-dropdown, whose focus rides the option checkboxes). Nothing is lost by leaving it off: opening with ArrowUp already lands on the last option, ArrowDown on the first, and navigation wraps at both ends."
22524
+ }
22525
+ ],
22526
+ version: "11.6.0"
22527
+ },
22528
+ {
22529
+ id: "listbox-navigation",
22530
+ name: "ListboxNavigation",
22531
+ kind: "class",
22532
+ module: "listbox",
22533
+ importPath: "@uni-design-system/uni-angular",
22534
+ signature: "class ListboxNavigation",
22535
+ summary: "The keyboard and ARIA bookkeeping shared by every combobox-style popup: open state, the active option index, and the `aria-activedescendant` id wiring.",
22536
+ 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.",
22537
+ members: [
22538
+ {
22539
+ name: "listboxId",
22540
+ kind: "property",
22541
+ signature: "readonly listboxId: string",
22542
+ description: 'Id for the `role="listbox"` element; wire as `aria-controls`.'
22543
+ },
22544
+ {
22545
+ name: "open",
22546
+ kind: "property",
22547
+ signature: "readonly open: Signal<boolean>",
22548
+ description: "Whether the popup is showing. Also false when there is nothing to show."
22549
+ },
22550
+ {
22551
+ name: "activeIndex",
22552
+ kind: "property",
22553
+ signature: "readonly activeIndex: Signal<number>",
22554
+ description: "Index of the highlighted option, or -1 when none is active."
22555
+ },
22556
+ {
22557
+ name: "activeDescendantId",
22558
+ kind: "property",
22559
+ signature: "readonly activeDescendantId: Signal<string | null>",
22560
+ description: "Value for `aria-activedescendant`, or null when nothing is active."
22561
+ },
22562
+ {
22563
+ name: "optionId",
22564
+ kind: "method",
22565
+ signature: "optionId(index: number): string",
22566
+ description: 'Stable per-option id, for `role="option"` elements.'
22567
+ },
22568
+ {
22569
+ name: "show",
22570
+ kind: "method",
22571
+ signature: "show(): void",
22572
+ description: ""
22573
+ },
22574
+ {
22575
+ name: "hide",
22576
+ kind: "method",
22577
+ signature: "hide(): void",
22578
+ description: "Close and drop the active option, so reopening starts clean."
22579
+ },
22580
+ {
22581
+ name: "setActive",
22582
+ kind: "method",
22583
+ signature: "setActive(index: number): void",
22584
+ description: ""
22585
+ },
22586
+ {
22587
+ name: "navigate",
22588
+ kind: "method",
22589
+ signature: "navigate(event: KeyboardEvent): boolean",
22590
+ 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."
22591
+ },
22592
+ {
22593
+ name: "closeOnFocusOut",
22594
+ kind: "method",
22595
+ signature: "closeOnFocusOut(event: FocusEvent): void",
22596
+ description: "Close when focus leaves the control entirely (not on internal moves)."
22597
+ }
22598
+ ],
22599
+ version: "11.6.0"
22600
+ },
22601
+ {
22602
+ id: "create-listbox-navigation",
22603
+ name: "createListboxNavigation",
22604
+ kind: "function",
22605
+ module: "listbox",
22606
+ importPath: "@uni-design-system/uni-angular",
22607
+ signature: "function createListboxNavigation(config: ListboxNavigationConfig): ListboxNavigation",
22608
+ summary: "Factory mirroring the signal-API style used elsewhere in the CDK.",
22609
+ description: "Factory mirroring the signal-API style used elsewhere in the CDK.",
22610
+ members: [],
22611
+ version: "11.6.0"
22612
+ },
22613
+ {
22614
+ id: "placement",
22615
+ name: "Placement",
22616
+ kind: "type",
22617
+ module: "position",
22618
+ importPath: "@uni-design-system/uni-angular",
22619
+ signature: "type Placement = 'top' | 'right' | 'bottom' | 'left' | 'top-start' | 'right-start' | 'bottom-start' | 'left-start' | 'top-end' | 'right-end' | 'bottom-end' | 'left-end'",
22620
+ summary: "Native CSS Anchor Positioning helpers (Baseline 2026).",
22621
+ description: "Native CSS Anchor Positioning helpers (Baseline 2026). These replace the former",
22622
+ members: [],
22623
+ version: "11.6.0"
22624
+ },
22625
+ {
22626
+ id: "anchor-offset",
22627
+ name: "AnchorOffset",
22628
+ kind: "interface",
22629
+ module: "position",
22630
+ importPath: "@uni-design-system/uni-angular",
22631
+ signature: "interface AnchorOffset",
22632
+ summary: "Distances between the anchor and the positioned panel, in px.",
22633
+ description: "Distances between the anchor and the positioned panel, in px.",
22634
+ members: [
22635
+ {
22636
+ name: "mainAxis",
22637
+ kind: "property",
22638
+ signature: "mainAxis?: number",
22639
+ description: "Gap along the placement axis (anchor \u2192 panel)."
22640
+ },
22641
+ {
22642
+ name: "alignmentAxis",
22643
+ kind: "property",
22644
+ signature: "alignmentAxis?: number",
22645
+ description: "Shift along the cross axis, from the aligned edge."
22646
+ }
22647
+ ],
22648
+ version: "11.6.0"
22649
+ },
22650
+ {
22651
+ id: "new-anchor-name",
22652
+ name: "newAnchorName",
22653
+ kind: "function",
22654
+ module: "position",
22655
+ importPath: "@uni-design-system/uni-angular",
22656
+ signature: "function newAnchorName(): string",
22657
+ summary: "Returns a document-unique dashed-ident usable as a CSS `anchor-name`.",
22658
+ description: "Returns a document-unique dashed-ident usable as a CSS `anchor-name`.",
22659
+ members: [],
22660
+ version: "11.6.0"
22661
+ },
22662
+ {
22663
+ id: "anchor-styles",
22664
+ name: "anchorStyles",
22665
+ kind: "function",
22666
+ module: "position",
22667
+ importPath: "@uni-design-system/uni-angular",
22668
+ signature: "function anchorStyles(anchor: string, placement: Placement, offset: AnchorOffset = {}): Record<string, string | number>",
22669
+ summary: "Emotion style object anchoring a panel to `anchor` at `placement`.",
22670
+ description: "Emotion style object anchoring a panel to `anchor` at `placement`. Spread into the panel's `css()` styles. The trigger element must carry `anchor-name: <anchor>` (see `newAnchorName`).",
22671
+ members: [],
22672
+ version: "11.6.0"
22673
+ },
22674
+ {
22675
+ id: "anchor-arrow-styles",
22676
+ name: "anchorArrowStyles",
22677
+ kind: "function",
22678
+ module: "position",
22679
+ importPath: "@uni-design-system/uni-angular",
22680
+ signature: "function anchorArrowStyles(placement: Placement, size = 8, overlap = 0): Record<string, string | number>",
22681
+ summary: "Absolute positioning for a rotated-square arrow sitting on the panel edge that faces the anchor.",
22682
+ description: "Absolute positioning for a rotated-square arrow sitting on the panel edge that faces the anchor. Static per placement: if the browser flips the panel via position-try, the arrow stays on the configured side (cosmetic-only degradation, matching the flip-support caveat above). `overlap` (default 0 \u2014 cut exactly on the panel edge) extends the kept half into the panel; see for when that is ever wanted.",
22683
+ members: [],
22684
+ version: "11.6.0"
22685
+ },
22686
+ {
22687
+ id: "spotlight-options",
22688
+ name: "SpotlightOptions",
22689
+ kind: "interface",
22690
+ module: "position",
22691
+ importPath: "@uni-design-system/uni-angular",
22692
+ signature: "interface SpotlightOptions",
22693
+ summary: "",
22694
+ description: "",
22695
+ members: [
22696
+ {
22697
+ name: "pad",
22698
+ kind: "property",
22699
+ signature: "pad?: number",
22700
+ description: "Gap between the target's box and the hole edge, px."
22701
+ },
22702
+ {
22703
+ name: "ringWidth",
22704
+ kind: "property",
22705
+ signature: "ringWidth?: number",
22706
+ description: "Ring border width, px \u2014 border-color and radius come from the caller."
22707
+ },
22708
+ {
22709
+ name: "scrimColor",
22710
+ kind: "property",
22711
+ signature: "scrimColor?: string",
22712
+ description: "Scrim paint; scheme-invariant by convention, like `::backdrop`."
22713
+ }
22714
+ ],
22715
+ version: "11.6.0"
22716
+ },
22717
+ {
22718
+ id: "spotlight-styles",
22719
+ name: "SpotlightStyles",
22720
+ kind: "interface",
22721
+ module: "position",
22722
+ importPath: "@uni-design-system/uni-angular",
22723
+ signature: "interface SpotlightStyles",
22724
+ summary: "",
22725
+ description: "",
22726
+ members: [
22727
+ {
22728
+ name: "window",
22729
+ kind: "property",
22730
+ signature: "window: Record<string, string | number>",
22731
+ description: "Paints the scrim + ring. `pointer-events: none` \u2014 purely visual."
22732
+ },
22733
+ {
22734
+ name: "strips",
22735
+ kind: "property",
22736
+ signature: "strips: Record<'top' | 'bottom' | 'left' | 'right', Record<string, string | number>>",
22737
+ description: "Click-blockers surrounding the hole; the hole itself is genuinely empty."
22738
+ },
22739
+ {
22740
+ name: "cover",
22741
+ kind: "property",
22742
+ signature: "cover: Record<string, string | number>",
22743
+ description: "Hole-sized click-blocker, shown when the target must not be interactive."
22744
+ }
22745
+ ],
22746
+ version: "11.6.0"
22747
+ },
22748
+ {
22749
+ id: "anchor-rect",
22750
+ name: "AnchorRect",
22751
+ kind: "interface",
22752
+ module: "position",
22753
+ importPath: "@uni-design-system/uni-angular",
22754
+ signature: "interface AnchorRect",
22755
+ summary: "The rect fields the origin computation reads \u2014 satisfied by DOMRect.",
22756
+ description: "The rect fields the origin computation reads \u2014 satisfied by DOMRect.",
22757
+ members: [
22758
+ {
22759
+ name: "top",
22760
+ kind: "property",
22761
+ signature: "top: number",
22762
+ description: ""
22763
+ },
22764
+ {
22765
+ name: "right",
22766
+ kind: "property",
22767
+ signature: "right: number",
22768
+ description: ""
22769
+ },
22770
+ {
22771
+ name: "bottom",
22772
+ kind: "property",
22773
+ signature: "bottom: number",
22774
+ description: ""
22775
+ },
22776
+ {
22777
+ name: "left",
22778
+ kind: "property",
22779
+ signature: "left: number",
22780
+ description: ""
22781
+ },
22782
+ {
22783
+ name: "width",
22784
+ kind: "property",
22785
+ signature: "width: number",
22786
+ description: ""
22787
+ },
22788
+ {
22789
+ name: "height",
22790
+ kind: "property",
22791
+ signature: "height: number",
22792
+ description: ""
22793
+ }
22794
+ ],
22795
+ version: "11.6.0"
22796
+ },
22797
+ {
22798
+ id: "transform-origin-for",
22799
+ name: "transformOriginFor",
22800
+ kind: "function",
22801
+ module: "position",
22802
+ importPath: "@uni-design-system/uni-angular",
22803
+ signature: "function transformOriginFor(panel: AnchorRect, trigger: AnchorRect): string | null",
22804
+ summary: "Transform origin for a panel's open/close scale animation, derived from where the panel **actually** rendered relative to its anchor \u2014 not from the requested placement.",
22805
+ description: "Transform origin for a panel's open/close scale animation, derived from where the panel **actually** rendered relative to its anchor \u2014 not from the requested placement. `position-try-fallbacks` lets the browser flip a panel at viewport edges, and a statically mapped origin then animates from the wrong corner (a `bottom-end` picker flipped above its field would still scale from `top right`). Measure after the popover is shown and apply the result as an inline style. Returns keyword pairs like `'top right'` / `'bottom center'`, or `null` when the panel has no box yet (e.g. `display: none`, or jsdom).",
22806
+ members: [],
22807
+ version: "11.6.0"
22808
+ },
22809
+ {
22810
+ id: "transform-origins",
22811
+ name: "TRANSFORM_ORIGINS",
22812
+ kind: "const",
22813
+ module: "overlay",
22814
+ importPath: "@uni-design-system/uni-angular",
22815
+ signature: "const TRANSFORM_ORIGINS: Record<Placement, string>",
22816
+ summary: "Placement \u2192 `transform-origin`, so scale animations grow from the anchor.",
22817
+ description: "Placement \u2192 `transform-origin`, so scale animations grow from the anchor.",
22818
+ members: [],
22819
+ version: "11.6.0"
22820
+ },
22821
+ {
22822
+ id: "set-anchor-name",
22823
+ name: "setAnchorName",
22824
+ kind: "function",
22825
+ module: "overlay",
22826
+ importPath: "@uni-design-system/uni-angular",
22827
+ signature: "function setAnchorName(el: HTMLElement, name: string): void",
22828
+ summary: "Write a CSS `anchor-name` onto an element (detached anchors and targets).",
22829
+ description: "Write a CSS `anchor-name` onto an element (detached anchors and targets).",
22830
+ members: [],
22831
+ version: "11.6.0"
22832
+ },
22833
+ {
22834
+ id: "clear-anchor-name",
22835
+ name: "clearAnchorName",
22836
+ kind: "function",
22837
+ module: "overlay",
22838
+ importPath: "@uni-design-system/uni-angular",
22839
+ signature: "function clearAnchorName(el: HTMLElement): void",
22840
+ summary: "",
22841
+ description: "",
22842
+ members: [],
22843
+ version: "11.6.0"
22844
+ },
22845
+ {
22846
+ id: "resolve-element",
22847
+ name: "resolveElement",
22848
+ kind: "function",
22849
+ module: "overlay",
22850
+ importPath: "@uni-design-system/uni-angular",
22851
+ signature: "function resolveElement(ref: HTMLElement | string | null | undefined): HTMLElement | null",
22852
+ summary: "Resolve an element-or-id reference.",
22853
+ description: "Resolve an element-or-id reference. Id strings are looked up at call time \u2014 never cache the result across opens, the element may have been re-rendered. `''` and null-ish mean \"unset\" (falsy guard: an empty string is the only typeable empty for a string-typed input).",
22854
+ members: [],
22855
+ version: "11.6.0"
22856
+ },
22857
+ {
22858
+ id: "is-toggle-open",
22859
+ name: "isToggleOpen",
22860
+ kind: "function",
22861
+ module: "overlay",
22862
+ importPath: "@uni-design-system/uni-angular",
22863
+ signature: "function isToggleOpen(event: Event): boolean",
22864
+ summary: "True when a native `toggle` event reports the overlay opening.",
22865
+ description: "True when a native `toggle` event reports the overlay opening.",
22866
+ members: [],
22867
+ version: "11.6.0"
22868
+ },
22869
+ {
22870
+ id: "discrete-overlay-transition",
22871
+ name: "discreteOverlayTransition",
22872
+ kind: "function",
22873
+ module: "overlay",
22874
+ importPath: "@uni-design-system/uni-angular",
22875
+ signature: "function discreteOverlayTransition(durationMs: number, hidden: Record<string, string | number>, shown: Record<string, string | number>, timingFunction?: string): Record<string, unknown>",
22876
+ summary: "The discrete-transition block that animates an element into and out of the top layer: `transition-behavior: allow-discrete` over the `hidden` keys plus `display`/`overlay`, the shown state under `:popover-open`, and `@starting-style` so entry transitions run from the hidden state.",
22877
+ description: "The discrete-transition block that animates an element into and out of the top layer: `transition-behavior: allow-discrete` over the `hidden` keys plus `display`/`overlay`, the shown state under `:popover-open`, and `@starting-style` so entry transitions run from the hidden state. `display` and `overlay` must ride along or the element cannot animate into and out of the top layer at all \u2014 it would simply appear and vanish. `timingFunction` is omitted from the output when not given, leaving the CSS initial value (`ease`), so callers that never asked for one are unaffected.",
22878
+ members: [],
22879
+ version: "11.6.0"
22880
+ },
22881
+ {
22882
+ id: "restore-overlay-focus",
22883
+ name: "restoreOverlayFocus",
22884
+ kind: "function",
22885
+ module: "overlay",
22886
+ importPath: "@uni-design-system/uni-angular",
22887
+ signature: "function restoreOverlayFocus(panel: HTMLElement, target: HTMLElement | null): void",
22888
+ summary: "Returns focus to `target` when an overlay closes while focus was inside its panel (or was dropped on `<body>` by the top layer closing), so keyboard users are never stranded (WCAG 2.4.3).",
22889
+ description: "Returns focus to `target` when an overlay closes while focus was inside its panel (or was dropped on `<body>` by the top layer closing), so keyboard users are never stranded (WCAG 2.4.3). Focus resting anywhere else is left alone.",
22890
+ members: [],
22891
+ version: "11.6.0"
22892
+ },
22893
+ {
22894
+ id: "focusable-elements",
22895
+ name: "focusableElements",
22896
+ kind: "function",
22897
+ module: "overlay",
22898
+ importPath: "@uni-design-system/uni-angular",
22899
+ signature: "function focusableElements(root: HTMLElement): HTMLElement[]",
22900
+ summary: "The focusable elements inside `root`, in DOM order.",
22901
+ description: "The focusable elements inside `root`, in DOM order. Filters disabled controls, and hidden ones where the environment can tell: jsdom reports `offsetParent` as null for every element, so the visibility filter applies only when the document actually lays out (some element has an offsetParent).",
22902
+ members: [],
22903
+ version: "11.6.0"
22904
+ },
22905
+ {
22906
+ id: "backdrop-dismiss",
22907
+ name: "BackdropDismiss",
22908
+ kind: "class",
22909
+ module: "overlay",
22910
+ importPath: "@uni-design-system/uni-angular",
22911
+ signature: "class BackdropDismiss",
22912
+ 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.",
22913
+ 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()" ```',
22914
+ members: [
22915
+ {
22916
+ name: "press",
22917
+ kind: "method",
22918
+ signature: "press(event: Event): void",
22919
+ description: "Record where the press began. `pointerdown` covers mouse, touch and pen."
22920
+ },
22921
+ {
22922
+ name: "isBackdropClick",
22923
+ kind: "method",
22924
+ signature: "isBackdropClick(event: Event): boolean",
22925
+ description: "True only when both the press and the click landed on the dialog itself."
22926
+ }
22927
+ ],
22928
+ version: "11.6.0"
22929
+ },
22930
+ {
22931
+ id: "sort-direction",
22932
+ name: "SortDirection",
22933
+ kind: "type",
22934
+ module: "datasource",
22935
+ importPath: "@uni-design-system/uni-angular",
22936
+ signature: "type SortDirection = 'asc' | 'desc' | 'indet'",
22937
+ summary: "",
22938
+ description: "",
22939
+ members: [],
22940
+ version: "11.6.0"
22941
+ },
22942
+ {
22943
+ id: "sort",
22944
+ name: "Sort",
22945
+ kind: "interface",
22946
+ module: "datasource",
22947
+ importPath: "@uni-design-system/uni-angular",
22948
+ signature: "interface Sort<T>",
22949
+ summary: "",
22950
+ description: "",
22951
+ members: [
22952
+ {
22953
+ name: "column",
22954
+ kind: "property",
22955
+ signature: "column?: keyof T",
22956
+ description: ""
22957
+ },
22958
+ {
22959
+ name: "direction",
22960
+ kind: "property",
22961
+ signature: "direction: SortDirection",
22962
+ description: ""
22963
+ }
22964
+ ],
22965
+ version: "11.6.0"
22966
+ },
22967
+ {
22968
+ id: "uni-base-datasource",
22969
+ name: "UniBaseDatasource",
22970
+ kind: "class",
22971
+ module: "datasource",
22972
+ importPath: "@uni-design-system/uni-angular",
22973
+ signature: "class UniBaseDatasource<T>",
22974
+ summary: "",
22975
+ description: "",
22976
+ members: [
22977
+ {
22978
+ name: "records",
22979
+ kind: "property",
22980
+ signature: "abstract records: Signal<T[]>",
22981
+ description: ""
22982
+ },
22983
+ {
22984
+ name: "recordCount",
22985
+ kind: "property",
22986
+ signature: "abstract recordCount: Signal<number>",
22987
+ description: ""
22988
+ },
22989
+ {
22990
+ name: "selections",
22991
+ kind: "property",
22992
+ signature: "selections = signal<T[]>([])",
22993
+ description: ""
22994
+ },
22995
+ {
22996
+ name: "sort",
22997
+ kind: "property",
22998
+ signature: "sort: WritableSignal<Sort<T>>",
22999
+ description: ""
23000
+ },
23001
+ {
23002
+ name: "sortColumn",
23003
+ kind: "property",
23004
+ signature: "sortColumn = computed(() => this.sort().column)",
23005
+ description: ""
23006
+ },
23007
+ {
23008
+ name: "sortDirection",
23009
+ kind: "property",
23010
+ signature: "sortDirection = computed(() => this.sort().direction)",
23011
+ description: ""
23012
+ },
23013
+ {
23014
+ name: "pageIndex",
23015
+ kind: "property",
23016
+ signature: "abstract pageIndex: Signal<number>",
23017
+ description: ""
23018
+ },
23019
+ {
23020
+ name: "pageSize",
23021
+ kind: "property",
23022
+ signature: "abstract pageSize: Signal<number>",
23023
+ description: ""
23024
+ },
23025
+ {
23026
+ name: "pageCount",
23027
+ kind: "property",
23028
+ signature: "abstract pageCount: Signal<number>",
23029
+ description: ""
23030
+ },
23031
+ {
23032
+ name: "pages",
23033
+ kind: "property",
23034
+ signature: "pages = computed(\u2026)",
23035
+ description: ""
23036
+ },
23037
+ {
23038
+ name: "startIndex",
23039
+ kind: "property",
23040
+ signature: "startIndex = computed(\u2026)",
23041
+ description: ""
23042
+ },
23043
+ {
23044
+ name: "endIndex",
23045
+ kind: "property",
23046
+ signature: "endIndex = computed(\u2026)",
23047
+ description: ""
23048
+ },
23049
+ {
23050
+ name: "disablePrevious",
23051
+ kind: "property",
23052
+ signature: "disablePrevious = computed(\u2026)",
23053
+ description: ""
23054
+ },
23055
+ {
23056
+ name: "disableNext",
23057
+ kind: "property",
23058
+ signature: "disableNext = computed(\u2026)",
23059
+ description: ""
23060
+ },
23061
+ {
23062
+ name: "truncatedPages",
23063
+ kind: "property",
23064
+ signature: "truncatedPages = computed(\u2026)",
23065
+ description: ""
23066
+ },
23067
+ {
23068
+ name: "isSelected",
23069
+ kind: "method",
23070
+ signature: "isSelected(row: T): boolean",
23071
+ description: ""
23072
+ },
23073
+ {
23074
+ name: "toggleSelection",
23075
+ kind: "method",
23076
+ signature: "toggleSelection(row: T)",
23077
+ description: ""
23078
+ },
23079
+ {
23080
+ name: "clearSelections",
23081
+ kind: "method",
23082
+ signature: "clearSelections()",
23083
+ description: ""
23084
+ },
23085
+ {
23086
+ name: "selectAll",
23087
+ kind: "method",
23088
+ signature: "selectAll()",
23089
+ description: ""
23090
+ },
23091
+ {
23092
+ name: "sortRecords",
23093
+ kind: "method",
23094
+ signature: "abstract sortRecords(sort: Sort<T>): void",
23095
+ description: ""
23096
+ },
23097
+ {
23098
+ name: "firstPage",
23099
+ kind: "method",
23100
+ signature: "abstract firstPage(): void",
23101
+ description: ""
23102
+ },
23103
+ {
23104
+ name: "nextPage",
23105
+ kind: "method",
23106
+ signature: "abstract nextPage(): void",
23107
+ description: ""
23108
+ },
23109
+ {
23110
+ name: "previousPage",
23111
+ kind: "method",
23112
+ signature: "abstract previousPage(): void",
23113
+ description: ""
23114
+ },
23115
+ {
23116
+ name: "lastPage",
23117
+ kind: "method",
23118
+ signature: "abstract lastPage(): void",
23119
+ description: ""
23120
+ },
23121
+ {
23122
+ name: "jumpToPage",
23123
+ kind: "method",
23124
+ signature: "abstract jumpToPage(page: number): void",
23125
+ description: ""
23126
+ },
23127
+ {
23128
+ name: "setPageSize",
23129
+ kind: "method",
23130
+ signature: "abstract setPageSize(size: number): void",
23131
+ description: ""
23132
+ }
23133
+ ],
23134
+ version: "11.6.0"
23135
+ },
23136
+ {
23137
+ id: "page-request",
23138
+ name: "PageRequest",
23139
+ kind: "interface",
23140
+ module: "datasource",
23141
+ importPath: "@uni-design-system/uni-angular",
23142
+ signature: "interface PageRequest",
23143
+ summary: "",
23144
+ description: "",
23145
+ members: [
23146
+ {
23147
+ name: "pageNumber",
23148
+ kind: "property",
23149
+ signature: "pageNumber: number",
23150
+ description: ""
23151
+ },
23152
+ {
23153
+ name: "pageSize",
23154
+ kind: "property",
23155
+ signature: "pageSize: number",
23156
+ description: ""
23157
+ },
23158
+ {
23159
+ name: "sortColumn",
23160
+ kind: "property",
23161
+ signature: "sortColumn?: string",
23162
+ description: ""
23163
+ },
23164
+ {
23165
+ name: "sortDirection",
23166
+ kind: "property",
23167
+ signature: "sortDirection?: SortDirection",
23168
+ description: ""
23169
+ },
23170
+ {
23171
+ name: "filter",
23172
+ kind: "property",
23173
+ signature: "filter?: Record<string, any>",
23174
+ description: ""
23175
+ }
23176
+ ],
23177
+ version: "11.6.0"
23178
+ },
23179
+ {
23180
+ id: "page-response",
23181
+ name: "PageResponse",
23182
+ kind: "interface",
23183
+ module: "datasource",
23184
+ importPath: "@uni-design-system/uni-angular",
23185
+ signature: "interface PageResponse<T>",
23186
+ summary: "",
23187
+ description: "",
23188
+ members: [
23189
+ {
23190
+ name: "data",
23191
+ kind: "property",
23192
+ signature: "data: T[]",
23193
+ description: ""
23194
+ },
23195
+ {
23196
+ name: "totalRecords",
23197
+ kind: "property",
23198
+ signature: "totalRecords: number",
23199
+ description: ""
23200
+ },
23201
+ {
23202
+ name: "pageNumber",
23203
+ kind: "property",
23204
+ signature: "pageNumber: number",
23205
+ description: ""
23206
+ },
23207
+ {
23208
+ name: "pageSize",
23209
+ kind: "property",
23210
+ signature: "pageSize: number",
23211
+ description: ""
23212
+ }
23213
+ ],
23214
+ version: "11.6.0"
23215
+ },
23216
+ {
23217
+ id: "data-loader",
23218
+ name: "DataLoader",
23219
+ kind: "type",
23220
+ module: "datasource",
23221
+ importPath: "@uni-design-system/uni-angular",
23222
+ signature: "type DataLoader<T> = (request: PageRequest) => Promise<PageResponse<T>>",
23223
+ summary: "",
23224
+ description: "",
23225
+ members: [],
23226
+ version: "11.6.0"
23227
+ },
23228
+ {
23229
+ id: "uni-server-side-datasource",
23230
+ name: "UniServerSideDatasource",
23231
+ kind: "class",
23232
+ module: "datasource",
23233
+ importPath: "@uni-design-system/uni-angular",
23234
+ signature: "class UniServerSideDatasource<T> extends UniBaseDatasource<T>",
23235
+ summary: "",
23236
+ description: "",
23237
+ members: [
23238
+ {
23239
+ name: "sortColumn",
23240
+ kind: "property",
23241
+ signature: "sortColumn = computed(() => this._sortColumn())",
23242
+ description: ""
23243
+ },
23244
+ {
23245
+ name: "sortDirection",
23246
+ kind: "property",
23247
+ signature: "sortDirection = computed(() => this._sortDirection())",
23248
+ description: ""
23249
+ },
23250
+ {
23251
+ name: "pageIndex",
23252
+ kind: "property",
23253
+ signature: "pageIndex = computed(() => this._pageNumber() - 1)",
23254
+ description: ""
23255
+ },
23256
+ {
23257
+ name: "pageSize",
23258
+ kind: "property",
23259
+ signature: "pageSize = computed(() => this._pageSize())",
23260
+ description: ""
23261
+ },
23262
+ {
23263
+ name: "pageCount",
23264
+ kind: "property",
23265
+ signature: "pageCount = computed(\u2026)",
23266
+ description: ""
23267
+ },
23268
+ {
23269
+ name: "records",
23270
+ kind: "property",
23271
+ signature: "records = this._records.asReadonly()",
23272
+ description: ""
23273
+ },
23274
+ {
23275
+ name: "recordCount",
23276
+ kind: "property",
23277
+ signature: "recordCount = computed(() => this.totalRecords())",
23278
+ description: ""
23279
+ },
23280
+ {
23281
+ name: "isLoading",
23282
+ kind: "property",
23283
+ signature: "isLoading = computed(() => this.dataResource.isLoading())",
23284
+ description: ""
23285
+ },
23286
+ {
23287
+ name: "error",
23288
+ kind: "property",
23289
+ signature: "error = computed(() => this.dataResource.error())",
23290
+ description: ""
23291
+ },
23292
+ {
23293
+ name: "hasError",
23294
+ kind: "property",
23295
+ signature: "hasError = computed(\u2026)",
23296
+ description: ""
23297
+ },
23298
+ {
23299
+ name: "sortRecords",
23300
+ kind: "method",
23301
+ signature: "sortRecords(sort: Sort<T>)",
23302
+ description: ""
23303
+ },
23304
+ {
23305
+ name: "firstPage",
23306
+ kind: "method",
23307
+ signature: "firstPage()",
23308
+ description: ""
23309
+ },
23310
+ {
23311
+ name: "nextPage",
23312
+ kind: "method",
23313
+ signature: "nextPage()",
23314
+ description: ""
23315
+ },
23316
+ {
23317
+ name: "previousPage",
23318
+ kind: "method",
23319
+ signature: "previousPage()",
23320
+ description: ""
23321
+ },
23322
+ {
23323
+ name: "lastPage",
23324
+ kind: "method",
23325
+ signature: "lastPage()",
23326
+ description: ""
23327
+ },
23328
+ {
23329
+ name: "jumpToPage",
23330
+ kind: "method",
23331
+ signature: "jumpToPage(page: number)",
23332
+ description: ""
23333
+ },
23334
+ {
23335
+ name: "setPageSize",
23336
+ kind: "method",
23337
+ signature: "setPageSize(size: number)",
23338
+ description: ""
23339
+ },
23340
+ {
23341
+ name: "setFilter",
23342
+ kind: "method",
23343
+ signature: "setFilter(filterValues: Record<string, any>)",
23344
+ description: ""
23345
+ },
23346
+ {
23347
+ name: "clearFilter",
23348
+ kind: "method",
23349
+ signature: "clearFilter()",
23350
+ description: ""
23351
+ },
23352
+ {
23353
+ name: "refresh",
23354
+ kind: "method",
23355
+ signature: "refresh()",
23356
+ description: ""
23357
+ },
23358
+ {
23359
+ name: "getPageRequest",
23360
+ kind: "method",
23361
+ signature: "getPageRequest(): PageRequest",
23362
+ description: ""
23363
+ }
23364
+ ],
23365
+ version: "11.6.0"
23366
+ },
23367
+ {
23368
+ id: "uni-datasource",
23369
+ name: "UniDatasource",
23370
+ kind: "type",
23371
+ module: "datasource",
23372
+ importPath: "@uni-design-system/uni-angular",
23373
+ signature: "type UniDatasource<T> = UniBaseDatasource<T>",
23374
+ summary: "",
23375
+ description: "",
23376
+ members: [],
23377
+ version: "11.6.0"
23378
+ },
23379
+ {
23380
+ id: "uni-record-datasource",
23381
+ name: "UniRecordDatasource",
23382
+ kind: "class",
23383
+ module: "datasource",
23384
+ importPath: "@uni-design-system/uni-angular",
23385
+ signature: "class UniRecordDatasource<T> extends UniBaseDatasource<T>",
23386
+ summary: "",
23387
+ description: "",
23388
+ members: [
23389
+ {
23390
+ name: "initialRecords",
23391
+ kind: "property",
23392
+ signature: "initialRecords = signal<T[]>([])",
23393
+ description: ""
23394
+ },
23395
+ {
23396
+ name: "recordCount",
23397
+ kind: "property",
23398
+ signature: "recordCount = computed((): number => this.initialRecords().filter(this.filter()).length)",
23399
+ description: ""
23400
+ },
23401
+ {
23402
+ name: "filter",
23403
+ kind: "property",
23404
+ signature: "filter = signal<(value: T) => boolean>((value) => true)",
23405
+ description: ""
23406
+ },
23407
+ {
23408
+ name: "pageIndex",
23409
+ kind: "property",
23410
+ signature: "pageIndex = signal<number>(0)",
23411
+ description: ""
23412
+ },
23413
+ {
23414
+ name: "pageSize",
23415
+ kind: "property",
23416
+ signature: "pageSize = computed(() => this._pageSize())",
23417
+ description: ""
23418
+ },
23419
+ {
23420
+ name: "pageCount",
23421
+ kind: "property",
23422
+ signature: "pageCount = computed(\u2026)",
23423
+ description: ""
23424
+ },
23425
+ {
23426
+ name: "records",
23427
+ kind: "property",
23428
+ signature: "records = computed(\u2026)",
23429
+ description: ""
23430
+ },
23431
+ {
23432
+ name: "sortRecords",
23433
+ kind: "method",
23434
+ signature: "sortRecords(sort: Sort<T>)",
23435
+ description: ""
23436
+ },
23437
+ {
23438
+ name: "firstPage",
23439
+ kind: "method",
23440
+ signature: "firstPage()",
23441
+ description: ""
23442
+ },
23443
+ {
23444
+ name: "nextPage",
23445
+ kind: "method",
23446
+ signature: "nextPage()",
23447
+ description: ""
23448
+ },
23449
+ {
23450
+ name: "previousPage",
23451
+ kind: "method",
23452
+ signature: "previousPage()",
23453
+ description: ""
23454
+ },
23455
+ {
23456
+ name: "lastPage",
23457
+ kind: "method",
23458
+ signature: "lastPage()",
23459
+ description: ""
23460
+ },
23461
+ {
23462
+ name: "jumpToPage",
23463
+ kind: "method",
23464
+ signature: "jumpToPage(page: number)",
23465
+ description: ""
23466
+ },
23467
+ {
23468
+ name: "setPageSize",
23469
+ kind: "method",
23470
+ signature: "setPageSize(size: number)",
23471
+ description: ""
23472
+ },
23473
+ {
23474
+ name: "setFilter",
23475
+ kind: "method",
23476
+ signature: "setFilter(filter: (value: T) => boolean)",
23477
+ description: ""
23478
+ },
23479
+ {
23480
+ name: "clearFilter",
23481
+ kind: "method",
23482
+ signature: "clearFilter()",
23483
+ description: ""
23484
+ }
23485
+ ],
23486
+ version: "11.6.0"
23487
+ },
23488
+ {
23489
+ id: "local-storage-service",
23490
+ name: "LocalStorageService",
23491
+ kind: "service",
23492
+ module: "local-storage",
23493
+ importPath: "@uni-design-system/uni-angular",
23494
+ signature: "class LocalStorageService",
23495
+ summary: "",
23496
+ description: "",
23497
+ members: [
23498
+ {
23499
+ name: "setItem",
23500
+ kind: "method",
23501
+ signature: "setItem<T>(key: string, value: T): boolean",
23502
+ description: ""
23503
+ },
23504
+ {
23505
+ name: "getItem",
23506
+ kind: "method",
23507
+ signature: "getItem<T>(key: string): T | null",
23508
+ description: ""
23509
+ },
23510
+ {
23511
+ name: "removeItem",
23512
+ kind: "method",
23513
+ signature: "removeItem(key: string): boolean",
23514
+ description: ""
23515
+ },
23516
+ {
23517
+ name: "clear",
23518
+ kind: "method",
23519
+ signature: "clear(): boolean",
23520
+ description: ""
23521
+ },
23522
+ {
23523
+ name: "hasKey",
23524
+ kind: "method",
23525
+ signature: "hasKey(key: string): boolean",
23526
+ description: ""
23527
+ },
23528
+ {
23529
+ name: "getAllKeys",
23530
+ kind: "method",
23531
+ signature: "getAllKeys(): string[]",
23532
+ description: ""
23533
+ },
23534
+ {
23535
+ name: "getSize",
23536
+ kind: "method",
23537
+ signature: "getSize(): number",
23538
+ description: ""
23539
+ }
23540
+ ],
23541
+ version: "11.6.0"
23542
+ },
23543
+ {
23544
+ id: "alert",
23545
+ name: "Alert",
23546
+ kind: "interface",
23547
+ module: "notification",
23548
+ importPath: "@uni-design-system/uni-angular",
23549
+ signature: "interface Alert",
23550
+ summary: "",
23551
+ description: "",
23552
+ members: [
23553
+ {
23554
+ name: "message",
23555
+ kind: "property",
23556
+ signature: "message: string",
23557
+ description: ""
23558
+ },
23559
+ {
23560
+ name: "iconName",
23561
+ kind: "property",
23562
+ signature: "iconName?: IconName",
23563
+ description: ""
23564
+ },
23565
+ {
23566
+ name: "symbolName",
23567
+ kind: "property",
23568
+ signature: "symbolName?: string",
23569
+ description: ""
23570
+ },
23571
+ {
23572
+ name: "variant",
23573
+ kind: "property",
23574
+ signature: "variant?: Variant",
23575
+ description: ""
23576
+ },
23577
+ {
23578
+ name: "action",
23579
+ kind: "property",
23580
+ signature: "action?: () => void",
23581
+ description: ""
23582
+ },
23583
+ {
23584
+ name: "actionLabel",
23585
+ kind: "property",
23586
+ signature: "actionLabel?: string",
23587
+ description: ""
23588
+ },
23589
+ {
23590
+ name: "topPosition",
23591
+ kind: "property",
23592
+ signature: "topPosition?: number",
23593
+ description: ""
23594
+ }
23595
+ ],
23596
+ version: "11.6.0"
23597
+ },
23598
+ {
23599
+ id: "snackbar",
23600
+ name: "Snackbar",
23601
+ kind: "interface",
23602
+ module: "notification",
23603
+ importPath: "@uni-design-system/uni-angular",
23604
+ signature: "interface Snackbar",
23605
+ summary: "",
23606
+ description: "",
23607
+ members: [
23608
+ {
23609
+ name: "message",
23610
+ kind: "property",
23611
+ signature: "message: string",
23612
+ description: ""
23613
+ },
23614
+ {
23615
+ name: "action",
23616
+ kind: "property",
23617
+ signature: "action?: () => void",
23618
+ description: ""
23619
+ },
23620
+ {
23621
+ name: "actionLabel",
23622
+ kind: "property",
23623
+ signature: "actionLabel?: string",
23624
+ description: ""
23625
+ },
23626
+ {
23627
+ name: "iconName",
23628
+ kind: "property",
23629
+ signature: "iconName?: IconName",
23630
+ description: ""
23631
+ },
23632
+ {
23633
+ name: "symbolName",
23634
+ kind: "property",
23635
+ signature: "symbolName?: string",
23636
+ description: ""
23637
+ },
23638
+ {
23639
+ name: "variant",
23640
+ kind: "property",
23641
+ signature: "variant?: Variant",
23642
+ description: ""
23643
+ },
23644
+ {
23645
+ name: "timeout",
23646
+ kind: "property",
23647
+ signature: "timeout?: number | string | 'disabled'",
23648
+ description: ""
23649
+ }
23650
+ ],
23651
+ version: "11.6.0"
23652
+ },
23653
+ {
23654
+ id: "confirmation",
23655
+ name: "Confirmation",
23656
+ kind: "interface",
23657
+ module: "notification",
23658
+ importPath: "@uni-design-system/uni-angular",
23659
+ signature: "interface Confirmation",
23660
+ summary: "",
23661
+ description: "",
23662
+ members: [
23663
+ {
23664
+ name: "title",
23665
+ kind: "property",
23666
+ signature: "title: string",
23667
+ description: ""
23668
+ },
23669
+ {
23670
+ name: "message",
23671
+ kind: "property",
23672
+ signature: "message: string",
23673
+ description: ""
23674
+ },
23675
+ {
23676
+ name: "action",
23677
+ kind: "property",
23678
+ signature: "action: () => void",
23679
+ description: ""
23680
+ },
23681
+ {
23682
+ name: "actionLabel",
23683
+ kind: "property",
23684
+ signature: "actionLabel?: string",
23685
+ description: ""
23686
+ },
23687
+ {
23688
+ name: "dismissLabel",
23689
+ kind: "property",
23690
+ signature: "dismissLabel?: string",
23691
+ description: ""
23692
+ },
23693
+ {
23694
+ name: "color",
23695
+ kind: "property",
23696
+ signature: "color?: ContainerColorToken",
23697
+ description: ""
23698
+ }
23699
+ ],
23700
+ version: "11.6.0"
23701
+ },
23702
+ {
23703
+ id: "notification-service",
23704
+ name: "NotificationService",
23705
+ kind: "service",
23706
+ module: "notification",
23707
+ importPath: "@uni-design-system/uni-angular",
23708
+ signature: "class NotificationService",
23709
+ summary: "",
23710
+ description: "",
23711
+ members: [
23712
+ {
23713
+ name: "alert",
23714
+ kind: "property",
23715
+ signature: "alert = signal<Alert | undefined>(undefined)",
23716
+ description: ""
23717
+ },
23718
+ {
23719
+ name: "showAlert",
23720
+ kind: "method",
23721
+ signature: "showAlert(alert: Alert)",
23722
+ description: ""
23723
+ },
23724
+ {
23725
+ name: "hideAlert",
23726
+ kind: "method",
23727
+ signature: "hideAlert()",
23728
+ description: ""
23729
+ },
23730
+ {
23731
+ name: "snackbar",
23732
+ kind: "property",
23733
+ signature: "snackbar = signal<Snackbar | undefined>(undefined)",
23734
+ description: ""
23735
+ },
23736
+ {
23737
+ name: "showSnackbar",
23738
+ kind: "method",
23739
+ signature: "showSnackbar(snackbar: Snackbar)",
23740
+ description: ""
23741
+ },
23742
+ {
23743
+ name: "hideSnackbar",
23744
+ kind: "method",
23745
+ signature: "hideSnackbar()",
23746
+ description: ""
23747
+ },
23748
+ {
23749
+ name: "confirmation",
23750
+ kind: "property",
23751
+ signature: "confirmation = signal<Confirmation | undefined>(undefined)",
23752
+ description: ""
23753
+ },
23754
+ {
23755
+ name: "showConfirmation",
23756
+ kind: "method",
23757
+ signature: "showConfirmation(confirmation: Confirmation)",
23758
+ description: ""
23759
+ },
23760
+ {
23761
+ name: "hideConfirmation",
23762
+ kind: "method",
23763
+ signature: "hideConfirmation()",
23764
+ description: ""
23765
+ }
23766
+ ],
23767
+ version: "11.6.0"
23768
+ },
23769
+ {
23770
+ id: "option",
23771
+ name: "Option",
23772
+ kind: "interface",
23773
+ module: "option",
23774
+ importPath: "@uni-design-system/uni-angular",
23775
+ signature: "interface Option<T = unknown>",
23776
+ summary: "",
23777
+ description: "",
23778
+ members: [
23779
+ {
23780
+ name: "label",
23781
+ kind: "property",
23782
+ signature: "label: string",
23783
+ description: ""
23784
+ },
23785
+ {
23786
+ name: "value",
23787
+ kind: "property",
23788
+ signature: "value: T",
23789
+ description: ""
23790
+ },
23791
+ {
23792
+ name: "description",
23793
+ kind: "property",
23794
+ signature: "description?: string",
23795
+ description: "Secondary line, e.g. an email under a name. Read as part of the option's name."
23796
+ },
23797
+ {
23798
+ name: "disabled",
23799
+ kind: "property",
23800
+ signature: "disabled?: boolean",
23801
+ description: "Visible and announced, but not committable; listbox navigation skips it."
23802
+ }
23803
+ ],
23804
+ version: "11.6.0"
23805
+ },
23806
+ {
23807
+ id: "options",
23808
+ name: "Options",
23809
+ kind: "type",
23810
+ module: "option",
23811
+ importPath: "@uni-design-system/uni-angular",
23812
+ signature: "type Options<T = unknown> = Option<T>[]",
23813
+ summary: "",
23814
+ description: "",
23815
+ members: [],
23816
+ version: "11.6.0"
23817
+ },
23818
+ {
23819
+ id: "use-timer",
23820
+ name: "useTimer",
23821
+ kind: "function",
23822
+ module: "timer",
23823
+ importPath: "@uni-design-system/uni-angular",
23824
+ signature: "function useTimer()",
23825
+ summary: "",
23826
+ description: "",
23827
+ members: [],
23828
+ version: "11.6.0"
23829
+ },
23830
+ {
23831
+ id: "acceptable-file",
23832
+ name: "acceptableFile",
23833
+ kind: "function",
23834
+ module: "file",
23835
+ importPath: "@uni-design-system/uni-angular",
23836
+ signature: "function acceptableFile(file: File, acceptedFileExtensions: string[] | undefined): boolean",
23837
+ summary: "",
23838
+ description: "",
23839
+ members: [],
23840
+ version: "11.6.0"
23841
+ },
23842
+ {
23843
+ id: "get-file-extension",
23844
+ name: "getFileExtension",
23845
+ kind: "function",
23846
+ module: "file",
23847
+ importPath: "@uni-design-system/uni-angular",
23848
+ signature: "function getFileExtension(file: File): string",
23849
+ summary: "",
23850
+ description: "",
23851
+ members: [],
23852
+ version: "11.6.0"
23853
+ },
23854
+ {
23855
+ id: "query-permission",
23856
+ name: "queryPermission",
23857
+ kind: "function",
23858
+ module: "permission",
23859
+ importPath: "@uni-design-system/uni-angular",
23860
+ signature: "async function queryPermission(permission: Permission): Promise<PermissionState>",
23861
+ summary: "The current state of a browser permission.",
23862
+ description: 'The current state of a browser permission. Resolves `unsupported` \u2014 never rejects \u2014 where the Permissions API is missing or does not know the name, which is the norm rather than the exception: Firefox and Safari reject `clipboard-write`, for one. Treat `unsupported` as "can\'t tell", not "no".',
23863
+ members: [],
23864
+ version: "11.6.0"
23865
+ },
23866
+ {
23867
+ id: "permission-service",
23868
+ name: "PermissionService",
23869
+ kind: "service",
23870
+ module: "permission",
23871
+ importPath: "@uni-design-system/uni-angular",
23872
+ signature: "class PermissionService",
23873
+ summary: "",
23874
+ description: "",
23875
+ members: [
23876
+ {
23877
+ name: "getPermissionState",
23878
+ kind: "method",
23879
+ signature: "getPermissionState(permission: Permission): Promise<PermissionState>",
23880
+ description: ""
23881
+ },
23882
+ {
23883
+ name: "isAllowed",
23884
+ kind: "method",
23885
+ signature: "async isAllowed(permission: Permission)",
23886
+ description: ""
23887
+ }
23888
+ ],
23889
+ version: "11.6.0"
23890
+ },
23891
+ {
23892
+ id: "permission",
23893
+ name: "Permission",
23894
+ kind: "type",
23895
+ module: "permission",
23896
+ importPath: "@uni-design-system/uni-angular",
23897
+ 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'",
23898
+ summary: "",
23899
+ description: "",
23900
+ members: [],
23901
+ version: "11.6.0"
23902
+ },
23903
+ {
23904
+ id: "permission-state",
23905
+ name: "PermissionState",
23906
+ kind: "type",
23907
+ module: "permission",
23908
+ importPath: "@uni-design-system/uni-angular",
23909
+ signature: "type PermissionState = 'granted' | 'prompt' | 'denied' | 'unsupported'",
23910
+ summary: "",
23911
+ description: "",
23912
+ members: [],
23913
+ version: "11.6.0"
23914
+ },
23915
+ {
23916
+ id: "clipboard-copy-result",
23917
+ name: "ClipboardCopyResult",
23918
+ kind: "type",
23919
+ module: "clipboard",
23920
+ importPath: "@uni-design-system/uni-angular",
23921
+ signature: "type ClipboardCopyResult = 'copied' | 'denied' | 'unsupported' | 'failed'",
23922
+ summary: "How a copy ended: - `copied` \u2014 the content is on the clipboard.",
23923
+ description: "How a copy ended: - `copied` \u2014 the content is on the clipboard. - `denied` \u2014 the user or a policy has blocked clipboard access for this site; only a change in the browser's site settings will fix it. - `unsupported` \u2014 no Clipboard API here (an insecure context, a server render, an old browser) or the browser cannot write one of the types. - `failed` \u2014 the browser refused this attempt for another reason, most often a call made outside a user gesture or from an unfocused document.",
23924
+ members: [],
23925
+ version: "11.6.0"
23926
+ },
23927
+ {
23928
+ id: "clipboard-data",
23929
+ name: "ClipboardData",
23930
+ kind: "type",
23931
+ module: "clipboard",
23932
+ importPath: "@uni-design-system/uni-angular",
23933
+ signature: "type ClipboardData = string | Blob | PromiseLike<string | Blob>",
23934
+ summary: "One clipboard representation; a promise lets the data arrive after the gesture.",
23935
+ description: "One clipboard representation; a promise lets the data arrive after the gesture.",
23936
+ members: [],
23937
+ version: "11.6.0"
23938
+ },
23939
+ {
23940
+ id: "clipboard-content",
23941
+ name: "ClipboardContent",
23942
+ kind: "type",
23943
+ module: "clipboard",
23944
+ importPath: "@uni-design-system/uni-angular",
23945
+ signature: "type ClipboardContent = string | Record<string, ClipboardData>",
23946
+ summary: "What to copy: a plain string, or one item in several representations keyed by MIME type \u2014 `{ 'text/plain': \u2026, 'text/html': \u2026 }`, `{ 'image/png': blob }`.",
23947
+ description: "What to copy: a plain string, or one item in several representations keyed by MIME type \u2014 `{ 'text/plain': \u2026, 'text/html': \u2026 }`, `{ 'image/png': blob }`.",
23948
+ members: [],
23949
+ version: "11.6.0"
23950
+ },
23951
+ {
23952
+ id: "copy-to-clipboard",
23953
+ name: "copyToClipboard",
23954
+ kind: "function",
23955
+ module: "clipboard",
23956
+ importPath: "@uni-design-system/uni-angular",
23957
+ signature: "async function copyToClipboard(content: ClipboardContent): Promise<ClipboardCopyResult>",
23958
+ summary: "Copies text or rich content with the Async Clipboard API.",
23959
+ description: "Copies text or rich content with the Async Clipboard API. Never rejects: the result says what happened, so a caller can tell the user why. Call it directly from the click or key handler. The write starts synchronously, before anything is awaited, because browsers only honor it inside the user gesture \u2014 which is also why the `clipboard-write` permission is consulted after a refusal, to explain it, rather than before the attempt. For content that has to be fetched or rendered first, pass a promise as the value instead of awaiting it yourself.",
23960
+ members: [],
23961
+ version: "11.6.0"
23962
+ }
23963
+ ],
23964
+ utilityDocs: [
23965
+ {
23966
+ module: "datasource",
23967
+ title: "Datasource",
23968
+ 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._"
23969
+ },
23970
+ {
23971
+ module: "local-storage",
23972
+ title: "LocalStorage",
23973
+ 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._"
23974
+ },
23975
+ {
23976
+ module: "notification",
23977
+ title: "Notifications",
23978
+ 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```"
23979
+ },
23980
+ {
23981
+ module: "timer",
23982
+ title: "Timer",
23983
+ 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._"
23984
+ },
23985
+ {
23986
+ module: "permission",
23987
+ title: "Permissions API",
23988
+ 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)"
23989
+ },
23990
+ {
23991
+ module: "clipboard",
23992
+ title: "Clipboard",
23993
+ 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)"
23994
+ }
23995
+ ]
23996
+ };
23997
+
23998
+ // src/server/store.ts
23999
+ var index = uni_index_default;
24000
+ var meta = index.meta;
24001
+ function frameworksFor(c) {
24002
+ return Object.keys(c.bindings);
24003
+ }
20569
24004
  function listComponents(filter = {}) {
20570
24005
  return index.components.filter((c) => {
20571
24006
  if (filter.framework && !c.bindings[filter.framework]) return false;
@@ -20624,6 +24059,23 @@ function selectReleases(cl, scope) {
20624
24059
  if (scope.since) return cl.releases.filter((r) => compareVersions(r.version, scope.since) > 0);
20625
24060
  return cl.releases;
20626
24061
  }
24062
+ function listUtilities(filter = {}) {
24063
+ return (index.utilities ?? []).filter((u) => {
24064
+ if (filter.module && u.module !== filter.module) return false;
24065
+ if (filter.kind && u.kind !== filter.kind) return false;
24066
+ return true;
24067
+ });
24068
+ }
24069
+ function getUtility(idOrName) {
24070
+ const q = idOrName.trim();
24071
+ const lower = q.toLowerCase();
24072
+ return listUtilities().find(
24073
+ (u) => u.id === lower || u.name === q || u.name.toLowerCase() === lower
24074
+ );
24075
+ }
24076
+ function getUtilityDoc(module) {
24077
+ return (index.utilityDocs ?? []).find((d) => d.module === module);
24078
+ }
20627
24079
  function search(query, kind) {
20628
24080
  const q = query.toLowerCase().trim();
20629
24081
  if (!q) return [];
@@ -20633,7 +24085,12 @@ function search(query, kind) {
20633
24085
  for (const c of index.components) {
20634
24086
  const apiNames = frameworksFor(c).flatMap((f) => c.bindings[f].api.map((a) => a.name));
20635
24087
  if (match(c.id, c.name, c.summary, c.description, c.category, ...apiNames)) {
20636
- hits.push({ kind: "component", id: c.id, label: c.name, snippet: c.summary || c.description.slice(0, 120) });
24088
+ hits.push({
24089
+ kind: "component",
24090
+ id: c.id,
24091
+ label: c.name,
24092
+ snippet: c.summary || c.description.slice(0, 120)
24093
+ });
20637
24094
  }
20638
24095
  }
20639
24096
  }
@@ -20651,11 +24108,29 @@ function search(query, kind) {
20651
24108
  }
20652
24109
  }
20653
24110
  }
24111
+ if (!kind || kind === "utility") {
24112
+ for (const u of index.utilities ?? []) {
24113
+ const memberNames = u.members.map((m) => m.name);
24114
+ if (match(u.id, u.name, u.module, u.summary, u.description, ...memberNames)) {
24115
+ hits.push({
24116
+ kind: "utility",
24117
+ id: u.id,
24118
+ label: `${u.name} (${u.module})`,
24119
+ snippet: u.summary || u.signature
24120
+ });
24121
+ }
24122
+ }
24123
+ }
20654
24124
  if (!kind || kind === "guideline") {
20655
24125
  for (const c of index.components) {
20656
24126
  const g = c.guidelines;
20657
24127
  if (match(g.whenToUse, ...g.dos, ...g.donts, ...g.accessibility)) {
20658
- hits.push({ kind: "guideline", id: c.id, label: `${c.name} guidelines`, snippet: g.whenToUse.slice(0, 120) });
24128
+ hits.push({
24129
+ kind: "guideline",
24130
+ id: c.id,
24131
+ label: `${c.name} guidelines`,
24132
+ snippet: g.whenToUse.slice(0, 120)
24133
+ });
20659
24134
  }
20660
24135
  }
20661
24136
  }
@@ -20704,7 +24179,8 @@ _Not yet available for ${f}._`);
20704
24179
  **API**
20705
24180
  ${formatApiTable(b)}`);
20706
24181
  }
20707
- if (c.relatedTokens.length) out.push(`
24182
+ if (c.relatedTokens.length)
24183
+ out.push(`
20708
24184
  **Related tokens:** ${c.relatedTokens.map((t) => `\`${t}\``).join(", ")}`);
20709
24185
  if (c.examples.length) {
20710
24186
  const ex = c.examples[0];
@@ -20713,13 +24189,15 @@ ${formatApiTable(b)}`);
20713
24189
  \`\`\`html
20714
24190
  ${ex.code}
20715
24191
  \`\`\``);
20716
- if (c.examples.length > 1) out.push(`_+${c.examples.length - 1} more via get-component-examples._`);
24192
+ if (c.examples.length > 1)
24193
+ out.push(`_+${c.examples.length - 1} more via get-component-examples._`);
20717
24194
  }
20718
24195
  return out.join("\n");
20719
24196
  }
20720
24197
  function formatExamples(c, framework) {
20721
24198
  const examples = framework ? c.examples.filter((e) => e.framework === framework) : c.examples;
20722
- if (!examples.length) return `No examples found for \`${c.id}\`${framework ? ` (${framework})` : ""}.`;
24199
+ if (!examples.length)
24200
+ return `No examples found for \`${c.id}\`${framework ? ` (${framework})` : ""}.`;
20723
24201
  const blocks = examples.map((e) => {
20724
24202
  const link = e.storybookUrl ? `
20725
24203
  [Open in Storybook](${e.storybookUrl})` : "";
@@ -20773,7 +24251,9 @@ function formatTheme(t) {
20773
24251
  out.push("\n## Component options (-> component inputs/props)");
20774
24252
  out.push("_Behavioral preferences. Pass as inputs/props, not CSS._");
20775
24253
  for (const [component, opts] of Object.entries(t.componentOptions)) {
20776
- out.push(`- **${component}**: ${Object.entries(opts).map(([k, v]) => `\`${k}=${v}\``).join(", ")}`);
24254
+ out.push(
24255
+ `- **${component}**: ${Object.entries(opts).map(([k, v]) => `\`${k}=${v}\``).join(", ")}`
24256
+ );
20777
24257
  }
20778
24258
  if (t.usage) out.push(`
20779
24259
  ## How to apply
@@ -20783,7 +24263,8 @@ ${t.usage}`);
20783
24263
  function formatGuidelines(c) {
20784
24264
  const g = c.guidelines;
20785
24265
  const has = g.whenToUse || g.dos.length || g.donts.length || g.accessibility.length;
20786
- if (!has) return `No authored guidelines yet for \`${c.id}\`. (Author them in the component's MDX.)`;
24266
+ if (!has)
24267
+ return `No authored guidelines yet for \`${c.id}\`. (Author them in the component's MDX.)`;
20787
24268
  const out = [`# ${c.name} - guidelines`];
20788
24269
  if (g.whenToUse) out.push(`
20789
24270
  **When to use**
@@ -20794,7 +24275,8 @@ ${g.dos.map((d) => `- ${d}`).join("\n")}`);
20794
24275
  if (g.donts.length) out.push(`
20795
24276
  **Don't**
20796
24277
  ${g.donts.map((d) => `- ${d}`).join("\n")}`);
20797
- if (g.accessibility.length) out.push(`
24278
+ if (g.accessibility.length)
24279
+ out.push(`
20798
24280
  **Accessibility**
20799
24281
  ${g.accessibility.map((a) => `- ${a}`).join("\n")}`);
20800
24282
  return out.join("\n");
@@ -20832,7 +24314,9 @@ function formatChangelog(cl, scope = {}) {
20832
24314
  const shown = full ? releases : releases.slice(0, 15);
20833
24315
  const out = [`# ${cl.package} \u2014 release notes`, ...shown.map((r) => formatRelease(r, full))];
20834
24316
  if (shown.length < releases.length) {
20835
- out.push(`_...and ${releases.length - shown.length} older releases. Pass \`version\` or \`since\` to scope._`);
24317
+ out.push(
24318
+ `_...and ${releases.length - shown.length} older releases. Pass \`version\` or \`since\` to scope._`
24319
+ );
20836
24320
  }
20837
24321
  return out.join("\n\n");
20838
24322
  }
@@ -20846,6 +24330,53 @@ _...and ${hits.length - 40} more. Narrow with \`kind\`._` : "";
20846
24330
 
20847
24331
  ${rows.join("\n")}${more}`;
20848
24332
  }
24333
+ function formatUtilityList(utilities) {
24334
+ if (!utilities.length) return "No utilities match that filter.";
24335
+ const byModule = /* @__PURE__ */ new Map();
24336
+ for (const u of utilities) byModule.set(u.module, [...byModule.get(u.module) ?? [], u]);
24337
+ const out = [
24338
+ `# Uni CDK utilities (${utilities.length})`,
24339
+ "",
24340
+ "Import every symbol from `@uni-design-system/uni-angular`."
24341
+ ];
24342
+ for (const [module, list] of byModule) {
24343
+ const doc = getUtilityDoc(module);
24344
+ out.push(`
24345
+ ## ${module}${doc ? ` \u2014 ${doc.title}` : ""}`);
24346
+ for (const u of list)
24347
+ out.push(`- **${u.name}** \`${u.id}\` _(${u.kind})_${u.summary ? ` - ${u.summary}` : ""}`);
24348
+ }
24349
+ return out.join("\n");
24350
+ }
24351
+ function formatUtility(u) {
24352
+ const out = [`# ${u.name} \`${u.id}\``];
24353
+ out.push(`_${u.kind} \xB7 cdk/${u.module} \xB7 Uni v${u.version}_`);
24354
+ if (u.description) out.push(`
24355
+ ${u.description}`);
24356
+ out.push(`
24357
+ - import: \`import { ${u.name} } from '${u.importPath}';\``);
24358
+ out.push(`
24359
+ \`\`\`ts
24360
+ ${u.signature}
24361
+ \`\`\``);
24362
+ if (u.members.length) {
24363
+ out.push("\n**Members**");
24364
+ for (const m of u.members)
24365
+ out.push(`- \`${m.signature}\`${m.description ? ` - ${m.description}` : ""}`);
24366
+ }
24367
+ const siblings = listUtilities({ module: u.module }).filter((s) => s.id !== u.id);
24368
+ if (siblings.length)
24369
+ out.push(`
24370
+ **Same module:** ${siblings.map((s) => `\`${s.name}\``).join(", ")}`);
24371
+ const doc = getUtilityDoc(u.module);
24372
+ if (doc) out.push(`
24373
+ ---
24374
+
24375
+ _From the ${doc.title} docs page:_
24376
+
24377
+ ${doc.markdown}`);
24378
+ return out.join("\n");
24379
+ }
20849
24380
 
20850
24381
  // ../core/dist/esm/index.js
20851
24382
  var EXPAND_DEFAULT_SPEED = 0.35;
@@ -22025,6 +25556,7 @@ var buildComponents = (c) => ({
22025
25556
  },
22026
25557
  tabs: { options: {
22027
25558
  motion: "snap",
25559
+ panelMotion: "panel",
22028
25560
  typeface: "title-small",
22029
25561
  textColor: "on-surface-variant",
22030
25562
  activeTextColor: "primary",
@@ -22137,12 +25669,24 @@ var buildComponents = (c) => ({
22137
25669
  tagInput: { options: {
22138
25670
  chipGap: "xs",
22139
25671
  chipSize: "md",
25672
+ chipVariant: "primary",
25673
+ chipTone: "soft",
22140
25674
  minInputWidth: "12ch",
22141
25675
  listColor: "primary-surface",
22142
25676
  listShadow: "menu",
22143
25677
  listBorderRadius: "xs",
22144
25678
  activeColor: "primary-container",
22145
- maxSuggestions: 8
25679
+ maxSuggestions: 8,
25680
+ typeface: "label",
25681
+ headingTypeface: "caption",
25682
+ listWidth: "anchor"
25683
+ } },
25684
+ contactInput: { options: {
25685
+ avatarSize: "md",
25686
+ avatarVariant: "primary",
25687
+ nameTypeface: "body-2-short",
25688
+ detailTypeface: "caption",
25689
+ rowGap: "sm"
22146
25690
  } },
22147
25691
  calendar: {
22148
25692
  options: {
@@ -23599,7 +27143,8 @@ var RuntimeThemeOutput = {
23599
27143
  iconsElided: z.literal(true)
23600
27144
  };
23601
27145
  function runtimeTheme(result) {
23602
- if (!result.ok) return { content: [{ type: "text", text: result.error }], isError: true };
27146
+ if (!result.ok)
27147
+ return { content: [{ type: "text", text: result.error }], isError: true };
23603
27148
  return {
23604
27149
  content: [{ type: "text", text: summarizeEnvelope(result.envelope) }],
23605
27150
  structuredContent: result.envelope
@@ -23614,7 +27159,7 @@ function createUniServer() {
23614
27159
  const server = new McpServer(
23615
27160
  { name: "uni-design-system", version: meta.version },
23616
27161
  {
23617
- 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`.'
27162
+ 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`.'
23618
27163
  }
23619
27164
  );
23620
27165
  server.registerTool(
@@ -23657,6 +27202,30 @@ function createUniServer() {
23657
27202
  return c ? text(formatExamples(c, framework)) : notFound("component", id);
23658
27203
  }
23659
27204
  );
27205
+ server.registerTool(
27206
+ "list-utilities",
27207
+ {
27208
+ title: "List Uni CDK utilities",
27209
+ 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.",
27210
+ inputSchema: {
27211
+ module: z.string().optional().describe('CDK folder, e.g. "clipboard", "number", "datasource"'),
27212
+ kind: z.enum(["function", "service", "class", "interface", "type", "const"]).optional()
27213
+ }
27214
+ },
27215
+ async ({ module, kind }) => text(formatUtilityList(listUtilities({ module, kind })))
27216
+ );
27217
+ server.registerTool(
27218
+ "get-utility",
27219
+ {
27220
+ title: "Get a Uni CDK utility",
27221
+ 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").`,
27222
+ inputSchema: { id: z.string().describe("utility id or exported name") }
27223
+ },
27224
+ async ({ id }) => {
27225
+ const u = getUtility(id);
27226
+ return u ? text(formatUtility(u)) : notFound("utility", id);
27227
+ }
27228
+ );
23660
27229
  server.registerTool(
23661
27230
  "list-tokens",
23662
27231
  {
@@ -23767,7 +27336,8 @@ function createUniServer() {
23767
27336
  },
23768
27337
  async ({ theme }) => {
23769
27338
  const result = buildDtcgTokens(theme);
23770
- if (!result.ok) return { content: [{ type: "text", text: result.error }], isError: true };
27339
+ if (!result.ok)
27340
+ return { content: [{ type: "text", text: result.error }], isError: true };
23771
27341
  return text("```json\n" + result.json + "\n```");
23772
27342
  }
23773
27343
  );
@@ -23796,7 +27366,9 @@ function createUniServer() {
23796
27366
  title: "Get release notes",
23797
27367
  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.',
23798
27368
  inputSchema: {
23799
- package: z.string().optional().describe('npm name or short name, e.g. "uni-angular" (default), "uni-core", "uni-react", "uni-mcp".'),
27369
+ package: z.string().optional().describe(
27370
+ 'npm name or short name, e.g. "uni-angular" (default), "uni-core", "uni-react", "uni-mcp".'
27371
+ ),
23800
27372
  version: z.string().optional().describe('One release, e.g. "8.1.0" or "8.1".'),
23801
27373
  since: z.string().optional().describe('Every release newer than this version, e.g. the installed "8.0.0".')
23802
27374
  }
@@ -23814,10 +27386,10 @@ function createUniServer() {
23814
27386
  "search",
23815
27387
  {
23816
27388
  title: "Search the design system",
23817
- description: "Keyword search across components, tokens, themes, and guidelines. Narrow with `kind`.",
27389
+ description: "Keyword search across components, CDK utilities, tokens, themes, and guidelines. Narrow with `kind`.",
23818
27390
  inputSchema: {
23819
27391
  query: z.string(),
23820
- kind: z.enum(["component", "token", "theme", "guideline"]).optional()
27392
+ kind: z.enum(["component", "utility", "token", "theme", "guideline"]).optional()
23821
27393
  }
23822
27394
  },
23823
27395
  async ({ query, kind }) => text(formatSearch(query, search(query, kind)))
@@ -23865,6 +27437,35 @@ function registerResources(server) {
23865
27437
  };
23866
27438
  }
23867
27439
  );
27440
+ server.registerResource(
27441
+ "utility",
27442
+ new ResourceTemplate("uni://utilities/{id}", {
27443
+ list: async () => ({
27444
+ resources: listUtilities().map((u) => ({
27445
+ uri: `uni://utilities/${u.id}`,
27446
+ name: u.name,
27447
+ description: u.summary || u.signature
27448
+ }))
27449
+ })
27450
+ }),
27451
+ {
27452
+ title: "Uni CDK utility",
27453
+ description: "A CDK utility reference card, with its module docs.",
27454
+ mimeType: "text/markdown"
27455
+ },
27456
+ async (uri, { id }) => {
27457
+ const u = getUtility(String(id));
27458
+ return {
27459
+ contents: [
27460
+ {
27461
+ uri: uri.href,
27462
+ mimeType: "text/markdown",
27463
+ text: u ? formatUtility(u) : `Unknown utility: ${id}`
27464
+ }
27465
+ ]
27466
+ };
27467
+ }
27468
+ );
23868
27469
  server.registerResource(
23869
27470
  "token",
23870
27471
  new ResourceTemplate("uni://tokens/{id}", {
@@ -23981,4 +27582,4 @@ export {
23981
27582
  buildStoredTheme,
23982
27583
  createUniServer
23983
27584
  };
23984
- //# sourceMappingURL=chunk-R323CZ2D.js.map
27585
+ //# sourceMappingURL=chunk-INTB6KJ7.js.map