@uni-design-system/uni-mcp 4.7.0 → 4.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -7,16 +7,16 @@ import { z } from "zod";
7
7
  // src/data/uni-index.json
8
8
  var uni_index_default = {
9
9
  meta: {
10
- version: "8.2.0",
11
- builtAt: "2026-08-20T22:58:33.744Z",
10
+ version: "8.3.0",
11
+ builtAt: "2026-08-21T15:54:42.627Z",
12
12
  frameworks: [
13
13
  "angular"
14
14
  ],
15
15
  counts: {
16
- components: 76,
17
- tokens: 353,
16
+ components: 79,
17
+ tokens: 396,
18
18
  themes: 2,
19
- examples: 168
19
+ examples: 184
20
20
  }
21
21
  },
22
22
  components: [
@@ -27,7 +27,7 @@ var uni_index_default = {
27
27
  summary: "",
28
28
  description: "",
29
29
  category: "feedback",
30
- version: "8.2.0",
30
+ version: "8.3.0",
31
31
  bindings: {
32
32
  angular: {
33
33
  importPath: "@uni-design-system/uni-angular",
@@ -101,7 +101,7 @@ var uni_index_default = {
101
101
  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.",
102
102
  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.",
103
103
  category: "components",
104
- version: "8.2.0",
104
+ version: "8.3.0",
105
105
  bindings: {
106
106
  angular: {
107
107
  importPath: "@uni-design-system/uni-angular",
@@ -158,7 +158,7 @@ var uni_index_default = {
158
158
  summary: "Identity avatar with a graceful fallback chain: image \u2192 initials from `name` \u2192 themed symbol.",
159
159
  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.",
160
160
  category: "components",
161
- version: "8.2.0",
161
+ version: "8.3.0",
162
162
  bindings: {
163
163
  angular: {
164
164
  importPath: "@uni-design-system/uni-angular",
@@ -237,7 +237,7 @@ var uni_index_default = {
237
237
  summary: "Overlapping stack of avatars.",
238
238
  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.",
239
239
  category: "components",
240
- version: "8.2.0",
240
+ version: "8.3.0",
241
241
  bindings: {
242
242
  angular: {
243
243
  importPath: "@uni-design-system/uni-angular",
@@ -270,7 +270,7 @@ var uni_index_default = {
270
270
  summary: "",
271
271
  description: "",
272
272
  category: "primitives",
273
- version: "8.2.0",
273
+ version: "8.3.0",
274
274
  bindings: {
275
275
  angular: {
276
276
  importPath: "@uni-design-system/uni-angular",
@@ -351,7 +351,7 @@ var uni_index_default = {
351
351
  summary: "",
352
352
  description: "",
353
353
  category: "feedback",
354
- version: "8.2.0",
354
+ version: "8.3.0",
355
355
  bindings: {
356
356
  angular: {
357
357
  importPath: "@uni-design-system/uni-angular",
@@ -432,7 +432,7 @@ var uni_index_default = {
432
432
  summary: "",
433
433
  description: "",
434
434
  category: "directives",
435
- version: "8.2.0",
435
+ version: "8.3.0",
436
436
  bindings: {
437
437
  angular: {
438
438
  importPath: "@uni-design-system/uni-angular",
@@ -456,7 +456,7 @@ var uni_index_default = {
456
456
  summary: 'The base layout primitive, applied as an attribute to any element so semantics stay yours: `<main box-layout [grow]="1" padding="md">`.',
457
457
  description: 'The base layout primitive, applied as an attribute to any element so semantics stay yours: `<main box-layout [grow]="1" padding="md">`. Exception: other components\' host elements (`<uni-card box-layout>` would put two components on one element) \u2014 wrap those in a `<div box-layout>`. 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.',
458
458
  category: "layout",
459
- version: "8.2.0",
459
+ version: "8.3.0",
460
460
  bindings: {
461
461
  angular: {
462
462
  importPath: "@uni-design-system/uni-angular",
@@ -819,7 +819,7 @@ var uni_index_default = {
819
819
  summary: 'WAI-ARIA breadcrumb: a `nav` landmark wrapping an ordered list; the last item is the current page (`aria-current="page"`), separators are decorative.',
820
820
  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.',
821
821
  category: "components",
822
- version: "8.2.0",
822
+ version: "8.3.0",
823
823
  bindings: {
824
824
  angular: {
825
825
  importPath: "@uni-design-system/uni-angular",
@@ -888,7 +888,7 @@ var uni_index_default = {
888
888
  summary: "",
889
889
  description: "",
890
890
  category: "primitives",
891
- version: "8.2.0",
891
+ version: "8.3.0",
892
892
  bindings: {
893
893
  angular: {
894
894
  importPath: "@uni-design-system/uni-angular",
@@ -1031,7 +1031,7 @@ var uni_index_default = {
1031
1031
  summary: "",
1032
1032
  description: "",
1033
1033
  category: "primitives",
1034
- version: "8.2.0",
1034
+ version: "8.3.0",
1035
1035
  bindings: {
1036
1036
  angular: {
1037
1037
  importPath: "@uni-design-system/uni-angular",
@@ -1063,7 +1063,7 @@ var uni_index_default = {
1063
1063
  summary: "Inline month calendar: single-date or start\u2013end range selection, day markers (availability dots), min/max fences and disabled dates.",
1064
1064
  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.",
1065
1065
  category: "forms",
1066
- version: "8.2.0",
1066
+ version: "8.3.0",
1067
1067
  bindings: {
1068
1068
  angular: {
1069
1069
  importPath: "@uni-design-system/uni-angular",
@@ -1282,6 +1282,203 @@ var uni_index_default = {
1282
1282
  "calendar.behavior.todayStyle"
1283
1283
  ]
1284
1284
  },
1285
+ {
1286
+ id: "callout",
1287
+ name: "Callout",
1288
+ status: "stable",
1289
+ summary: "Anchored coach-mark panel that dims the page and cuts a spotlight hole around its target.",
1290
+ 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).',
1291
+ category: "components",
1292
+ version: "8.3.0",
1293
+ bindings: {
1294
+ angular: {
1295
+ importPath: "@uni-design-system/uni-angular",
1296
+ selectorOrTag: "uni-callout",
1297
+ api: [
1298
+ {
1299
+ name: "open",
1300
+ kind: "model",
1301
+ type: "boolean",
1302
+ required: false,
1303
+ default: "false",
1304
+ description: ""
1305
+ },
1306
+ {
1307
+ name: "key",
1308
+ kind: "input",
1309
+ type: "string",
1310
+ required: false,
1311
+ description: "Identifies this callout in `dismissed` payloads. Empty string = unset."
1312
+ },
1313
+ {
1314
+ name: "target",
1315
+ kind: "input",
1316
+ type: "HTMLElement | string",
1317
+ required: false,
1318
+ description: "Element (or id, resolved at open time) to spotlight. '' = unset."
1319
+ },
1320
+ {
1321
+ name: "placement",
1322
+ kind: "input",
1323
+ type: "Placement",
1324
+ required: false,
1325
+ default: "'bottom'",
1326
+ description: ""
1327
+ },
1328
+ {
1329
+ name: "backdrop",
1330
+ kind: "input",
1331
+ type: "'spotlight' | 'dim' | 'none'",
1332
+ required: false,
1333
+ description: "Defaults to `spotlight` when a target resolves, else `dim`."
1334
+ },
1335
+ {
1336
+ name: "targetInteractive",
1337
+ kind: "input",
1338
+ type: "boolean",
1339
+ required: false,
1340
+ default: "true",
1341
+ description: "When false, a transparent cover blocks the spotlit target."
1342
+ },
1343
+ {
1344
+ name: "dismissible",
1345
+ kind: "input",
1346
+ type: "boolean",
1347
+ required: false,
1348
+ default: "true",
1349
+ description: "Gates Escape and the close button."
1350
+ },
1351
+ {
1352
+ name: "dismissOnBackdrop",
1353
+ kind: "input",
1354
+ type: "boolean",
1355
+ required: false,
1356
+ default: "false",
1357
+ description: "When true, scrim clicks close (reason `backdrop`); else the panel pulses."
1358
+ },
1359
+ {
1360
+ name: "header",
1361
+ kind: "input",
1362
+ type: "string",
1363
+ required: false,
1364
+ description: ""
1365
+ },
1366
+ {
1367
+ name: "arrow",
1368
+ kind: "input",
1369
+ type: "boolean",
1370
+ required: false,
1371
+ default: "true",
1372
+ description: ""
1373
+ },
1374
+ {
1375
+ name: "ariaLabel",
1376
+ kind: "input",
1377
+ type: "string",
1378
+ required: false,
1379
+ description: 'Wins over the header/body labelling; the tour sets "{title}, step n of N".'
1380
+ },
1381
+ {
1382
+ name: "closeLabel",
1383
+ kind: "input",
1384
+ type: "string",
1385
+ required: false,
1386
+ default: "'Close'",
1387
+ description: "Accessible name of the dismiss button (the tour passes its skip label)."
1388
+ },
1389
+ {
1390
+ name: "opened",
1391
+ kind: "output",
1392
+ type: "void",
1393
+ required: false,
1394
+ description: ""
1395
+ },
1396
+ {
1397
+ name: "closed",
1398
+ kind: "output",
1399
+ type: "void",
1400
+ required: false,
1401
+ description: ""
1402
+ },
1403
+ {
1404
+ name: "dismissed",
1405
+ kind: "output",
1406
+ type: "UniCalloutDismissal",
1407
+ required: false,
1408
+ description: ""
1409
+ },
1410
+ {
1411
+ name: "panelKeydown",
1412
+ kind: "output",
1413
+ type: "KeyboardEvent",
1414
+ required: false,
1415
+ description: "Keys pressed while focus is inside the panel (the tour's arrow-key hook)."
1416
+ }
1417
+ ]
1418
+ }
1419
+ },
1420
+ examples: [
1421
+ {
1422
+ title: "Spotlight",
1423
+ framework: "angular",
1424
+ code: '<!-- Storybook story: Spotlight -->\n<div stack-layout gap="md">\n<button text-button (click)="open = true">Show me around</button>\n<uni-input label="Search projects" id="callout-demo-search"></uni-input>\n<uni-callout\n [(open)]="open"\n key="search-intro"\n target="callout-demo-search"\n header="Find anything"\n placement="bottom"\n>\n Type to filter projects, people, and documents \u2014 try it right here.\n <button text-button callout-actions size="sm" variant="secondary" (click)="open = false">Got it</button>\n</uni-callout>\n</div>'
1425
+ },
1426
+ {
1427
+ title: "Locked Spotlight",
1428
+ framework: "angular",
1429
+ code: '<!-- Storybook story: Locked Spotlight -->\n<div stack-layout gap="md">\n<button text-button (click)="open = true">Show me around</button>\n<uni-input label="Search projects" id="callout-demo-search"></uni-input>\n<uni-callout\n [(open)]="open"\n key="search-intro"\n target="callout-demo-search"\n header="Find anything"\n placement="bottom"\n>\n Type to filter projects, people, and documents \u2014 try it right here.\n <button text-button callout-actions size="sm" variant="secondary" (click)="open = false">Got it</button>\n</uni-callout>\n</div>'
1430
+ },
1431
+ {
1432
+ title: "Dim",
1433
+ framework: "angular",
1434
+ code: '<!-- Storybook story: Dim -->\n<div stack-layout gap="md">\n<button text-button (click)="open = true">Show me around</button>\n<uni-input label="Search projects" id="callout-demo-search"></uni-input>\n<uni-callout\n [(open)]="open"\n key="search-intro"\n target="callout-demo-search"\n header="Find anything"\n placement="bottom"\n>\n Type to filter projects, people, and documents \u2014 try it right here.\n <button text-button callout-actions size="sm" variant="secondary" (click)="open = false">Got it</button>\n</uni-callout>\n</div>'
1435
+ },
1436
+ {
1437
+ title: "No Backdrop",
1438
+ framework: "angular",
1439
+ code: '<!-- Storybook story: No Backdrop -->\n<div stack-layout gap="md">\n<button text-button (click)="open = true">Show me around</button>\n<uni-input label="Search projects" id="callout-demo-search"></uni-input>\n<uni-callout\n [(open)]="open"\n key="search-intro"\n target="callout-demo-search"\n header="Find anything"\n placement="bottom"\n>\n Type to filter projects, people, and documents \u2014 try it right here.\n <button text-button callout-actions size="sm" variant="secondary" (click)="open = false">Got it</button>\n</uni-callout>\n</div>'
1440
+ },
1441
+ {
1442
+ title: "Dismissal Tracking",
1443
+ framework: "angular",
1444
+ code: '<!-- Storybook story: Dismissal Tracking -->\n<div stack-layout gap="md">\n<button text-button (click)="open = true">Show me around</button>\n<uni-input label="Search projects" id="callout-demo-search"></uni-input>\n<uni-callout\n [(open)]="open"\n key="search-intro"\n target="callout-demo-search"\n header="Find anything"\n placement="bottom"\n>\n Type to filter projects, people, and documents \u2014 try it right here.\n <button text-button callout-actions size="sm" variant="secondary" (click)="open = false">Got it</button>\n</uni-callout>\n</div>'
1445
+ }
1446
+ ],
1447
+ guidelines: {
1448
+ whenToUse: 'Callout is an anchored coach-mark panel that dims the page and cuts a\nspotlight hole around its target \u2014 the feature-introduction surface. The\nscrim and hole are CSS-anchor-positioned to the target, so the spotlight\ntracks scroll, resize, and layout with zero listeners, and the spotlit\nelement stays genuinely clickable through the hole (or covered, with\n`targetInteractive` false). Both surfaces ride the native popover top layer,\nabove every app z-index.\nThe panel is a non-modal `role="dialog"`: focus moves in on open, Tab runs a\nduet loop over the panel\'s controls plus the interactive target, and close\nrestores focus \u2014 unless the user moved into the target, where it stays.\nCallouts are storage-free by rule: `key` and the `dismissed` output (with a\n`reason`) are the "don\'t show again" hooks, and persistence belongs to the\napp.',
1449
+ dos: [
1450
+ 'Point one callout at one action, and let `key` + `dismissed` drive "don\'t show again"',
1451
+ "Keep the target interactive when the callout invites trying it"
1452
+ ],
1453
+ donts: [
1454
+ "Stack multiple callouts at once \u2014 sequence them with `uni-tour`",
1455
+ "Use a callout for blocking confirmation; that is a dialog"
1456
+ ],
1457
+ accessibility: [
1458
+ 'Non-modal `role="dialog"`, labelled by `header` (or `ariaLabel`); `aria-modal` is deliberately absent \u2014 the page is dimmed, not removed.',
1459
+ "Initial focus: `[autofocus]` \u2192 first action \u2192 first focusable \u2192 the panel itself.",
1460
+ "Focus restore on close skips users who deliberately moved into the target.",
1461
+ "The spotlight ring is the `variant` color role and pairs with a shape (the ring), not color alone."
1462
+ ]
1463
+ },
1464
+ relatedTokens: [
1465
+ "callout.behavior.color",
1466
+ "callout.behavior.borderRadius",
1467
+ "callout.behavior.shadow",
1468
+ "callout.behavior.width",
1469
+ "callout.behavior.padding",
1470
+ "callout.behavior.headerTypeface",
1471
+ "callout.behavior.typeface",
1472
+ "callout.behavior.closeSymbol",
1473
+ "callout.behavior.arrowSize",
1474
+ "callout.behavior.offset",
1475
+ "callout.behavior.scrimColor",
1476
+ "callout.behavior.spotlightPadding",
1477
+ "callout.behavior.spotlightRadius",
1478
+ "callout.behavior.ringWidth",
1479
+ "callout.behavior.transitionMs"
1480
+ ]
1481
+ },
1285
1482
  {
1286
1483
  id: "card",
1287
1484
  name: "Card",
@@ -1289,7 +1486,7 @@ var uni_index_default = {
1289
1486
  summary: "",
1290
1487
  description: "",
1291
1488
  category: "layout",
1292
- version: "8.2.0",
1489
+ version: "8.3.0",
1293
1490
  bindings: {
1294
1491
  angular: {
1295
1492
  importPath: "@uni-design-system/uni-angular",
@@ -1334,7 +1531,7 @@ var uni_index_default = {
1334
1531
  summary: "",
1335
1532
  description: "",
1336
1533
  category: "layout",
1337
- version: "8.2.0",
1534
+ version: "8.3.0",
1338
1535
  bindings: {
1339
1536
  angular: {
1340
1537
  importPath: "@uni-design-system/uni-angular",
@@ -1358,7 +1555,7 @@ var uni_index_default = {
1358
1555
  summary: "",
1359
1556
  description: "",
1360
1557
  category: "layout",
1361
- version: "8.2.0",
1558
+ version: "8.3.0",
1362
1559
  bindings: {
1363
1560
  angular: {
1364
1561
  importPath: "@uni-design-system/uni-angular",
@@ -1399,7 +1596,7 @@ var uni_index_default = {
1399
1596
  summary: "",
1400
1597
  description: "",
1401
1598
  category: "layout",
1402
- version: "8.2.0",
1599
+ version: "8.3.0",
1403
1600
  bindings: {
1404
1601
  angular: {
1405
1602
  importPath: "@uni-design-system/uni-angular",
@@ -1454,7 +1651,7 @@ var uni_index_default = {
1454
1651
  summary: "",
1455
1652
  description: "",
1456
1653
  category: "forms",
1457
- version: "8.2.0",
1654
+ version: "8.3.0",
1458
1655
  bindings: {
1459
1656
  angular: {
1460
1657
  importPath: "@uni-design-system/uni-angular",
@@ -1586,6 +1783,263 @@ var uni_index_default = {
1586
1783
  "checkbox.behavior.focusRingGap"
1587
1784
  ]
1588
1785
  },
1786
+ {
1787
+ id: "combobox",
1788
+ name: "Combobox",
1789
+ status: "stable",
1790
+ summary: "Form-bound, closed-set, single-select autocomplete: `FormValueControl<T | null>` over object `Options<T>`, type-to-filter, commit-on-select.",
1791
+ 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.",
1792
+ category: "layout",
1793
+ version: "8.3.0",
1794
+ bindings: {
1795
+ angular: {
1796
+ importPath: "@uni-design-system/uni-angular",
1797
+ selectorOrTag: "uni-combobox, Combobox",
1798
+ api: [
1799
+ {
1800
+ name: "value",
1801
+ kind: "model",
1802
+ type: "T | null",
1803
+ required: false,
1804
+ default: "null",
1805
+ description: ""
1806
+ },
1807
+ {
1808
+ name: "disabled",
1809
+ kind: "input",
1810
+ type: "boolean",
1811
+ required: false,
1812
+ default: "false",
1813
+ description: ""
1814
+ },
1815
+ {
1816
+ name: "touched",
1817
+ kind: "model",
1818
+ type: "boolean",
1819
+ required: false,
1820
+ default: "false",
1821
+ description: ""
1822
+ },
1823
+ {
1824
+ name: "invalid",
1825
+ kind: "input",
1826
+ type: "boolean",
1827
+ required: false,
1828
+ default: "false",
1829
+ description: ""
1830
+ },
1831
+ {
1832
+ name: "dirty",
1833
+ kind: "input",
1834
+ type: "boolean",
1835
+ required: false,
1836
+ default: "false",
1837
+ description: ""
1838
+ },
1839
+ {
1840
+ name: "required",
1841
+ kind: "input",
1842
+ type: "boolean",
1843
+ required: false,
1844
+ default: "false",
1845
+ description: ""
1846
+ },
1847
+ {
1848
+ name: "ariaDescribedBy",
1849
+ kind: "input",
1850
+ type: "string",
1851
+ required: false,
1852
+ description: ""
1853
+ },
1854
+ {
1855
+ name: "label",
1856
+ kind: "input",
1857
+ type: "string",
1858
+ required: true,
1859
+ description: 'Accessible name for the field, e.g. "State"; echoed on the listbox.'
1860
+ },
1861
+ {
1862
+ name: "placeholder",
1863
+ kind: "input",
1864
+ type: "string",
1865
+ required: false,
1866
+ description: ""
1867
+ },
1868
+ {
1869
+ name: "options",
1870
+ kind: "input",
1871
+ type: "Options<T>",
1872
+ required: false,
1873
+ default: "[]",
1874
+ description: ""
1875
+ },
1876
+ {
1877
+ name: "width",
1878
+ kind: "input",
1879
+ type: "string | number",
1880
+ required: false,
1881
+ default: "'100%'",
1882
+ description: ""
1883
+ },
1884
+ {
1885
+ name: "clearable",
1886
+ kind: "input",
1887
+ type: "boolean",
1888
+ required: false,
1889
+ default: "true",
1890
+ description: "Show a \u2715 while a value is set; an emptied field on blur also clears."
1891
+ },
1892
+ {
1893
+ name: "commitOnBlur",
1894
+ kind: "input",
1895
+ type: "boolean",
1896
+ required: false,
1897
+ default: "true",
1898
+ description: "Blur commits an exact-match draft; a non-matching draft reverts."
1899
+ },
1900
+ {
1901
+ name: "emptyText",
1902
+ kind: "input",
1903
+ type: "string",
1904
+ required: false,
1905
+ default: "'No matches'",
1906
+ description: "i18n-able empty row, also announced when a filter matches nothing."
1907
+ },
1908
+ {
1909
+ name: "filterLocally",
1910
+ kind: "input",
1911
+ type: "boolean",
1912
+ required: false,
1913
+ default: "true",
1914
+ description: "`false` renders `options` verbatim; narrow them app-side from `query`."
1915
+ },
1916
+ {
1917
+ name: "debounceTime",
1918
+ kind: "input",
1919
+ type: "number",
1920
+ required: false,
1921
+ default: "250",
1922
+ description: ""
1923
+ },
1924
+ {
1925
+ name: "query",
1926
+ kind: "output",
1927
+ type: "string",
1928
+ required: false,
1929
+ description: "Debounced draft text, for async option lists."
1930
+ },
1931
+ {
1932
+ name: "selected",
1933
+ kind: "output",
1934
+ type: "Option<T>",
1935
+ required: false,
1936
+ description: "An option committed."
1937
+ },
1938
+ {
1939
+ name: "cleared",
1940
+ kind: "output",
1941
+ type: "void",
1942
+ required: false,
1943
+ description: ""
1944
+ },
1945
+ {
1946
+ name: "rejected",
1947
+ kind: "output",
1948
+ type: "UniComboboxRejection",
1949
+ required: false,
1950
+ description: "A commit was refused (no match); the field reverted."
1951
+ }
1952
+ ]
1953
+ }
1954
+ },
1955
+ examples: [
1956
+ {
1957
+ title: "Primary",
1958
+ framework: "angular",
1959
+ code: `<!-- Storybook story: Primary -->
1960
+ <uni-combobox
1961
+ label="Country"
1962
+ placeholder="Type to search countries"
1963
+ emptyText="No countries found"
1964
+ [filterLocally]="false"
1965
+ [options]="options"
1966
+ (query)="onQuery($event)"
1967
+ />
1968
+ <!-- args:
1969
+ { value: 'Arizona' }
1970
+ -->`
1971
+ },
1972
+ {
1973
+ title: "Disabled Options",
1974
+ framework: "angular",
1975
+ code: `<!-- Storybook story: Disabled Options -->
1976
+ <uni-combobox
1977
+ label="Country"
1978
+ placeholder="Type to search countries"
1979
+ emptyText="No countries found"
1980
+ [filterLocally]="false"
1981
+ [options]="options"
1982
+ (query)="onQuery($event)"
1983
+ />
1984
+ <!-- args:
1985
+ { label: 'Assignee', placeholder: 'Choose a person', options: ASSIGNEES }
1986
+ -->`
1987
+ },
1988
+ {
1989
+ title: "Async",
1990
+ framework: "angular",
1991
+ code: '<!-- Storybook story: Async -->\n<uni-combobox\nlabel="Country"\nplaceholder="Type to search countries"\nemptyText="No countries found"\n[filterLocally]="false"\n[options]="options"\n(query)="onQuery($event)"\n/>\n<!-- args:\n{ required: true, invalid: true, touched: true }\n-->'
1992
+ },
1993
+ {
1994
+ title: "Invalid",
1995
+ framework: "angular",
1996
+ code: '<!-- Storybook story: Invalid -->\n<uni-combobox\nlabel="Country"\nplaceholder="Type to search countries"\nemptyText="No countries found"\n[filterLocally]="false"\n[options]="options"\n(query)="onQuery($event)"\n/>\n<!-- args:\n{ required: true, invalid: true, touched: true }\n-->'
1997
+ },
1998
+ {
1999
+ title: "Disabled",
2000
+ framework: "angular",
2001
+ code: `<!-- Storybook story: Disabled -->
2002
+ <uni-combobox
2003
+ label="Country"
2004
+ placeholder="Type to search countries"
2005
+ emptyText="No countries found"
2006
+ [filterLocally]="false"
2007
+ [options]="options"
2008
+ (query)="onQuery($event)"
2009
+ />
2010
+ <!-- args:
2011
+ { value: 'Colorado', disabled: true }
2012
+ -->`
2013
+ }
2014
+ ],
2015
+ guidelines: {
2016
+ whenToUse: "The form-bound, **closed-set, single-select** autocomplete: object\n`Options<T>`, `FormValueControl<T | null>`, type-to-filter, commit-on-select.\nTyping produces a *draft* \u2014 a filter, never a value; the value changes only\nwhen an option commits, the field clears, or the model is written from\noutside. Select semantics, not search: a real label, a chevron, no magnifier,\nnothing submits.\nUnder ~10 options and no need to type \u2192 `uni-select`, the native, zero-JS,\nmobile-friendly answer. More options, or users know what they're looking for \u2192\n`uni-combobox`. The value contract is identical (`T | null`, `compareWith`),\nso swapping one for the other as a list grows is a template-only change \u2014 that\nis deliberate. For open sets, where typing *creates* values, use\n`uni-tag-input` (multi) or `uni-search-input` (queries); for closed multi\nsets, `uni-multi-select-dropdown`.",
2017
+ dos: [],
2018
+ donts: [
2019
+ "Don't bolt \"create new\" onto it \u2014 that's an open set; use `uni-tag-input`'s",
2020
+ "Don't wire `(query)` \u2192 filter \u2192 `[options]` when the list is already in",
2021
+ "Don't use `Escape` to clear: it closes, then reverts. The \u2715 and an emptied"
2022
+ ],
2023
+ accessibility: [
2024
+ 'The input is `role="combobox"` with `aria-expanded`, `aria-controls` and',
2025
+ "`aria-selected` marks the **committed** option; the active one is carried by",
2026
+ "Disabled options are rendered, announced (`aria-disabled`), and skipped by",
2027
+ 'Commits (*"Alabama selected."*), clears, refusals and debounced result',
2028
+ "`aria-invalid` is gated on `invalid && (touched || dirty)`, per the"
2029
+ ]
2030
+ },
2031
+ relatedTokens: [
2032
+ "combobox.behavior.toggleIcon",
2033
+ "combobox.behavior.clearIcon",
2034
+ "combobox.behavior.selectedIcon",
2035
+ "combobox.behavior.listColor",
2036
+ "combobox.behavior.listShadow",
2037
+ "combobox.behavior.listBorderRadius",
2038
+ "combobox.behavior.activeColor",
2039
+ "combobox.behavior.maxVisibleOptions",
2040
+ "combobox.behavior.descriptionColor"
2041
+ ]
2042
+ },
1589
2043
  {
1590
2044
  id: "confirmation-dialog",
1591
2045
  name: "ConfirmationDialog",
@@ -1593,7 +2047,7 @@ var uni_index_default = {
1593
2047
  summary: "",
1594
2048
  description: "",
1595
2049
  category: "feedback",
1596
- version: "8.2.0",
2050
+ version: "8.3.0",
1597
2051
  bindings: {
1598
2052
  angular: {
1599
2053
  importPath: "@uni-design-system/uni-angular",
@@ -1640,7 +2094,7 @@ var uni_index_default = {
1640
2094
  summary: "",
1641
2095
  description: "",
1642
2096
  category: "forms",
1643
- version: "8.2.0",
2097
+ version: "8.3.0",
1644
2098
  bindings: {
1645
2099
  angular: {
1646
2100
  importPath: "@uni-design-system/uni-angular",
@@ -1723,7 +2177,7 @@ var uni_index_default = {
1723
2177
  summary: "",
1724
2178
  description: "",
1725
2179
  category: "data",
1726
- version: "8.2.0",
2180
+ version: "8.3.0",
1727
2181
  bindings: {
1728
2182
  angular: {
1729
2183
  importPath: "@uni-design-system/uni-angular",
@@ -1824,7 +2278,7 @@ var uni_index_default = {
1824
2278
  summary: "Date field with free-typed parsing and a popup calendar.",
1825
2279
  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.",
1826
2280
  category: "forms",
1827
- version: "8.2.0",
2281
+ version: "8.3.0",
1828
2282
  bindings: {
1829
2283
  angular: {
1830
2284
  importPath: "@uni-design-system/uni-angular",
@@ -2032,7 +2486,7 @@ var uni_index_default = {
2032
2486
  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.",
2033
2487
  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.",
2034
2488
  category: "forms",
2035
- version: "8.2.0",
2489
+ version: "8.3.0",
2036
2490
  bindings: {
2037
2491
  angular: {
2038
2492
  importPath: "@uni-design-system/uni-angular",
@@ -2202,7 +2656,7 @@ var uni_index_default = {
2202
2656
  summary: "Text input that emits `change` only after the user pauses typing.",
2203
2657
  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.",
2204
2658
  category: "forms",
2205
- version: "8.2.0",
2659
+ version: "8.3.0",
2206
2660
  bindings: {
2207
2661
  angular: {
2208
2662
  importPath: "@uni-design-system/uni-angular",
@@ -2328,7 +2782,7 @@ var uni_index_default = {
2328
2782
  summary: "",
2329
2783
  description: "",
2330
2784
  category: "feedback",
2331
- version: "8.2.0",
2785
+ version: "8.3.0",
2332
2786
  bindings: {
2333
2787
  angular: {
2334
2788
  importPath: "@uni-design-system/uni-angular",
@@ -2406,7 +2860,7 @@ var uni_index_default = {
2406
2860
  summary: "",
2407
2861
  description: "",
2408
2862
  category: "feedback",
2409
- version: "8.2.0",
2863
+ version: "8.3.0",
2410
2864
  bindings: {
2411
2865
  angular: {
2412
2866
  importPath: "@uni-design-system/uni-angular",
@@ -2494,7 +2948,7 @@ var uni_index_default = {
2494
2948
  summary: "",
2495
2949
  description: "",
2496
2950
  category: "feedback",
2497
- version: "8.2.0",
2951
+ version: "8.3.0",
2498
2952
  bindings: {
2499
2953
  angular: {
2500
2954
  importPath: "@uni-design-system/uni-angular",
@@ -2518,7 +2972,7 @@ var uni_index_default = {
2518
2972
  summary: "",
2519
2973
  description: "",
2520
2974
  category: "layout",
2521
- version: "8.2.0",
2975
+ version: "8.3.0",
2522
2976
  bindings: {
2523
2977
  angular: {
2524
2978
  importPath: "@uni-design-system/uni-angular",
@@ -2574,7 +3028,7 @@ var uni_index_default = {
2574
3028
  summary: "",
2575
3029
  description: "",
2576
3030
  category: "directives",
2577
- version: "8.2.0",
3031
+ version: "8.3.0",
2578
3032
  bindings: {
2579
3033
  angular: {
2580
3034
  importPath: "@uni-design-system/uni-angular",
@@ -2606,7 +3060,7 @@ var uni_index_default = {
2606
3060
  summary: "Navigation drawer with two modes sharing one content slot: - `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.",
2607
3061
  description: "Navigation drawer with two modes sharing one content slot: - `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. Surface, width, divider, elevation, padding and backdrop all resolve from `drawer` theme tokens.",
2608
3062
  category: "components",
2609
- version: "8.2.0",
3063
+ version: "8.3.0",
2610
3064
  bindings: {
2611
3065
  angular: {
2612
3066
  importPath: "@uni-design-system/uni-angular",
@@ -2685,7 +3139,7 @@ var uni_index_default = {
2685
3139
  summary: "",
2686
3140
  description: "",
2687
3141
  category: "components",
2688
- version: "8.2.0",
3142
+ version: "8.3.0",
2689
3143
  bindings: {
2690
3144
  angular: {
2691
3145
  importPath: "@uni-design-system/uni-angular",
@@ -2802,7 +3256,7 @@ var uni_index_default = {
2802
3256
  summary: "",
2803
3257
  description: "",
2804
3258
  category: "layout",
2805
- version: "8.2.0",
3259
+ version: "8.3.0",
2806
3260
  bindings: {
2807
3261
  angular: {
2808
3262
  importPath: "@uni-design-system/uni-angular",
@@ -2890,7 +3344,7 @@ var uni_index_default = {
2890
3344
  summary: "",
2891
3345
  description: "",
2892
3346
  category: "layout",
2893
- version: "8.2.0",
3347
+ version: "8.3.0",
2894
3348
  bindings: {
2895
3349
  angular: {
2896
3350
  importPath: "@uni-design-system/uni-angular",
@@ -2961,7 +3415,7 @@ var uni_index_default = {
2961
3415
  summary: "Trigger for a {@link UniExpandComponent} region.",
2962
3416
  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.",
2963
3417
  category: "forms",
2964
- version: "8.2.0",
3418
+ version: "8.3.0",
2965
3419
  bindings: {
2966
3420
  angular: {
2967
3421
  importPath: "@uni-design-system/uni-angular",
@@ -3046,7 +3500,7 @@ var uni_index_default = {
3046
3500
  summary: "",
3047
3501
  description: "",
3048
3502
  category: "forms",
3049
- version: "8.2.0",
3503
+ version: "8.3.0",
3050
3504
  bindings: {
3051
3505
  angular: {
3052
3506
  importPath: "@uni-design-system/uni-angular",
@@ -3204,7 +3658,7 @@ var uni_index_default = {
3204
3658
  summary: "",
3205
3659
  description: "",
3206
3660
  category: "layout",
3207
- version: "8.2.0",
3661
+ version: "8.3.0",
3208
3662
  bindings: {
3209
3663
  angular: {
3210
3664
  importPath: "@uni-design-system/uni-angular",
@@ -3301,7 +3755,7 @@ var uni_index_default = {
3301
3755
  summary: "",
3302
3756
  description: "",
3303
3757
  category: "layout",
3304
- version: "8.2.0",
3758
+ version: "8.3.0",
3305
3759
  bindings: {
3306
3760
  angular: {
3307
3761
  importPath: "@uni-design-system/uni-angular",
@@ -3333,7 +3787,7 @@ var uni_index_default = {
3333
3787
  summary: "",
3334
3788
  description: "",
3335
3789
  category: "primitives",
3336
- version: "8.2.0",
3790
+ version: "8.3.0",
3337
3791
  bindings: {
3338
3792
  angular: {
3339
3793
  importPath: "@uni-design-system/uni-angular",
@@ -3393,7 +3847,7 @@ var uni_index_default = {
3393
3847
  summary: "",
3394
3848
  description: "",
3395
3849
  category: "primitives",
3396
- version: "8.2.0",
3850
+ version: "8.3.0",
3397
3851
  bindings: {
3398
3852
  angular: {
3399
3853
  importPath: "@uni-design-system/uni-angular",
@@ -3496,7 +3950,7 @@ var uni_index_default = {
3496
3950
  summary: "",
3497
3951
  description: "",
3498
3952
  category: "forms",
3499
- version: "8.2.0",
3953
+ version: "8.3.0",
3500
3954
  bindings: {
3501
3955
  angular: {
3502
3956
  importPath: "@uni-design-system/uni-angular",
@@ -3641,7 +4095,7 @@ var uni_index_default = {
3641
4095
  summary: "",
3642
4096
  description: "",
3643
4097
  category: "forms",
3644
- version: "8.2.0",
4098
+ version: "8.3.0",
3645
4099
  bindings: {
3646
4100
  angular: {
3647
4101
  importPath: "@uni-design-system/uni-angular",
@@ -3714,7 +4168,7 @@ var uni_index_default = {
3714
4168
  summary: "",
3715
4169
  description: "",
3716
4170
  category: "components",
3717
- version: "8.2.0",
4171
+ version: "8.3.0",
3718
4172
  bindings: {
3719
4173
  angular: {
3720
4174
  importPath: "@uni-design-system/uni-angular",
@@ -3784,7 +4238,7 @@ var uni_index_default = {
3784
4238
  summary: "",
3785
4239
  description: "",
3786
4240
  category: "layout",
3787
- version: "8.2.0",
4241
+ version: "8.3.0",
3788
4242
  bindings: {
3789
4243
  angular: {
3790
4244
  importPath: "@uni-design-system/uni-angular",
@@ -3888,7 +4342,7 @@ var uni_index_default = {
3888
4342
  summary: "",
3889
4343
  description: "",
3890
4344
  category: "layout",
3891
- version: "8.2.0",
4345
+ version: "8.3.0",
3892
4346
  bindings: {
3893
4347
  angular: {
3894
4348
  importPath: "@uni-design-system/uni-angular",
@@ -3970,7 +4424,7 @@ var uni_index_default = {
3970
4424
  summary: "",
3971
4425
  description: "",
3972
4426
  category: "forms",
3973
- version: "8.2.0",
4427
+ version: "8.3.0",
3974
4428
  bindings: {
3975
4429
  angular: {
3976
4430
  importPath: "@uni-design-system/uni-angular",
@@ -4058,7 +4512,7 @@ var uni_index_default = {
4058
4512
  summary: "",
4059
4513
  description: "",
4060
4514
  category: "forms",
4061
- version: "8.2.0",
4515
+ version: "8.3.0",
4062
4516
  bindings: {
4063
4517
  angular: {
4064
4518
  importPath: "@uni-design-system/uni-angular",
@@ -4208,7 +4662,7 @@ var uni_index_default = {
4208
4662
  summary: "",
4209
4663
  description: "",
4210
4664
  category: "feedback",
4211
- version: "8.2.0",
4665
+ version: "8.3.0",
4212
4666
  bindings: {
4213
4667
  angular: {
4214
4668
  importPath: "@uni-design-system/uni-angular",
@@ -4452,7 +4906,7 @@ var uni_index_default = {
4452
4906
  summary: "",
4453
4907
  description: "",
4454
4908
  category: "feedback",
4455
- version: "8.2.0",
4909
+ version: "8.3.0",
4456
4910
  bindings: {
4457
4911
  angular: {
4458
4912
  importPath: "@uni-design-system/uni-angular",
@@ -4476,7 +4930,7 @@ var uni_index_default = {
4476
4930
  summary: "",
4477
4931
  description: "",
4478
4932
  category: "data",
4479
- version: "8.2.0",
4933
+ version: "8.3.0",
4480
4934
  bindings: {
4481
4935
  angular: {
4482
4936
  importPath: "@uni-design-system/uni-angular",
@@ -4558,10 +5012,10 @@ var uni_index_default = {
4558
5012
  id: "popover",
4559
5013
  name: "Popover",
4560
5014
  status: "stable",
4561
- summary: "",
4562
- description: "",
5015
+ 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.",
5016
+ 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.',
4563
5017
  category: "layout",
4564
- version: "8.2.0",
5018
+ version: "8.3.0",
4565
5019
  bindings: {
4566
5020
  angular: {
4567
5021
  importPath: "@uni-design-system/uni-angular",
@@ -4582,6 +5036,87 @@ var uni_index_default = {
4582
5036
  required: false,
4583
5037
  default: "true",
4584
5038
  description: 'Light-dismiss on outside click / Escape (native popover="auto").'
5039
+ },
5040
+ {
5041
+ name: "open",
5042
+ kind: "model",
5043
+ type: "boolean",
5044
+ required: false,
5045
+ default: "false",
5046
+ description: "Two-way open state; light dismissal and hover timers sync back into it."
5047
+ },
5048
+ {
5049
+ name: "mode",
5050
+ kind: "input",
5051
+ type: "'rich' | 'tooltip'",
5052
+ required: false,
5053
+ default: "'rich'",
5054
+ description: "`rich` = click-toggled disclosure; `tooltip` = hover/focus description."
5055
+ },
5056
+ {
5057
+ name: "anchor",
5058
+ kind: "input",
5059
+ type: "HTMLElement | string",
5060
+ required: false,
5061
+ description: "Anchor the panel to another element (or element id, resolved each time the panel opens) while the projected trigger keeps the disclosure ARIA. Empty string means unset."
5062
+ },
5063
+ {
5064
+ name: "header",
5065
+ kind: "input",
5066
+ type: "string",
5067
+ required: false,
5068
+ description: "Title rendered in the header row and used as the accessible name."
5069
+ },
5070
+ {
5071
+ name: "closable",
5072
+ kind: "input",
5073
+ type: "boolean",
5074
+ required: false,
5075
+ default: "false",
5076
+ description: 'Renders a "Close" icon button in the header row.'
5077
+ },
5078
+ {
5079
+ name: "arrow",
5080
+ kind: "input",
5081
+ type: "boolean",
5082
+ required: false,
5083
+ default: "true",
5084
+ description: ""
5085
+ },
5086
+ {
5087
+ name: "maxWidth",
5088
+ kind: "input",
5089
+ type: "string | number",
5090
+ required: false,
5091
+ description: "Panel max-width; numbers are px. Defaults to the theme's `maxWidth`."
5092
+ },
5093
+ {
5094
+ name: "openDelay",
5095
+ kind: "input",
5096
+ type: "number",
5097
+ required: false,
5098
+ description: "Tooltip-mode hover-open delay, ms; defaults to the theme option."
5099
+ },
5100
+ {
5101
+ name: "closeDelay",
5102
+ kind: "input",
5103
+ type: "number",
5104
+ required: false,
5105
+ description: "Tooltip-mode pointer-leave close delay, ms; defaults to the theme option."
5106
+ },
5107
+ {
5108
+ name: "opened",
5109
+ kind: "output",
5110
+ type: "void",
5111
+ required: false,
5112
+ description: ""
5113
+ },
5114
+ {
5115
+ name: "closed",
5116
+ kind: "output",
5117
+ type: "void",
5118
+ required: false,
5119
+ description: ""
4585
5120
  }
4586
5121
  ]
4587
5122
  }
@@ -4590,18 +5125,63 @@ var uni_index_default = {
4590
5125
  {
4591
5126
  title: "Primary",
4592
5127
  framework: "angular",
4593
- code: '<!-- Storybook story: Primary -->\n<uni-popover placement="${placement}" [autoClose]="${autoClose}" #popover>\n <button text-button trigger>Open Popover</button>\n <div stack-layout gap="sm">\n <div>\n <span uni-text="title-small" display="block">\n This is a Popover.\n </span>\n It is possible to add any markup you want to a Popover.\n </div>\n <div>\n <button text-button symbolLeft="thumb_up" size="sm" variant="secondary" (click)="popover.hidePopover()">OK!</button>\n </div>\n </div>\n</uni-popover>\n<!-- args:\n{\n placement: \'right-start\',\n autoClose: true,\n }\n-->'
5128
+ code: '<!-- Storybook story: Primary -->\n<uni-popover placement="${placement}" [autoClose]="${autoClose}" [arrow]="${arrow}" #popover>\n <button text-button trigger>Open Popover</button>\n <div stack-layout gap="sm">\n <div>\n <span uni-text="title-small" display="block">\n This is a Popover.\n </span>\n It is possible to add any markup you want to a Popover.\n </div>\n <div>\n <button text-button symbolLeft="thumb_up" size="sm" variant="secondary" (click)="popover.hidePopover()">OK!</button>\n </div>\n </div>\n</uni-popover>\n<!-- args:\n{\n placement: \'right-start\',\n autoClose: true,\n arrow: true,\n }\n-->'
5129
+ },
5130
+ {
5131
+ title: "Structured Form",
5132
+ framework: "angular",
5133
+ code: '<!-- Storybook story: Structured Form -->\n<uni-popover placement="${placement}" [autoClose]="${autoClose}" [arrow]="${arrow}" #popover>\n <button text-button trigger>Open Popover</button>\n <div stack-layout gap="sm">\n <div>\n <span uni-text="title-small" display="block">\n This is a Popover.\n </span>\n It is possible to add any markup you want to a Popover.\n </div>\n <div>\n <button text-button symbolLeft="thumb_up" size="sm" variant="secondary" (click)="popover.hidePopover()">OK!</button>\n </div>\n </div>\n</uni-popover>'
5134
+ },
5135
+ {
5136
+ title: "Detached Anchor",
5137
+ framework: "angular",
5138
+ code: '<!-- Storybook story: Detached Anchor -->\n<uni-popover placement="${placement}" [autoClose]="${autoClose}" [arrow]="${arrow}" #popover>\n <button text-button trigger>Open Popover</button>\n <div stack-layout gap="sm">\n <div>\n <span uni-text="title-small" display="block">\n This is a Popover.\n </span>\n It is possible to add any markup you want to a Popover.\n </div>\n <div>\n <button text-button symbolLeft="thumb_up" size="sm" variant="secondary" (click)="popover.hidePopover()">OK!</button>\n </div>\n </div>\n</uni-popover>'
5139
+ },
5140
+ {
5141
+ title: "Tooltip Mode",
5142
+ framework: "angular",
5143
+ code: '<!-- Storybook story: Tooltip Mode -->\n<uni-popover placement="${placement}" [autoClose]="${autoClose}" [arrow]="${arrow}" #popover>\n <button text-button trigger>Open Popover</button>\n <div stack-layout gap="sm">\n <div>\n <span uni-text="title-small" display="block">\n This is a Popover.\n </span>\n It is possible to add any markup you want to a Popover.\n </div>\n <div>\n <button text-button symbolLeft="thumb_up" size="sm" variant="secondary" (click)="popover.hidePopover()">OK!</button>\n </div>\n </div>\n</uni-popover>'
5144
+ },
5145
+ {
5146
+ title: "Manual Close",
5147
+ framework: "angular",
5148
+ code: '<!-- Storybook story: Manual Close -->\n<uni-popover placement="${placement}" [autoClose]="${autoClose}" [arrow]="${arrow}" #popover>\n <button text-button trigger>Open Popover</button>\n <div stack-layout gap="sm">\n <div>\n <span uni-text="title-small" display="block">\n This is a Popover.\n </span>\n It is possible to add any markup you want to a Popover.\n </div>\n <div>\n <button text-button symbolLeft="thumb_up" size="sm" variant="secondary" (click)="popover.hidePopover()">OK!</button>\n </div>\n </div>\n</uni-popover>'
4594
5149
  }
4595
5150
  ],
4596
5151
  guidelines: {
4597
- whenToUse: "Popover is a non-modal dialog that floats around a trigger.\nAny type of content can be added inside a popover; however, it is most suitable for short callouts or compact actions.\n**Note:** It is important to add the `trigger` attribute to the item you want to open and be referenced to the Popover.",
4598
- dos: [],
4599
- donts: [],
5152
+ whenToUse: 'Popover is an anchored, non-modal panel on the native popover top layer: the\nbrowser owns positioning, stacking, and light dismissal. Rich mode (the\ndefault) is a click-toggled disclosure for short callouts, small forms, and\ncompact actions; `mode="tooltip"` turns the same element into a hover/focus\ndescription with the full WCAG 1.4.13 contract. Anchoring and control are\nseparate \u2014 `anchor` re-anchors the panel to any element or id while the\nprojected `[trigger]` keeps the disclosure semantics, and with no trigger the\napp drives the two-way `open` model directly.',
5153
+ dos: [
5154
+ "Use rich mode for short callouts, small forms, and compact action clusters",
5155
+ "Give form popovers an `[autofocus]` field and a `[popover-footer]` action",
5156
+ "Use `anchor` when the panel should hug a field the trigger merely explains"
5157
+ ],
5158
+ donts: [
5159
+ "Put focusable content inside tooltip mode \u2014 promote it to rich mode instead",
5160
+ "Reach for a popover when the flow needs modality; that is a dialog"
5161
+ ],
4600
5162
  accessibility: [
4601
- "The trigger carries `aria-expanded` and `aria-controls`; light-dismiss comes from the native popover."
5163
+ "Rich mode wires `aria-expanded`/`aria-controls` onto the focusable trigger; with no projected trigger, no element claims controller ARIA.",
5164
+ 'Tooltip mode is `role="tooltip"` + `aria-describedby` \u2014 a description, never a name \u2014 and warns in dev mode if the content contains focusable elements.',
5165
+ "Focus stays on the trigger when the panel opens (APG disclosure) unless the panel marks an `[autofocus]` field; close returns focus to the trigger.",
5166
+ "The panel sits in the DOM right after the trigger, so Tab order is natural and there is no focus trap in either mode."
4602
5167
  ]
4603
5168
  },
4604
- relatedTokens: []
5169
+ relatedTokens: [
5170
+ "popover.behavior.color",
5171
+ "popover.behavior.border",
5172
+ "popover.behavior.borderRadius",
5173
+ "popover.behavior.shadow",
5174
+ "popover.behavior.typeface",
5175
+ "popover.behavior.padding",
5176
+ "popover.behavior.maxWidth",
5177
+ "popover.behavior.offset",
5178
+ "popover.behavior.arrowSize",
5179
+ "popover.behavior.closeSymbol",
5180
+ "popover.behavior.headerTypeface",
5181
+ "popover.behavior.tooltipPadding",
5182
+ "popover.behavior.tooltipOpenDelay",
5183
+ "popover.behavior.tooltipCloseDelay"
5184
+ ]
4605
5185
  },
4606
5186
  {
4607
5187
  id: "progress-bar",
@@ -4610,7 +5190,7 @@ var uni_index_default = {
4610
5190
  summary: "",
4611
5191
  description: "",
4612
5192
  category: "feedback",
4613
- version: "8.2.0",
5193
+ version: "8.3.0",
4614
5194
  bindings: {
4615
5195
  angular: {
4616
5196
  importPath: "@uni-design-system/uni-angular",
@@ -4674,7 +5254,7 @@ var uni_index_default = {
4674
5254
  summary: "",
4675
5255
  description: "",
4676
5256
  category: "feedback",
4677
- version: "8.2.0",
5257
+ version: "8.3.0",
4678
5258
  bindings: {
4679
5259
  angular: {
4680
5260
  importPath: "@uni-design-system/uni-angular",
@@ -4730,7 +5310,7 @@ var uni_index_default = {
4730
5310
  summary: "",
4731
5311
  description: "",
4732
5312
  category: "forms",
4733
- version: "8.2.0",
5313
+ version: "8.3.0",
4734
5314
  bindings: {
4735
5315
  angular: {
4736
5316
  importPath: "@uni-design-system/uni-angular",
@@ -4882,7 +5462,7 @@ var uni_index_default = {
4882
5462
  summary: "",
4883
5463
  description: "",
4884
5464
  category: "directives",
4885
- version: "8.2.0",
5465
+ version: "8.3.0",
4886
5466
  bindings: {
4887
5467
  angular: {
4888
5468
  importPath: "@uni-design-system/uni-angular",
@@ -4906,7 +5486,7 @@ var uni_index_default = {
4906
5486
  summary: "",
4907
5487
  description: "",
4908
5488
  category: "layout",
4909
- version: "8.2.0",
5489
+ version: "8.3.0",
4910
5490
  bindings: {
4911
5491
  angular: {
4912
5492
  importPath: "@uni-design-system/uni-angular",
@@ -4961,7 +5541,7 @@ var uni_index_default = {
4961
5541
  summary: "Native scroll area with theme-driven scrollbar styling.",
4962
5542
  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.",
4963
5543
  category: "layout",
4964
- version: "8.2.0",
5544
+ version: "8.3.0",
4965
5545
  bindings: {
4966
5546
  angular: {
4967
5547
  importPath: "@uni-design-system/uni-angular",
@@ -5108,7 +5688,7 @@ var uni_index_default = {
5108
5688
  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.",
5109
5689
  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.",
5110
5690
  category: "forms",
5111
- version: "8.2.0",
5691
+ version: "8.3.0",
5112
5692
  bindings: {
5113
5693
  angular: {
5114
5694
  importPath: "@uni-design-system/uni-angular",
@@ -5219,7 +5799,7 @@ var uni_index_default = {
5219
5799
  summary: "",
5220
5800
  description: "",
5221
5801
  category: "forms",
5222
- version: "8.2.0",
5802
+ version: "8.3.0",
5223
5803
  bindings: {
5224
5804
  angular: {
5225
5805
  importPath: "@uni-design-system/uni-angular",
@@ -5338,7 +5918,7 @@ var uni_index_default = {
5338
5918
  }
5339
5919
  ],
5340
5920
  guidelines: {
5341
- whenToUse: "Single choice from a list, on a native `<select>` \u2014 platform pickers on mobile,\nplatform keyboard behavior everywhere. Options are typed generically\n(`options: T[]` with `optionLabel`/`optionValue` accessors), and the component\nimplements `FormValueControl` for the Signal Forms `[field]` directive. Errors\nstyle the field only after interaction, matching Input.\nFor choosing several, use Multi Select; for type-to-filter over large sets, use\nSearch Input's type-ahead.",
5921
+ whenToUse: "Single choice from a list, on a native `<select>` \u2014 platform pickers on mobile,\nplatform keyboard behavior everywhere. Options are typed generically\n(`options: T[]` with `optionLabel`/`optionValue` accessors), and the component\nimplements `FormValueControl` for the Signal Forms `[field]` directive. Errors\nstyle the field only after interaction, matching Input.\nFor choosing several, use Multi Select. When the list outgrows ~10 options, or\nusers know what they're looking for and want to type it, use Combobox \u2014 the\nvalue contract is identical (`T | null`, `compareWith`), so the swap is a\ntemplate-only change.",
5342
5922
  dos: [],
5343
5923
  donts: [],
5344
5924
  accessibility: [
@@ -5355,7 +5935,7 @@ var uni_index_default = {
5355
5935
  summary: "Loading placeholder painted with surface tokens.",
5356
5936
  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`.",
5357
5937
  category: "components",
5358
- version: "8.2.0",
5938
+ version: "8.3.0",
5359
5939
  bindings: {
5360
5940
  angular: {
5361
5941
  importPath: "@uni-design-system/uni-angular",
@@ -5451,7 +6031,7 @@ var uni_index_default = {
5451
6031
  summary: 'Range slider on a native `<input type="range">` \u2014 keyboard interaction and the ARIA slider contract come from the platform.',
5452
6032
  description: 'Range slider on a native `<input type="range">` \u2014 keyboard interaction and the ARIA slider contract come from the platform. Fill, track, thumb and radii resolve from `slider` theme tokens; the fill percentage rides a CSS custom property so dragging never regenerates styles.',
5453
6033
  category: "forms",
5454
- version: "8.2.0",
6034
+ version: "8.3.0",
5455
6035
  bindings: {
5456
6036
  angular: {
5457
6037
  importPath: "@uni-design-system/uni-angular",
@@ -5588,7 +6168,7 @@ var uni_index_default = {
5588
6168
  summary: "",
5589
6169
  description: "",
5590
6170
  category: "feedback",
5591
- version: "8.2.0",
6171
+ version: "8.3.0",
5592
6172
  bindings: {
5593
6173
  angular: {
5594
6174
  importPath: "@uni-design-system/uni-angular",
@@ -5680,7 +6260,7 @@ var uni_index_default = {
5680
6260
  summary: "",
5681
6261
  description: "",
5682
6262
  category: "data",
5683
- version: "8.2.0",
6263
+ version: "8.3.0",
5684
6264
  bindings: {
5685
6265
  angular: {
5686
6266
  importPath: "@uni-design-system/uni-angular",
@@ -5739,7 +6319,7 @@ var uni_index_default = {
5739
6319
  summary: "",
5740
6320
  description: "",
5741
6321
  category: "layout",
5742
- version: "8.2.0",
6322
+ version: "8.3.0",
5743
6323
  bindings: {
5744
6324
  angular: {
5745
6325
  importPath: "@uni-design-system/uni-angular",
@@ -5794,7 +6374,7 @@ var uni_index_default = {
5794
6374
  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.',
5795
6375
  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.',
5796
6376
  category: "components",
5797
- version: "8.2.0",
6377
+ version: "8.3.0",
5798
6378
  bindings: {
5799
6379
  angular: {
5800
6380
  importPath: "@uni-design-system/uni-angular",
@@ -5896,7 +6476,7 @@ var uni_index_default = {
5896
6476
  summary: "",
5897
6477
  description: "",
5898
6478
  category: "primitives",
5899
- version: "8.2.0",
6479
+ version: "8.3.0",
5900
6480
  bindings: {
5901
6481
  angular: {
5902
6482
  importPath: "@uni-design-system/uni-angular",
@@ -5969,7 +6549,7 @@ var uni_index_default = {
5969
6549
  summary: "One tab inside `uni-tabs`: a label for the tablist plus projected panel content.",
5970
6550
  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.",
5971
6551
  category: "components",
5972
- version: "8.2.0",
6552
+ version: "8.3.0",
5973
6553
  bindings: {
5974
6554
  angular: {
5975
6555
  importPath: "@uni-design-system/uni-angular",
@@ -6009,7 +6589,7 @@ var uni_index_default = {
6009
6589
  summary: "WAI-ARIA tabs: roving tabindex, automatic activation (arrow keys move focus and select), Home/End, disabled tabs skipped.",
6010
6590
  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.",
6011
6591
  category: "components",
6012
- version: "8.2.0",
6592
+ version: "8.3.0",
6013
6593
  bindings: {
6014
6594
  angular: {
6015
6595
  importPath: "@uni-design-system/uni-angular",
@@ -6073,7 +6653,7 @@ var uni_index_default = {
6073
6653
  summary: "Compact chip for categories, states, filters and tokens.",
6074
6654
  description: "Compact chip for categories, states, filters and tokens. Two orthogonal style axes: `variant` picks the colour role and `tone` picks the archetype (soft / solid / outline). Both live in the theme's `tag` entry, so a theme restyles every chip in the app without touching markup. Structurally a chip is **body + trailing action as siblings**, never nested buttons: an interactive chip whose body is a `<button>` cannot contain the remove `<button>` (invalid HTML, and the inner control becomes unreachable for keyboard users). Both stay independently operable.",
6075
6655
  category: "data",
6076
- version: "8.2.0",
6656
+ version: "8.3.0",
6077
6657
  bindings: {
6078
6658
  angular: {
6079
6659
  importPath: "@uni-design-system/uni-angular",
@@ -6435,7 +7015,7 @@ var uni_index_default = {
6435
7015
  summary: "",
6436
7016
  description: "",
6437
7017
  category: "forms",
6438
- version: "8.2.0",
7018
+ version: "8.3.0",
6439
7019
  bindings: {
6440
7020
  angular: {
6441
7021
  importPath: "@uni-design-system/uni-angular",
@@ -6752,7 +7332,7 @@ placeholder="Name or address\u2026"
6752
7332
  summary: "The typography primitive, applied as an attribute to any element so semantics stay yours.",
6753
7333
  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.',
6754
7334
  category: "primitives",
6755
- version: "8.2.0",
7335
+ version: "8.3.0",
6756
7336
  bindings: {
6757
7337
  angular: {
6758
7338
  importPath: "@uni-design-system/uni-angular",
@@ -6854,7 +7434,7 @@ placeholder="Name or address\u2026"
6854
7434
  summary: "",
6855
7435
  description: "",
6856
7436
  category: "primitives",
6857
- version: "8.2.0",
7437
+ version: "8.3.0",
6858
7438
  bindings: {
6859
7439
  angular: {
6860
7440
  importPath: "@uni-design-system/uni-angular",
@@ -6984,7 +7564,7 @@ placeholder="Name or address\u2026"
6984
7564
  summary: "",
6985
7565
  description: "",
6986
7566
  category: "primitives",
6987
- version: "8.2.0",
7567
+ version: "8.3.0",
6988
7568
  bindings: {
6989
7569
  angular: {
6990
7570
  importPath: "@uni-design-system/uni-angular",
@@ -7014,7 +7594,7 @@ placeholder="Name or address\u2026"
7014
7594
  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).",
7015
7595
  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).",
7016
7596
  category: "components",
7017
- version: "8.2.0",
7597
+ version: "8.3.0",
7018
7598
  bindings: {
7019
7599
  angular: {
7020
7600
  importPath: "@uni-design-system/uni-angular",
@@ -7072,7 +7652,7 @@ placeholder="Name or address\u2026"
7072
7652
  summary: "Time field: a combobox over time options \u2014 the same listbox contract as uni-search-input and uni-tag-input.",
7073
7653
  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.",
7074
7654
  category: "forms",
7075
- version: "8.2.0",
7655
+ version: "8.3.0",
7076
7656
  bindings: {
7077
7657
  angular: {
7078
7658
  importPath: "@uni-design-system/uni-angular",
@@ -7264,7 +7844,7 @@ placeholder="Name or address\u2026"
7264
7844
  summary: "",
7265
7845
  description: "",
7266
7846
  category: "forms",
7267
- version: "8.2.0",
7847
+ version: "8.3.0",
7268
7848
  bindings: {
7269
7849
  angular: {
7270
7850
  importPath: "@uni-design-system/uni-angular",
@@ -7394,7 +7974,7 @@ placeholder="Name or address\u2026"
7394
7974
  summary: "",
7395
7975
  description: "",
7396
7976
  category: "feedback",
7397
- version: "8.2.0",
7977
+ version: "8.3.0",
7398
7978
  bindings: {
7399
7979
  angular: {
7400
7980
  importPath: "@uni-design-system/uni-angular",
@@ -7436,8 +8016,109 @@ placeholder="Name or address\u2026"
7436
8016
  kind: "input",
7437
8017
  type: "boolean",
7438
8018
  required: false,
7439
- default: "false",
7440
- description: "@deprecated The tooltip renders in the native top layer; ignored."
8019
+ default: "false",
8020
+ description: "@deprecated The tooltip renders in the native top layer; ignored."
8021
+ }
8022
+ ]
8023
+ }
8024
+ },
8025
+ examples: [
8026
+ {
8027
+ title: "Primary",
8028
+ framework: "angular",
8029
+ code: "<!-- Storybook story: Primary -->\n<span uni-text>Here is some text with a <uni-tooltip ${argsToTemplate(props)}>tooltip</uni-tooltip> in the middle.\n</span>\n<!-- args:\n{\n label: 'Bottom-start tooltip',\n placement: 'bottom-start',\n inlineText: true,\n }\n-->"
8030
+ }
8031
+ ],
8032
+ guidelines: {
8033
+ whenToUse: 'A tooltip is a brief, informative message that appears when a user interacts with an element.\nIf using a tooltip within a body of text, set the `inlineText` option to `true`.\nWrapping an interactive control (a button, a link) is supported: activating\nthe control hides the bubble and keeps it hidden until the pointer leaves and\nreturns, so a label that changes with the control\'s state ("Expand" \u2192\n"Collapse") never blinks back mid-interaction. Tapping a non-interactive\ntooltip (inline text) still toggles the bubble.',
8034
+ dos: [],
8035
+ donts: [],
8036
+ accessibility: [
8037
+ '`role="tooltip"` linked to the trigger via `aria-describedby` (wired once \u2014 the bubble is always in the DOM).',
8038
+ "Shows on keyboard focus, hides on blur and Escape; stays open while hovered (WCAG 1.4.13).",
8039
+ 'Non-focusable triggers get `tabindex="0"` so keyboard users can reach the tooltip.'
8040
+ ]
8041
+ },
8042
+ relatedTokens: [
8043
+ "tooltip.behavior.borderRadius",
8044
+ "tooltip.behavior.shadow",
8045
+ "tooltip.behavior.color",
8046
+ "tooltip.behavior.typeface"
8047
+ ]
8048
+ },
8049
+ {
8050
+ id: "tour",
8051
+ name: "Tour",
8052
+ status: "stable",
8053
+ 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).',
8054
+ 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.',
8055
+ category: "components",
8056
+ version: "8.3.0",
8057
+ bindings: {
8058
+ angular: {
8059
+ importPath: "@uni-design-system/uni-angular",
8060
+ selectorOrTag: "uni-tour",
8061
+ api: [
8062
+ {
8063
+ name: "steps",
8064
+ kind: "input",
8065
+ type: "UniTourStep[]",
8066
+ required: true,
8067
+ description: ""
8068
+ },
8069
+ {
8070
+ name: "active",
8071
+ kind: "model",
8072
+ type: "number | null",
8073
+ required: false,
8074
+ default: "null",
8075
+ description: "The presented step index, or null when the tour is not running."
8076
+ },
8077
+ {
8078
+ name: "nextLabel",
8079
+ kind: "input",
8080
+ type: "string",
8081
+ required: false,
8082
+ default: "'Next'",
8083
+ description: ""
8084
+ },
8085
+ {
8086
+ name: "backLabel",
8087
+ kind: "input",
8088
+ type: "string",
8089
+ required: false,
8090
+ default: "'Back'",
8091
+ description: ""
8092
+ },
8093
+ {
8094
+ name: "skipLabel",
8095
+ kind: "input",
8096
+ type: "string",
8097
+ required: false,
8098
+ default: "'Skip'",
8099
+ description: ""
8100
+ },
8101
+ {
8102
+ name: "doneLabel",
8103
+ kind: "input",
8104
+ type: "string",
8105
+ required: false,
8106
+ default: "'Done'",
8107
+ description: ""
8108
+ },
8109
+ {
8110
+ name: "started",
8111
+ kind: "output",
8112
+ type: "void",
8113
+ required: false,
8114
+ description: ""
8115
+ },
8116
+ {
8117
+ name: "finished",
8118
+ kind: "output",
8119
+ type: "void",
8120
+ required: false,
8121
+ description: ""
7441
8122
  }
7442
8123
  ]
7443
8124
  }
@@ -7446,24 +8127,34 @@ placeholder="Name or address\u2026"
7446
8127
  {
7447
8128
  title: "Primary",
7448
8129
  framework: "angular",
7449
- code: "<!-- Storybook story: Primary -->\n<span uni-text>Here is some text with a <uni-tooltip ${argsToTemplate(props)}>tooltip</uni-tooltip> in the middle.\n</span>\n<!-- args:\n{\n label: 'Bottom-start tooltip',\n placement: 'bottom-start',\n inlineText: true,\n }\n-->"
8130
+ code: '<!-- Storybook story: Primary -->\n<div stack-layout gap="md">\n<button text-button (click)="tour.start()">Start tour</button>\n<uni-input label="Search projects" id="tour-demo-search"></uni-input>\n<uni-input label="Weekly report" id="tour-demo-report"></uni-input>\n<uni-input label="Project name" id="tour-demo-name"></uni-input>\n<div><button text-button variant="secondary" id="tour-demo-create">Create project</button></div>\n<uni-tour #tour [steps]="steps"></uni-tour>\n</div>'
8131
+ },
8132
+ {
8133
+ title: "Fraction Progress",
8134
+ framework: "angular",
8135
+ code: '<!-- Storybook story: Fraction Progress -->\n<div stack-layout gap="md">\n<button text-button (click)="tour.start()">Start tour</button>\n<uni-input label="Search projects" id="tour-demo-search"></uni-input>\n<uni-input label="Weekly report" id="tour-demo-report"></uni-input>\n<uni-input label="Project name" id="tour-demo-name"></uni-input>\n<div><button text-button variant="secondary" id="tour-demo-create">Create project</button></div>\n<uni-tour #tour [steps]="steps"></uni-tour>\n</div>'
7450
8136
  }
7451
8137
  ],
7452
8138
  guidelines: {
7453
- whenToUse: 'A tooltip is a brief, informative message that appears when a user interacts with an element.\nIf using a tooltip within a body of text, set the `inlineText` option to `true`.\nWrapping an interactive control (a button, a link) is supported: activating\nthe control hides the bubble and keeps it hidden until the pointer leaves and\nreturns, so a label that changes with the control\'s state ("Expand" \u2192\n"Collapse") never blinks back mid-interaction. Tapping a non-interactive\ntooltip (inline text) still toggles the bubble.',
7454
- dos: [],
7455
- donts: [],
8139
+ whenToUse: 'Tour sequences one `uni-callout` through a list of steps: spotlight targets,\ndim interludes, and interaction gates. A step with `advanceOn` locks Next\nuntil the user performs the gesture on its target \u2014 clicks auto-advance\n(the gesture is complete), anything else unlocks Next and announces it\nthrough one polite `role="status"` region, so nobody is yanked forward\nmid-typing. Steps whose declared target cannot be found are skipped in the\ndirection of travel with a dev warning, never an error. `active` is a\ntwo-way model, so tours are deep-linkable; Escape or the close button skips\nand reports the step through `skipped`.',
8140
+ dos: [
8141
+ "Keep tours short and gate only steps whose gesture teaches something",
8142
+ "Handle `skipped`/`finished` and persist them \u2014 the tour holds no storage"
8143
+ ],
8144
+ donts: [
8145
+ "Point steps at elements that may not exist without accepting the skip",
8146
+ "Span routes in one tour; sequence per page instead"
8147
+ ],
7456
8148
  accessibility: [
7457
- '`role="tooltip"` linked to the trigger via `aria-describedby` (wired once \u2014 the bubble is always in the DOM).',
7458
- "Shows on keyboard focus, hides on blur and Escape; stays open while hovered (WCAG 1.4.13).",
7459
- 'Non-focusable triggers get `tabindex="0"` so keyboard users can reach the tooltip.'
8149
+ 'Each panel is labelled `"<title>, step <n> of <total>"`; the dots are `aria-hidden` decoration.',
8150
+ 'Gate unlocks are announced ("Next available") through a single persistent live region.',
8151
+ "Arrow-key navigation never fires while the user is typing in a spotlit target.",
8152
+ "The close button reads as the skip affordance (`skipLabel`)."
7460
8153
  ]
7461
8154
  },
7462
8155
  relatedTokens: [
7463
- "tooltip.behavior.borderRadius",
7464
- "tooltip.behavior.shadow",
7465
- "tooltip.behavior.color",
7466
- "tooltip.behavior.typeface"
8156
+ "tour.behavior.progressStyle",
8157
+ "tour.behavior.footerGap"
7467
8158
  ]
7468
8159
  },
7469
8160
  {
@@ -7473,7 +8164,7 @@ placeholder="Name or address\u2026"
7473
8164
  summary: "",
7474
8165
  description: "",
7475
8166
  category: "layout",
7476
- version: "8.2.0",
8167
+ version: "8.3.0",
7477
8168
  bindings: {
7478
8169
  angular: {
7479
8170
  importPath: "@uni-design-system/uni-angular",
@@ -9351,6 +10042,18 @@ placeholder="Name or address\u2026"
9351
10042
  DarkTheme: "xs"
9352
10043
  }
9353
10044
  },
10045
+ {
10046
+ id: "searchInput.behavior.activeColor",
10047
+ value: "primary-container",
10048
+ type: "string",
10049
+ kind: "behavioral",
10050
+ target: "component-prop",
10051
+ appliesTo: "searchInput",
10052
+ themeValues: {
10053
+ LightTheme: "primary-container",
10054
+ DarkTheme: "primary-container"
10055
+ }
10056
+ },
9354
10057
  {
9355
10058
  id: "searchInput.behavior.maxSuggestions",
9356
10059
  value: 8,
@@ -9927,6 +10630,174 @@ placeholder="Name or address\u2026"
9927
10630
  DarkTheme: 0.35
9928
10631
  }
9929
10632
  },
10633
+ {
10634
+ id: "popover.behavior.color",
10635
+ value: "primary-surface",
10636
+ type: "string",
10637
+ kind: "behavioral",
10638
+ target: "component-prop",
10639
+ appliesTo: "popover",
10640
+ themeValues: {
10641
+ LightTheme: "primary-surface",
10642
+ DarkTheme: "primary-surface"
10643
+ }
10644
+ },
10645
+ {
10646
+ id: "popover.behavior.border",
10647
+ value: "quaternary",
10648
+ type: "string",
10649
+ kind: "behavioral",
10650
+ target: "component-prop",
10651
+ appliesTo: "popover",
10652
+ themeValues: {
10653
+ LightTheme: "quaternary",
10654
+ DarkTheme: "quaternary"
10655
+ }
10656
+ },
10657
+ {
10658
+ id: "popover.behavior.borderRadius",
10659
+ value: "xs",
10660
+ type: "string",
10661
+ kind: "behavioral",
10662
+ target: "component-prop",
10663
+ appliesTo: "popover",
10664
+ themeValues: {
10665
+ LightTheme: "xs",
10666
+ DarkTheme: "xs"
10667
+ }
10668
+ },
10669
+ {
10670
+ id: "popover.behavior.shadow",
10671
+ value: "raised",
10672
+ type: "string",
10673
+ kind: "behavioral",
10674
+ target: "component-prop",
10675
+ appliesTo: "popover",
10676
+ themeValues: {
10677
+ LightTheme: "raised",
10678
+ DarkTheme: "raised"
10679
+ }
10680
+ },
10681
+ {
10682
+ id: "popover.behavior.typeface",
10683
+ value: "label",
10684
+ type: "string",
10685
+ kind: "behavioral",
10686
+ target: "component-prop",
10687
+ appliesTo: "popover",
10688
+ themeValues: {
10689
+ LightTheme: "label",
10690
+ DarkTheme: "label"
10691
+ }
10692
+ },
10693
+ {
10694
+ id: "popover.behavior.padding",
10695
+ value: "6px 12px",
10696
+ type: "string",
10697
+ kind: "behavioral",
10698
+ target: "component-prop",
10699
+ appliesTo: "popover",
10700
+ themeValues: {
10701
+ LightTheme: "6px 12px",
10702
+ DarkTheme: "6px 12px"
10703
+ }
10704
+ },
10705
+ {
10706
+ id: "popover.behavior.maxWidth",
10707
+ value: "38ch",
10708
+ type: "string",
10709
+ kind: "behavioral",
10710
+ target: "component-prop",
10711
+ appliesTo: "popover",
10712
+ themeValues: {
10713
+ LightTheme: "38ch",
10714
+ DarkTheme: "38ch"
10715
+ }
10716
+ },
10717
+ {
10718
+ id: "popover.behavior.offset",
10719
+ value: 7,
10720
+ type: "number",
10721
+ kind: "behavioral",
10722
+ target: "component-prop",
10723
+ appliesTo: "popover",
10724
+ themeValues: {
10725
+ LightTheme: 7,
10726
+ DarkTheme: 7
10727
+ }
10728
+ },
10729
+ {
10730
+ id: "popover.behavior.arrowSize",
10731
+ value: 8,
10732
+ type: "number",
10733
+ kind: "behavioral",
10734
+ target: "component-prop",
10735
+ appliesTo: "popover",
10736
+ themeValues: {
10737
+ LightTheme: 8,
10738
+ DarkTheme: 8
10739
+ }
10740
+ },
10741
+ {
10742
+ id: "popover.behavior.closeSymbol",
10743
+ value: "close",
10744
+ type: "string",
10745
+ kind: "behavioral",
10746
+ target: "component-prop",
10747
+ appliesTo: "popover",
10748
+ themeValues: {
10749
+ LightTheme: "close",
10750
+ DarkTheme: "close"
10751
+ }
10752
+ },
10753
+ {
10754
+ id: "popover.behavior.headerTypeface",
10755
+ value: "title-small",
10756
+ type: "string",
10757
+ kind: "behavioral",
10758
+ target: "component-prop",
10759
+ appliesTo: "popover",
10760
+ themeValues: {
10761
+ LightTheme: "title-small",
10762
+ DarkTheme: "title-small"
10763
+ }
10764
+ },
10765
+ {
10766
+ id: "popover.behavior.tooltipPadding",
10767
+ value: "4px 8px",
10768
+ type: "string",
10769
+ kind: "behavioral",
10770
+ target: "component-prop",
10771
+ appliesTo: "popover",
10772
+ themeValues: {
10773
+ LightTheme: "4px 8px",
10774
+ DarkTheme: "4px 8px"
10775
+ }
10776
+ },
10777
+ {
10778
+ id: "popover.behavior.tooltipOpenDelay",
10779
+ value: 500,
10780
+ type: "number",
10781
+ kind: "behavioral",
10782
+ target: "component-prop",
10783
+ appliesTo: "popover",
10784
+ themeValues: {
10785
+ LightTheme: 500,
10786
+ DarkTheme: 500
10787
+ }
10788
+ },
10789
+ {
10790
+ id: "popover.behavior.tooltipCloseDelay",
10791
+ value: 150,
10792
+ type: "number",
10793
+ kind: "behavioral",
10794
+ target: "component-prop",
10795
+ appliesTo: "popover",
10796
+ themeValues: {
10797
+ LightTheme: 150,
10798
+ DarkTheme: 150
10799
+ }
10800
+ },
9930
10801
  {
9931
10802
  id: "expand.behavior.transitionSpeed",
9932
10803
  value: 0.35,
@@ -10503,6 +11374,18 @@ placeholder="Name or address\u2026"
10503
11374
  DarkTheme: "xs"
10504
11375
  }
10505
11376
  },
11377
+ {
11378
+ id: "tagInput.behavior.activeColor",
11379
+ value: "primary-container",
11380
+ type: "string",
11381
+ kind: "behavioral",
11382
+ target: "component-prop",
11383
+ appliesTo: "tagInput",
11384
+ themeValues: {
11385
+ LightTheme: "primary-container",
11386
+ DarkTheme: "primary-container"
11387
+ }
11388
+ },
10506
11389
  {
10507
11390
  id: "tagInput.behavior.maxSuggestions",
10508
11391
  value: 8,
@@ -10600,15 +11483,123 @@ placeholder="Name or address\u2026"
10600
11483
  }
10601
11484
  },
10602
11485
  {
10603
- id: "calendar.behavior.todayStyle",
10604
- value: "outline",
11486
+ id: "calendar.behavior.todayStyle",
11487
+ value: "outline",
11488
+ type: "string",
11489
+ kind: "behavioral",
11490
+ target: "component-prop",
11491
+ appliesTo: "calendar",
11492
+ themeValues: {
11493
+ LightTheme: "outline",
11494
+ DarkTheme: "outline"
11495
+ }
11496
+ },
11497
+ {
11498
+ id: "combobox.behavior.toggleIcon",
11499
+ value: "chevronDown",
11500
+ type: "string",
11501
+ kind: "behavioral",
11502
+ target: "component-prop",
11503
+ appliesTo: "combobox",
11504
+ themeValues: {
11505
+ LightTheme: "chevronDown",
11506
+ DarkTheme: "chevronDown"
11507
+ }
11508
+ },
11509
+ {
11510
+ id: "combobox.behavior.clearIcon",
11511
+ value: "close",
11512
+ type: "string",
11513
+ kind: "behavioral",
11514
+ target: "component-prop",
11515
+ appliesTo: "combobox",
11516
+ themeValues: {
11517
+ LightTheme: "close",
11518
+ DarkTheme: "close"
11519
+ }
11520
+ },
11521
+ {
11522
+ id: "combobox.behavior.selectedIcon",
11523
+ value: "check",
11524
+ type: "string",
11525
+ kind: "behavioral",
11526
+ target: "component-prop",
11527
+ appliesTo: "combobox",
11528
+ themeValues: {
11529
+ LightTheme: "check",
11530
+ DarkTheme: "check"
11531
+ }
11532
+ },
11533
+ {
11534
+ id: "combobox.behavior.listColor",
11535
+ value: "primary-surface",
11536
+ type: "string",
11537
+ kind: "behavioral",
11538
+ target: "component-prop",
11539
+ appliesTo: "combobox",
11540
+ themeValues: {
11541
+ LightTheme: "primary-surface",
11542
+ DarkTheme: "primary-surface"
11543
+ }
11544
+ },
11545
+ {
11546
+ id: "combobox.behavior.listShadow",
11547
+ value: "menu",
11548
+ type: "string",
11549
+ kind: "behavioral",
11550
+ target: "component-prop",
11551
+ appliesTo: "combobox",
11552
+ themeValues: {
11553
+ LightTheme: "menu",
11554
+ DarkTheme: "menu"
11555
+ }
11556
+ },
11557
+ {
11558
+ id: "combobox.behavior.listBorderRadius",
11559
+ value: "xs",
11560
+ type: "string",
11561
+ kind: "behavioral",
11562
+ target: "component-prop",
11563
+ appliesTo: "combobox",
11564
+ themeValues: {
11565
+ LightTheme: "xs",
11566
+ DarkTheme: "xs"
11567
+ }
11568
+ },
11569
+ {
11570
+ id: "combobox.behavior.activeColor",
11571
+ value: "primary-container",
11572
+ type: "string",
11573
+ kind: "behavioral",
11574
+ target: "component-prop",
11575
+ appliesTo: "combobox",
11576
+ themeValues: {
11577
+ LightTheme: "primary-container",
11578
+ DarkTheme: "primary-container"
11579
+ }
11580
+ },
11581
+ {
11582
+ id: "combobox.behavior.maxVisibleOptions",
11583
+ value: 8,
11584
+ type: "number",
11585
+ kind: "behavioral",
11586
+ target: "component-prop",
11587
+ appliesTo: "combobox",
11588
+ themeValues: {
11589
+ LightTheme: 8,
11590
+ DarkTheme: 8
11591
+ }
11592
+ },
11593
+ {
11594
+ id: "combobox.behavior.descriptionColor",
11595
+ value: "on-primary-surface-variant",
10605
11596
  type: "string",
10606
11597
  kind: "behavioral",
10607
11598
  target: "component-prop",
10608
- appliesTo: "calendar",
11599
+ appliesTo: "combobox",
10609
11600
  themeValues: {
10610
- LightTheme: "outline",
10611
- DarkTheme: "outline"
11601
+ LightTheme: "on-primary-surface-variant",
11602
+ DarkTheme: "on-primary-surface-variant"
10612
11603
  }
10613
11604
  },
10614
11605
  {
@@ -10707,6 +11698,18 @@ placeholder="Name or address\u2026"
10707
11698
  DarkTheme: "xs"
10708
11699
  }
10709
11700
  },
11701
+ {
11702
+ id: "timeInput.behavior.activeColor",
11703
+ value: "primary-container",
11704
+ type: "string",
11705
+ kind: "behavioral",
11706
+ target: "component-prop",
11707
+ appliesTo: "timeInput",
11708
+ themeValues: {
11709
+ LightTheme: "primary-container",
11710
+ DarkTheme: "primary-container"
11711
+ }
11712
+ },
10710
11713
  {
10711
11714
  id: "timeInput.behavior.maxVisibleOptions",
10712
11715
  value: 7,
@@ -11618,6 +12621,210 @@ placeholder="Name or address\u2026"
11618
12621
  LightTheme: "label",
11619
12622
  DarkTheme: "label"
11620
12623
  }
12624
+ },
12625
+ {
12626
+ id: "callout.behavior.color",
12627
+ value: "primary-surface",
12628
+ type: "string",
12629
+ kind: "behavioral",
12630
+ target: "component-prop",
12631
+ appliesTo: "callout",
12632
+ themeValues: {
12633
+ LightTheme: "primary-surface",
12634
+ DarkTheme: "primary-surface"
12635
+ }
12636
+ },
12637
+ {
12638
+ id: "callout.behavior.borderRadius",
12639
+ value: "xs",
12640
+ type: "string",
12641
+ kind: "behavioral",
12642
+ target: "component-prop",
12643
+ appliesTo: "callout",
12644
+ themeValues: {
12645
+ LightTheme: "xs",
12646
+ DarkTheme: "xs"
12647
+ }
12648
+ },
12649
+ {
12650
+ id: "callout.behavior.shadow",
12651
+ value: "menu",
12652
+ type: "string",
12653
+ kind: "behavioral",
12654
+ target: "component-prop",
12655
+ appliesTo: "callout",
12656
+ themeValues: {
12657
+ LightTheme: "menu",
12658
+ DarkTheme: "menu"
12659
+ }
12660
+ },
12661
+ {
12662
+ id: "callout.behavior.width",
12663
+ value: "320px",
12664
+ type: "string",
12665
+ kind: "behavioral",
12666
+ target: "component-prop",
12667
+ appliesTo: "callout",
12668
+ themeValues: {
12669
+ LightTheme: "320px",
12670
+ DarkTheme: "320px"
12671
+ }
12672
+ },
12673
+ {
12674
+ id: "callout.behavior.padding",
12675
+ value: "16px",
12676
+ type: "string",
12677
+ kind: "behavioral",
12678
+ target: "component-prop",
12679
+ appliesTo: "callout",
12680
+ themeValues: {
12681
+ LightTheme: "16px",
12682
+ DarkTheme: "16px"
12683
+ }
12684
+ },
12685
+ {
12686
+ id: "callout.behavior.headerTypeface",
12687
+ value: "title-small",
12688
+ type: "string",
12689
+ kind: "behavioral",
12690
+ target: "component-prop",
12691
+ appliesTo: "callout",
12692
+ themeValues: {
12693
+ LightTheme: "title-small",
12694
+ DarkTheme: "title-small"
12695
+ }
12696
+ },
12697
+ {
12698
+ id: "callout.behavior.typeface",
12699
+ value: "label",
12700
+ type: "string",
12701
+ kind: "behavioral",
12702
+ target: "component-prop",
12703
+ appliesTo: "callout",
12704
+ themeValues: {
12705
+ LightTheme: "label",
12706
+ DarkTheme: "label"
12707
+ }
12708
+ },
12709
+ {
12710
+ id: "callout.behavior.closeSymbol",
12711
+ value: "close",
12712
+ type: "string",
12713
+ kind: "behavioral",
12714
+ target: "component-prop",
12715
+ appliesTo: "callout",
12716
+ themeValues: {
12717
+ LightTheme: "close",
12718
+ DarkTheme: "close"
12719
+ }
12720
+ },
12721
+ {
12722
+ id: "callout.behavior.arrowSize",
12723
+ value: 8,
12724
+ type: "number",
12725
+ kind: "behavioral",
12726
+ target: "component-prop",
12727
+ appliesTo: "callout",
12728
+ themeValues: {
12729
+ LightTheme: 8,
12730
+ DarkTheme: 8
12731
+ }
12732
+ },
12733
+ {
12734
+ id: "callout.behavior.offset",
12735
+ value: 12,
12736
+ type: "number",
12737
+ kind: "behavioral",
12738
+ target: "component-prop",
12739
+ appliesTo: "callout",
12740
+ themeValues: {
12741
+ LightTheme: 12,
12742
+ DarkTheme: 12
12743
+ }
12744
+ },
12745
+ {
12746
+ id: "callout.behavior.scrimColor",
12747
+ value: "rgba(0, 0, 0, 0.45)",
12748
+ type: "string",
12749
+ kind: "behavioral",
12750
+ target: "component-prop",
12751
+ appliesTo: "callout",
12752
+ themeValues: {
12753
+ LightTheme: "rgba(0, 0, 0, 0.45)",
12754
+ DarkTheme: "rgba(0, 0, 0, 0.45)"
12755
+ }
12756
+ },
12757
+ {
12758
+ id: "callout.behavior.spotlightPadding",
12759
+ value: 6,
12760
+ type: "number",
12761
+ kind: "behavioral",
12762
+ target: "component-prop",
12763
+ appliesTo: "callout",
12764
+ themeValues: {
12765
+ LightTheme: 6,
12766
+ DarkTheme: 6
12767
+ }
12768
+ },
12769
+ {
12770
+ id: "callout.behavior.spotlightRadius",
12771
+ value: "xs",
12772
+ type: "string",
12773
+ kind: "behavioral",
12774
+ target: "component-prop",
12775
+ appliesTo: "callout",
12776
+ themeValues: {
12777
+ LightTheme: "xs",
12778
+ DarkTheme: "xs"
12779
+ }
12780
+ },
12781
+ {
12782
+ id: "callout.behavior.ringWidth",
12783
+ value: 2,
12784
+ type: "number",
12785
+ kind: "behavioral",
12786
+ target: "component-prop",
12787
+ appliesTo: "callout",
12788
+ themeValues: {
12789
+ LightTheme: 2,
12790
+ DarkTheme: 2
12791
+ }
12792
+ },
12793
+ {
12794
+ id: "callout.behavior.transitionMs",
12795
+ value: 250,
12796
+ type: "number",
12797
+ kind: "behavioral",
12798
+ target: "component-prop",
12799
+ appliesTo: "callout",
12800
+ themeValues: {
12801
+ LightTheme: 250,
12802
+ DarkTheme: 250
12803
+ }
12804
+ },
12805
+ {
12806
+ id: "tour.behavior.progressStyle",
12807
+ value: "dots",
12808
+ type: "string",
12809
+ kind: "behavioral",
12810
+ target: "component-prop",
12811
+ appliesTo: "tour",
12812
+ themeValues: {
12813
+ LightTheme: "dots",
12814
+ DarkTheme: "dots"
12815
+ }
12816
+ },
12817
+ {
12818
+ id: "tour.behavior.footerGap",
12819
+ value: "sm",
12820
+ type: "string",
12821
+ kind: "behavioral",
12822
+ target: "component-prop",
12823
+ appliesTo: "tour",
12824
+ themeValues: {
12825
+ LightTheme: "sm",
12826
+ DarkTheme: "sm"
12827
+ }
11621
12828
  }
11622
12829
  ],
11623
12830
  themes: [
@@ -11805,6 +13012,7 @@ placeholder="Name or address\u2026"
11805
13012
  listColor: "primary-surface",
11806
13013
  listShadow: "menu",
11807
13014
  listBorderRadius: "xs",
13015
+ activeColor: "primary-container",
11808
13016
  maxSuggestions: 8
11809
13017
  },
11810
13018
  checkbox: {
@@ -11870,6 +13078,22 @@ placeholder="Name or address\u2026"
11870
13078
  activeSymbol: "check",
11871
13079
  transitionSpeed: 0.35
11872
13080
  },
13081
+ popover: {
13082
+ color: "primary-surface",
13083
+ border: "quaternary",
13084
+ borderRadius: "xs",
13085
+ shadow: "raised",
13086
+ typeface: "label",
13087
+ padding: "6px 12px",
13088
+ maxWidth: "38ch",
13089
+ offset: 7,
13090
+ arrowSize: 8,
13091
+ closeSymbol: "close",
13092
+ headerTypeface: "title-small",
13093
+ tooltipPadding: "4px 8px",
13094
+ tooltipOpenDelay: 500,
13095
+ tooltipCloseDelay: 150
13096
+ },
11873
13097
  expand: {
11874
13098
  transitionSpeed: 0.35
11875
13099
  },
@@ -11935,6 +13159,7 @@ placeholder="Name or address\u2026"
11935
13159
  listColor: "primary-surface",
11936
13160
  listShadow: "menu",
11937
13161
  listBorderRadius: "xs",
13162
+ activeColor: "primary-container",
11938
13163
  maxSuggestions: 8
11939
13164
  },
11940
13165
  calendar: {
@@ -11947,6 +13172,17 @@ placeholder="Name or address\u2026"
11947
13172
  showOutsideDays: false,
11948
13173
  todayStyle: "outline"
11949
13174
  },
13175
+ combobox: {
13176
+ toggleIcon: "chevronDown",
13177
+ clearIcon: "close",
13178
+ selectedIcon: "check",
13179
+ listColor: "primary-surface",
13180
+ listShadow: "menu",
13181
+ listBorderRadius: "xs",
13182
+ activeColor: "primary-container",
13183
+ maxVisibleOptions: 8,
13184
+ descriptionColor: "on-primary-surface-variant"
13185
+ },
11950
13186
  dateInput: {
11951
13187
  toggleSymbol: "calendar_month",
11952
13188
  popupShadow: "menu",
@@ -11958,6 +13194,7 @@ placeholder="Name or address\u2026"
11958
13194
  listColor: "primary-surface",
11959
13195
  listShadow: "menu",
11960
13196
  listBorderRadius: "xs",
13197
+ activeColor: "primary-container",
11961
13198
  maxVisibleOptions: 7
11962
13199
  },
11963
13200
  dateTimeInput: {
@@ -12064,6 +13301,27 @@ placeholder="Name or address\u2026"
12064
13301
  shadow: "raised",
12065
13302
  color: "inverse-surface",
12066
13303
  typeface: "label"
13304
+ },
13305
+ callout: {
13306
+ color: "primary-surface",
13307
+ borderRadius: "xs",
13308
+ shadow: "menu",
13309
+ width: "320px",
13310
+ padding: "16px",
13311
+ headerTypeface: "title-small",
13312
+ typeface: "label",
13313
+ closeSymbol: "close",
13314
+ arrowSize: 8,
13315
+ offset: 12,
13316
+ scrimColor: "rgba(0, 0, 0, 0.45)",
13317
+ spotlightPadding: 6,
13318
+ spotlightRadius: "xs",
13319
+ ringWidth: 2,
13320
+ transitionMs: 250
13321
+ },
13322
+ tour: {
13323
+ progressStyle: "dots",
13324
+ footerGap: "sm"
12067
13325
  }
12068
13326
  },
12069
13327
  usage: "Apply style overrides through the Emotion theme provider (the `UniTheme` object), and pass component options as component inputs/props. Import the theme from `@uni-design-system/uni-core` (`LightTheme`)."
@@ -12252,6 +13510,7 @@ placeholder="Name or address\u2026"
12252
13510
  listColor: "primary-surface",
12253
13511
  listShadow: "menu",
12254
13512
  listBorderRadius: "xs",
13513
+ activeColor: "primary-container",
12255
13514
  maxSuggestions: 8
12256
13515
  },
12257
13516
  checkbox: {
@@ -12317,6 +13576,22 @@ placeholder="Name or address\u2026"
12317
13576
  activeSymbol: "check",
12318
13577
  transitionSpeed: 0.35
12319
13578
  },
13579
+ popover: {
13580
+ color: "primary-surface",
13581
+ border: "quaternary",
13582
+ borderRadius: "xs",
13583
+ shadow: "raised",
13584
+ typeface: "label",
13585
+ padding: "6px 12px",
13586
+ maxWidth: "38ch",
13587
+ offset: 7,
13588
+ arrowSize: 8,
13589
+ closeSymbol: "close",
13590
+ headerTypeface: "title-small",
13591
+ tooltipPadding: "4px 8px",
13592
+ tooltipOpenDelay: 500,
13593
+ tooltipCloseDelay: 150
13594
+ },
12320
13595
  expand: {
12321
13596
  transitionSpeed: 0.35
12322
13597
  },
@@ -12382,6 +13657,7 @@ placeholder="Name or address\u2026"
12382
13657
  listColor: "primary-surface",
12383
13658
  listShadow: "menu",
12384
13659
  listBorderRadius: "xs",
13660
+ activeColor: "primary-container",
12385
13661
  maxSuggestions: 8
12386
13662
  },
12387
13663
  calendar: {
@@ -12394,6 +13670,17 @@ placeholder="Name or address\u2026"
12394
13670
  showOutsideDays: false,
12395
13671
  todayStyle: "outline"
12396
13672
  },
13673
+ combobox: {
13674
+ toggleIcon: "chevronDown",
13675
+ clearIcon: "close",
13676
+ selectedIcon: "check",
13677
+ listColor: "primary-surface",
13678
+ listShadow: "menu",
13679
+ listBorderRadius: "xs",
13680
+ activeColor: "primary-container",
13681
+ maxVisibleOptions: 8,
13682
+ descriptionColor: "on-primary-surface-variant"
13683
+ },
12397
13684
  dateInput: {
12398
13685
  toggleSymbol: "calendar_month",
12399
13686
  popupShadow: "menu",
@@ -12405,6 +13692,7 @@ placeholder="Name or address\u2026"
12405
13692
  listColor: "primary-surface",
12406
13693
  listShadow: "menu",
12407
13694
  listBorderRadius: "xs",
13695
+ activeColor: "primary-container",
12408
13696
  maxVisibleOptions: 7
12409
13697
  },
12410
13698
  dateTimeInput: {
@@ -12511,6 +13799,27 @@ placeholder="Name or address\u2026"
12511
13799
  shadow: "raised",
12512
13800
  color: "inverse-surface",
12513
13801
  typeface: "label"
13802
+ },
13803
+ callout: {
13804
+ color: "primary-surface",
13805
+ borderRadius: "xs",
13806
+ shadow: "menu",
13807
+ width: "320px",
13808
+ padding: "16px",
13809
+ headerTypeface: "title-small",
13810
+ typeface: "label",
13811
+ closeSymbol: "close",
13812
+ arrowSize: 8,
13813
+ offset: 12,
13814
+ scrimColor: "rgba(0, 0, 0, 0.45)",
13815
+ spotlightPadding: 6,
13816
+ spotlightRadius: "xs",
13817
+ ringWidth: 2,
13818
+ transitionMs: 250
13819
+ },
13820
+ tour: {
13821
+ progressStyle: "dots",
13822
+ footerGap: "sm"
12514
13823
  }
12515
13824
  },
12516
13825
  usage: "Apply style overrides through the Emotion theme provider (the `UniTheme` object), and pass component options as component inputs/props. Import the theme from `@uni-design-system/uni-core` (`DarkTheme`)."
@@ -12520,6 +13829,30 @@ placeholder="Name or address\u2026"
12520
13829
  {
12521
13830
  package: "@uni-design-system/uni-angular",
12522
13831
  releases: [
13832
+ {
13833
+ version: "8.3.0",
13834
+ entries: [
13835
+ {
13836
+ bump: "minor",
13837
+ title: '`uni-combobox` \u2014 the form-bound, closed-set, single-select autocomplete. `FormValueControl<T | null>` over the cdk\'s object `Options<T>`, so it drops into Signal Forms via `[field]`; minimum usage is `<uni-combobox label="State" [options]="states" [(value)]="state" />`. Typing filters, it never selects: the draft commits on an active option, a unique exact label match, or (Enter only) a filter narrowed to one enabled option; anything else reverts and emits `(rejected)`. The value contract is identical to `uni-select` (`T | null`, `compareWith`), so swapping one for the other as a list grows is a template-only change. Filtering is local by default; `[filterLocally]="false"` renders `options` verbatim and the app narrows them from the debounced `(query)` output \u2014 the async/server-side story. Glyphs are theme icon primitives (`toggleIcon`/`clearIcon`/`selectedIcon`) rendered by `uni-icon`.',
13838
+ body: "Supporting cdk changes, both non-breaking:\n- `Option<T>` gains optional `description` (secondary line, read as part of the option's name) and `disabled` (visible and announced, not committable).\n- `ListboxNavigation` accepts a `disabled?: (index) => boolean` config hook \u2014 arrows skip disabled options, `Home`/`End` land on the nearest enabled one, an all-disabled list never activates. Existing consumers pass nothing and behave identically.",
13839
+ commit: "eb8b7ae"
13840
+ },
13841
+ {
13842
+ bump: "minor",
13843
+ title: "Listbox popups (`uni-search-input`, `uni-tag-input`, `uni-time-input`, `uni-combobox`): the active/hover option fill is now the themable `activeColor` option (default `'primary-container'`, on-color derived) instead of a hardcoded token pair. Set it when your theme maps `primary-container` and `primary-surface` to the same color \u2014 the keyboard highlight is otherwise invisible; a canvas/hover tint like the one your menus use is usually right (`searchInput: { options: { activeColor: 'tertiary-surface' } }`, and likewise `tagInput`/`timeInput`/`combobox`). The base theme carries the default explicitly so the option is discoverable in each component's Theme options table.",
13844
+ body: "The four popups now share one style source, the exported `listboxPopupStyles(theme, options, { maxHeight? })` helper (`UniListboxPopupOptions`), so their surface trio and highlight can no longer drift apart. Rendering is unchanged under existing themes; the active row's text color now derives from `listColor`'s on-pair rather than assuming `on-primary-surface`.",
13845
+ commit: "eb8b7ae"
13846
+ },
13847
+ {
13848
+ bump: "minor",
13849
+ title: "Popover v2, `uni-callout`, and `uni-tour` \u2014 the coach-mark family from the popover prototype, plus shared overlay primitives in the cdk.",
13850
+ body: "**`uni-popover` v2 (upgrade in place).** Everything v1 shipped keeps its exact behavior (`placement`, `autoClose`, the three methods \u2014 `togglePopover`'s event is now optional \u2014 and both slots), and the chrome now resolves from a real `popover` theme entry whose defaults match the old hardcoded look. New: a two-way `open` model; `mode=\"tooltip\"` (hover/focus timers, `role=\"tooltip\"` + `aria-describedby`, WCAG 1.4.13 hoverable/dismissable, dev warning on focusable content \u2014 `uni-tooltip` remains for the wrap-content case); a detached `anchor` input (element or id, resolved at open) so the panel can hug a field while the trigger keeps the disclosure ARIA \u2014 and with no trigger content, no element claims `aria-expanded` it doesn't deserve; structured anatomy (`header` + `closable` \u2715, `[popover-header]`/`[popover-footer]` slots that collapse when empty); `arrow`, `maxWidth` (theme default `38ch` \u2014 the one visible change for long unwrapped content; set the theme's `maxWidth: 'none'` to opt out), `openDelay`/`closeDelay`, and `opened`/`closed` outputs. Focus follows the APG disclosure pattern: stays on the trigger unless the panel marks `[autofocus]`, returns on close.\n\n**`uni-callout` (new).** An anchored coach mark that dims the page and cuts a spotlight hole around its target. Every scrim piece is CSS-anchor-positioned, so the hole tracks scroll/resize/layout with zero listeners, and the spotlit element stays genuinely clickable through it (`targetInteractive=false` covers it instead). Non-modal `role=\"dialog\"` with the \"duet\" focus loop \u2014 Tab cycles the panel's controls plus the interactive target \u2014 and focus restore that respects a user who moved into the target. `backdrop: 'spotlight' | 'dim' | 'none'`, `dismissible`, `dismissOnBackdrop` (otherwise backdrop clicks pulse the panel), and a `dismissed` output with `reason` (`close-button`/`escape`/`backdrop`/`programmatic`) plus `key` \u2014 the storage-free \"don't show again\" hooks. Retargets in place when `target` changes while open, which is what the tour rides.\n\n**`uni-tour` (new).** A thin sequencer over one callout: `steps` with per-step placement/backdrop/interactivity, a two-way deep-linkable `active` model, Back/Next/Done with dots-or-fraction progress, and `advanceOn` interaction gates \u2014 clicks auto-advance, anything else unlocks Next and announces it through one polite live region. Missing-target steps are skipped in the direction of travel with a dev warning. Escape/\u2715 (named by `skipLabel`) skip and report the step.\n\n**cdk.** New `overlay` module (`TRANSFORM_ORIGINS`, `setAnchorName`/`clearAnchorName`, `resolveElement` \u2014 `''` is unset, `isToggleOpen`, `discreteOverlayTransition`, `restoreOverlayFocus`, `focusableElements`) extracted from the dropdown's plumbing (dropdown's public API unchanged); `spotlightStyles(anchor, { pad, ringWidth, scrimColor })` beside `anchorStyles`, returning the window/strips/cover pieces as pure `calc(anchor(...))` style objects.\n\n**Arrow fix.** `anchorArrowStyles` now clips the rotated-square arrow to its outer half with a per-placement `clip-path` cut exactly on the panel-edge diagonal: the two border strokes previously ran the full square and visibly cut into the panel surface; they now terminate precisely at the panel edge, and the panel's own border line \u2014 which sits just outside that edge \u2014 falls inside the kept half, so the arrow background covers it and the base reads as an opening in the border. Tooltip, popover, and callout inherit the fix with no call-site changes.",
13851
+ commit: "6f87212"
13852
+ }
13853
+ ],
13854
+ dependencyBumps: []
13855
+ },
12523
13856
  {
12524
13857
  version: "8.2.0",
12525
13858
  entries: [
@@ -12994,6 +14327,30 @@ placeholder="Name or address\u2026"
12994
14327
  {
12995
14328
  package: "@uni-design-system/uni-core",
12996
14329
  releases: [
14330
+ {
14331
+ version: "8.3.0",
14332
+ entries: [
14333
+ {
14334
+ bump: "minor",
14335
+ title: "`'combobox'` joins `ComponentName`, with a base-theme entry: `toggleIcon: 'chevronDown'`, `clearIcon: 'close'`, `selectedIcon: 'check'` (BaseIcons names rendered by `uni-icon` \u2014 not Material Symbol ligatures), the listbox surface trio (`listColor`/`listShadow`/`listBorderRadius`), `activeColor`, `descriptionColor`, and `maxVisibleOptions: 8` \u2014 a scroll height, never a cap. Field chrome comes from the `input` entry via `uni-input-box`, as everywhere.",
14336
+ body: "",
14337
+ commit: "eb8b7ae"
14338
+ },
14339
+ {
14340
+ bump: "minor",
14341
+ title: "Listbox popups (`uni-search-input`, `uni-tag-input`, `uni-time-input`, `uni-combobox`): the active/hover option fill is now the themable `activeColor` option (default `'primary-container'`, on-color derived) instead of a hardcoded token pair. Set it when your theme maps `primary-container` and `primary-surface` to the same color \u2014 the keyboard highlight is otherwise invisible; a canvas/hover tint like the one your menus use is usually right (`searchInput: { options: { activeColor: 'tertiary-surface' } }`, and likewise `tagInput`/`timeInput`/`combobox`). The base theme carries the default explicitly so the option is discoverable in each component's Theme options table.",
14342
+ body: "The four popups now share one style source, the exported `listboxPopupStyles(theme, options, { maxHeight? })` helper (`UniListboxPopupOptions`), so their surface trio and highlight can no longer drift apart. Rendering is unchanged under existing themes; the active row's text color now derives from `listColor`'s on-pair rather than assuming `on-primary-surface`.",
14343
+ commit: "eb8b7ae"
14344
+ },
14345
+ {
14346
+ bump: "minor",
14347
+ title: "`'popover'`, `'callout'`, and `'tour'` join `ComponentName`, with base-theme entries. The popover defaults reproduce the previously hardcoded look (`primary-surface`, `quaternary` border, `xs` radius, `raised` shadow, `6px 12px` padding, 7px offset) plus the tooltip-mode options; the callout entry carries the scrim/spotlight geometry (`scrimColor`, `spotlightPadding`, `spotlightRadius`, `ringWidth` \u2014 the ring color is deliberately the `variant` role, not an option); the tour entry is just `progressStyle` and `footerGap`, since its skin is the callout's.",
14348
+ body: "",
14349
+ commit: "6f87212"
14350
+ }
14351
+ ],
14352
+ dependencyBumps: []
14353
+ },
12997
14354
  {
12998
14355
  version: "8.2.0",
12999
14356
  entries: [
@@ -13364,6 +14721,11 @@ placeholder="Name or address\u2026"
13364
14721
  {
13365
14722
  package: "@uni-design-system/uni-react",
13366
14723
  releases: [
14724
+ {
14725
+ version: "8.3.0",
14726
+ entries: [],
14727
+ dependencyBumps: []
14728
+ },
13367
14729
  {
13368
14730
  version: "8.2.0",
13369
14731
  entries: [
@@ -13541,6 +14903,18 @@ placeholder="Name or address\u2026"
13541
14903
  {
13542
14904
  package: "@uni-design-system/uni-mcp",
13543
14905
  releases: [
14906
+ {
14907
+ version: "4.7.1",
14908
+ entries: [
14909
+ {
14910
+ bump: "patch",
14911
+ title: "README: the hosted (Render) endpoint is marked dormant \u2014 no deployment is currently running; stdio via `npx -y @uni-design-system/uni-mcp` is the canonical path (pin the package to your installed Uni version for version-locked answers). The HTTP mode stays documented and deployable for when a browser-based consumer needs it. The `get-changelog` and `export-dtcg-tokens` tools are now listed in the tools table.",
14912
+ body: "",
14913
+ commit: "b160b3c"
14914
+ }
14915
+ ],
14916
+ dependencyBumps: []
14917
+ },
13544
14918
  {
13545
14919
  version: "4.7.0",
13546
14920
  entries: [
@@ -14851,6 +16225,7 @@ var buildComponents = (c) => ({
14851
16225
  listColor: "primary-surface",
14852
16226
  listShadow: "menu",
14853
16227
  listBorderRadius: "xs",
16228
+ activeColor: "primary-container",
14854
16229
  maxSuggestions: 8
14855
16230
  } },
14856
16231
  checkbox: { options: {
@@ -14933,6 +16308,22 @@ var buildComponents = (c) => ({
14933
16308
  }
14934
16309
  } }
14935
16310
  },
16311
+ popover: { options: {
16312
+ color: "primary-surface",
16313
+ border: "quaternary",
16314
+ borderRadius: "xs",
16315
+ shadow: "raised",
16316
+ typeface: "label",
16317
+ padding: "6px 12px",
16318
+ maxWidth: "38ch",
16319
+ offset: 7,
16320
+ arrowSize: 8,
16321
+ closeSymbol: "close",
16322
+ headerTypeface: "title-small",
16323
+ tooltipPadding: "4px 8px",
16324
+ tooltipOpenDelay: 500,
16325
+ tooltipCloseDelay: 150
16326
+ } },
14936
16327
  expand: { options: { transitionSpeed: 0.35 } },
14937
16328
  footer: { options: {
14938
16329
  height: 52,
@@ -15052,6 +16443,7 @@ var buildComponents = (c) => ({
15052
16443
  listColor: "primary-surface",
15053
16444
  listShadow: "menu",
15054
16445
  listBorderRadius: "xs",
16446
+ activeColor: "primary-container",
15055
16447
  maxSuggestions: 8
15056
16448
  } },
15057
16449
  calendar: {
@@ -15087,6 +16479,17 @@ var buildComponents = (c) => ({
15087
16479
  }
15088
16480
  }
15089
16481
  },
16482
+ combobox: { options: {
16483
+ toggleIcon: "chevronDown",
16484
+ clearIcon: "close",
16485
+ selectedIcon: "check",
16486
+ listColor: "primary-surface",
16487
+ listShadow: "menu",
16488
+ listBorderRadius: "xs",
16489
+ activeColor: "primary-container",
16490
+ maxVisibleOptions: 8,
16491
+ descriptionColor: "on-primary-surface-variant"
16492
+ } },
15090
16493
  dateInput: { options: {
15091
16494
  toggleSymbol: "calendar_month",
15092
16495
  popupShadow: "menu",
@@ -15098,6 +16501,7 @@ var buildComponents = (c) => ({
15098
16501
  listColor: "primary-surface",
15099
16502
  listShadow: "menu",
15100
16503
  listBorderRadius: "xs",
16504
+ activeColor: "primary-container",
15101
16505
  maxVisibleOptions: 7
15102
16506
  } },
15103
16507
  dateTimeInput: { options: {
@@ -15405,6 +16809,27 @@ var buildComponents = (c) => ({
15405
16809
  shadow: "raised",
15406
16810
  color: "inverse-surface",
15407
16811
  typeface: "label"
16812
+ } },
16813
+ callout: { options: {
16814
+ color: "primary-surface",
16815
+ borderRadius: "xs",
16816
+ shadow: "menu",
16817
+ width: "320px",
16818
+ padding: "16px",
16819
+ headerTypeface: "title-small",
16820
+ typeface: "label",
16821
+ closeSymbol: "close",
16822
+ arrowSize: 8,
16823
+ offset: 12,
16824
+ scrimColor: "rgba(0, 0, 0, 0.45)",
16825
+ spotlightPadding: 6,
16826
+ spotlightRadius: "xs",
16827
+ ringWidth: 2,
16828
+ transitionMs: 250
16829
+ } },
16830
+ tour: { options: {
16831
+ progressStyle: "dots",
16832
+ footerGap: "sm"
15408
16833
  } }
15409
16834
  });
15410
16835
  var isRecord$1 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
@@ -16751,4 +18176,4 @@ export {
16751
18176
  buildStoredTheme,
16752
18177
  createUniServer
16753
18178
  };
16754
- //# sourceMappingURL=chunk-JOMMURY6.js.map
18179
+ //# sourceMappingURL=chunk-YLYBDQAV.js.map