@uni-design-system/uni-mcp 4.5.0 → 4.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -7,16 +7,16 @@ import { z } from "zod";
7
7
  // src/data/uni-index.json
8
8
  var uni_index_default = {
9
9
  meta: {
10
- version: "7.1.0",
11
- builtAt: "2026-07-29T18:07:05.414Z",
10
+ version: "8.0.0",
11
+ builtAt: "2026-08-11T20:20:04.699Z",
12
12
  frameworks: [
13
13
  "angular"
14
14
  ],
15
15
  counts: {
16
- components: 71,
17
- tokens: 305,
16
+ components: 72,
17
+ tokens: 331,
18
18
  themes: 2,
19
- examples: 134
19
+ examples: 150
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: "7.1.0",
30
+ version: "8.0.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: "",
102
102
  description: "",
103
103
  category: "components",
104
- version: "7.1.0",
104
+ version: "8.0.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: "",
159
159
  description: "",
160
160
  category: "components",
161
- version: "7.1.0",
161
+ version: "8.0.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: "",
238
238
  description: "",
239
239
  category: "components",
240
- version: "7.1.0",
240
+ version: "8.0.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: "7.1.0",
273
+ version: "8.0.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: "7.1.0",
354
+ version: "8.0.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: "7.1.0",
435
+ version: "8.0.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: "",
457
457
  description: "",
458
458
  category: "layout",
459
- version: "7.1.0",
459
+ version: "8.0.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: "",
820
820
  description: "",
821
821
  category: "components",
822
- version: "7.1.0",
822
+ version: "8.0.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: "7.1.0",
891
+ version: "8.0.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: "7.1.0",
1034
+ version: "8.0.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: "",
1064
1064
  description: "",
1065
1065
  category: "layout",
1066
- version: "7.1.0",
1066
+ version: "8.0.0",
1067
1067
  bindings: {
1068
1068
  angular: {
1069
1069
  importPath: "@uni-design-system/uni-angular",
@@ -1108,7 +1108,7 @@ var uni_index_default = {
1108
1108
  summary: "",
1109
1109
  description: "",
1110
1110
  category: "layout",
1111
- version: "7.1.0",
1111
+ version: "8.0.0",
1112
1112
  bindings: {
1113
1113
  angular: {
1114
1114
  importPath: "@uni-design-system/uni-angular",
@@ -1132,7 +1132,7 @@ var uni_index_default = {
1132
1132
  summary: "",
1133
1133
  description: "",
1134
1134
  category: "layout",
1135
- version: "7.1.0",
1135
+ version: "8.0.0",
1136
1136
  bindings: {
1137
1137
  angular: {
1138
1138
  importPath: "@uni-design-system/uni-angular",
@@ -1173,7 +1173,7 @@ var uni_index_default = {
1173
1173
  summary: "",
1174
1174
  description: "",
1175
1175
  category: "layout",
1176
- version: "7.1.0",
1176
+ version: "8.0.0",
1177
1177
  bindings: {
1178
1178
  angular: {
1179
1179
  importPath: "@uni-design-system/uni-angular",
@@ -1228,7 +1228,7 @@ var uni_index_default = {
1228
1228
  summary: "",
1229
1229
  description: "",
1230
1230
  category: "forms",
1231
- version: "7.1.0",
1231
+ version: "8.0.0",
1232
1232
  bindings: {
1233
1233
  angular: {
1234
1234
  importPath: "@uni-design-system/uni-angular",
@@ -1365,7 +1365,7 @@ var uni_index_default = {
1365
1365
  summary: "",
1366
1366
  description: "",
1367
1367
  category: "feedback",
1368
- version: "7.1.0",
1368
+ version: "8.0.0",
1369
1369
  bindings: {
1370
1370
  angular: {
1371
1371
  importPath: "@uni-design-system/uni-angular",
@@ -1412,7 +1412,7 @@ var uni_index_default = {
1412
1412
  summary: "",
1413
1413
  description: "",
1414
1414
  category: "forms",
1415
- version: "7.1.0",
1415
+ version: "8.0.0",
1416
1416
  bindings: {
1417
1417
  angular: {
1418
1418
  importPath: "@uni-design-system/uni-angular",
@@ -1481,7 +1481,7 @@ var uni_index_default = {
1481
1481
  }
1482
1482
  ],
1483
1483
  guidelines: {
1484
- whenToUse: 'The Data Search input filters a `UniDatasource` as the user types. With a client-side\n`UniRecordDatasource` it applies a predicate over the record\'s fields; with a\n`UniServerSideDatasource` it sends a filter object to the data loader. Pass `fields` to\nrestrict the search to specific columns. A clear button resets the filter.\nIt pairs with the [Data Table](?path=/docs/components-data-table--docs) \u2014 see its\n"With Search" story.',
1484
+ whenToUse: 'The Data Search input filters a `UniDatasource` as the user types. With a client-side\n`UniRecordDatasource` it applies a predicate over the record\'s fields; with a\n`UniServerSideDatasource` it sends a filter object to the data loader. Pass `fields` to\nrestrict the search to specific columns. A clear button resets the filter.\nIt pairs with the [Data Table](?path=/docs/components-data-display-data-table--data-table) \u2014 see its\n"With Search" story.',
1485
1485
  dos: [],
1486
1486
  donts: [],
1487
1487
  accessibility: []
@@ -1495,7 +1495,7 @@ var uni_index_default = {
1495
1495
  summary: "",
1496
1496
  description: "",
1497
1497
  category: "data",
1498
- version: "7.1.0",
1498
+ version: "8.0.0",
1499
1499
  bindings: {
1500
1500
  angular: {
1501
1501
  importPath: "@uni-design-system/uni-angular",
@@ -1596,7 +1596,7 @@ var uni_index_default = {
1596
1596
  summary: "",
1597
1597
  description: "",
1598
1598
  category: "forms",
1599
- version: "7.1.0",
1599
+ version: "8.0.0",
1600
1600
  bindings: {
1601
1601
  angular: {
1602
1602
  importPath: "@uni-design-system/uni-angular",
@@ -1705,7 +1705,7 @@ var uni_index_default = {
1705
1705
  }
1706
1706
  ],
1707
1707
  guidelines: {
1708
- whenToUse: "A themed text input that emits its `change` output only after the user pauses typing\n(400 ms by default) and only when the value actually changed \u2014 a signal-based\ndebounce with no rxjs involved. The live value is exposed as the `value` signal, and\n`clear()` empties the field immediately (cancelling any pending emit).\nIt wears the shared input chrome (color, border, typeface, focus ring) via the input\nbox, and offers `pre-input` / `post-input` attribute slots for adornments plus ARIA\npassthrough inputs (`role`, `ariaExpanded`, `ariaControls`, `ariaActivedescendant`)\nso composite widgets can annotate the real input element.\nUsed by the [Search Input](?path=/docs/components-forms-search-input--docs), which\nprojects its magnifier and clear button through the slots and drives the combobox\nARIA through the passthroughs.",
1708
+ whenToUse: "A themed text input that emits its `change` output only after the user pauses typing\n(400 ms by default) and only when the value actually changed \u2014 a signal-based\ndebounce with no rxjs involved. The live value is exposed as the `value` signal, and\n`clear()` empties the field immediately (cancelling any pending emit).\nIt wears the shared input chrome (color, border, typeface, focus ring) via the input\nbox, and offers `pre-input` / `post-input` attribute slots for adornments plus ARIA\npassthrough inputs (`role`, `ariaExpanded`, `ariaControls`, `ariaActivedescendant`)\nso composite widgets can annotate the real input element.\nUsed by the [Search Input](?path=/docs/components-forms-search-input--search-input), which\nprojects its magnifier and clear button through the slots and drives the combobox\nARIA through the passthroughs.",
1709
1709
  dos: [],
1710
1710
  donts: [],
1711
1711
  accessibility: [
@@ -1722,7 +1722,7 @@ var uni_index_default = {
1722
1722
  summary: "",
1723
1723
  description: "",
1724
1724
  category: "feedback",
1725
- version: "7.1.0",
1725
+ version: "8.0.0",
1726
1726
  bindings: {
1727
1727
  angular: {
1728
1728
  importPath: "@uni-design-system/uni-angular",
@@ -1800,7 +1800,7 @@ var uni_index_default = {
1800
1800
  summary: "",
1801
1801
  description: "",
1802
1802
  category: "feedback",
1803
- version: "7.1.0",
1803
+ version: "8.0.0",
1804
1804
  bindings: {
1805
1805
  angular: {
1806
1806
  importPath: "@uni-design-system/uni-angular",
@@ -1888,7 +1888,7 @@ var uni_index_default = {
1888
1888
  summary: "",
1889
1889
  description: "",
1890
1890
  category: "feedback",
1891
- version: "7.1.0",
1891
+ version: "8.0.0",
1892
1892
  bindings: {
1893
1893
  angular: {
1894
1894
  importPath: "@uni-design-system/uni-angular",
@@ -1912,7 +1912,7 @@ var uni_index_default = {
1912
1912
  summary: "",
1913
1913
  description: "",
1914
1914
  category: "layout",
1915
- version: "7.1.0",
1915
+ version: "8.0.0",
1916
1916
  bindings: {
1917
1917
  angular: {
1918
1918
  importPath: "@uni-design-system/uni-angular",
@@ -1968,7 +1968,7 @@ var uni_index_default = {
1968
1968
  summary: "",
1969
1969
  description: "",
1970
1970
  category: "directives",
1971
- version: "7.1.0",
1971
+ version: "8.0.0",
1972
1972
  bindings: {
1973
1973
  angular: {
1974
1974
  importPath: "@uni-design-system/uni-angular",
@@ -2000,7 +2000,7 @@ var uni_index_default = {
2000
2000
  summary: "",
2001
2001
  description: "",
2002
2002
  category: "components",
2003
- version: "7.1.0",
2003
+ version: "8.0.0",
2004
2004
  bindings: {
2005
2005
  angular: {
2006
2006
  importPath: "@uni-design-system/uni-angular",
@@ -2079,7 +2079,7 @@ var uni_index_default = {
2079
2079
  summary: "",
2080
2080
  description: "",
2081
2081
  category: "components",
2082
- version: "7.1.0",
2082
+ version: "8.0.0",
2083
2083
  bindings: {
2084
2084
  angular: {
2085
2085
  importPath: "@uni-design-system/uni-angular",
@@ -2130,6 +2130,34 @@ var uni_index_default = {
2130
2130
  required: false,
2131
2131
  description: ""
2132
2132
  },
2133
+ {
2134
+ name: "border",
2135
+ kind: "input",
2136
+ type: "Border | undefined",
2137
+ required: false,
2138
+ description: ""
2139
+ },
2140
+ {
2141
+ name: "borderRadius",
2142
+ kind: "input",
2143
+ type: "Radius | undefined",
2144
+ required: false,
2145
+ description: ""
2146
+ },
2147
+ {
2148
+ name: "shadow",
2149
+ kind: "input",
2150
+ type: "Shadow | undefined",
2151
+ required: false,
2152
+ description: ""
2153
+ },
2154
+ {
2155
+ name: "color",
2156
+ kind: "input",
2157
+ type: "ContainerColorToken | undefined",
2158
+ required: false,
2159
+ description: ""
2160
+ },
2133
2161
  {
2134
2162
  name: "dropdownShowing",
2135
2163
  kind: "output",
@@ -2168,7 +2196,7 @@ var uni_index_default = {
2168
2196
  summary: "",
2169
2197
  description: "",
2170
2198
  category: "layout",
2171
- version: "7.1.0",
2199
+ version: "8.0.0",
2172
2200
  bindings: {
2173
2201
  angular: {
2174
2202
  importPath: "@uni-design-system/uni-angular",
@@ -2181,6 +2209,13 @@ var uni_index_default = {
2181
2209
  required: false,
2182
2210
  default: "true",
2183
2211
  description: ""
2212
+ },
2213
+ {
2214
+ name: "transitionSpeed",
2215
+ kind: "input",
2216
+ type: "number",
2217
+ required: false,
2218
+ description: "Exact per-instance duration in seconds. Bypasses size-aware scaling \u2014 an explicit number means the consumer wants that number. Omitted, the duration derives from the `expand` theme options' `transitionSpeed` scaled by content height (see `duration`)."
2184
2219
  }
2185
2220
  ]
2186
2221
  }
@@ -2191,8 +2226,8 @@ var uni_index_default = {
2191
2226
  framework: "angular",
2192
2227
  code: `<!-- Storybook story: Primary -->
2193
2228
  <uni-card>
2194
- <uni-card-header title="Expandable Card"><uni-expand-toggle #toggle /></uni-card-header>
2195
- <uni-expand [collapsed]="toggle.collapsed()">
2229
+ <uni-card-header title="Expandable Card"><uni-expand-toggle #toggle [transitionSpeed]="expand.duration()" /></uni-card-header>
2230
+ <uni-expand #expand [collapsed]="toggle.collapsed()" [transitionSpeed]="transitionSpeed">
2196
2231
  <uni-card-content>
2197
2232
  <span uni-text>\${ngContent}</span>
2198
2233
  </uni-card-content>
@@ -2203,6 +2238,30 @@ var uni_index_default = {
2203
2238
  ngContent: 'Expandable Content',
2204
2239
  }
2205
2240
  -->`
2241
+ },
2242
+ {
2243
+ title: "Snappy",
2244
+ framework: "angular",
2245
+ code: `<!-- Storybook story: Snappy -->
2246
+ <uni-card>
2247
+ <uni-card-header title="Expandable Card"><uni-expand-toggle #toggle [transitionSpeed]="expand.duration()" /></uni-card-header>
2248
+ <uni-expand #expand [collapsed]="toggle.collapsed()" [transitionSpeed]="transitionSpeed">
2249
+ <uni-card-content>
2250
+ <span uni-text>\${ngContent}</span>
2251
+ </uni-card-content>
2252
+ </uni-expand>
2253
+ </uni-card>
2254
+ <!-- args:
2255
+ {
2256
+ ngContent: 'Reveals in exactly 150ms, regardless of content height.',
2257
+ transitionSpeed: 0.15,
2258
+ }
2259
+ -->`
2260
+ },
2261
+ {
2262
+ title: "Tall",
2263
+ framework: "angular",
2264
+ code: '<!-- Storybook story: Tall -->\n<uni-card>\n<uni-card-header title="Expandable Card"><uni-expand-toggle #toggle [transitionSpeed]="expand.duration()" /></uni-card-header>\n<uni-expand #expand [collapsed]="toggle.collapsed()" [transitionSpeed]="transitionSpeed">\n <uni-card-content>\n <span uni-text>${ngContent}</span>\n </uni-card-content>\n</uni-expand>\n</uni-card>\n<!-- args:\n{\n ngContent: Array.from(\n { length: 12 },\n (_, i) => `Row ${i + 1} of a tall reveal, timed to its height.`,\n ).join(\'<br>\'),\n }\n-->'
2206
2265
  }
2207
2266
  ],
2208
2267
  guidelines: {
@@ -2210,10 +2269,13 @@ var uni_index_default = {
2210
2269
  dos: [],
2211
2270
  donts: [],
2212
2271
  accessibility: [
2213
- "The toggle carries `aria-expanded` and `aria-controls` for its region (wired automatically inside Expand Area)."
2272
+ "The toggle carries `aria-expanded` and `aria-controls` for its region (wired automatically inside Expand Area).",
2273
+ "The reveal is motion-safe (WCAG 2.3.3): under `prefers-reduced-motion` the"
2214
2274
  ]
2215
2275
  },
2216
- relatedTokens: []
2276
+ relatedTokens: [
2277
+ "expand.behavior.transitionSpeed"
2278
+ ]
2217
2279
  },
2218
2280
  {
2219
2281
  id: "expand-area",
@@ -2222,7 +2284,7 @@ var uni_index_default = {
2222
2284
  summary: "",
2223
2285
  description: "",
2224
2286
  category: "layout",
2225
- version: "7.1.0",
2287
+ version: "8.0.0",
2226
2288
  bindings: {
2227
2289
  angular: {
2228
2290
  importPath: "@uni-design-system/uni-angular",
@@ -2293,7 +2355,7 @@ var uni_index_default = {
2293
2355
  summary: "",
2294
2356
  description: "",
2295
2357
  category: "forms",
2296
- version: "7.1.0",
2358
+ version: "8.0.0",
2297
2359
  bindings: {
2298
2360
  angular: {
2299
2361
  importPath: "@uni-design-system/uni-angular",
@@ -2313,6 +2375,27 @@ var uni_index_default = {
2313
2375
  type: "string",
2314
2376
  required: false,
2315
2377
  description: "Id of the Expand region this toggle controls (see UniExpandComponent.regionId)."
2378
+ },
2379
+ {
2380
+ name: "label",
2381
+ kind: "input",
2382
+ type: "string",
2383
+ required: false,
2384
+ description: "Names the region. Setting it switches the toggle to its labelled shape."
2385
+ },
2386
+ {
2387
+ name: "sublabel",
2388
+ kind: "input",
2389
+ type: "string",
2390
+ required: false,
2391
+ description: 'Muted qualifier beside the label ("for POs & custom orders"). Needs `label`.'
2392
+ },
2393
+ {
2394
+ name: "transitionSpeed",
2395
+ kind: "input",
2396
+ type: "number",
2397
+ required: false,
2398
+ description: "Rotation duration in seconds. Expand Area binds the region's resolved `duration` here so chevron and reveal share one clock even when the region is size-scaled or overridden per instance."
2316
2399
  }
2317
2400
  ]
2318
2401
  }
@@ -2322,13 +2405,31 @@ var uni_index_default = {
2322
2405
  title: "Primary",
2323
2406
  framework: "angular",
2324
2407
  code: '<!-- Storybook story: Primary -->\n<uni-expand-toggle [collapsed]="collapsed" #toggle />\n<div>Collapsed: {{ toggle.collapsed() }}</div>\n<!-- args:\n{\n collapsed: true,\n }\n-->'
2408
+ },
2409
+ {
2410
+ title: "Labelled",
2411
+ framework: "angular",
2412
+ code: `<!-- Storybook story: Labelled -->
2413
+ <uni-expand-toggle [collapsed]="collapsed" #toggle />
2414
+ <div>Collapsed: {{ toggle.collapsed() }}</div>
2415
+ <!-- args:
2416
+ {
2417
+ collapsed: true,
2418
+ label: 'Dimensions & Materials',
2419
+ sublabel: 'for POs & custom orders',
2420
+ }
2421
+ -->`
2325
2422
  }
2326
2423
  ],
2327
2424
  guidelines: {
2328
- whenToUse: 'The Expand Toggle is a chevron icon button that controls collapsed/expanded state. It pairs\nwith the [Expand](?path=/docs/components-expand--docs) component: bind the toggle\'s\n`collapsed` model to the Expand\'s `collapsed` input to build collapsible sections.\nThe icon rotates 180\xB0 between states and shows an "Expand"/"Collapse" tooltip.',
2425
+ whenToUse: 'The Expand Toggle is a chevron icon button that controls collapsed/expanded state. It pairs\nwith the [Expand](?path=/docs/components-surfaces-expand--expand) component: bind the toggle\'s\n`collapsed` model to the Expand\'s `collapsed` input to build collapsible sections.\nThe icon rotates 180\xB0 between states and shows an "Expand"/"Collapse" tooltip.\nThe transform is applied to the glyph, not to the component host \u2014 the host is\nthe tooltip\'s anchor, so rotating it would carry the bubble around with it.',
2329
2426
  dos: [],
2330
2427
  donts: [],
2331
- accessibility: []
2428
+ accessibility: [
2429
+ "`aria-expanded` is set for you from `collapsed`.",
2430
+ "Pass `ariaControls` the Expand's `regionId` so the trigger points at its",
2431
+ "Rotation is motion-safe \u2014 it does not animate under `prefers-reduced-motion`."
2432
+ ]
2332
2433
  },
2333
2434
  relatedTokens: []
2334
2435
  },
@@ -2339,7 +2440,7 @@ var uni_index_default = {
2339
2440
  summary: "",
2340
2441
  description: "",
2341
2442
  category: "forms",
2342
- version: "7.1.0",
2443
+ version: "8.0.0",
2343
2444
  bindings: {
2344
2445
  angular: {
2345
2446
  importPath: "@uni-design-system/uni-angular",
@@ -2497,7 +2598,7 @@ var uni_index_default = {
2497
2598
  summary: "",
2498
2599
  description: "",
2499
2600
  category: "layout",
2500
- version: "7.1.0",
2601
+ version: "8.0.0",
2501
2602
  bindings: {
2502
2603
  angular: {
2503
2604
  importPath: "@uni-design-system/uni-angular",
@@ -2594,7 +2695,7 @@ var uni_index_default = {
2594
2695
  summary: "",
2595
2696
  description: "",
2596
2697
  category: "layout",
2597
- version: "7.1.0",
2698
+ version: "8.0.0",
2598
2699
  bindings: {
2599
2700
  angular: {
2600
2701
  importPath: "@uni-design-system/uni-angular",
@@ -2626,7 +2727,7 @@ var uni_index_default = {
2626
2727
  summary: "",
2627
2728
  description: "",
2628
2729
  category: "primitives",
2629
- version: "7.1.0",
2730
+ version: "8.0.0",
2630
2731
  bindings: {
2631
2732
  angular: {
2632
2733
  importPath: "@uni-design-system/uni-angular",
@@ -2686,7 +2787,7 @@ var uni_index_default = {
2686
2787
  summary: "",
2687
2788
  description: "",
2688
2789
  category: "primitives",
2689
- version: "7.1.0",
2790
+ version: "8.0.0",
2690
2791
  bindings: {
2691
2792
  angular: {
2692
2793
  importPath: "@uni-design-system/uni-angular",
@@ -2789,7 +2890,7 @@ var uni_index_default = {
2789
2890
  summary: "",
2790
2891
  description: "",
2791
2892
  category: "forms",
2792
- version: "7.1.0",
2893
+ version: "8.0.0",
2793
2894
  bindings: {
2794
2895
  angular: {
2795
2896
  importPath: "@uni-design-system/uni-angular",
@@ -2934,7 +3035,7 @@ var uni_index_default = {
2934
3035
  summary: "",
2935
3036
  description: "",
2936
3037
  category: "forms",
2937
- version: "7.1.0",
3038
+ version: "8.0.0",
2938
3039
  bindings: {
2939
3040
  angular: {
2940
3041
  importPath: "@uni-design-system/uni-angular",
@@ -2993,7 +3094,7 @@ var uni_index_default = {
2993
3094
  }
2994
3095
  ],
2995
3096
  guidelines: {
2996
- whenToUse: "The Input Box is the themed shell shared by all text-like form controls\n([Input](?path=/docs/components-forms-input--docs),\n[Select](?path=/docs/components-forms-select--docs), Multi Select Dropdown). It projects any\nnative `input` or `select` element, strips the platform's default styling, and applies the\n`input` component theme options: colors, border, radius, focus outline, and the error and\ndisabled states.\nUse it directly when composing a custom form control that should match the design system's\ninput styling.",
3097
+ whenToUse: "The Input Box is the themed shell shared by all text-like form controls\n([Input](?path=/docs/components-forms-input--input),\n[Select](?path=/docs/components-forms-select--select), Multi Select Dropdown). It projects any\nnative `input` or `select` element, strips the platform's default styling, and applies the\n`input` component theme options: colors, border, radius, focus outline, and the error and\ndisabled states.\nUse it directly when composing a custom form control that should match the design system's\ninput styling.",
2997
3098
  dos: [],
2998
3099
  donts: [],
2999
3100
  accessibility: []
@@ -3007,7 +3108,7 @@ var uni_index_default = {
3007
3108
  summary: "",
3008
3109
  description: "",
3009
3110
  category: "components",
3010
- version: "7.1.0",
3111
+ version: "8.0.0",
3011
3112
  bindings: {
3012
3113
  angular: {
3013
3114
  importPath: "@uni-design-system/uni-angular",
@@ -3077,7 +3178,7 @@ var uni_index_default = {
3077
3178
  summary: "",
3078
3179
  description: "",
3079
3180
  category: "layout",
3080
- version: "7.1.0",
3181
+ version: "8.0.0",
3081
3182
  bindings: {
3082
3183
  angular: {
3083
3184
  importPath: "@uni-design-system/uni-angular",
@@ -3133,11 +3234,32 @@ var uni_index_default = {
3133
3234
  { label: 'Logout', symbolName: 'logout' },
3134
3235
  ],
3135
3236
  }
3237
+ -->`
3238
+ },
3239
+ {
3240
+ title: "Tones",
3241
+ framework: "angular",
3242
+ code: `<!-- Storybook story: Tones -->
3243
+ <div box-layout color="primary" padding="sm">
3244
+ <uni-menu \${argsToTemplate(props)}>
3245
+ <button text-button variant="ghost" symbolRight="arrow_drop_down">Menu</button>
3246
+ </uni-menu>
3247
+ </div>
3248
+ <!-- args:
3249
+ {
3250
+ menuItems: [
3251
+ { label: 'Rename', symbolName: 'edit' },
3252
+ { label: 'Duplicate', symbolName: 'content_copy' },
3253
+ { label: 'Share', symbolName: 'share', disabled: true },
3254
+ { divider: true },
3255
+ { label: 'Delete', symbolName: 'delete', variant: 'warn' },
3256
+ ],
3257
+ }
3136
3258
  -->`
3137
3259
  }
3138
3260
  ],
3139
3261
  guidelines: {
3140
- whenToUse: "Menus can be linked to any component, but it is recommended to use either the `text-button` or `icon-button` component.\nMenus are populated by creating an array of Menu Items (`MenuItem[]`) and binding it to the `Menu` component.\nActions are optional as the `Menu` component also emits the clicked menu item via the `menuItemClicked` output attribute.\n### Menu Item Interface\n```\nMenuItem {\n label: string;\n symbolName?: string;\n action?: () => void;\n}\n```",
3262
+ whenToUse: "Menus can be linked to any component, but it is recommended to use either the `text-button` or `icon-button` component.\nMenus are populated by creating an array of Menu Items (`MenuItem[]`) and binding it to the `Menu` component.\nActions are optional as the `Menu` component also emits the clicked menu item via the `menuItemClicked` output attribute.\n### Menu Item Interface\nAn item is either a labeled action, a templated action, or a divider:\n```\nMenuItem =\n | { label: string; symbolName?: string; action?: () => void;\n variant?: Variant; disabled?: boolean }\n | { template: TemplateRef<T>; context: T; symbolName?: string;\n action?: () => void; variant?: Variant; disabled?: boolean }\n | { divider: true }\n```\n- `variant` routes through the theme's `menuItem` variants \u2014 e.g. `variant: 'warn'`\n renders the item in the theme's destructive tone.\n- `disabled` items render with the disabled color and are skipped by keyboard\n navigation.\n- `{ divider: true }` renders a `role=\"separator\"` rule styled by the `menu`\n theme options.",
3141
3263
  dos: [],
3142
3264
  donts: [],
3143
3265
  accessibility: [
@@ -3145,7 +3267,13 @@ var uni_index_default = {
3145
3267
  "ArrowDown/ArrowUp on the trigger opens onto the first/last item; focus returns to the trigger on close."
3146
3268
  ]
3147
3269
  },
3148
- relatedTokens: []
3270
+ relatedTokens: [
3271
+ "menu.behavior.minWidth",
3272
+ "menu.behavior.paddingVertical",
3273
+ "menu.behavior.paddingHorizontal",
3274
+ "menu.behavior.dividerBorder",
3275
+ "menu.behavior.dividerSpacing"
3276
+ ]
3149
3277
  },
3150
3278
  {
3151
3279
  id: "menu-item",
@@ -3154,52 +3282,12 @@ var uni_index_default = {
3154
3282
  summary: "",
3155
3283
  description: "",
3156
3284
  category: "layout",
3157
- version: "7.1.0",
3285
+ version: "8.0.0",
3158
3286
  bindings: {
3159
3287
  angular: {
3160
3288
  importPath: "@uni-design-system/uni-angular",
3161
3289
  selectorOrTag: "[uni-menu-item], [menu-item]",
3162
3290
  api: [
3163
- {
3164
- name: "display",
3165
- kind: "input",
3166
- type: "OptionalDisplay",
3167
- required: false,
3168
- default: "'flex'",
3169
- description: ""
3170
- },
3171
- {
3172
- name: "flexDirection",
3173
- kind: "input",
3174
- type: "OptionalFlexDirection",
3175
- required: false,
3176
- default: "'row'",
3177
- description: ""
3178
- },
3179
- {
3180
- name: "alignItems",
3181
- kind: "input",
3182
- type: "OptionalAlignItems",
3183
- required: false,
3184
- default: "'center'",
3185
- description: ""
3186
- },
3187
- {
3188
- name: "paddingHorizontal",
3189
- kind: "input",
3190
- type: "OptionalSize",
3191
- required: false,
3192
- default: "'md'",
3193
- description: ""
3194
- },
3195
- {
3196
- name: "gap",
3197
- kind: "input",
3198
- type: "OptionalSize",
3199
- required: false,
3200
- default: "'md'",
3201
- description: ""
3202
- },
3203
3291
  {
3204
3292
  name: "label",
3205
3293
  kind: "input",
@@ -3235,13 +3323,19 @@ var uni_index_default = {
3235
3323
  required: false,
3236
3324
  description: ""
3237
3325
  },
3326
+ {
3327
+ name: "variant",
3328
+ kind: "input",
3329
+ type: "Variant | undefined",
3330
+ required: false,
3331
+ description: "Tone routed through the theme's `menuItem` variants (e.g. 'warn')."
3332
+ },
3238
3333
  {
3239
3334
  name: "hoverColor",
3240
3335
  kind: "input",
3241
- type: "ContainerColorToken",
3336
+ type: "ContainerColorToken | undefined",
3242
3337
  required: false,
3243
- default: "'primary-container'",
3244
- description: ""
3338
+ description: "Per-instance override of the theme's `menuItem.hoverColor`."
3245
3339
  },
3246
3340
  {
3247
3341
  name: "disabled",
@@ -3270,7 +3364,7 @@ var uni_index_default = {
3270
3364
  summary: "",
3271
3365
  description: "",
3272
3366
  category: "forms",
3273
- version: "7.1.0",
3367
+ version: "8.0.0",
3274
3368
  bindings: {
3275
3369
  angular: {
3276
3370
  importPath: "@uni-design-system/uni-angular",
@@ -3358,7 +3452,7 @@ var uni_index_default = {
3358
3452
  summary: "",
3359
3453
  description: "",
3360
3454
  category: "forms",
3361
- version: "7.1.0",
3455
+ version: "8.0.0",
3362
3456
  bindings: {
3363
3457
  angular: {
3364
3458
  importPath: "@uni-design-system/uni-angular",
@@ -3433,6 +3527,21 @@ var uni_index_default = {
3433
3527
  required: false,
3434
3528
  default: "''",
3435
3529
  description: ""
3530
+ },
3531
+ {
3532
+ name: "label",
3533
+ kind: "input",
3534
+ type: "string",
3535
+ required: false,
3536
+ description: 'What the field is for, e.g. "Fruits". Rendered visually hidden inside the trigger so its accessible name reads "Fruits, Apple, Pear" \u2014 without it a screen reader announces only the current selection, with no clue which field it belongs to.'
3537
+ },
3538
+ {
3539
+ name: "debounceTime",
3540
+ kind: "input",
3541
+ type: "number",
3542
+ required: false,
3543
+ default: "200",
3544
+ description: "Debounce for the filter box, matching the library's input debounce."
3436
3545
  }
3437
3546
  ]
3438
3547
  }
@@ -3493,7 +3602,7 @@ var uni_index_default = {
3493
3602
  summary: "",
3494
3603
  description: "",
3495
3604
  category: "feedback",
3496
- version: "7.1.0",
3605
+ version: "8.0.0",
3497
3606
  bindings: {
3498
3607
  angular: {
3499
3608
  importPath: "@uni-design-system/uni-angular",
@@ -3737,7 +3846,7 @@ var uni_index_default = {
3737
3846
  summary: "",
3738
3847
  description: "",
3739
3848
  category: "feedback",
3740
- version: "7.1.0",
3849
+ version: "8.0.0",
3741
3850
  bindings: {
3742
3851
  angular: {
3743
3852
  importPath: "@uni-design-system/uni-angular",
@@ -3761,7 +3870,7 @@ var uni_index_default = {
3761
3870
  summary: "",
3762
3871
  description: "",
3763
3872
  category: "data",
3764
- version: "7.1.0",
3873
+ version: "8.0.0",
3765
3874
  bindings: {
3766
3875
  angular: {
3767
3876
  importPath: "@uni-design-system/uni-angular",
@@ -3821,7 +3930,7 @@ var uni_index_default = {
3821
3930
  }
3822
3931
  ],
3823
3932
  guidelines: {
3824
- whenToUse: "The Paginator drives page navigation for any `UniDatasource`: first/previous/next/last\nbuttons, truncated page numbers, an editable page size, and a page jumper. Each section can\nbe toggled independently, so it can render as a full control bar or a minimal pager \u2014 the\n[Data Table](?path=/docs/components-data-table--docs) stories use one paginator in the header\nfor page size and another in the footer for page numbers.",
3933
+ whenToUse: "The Paginator drives page navigation for any `UniDatasource`: first/previous/next/last\nbuttons, truncated page numbers, an editable page size, and a page jumper. Each section can\nbe toggled independently, so it can render as a full control bar or a minimal pager \u2014 the\n[Data Table](?path=/docs/components-data-display-data-table--data-table) stories use one paginator in the header\nfor page size and another in the footer for page numbers.",
3825
3934
  dos: [],
3826
3935
  donts: [],
3827
3936
  accessibility: [
@@ -3846,7 +3955,7 @@ var uni_index_default = {
3846
3955
  summary: "",
3847
3956
  description: "",
3848
3957
  category: "layout",
3849
- version: "7.1.0",
3958
+ version: "8.0.0",
3850
3959
  bindings: {
3851
3960
  angular: {
3852
3961
  importPath: "@uni-design-system/uni-angular",
@@ -3895,7 +4004,7 @@ var uni_index_default = {
3895
4004
  summary: "",
3896
4005
  description: "",
3897
4006
  category: "feedback",
3898
- version: "7.1.0",
4007
+ version: "8.0.0",
3899
4008
  bindings: {
3900
4009
  angular: {
3901
4010
  importPath: "@uni-design-system/uni-angular",
@@ -3959,7 +4068,7 @@ var uni_index_default = {
3959
4068
  summary: "",
3960
4069
  description: "",
3961
4070
  category: "feedback",
3962
- version: "7.1.0",
4071
+ version: "8.0.0",
3963
4072
  bindings: {
3964
4073
  angular: {
3965
4074
  importPath: "@uni-design-system/uni-angular",
@@ -4015,7 +4124,7 @@ var uni_index_default = {
4015
4124
  summary: "",
4016
4125
  description: "",
4017
4126
  category: "forms",
4018
- version: "7.1.0",
4127
+ version: "8.0.0",
4019
4128
  bindings: {
4020
4129
  angular: {
4021
4130
  importPath: "@uni-design-system/uni-angular",
@@ -4166,7 +4275,7 @@ var uni_index_default = {
4166
4275
  summary: "",
4167
4276
  description: "",
4168
4277
  category: "directives",
4169
- version: "7.1.0",
4278
+ version: "8.0.0",
4170
4279
  bindings: {
4171
4280
  angular: {
4172
4281
  importPath: "@uni-design-system/uni-angular",
@@ -4190,7 +4299,7 @@ var uni_index_default = {
4190
4299
  summary: "",
4191
4300
  description: "",
4192
4301
  category: "layout",
4193
- version: "7.1.0",
4302
+ version: "8.0.0",
4194
4303
  bindings: {
4195
4304
  angular: {
4196
4305
  importPath: "@uni-design-system/uni-angular",
@@ -4245,7 +4354,7 @@ var uni_index_default = {
4245
4354
  summary: "",
4246
4355
  description: "",
4247
4356
  category: "layout",
4248
- version: "7.1.0",
4357
+ version: "8.0.0",
4249
4358
  bindings: {
4250
4359
  angular: {
4251
4360
  importPath: "@uni-design-system/uni-angular",
@@ -4392,7 +4501,7 @@ var uni_index_default = {
4392
4501
  summary: "",
4393
4502
  description: "",
4394
4503
  category: "forms",
4395
- version: "7.1.0",
4504
+ version: "8.0.0",
4396
4505
  bindings: {
4397
4506
  angular: {
4398
4507
  importPath: "@uni-design-system/uni-angular",
@@ -4503,7 +4612,7 @@ var uni_index_default = {
4503
4612
  summary: "",
4504
4613
  description: "",
4505
4614
  category: "forms",
4506
- version: "7.1.0",
4615
+ version: "8.0.0",
4507
4616
  bindings: {
4508
4617
  angular: {
4509
4618
  importPath: "@uni-design-system/uni-angular",
@@ -4639,7 +4748,7 @@ var uni_index_default = {
4639
4748
  summary: "",
4640
4749
  description: "",
4641
4750
  category: "components",
4642
- version: "7.1.0",
4751
+ version: "8.0.0",
4643
4752
  bindings: {
4644
4753
  angular: {
4645
4754
  importPath: "@uni-design-system/uni-angular",
@@ -4735,7 +4844,7 @@ var uni_index_default = {
4735
4844
  summary: "",
4736
4845
  description: "",
4737
4846
  category: "forms",
4738
- version: "7.1.0",
4847
+ version: "8.0.0",
4739
4848
  bindings: {
4740
4849
  angular: {
4741
4850
  importPath: "@uni-design-system/uni-angular",
@@ -4872,7 +4981,7 @@ var uni_index_default = {
4872
4981
  summary: "",
4873
4982
  description: "",
4874
4983
  category: "feedback",
4875
- version: "7.1.0",
4984
+ version: "8.0.0",
4876
4985
  bindings: {
4877
4986
  angular: {
4878
4987
  importPath: "@uni-design-system/uni-angular",
@@ -4964,7 +5073,7 @@ var uni_index_default = {
4964
5073
  summary: "",
4965
5074
  description: "",
4966
5075
  category: "data",
4967
- version: "7.1.0",
5076
+ version: "8.0.0",
4968
5077
  bindings: {
4969
5078
  angular: {
4970
5079
  importPath: "@uni-design-system/uni-angular",
@@ -5009,7 +5118,7 @@ var uni_index_default = {
5009
5118
  }
5010
5119
  ],
5011
5120
  guidelines: {
5012
- whenToUse: "The Sort Header wraps a column heading and cycles the bound datasource's sort state\n(ascending \u2192 descending \u2192 unsorted) when clicked. An animated arrow indicates the current\nsort direction. It is used by the [Data Table](?path=/docs/components-data-table--docs)\nfor sortable columns, but can wrap any header content bound to a `UniDatasource`.",
5121
+ whenToUse: "The Sort Header wraps a column heading and cycles the bound datasource's sort state\n(ascending \u2192 descending \u2192 unsorted) when clicked. An animated arrow indicates the current\nsort direction. It is used by the [Data Table](?path=/docs/components-data-display-data-table--data-table)\nfor sortable columns, but can wrap any header content bound to a `UniDatasource`.",
5013
5122
  dos: [],
5014
5123
  donts: [],
5015
5124
  accessibility: []
@@ -5023,7 +5132,7 @@ var uni_index_default = {
5023
5132
  summary: "",
5024
5133
  description: "",
5025
5134
  category: "layout",
5026
- version: "7.1.0",
5135
+ version: "8.0.0",
5027
5136
  bindings: {
5028
5137
  angular: {
5029
5138
  importPath: "@uni-design-system/uni-angular",
@@ -5078,7 +5187,7 @@ var uni_index_default = {
5078
5187
  summary: "",
5079
5188
  description: "",
5080
5189
  category: "components",
5081
- version: "7.1.0",
5190
+ version: "8.0.0",
5082
5191
  bindings: {
5083
5192
  angular: {
5084
5193
  importPath: "@uni-design-system/uni-angular",
@@ -5180,7 +5289,7 @@ var uni_index_default = {
5180
5289
  summary: "",
5181
5290
  description: "",
5182
5291
  category: "primitives",
5183
- version: "7.1.0",
5292
+ version: "8.0.0",
5184
5293
  bindings: {
5185
5294
  angular: {
5186
5295
  importPath: "@uni-design-system/uni-angular",
@@ -5253,7 +5362,7 @@ var uni_index_default = {
5253
5362
  summary: "",
5254
5363
  description: "",
5255
5364
  category: "components",
5256
- version: "7.1.0",
5365
+ version: "8.0.0",
5257
5366
  bindings: {
5258
5367
  angular: {
5259
5368
  importPath: "@uni-design-system/uni-angular",
@@ -5293,7 +5402,7 @@ var uni_index_default = {
5293
5402
  summary: "",
5294
5403
  description: "",
5295
5404
  category: "components",
5296
- version: "7.1.0",
5405
+ version: "8.0.0",
5297
5406
  bindings: {
5298
5407
  angular: {
5299
5408
  importPath: "@uni-design-system/uni-angular",
@@ -5357,12 +5466,28 @@ var uni_index_default = {
5357
5466
  summary: "",
5358
5467
  description: "",
5359
5468
  category: "data",
5360
- version: "7.1.0",
5469
+ version: "8.0.0",
5361
5470
  bindings: {
5362
5471
  angular: {
5363
5472
  importPath: "@uni-design-system/uni-angular",
5364
5473
  selectorOrTag: "uni-tag",
5365
5474
  api: [
5475
+ {
5476
+ name: "size",
5477
+ kind: "input",
5478
+ type: "Size",
5479
+ required: false,
5480
+ default: "'md'",
5481
+ description: ""
5482
+ },
5483
+ {
5484
+ name: "tone",
5485
+ kind: "input",
5486
+ type: "TagTone",
5487
+ required: false,
5488
+ default: "'soft'",
5489
+ description: ""
5490
+ },
5366
5491
  {
5367
5492
  name: "label",
5368
5493
  kind: "input",
@@ -5378,120 +5503,716 @@ var uni_index_default = {
5378
5503
  description: ""
5379
5504
  },
5380
5505
  {
5381
- name: "close",
5382
- kind: "output",
5506
+ name: "maxWidth",
5507
+ kind: "input",
5383
5508
  type: "string | number",
5384
5509
  required: false,
5510
+ description: "Truncation budget, e.g. `'14ch'`. A number is treated as px."
5511
+ },
5512
+ {
5513
+ name: "avatarSrc",
5514
+ kind: "input",
5515
+ type: "string",
5516
+ required: false,
5385
5517
  description: ""
5386
- }
5387
- ]
5388
- }
5389
- },
5390
- examples: [
5391
- {
5392
- title: "Primary",
5393
- framework: "angular",
5394
- code: "<!-- Storybook story: Primary -->\n<!-- args:\n{\n label: 'Primary Tag',\n value: '1',\n }\n-->"
5395
- },
5396
- {
5397
- title: "Numeric Value",
5398
- framework: "angular",
5399
- code: "<!-- Storybook story: Numeric Value -->\n<!-- args:\n{\n label: 'Numeric Tag',\n value: 42,\n }\n-->"
5400
- },
5401
- {
5402
- title: "Long Label",
5403
- framework: "angular",
5404
- code: "<!-- Storybook story: Long Label -->\n<!-- args:\n{\n label: 'This is a very long tag label that might need truncation',\n value: 'long',\n }\n-->"
5405
- },
5406
- {
5407
- title: "Without Value",
5408
- framework: "angular",
5409
- code: "<!-- Storybook story: Without Value -->\n<!-- args:\n{\n label: 'Tag without value',\n }\n-->"
5410
- }
5411
- ],
5412
- guidelines: {
5413
- whenToUse: "Compact label for classifying content \u2014 categories, states, filters. Tags are\ndisplay-only chips that wear the active variant's colors; for removable,\ntype-to-add chips (a future input variant), see the roadmap.",
5414
- dos: [],
5415
- donts: [],
5416
- accessibility: []
5417
- },
5418
- relatedTokens: []
5419
- },
5420
- {
5421
- id: "text",
5422
- name: "Text",
5423
- status: "stable",
5424
- summary: "",
5425
- description: "",
5426
- category: "primitives",
5427
- version: "7.1.0",
5428
- bindings: {
5429
- angular: {
5430
- importPath: "@uni-design-system/uni-angular",
5431
- selectorOrTag: "[uni-text]",
5432
- api: [
5518
+ },
5433
5519
  {
5434
- name: "uniText",
5520
+ name: "avatarName",
5435
5521
  kind: "input",
5436
- type: "Typeface | ''",
5522
+ type: "string",
5437
5523
  required: false,
5438
- default: "'', { alias: 'uni-text' }",
5439
- description: 'Typeface via the selector attribute: `uni-text="headline-large"`.'
5524
+ description: "Initials fallback when `avatarSrc` is absent or fails to load."
5440
5525
  },
5441
5526
  {
5442
- name: "typeface",
5527
+ name: "iconName",
5443
5528
  kind: "input",
5444
- type: "Typeface | undefined",
5529
+ type: "IconName",
5445
5530
  required: false,
5446
- default: "undefined",
5447
- description: "Explicit typeface; the attribute value wins when both are set."
5531
+ description: "Theme icon primitive \u2014 the preferred glyph path."
5448
5532
  },
5449
5533
  {
5450
- name: "color",
5534
+ name: "symbolName",
5451
5535
  kind: "input",
5452
- type: "ColorKey",
5536
+ type: "string",
5453
5537
  required: false,
5454
- description: ""
5538
+ description: "Material Symbols ligature, for glyphs the theme's icon set doesn't carry."
5455
5539
  },
5456
5540
  {
5457
- name: "display",
5541
+ name: "dot",
5458
5542
  kind: "input",
5459
- type: "OptionalDisplay",
5543
+ type: "boolean",
5460
5544
  required: false,
5461
- description: ""
5545
+ default: "false",
5546
+ description: "Status dot in the current colour."
5462
5547
  },
5463
5548
  {
5464
- name: "align",
5549
+ name: "removable",
5465
5550
  kind: "input",
5466
- type: "OptionalTextAlign",
5551
+ type: "boolean",
5467
5552
  required: false,
5553
+ default: "false",
5468
5554
  description: ""
5469
5555
  },
5470
5556
  {
5471
- name: "nowrap",
5557
+ name: "interactive",
5472
5558
  kind: "input",
5473
5559
  type: "boolean",
5474
5560
  required: false,
5561
+ default: "false",
5475
5562
  description: ""
5476
5563
  },
5477
5564
  {
5478
- name: "maxWidth",
5565
+ name: "selected",
5479
5566
  kind: "input",
5480
- type: "number",
5567
+ type: "boolean | undefined",
5568
+ required: false,
5569
+ default: "undefined",
5570
+ description: 'Toggle state. Left undefined the chip carries no `aria-pressed` at all \u2014 an interactive chip is not always a toggle (inside a tag input it is focusable so it can be removed), and announcing "not pressed" on a recipient chip is worse than announcing nothing.'
5571
+ },
5572
+ {
5573
+ name: "invalid",
5574
+ kind: "input",
5575
+ type: "boolean",
5481
5576
  required: false,
5577
+ default: "false",
5482
5578
  description: ""
5483
5579
  },
5484
5580
  {
5485
- name: "ellipsis",
5581
+ name: "disabled",
5486
5582
  kind: "input",
5487
5583
  type: "boolean",
5488
5584
  required: false,
5489
5585
  default: "false",
5490
5586
  description: ""
5491
- }
5492
- ]
5493
- }
5494
- },
5587
+ },
5588
+ {
5589
+ name: "removeLabel",
5590
+ kind: "input",
5591
+ type: "string",
5592
+ required: false,
5593
+ description: "Accessible-name override for the remove button."
5594
+ },
5595
+ {
5596
+ name: "controlTabIndex",
5597
+ kind: "input",
5598
+ type: "number",
5599
+ required: false,
5600
+ default: "0",
5601
+ description: "Tab position of the chip's controls. A composite that owns its own roving focus \u2014 `uni-tag-input`, where the whole field is one tab stop \u2014 passes `-1` so Tab does not walk through every chip to reach the next control."
5602
+ },
5603
+ {
5604
+ name: "removed",
5605
+ kind: "output",
5606
+ type: "UniTagValue",
5607
+ required: false,
5608
+ description: ""
5609
+ },
5610
+ {
5611
+ name: "activated",
5612
+ kind: "output",
5613
+ type: "UniTagValue",
5614
+ required: false,
5615
+ description: ""
5616
+ }
5617
+ ]
5618
+ }
5619
+ },
5620
+ examples: [
5621
+ {
5622
+ title: "Primary",
5623
+ framework: "angular",
5624
+ code: `<!-- Storybook story: Primary -->
5625
+ <div box-layout gap="sm">
5626
+ @for (tone of ['soft', 'solid', 'outline']; track tone) {
5627
+ <div row-layout gap="sm" alignItems="center" style="margin-bottom:8px">
5628
+ @for (variant of ['primary', 'secondary', 'tertiary', 'warn', 'success', 'ghost']; track variant) {
5629
+ <uni-tag [variant]="variant" [tone]="tone" [label]="variant" />
5630
+ }
5631
+ </div>
5632
+ }
5633
+ </div>
5634
+ <!-- args:
5635
+ { removable: true }
5636
+ -->`
5637
+ },
5638
+ {
5639
+ title: "Variants And Tones",
5640
+ framework: "angular",
5641
+ code: `<!-- Storybook story: Variants And Tones -->
5642
+ <div box-layout gap="sm">
5643
+ @for (tone of ['soft', 'solid', 'outline']; track tone) {
5644
+ <div row-layout gap="sm" alignItems="center" style="margin-bottom:8px">
5645
+ @for (variant of ['primary', 'secondary', 'tertiary', 'warn', 'success', 'ghost']; track variant) {
5646
+ <uni-tag [variant]="variant" [tone]="tone" [label]="variant" />
5647
+ }
5648
+ </div>
5649
+ }
5650
+ </div>
5651
+ <!-- args:
5652
+ { removable: true }
5653
+ -->`
5654
+ },
5655
+ {
5656
+ title: "Sizes",
5657
+ framework: "angular",
5658
+ code: `<!-- Storybook story: Sizes -->
5659
+ <div box-layout gap="sm">
5660
+ @for (tone of ['soft', 'solid', 'outline']; track tone) {
5661
+ <div row-layout gap="sm" alignItems="center" style="margin-bottom:8px">
5662
+ @for (variant of ['primary', 'secondary', 'tertiary', 'warn', 'success', 'ghost']; track variant) {
5663
+ <uni-tag [variant]="variant" [tone]="tone" [label]="variant" />
5664
+ }
5665
+ </div>
5666
+ }
5667
+ </div>
5668
+ <!-- args:
5669
+ { removable: true }
5670
+ -->`
5671
+ },
5672
+ {
5673
+ title: "Removable",
5674
+ framework: "angular",
5675
+ code: `<!-- Storybook story: Removable -->
5676
+ <div box-layout gap="sm">
5677
+ @for (tone of ['soft', 'solid', 'outline']; track tone) {
5678
+ <div row-layout gap="sm" alignItems="center" style="margin-bottom:8px">
5679
+ @for (variant of ['primary', 'secondary', 'tertiary', 'warn', 'success', 'ghost']; track variant) {
5680
+ <uni-tag [variant]="variant" [tone]="tone" [label]="variant" />
5681
+ }
5682
+ </div>
5683
+ }
5684
+ </div>
5685
+ <!-- args:
5686
+ { removable: true }
5687
+ -->`
5688
+ },
5689
+ {
5690
+ title: "Interactive",
5691
+ framework: "angular",
5692
+ code: `<!-- Storybook story: Interactive -->
5693
+ <div box-layout gap="sm">
5694
+ @for (tone of ['soft', 'solid', 'outline']; track tone) {
5695
+ <div row-layout gap="sm" alignItems="center" style="margin-bottom:8px">
5696
+ @for (variant of ['primary', 'secondary', 'tertiary', 'warn', 'success', 'ghost']; track variant) {
5697
+ <uni-tag [variant]="variant" [tone]="tone" [label]="variant" />
5698
+ }
5699
+ </div>
5700
+ }
5701
+ </div>
5702
+ <!-- args:
5703
+ { interactive: true, removable: true, selected: false }
5704
+ -->`
5705
+ },
5706
+ {
5707
+ title: "Selected",
5708
+ framework: "angular",
5709
+ code: `<!-- Storybook story: Selected -->
5710
+ <div box-layout gap="sm">
5711
+ @for (tone of ['soft', 'solid', 'outline']; track tone) {
5712
+ <div row-layout gap="sm" alignItems="center" style="margin-bottom:8px">
5713
+ @for (variant of ['primary', 'secondary', 'tertiary', 'warn', 'success', 'ghost']; track variant) {
5714
+ <uni-tag [variant]="variant" [tone]="tone" [label]="variant" />
5715
+ }
5716
+ </div>
5717
+ }
5718
+ </div>
5719
+ <!-- args:
5720
+ { interactive: true, selected: true, tone: 'solid' }
5721
+ -->`
5722
+ },
5723
+ {
5724
+ title: "Lead Elements",
5725
+ framework: "angular",
5726
+ code: `<!-- Storybook story: Lead Elements -->
5727
+ <div box-layout gap="sm">
5728
+ @for (tone of ['soft', 'solid', 'outline']; track tone) {
5729
+ <div row-layout gap="sm" alignItems="center" style="margin-bottom:8px">
5730
+ @for (variant of ['primary', 'secondary', 'tertiary', 'warn', 'success', 'ghost']; track variant) {
5731
+ <uni-tag [variant]="variant" [tone]="tone" [label]="variant" />
5732
+ }
5733
+ </div>
5734
+ }
5735
+ </div>
5736
+ <!-- args:
5737
+ { label: 'nope@@x', invalid: true, removable: true, variant: 'warn' }
5738
+ -->`
5739
+ },
5740
+ {
5741
+ title: "Invalid",
5742
+ framework: "angular",
5743
+ code: `<!-- Storybook story: Invalid -->
5744
+ <div box-layout gap="sm">
5745
+ @for (tone of ['soft', 'solid', 'outline']; track tone) {
5746
+ <div row-layout gap="sm" alignItems="center" style="margin-bottom:8px">
5747
+ @for (variant of ['primary', 'secondary', 'tertiary', 'warn', 'success', 'ghost']; track variant) {
5748
+ <uni-tag [variant]="variant" [tone]="tone" [label]="variant" />
5749
+ }
5750
+ </div>
5751
+ }
5752
+ </div>
5753
+ <!-- args:
5754
+ { label: 'nope@@x', invalid: true, removable: true, variant: 'warn' }
5755
+ -->`
5756
+ },
5757
+ {
5758
+ title: "Disabled",
5759
+ framework: "angular",
5760
+ code: `<!-- Storybook story: Disabled -->
5761
+ <div box-layout gap="sm">
5762
+ @for (tone of ['soft', 'solid', 'outline']; track tone) {
5763
+ <div row-layout gap="sm" alignItems="center" style="margin-bottom:8px">
5764
+ @for (variant of ['primary', 'secondary', 'tertiary', 'warn', 'success', 'ghost']; track variant) {
5765
+ <uni-tag [variant]="variant" [tone]="tone" [label]="variant" />
5766
+ }
5767
+ </div>
5768
+ }
5769
+ </div>
5770
+ <!-- args:
5771
+ { label: 'Locked', disabled: true, removable: true }
5772
+ -->`
5773
+ },
5774
+ {
5775
+ title: "Truncated",
5776
+ framework: "angular",
5777
+ code: `<!-- Storybook story: Truncated -->
5778
+ <div box-layout gap="sm">
5779
+ @for (tone of ['soft', 'solid', 'outline']; track tone) {
5780
+ <div row-layout gap="sm" alignItems="center" style="margin-bottom:8px">
5781
+ @for (variant of ['primary', 'secondary', 'tertiary', 'warn', 'success', 'ghost']; track variant) {
5782
+ <uni-tag [variant]="variant" [tone]="tone" [label]="variant" />
5783
+ }
5784
+ </div>
5785
+ }
5786
+ </div>
5787
+ <!-- args:
5788
+ {
5789
+ label: 'A very long tag label that has to be truncated somewhere',
5790
+ maxWidth: '18ch',
5791
+ removable: true,
5792
+ }
5793
+ -->`
5794
+ }
5795
+ ],
5796
+ guidelines: {
5797
+ whenToUse: "Compact chip for categories, states, filters and tokens. Two orthogonal style\naxes: **`variant`** picks the colour role and **`tone`** picks the archetype\n(`soft`, `solid`, `outline`). Both resolve from the theme's `tag` entry, so a\ntheme restyles every chip in the app without touching markup.",
5798
+ dos: [
5799
+ "Use `variant` for meaning (a `warn` chip for a problem) and `tone` for emphasis.",
5800
+ "Give `removable` chips a `value` so the handler knows which one to drop.",
5801
+ "Set `maxWidth` when user-supplied text could be arbitrarily long."
5802
+ ],
5803
+ donts: [
5804
+ "Don't make a whole chip clickable *and* nest the remove control inside it \u2014",
5805
+ "Don't rely on chip colour alone to convey state.",
5806
+ "Don't put a remove control on a chip that is purely a label."
5807
+ ],
5808
+ accessibility: [
5809
+ "A static tag is **text, not a widget**: no role, no tab stop. Screen readers",
5810
+ "`removable` adds one real `<button>` named `Remove {label}`, overridable with",
5811
+ '`interactive` makes the body a `<button type="button">`; `selected` maps to',
5812
+ "Icons, avatars, initials and dots are `aria-hidden` \u2014 the chip's text is its",
5813
+ "`invalid` sets `aria-invalid` and adds a non-colour cue."
5814
+ ]
5815
+ },
5816
+ relatedTokens: [
5817
+ "tag.behavior.borderRadius",
5818
+ "tag.behavior.typeface",
5819
+ "tag.behavior.gap",
5820
+ "tag.behavior.removeIcon",
5821
+ "tag.behavior.selectedIcon"
5822
+ ]
5823
+ },
5824
+ {
5825
+ id: "tag-input",
5826
+ name: "TagInput",
5827
+ status: "stable",
5828
+ summary: "",
5829
+ description: "",
5830
+ category: "forms",
5831
+ version: "8.0.0",
5832
+ bindings: {
5833
+ angular: {
5834
+ importPath: "@uni-design-system/uni-angular",
5835
+ selectorOrTag: "uni-tag-input",
5836
+ api: [
5837
+ {
5838
+ name: "value",
5839
+ kind: "model",
5840
+ type: "UniTagItem[]",
5841
+ required: false,
5842
+ default: "[]",
5843
+ description: ""
5844
+ },
5845
+ {
5846
+ name: "disabled",
5847
+ kind: "input",
5848
+ type: "boolean",
5849
+ required: false,
5850
+ default: "false",
5851
+ description: ""
5852
+ },
5853
+ {
5854
+ name: "touched",
5855
+ kind: "model",
5856
+ type: "boolean",
5857
+ required: false,
5858
+ default: "false",
5859
+ description: ""
5860
+ },
5861
+ {
5862
+ name: "invalid",
5863
+ kind: "input",
5864
+ type: "boolean",
5865
+ required: false,
5866
+ default: "false",
5867
+ description: ""
5868
+ },
5869
+ {
5870
+ name: "dirty",
5871
+ kind: "input",
5872
+ type: "boolean",
5873
+ required: false,
5874
+ default: "false",
5875
+ description: ""
5876
+ },
5877
+ {
5878
+ name: "required",
5879
+ kind: "input",
5880
+ type: "boolean",
5881
+ required: false,
5882
+ default: "false",
5883
+ description: ""
5884
+ },
5885
+ {
5886
+ name: "ariaDescribedBy",
5887
+ kind: "input",
5888
+ type: "string",
5889
+ required: false,
5890
+ description: ""
5891
+ },
5892
+ {
5893
+ name: "label",
5894
+ kind: "input",
5895
+ type: "string",
5896
+ required: true,
5897
+ description: 'Accessible name for the field, e.g. "To".'
5898
+ },
5899
+ {
5900
+ name: "placeholder",
5901
+ kind: "input",
5902
+ type: "string",
5903
+ required: false,
5904
+ description: ""
5905
+ },
5906
+ {
5907
+ name: "preset",
5908
+ kind: "input",
5909
+ type: "'text' | 'email'",
5910
+ required: false,
5911
+ default: "'text'",
5912
+ description: "`email` wires an address validator, paste parser and space separator."
5913
+ },
5914
+ {
5915
+ name: "separators",
5916
+ kind: "input",
5917
+ type: "string[]",
5918
+ required: false,
5919
+ default: "[',', ';']",
5920
+ description: ""
5921
+ },
5922
+ {
5923
+ name: "commitOnBlur",
5924
+ kind: "input",
5925
+ type: "boolean",
5926
+ required: false,
5927
+ default: "true",
5928
+ description: ""
5929
+ },
5930
+ {
5931
+ name: "allowDuplicates",
5932
+ kind: "input",
5933
+ type: "boolean",
5934
+ required: false,
5935
+ default: "false",
5936
+ description: ""
5937
+ },
5938
+ {
5939
+ name: "max",
5940
+ kind: "input",
5941
+ type: "number",
5942
+ required: false,
5943
+ description: ""
5944
+ },
5945
+ {
5946
+ name: "tagVariant",
5947
+ kind: "input",
5948
+ type: "Variant",
5949
+ required: false,
5950
+ default: "'primary'",
5951
+ description: ""
5952
+ },
5953
+ {
5954
+ name: "tagTone",
5955
+ kind: "input",
5956
+ type: "TagTone",
5957
+ required: false,
5958
+ default: "'soft'",
5959
+ description: ""
5960
+ },
5961
+ {
5962
+ name: "tagSize",
5963
+ kind: "input",
5964
+ type: "Size",
5965
+ required: false,
5966
+ description: ""
5967
+ },
5968
+ {
5969
+ name: "suggestions",
5970
+ kind: "input",
5971
+ type: "UniTagSuggestion[]",
5972
+ required: false,
5973
+ default: "[]",
5974
+ description: ""
5975
+ },
5976
+ {
5977
+ name: "query",
5978
+ kind: "output",
5979
+ type: "string",
5980
+ required: false,
5981
+ description: "Debounced text the app should filter `suggestions` from."
5982
+ },
5983
+ {
5984
+ name: "debounceTime",
5985
+ kind: "input",
5986
+ type: "number",
5987
+ required: false,
5988
+ default: "250",
5989
+ description: ""
5990
+ },
5991
+ {
5992
+ name: "added",
5993
+ kind: "output",
5994
+ type: "UniTagItem",
5995
+ required: false,
5996
+ description: ""
5997
+ },
5998
+ {
5999
+ name: "removed",
6000
+ kind: "output",
6001
+ type: "UniTagItem",
6002
+ required: false,
6003
+ description: ""
6004
+ },
6005
+ {
6006
+ name: "rejected",
6007
+ kind: "output",
6008
+ type: "UniTagRejection",
6009
+ required: false,
6010
+ description: ""
6011
+ }
6012
+ ]
6013
+ }
6014
+ },
6015
+ examples: [
6016
+ {
6017
+ title: "Primary",
6018
+ framework: "angular",
6019
+ code: `<!-- Storybook story: Primary -->
6020
+ <uni-tag-input
6021
+ label="To"
6022
+ preset="email"
6023
+ placeholder="Name or address\u2026"
6024
+ [value]="value"
6025
+ [suggestions]="suggestions"
6026
+ (query)="onQuery($event)"
6027
+ />
6028
+ <!-- args:
6029
+ { value: [{ value: 'alice@uni.dev', label: 'Alice Chen' }] }
6030
+ -->`
6031
+ },
6032
+ {
6033
+ title: "Email Recipients",
6034
+ framework: "angular",
6035
+ code: `<!-- Storybook story: Email Recipients -->
6036
+ <uni-tag-input
6037
+ label="To"
6038
+ preset="email"
6039
+ placeholder="Name or address\u2026"
6040
+ [value]="value"
6041
+ [suggestions]="suggestions"
6042
+ (query)="onQuery($event)"
6043
+ />
6044
+ <!-- args:
6045
+ { value: [{ value: 'alice@uni.dev', label: 'Alice Chen' }] }
6046
+ -->`
6047
+ },
6048
+ {
6049
+ title: "Invalid Entry",
6050
+ framework: "angular",
6051
+ code: `<!-- Storybook story: Invalid Entry -->
6052
+ <uni-tag-input
6053
+ label="To"
6054
+ preset="email"
6055
+ placeholder="Name or address\u2026"
6056
+ [value]="value"
6057
+ [suggestions]="suggestions"
6058
+ (query)="onQuery($event)"
6059
+ />
6060
+ <!-- args:
6061
+ {
6062
+ preset: 'email',
6063
+ value: [
6064
+ { value: 'alice@uni.dev', label: 'Alice Chen' },
6065
+ { value: 'nope@@x', invalid: true },
6066
+ ],
6067
+ }
6068
+ -->`
6069
+ },
6070
+ {
6071
+ title: "Locked Entry",
6072
+ framework: "angular",
6073
+ code: `<!-- Storybook story: Locked Entry -->
6074
+ <uni-tag-input
6075
+ label="To"
6076
+ preset="email"
6077
+ placeholder="Name or address\u2026"
6078
+ [value]="value"
6079
+ [suggestions]="suggestions"
6080
+ (query)="onQuery($event)"
6081
+ />
6082
+ <!-- args:
6083
+ {
6084
+ value: [
6085
+ { value: 'owner@uni.dev', label: 'Thread owner', disabled: true },
6086
+ { value: 'bob@uni.dev', label: 'Bob Ferrari' },
6087
+ ],
6088
+ }
6089
+ -->`
6090
+ },
6091
+ {
6092
+ title: "With Maximum",
6093
+ framework: "angular",
6094
+ code: `<!-- Storybook story: With Maximum -->
6095
+ <uni-tag-input
6096
+ label="To"
6097
+ preset="email"
6098
+ placeholder="Name or address\u2026"
6099
+ [value]="value"
6100
+ [suggestions]="suggestions"
6101
+ (query)="onQuery($event)"
6102
+ />
6103
+ <!-- args:
6104
+ { max: 3, value: [{ value: 'alpha' }, { value: 'beta' }] }
6105
+ -->`
6106
+ },
6107
+ {
6108
+ title: "Disabled",
6109
+ framework: "angular",
6110
+ code: `<!-- Storybook story: Disabled -->
6111
+ <uni-tag-input
6112
+ label="To"
6113
+ preset="email"
6114
+ placeholder="Name or address\u2026"
6115
+ [value]="value"
6116
+ [suggestions]="suggestions"
6117
+ (query)="onQuery($event)"
6118
+ />
6119
+ <!-- args:
6120
+ { disabled: true, value: [{ value: 'alpha' }, { value: 'beta' }] }
6121
+ -->`
6122
+ }
6123
+ ],
6124
+ guidelines: {
6125
+ whenToUse: "Type-to-add chip field: recipients, filters, labels. It is the **open-set**\ncontrol \u2014 anything the user types can become a token, whether or not it matches\na suggestion. For picking from a fixed list, use `uni-select` or\n`uni-multi-select-dropdown` instead.",
6126
+ dos: [],
6127
+ donts: [
6128
+ "Don't use it to pick from a closed list \u2014 that is `uni-multi-select-dropdown`.",
6129
+ "Don't filter `suggestions` inside the component; drive them from `(query)`.",
6130
+ "Don't set `preset=\"email\"` for people's names: Space would split them."
6131
+ ],
6132
+ accessibility: [
6133
+ 'The text input is `role="combobox"` with `aria-expanded`, `aria-controls` and',
6134
+ 'Every add, remove and rejection announces through a `role="status"` live',
6135
+ "The removal route is described **once** for the field through",
6136
+ "`aria-invalid` is gated on `invalid && (touched || dirty)`, per the library's"
6137
+ ]
6138
+ },
6139
+ relatedTokens: []
6140
+ },
6141
+ {
6142
+ id: "text",
6143
+ name: "Text",
6144
+ status: "stable",
6145
+ summary: "",
6146
+ description: "",
6147
+ category: "primitives",
6148
+ version: "8.0.0",
6149
+ bindings: {
6150
+ angular: {
6151
+ importPath: "@uni-design-system/uni-angular",
6152
+ selectorOrTag: "[uni-text]",
6153
+ api: [
6154
+ {
6155
+ name: "uniText",
6156
+ kind: "input",
6157
+ type: "Typeface | ''",
6158
+ required: false,
6159
+ default: "'', { alias: 'uni-text' }",
6160
+ description: 'Typeface via the selector attribute: `uni-text="headline-large"`.'
6161
+ },
6162
+ {
6163
+ name: "typeface",
6164
+ kind: "input",
6165
+ type: "Typeface | undefined",
6166
+ required: false,
6167
+ default: "undefined",
6168
+ description: "Explicit typeface; the attribute value wins when both are set."
6169
+ },
6170
+ {
6171
+ name: "color",
6172
+ kind: "input",
6173
+ type: "ColorKey",
6174
+ required: false,
6175
+ description: ""
6176
+ },
6177
+ {
6178
+ name: "display",
6179
+ kind: "input",
6180
+ type: "OptionalDisplay",
6181
+ required: false,
6182
+ description: ""
6183
+ },
6184
+ {
6185
+ name: "align",
6186
+ kind: "input",
6187
+ type: "OptionalTextAlign",
6188
+ required: false,
6189
+ description: ""
6190
+ },
6191
+ {
6192
+ name: "nowrap",
6193
+ kind: "input",
6194
+ type: "boolean",
6195
+ required: false,
6196
+ description: ""
6197
+ },
6198
+ {
6199
+ name: "maxWidth",
6200
+ kind: "input",
6201
+ type: "number",
6202
+ required: false,
6203
+ description: ""
6204
+ },
6205
+ {
6206
+ name: "ellipsis",
6207
+ kind: "input",
6208
+ type: "boolean",
6209
+ required: false,
6210
+ default: "false",
6211
+ description: ""
6212
+ }
6213
+ ]
6214
+ }
6215
+ },
5495
6216
  examples: [
5496
6217
  {
5497
6218
  title: "Value shorthand",
@@ -5526,7 +6247,7 @@ var uni_index_default = {
5526
6247
  summary: "",
5527
6248
  description: "",
5528
6249
  category: "primitives",
5529
- version: "7.1.0",
6250
+ version: "8.0.0",
5530
6251
  bindings: {
5531
6252
  angular: {
5532
6253
  importPath: "@uni-design-system/uni-angular",
@@ -5656,7 +6377,7 @@ var uni_index_default = {
5656
6377
  summary: "",
5657
6378
  description: "",
5658
6379
  category: "primitives",
5659
- version: "7.1.0",
6380
+ version: "8.0.0",
5660
6381
  bindings: {
5661
6382
  angular: {
5662
6383
  importPath: "@uni-design-system/uni-angular",
@@ -5686,7 +6407,7 @@ var uni_index_default = {
5686
6407
  summary: "",
5687
6408
  description: "",
5688
6409
  category: "components",
5689
- version: "7.1.0",
6410
+ version: "8.0.0",
5690
6411
  bindings: {
5691
6412
  angular: {
5692
6413
  importPath: "@uni-design-system/uni-angular",
@@ -5720,12 +6441,12 @@ var uni_index_default = {
5720
6441
  guidelines: {
5721
6442
  whenToUse: "Drop-in switcher for every theme registered via `UNI_THEMES`. Renders a `uni-select` over\n`ThemeService.themeOptions` and applies the choice through `ThemeService.selectTheme`, so the\nselection persists across reloads exactly like any other theme change. Use it wherever an app\noffers a theme choice \u2014 a settings page, an app-bar action, or a light/dark toggle backed by two\nregistered themes. Because it reads the registry from the injected `UNI_THEMES` token, adding a\nnew theme to the registry is all it takes for the switcher to offer it.",
5722
6443
  dos: [
5723
- "Register every selectable theme in `UNI_THEMES`; the switcher derives its options from the registry.",
6444
+ "Register every selectable theme in `UNI_THEMES` (bootstrap) or via `registerTheme` (runtime); the switcher derives its options from the registry.",
5724
6445
  'Give the control a meaningful `ariaLabel` when "Theme" is ambiguous in context (e.g. "Editor color theme").',
5725
6446
  "Use `themeChanged` for side effects like analytics or syncing a user preference to a backend."
5726
6447
  ],
5727
6448
  donts: [
5728
- "Don't call `ThemeService.theme.set()` alongside the switcher \u2014 bypassing `selectTheme` skips persistence and leaves the select out of sync.",
6449
+ "Don't try to write `ThemeService.theme` directly \u2014 it's a readonly signal. Go through `selectTheme`/`registerTheme` (persisted, listed) or `setTheme` (validated, unlisted) instead.",
5729
6450
  "Don't hardcode theme ids in app logic; read `ThemeService.selectedThemeKey()` instead.",
5730
6451
  "Don't use it for the palette-generation workflow \u2014 that's the Theme Builder; the switcher only picks among registered themes."
5731
6452
  ],
@@ -5744,7 +6465,7 @@ var uni_index_default = {
5744
6465
  summary: "",
5745
6466
  description: "",
5746
6467
  category: "forms",
5747
- version: "7.1.0",
6468
+ version: "8.0.0",
5748
6469
  bindings: {
5749
6470
  angular: {
5750
6471
  importPath: "@uni-design-system/uni-angular",
@@ -5874,7 +6595,7 @@ var uni_index_default = {
5874
6595
  summary: "",
5875
6596
  description: "",
5876
6597
  category: "feedback",
5877
- version: "7.1.0",
6598
+ version: "8.0.0",
5878
6599
  bindings: {
5879
6600
  angular: {
5880
6601
  importPath: "@uni-design-system/uni-angular",
@@ -5930,7 +6651,7 @@ var uni_index_default = {
5930
6651
  }
5931
6652
  ],
5932
6653
  guidelines: {
5933
- 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`.",
6654
+ 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.',
5934
6655
  dos: [],
5935
6656
  donts: [],
5936
6657
  accessibility: [
@@ -5953,7 +6674,7 @@ var uni_index_default = {
5953
6674
  summary: "",
5954
6675
  description: "",
5955
6676
  category: "layout",
5956
- version: "7.1.0",
6677
+ version: "8.0.0",
5957
6678
  bindings: {
5958
6679
  angular: {
5959
6680
  importPath: "@uni-design-system/uni-angular",
@@ -8060,159 +8781,327 @@ var uni_index_default = {
8060
8781
  }
8061
8782
  },
8062
8783
  {
8063
- id: "dialogButtons.behavior.stretch",
8064
- value: false,
8065
- type: "boolean",
8784
+ id: "dialogButtons.behavior.stretch",
8785
+ value: false,
8786
+ type: "boolean",
8787
+ kind: "behavioral",
8788
+ target: "component-prop",
8789
+ appliesTo: "dialogButtons",
8790
+ themeValues: {
8791
+ LightTheme: false,
8792
+ DarkTheme: false
8793
+ }
8794
+ },
8795
+ {
8796
+ id: "dialogButtons.behavior.reverseOrder",
8797
+ value: false,
8798
+ type: "boolean",
8799
+ kind: "behavioral",
8800
+ target: "component-prop",
8801
+ appliesTo: "dialogButtons",
8802
+ themeValues: {
8803
+ LightTheme: false,
8804
+ DarkTheme: false
8805
+ }
8806
+ },
8807
+ {
8808
+ id: "dialogHeader.behavior.borderRadius",
8809
+ value: "max",
8810
+ type: "string",
8811
+ kind: "behavioral",
8812
+ target: "component-prop",
8813
+ appliesTo: "dialogHeader",
8814
+ themeValues: {
8815
+ LightTheme: "max",
8816
+ DarkTheme: "max"
8817
+ }
8818
+ },
8819
+ {
8820
+ id: "dialogHeader.behavior.color",
8821
+ value: "primary",
8822
+ type: "string",
8823
+ kind: "behavioral",
8824
+ target: "component-prop",
8825
+ appliesTo: "dialogHeader",
8826
+ themeValues: {
8827
+ LightTheme: "primary",
8828
+ DarkTheme: "primary"
8829
+ }
8830
+ },
8831
+ {
8832
+ id: "dialogHeader.behavior.height",
8833
+ value: 48,
8834
+ type: "number",
8835
+ kind: "behavioral",
8836
+ target: "component-prop",
8837
+ appliesTo: "dialogHeader",
8838
+ themeValues: {
8839
+ LightTheme: 48,
8840
+ DarkTheme: 48
8841
+ }
8842
+ },
8843
+ {
8844
+ id: "dialogHeader.behavior.textRole",
8845
+ value: "title-large",
8846
+ type: "string",
8847
+ kind: "behavioral",
8848
+ target: "component-prop",
8849
+ appliesTo: "dialogHeader",
8850
+ themeValues: {
8851
+ LightTheme: "title-large",
8852
+ DarkTheme: "title-large"
8853
+ }
8854
+ },
8855
+ {
8856
+ id: "dialogHeader.behavior.textAlign",
8857
+ value: "center",
8858
+ type: "string",
8859
+ kind: "behavioral",
8860
+ target: "component-prop",
8861
+ appliesTo: "dialogHeader",
8862
+ themeValues: {
8863
+ LightTheme: "center",
8864
+ DarkTheme: "center"
8865
+ }
8866
+ },
8867
+ {
8868
+ id: "dialogHeader.behavior.closeButtonIcon",
8869
+ value: "close",
8870
+ type: "string",
8871
+ kind: "behavioral",
8872
+ target: "component-prop",
8873
+ appliesTo: "dialogHeader",
8874
+ themeValues: {
8875
+ LightTheme: "close",
8876
+ DarkTheme: "close"
8877
+ }
8878
+ },
8879
+ {
8880
+ id: "dialogHeader.behavior.closeButtonSize",
8881
+ value: "md",
8882
+ type: "string",
8883
+ kind: "behavioral",
8884
+ target: "component-prop",
8885
+ appliesTo: "dialogHeader",
8886
+ themeValues: {
8887
+ LightTheme: "md",
8888
+ DarkTheme: "md"
8889
+ }
8890
+ },
8891
+ {
8892
+ id: "dropdown.behavior.border",
8893
+ value: "none",
8894
+ type: "string",
8895
+ kind: "behavioral",
8896
+ target: "component-prop",
8897
+ appliesTo: "dropdown",
8898
+ themeValues: {
8899
+ LightTheme: "none",
8900
+ DarkTheme: "none"
8901
+ }
8902
+ },
8903
+ {
8904
+ id: "dropdown.behavior.borderRadius",
8905
+ value: "xxs",
8906
+ type: "string",
8907
+ kind: "behavioral",
8908
+ target: "component-prop",
8909
+ appliesTo: "dropdown",
8910
+ themeValues: {
8911
+ LightTheme: "xxs",
8912
+ DarkTheme: "xxs"
8913
+ }
8914
+ },
8915
+ {
8916
+ id: "dropdown.behavior.color",
8917
+ value: "primary-surface",
8918
+ type: "string",
8919
+ kind: "behavioral",
8920
+ target: "component-prop",
8921
+ appliesTo: "dropdown",
8922
+ themeValues: {
8923
+ LightTheme: "primary-surface",
8924
+ DarkTheme: "primary-surface"
8925
+ }
8926
+ },
8927
+ {
8928
+ id: "dropdown.behavior.shadow",
8929
+ value: "menu",
8930
+ type: "string",
8066
8931
  kind: "behavioral",
8067
8932
  target: "component-prop",
8068
- appliesTo: "dialogButtons",
8933
+ appliesTo: "dropdown",
8069
8934
  themeValues: {
8070
- LightTheme: false,
8071
- DarkTheme: false
8935
+ LightTheme: "menu",
8936
+ DarkTheme: "menu"
8072
8937
  }
8073
8938
  },
8074
8939
  {
8075
- id: "dialogButtons.behavior.reverseOrder",
8076
- value: false,
8077
- type: "boolean",
8940
+ id: "menu.behavior.minWidth",
8941
+ value: 184,
8942
+ type: "number",
8078
8943
  kind: "behavioral",
8079
8944
  target: "component-prop",
8080
- appliesTo: "dialogButtons",
8945
+ appliesTo: "menu",
8081
8946
  themeValues: {
8082
- LightTheme: false,
8083
- DarkTheme: false
8947
+ LightTheme: 184,
8948
+ DarkTheme: 184
8084
8949
  }
8085
8950
  },
8086
8951
  {
8087
- id: "dialogHeader.behavior.borderRadius",
8088
- value: "max",
8952
+ id: "menu.behavior.paddingVertical",
8953
+ value: "xs",
8089
8954
  type: "string",
8090
8955
  kind: "behavioral",
8091
8956
  target: "component-prop",
8092
- appliesTo: "dialogHeader",
8957
+ appliesTo: "menu",
8093
8958
  themeValues: {
8094
- LightTheme: "max",
8095
- DarkTheme: "max"
8959
+ LightTheme: "xs",
8960
+ DarkTheme: "xs"
8096
8961
  }
8097
8962
  },
8098
8963
  {
8099
- id: "dialogHeader.behavior.color",
8100
- value: "primary",
8964
+ id: "menu.behavior.paddingHorizontal",
8965
+ value: "none",
8101
8966
  type: "string",
8102
8967
  kind: "behavioral",
8103
8968
  target: "component-prop",
8104
- appliesTo: "dialogHeader",
8969
+ appliesTo: "menu",
8105
8970
  themeValues: {
8106
- LightTheme: "primary",
8107
- DarkTheme: "primary"
8971
+ LightTheme: "none",
8972
+ DarkTheme: "none"
8108
8973
  }
8109
8974
  },
8110
8975
  {
8111
- id: "dialogHeader.behavior.height",
8112
- value: 48,
8113
- type: "number",
8976
+ id: "menu.behavior.dividerBorder",
8977
+ value: "light",
8978
+ type: "string",
8114
8979
  kind: "behavioral",
8115
8980
  target: "component-prop",
8116
- appliesTo: "dialogHeader",
8981
+ appliesTo: "menu",
8117
8982
  themeValues: {
8118
- LightTheme: 48,
8119
- DarkTheme: 48
8983
+ LightTheme: "light",
8984
+ DarkTheme: "light"
8120
8985
  }
8121
8986
  },
8122
8987
  {
8123
- id: "dialogHeader.behavior.textRole",
8124
- value: "title-large",
8988
+ id: "menu.behavior.dividerSpacing",
8989
+ value: "xs",
8125
8990
  type: "string",
8126
8991
  kind: "behavioral",
8127
8992
  target: "component-prop",
8128
- appliesTo: "dialogHeader",
8993
+ appliesTo: "menu",
8129
8994
  themeValues: {
8130
- LightTheme: "title-large",
8131
- DarkTheme: "title-large"
8995
+ LightTheme: "xs",
8996
+ DarkTheme: "xs"
8132
8997
  }
8133
8998
  },
8134
8999
  {
8135
- id: "dialogHeader.behavior.textAlign",
8136
- value: "center",
8137
- type: "string",
9000
+ id: "menuItem.behavior.height",
9001
+ value: 38,
9002
+ type: "number",
8138
9003
  kind: "behavioral",
8139
9004
  target: "component-prop",
8140
- appliesTo: "dialogHeader",
9005
+ appliesTo: "menuItem",
8141
9006
  themeValues: {
8142
- LightTheme: "center",
8143
- DarkTheme: "center"
9007
+ LightTheme: 38,
9008
+ DarkTheme: 38
8144
9009
  }
8145
9010
  },
8146
9011
  {
8147
- id: "dialogHeader.behavior.closeButtonIcon",
8148
- value: "close",
9012
+ id: "menuItem.behavior.paddingHorizontal",
9013
+ value: "md",
8149
9014
  type: "string",
8150
9015
  kind: "behavioral",
8151
9016
  target: "component-prop",
8152
- appliesTo: "dialogHeader",
9017
+ appliesTo: "menuItem",
8153
9018
  themeValues: {
8154
- LightTheme: "close",
8155
- DarkTheme: "close"
9019
+ LightTheme: "md",
9020
+ DarkTheme: "md"
8156
9021
  }
8157
9022
  },
8158
9023
  {
8159
- id: "dialogHeader.behavior.closeButtonSize",
9024
+ id: "menuItem.behavior.gap",
8160
9025
  value: "md",
8161
9026
  type: "string",
8162
9027
  kind: "behavioral",
8163
9028
  target: "component-prop",
8164
- appliesTo: "dialogHeader",
9029
+ appliesTo: "menuItem",
8165
9030
  themeValues: {
8166
9031
  LightTheme: "md",
8167
9032
  DarkTheme: "md"
8168
9033
  }
8169
9034
  },
8170
9035
  {
8171
- id: "dropdown.behavior.border",
9036
+ id: "menuItem.behavior.borderRadius",
8172
9037
  value: "none",
8173
9038
  type: "string",
8174
9039
  kind: "behavioral",
8175
9040
  target: "component-prop",
8176
- appliesTo: "dropdown",
9041
+ appliesTo: "menuItem",
8177
9042
  themeValues: {
8178
9043
  LightTheme: "none",
8179
9044
  DarkTheme: "none"
8180
9045
  }
8181
9046
  },
8182
9047
  {
8183
- id: "dropdown.behavior.borderRadius",
8184
- value: "xxs",
9048
+ id: "menuItem.behavior.typeface",
9049
+ value: "label",
8185
9050
  type: "string",
8186
9051
  kind: "behavioral",
8187
9052
  target: "component-prop",
8188
- appliesTo: "dropdown",
9053
+ appliesTo: "menuItem",
8189
9054
  themeValues: {
8190
- LightTheme: "xxs",
8191
- DarkTheme: "xxs"
9055
+ LightTheme: "label",
9056
+ DarkTheme: "label"
8192
9057
  }
8193
9058
  },
8194
9059
  {
8195
- id: "dropdown.behavior.color",
8196
- value: "primary-surface",
9060
+ id: "menuItem.behavior.hoverColor",
9061
+ value: "primary-container",
8197
9062
  type: "string",
8198
9063
  kind: "behavioral",
8199
9064
  target: "component-prop",
8200
- appliesTo: "dropdown",
9065
+ appliesTo: "menuItem",
8201
9066
  themeValues: {
8202
- LightTheme: "primary-surface",
8203
- DarkTheme: "primary-surface"
9067
+ LightTheme: "primary-container",
9068
+ DarkTheme: "primary-container"
8204
9069
  }
8205
9070
  },
8206
9071
  {
8207
- id: "dropdown.behavior.shadow",
8208
- value: "menu",
9072
+ id: "menuItem.behavior.activeSymbol",
9073
+ value: "check",
8209
9074
  type: "string",
8210
9075
  kind: "behavioral",
8211
9076
  target: "component-prop",
8212
- appliesTo: "dropdown",
9077
+ appliesTo: "menuItem",
8213
9078
  themeValues: {
8214
- LightTheme: "menu",
8215
- DarkTheme: "menu"
9079
+ LightTheme: "check",
9080
+ DarkTheme: "check"
9081
+ }
9082
+ },
9083
+ {
9084
+ id: "menuItem.behavior.transitionSpeed",
9085
+ value: 0.35,
9086
+ type: "number",
9087
+ kind: "behavioral",
9088
+ target: "component-prop",
9089
+ appliesTo: "menuItem",
9090
+ themeValues: {
9091
+ LightTheme: 0.35,
9092
+ DarkTheme: 0.35
9093
+ }
9094
+ },
9095
+ {
9096
+ id: "expand.behavior.transitionSpeed",
9097
+ value: 0.35,
9098
+ type: "number",
9099
+ kind: "behavioral",
9100
+ target: "component-prop",
9101
+ appliesTo: "expand",
9102
+ themeValues: {
9103
+ LightTheme: 0.35,
9104
+ DarkTheme: 0.35
8216
9105
  }
8217
9106
  },
8218
9107
  {
@@ -8509,142 +9398,286 @@ var uni_index_default = {
8509
9398
  type: "string",
8510
9399
  kind: "behavioral",
8511
9400
  target: "component-prop",
8512
- appliesTo: "tabs",
9401
+ appliesTo: "tabs",
9402
+ themeValues: {
9403
+ LightTheme: "light",
9404
+ DarkTheme: "light"
9405
+ }
9406
+ },
9407
+ {
9408
+ id: "tabs.behavior.gap",
9409
+ value: "sm",
9410
+ type: "string",
9411
+ kind: "behavioral",
9412
+ target: "component-prop",
9413
+ appliesTo: "tabs",
9414
+ themeValues: {
9415
+ LightTheme: "sm",
9416
+ DarkTheme: "sm"
9417
+ }
9418
+ },
9419
+ {
9420
+ id: "tabs.behavior.borderRadius",
9421
+ value: "none",
9422
+ type: "string",
9423
+ kind: "behavioral",
9424
+ target: "component-prop",
9425
+ appliesTo: "tabs",
9426
+ themeValues: {
9427
+ LightTheme: "none",
9428
+ DarkTheme: "none"
9429
+ }
9430
+ },
9431
+ {
9432
+ id: "tabs.behavior.padding",
9433
+ value: "md",
9434
+ type: "string",
9435
+ kind: "behavioral",
9436
+ target: "component-prop",
9437
+ appliesTo: "tabs",
9438
+ themeValues: {
9439
+ LightTheme: "md",
9440
+ DarkTheme: "md"
9441
+ }
9442
+ },
9443
+ {
9444
+ id: "multiSelectDropdown.behavior.textRole",
9445
+ value: "input",
9446
+ type: "string",
9447
+ kind: "behavioral",
9448
+ target: "component-prop",
9449
+ appliesTo: "multiSelectDropdown",
9450
+ themeValues: {
9451
+ LightTheme: "input",
9452
+ DarkTheme: "input"
9453
+ }
9454
+ },
9455
+ {
9456
+ id: "multiSelectDropdown.behavior.textColor",
9457
+ value: "on-primary-surface",
9458
+ type: "string",
9459
+ kind: "behavioral",
9460
+ target: "component-prop",
9461
+ appliesTo: "multiSelectDropdown",
9462
+ themeValues: {
9463
+ LightTheme: "on-primary-surface",
9464
+ DarkTheme: "on-primary-surface"
9465
+ }
9466
+ },
9467
+ {
9468
+ id: "multiSelectDropdown.behavior.dividerBorder",
9469
+ value: "light",
9470
+ type: "string",
9471
+ kind: "behavioral",
9472
+ target: "component-prop",
9473
+ appliesTo: "multiSelectDropdown",
9474
+ themeValues: {
9475
+ LightTheme: "light",
9476
+ DarkTheme: "light"
9477
+ }
9478
+ },
9479
+ {
9480
+ id: "multiSelectDropdown.behavior.searchInputBorder",
9481
+ value: "light",
9482
+ type: "string",
9483
+ kind: "behavioral",
9484
+ target: "component-prop",
9485
+ appliesTo: "multiSelectDropdown",
9486
+ themeValues: {
9487
+ LightTheme: "light",
9488
+ DarkTheme: "light"
9489
+ }
9490
+ },
9491
+ {
9492
+ id: "multiSelectDropdown.behavior.searchInputBorderRadius",
9493
+ value: "xxs",
9494
+ type: "string",
9495
+ kind: "behavioral",
9496
+ target: "component-prop",
9497
+ appliesTo: "multiSelectDropdown",
9498
+ themeValues: {
9499
+ LightTheme: "xxs",
9500
+ DarkTheme: "xxs"
9501
+ }
9502
+ },
9503
+ {
9504
+ id: "multiSelectDropdown.behavior.focusOutline",
9505
+ value: "2px solid #6A6F8F",
9506
+ type: "string",
9507
+ kind: "behavioral",
9508
+ target: "component-prop",
9509
+ appliesTo: "multiSelectDropdown",
9510
+ themeValues: {
9511
+ LightTheme: "2px solid #6A6F8F",
9512
+ DarkTheme: "2px solid #AFB5D8"
9513
+ }
9514
+ },
9515
+ {
9516
+ id: "multiSelectDropdown.behavior.focusOutlineOffset",
9517
+ value: 2,
9518
+ type: "number",
9519
+ kind: "behavioral",
9520
+ target: "component-prop",
9521
+ appliesTo: "multiSelectDropdown",
9522
+ themeValues: {
9523
+ LightTheme: 2,
9524
+ DarkTheme: 2
9525
+ }
9526
+ },
9527
+ {
9528
+ id: "badge.behavior.borderRadius",
9529
+ value: "xxs",
9530
+ type: "string",
9531
+ kind: "behavioral",
9532
+ target: "component-prop",
9533
+ appliesTo: "badge",
9534
+ themeValues: {
9535
+ LightTheme: "xxs",
9536
+ DarkTheme: "xxs"
9537
+ }
9538
+ },
9539
+ {
9540
+ id: "tag.behavior.borderRadius",
9541
+ value: "max",
9542
+ type: "string",
9543
+ kind: "behavioral",
9544
+ target: "component-prop",
9545
+ appliesTo: "tag",
8513
9546
  themeValues: {
8514
- LightTheme: "light",
8515
- DarkTheme: "light"
9547
+ LightTheme: "max",
9548
+ DarkTheme: "max"
8516
9549
  }
8517
9550
  },
8518
9551
  {
8519
- id: "tabs.behavior.gap",
8520
- value: "sm",
9552
+ id: "tag.behavior.typeface",
9553
+ value: "tag",
8521
9554
  type: "string",
8522
9555
  kind: "behavioral",
8523
9556
  target: "component-prop",
8524
- appliesTo: "tabs",
9557
+ appliesTo: "tag",
8525
9558
  themeValues: {
8526
- LightTheme: "sm",
8527
- DarkTheme: "sm"
9559
+ LightTheme: "tag",
9560
+ DarkTheme: "tag"
8528
9561
  }
8529
9562
  },
8530
9563
  {
8531
- id: "tabs.behavior.borderRadius",
8532
- value: "none",
9564
+ id: "tag.behavior.gap",
9565
+ value: "xs",
8533
9566
  type: "string",
8534
9567
  kind: "behavioral",
8535
9568
  target: "component-prop",
8536
- appliesTo: "tabs",
9569
+ appliesTo: "tag",
8537
9570
  themeValues: {
8538
- LightTheme: "none",
8539
- DarkTheme: "none"
9571
+ LightTheme: "xs",
9572
+ DarkTheme: "xs"
8540
9573
  }
8541
9574
  },
8542
9575
  {
8543
- id: "tabs.behavior.padding",
8544
- value: "md",
9576
+ id: "tag.behavior.removeIcon",
9577
+ value: "close",
8545
9578
  type: "string",
8546
9579
  kind: "behavioral",
8547
9580
  target: "component-prop",
8548
- appliesTo: "tabs",
9581
+ appliesTo: "tag",
8549
9582
  themeValues: {
8550
- LightTheme: "md",
8551
- DarkTheme: "md"
9583
+ LightTheme: "close",
9584
+ DarkTheme: "close"
8552
9585
  }
8553
9586
  },
8554
9587
  {
8555
- id: "multiSelectDropdown.behavior.textRole",
8556
- value: "input",
9588
+ id: "tag.behavior.selectedIcon",
9589
+ value: "check",
8557
9590
  type: "string",
8558
9591
  kind: "behavioral",
8559
9592
  target: "component-prop",
8560
- appliesTo: "multiSelectDropdown",
9593
+ appliesTo: "tag",
8561
9594
  themeValues: {
8562
- LightTheme: "input",
8563
- DarkTheme: "input"
9595
+ LightTheme: "check",
9596
+ DarkTheme: "check"
8564
9597
  }
8565
9598
  },
8566
9599
  {
8567
- id: "multiSelectDropdown.behavior.textColor",
8568
- value: "on-primary-surface",
9600
+ id: "tagInput.behavior.chipGap",
9601
+ value: "xs",
8569
9602
  type: "string",
8570
9603
  kind: "behavioral",
8571
9604
  target: "component-prop",
8572
- appliesTo: "multiSelectDropdown",
9605
+ appliesTo: "tagInput",
8573
9606
  themeValues: {
8574
- LightTheme: "on-primary-surface",
8575
- DarkTheme: "on-primary-surface"
9607
+ LightTheme: "xs",
9608
+ DarkTheme: "xs"
8576
9609
  }
8577
9610
  },
8578
9611
  {
8579
- id: "multiSelectDropdown.behavior.dividerBorder",
8580
- value: "light",
9612
+ id: "tagInput.behavior.chipSize",
9613
+ value: "md",
8581
9614
  type: "string",
8582
9615
  kind: "behavioral",
8583
9616
  target: "component-prop",
8584
- appliesTo: "multiSelectDropdown",
9617
+ appliesTo: "tagInput",
8585
9618
  themeValues: {
8586
- LightTheme: "light",
8587
- DarkTheme: "light"
9619
+ LightTheme: "md",
9620
+ DarkTheme: "md"
8588
9621
  }
8589
9622
  },
8590
9623
  {
8591
- id: "multiSelectDropdown.behavior.searchInputBorder",
8592
- value: "light",
9624
+ id: "tagInput.behavior.minInputWidth",
9625
+ value: "12ch",
8593
9626
  type: "string",
8594
9627
  kind: "behavioral",
8595
9628
  target: "component-prop",
8596
- appliesTo: "multiSelectDropdown",
9629
+ appliesTo: "tagInput",
8597
9630
  themeValues: {
8598
- LightTheme: "light",
8599
- DarkTheme: "light"
9631
+ LightTheme: "12ch",
9632
+ DarkTheme: "12ch"
8600
9633
  }
8601
9634
  },
8602
9635
  {
8603
- id: "multiSelectDropdown.behavior.searchInputBorderRadius",
8604
- value: "xxs",
9636
+ id: "tagInput.behavior.listColor",
9637
+ value: "primary-surface",
8605
9638
  type: "string",
8606
9639
  kind: "behavioral",
8607
9640
  target: "component-prop",
8608
- appliesTo: "multiSelectDropdown",
9641
+ appliesTo: "tagInput",
8609
9642
  themeValues: {
8610
- LightTheme: "xxs",
8611
- DarkTheme: "xxs"
9643
+ LightTheme: "primary-surface",
9644
+ DarkTheme: "primary-surface"
8612
9645
  }
8613
9646
  },
8614
9647
  {
8615
- id: "multiSelectDropdown.behavior.focusOutline",
8616
- value: "2px solid #6A6F8F",
9648
+ id: "tagInput.behavior.listShadow",
9649
+ value: "menu",
8617
9650
  type: "string",
8618
9651
  kind: "behavioral",
8619
9652
  target: "component-prop",
8620
- appliesTo: "multiSelectDropdown",
9653
+ appliesTo: "tagInput",
8621
9654
  themeValues: {
8622
- LightTheme: "2px solid #6A6F8F",
8623
- DarkTheme: "2px solid #AFB5D8"
9655
+ LightTheme: "menu",
9656
+ DarkTheme: "menu"
8624
9657
  }
8625
9658
  },
8626
9659
  {
8627
- id: "multiSelectDropdown.behavior.focusOutlineOffset",
8628
- value: 2,
8629
- type: "number",
9660
+ id: "tagInput.behavior.listBorderRadius",
9661
+ value: "xs",
9662
+ type: "string",
8630
9663
  kind: "behavioral",
8631
9664
  target: "component-prop",
8632
- appliesTo: "multiSelectDropdown",
9665
+ appliesTo: "tagInput",
8633
9666
  themeValues: {
8634
- LightTheme: 2,
8635
- DarkTheme: 2
9667
+ LightTheme: "xs",
9668
+ DarkTheme: "xs"
8636
9669
  }
8637
9670
  },
8638
9671
  {
8639
- id: "badge.behavior.borderRadius",
8640
- value: "xxs",
8641
- type: "string",
9672
+ id: "tagInput.behavior.maxSuggestions",
9673
+ value: 8,
9674
+ type: "number",
8642
9675
  kind: "behavioral",
8643
9676
  target: "component-prop",
8644
- appliesTo: "badge",
9677
+ appliesTo: "tagInput",
8645
9678
  themeValues: {
8646
- LightTheme: "xxs",
8647
- DarkTheme: "xxs"
9679
+ LightTheme: 8,
9680
+ DarkTheme: 8
8648
9681
  }
8649
9682
  },
8650
9683
  {
@@ -9754,6 +10787,26 @@ var uni_index_default = {
9754
10787
  color: "primary-surface",
9755
10788
  shadow: "menu"
9756
10789
  },
10790
+ menu: {
10791
+ minWidth: 184,
10792
+ paddingVertical: "xs",
10793
+ paddingHorizontal: "none",
10794
+ dividerBorder: "light",
10795
+ dividerSpacing: "xs"
10796
+ },
10797
+ menuItem: {
10798
+ height: 38,
10799
+ paddingHorizontal: "md",
10800
+ gap: "md",
10801
+ borderRadius: "none",
10802
+ typeface: "label",
10803
+ hoverColor: "primary-container",
10804
+ activeSymbol: "check",
10805
+ transitionSpeed: 0.35
10806
+ },
10807
+ expand: {
10808
+ transitionSpeed: 0.35
10809
+ },
9757
10810
  footer: {
9758
10811
  height: 52,
9759
10812
  color: "primary",
@@ -9802,6 +10855,22 @@ var uni_index_default = {
9802
10855
  badge: {
9803
10856
  borderRadius: "xxs"
9804
10857
  },
10858
+ tag: {
10859
+ borderRadius: "max",
10860
+ typeface: "tag",
10861
+ gap: "xs",
10862
+ removeIcon: "close",
10863
+ selectedIcon: "check"
10864
+ },
10865
+ tagInput: {
10866
+ chipGap: "xs",
10867
+ chipSize: "md",
10868
+ minInputWidth: "12ch",
10869
+ listColor: "primary-surface",
10870
+ listShadow: "menu",
10871
+ listBorderRadius: "xs",
10872
+ maxSuggestions: 8
10873
+ },
9805
10874
  button: {
9806
10875
  borderRadius: "max",
9807
10876
  typeface: "button"
@@ -10135,6 +11204,26 @@ var uni_index_default = {
10135
11204
  color: "primary-surface",
10136
11205
  shadow: "menu"
10137
11206
  },
11207
+ menu: {
11208
+ minWidth: 184,
11209
+ paddingVertical: "xs",
11210
+ paddingHorizontal: "none",
11211
+ dividerBorder: "light",
11212
+ dividerSpacing: "xs"
11213
+ },
11214
+ menuItem: {
11215
+ height: 38,
11216
+ paddingHorizontal: "md",
11217
+ gap: "md",
11218
+ borderRadius: "none",
11219
+ typeface: "label",
11220
+ hoverColor: "primary-container",
11221
+ activeSymbol: "check",
11222
+ transitionSpeed: 0.35
11223
+ },
11224
+ expand: {
11225
+ transitionSpeed: 0.35
11226
+ },
10138
11227
  footer: {
10139
11228
  height: 52,
10140
11229
  color: "primary",
@@ -10183,6 +11272,22 @@ var uni_index_default = {
10183
11272
  badge: {
10184
11273
  borderRadius: "xxs"
10185
11274
  },
11275
+ tag: {
11276
+ borderRadius: "max",
11277
+ typeface: "tag",
11278
+ gap: "xs",
11279
+ removeIcon: "close",
11280
+ selectedIcon: "check"
11281
+ },
11282
+ tagInput: {
11283
+ chipGap: "xs",
11284
+ chipSize: "md",
11285
+ minInputWidth: "12ch",
11286
+ listColor: "primary-surface",
11287
+ listShadow: "menu",
11288
+ listBorderRadius: "xs",
11289
+ maxSuggestions: 8
11290
+ },
10186
11291
  button: {
10187
11292
  borderRadius: "max",
10188
11293
  typeface: "button"
@@ -10511,6 +11616,11 @@ ${rows.join("\n")}${more}`;
10511
11616
  }
10512
11617
 
10513
11618
  // ../core/dist/esm/index.js
11619
+ var EXPAND_DEFAULT_SPEED = 0.35;
11620
+ var EXPAND_MIN_DURATION = 0.15;
11621
+ var EXPAND_MAX_DURATION = 0.6;
11622
+ var MIN_SCALE = EXPAND_MIN_DURATION / EXPAND_DEFAULT_SPEED;
11623
+ var MAX_SCALE = EXPAND_MAX_DURATION / EXPAND_DEFAULT_SPEED;
10514
11624
  var cycle = (angle) => {
10515
11625
  if (angle > 360) return angle - 360;
10516
11626
  if (angle < 0) return angle + 360;
@@ -11022,6 +12132,7 @@ var BaseIcons = {
11022
12132
  arrowLeft: "data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='m294.92-450 227.85 227.85L480-180 180-480l300-300 42.77 42.15L294.92-510H780v60H294.92Z'/%3e%3c/svg%3e",
11023
12133
  arrowRight: "data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M665.08-450H180v-60h485.08L437.23-737.85 480-780l300 300-300 300-42.77-42.15L665.08-450Z'/%3e%3c/svg%3e",
11024
12134
  home: "data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M240-200h133.85v-237.69h212.3V-200H720v-360L480-740.77 240-560v360Zm-60 60v-450l300-225.77L780-590v450H526.15v-237.69h-92.3V-140H180Zm300-330.38Z'/%3e%3c/svg%3e",
12135
+ building: "data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M130-136.92v-540h160v-160h380v320h160v380H530v-160H430v160H130Zm60-60h100v-100H190v100Zm0-160h100v-100H190v100Zm0-160h100v-100H190v100Zm160 160h100v-100H350v100Zm0-160h100v-100H350v100Zm0-160h100v-100H350v100Zm160 320h100v-100H510v100Zm0-160h100v-100H510v100Zm0-160h100v-100H510v100Zm160 480h100v-100H670v100Zm0-160h100v-100H670v100Z'/%3e%3c/svg%3e",
11025
12136
  externalLink: "data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M212.31-140Q182-140 161-161q-21-21-21-51.31v-535.38Q140-778 161-799q21-21 51.31-21h252.3v60h-252.3q-4.62 0-8.46 3.85-3.85 3.84-3.85 8.46v535.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85h535.38q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46v-252.3h60v252.3Q820-182 799-161q-21 21-51.31 21H212.31Zm176.46-206.62-42.15-42.15L717.85-760H560v-60h260v260h-60v-157.85L388.77-346.62Z'/%3e%3c/svg%3e",
11026
12137
  link: "data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M432.31-298.46H281.54q-75.34 0-128.44-53.1Q100-404.65 100-479.98q0-75.33 53.1-128.44 53.1-53.12 128.44-53.12h150.77v60H281.54q-50.39 0-85.96 35.58Q160-530.38 160-480q0 50.38 35.58 85.96 35.57 35.58 85.96 35.58h150.77v60ZM330-450v-60h300v60H330Zm197.69 151.54v-60h150.77q50.39 0 85.96-35.58Q800-429.62 800-480q0-50.38-35.58-85.96-35.57-35.58-85.96-35.58H527.69v-60h150.77q75.34 0 128.44 53.1Q860-555.35 860-480.02q0 75.33-53.1 128.44-53.1 53.12-128.44 53.12H527.69Z'/%3e%3c/svg%3e",
11027
12138
  expand: "data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M140-140v-300h60v198.23L718.23-760H520v-60h300v300h-60v-198.23L241.77-200H440v60H140Z'/%3e%3c/svg%3e",
@@ -11041,6 +12152,7 @@ var BaseIcons = {
11041
12152
  share: "data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M672.22-100q-44.91 0-76.26-31.41-31.34-31.41-31.34-76.28 0-6 4.15-29.16L284.31-404.31q-14.46 15-34.36 23.5t-42.64 8.5q-44.71 0-76.01-31.54Q100-435.39 100-480q0-44.61 31.3-76.15 31.3-31.54 76.01-31.54 22.74 0 42.64 8.5 19.9 8.5 34.36 23.5l284.46-167.08q-2.38-7.38-3.27-14.46-.88-7.08-.88-15.08 0-44.87 31.43-76.28Q627.49-860 672.4-860t76.25 31.44Q780-797.13 780-752.22q0 44.91-31.41 76.26-31.41 31.34-76.28 31.34-22.85 0-42.5-8.69Q610.15-662 595.69-677L311.23-509.54q2.38 7.39 3.27 14.46.88 7.08.88 15.08t-.88 15.08q-.89 7.07-3.27 14.46L595.69-283q14.46-15 34.12-23.69 19.65-8.69 42.5-8.69 44.87 0 76.28 31.43Q780-252.51 780-207.6t-31.44 76.25Q717.13-100 672.22-100Zm.09-60q20.27 0 33.98-13.71Q720-187.42 720-207.69q0-20.27-13.71-33.98-13.71-13.72-33.98-13.72-20.27 0-33.98 13.72-13.72 13.71-13.72 33.98 0 20.27 13.72 33.98Q652.04-160 672.31-160Zm-465-272.31q20.43 0 34.25-13.8 13.83-13.81 13.83-33.89t-13.83-33.89q-13.82-13.8-34.25-13.8-20.11 0-33.71 13.8Q160-500.08 160-480t13.6 33.89q13.6 13.8 33.71 13.8Zm498.88-286.02Q720-732.04 720-752.31q0-20.27-13.71-33.98Q692.58-800 672.31-800q-20.27 0-33.98 13.71-13.72 13.71-13.72 33.98 0 20.27 13.81 33.98 13.81 13.72 33.89 13.72 20.07 0 33.88-13.72Zm-33.88 510.64ZM207.69-480Zm464.62-272.31Z'/%3e%3c/svg%3e",
11042
12153
  send: "data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M140-190v-580l688.46 290L140-190Zm60-90 474-200-474-200v147.69L416.92-480 200-427.69V-280Zm0 0v-400 400Z'/%3e%3c/svg%3e",
11043
12154
  filter: "data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M411.15-260v-60h137.31v60H411.15ZM256.16-450v-60h447.3v60h-447.3ZM140-640v-60h680v60H140Z'/%3e%3c/svg%3e",
12155
+ funnel: "data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M455.39-180q-15.08 0-25.23-10.16Q420-200.31 420-215.39v-231.53L196.08-731.38q-11.54-15.39-3.35-32 8.2-16.62 27.66-16.62h519.22q19.46 0 27.66 16.62 8.19 16.61-3.35 32L540-446.92v231.53q0 15.08-10.16 25.23Q519.69-180 504.61-180h-49.22ZM480-468l198-252H282l198 252Zm0 0Z'/%3e%3c/svg%3e",
11044
12156
  refresh: "data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M481.54-180q-125.63 0-212.81-87.17-87.19-87.17-87.19-212.77 0-125.6 87.19-212.83Q355.91-780 481.54-780q70.15 0 132.77 31.19 62.61 31.2 104.15 88.04V-780h60v244.61H533.85v-59.99h158q-31.62-57.93-87.7-91.27Q548.08-720 481.54-720q-100 0-170 70t-70 170q0 100 70 170t170 70q77 0 139-44t87-116h63.23q-27.23 97.92-107.27 158.96Q583.46-180 481.54-180Z'/%3e%3c/svg%3e",
11045
12157
  dragHandle: "data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M360-175.39q-26.65 0-45.63-18.98-18.98-18.98-18.98-45.63 0-26.65 18.98-45.63 18.98-18.98 45.63-18.98 26.65 0 45.63 18.98 18.98 18.98 18.98 45.63 0 26.65-18.98 45.63-18.98 18.98-45.63 18.98Zm240 0q-26.65 0-45.63-18.98-18.98-18.98-18.98-45.63 0-26.65 18.98-45.63 18.98-18.98 45.63-18.98 26.65 0 45.63 18.98 18.98 18.98 18.98 45.63 0 26.65-18.98 45.63-18.98 18.98-45.63 18.98Zm-240-240q-26.65 0-45.63-18.98-18.98-18.98-18.98-45.63 0-26.65 18.98-45.63 18.98-18.98 45.63-18.98 26.65 0 45.63 18.98 18.98 18.98 18.98 45.63 0 26.65-18.98 45.63-18.98 18.98-45.63 18.98Zm240 0q-26.65 0-45.63-18.98-18.98-18.98-18.98-45.63 0-26.65 18.98-45.63 18.98-18.98 45.63-18.98 26.65 0 45.63 18.98 18.98 18.98 18.98 45.63 0 26.65-18.98 45.63-18.98 18.98-45.63 18.98Zm-240-240q-26.65 0-45.63-18.98-18.98-18.98-18.98-45.63 0-26.65 18.98-45.63 18.98-18.98 45.63-18.98 26.65 0 45.63 18.98 18.98 18.98 18.98 45.63 0 26.65-18.98 45.63-18.98 18.98-45.63 18.98Zm240 0q-26.65 0-45.63-18.98-18.98-18.98-18.98-45.63 0-26.65 18.98-45.63 18.98-18.98 45.63-18.98 26.65 0 45.63 18.98 18.98 18.98 18.98 45.63 0 26.65-18.98 45.63-18.98 18.98-45.63 18.98Z'/%3e%3c/svg%3e",
11046
12158
  qrCode: "data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M140-520v-300h300v300H140Zm60-60h180v-180H200v180Zm-60 440v-300h300v300H140Zm60-60h180v-180H200v180Zm320-320v-300h300v300H520Zm60-60h180v-180H580v180Zm165 440v-75h75v75h-75ZM520-365v-75h75v75h-75Zm75 75v-75h75v75h-75Zm-75 75v-75h75v75h-75Zm75 75v-75h75v75h-75Zm75-75v-75h75v75h-75Zm0-150v-75h75v75h-75Zm75 75v-75h75v75h-75Z'/%3e%3c/svg%3e",
@@ -11074,6 +12186,7 @@ var BaseIcons = {
11074
12186
  logout: "data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M212.31-140Q182-140 161-161q-21-21-21-51.31v-535.38Q140-778 161-799q21-21 51.31-21h268.07v60H212.31q-4.62 0-8.46 3.85-3.85 3.84-3.85 8.46v535.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85h268.07v60H212.31Zm436.92-169.23-41.54-43.39L705.08-450H363.85v-60h341.23l-97.39-97.38 41.54-43.39L820-480 649.23-309.23Z'/%3e%3c/svg%3e",
11075
12187
  spinner: "data:image/svg+xml;charset=UTF-8,%3csvg stroke='%23000' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg' %3e%3cstyle%3e .oui_spinner %7b transform-origin: center; animation: rotate_360 2s linear infinite;%7d .oui_spinner circle %7b stroke-linecap: round; animation: dash 1.5s ease-in-out infinite;%7d %40keyframes rotate_360 %7b 100%25 %7b transform: rotate(360deg);%7d %7d %40keyframes dash %7b 0%25 %7b stroke-dasharray: 0 150; stroke-dashoffset: 0;%7d 47.5%25 %7b stroke-dasharray: 42 150; stroke-dashoffset: -16;%7d 95%25, 100%25 %7b stroke-dasharray: 42 150; stroke-dashoffset: -59;%7d %7d %3c/style%3e%3cg class='oui_spinner'%3e%3ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3'%3e%3c/circle%3e%3c/g%3e%3c/svg%3e "
11076
12188
  };
12189
+ var HOVER_OR_KEYBOARD_FOCUS = "&:hover, &:focus-visible";
11077
12190
  var BaseTypography = {
11078
12191
  "display-large": {
11079
12192
  fontFamily: "Red Hat Display",
@@ -11270,6 +12383,19 @@ var buildBorders = (c) => ({
11270
12383
  dark: `1px solid ${c["on-background"]}`,
11271
12384
  dotted: `1px dotted ${c["on-background"]}`
11272
12385
  });
12386
+ var tagVariant = (c, role) => ({ [role]: {
12387
+ backgroundColor: c[`${role}-container`],
12388
+ color: c[`on-${role}-container`],
12389
+ "&.tone-solid": {
12390
+ backgroundColor: c[role],
12391
+ color: c[`on-${role}`]
12392
+ },
12393
+ "&.tone-outline": {
12394
+ backgroundColor: "transparent",
12395
+ color: c[role],
12396
+ borderColor: c[`on-${role}-container-border`] ?? c[role]
12397
+ }
12398
+ } });
11273
12399
  var buildComponents = (c) => ({
11274
12400
  alert: { options: {
11275
12401
  topPosition: 40,
@@ -11415,6 +12541,38 @@ var buildComponents = (c) => ({
11415
12541
  color: "primary-surface",
11416
12542
  shadow: "menu"
11417
12543
  } },
12544
+ menu: { options: {
12545
+ minWidth: 184,
12546
+ color: void 0,
12547
+ border: void 0,
12548
+ borderRadius: void 0,
12549
+ shadow: void 0,
12550
+ paddingVertical: "xs",
12551
+ paddingHorizontal: "none",
12552
+ dividerBorder: "light",
12553
+ dividerSpacing: "xs"
12554
+ } },
12555
+ menuItem: {
12556
+ options: {
12557
+ height: 38,
12558
+ paddingHorizontal: "md",
12559
+ gap: "md",
12560
+ borderRadius: "none",
12561
+ typeface: "label",
12562
+ textColor: void 0,
12563
+ hoverColor: "primary-container",
12564
+ activeSymbol: "check",
12565
+ transitionSpeed: 0.35
12566
+ },
12567
+ variants: { warn: {
12568
+ color: c.warn,
12569
+ [HOVER_OR_KEYBOARD_FOCUS]: {
12570
+ backgroundColor: c["warn-container"],
12571
+ color: c["on-warn-container"]
12572
+ }
12573
+ } }
12574
+ },
12575
+ expand: { options: { transitionSpeed: 0.35 } },
11418
12576
  footer: { options: {
11419
12577
  height: 52,
11420
12578
  color: "primary",
@@ -11462,6 +12620,79 @@ var buildComponents = (c) => ({
11462
12620
  focusOutlineOffset: 2
11463
12621
  } },
11464
12622
  badge: { options: { borderRadius: "xxs" } },
12623
+ tag: {
12624
+ options: {
12625
+ borderRadius: "max",
12626
+ typeface: "tag",
12627
+ gap: "xs",
12628
+ removeIcon: "close",
12629
+ selectedIcon: "check"
12630
+ },
12631
+ fixed: {
12632
+ display: "inline-flex",
12633
+ alignItems: "center",
12634
+ maxWidth: "100%",
12635
+ border: "1px solid transparent",
12636
+ transition: "background-color .2s ease, color .2s ease"
12637
+ },
12638
+ variants: {
12639
+ ...tagVariant(c, "primary"),
12640
+ ...tagVariant(c, "secondary"),
12641
+ ...tagVariant(c, "tertiary"),
12642
+ ...tagVariant(c, "warn"),
12643
+ ...tagVariant(c, "success"),
12644
+ ghost: {
12645
+ backgroundColor: "transparent",
12646
+ color: c["on-background"],
12647
+ "&.tone-solid": {
12648
+ backgroundColor: c["surface-variant"],
12649
+ color: c["on-surface-variant"]
12650
+ },
12651
+ "&.tone-outline": {
12652
+ backgroundColor: "transparent",
12653
+ borderColor: c.outline
12654
+ }
12655
+ },
12656
+ disabled: {
12657
+ backgroundColor: c["disabled-container"],
12658
+ color: c["on-disabled"],
12659
+ "&.tone-solid": {
12660
+ backgroundColor: c.disabled,
12661
+ color: c["on-disabled"]
12662
+ },
12663
+ "&.tone-outline": {
12664
+ backgroundColor: "transparent",
12665
+ borderColor: c.disabled
12666
+ }
12667
+ }
12668
+ },
12669
+ sizes: {
12670
+ sm: {
12671
+ height: 20,
12672
+ fontSize: 12,
12673
+ padding: "0 8px"
12674
+ },
12675
+ md: {
12676
+ height: 24,
12677
+ fontSize: 13,
12678
+ padding: "0 10px"
12679
+ },
12680
+ lg: {
12681
+ height: 32,
12682
+ fontSize: 15,
12683
+ padding: "0 12px"
12684
+ }
12685
+ }
12686
+ },
12687
+ tagInput: { options: {
12688
+ chipGap: "xs",
12689
+ chipSize: "md",
12690
+ minInputWidth: "12ch",
12691
+ listColor: "primary-surface",
12692
+ listShadow: "menu",
12693
+ listBorderRadius: "xs",
12694
+ maxSuggestions: 8
12695
+ } },
11465
12696
  button: {
11466
12697
  options: {
11467
12698
  borderRadius: "max",
@@ -11765,11 +12996,11 @@ var buildComponents = (c) => ({
11765
12996
  typeface: "label"
11766
12997
  } }
11767
12998
  });
11768
- var isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
12999
+ var isRecord$1 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
11769
13000
  var deepMerge = (base, override) => {
11770
13001
  if (!override) return base;
11771
13002
  const out = { ...base };
11772
- for (const [key, value] of Object.entries(override)) out[key] = isRecord(value) && isRecord(out[key]) ? deepMerge(out[key], value) : value;
13003
+ for (const [key, value] of Object.entries(override)) out[key] = isRecord$1(value) && isRecord$1(out[key]) ? deepMerge(out[key], value) : value;
11773
13004
  return out;
11774
13005
  };
11775
13006
  var createTheme = ({ id, name, colors, icons = {}, radii = BaseRadii, shadows = BaseShadows, borders, components }) => ({
@@ -11788,6 +13019,10 @@ var createTheme = ({ id, name, colors, icons = {}, radii = BaseRadii, shadows =
11788
13019
  },
11789
13020
  components: deepMerge(buildComponents(colors), components)
11790
13021
  });
13022
+ var dehydrateTheme = (theme) => ({
13023
+ ...theme,
13024
+ icons: Object.fromEntries(Object.entries(theme.icons).filter(([name, uri]) => BaseIcons[name] !== uri))
13025
+ });
11791
13026
  var BASE_PALETTE_CONFIG = {
11792
13027
  seed: "#4F46E5",
11793
13028
  scheme: "triadic",
@@ -11897,6 +13132,29 @@ var generateThemes = (input) => {
11897
13132
  }
11898
13133
  };
11899
13134
  };
13135
+ var summarizeContrast = (report) => `${report.checks.length} contrast pairs checked \xB7 worst ${report.worstRatio}:1 \xB7 ${report.pass ? "all AA" : `${report.checks.filter((check) => !check.pass).length} failing`}`;
13136
+ var generateUniThemes = (input) => {
13137
+ const { lightColors: lightColors2, darkColors: darkColors2, radii, lightShadows, darkShadows, report } = generateThemes(input);
13138
+ const name = input.name ?? "Brand";
13139
+ const id = name.replace(/\W+/g, "") || "Brand";
13140
+ return {
13141
+ light: createTheme({
13142
+ id: `${id}Light`,
13143
+ name: `${name} Light`,
13144
+ colors: lightColors2,
13145
+ radii,
13146
+ shadows: lightShadows
13147
+ }),
13148
+ dark: createTheme({
13149
+ id: `${id}Dark`,
13150
+ name: `${name} Dark`,
13151
+ colors: darkColors2,
13152
+ radii,
13153
+ shadows: darkShadows
13154
+ }),
13155
+ report
13156
+ };
13157
+ };
11900
13158
  var IDENT = /^[A-Za-z_$][A-Za-z0-9_$]*$/;
11901
13159
  var asKey = (k) => IDENT.test(k) ? k : `'${k}'`;
11902
13160
  var recordLiteral = (record, indent) => Object.entries(record).map(([k, v]) => `${indent}${asKey(k)}: '${v}',`).join("\n");
@@ -11942,7 +13200,7 @@ var emitThemeFile = (input) => {
11942
13200
  input.shape && `--shape=${input.shape}`,
11943
13201
  !darkMode && "--dark-mode=false"
11944
13202
  ].filter(Boolean).join(" ");
11945
- const reportSummary = `${report.checks.length} contrast pairs checked \xB7 worst ${report.worstRatio}:1 \xB7 ${report.pass ? "all AA" : `${report.checks.filter((c) => !c.pass).length} failing`}`;
13203
+ const reportSummary = summarizeContrast(report);
11946
13204
  const modes = [{
11947
13205
  exportName: `${id}Light`,
11948
13206
  displayName: `${name} Light`,
@@ -11998,7 +13256,7 @@ ${recordLiteral(shadows, " ")}
11998
13256
  "const components = (colors: Colors): ComponentThemes => ({});",
11999
13257
  "",
12000
13258
  "/**",
12001
- " * Icon primitives, merged over the built-in 59-icon set per name: reuse a",
13259
+ " * Icon primitives, merged over the built-in 61-icon set per name: reuse a",
12002
13260
  " * built-in name to reskin it, or add any new name. Define an icon ONCE here",
12003
13261
  " * and render it anywhere via `<uni-icon name='\u2026'/>` \u2014 never inline SVG in",
12004
13262
  " * components.",
@@ -12179,20 +13437,236 @@ var UniThemes = {
12179
13437
  DarkTheme
12180
13438
  };
12181
13439
  var DefaultThemeId = Object.keys(UniThemes)[0];
13440
+ var REQUIRED_COLOR_TOKENS = [
13441
+ "primary",
13442
+ "on-primary",
13443
+ "primary-container",
13444
+ "on-primary-container",
13445
+ "primary-surface",
13446
+ "on-primary-surface",
13447
+ "surface",
13448
+ "on-surface",
13449
+ "background",
13450
+ "on-background",
13451
+ "warn",
13452
+ "on-warn",
13453
+ "disabled",
13454
+ "on-disabled",
13455
+ "outline",
13456
+ "transparent"
13457
+ ];
13458
+ var REQUIRED_TEXT_ROLES = [
13459
+ "display-large",
13460
+ "display-medium",
13461
+ "display-small",
13462
+ "headline-large",
13463
+ "headline-medium",
13464
+ "headline-small",
13465
+ "title-large",
13466
+ "title-medium",
13467
+ "title-small",
13468
+ "body-1-long",
13469
+ "body-1-short",
13470
+ "body-2-long",
13471
+ "body-2-short",
13472
+ "subtitle-1",
13473
+ "subtitle-2",
13474
+ "label",
13475
+ "button",
13476
+ "caption",
13477
+ "overline",
13478
+ "paragraph",
13479
+ "quote",
13480
+ "note"
13481
+ ];
13482
+ var REQUIRED_SPACING_SIZES = [
13483
+ "none",
13484
+ "xxs",
13485
+ "xs",
13486
+ "sm",
13487
+ "md",
13488
+ "lg",
13489
+ "xl"
13490
+ ];
13491
+ var REQUIRED_RADII_SIZES = [
13492
+ "none",
13493
+ "xxs",
13494
+ "xs",
13495
+ "sm",
13496
+ "md",
13497
+ "lg",
13498
+ "max"
13499
+ ];
13500
+ var REQUIRED_SHADOWS = [
13501
+ "raised",
13502
+ "menu",
13503
+ "dialog",
13504
+ "warn"
13505
+ ];
13506
+ var REQUIRED_THICKNESSES = [
13507
+ "thin",
13508
+ "standard",
13509
+ "thick"
13510
+ ];
13511
+ var isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
13512
+ var isCssValue = (value) => typeof value === "string" || typeof value === "number";
13513
+ var checkStyleExpression = (value, path, issues) => {
13514
+ if (!isRecord(value)) {
13515
+ issues.push({
13516
+ path,
13517
+ message: "must be a style object"
13518
+ });
13519
+ return;
13520
+ }
13521
+ for (const [key, entry] of Object.entries(value)) {
13522
+ if (entry === void 0 || isCssValue(entry)) continue;
13523
+ if (isRecord(entry)) checkStyleExpression(entry, `${path}.${key}`, issues);
13524
+ else issues.push({
13525
+ path: `${path}.${key}`,
13526
+ message: "must be a string, number, or nested style object"
13527
+ });
13528
+ }
13529
+ };
13530
+ var checkStringRecord = (value, path, issues, required = [], allowNumbers = false) => {
13531
+ if (!isRecord(value)) {
13532
+ issues.push({
13533
+ path,
13534
+ message: "must be an object"
13535
+ });
13536
+ return;
13537
+ }
13538
+ for (const key of required) if (!(key in value)) issues.push({
13539
+ path: `${path}.${key}`,
13540
+ message: "is required"
13541
+ });
13542
+ for (const [key, entry] of Object.entries(value)) {
13543
+ if (entry === void 0) continue;
13544
+ if (!(allowNumbers ? isCssValue(entry) : typeof entry === "string")) issues.push({
13545
+ path: `${path}.${key}`,
13546
+ message: allowNumbers ? "must be a string or number" : "must be a string"
13547
+ });
13548
+ }
13549
+ };
13550
+ var checkTypography = (value, issues) => {
13551
+ if (!isRecord(value)) {
13552
+ issues.push({
13553
+ path: "typography",
13554
+ message: "must be an object"
13555
+ });
13556
+ return;
13557
+ }
13558
+ for (const role of REQUIRED_TEXT_ROLES) if (!(role in value)) issues.push({
13559
+ path: `typography.${role}`,
13560
+ message: "is required"
13561
+ });
13562
+ for (const [role, style] of Object.entries(value)) {
13563
+ if (!isRecord(style)) {
13564
+ issues.push({
13565
+ path: `typography.${role}`,
13566
+ message: "must be a TextStyle object"
13567
+ });
13568
+ continue;
13569
+ }
13570
+ if (typeof style["fontFamily"] !== "string") issues.push({
13571
+ path: `typography.${role}.fontFamily`,
13572
+ message: "must be a string"
13573
+ });
13574
+ for (const field of ["fontSize", "lineHeight"]) if (!isCssValue(style[field])) issues.push({
13575
+ path: `typography.${role}.${field}`,
13576
+ message: "must be a string or number"
13577
+ });
13578
+ }
13579
+ };
13580
+ var checkComponents = (value, issues) => {
13581
+ if (!isRecord(value)) {
13582
+ issues.push({
13583
+ path: "components",
13584
+ message: "must be an object"
13585
+ });
13586
+ return;
13587
+ }
13588
+ for (const [name, entry] of Object.entries(value)) {
13589
+ if (entry === void 0) continue;
13590
+ if (!isRecord(entry)) {
13591
+ issues.push({
13592
+ path: `components.${name}`,
13593
+ message: "must be a component theme object"
13594
+ });
13595
+ continue;
13596
+ }
13597
+ if (entry["fixed"] !== void 0) checkStyleExpression(entry["fixed"], `components.${name}.fixed`, issues);
13598
+ for (const section of ["variants", "sizes"]) {
13599
+ const styles = entry[section];
13600
+ if (styles === void 0) continue;
13601
+ if (!isRecord(styles)) {
13602
+ issues.push({
13603
+ path: `components.${name}.${section}`,
13604
+ message: "must be an object"
13605
+ });
13606
+ continue;
13607
+ }
13608
+ for (const [key, style] of Object.entries(styles)) if (style !== void 0) checkStyleExpression(style, `components.${name}.${section}.${key}`, issues);
13609
+ }
13610
+ if (entry["options"] !== void 0 && !isRecord(entry["options"])) issues.push({
13611
+ path: `components.${name}.options`,
13612
+ message: "must be an object"
13613
+ });
13614
+ }
13615
+ };
13616
+ var parseTheme = (input) => {
13617
+ const issues = [];
13618
+ if (!isRecord(input)) return {
13619
+ success: false,
13620
+ issues: [{
13621
+ path: "",
13622
+ message: "theme must be an object"
13623
+ }]
13624
+ };
13625
+ for (const field of ["id", "name"]) if (typeof input[field] !== "string" || input[field] === "") issues.push({
13626
+ path: field,
13627
+ message: "must be a non-empty string"
13628
+ });
13629
+ checkStringRecord(input["colors"], "colors", issues, REQUIRED_COLOR_TOKENS);
13630
+ checkTypography(input["typography"], issues);
13631
+ checkStringRecord(input["borders"], "borders", issues);
13632
+ checkStringRecord(input["radii"], "radii", issues, REQUIRED_RADII_SIZES);
13633
+ checkStringRecord(input["shadows"], "shadows", issues, REQUIRED_SHADOWS);
13634
+ checkStringRecord(input["spacing"], "spacing", issues, REQUIRED_SPACING_SIZES, true);
13635
+ checkStringRecord(input["thicknesses"], "thicknesses", issues, REQUIRED_THICKNESSES, true);
13636
+ checkStringRecord(input["icons"], "icons", issues);
13637
+ checkComponents(input["components"], issues);
13638
+ return issues.length === 0 ? {
13639
+ success: true,
13640
+ theme: input,
13641
+ issues: []
13642
+ } : {
13643
+ success: false,
13644
+ issues
13645
+ };
13646
+ };
13647
+ var formatThemeIssues = (issues) => issues.map(({ path, message }) => path ? `${path} ${message}` : message).join("; ");
12182
13648
 
12183
13649
  // src/server/generate.ts
12184
13650
  var HEX = /^#[0-9a-fA-F]{6}$/;
12185
- function formatGeneratedTheme(args) {
12186
- const seeds = (Array.isArray(args.brand) ? args.brand : [args.brand]).map(
13651
+ function resolveSeed(brand) {
13652
+ const seeds = (Array.isArray(brand) ? brand : [brand]).map(
12187
13653
  (s) => s.startsWith("#") ? s : `#${s}`
12188
13654
  );
12189
13655
  const invalid = seeds.filter((s) => !HEX.test(s));
12190
13656
  if (invalid.length) {
12191
- return `Invalid brand color(s): ${invalid.join(", ")}. Pass 6-digit hex values, e.g. "#0052FF" (1\u20133 colors: primary, secondary, tertiary).`;
13657
+ return {
13658
+ ok: false,
13659
+ error: `Invalid brand color(s): ${invalid.join(", ")}. Pass 6-digit hex values, e.g. "#0052FF" (1\u20133 colors: primary, secondary, tertiary).`
13660
+ };
12192
13661
  }
13662
+ return { ok: true, seed: seeds.length === 1 ? seeds[0] : seeds };
13663
+ }
13664
+ function formatGeneratedTheme(args) {
13665
+ const resolved = resolveSeed(args.brand);
13666
+ if (!resolved.ok) return resolved.error;
12193
13667
  const { content, providerSnippet, reportSummary, report } = emitThemeFile({
12194
13668
  ...args,
12195
- seed: seeds.length === 1 ? seeds[0] : seeds
13669
+ seed: resolved.seed
12196
13670
  });
12197
13671
  const failing = report.checks.filter((c) => !c.pass);
12198
13672
  const failLines = failing.length ? `
@@ -12233,7 +13707,7 @@ ${failing.map((f) => `- ${f.mode} \`${f.foreground}\` on \`${f.background}\`: ${
12233
13707
  "- **Icons**: never inline SVG in components. Define an icon ONCE in the theme file's",
12234
13708
  " `icons` map as an inline SVG data URI \u2014 it is masked with `currentColor`, so it",
12235
13709
  " recolors with the theme \u2014 then render it anywhere with `<uni-icon name='\u2026'/>`.",
12236
- " A built-in set of 59 icons ships with every theme (navigation, actions, feedback,",
13710
+ " A built-in set of 61 icons ships with every theme (navigation, actions, feedback,",
12237
13711
  " user/system) \u2014 check `BaseIcons` before adding one; names are flat camelCase",
12238
13712
  " (`chevronDown`, `checkCircle`, `externalLink`) and `IconName` autocompletes them.",
12239
13713
  " To add your own, encode with `svgToIconUri` from uni-core rather than hand-writing",
@@ -12339,11 +13813,141 @@ function formatIconTokens(icons) {
12339
13813
  return out.join("\n");
12340
13814
  }
12341
13815
 
13816
+ // src/server/theme-json.ts
13817
+ var APPLY_SNIPPET = [
13818
+ "// Angular \u2014 ThemeService from @uni-design-system/uni-angular",
13819
+ "const result = themeService.registerTheme(theme, { select: true });",
13820
+ "if (!result.success) console.warn(result.issues);"
13821
+ ].join("\n");
13822
+ var APPLY_NOTE = "Each `theme` is a complete, validated UniTheme with the built-in icon set elided. ThemeService restores it on register (the theme's own icons win). Outside Angular, call `hydrateTheme(theme)` from @uni-design-system/uni-core before use, and `parseTheme` if the payload crossed a trust boundary.";
13823
+ function envelope(themes, report) {
13824
+ for (const { id, theme } of themes) {
13825
+ const result = parseTheme(theme);
13826
+ if (!result.success) {
13827
+ return { ok: false, error: `Generated theme \`${id}\` failed validation: ${formatThemeIssues(result.issues)}` };
13828
+ }
13829
+ }
13830
+ return {
13831
+ ok: true,
13832
+ envelope: {
13833
+ themes,
13834
+ ...report ? {
13835
+ contrast: {
13836
+ summary: summarizeContrast(report),
13837
+ pass: report.pass,
13838
+ worstRatio: report.worstRatio,
13839
+ failing: report.checks.filter((check) => !check.pass).map(({ mode, foreground, background, ratio, required }) => ({
13840
+ mode,
13841
+ foreground,
13842
+ background,
13843
+ ratio,
13844
+ required
13845
+ }))
13846
+ }
13847
+ } : {},
13848
+ apply: { snippet: APPLY_SNIPPET, note: APPLY_NOTE },
13849
+ iconsElided: true
13850
+ }
13851
+ };
13852
+ }
13853
+ function buildGeneratedTheme(args) {
13854
+ const resolved = resolveSeed(args.brand);
13855
+ if (!resolved.ok) return resolved;
13856
+ const { light, dark, report } = generateUniThemes({ ...args, seed: resolved.seed });
13857
+ const themes = [
13858
+ { id: light.id, name: light.name, mode: "light", theme: dehydrateTheme(light) }
13859
+ ];
13860
+ if (args.darkMode !== false) {
13861
+ themes.push({ id: dark.id, name: dark.name, mode: "dark", theme: dehydrateTheme(dark) });
13862
+ }
13863
+ return envelope(themes, report);
13864
+ }
13865
+ function listRuntimeThemes() {
13866
+ return Object.entries(UniThemes).map(([id, theme]) => ({
13867
+ id,
13868
+ name: theme.name,
13869
+ mode: modeOf(id)
13870
+ }));
13871
+ }
13872
+ var modeOf = (id) => /dark/i.test(id) ? "dark" : "light";
13873
+ function buildStoredTheme(id) {
13874
+ const theme = UniThemes[id];
13875
+ if (!theme) {
13876
+ const ids = Object.keys(UniThemes).join(", ");
13877
+ return { ok: false, error: `No theme found with id \`${id}\`. Available: ${ids}.` };
13878
+ }
13879
+ return envelope([
13880
+ { id: theme.id, name: theme.name, mode: modeOf(id), theme: dehydrateTheme(theme) }
13881
+ ]);
13882
+ }
13883
+ function summarizeEnvelope(env) {
13884
+ const list = env.themes.map((t) => `\`${t.id}\` (${t.mode})`).join(", ");
13885
+ const failing = env.contrast?.failing.length ? `
13886
+
13887
+ Failing pairs:
13888
+ ${env.contrast.failing.map((f) => `- ${f.mode} \`${f.foreground}\` on \`${f.background}\`: ${f.ratio}:1 (needs ${f.required}:1)`).join("\n")}` : "";
13889
+ return [
13890
+ `# Runtime theme JSON \u2014 ${env.themes.length} theme${env.themes.length === 1 ? "" : "s"}`,
13891
+ "",
13892
+ `${list}. The full validated theme data is in this result's structured content.`,
13893
+ ...env.contrast ? ["", `${env.contrast.summary}.${failing}`] : [],
13894
+ "",
13895
+ "## Apply",
13896
+ "",
13897
+ "```ts",
13898
+ env.apply.snippet,
13899
+ "```",
13900
+ "",
13901
+ env.apply.note,
13902
+ "",
13903
+ "To brand an app permanently instead, use `generate-uni-theme` \u2014 it returns an editable `uni-theme.ts` that becomes the source of truth. Use this tool when the theme should apply immediately without a build step."
13904
+ ].join("\n");
13905
+ }
13906
+
12342
13907
  // src/server/core.ts
12343
13908
  var FrameworkArg = z.enum(["angular", "react"]);
12344
13909
  function text(body) {
12345
13910
  return { content: [{ type: "text", text: body }] };
12346
13911
  }
13912
+ var ThemeGenerationInput = {
13913
+ brand: z.union([z.string(), z.array(z.string()).min(1).max(3)]).describe('Brand hex color(s), e.g. "#0052FF". 2\u20133 colors map to primary/secondary/tertiary.'),
13914
+ vibe: z.enum(["jewel", "pastel", "earth", "neutral", "florescent"]).optional().describe("Tonal character; defaults to a category inferred from the seed chroma."),
13915
+ scheme: z.enum(["monochromatic", "analogous", "complimentary", "splitComplimentary", "triadic"]).optional().describe("Hue-wheel relationship for generated roles; auto-classified for multi-color input."),
13916
+ name: z.string().optional().describe('Theme display name, defaults to "Brand".')
13917
+ };
13918
+ var RuntimeThemeOutput = {
13919
+ themes: z.array(
13920
+ z.object({
13921
+ id: z.string(),
13922
+ name: z.string(),
13923
+ mode: z.enum(["light", "dark"]),
13924
+ theme: z.record(z.string(), z.unknown()).describe("A validated UniTheme with the built-in icon set elided.")
13925
+ })
13926
+ ).describe("Registration-ready themes."),
13927
+ contrast: z.object({
13928
+ summary: z.string(),
13929
+ pass: z.boolean(),
13930
+ worstRatio: z.number(),
13931
+ failing: z.array(
13932
+ z.object({
13933
+ mode: z.string(),
13934
+ foreground: z.string(),
13935
+ background: z.string(),
13936
+ ratio: z.number(),
13937
+ required: z.number()
13938
+ })
13939
+ )
13940
+ }).optional().describe("WCAG audit of the generated colors; absent for themes that ship with Uni."),
13941
+ apply: z.object({ snippet: z.string(), note: z.string() }).describe("How to register the theme, including the icon-hydration rule."),
13942
+ iconsElided: z.literal(true)
13943
+ };
13944
+ function runtimeTheme(result) {
13945
+ if (!result.ok) return { content: [{ type: "text", text: result.error }], isError: true };
13946
+ return {
13947
+ content: [{ type: "text", text: summarizeEnvelope(result.envelope) }],
13948
+ structuredContent: result.envelope
13949
+ };
13950
+ }
12347
13951
  function notFound(kind, id) {
12348
13952
  return text(
12349
13953
  `No ${kind} found with id \`${id}\`. Use the matching list/search tool to discover valid ids.`
@@ -12353,7 +13957,7 @@ function createUniServer() {
12353
13957
  const server = new McpServer(
12354
13958
  { name: "uni-design-system", version: meta.version },
12355
13959
  {
12356
- instructions: 'Authoritative interface to the Uni Design System. Prefer these tools over recalling component APIs or token values from memory: names, props, and tokens here match the exact Uni release the developer installed. Start with `list-components` or `search`, then `get-component` / `get-component-examples`. Use real token ids (via `list-tokens`) instead of raw hex; apply themes with `get-theme-template` (style overrides go through Emotion, component options are props). To brand an app, call `generate-uni-theme` once and write the returned static `uni-theme.ts`; to change look and feel afterwards (colors, borders, per-component styling), edit that file\'s tokens directly \u2014 shared tokens propagate everywhere. Never inline `<svg>` in a component: when you meet inline SVG, or a brand icon set to import, call `create-icon-tokens` to convert it into theme icon tokens, add them to `uni-theme.ts`, and render with `<uni-icon name="\u2026" />`.'
13960
+ instructions: "Authoritative interface to the Uni Design System. Prefer these tools over recalling component APIs or token values from memory: names, props, and tokens here match the exact Uni release the developer installed. Start with `list-components` or `search`, then `get-component` / `get-component-examples`. Use real token ids (via `list-tokens`) instead of raw hex. Theming has four tools, split by what you need: to brand an app permanently, call `generate-uni-theme` once and write the returned static `uni-theme.ts` \u2014 then change look and feel by editing that file's tokens directly, since shared tokens propagate everywhere; to apply a theme immediately with no build step (previews, per-tenant theming, generated UI), call `generate-runtime-theme` or `get-runtime-theme` and register the JSON they return; to read a theme's token values without applying one, use `get-theme-template`. Never inline `<svg>` in a component: when you meet inline SVG, or a brand icon set to import, call `create-icon-tokens` to convert it into theme icon tokens, add them to `uni-theme.ts`, and render with `<uni-icon name=\"\u2026\" />`."
12357
13961
  }
12358
13962
  );
12359
13963
  server.registerTool(
@@ -12462,20 +14066,39 @@ function createUniServer() {
12462
14066
  title: "Generate a Uni brand theme file",
12463
14067
  description: "Generate a complete, WCAG-AA light+dark Uni theme from brand hex color(s) and return the static `uni-theme.ts` file content (write it to `src/app/uni-theme.ts`), the `UNI_THEMES` provider registration snippet, and a contrast report. The file is plain editable data and becomes the source of truth: later restyling means editing its tokens (colors, named border primitives, sparse component overrides) \u2014 not calling this tool again. Never hardcode hex in components; reference theme tokens.",
12464
14068
  inputSchema: {
12465
- brand: z.union([z.string(), z.array(z.string()).min(1).max(3)]).describe(
12466
- 'Brand hex color(s), e.g. "#0052FF". 2\u20133 colors map to primary/secondary/tertiary.'
12467
- ),
12468
- vibe: z.enum(["jewel", "pastel", "earth", "neutral", "florescent"]).optional().describe("Tonal character; defaults to a category inferred from the seed chroma."),
12469
- scheme: z.enum(["monochromatic", "analogous", "complimentary", "splitComplimentary", "triadic"]).optional().describe(
12470
- "Hue-wheel relationship for generated roles; auto-classified for multi-color input."
12471
- ),
14069
+ ...ThemeGenerationInput,
12472
14070
  shape: z.enum(["sharp", "modern", "playful"]).optional().describe("Shape language \u2014 emits a radii override into the file."),
12473
- name: z.string().optional().describe('Theme display name, defaults to "Brand".'),
12474
14071
  darkMode: z.boolean().optional().describe("Emit the dark theme too. Defaults to true.")
12475
14072
  }
12476
14073
  },
12477
14074
  async (args) => text(formatGeneratedTheme(args))
12478
14075
  );
14076
+ server.registerTool(
14077
+ "generate-runtime-theme",
14078
+ {
14079
+ title: "Generate a Uni brand theme as runtime JSON",
14080
+ description: "Generate a WCAG-AA light+dark Uni theme from brand hex color(s) and return it as validated JSON data, ready to register live via `ThemeService.registerTheme(theme, { select: true })` \u2014 no file to write, no rebuild. Use this when a theme should apply immediately (previewing a brand, per-tenant theming, generated UI). To brand an app permanently, use `generate-uni-theme` instead: it returns an editable `uni-theme.ts` that becomes the source of truth. The built-in icon set is elided from the payload and restored on registration.",
14081
+ inputSchema: {
14082
+ ...ThemeGenerationInput,
14083
+ shape: z.enum(["sharp", "modern", "playful"]).optional().describe("Shape language \u2014 sets the radii scale on the returned themes."),
14084
+ darkMode: z.boolean().optional().describe("Include the dark theme too. Defaults to true.")
14085
+ },
14086
+ outputSchema: RuntimeThemeOutput
14087
+ },
14088
+ async (args) => runtimeTheme(buildGeneratedTheme(args))
14089
+ );
14090
+ server.registerTool(
14091
+ "get-runtime-theme",
14092
+ {
14093
+ title: "Get a built-in Uni theme as runtime JSON",
14094
+ description: "A theme that ships with Uni, as a complete validated `UniTheme` ready to register at runtime. Differs from `get-theme-template`, which returns a flat read-only projection of token values for inspection \u2014 this returns the real theme object. The built-in icon set is elided from the payload and restored on registration.",
14095
+ inputSchema: {
14096
+ id: z.string().describe('Theme id, e.g. "LightTheme" or "DarkTheme".')
14097
+ },
14098
+ outputSchema: RuntimeThemeOutput
14099
+ },
14100
+ async ({ id }) => runtimeTheme(buildStoredTheme(id))
14101
+ );
12479
14102
  server.registerTool(
12480
14103
  "create-icon-tokens",
12481
14104
  {
@@ -12633,6 +14256,8 @@ function registerResources(server) {
12633
14256
 
12634
14257
  export {
12635
14258
  meta,
14259
+ listRuntimeThemes,
14260
+ buildStoredTheme,
12636
14261
  createUniServer
12637
14262
  };
12638
- //# sourceMappingURL=chunk-VM5SXSG2.js.map
14263
+ //# sourceMappingURL=chunk-GT3T5DVX.js.map