@wovenui/components 0.0.0-stage → 1.0.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.
Files changed (130) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +284 -2
  3. package/dist/components.json +4204 -0
  4. package/dist/llms-full.txt +2839 -0
  5. package/dist/wovenui-kit.css +5002 -0
  6. package/dist/wovenui-kit.css.map +1 -0
  7. package/dist/wovenui-kit.iife.js +532 -0
  8. package/dist/wovenui-kit.js +529 -0
  9. package/dist/wovenui-kit.min.css +2 -0
  10. package/dist/wovenui-kit.min.css.map +1 -0
  11. package/package.json +268 -4
  12. package/src/_close.scss +45 -0
  13. package/src/_helpers.scss +11 -0
  14. package/src/_kit.scss +124 -0
  15. package/src/_shared.scss +10 -0
  16. package/src/components/_accordion.scss +132 -0
  17. package/src/components/_alert.scss +161 -0
  18. package/src/components/_autocomplete.scss +129 -0
  19. package/src/components/_avatar-group.scss +80 -0
  20. package/src/components/_avatar.scss +134 -0
  21. package/src/components/_badge.scss +91 -0
  22. package/src/components/_breadcrumb.scss +115 -0
  23. package/src/components/_btn-group.scss +113 -0
  24. package/src/components/_button.scss +301 -0
  25. package/src/components/_card.scss +120 -0
  26. package/src/components/_checkbox.scss +168 -0
  27. package/src/components/_code-block.scss +78 -0
  28. package/src/components/_confirm-modal.scss +75 -0
  29. package/src/components/_data-table.scss +79 -0
  30. package/src/components/_desc-list.scss +180 -0
  31. package/src/components/_divider.scss +66 -0
  32. package/src/components/_dot.scss +115 -0
  33. package/src/components/_drawer.scss +200 -0
  34. package/src/components/_dropdown.scss +182 -0
  35. package/src/components/_empty-state.scss +146 -0
  36. package/src/components/_field-group.scss +68 -0
  37. package/src/components/_field-message.scss +75 -0
  38. package/src/components/_field.scss +127 -0
  39. package/src/components/_form-actions.scss +58 -0
  40. package/src/components/_info-row.scss +69 -0
  41. package/src/components/_input-group.scss +87 -0
  42. package/src/components/_input.scss +278 -0
  43. package/src/components/_list.scss +76 -0
  44. package/src/components/_modal.scss +168 -0
  45. package/src/components/_page-header.scss +85 -0
  46. package/src/components/_pagination.scss +138 -0
  47. package/src/components/_panel.scss +69 -0
  48. package/src/components/_popover.scss +154 -0
  49. package/src/components/_progress-circle.scss +123 -0
  50. package/src/components/_progress.scss +122 -0
  51. package/src/components/_radio.scss +162 -0
  52. package/src/components/_segmented.scss +183 -0
  53. package/src/components/_select.scss +154 -0
  54. package/src/components/_sidebar.scss +300 -0
  55. package/src/components/_skeleton.scss +90 -0
  56. package/src/components/_spinner.scss +84 -0
  57. package/src/components/_stat.scss +92 -0
  58. package/src/components/_table.scss +460 -0
  59. package/src/components/_tabs.scss +327 -0
  60. package/src/components/_tag.scss +143 -0
  61. package/src/components/_text.scss +42 -0
  62. package/src/components/_textarea.scss +57 -0
  63. package/src/components/_timeline.scss +196 -0
  64. package/src/components/_title.scss +41 -0
  65. package/src/components/_toast.scss +221 -0
  66. package/src/components/_toggle.scss +171 -0
  67. package/src/components/_toolbar.scss +74 -0
  68. package/src/components/_topbar.scss +204 -0
  69. package/src/entries/accordion.scss +4 -0
  70. package/src/entries/alert.scss +4 -0
  71. package/src/entries/autocomplete.scss +4 -0
  72. package/src/entries/avatar-group.scss +4 -0
  73. package/src/entries/avatar.scss +4 -0
  74. package/src/entries/badge.scss +4 -0
  75. package/src/entries/breadcrumb.scss +4 -0
  76. package/src/entries/btn-group.scss +4 -0
  77. package/src/entries/button.scss +4 -0
  78. package/src/entries/card.scss +4 -0
  79. package/src/entries/checkbox.scss +4 -0
  80. package/src/entries/code-block.scss +4 -0
  81. package/src/entries/confirm-modal.scss +4 -0
  82. package/src/entries/data-table.scss +4 -0
  83. package/src/entries/desc-list.scss +4 -0
  84. package/src/entries/divider.scss +4 -0
  85. package/src/entries/dot.scss +4 -0
  86. package/src/entries/drawer.scss +4 -0
  87. package/src/entries/dropdown.scss +4 -0
  88. package/src/entries/empty-state.scss +4 -0
  89. package/src/entries/field-group.scss +4 -0
  90. package/src/entries/field-message.scss +4 -0
  91. package/src/entries/field.scss +4 -0
  92. package/src/entries/form-actions.scss +4 -0
  93. package/src/entries/info-row.scss +4 -0
  94. package/src/entries/input-group.scss +4 -0
  95. package/src/entries/input.scss +4 -0
  96. package/src/entries/list.scss +4 -0
  97. package/src/entries/modal.scss +4 -0
  98. package/src/entries/page-header.scss +4 -0
  99. package/src/entries/pagination.scss +4 -0
  100. package/src/entries/panel.scss +4 -0
  101. package/src/entries/popover.scss +4 -0
  102. package/src/entries/progress-circle.scss +4 -0
  103. package/src/entries/progress.scss +4 -0
  104. package/src/entries/radio.scss +4 -0
  105. package/src/entries/segmented.scss +4 -0
  106. package/src/entries/select.scss +4 -0
  107. package/src/entries/sidebar.scss +4 -0
  108. package/src/entries/skeleton.scss +4 -0
  109. package/src/entries/spinner.scss +4 -0
  110. package/src/entries/stat.scss +4 -0
  111. package/src/entries/table.scss +4 -0
  112. package/src/entries/tabs.scss +4 -0
  113. package/src/entries/tag.scss +4 -0
  114. package/src/entries/text.scss +4 -0
  115. package/src/entries/textarea.scss +4 -0
  116. package/src/entries/timeline.scss +4 -0
  117. package/src/entries/title.scss +4 -0
  118. package/src/entries/toast.scss +4 -0
  119. package/src/entries/toggle.scss +4 -0
  120. package/src/entries/toolbar.scss +4 -0
  121. package/src/entries/topbar.scss +4 -0
  122. package/src/index.scss +7 -0
  123. package/src/js/autocomplete.js +86 -0
  124. package/src/js/data-table.js +141 -0
  125. package/src/js/index.js +34 -0
  126. package/src/js/input-clear.js +25 -0
  127. package/src/js/package.json +3 -0
  128. package/src/js/tabs.js +73 -0
  129. package/src/js/toast.js +161 -0
  130. package/src/js/util.js +21 -0
@@ -0,0 +1,4204 @@
1
+ {
2
+ "components": [
3
+ {
4
+ "name": "accordion",
5
+ "root": "wu-accordion",
6
+ "summary": "Stacked disclosure panels built on native `details`, in one bordered group.",
7
+ "notes": [
8
+ "The same `name` on several `details` makes the group exclusive, one open at a time. Leave it out to allow several open."
9
+ ],
10
+ "since": "1.0.0",
11
+ "needs": [],
12
+ "js": {
13
+ "mode": "none",
14
+ "exports": []
15
+ },
16
+ "examples": [
17
+ {
18
+ "lang": "html",
19
+ "code": "<div class=\"wu-accordion\">\n <details class=\"wu-accordion-item\" name=\"faq\" open>\n <summary class=\"wu-accordion-trigger\">What is included?</summary>\n <div class=\"wu-accordion-body\">Every plan includes support.</div>\n </details>\n <details class=\"wu-accordion-item\" name=\"faq\">\n <summary class=\"wu-accordion-trigger\">Can I cancel?</summary>\n <div class=\"wu-accordion-body\">Yes, at any time.</div>\n </details>\n</div>"
20
+ },
21
+ {
22
+ "lang": "html",
23
+ "code": "<div class=\"wu-accordion animated\">\n <details class=\"wu-accordion-item\">\n <summary class=\"wu-accordion-trigger\">Shipping</summary>\n <div class=\"wu-accordion-body\">Orders ship in two days.</div>\n </details>\n</div>"
24
+ }
25
+ ],
26
+ "modifiers": [
27
+ {
28
+ "names": [
29
+ "animated"
30
+ ],
31
+ "description": "The chevron turns and the panel height glides when the user allows motion; `wu-animated` on an ancestor does the same",
32
+ "since": "1.0.0"
33
+ }
34
+ ],
35
+ "parts": [
36
+ {
37
+ "names": [
38
+ "wu-accordion-item"
39
+ ],
40
+ "description": "A `details` element holding one trigger and one body",
41
+ "since": "1.0.0"
42
+ },
43
+ {
44
+ "names": [
45
+ "wu-accordion-trigger"
46
+ ],
47
+ "description": "The `summary` that opens and closes the item, with a chevron",
48
+ "since": "1.0.0"
49
+ },
50
+ {
51
+ "names": [
52
+ "wu-accordion-body"
53
+ ],
54
+ "description": "The panel content shown when the item is open",
55
+ "since": "1.0.0"
56
+ }
57
+ ],
58
+ "variables": [],
59
+ "states": [
60
+ {
61
+ "names": [
62
+ "open"
63
+ ],
64
+ "description": "The chevron points up and the body is shown",
65
+ "since": "1.0.0"
66
+ }
67
+ ],
68
+ "changed": []
69
+ },
70
+ {
71
+ "name": "alert",
72
+ "root": "wu-alert",
73
+ "summary": "Inline message with a shape marker, a title, optional actions and a dismiss button.",
74
+ "notes": [
75
+ "Meaning is carried by the `wu-alert-title` text, such as \"Error\" or \"Saved\"; the marker shape repeats it.",
76
+ "Use `role=\"alert\"` for urgent messages and `role=\"status\"` for the rest. The close button is markup only; the app removes the alert."
77
+ ],
78
+ "since": "1.0.0",
79
+ "needs": [],
80
+ "js": {
81
+ "mode": "none",
82
+ "exports": []
83
+ },
84
+ "examples": [
85
+ {
86
+ "lang": "html",
87
+ "code": "<div class=\"wu-alert success\" role=\"status\">\n <strong class=\"wu-alert-title\">Saved</strong>\n <p>Your changes are live.</p>\n</div>"
88
+ },
89
+ {
90
+ "lang": "html",
91
+ "code": "<div class=\"wu-alert danger\" role=\"alert\">\n <strong class=\"wu-alert-title\">Payment failed</strong>\n <p>Check the card details and try again.</p>\n <div class=\"wu-alert-actions\">\n <button class=\"wu-btn danger\" type=\"button\">Retry</button>\n <button class=\"wu-btn\" type=\"button\">Cancel</button>\n </div>\n <button class=\"wu-alert-close\" type=\"button\" aria-label=\"Dismiss\"></button>\n</div>"
92
+ }
93
+ ],
94
+ "modifiers": [
95
+ {
96
+ "names": [
97
+ "brand",
98
+ "success",
99
+ "danger",
100
+ "warning",
101
+ "info"
102
+ ],
103
+ "description": "Role color for border, fill, marker and title; `success`, `warning` and `danger` also change the marker shape",
104
+ "since": "1.0.0"
105
+ }
106
+ ],
107
+ "parts": [
108
+ {
109
+ "names": [
110
+ "wu-alert-title"
111
+ ],
112
+ "description": "Bold title line that names the message",
113
+ "since": "1.0.0"
114
+ },
115
+ {
116
+ "names": [
117
+ "wu-alert-actions"
118
+ ],
119
+ "description": "Row of buttons under the text",
120
+ "since": "1.0.0"
121
+ },
122
+ {
123
+ "names": [
124
+ "wu-alert-close"
125
+ ],
126
+ "description": "Dismiss button in the end corner, last child of the alert",
127
+ "since": "1.0.0"
128
+ }
129
+ ],
130
+ "variables": [],
131
+ "states": [],
132
+ "changed": []
133
+ },
134
+ {
135
+ "name": "autocomplete",
136
+ "root": "wu-autocomplete",
137
+ "summary": "Combobox that filters a list of options as the user types.",
138
+ "notes": [
139
+ "The kit script filters the options, handles the keyboard and sets `aria-expanded`, `aria-activedescendant`, `aria-selected` and `hidden`."
140
+ ],
141
+ "since": "1.0.0",
142
+ "needs": [
143
+ "input"
144
+ ],
145
+ "js": {
146
+ "mode": "required",
147
+ "exports": [
148
+ "initAutocomplete"
149
+ ]
150
+ },
151
+ "examples": [
152
+ {
153
+ "lang": "html",
154
+ "code": "<div class=\"wu-autocomplete\">\n <label for=\"city\">City</label>\n <input class=\"wu-input\" id=\"city\" type=\"text\" role=\"combobox\" aria-autocomplete=\"list\" aria-expanded=\"false\" aria-controls=\"city-list\" autocomplete=\"off\">\n <ul class=\"wu-autocomplete-list\" id=\"city-list\" role=\"listbox\" aria-label=\"Cities\" hidden>\n <li class=\"wu-autocomplete-option\" id=\"city-1\" role=\"option\">Amsterdam</li>\n <li class=\"wu-autocomplete-option\" id=\"city-2\" role=\"option\">Berlin</li>\n <li class=\"wu-autocomplete-option\" id=\"city-3\" role=\"option\" aria-disabled=\"true\">Closed city</li>\n </ul>\n <p class=\"wu-autocomplete-empty\" hidden>No matches</p>\n</div>"
155
+ }
156
+ ],
157
+ "modifiers": [
158
+ {
159
+ "names": [
160
+ "animated"
161
+ ],
162
+ "description": "The popup fades and slides in when the user allows motion; `wu-animated` on an ancestor does the same",
163
+ "since": "1.0.0"
164
+ }
165
+ ],
166
+ "parts": [
167
+ {
168
+ "names": [
169
+ "wu-autocomplete-list"
170
+ ],
171
+ "description": "Popup `ul` that holds the options",
172
+ "since": "1.0.0"
173
+ },
174
+ {
175
+ "names": [
176
+ "wu-autocomplete-option"
177
+ ],
178
+ "description": "One selectable `li` option",
179
+ "since": "1.0.0"
180
+ },
181
+ {
182
+ "names": [
183
+ "wu-autocomplete-empty"
184
+ ],
185
+ "description": "Message shown when no option matches",
186
+ "since": "1.0.0"
187
+ }
188
+ ],
189
+ "variables": [
190
+ {
191
+ "names": [
192
+ "--wu-autocomplete--MaxHeight"
193
+ ],
194
+ "description": "Maximum height of the option list before it scrolls",
195
+ "since": "1.0.0",
196
+ "default": "16rem"
197
+ }
198
+ ],
199
+ "states": [
200
+ {
201
+ "names": [
202
+ "aria-selected=\"true\""
203
+ ],
204
+ "description": "The active option: selected fill and a start bar",
205
+ "since": "1.0.0"
206
+ },
207
+ {
208
+ "names": [
209
+ "aria-disabled=\"true\""
210
+ ],
211
+ "description": "Half opacity and a not-allowed cursor",
212
+ "since": "1.0.0"
213
+ },
214
+ {
215
+ "names": [
216
+ "hidden"
217
+ ],
218
+ "description": "An option filtered out is not displayed",
219
+ "since": "1.0.0"
220
+ }
221
+ ],
222
+ "changed": []
223
+ },
224
+ {
225
+ "name": "avatar-group",
226
+ "root": "wu-avatar-group",
227
+ "summary": "Overlapping stack of avatars with a ring between them.",
228
+ "notes": [
229
+ "Put the overflow count, such as \"+3\", in a last `wu-avatar` as real text."
230
+ ],
231
+ "since": "1.0.0",
232
+ "needs": [
233
+ "avatar"
234
+ ],
235
+ "js": {
236
+ "mode": "none",
237
+ "exports": []
238
+ },
239
+ "examples": [
240
+ {
241
+ "lang": "html",
242
+ "code": "<div class=\"wu-avatar-group\" role=\"group\" aria-label=\"Members\">\n <span class=\"wu-avatar blue\" role=\"img\" aria-label=\"Ana Lopez\">AL</span>\n <span class=\"wu-avatar green\" role=\"img\" aria-label=\"Ben Kim\">BK</span>\n <span class=\"wu-avatar\" role=\"img\" aria-label=\"3 more members\">+3</span>\n</div>"
243
+ },
244
+ {
245
+ "lang": "html",
246
+ "code": "<div class=\"wu-avatar-group animated\" role=\"group\" aria-label=\"Team\">\n <span class=\"wu-avatar purple\" role=\"img\" aria-label=\"Cy Ray\">CR</span>\n <span class=\"wu-avatar pink\" role=\"img\" aria-label=\"Di Eze\">DE</span>\n</div>"
247
+ }
248
+ ],
249
+ "modifiers": [
250
+ {
251
+ "names": [
252
+ "animated"
253
+ ],
254
+ "description": "On hover or focus within, the stack fans out into a row when the user allows motion; `wu-animated` on an ancestor does the same",
255
+ "since": "1.0.0"
256
+ }
257
+ ],
258
+ "parts": [],
259
+ "variables": [],
260
+ "states": [],
261
+ "changed": []
262
+ },
263
+ {
264
+ "name": "avatar",
265
+ "root": "wu-avatar",
266
+ "summary": "Round or square badge for a person or product, with initials, an image or an svg, and an optional status dot.",
267
+ "notes": [
268
+ "Label it with `aria-label` or the image `alt`, status included.",
269
+ "`--wu-avatar--Size` overrides every size."
270
+ ],
271
+ "since": "1.0.0",
272
+ "needs": [],
273
+ "js": {
274
+ "mode": "none",
275
+ "exports": []
276
+ },
277
+ "examples": [
278
+ {
279
+ "lang": "html",
280
+ "code": "<span class=\"wu-avatar\" role=\"img\" aria-label=\"Ana Lopez\">AL</span>\n<span class=\"wu-avatar sm blue\" role=\"img\" aria-label=\"Ben Kim\">BK</span>\n<span class=\"wu-avatar lg purple\" role=\"img\" aria-label=\"Cy Ray\">CR</span>"
281
+ },
282
+ {
283
+ "lang": "html",
284
+ "code": "<span class=\"wu-avatar green\" data-status=\"online\" role=\"img\" aria-label=\"Di Eze, online\">DE</span>\n<span class=\"wu-avatar tile\"><img src=\"https://wovenui.com/images/logo.svg\" alt=\"WovenUI\"></span>"
285
+ }
286
+ ],
287
+ "modifiers": [
288
+ {
289
+ "names": [
290
+ "sm",
291
+ "lg"
292
+ ],
293
+ "description": "Small or large size; the default is medium",
294
+ "since": "1.0.0"
295
+ },
296
+ {
297
+ "names": [
298
+ "tile"
299
+ ],
300
+ "description": "Square with rounded corners, for company and product logos",
301
+ "since": "1.0.0"
302
+ },
303
+ {
304
+ "names": [
305
+ "gray",
306
+ "red",
307
+ "blue",
308
+ "green",
309
+ "yellow",
310
+ "purple",
311
+ "pink"
312
+ ],
313
+ "description": "Tinted fill and text in that hue",
314
+ "since": "1.0.0"
315
+ }
316
+ ],
317
+ "parts": [],
318
+ "variables": [
319
+ {
320
+ "names": [
321
+ "--wu-avatar--Size"
322
+ ],
323
+ "description": "Width and height; initials scale with it",
324
+ "since": "1.0.0",
325
+ "default": "var(--wu-space-10)"
326
+ },
327
+ {
328
+ "names": [
329
+ "--wu-avatar--RingColor"
330
+ ],
331
+ "description": "Color of the ring around the status dot, shared with avatar group and corner badge",
332
+ "since": "1.0.0",
333
+ "default": "var(--wu-bg-surface)"
334
+ }
335
+ ],
336
+ "states": [
337
+ {
338
+ "names": [
339
+ "data-status=\"online\""
340
+ ],
341
+ "description": "Solid dot at the end corner",
342
+ "since": "1.0.0"
343
+ },
344
+ {
345
+ "names": [
346
+ "data-status=\"away\""
347
+ ],
348
+ "description": "Half-filled dot",
349
+ "since": "1.0.0"
350
+ },
351
+ {
352
+ "names": [
353
+ "data-status=\"busy\""
354
+ ],
355
+ "description": "Filled dot with a bar",
356
+ "since": "1.0.0"
357
+ },
358
+ {
359
+ "names": [
360
+ "data-status=\"offline\""
361
+ ],
362
+ "description": "Hollow ring",
363
+ "since": "1.0.0"
364
+ }
365
+ ],
366
+ "changed": []
367
+ },
368
+ {
369
+ "name": "badge",
370
+ "root": "wu-badge",
371
+ "summary": "Small pill for counts and short labels, tinted by default and solid for emphasis.",
372
+ "notes": [],
373
+ "since": "1.0.0",
374
+ "needs": [],
375
+ "js": {
376
+ "mode": "none",
377
+ "exports": []
378
+ },
379
+ "examples": [
380
+ {
381
+ "lang": "html",
382
+ "code": "<span class=\"wu-badge\">Draft</span>\n<span class=\"wu-badge success\">Paid</span>\n<span class=\"wu-badge danger solid\">3</span>"
383
+ },
384
+ {
385
+ "lang": "html",
386
+ "code": "<span class=\"wu-badge-host\">\n <button class=\"wu-btn\" type=\"button\" aria-label=\"Inbox, 3 unread\">Inbox</button>\n <span class=\"wu-badge corner danger solid\">3</span>\n</span>"
387
+ }
388
+ ],
389
+ "modifiers": [
390
+ {
391
+ "names": [
392
+ "brand",
393
+ "success",
394
+ "danger",
395
+ "warning",
396
+ "info"
397
+ ],
398
+ "description": "Role color: tinted fill, border and text; solid fill with `solid`",
399
+ "since": "1.0.0"
400
+ },
401
+ {
402
+ "names": [
403
+ "solid"
404
+ ],
405
+ "description": "Solid fill for stronger emphasis, gray without a role",
406
+ "since": "1.0.0"
407
+ },
408
+ {
409
+ "names": [
410
+ "corner"
411
+ ],
412
+ "description": "Pins the badge to the top inline-end corner of a `wu-badge-host`",
413
+ "since": "1.0.0"
414
+ }
415
+ ],
416
+ "parts": [
417
+ {
418
+ "names": [
419
+ "wu-badge-host"
420
+ ],
421
+ "description": "Wrapper that a corner badge pins to",
422
+ "since": "1.0.0"
423
+ }
424
+ ],
425
+ "variables": [
426
+ {
427
+ "names": [
428
+ "--wu-badge--Offset"
429
+ ],
430
+ "description": "How far a corner badge sits outside the host corner",
431
+ "since": "1.0.0",
432
+ "default": "50%"
433
+ },
434
+ {
435
+ "names": [
436
+ "--wu-avatar--RingColor"
437
+ ],
438
+ "description": "Color of the ring around a corner badge, shared with avatar",
439
+ "since": "1.0.0",
440
+ "default": "var(--wu-bg-surface)"
441
+ }
442
+ ],
443
+ "states": [
444
+ {
445
+ "names": [
446
+ ":empty"
447
+ ],
448
+ "description": "A corner badge with no content is hidden",
449
+ "since": "1.0.0"
450
+ }
451
+ ],
452
+ "changed": []
453
+ },
454
+ {
455
+ "name": "breadcrumb",
456
+ "root": "wu-breadcrumb",
457
+ "summary": "Trail of links that shows where the page sits in the site.",
458
+ "notes": [
459
+ "Wrap an ordered list in a `nav` with an `aria-label`, and mark the last item with `aria-current=\"page\"`."
460
+ ],
461
+ "since": "1.0.0",
462
+ "needs": [],
463
+ "js": {
464
+ "mode": "none",
465
+ "exports": []
466
+ },
467
+ "examples": [
468
+ {
469
+ "lang": "html",
470
+ "code": "<nav class=\"wu-breadcrumb\" aria-label=\"Breadcrumb\">\n <ol class=\"wu-breadcrumb-list\">\n <li class=\"wu-breadcrumb-item\"><a class=\"wu-breadcrumb-link\" href=\"/\">Home</a></li>\n <li class=\"wu-breadcrumb-item\"><a class=\"wu-breadcrumb-link\" href=\"/projects/\">Projects</a></li>\n <li class=\"wu-breadcrumb-item\"><span aria-current=\"page\">Website</span></li>\n </ol>\n</nav>"
471
+ },
472
+ {
473
+ "lang": "html",
474
+ "code": "<nav class=\"wu-breadcrumb slash sm\" aria-label=\"Breadcrumb\">\n <ol class=\"wu-breadcrumb-list\">\n <li class=\"wu-breadcrumb-item\"><a class=\"wu-breadcrumb-link\" href=\"/\">Home</a></li>\n <li class=\"wu-breadcrumb-item\"><span aria-current=\"page\">Docs</span></li>\n </ol>\n</nav>"
475
+ }
476
+ ],
477
+ "modifiers": [
478
+ {
479
+ "names": [
480
+ "slash"
481
+ ],
482
+ "description": "A slash separator instead of the chevron",
483
+ "since": "1.0.0"
484
+ },
485
+ {
486
+ "names": [
487
+ "sm"
488
+ ],
489
+ "description": "Smaller font size",
490
+ "since": "1.0.0"
491
+ }
492
+ ],
493
+ "parts": [
494
+ {
495
+ "names": [
496
+ "wu-breadcrumb-list"
497
+ ],
498
+ "description": "The `ol` that lays the items out and wraps them",
499
+ "since": "1.0.0"
500
+ },
501
+ {
502
+ "names": [
503
+ "wu-breadcrumb-item"
504
+ ],
505
+ "description": "One `li` in the trail, with a separator before it",
506
+ "since": "1.0.0"
507
+ },
508
+ {
509
+ "names": [
510
+ "wu-breadcrumb-link"
511
+ ],
512
+ "description": "Underlined link to a parent page",
513
+ "since": "1.0.0"
514
+ }
515
+ ],
516
+ "variables": [],
517
+ "states": [
518
+ {
519
+ "names": [
520
+ "aria-current=\"page\""
521
+ ],
522
+ "description": "The current page: regular text weight and color, no underline",
523
+ "since": "1.0.0"
524
+ }
525
+ ],
526
+ "changed": []
527
+ },
528
+ {
529
+ "name": "btn-group",
530
+ "root": "wu-btn-group",
531
+ "summary": "Joins buttons into one segmented control, as a split button, a toggle set or a radio set.",
532
+ "notes": [
533
+ "Split divider: use `brand`, `danger` or `quiet` on both buttons of a pair. Checkable: use `role=\"group\"` with checkboxes or `role=\"radiogroup\"` with radios.",
534
+ "The checked label takes the `aria-pressed` look; arrow keys are native for radios. `animated` on a button gives it the press from `wu-btn`."
535
+ ],
536
+ "since": "1.0.0",
537
+ "needs": [
538
+ "button"
539
+ ],
540
+ "js": {
541
+ "mode": "none",
542
+ "exports": []
543
+ },
544
+ "examples": [
545
+ {
546
+ "lang": "html",
547
+ "code": "<div class=\"wu-btn-group\">\n <button class=\"wu-btn brand\" type=\"button\">Save</button>\n <button class=\"wu-btn brand caret\" type=\"button\" popovertarget=\"more-save\" aria-label=\"More save options\"></button>\n</div>\n<div id=\"more-save\" popover>Save as draft</div>"
548
+ },
549
+ {
550
+ "lang": "html",
551
+ "code": "<div class=\"wu-btn-group\" role=\"radiogroup\" aria-label=\"Align\">\n <label class=\"wu-btn\"><input type=\"radio\" name=\"align\" class=\"sr-only\" checked> Left</label>\n <label class=\"wu-btn\"><input type=\"radio\" name=\"align\" class=\"sr-only\"> Right</label>\n</div>"
552
+ },
553
+ {
554
+ "lang": "html",
555
+ "code": "<div class=\"wu-btn-group vertical\" role=\"group\" aria-label=\"View\">\n <button class=\"wu-btn\" type=\"button\" aria-pressed=\"true\">List</button>\n <button class=\"wu-btn\" type=\"button\" aria-pressed=\"false\">Grid</button>\n</div>"
556
+ }
557
+ ],
558
+ "modifiers": [
559
+ {
560
+ "names": [
561
+ "vertical"
562
+ ],
563
+ "description": "Stacks the buttons in a column",
564
+ "since": "1.0.0"
565
+ },
566
+ {
567
+ "names": [
568
+ "brand",
569
+ "danger",
570
+ "quiet"
571
+ ],
572
+ "description": "On two neighbor buttons: a divider line between them, for split buttons",
573
+ "since": "1.0.0"
574
+ }
575
+ ],
576
+ "parts": [],
577
+ "variables": [],
578
+ "states": [
579
+ {
580
+ "names": [
581
+ "aria-pressed=\"true\""
582
+ ],
583
+ "description": "Toggle on: selected tint and an inner ring; a checked input inside the label does the same",
584
+ "since": "1.0.0"
585
+ }
586
+ ],
587
+ "changed": []
588
+ },
589
+ {
590
+ "name": "button",
591
+ "root": "wu-btn",
592
+ "summary": "Buttons for actions, in roles and sizes, with a caret for menus and split buttons.",
593
+ "notes": [
594
+ "A `button` element is the default; an `a` element with `wu-btn` looks the same for navigation.",
595
+ "Inside a `wu-field-group sm` or `lg`, a button without its own size takes the group size."
596
+ ],
597
+ "since": "1.0.0",
598
+ "needs": [],
599
+ "js": {
600
+ "mode": "none",
601
+ "exports": []
602
+ },
603
+ "examples": [
604
+ {
605
+ "lang": "html",
606
+ "code": "<button class=\"wu-btn\" type=\"button\">Cancel</button>\n<button class=\"wu-btn brand\" type=\"button\">Save</button>\n<button class=\"wu-btn danger subtle sm\" type=\"button\">Delete</button>"
607
+ },
608
+ {
609
+ "lang": "html",
610
+ "code": "<button class=\"wu-btn icon round\" type=\"button\" aria-label=\"Settings\">\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"4\" /></svg>\n</button>\n<button class=\"wu-btn brand\" type=\"button\" aria-busy=\"true\">Saving</button>"
611
+ },
612
+ {
613
+ "lang": "html",
614
+ "code": "<button class=\"wu-btn caret\" type=\"button\" popovertarget=\"actions\">Actions</button>\n<div id=\"actions\" popover>Menu content</div>"
615
+ }
616
+ ],
617
+ "modifiers": [
618
+ {
619
+ "names": [
620
+ "brand"
621
+ ],
622
+ "description": "Solid brand fill for the main action",
623
+ "since": "1.0.0"
624
+ },
625
+ {
626
+ "names": [
627
+ "danger"
628
+ ],
629
+ "description": "Solid danger fill for destructive actions",
630
+ "since": "1.0.0"
631
+ },
632
+ {
633
+ "names": [
634
+ "subtle"
635
+ ],
636
+ "description": "With `brand` or `danger`: tinted fill and border, solid on hover",
637
+ "since": "1.0.0"
638
+ },
639
+ {
640
+ "names": [
641
+ "quiet"
642
+ ],
643
+ "description": "No border or fill until hover",
644
+ "since": "1.0.0"
645
+ },
646
+ {
647
+ "names": [
648
+ "link"
649
+ ],
650
+ "description": "Looks like a link, no padding, keeps the control height",
651
+ "since": "1.0.0"
652
+ },
653
+ {
654
+ "names": [
655
+ "round"
656
+ ],
657
+ "description": "Pill shape; a circle when the button is empty or holds only an svg",
658
+ "since": "1.0.0"
659
+ },
660
+ {
661
+ "names": [
662
+ "icon"
663
+ ],
664
+ "description": "Square button for one svg and no text; give it an `aria-label`",
665
+ "since": "1.0.0"
666
+ },
667
+ {
668
+ "names": [
669
+ "caret"
670
+ ],
671
+ "description": "Adds a caret after the label; an empty caret button with an `aria-label` is a narrow caret-only button for split buttons",
672
+ "since": "1.0.0"
673
+ },
674
+ {
675
+ "names": [
676
+ "sm",
677
+ "lg"
678
+ ],
679
+ "description": "Small or large control height and font size",
680
+ "since": "1.0.0"
681
+ },
682
+ {
683
+ "names": [
684
+ "animated"
685
+ ],
686
+ "description": "Spring press scale when the user allows motion; `wu-animated` on an ancestor or `wu-btn-group animated` does the same",
687
+ "since": "1.0.0"
688
+ }
689
+ ],
690
+ "parts": [],
691
+ "variables": [
692
+ {
693
+ "names": [
694
+ "--wu-btn--CaretSize"
695
+ ],
696
+ "description": "Size of the caret",
697
+ "since": "1.0.0",
698
+ "default": "0.4em"
699
+ }
700
+ ],
701
+ "states": [
702
+ {
703
+ "names": [
704
+ "disabled",
705
+ "aria-disabled=\"true\""
706
+ ],
707
+ "description": "Half opacity, no pointer events",
708
+ "since": "1.0.0"
709
+ },
710
+ {
711
+ "names": [
712
+ "aria-busy=\"true\""
713
+ ],
714
+ "description": "Loading: blocks pointer clicks and keeps full opacity",
715
+ "since": "1.0.0"
716
+ },
717
+ {
718
+ "names": [
719
+ ":popover-open"
720
+ ],
721
+ "description": "The caret turns while the popover right after the button is open",
722
+ "since": "1.0.0"
723
+ }
724
+ ],
725
+ "changed": []
726
+ },
727
+ {
728
+ "name": "card",
729
+ "root": "wu-card",
730
+ "summary": "Bordered surface that groups a header, a body and a footer.",
731
+ "notes": [
732
+ "Put one real link, usually in the title, on `wu-card-link` to make the whole card clickable. Other controls stay clickable above it."
733
+ ],
734
+ "since": "1.0.0",
735
+ "needs": [],
736
+ "js": {
737
+ "mode": "none",
738
+ "exports": []
739
+ },
740
+ "examples": [
741
+ {
742
+ "lang": "html",
743
+ "code": "<div class=\"wu-card\">\n <div class=\"wu-card-header\"><h3 class=\"wu-card-title\">Plan</h3></div>\n <div class=\"wu-card-body\">Everything you need to start.</div>\n <div class=\"wu-card-footer\"><button class=\"wu-btn brand\" type=\"button\">Choose</button></div>\n</div>"
744
+ },
745
+ {
746
+ "lang": "html",
747
+ "code": "<div class=\"wu-card\">\n <div class=\"wu-card-body\">\n <h3 class=\"wu-card-title\"><a class=\"wu-card-link\" href=\"/docs/\">Read the docs</a></h3>\n <p>Guides for every component.</p>\n </div>\n</div>"
748
+ }
749
+ ],
750
+ "modifiers": [],
751
+ "parts": [
752
+ {
753
+ "names": [
754
+ "wu-card-header"
755
+ ],
756
+ "description": "Top row for a title and actions, with a bottom border",
757
+ "since": "1.0.0"
758
+ },
759
+ {
760
+ "names": [
761
+ "wu-card-title"
762
+ ],
763
+ "description": "Heading inside the header or body",
764
+ "since": "1.0.0"
765
+ },
766
+ {
767
+ "names": [
768
+ "wu-card-body"
769
+ ],
770
+ "description": "Main content; it grows so footers line up across a row of cards",
771
+ "since": "1.0.0"
772
+ },
773
+ {
774
+ "names": [
775
+ "wu-card-footer"
776
+ ],
777
+ "description": "Bottom row for actions, aligned to the end, with a top border",
778
+ "since": "1.0.0"
779
+ },
780
+ {
781
+ "names": [
782
+ "wu-card-link"
783
+ ],
784
+ "description": "Link stretched over the whole card",
785
+ "since": "1.0.0"
786
+ }
787
+ ],
788
+ "variables": [
789
+ {
790
+ "names": [
791
+ "--wu-card--Padding"
792
+ ],
793
+ "description": "Padding of the header, body and footer",
794
+ "since": "1.0.0",
795
+ "default": "var(--wu-space-5)"
796
+ }
797
+ ],
798
+ "states": [],
799
+ "changed": []
800
+ },
801
+ {
802
+ "name": "checkbox",
803
+ "root": "wu-checkbox",
804
+ "summary": "Custom checkbox with a label, a check mark and an indeterminate dash.",
805
+ "notes": [
806
+ "The box is 1em, so it follows the root type size. The `wu-checkbox-input` part also works alone with an `aria-label`.",
807
+ "Inside a `wu-field-group sm` or `lg`, a checkbox without its own size takes the group size."
808
+ ],
809
+ "since": "1.0.0",
810
+ "needs": [],
811
+ "js": {
812
+ "mode": "none",
813
+ "exports": []
814
+ },
815
+ "examples": [
816
+ {
817
+ "lang": "html",
818
+ "code": "<label class=\"wu-checkbox\">\n <input type=\"checkbox\" class=\"wu-checkbox-input\" name=\"terms\" checked>\n <span class=\"wu-checkbox-label\">I accept the terms</span>\n</label>"
819
+ },
820
+ {
821
+ "lang": "html",
822
+ "code": "<label class=\"wu-checkbox sm\">\n <input type=\"checkbox\" class=\"wu-checkbox-input\" name=\"news\" disabled>\n <span class=\"wu-checkbox-label\">Send the newsletter</span>\n</label>\n<input type=\"checkbox\" class=\"wu-checkbox-input\" name=\"all\" aria-label=\"Select all\">"
823
+ }
824
+ ],
825
+ "modifiers": [
826
+ {
827
+ "names": [
828
+ "sm",
829
+ "lg"
830
+ ],
831
+ "description": "Small or large font size, and so box size",
832
+ "since": "1.0.0"
833
+ }
834
+ ],
835
+ "parts": [
836
+ {
837
+ "names": [
838
+ "wu-checkbox-input"
839
+ ],
840
+ "description": "The `input` drawn as a box",
841
+ "since": "1.0.0"
842
+ },
843
+ {
844
+ "names": [
845
+ "wu-checkbox-label"
846
+ ],
847
+ "description": "Label text next to the box",
848
+ "since": "1.0.0"
849
+ }
850
+ ],
851
+ "variables": [],
852
+ "states": [
853
+ {
854
+ "names": [
855
+ "checked"
856
+ ],
857
+ "description": "Brand fill with a check mark",
858
+ "since": "1.0.0"
859
+ },
860
+ {
861
+ "names": [
862
+ "indeterminate"
863
+ ],
864
+ "description": "Brand fill with a dash",
865
+ "since": "1.0.0"
866
+ },
867
+ {
868
+ "names": [
869
+ "disabled"
870
+ ],
871
+ "description": "Half opacity and a not-allowed cursor",
872
+ "since": "1.0.0"
873
+ },
874
+ {
875
+ "names": [
876
+ "aria-invalid=\"true\""
877
+ ],
878
+ "description": "Danger edge that stays on hover and when checked",
879
+ "since": "1.0.0"
880
+ }
881
+ ],
882
+ "changed": []
883
+ },
884
+ {
885
+ "name": "code-block",
886
+ "root": "wu-code-block",
887
+ "summary": "Scrollable block for code, with edge shadows when the content overflows.",
888
+ "notes": [
889
+ "Use `pre` with `code` inside, and add `tabindex=\"0\"` and an `aria-label` so keyboard users can scroll it.",
890
+ "For line numbers, wrap each line in a `wu-code-block-line` span. The numbers are not copied or read aloud."
891
+ ],
892
+ "since": "1.0.0",
893
+ "needs": [],
894
+ "js": {
895
+ "mode": "none",
896
+ "exports": []
897
+ },
898
+ "examples": [
899
+ {
900
+ "lang": "html",
901
+ "code": "<pre class=\"wu-code-block\" tabindex=\"0\" aria-label=\"Install command\"><code>pnpm add @wovenui/components</code></pre>"
902
+ },
903
+ {
904
+ "lang": "html",
905
+ "code": "<pre class=\"wu-code-block\" tabindex=\"0\" aria-label=\"Example\"><code><span class=\"wu-code-block-line\">const a = 1;</span>\n<span class=\"wu-code-block-line\">const b = 2;</span></code></pre>"
906
+ }
907
+ ],
908
+ "modifiers": [],
909
+ "parts": [
910
+ {
911
+ "names": [
912
+ "wu-code-block-line"
913
+ ],
914
+ "description": "Inline span for one line, with an optional line number",
915
+ "since": "1.0.0"
916
+ }
917
+ ],
918
+ "variables": [
919
+ {
920
+ "names": [
921
+ "--wu-code-block--Background"
922
+ ],
923
+ "description": "Background of the block and of its scroll shadow covers",
924
+ "since": "1.0.0",
925
+ "default": "var(--wu-bg-alternate)"
926
+ },
927
+ {
928
+ "names": [
929
+ "--wu-code-block--FontFamily"
930
+ ],
931
+ "description": "Font family; the default is a system monospace stack",
932
+ "since": "1.0.0",
933
+ "default": "ui-monospace"
934
+ }
935
+ ],
936
+ "states": [
937
+ {
938
+ "names": [
939
+ ":focus-visible"
940
+ ],
941
+ "description": "Focus ring, for the scrollable block",
942
+ "since": "1.0.0"
943
+ }
944
+ ],
945
+ "changed": []
946
+ },
947
+ {
948
+ "name": "confirm-modal",
949
+ "root": "wu-confirm-modal",
950
+ "summary": "Dialog that asks the user to confirm or cancel an action, with a title, a message and two buttons.",
951
+ "notes": [
952
+ "Builds on `wu-modal` for open, close, backdrop and motion, and on `wu-btn` for the actions. Use `role=\"alertdialog\"`.",
953
+ "The subject is optional and names the object. `danger` gives the message full weight; the confirming button takes `wu-btn danger`. `dialog.returnValue` holds the value of the button that closed it."
954
+ ],
955
+ "since": "1.0.0",
956
+ "needs": [
957
+ "modal",
958
+ "button"
959
+ ],
960
+ "js": {
961
+ "mode": "none",
962
+ "exports": []
963
+ },
964
+ "examples": [
965
+ {
966
+ "lang": "html",
967
+ "code": "<button class=\"wu-btn\" type=\"button\" commandfor=\"c1\" command=\"show-modal\">Delete</button>\n<dialog class=\"wu-modal wu-confirm-modal danger\" id=\"c1\" role=\"alertdialog\" aria-labelledby=\"c1-title\" aria-describedby=\"c1-subject c1-message\">\n <h2 class=\"wu-confirm-modal-title\" id=\"c1-title\">Delete project?</h2>\n <p class=\"wu-confirm-modal-subject\" id=\"c1-subject\">Website redesign</p>\n <p class=\"wu-confirm-modal-message\" id=\"c1-message\">This cannot be undone.</p>\n <form class=\"wu-confirm-modal-actions\" method=\"dialog\">\n <button class=\"wu-btn\" value=\"cancel\" autofocus>Cancel</button>\n <button class=\"wu-btn danger\" value=\"confirm\">Delete</button>\n </form>\n</dialog>"
968
+ }
969
+ ],
970
+ "modifiers": [
971
+ {
972
+ "names": [
973
+ "danger"
974
+ ],
975
+ "description": "Message at full contrast and body size, for destructive actions",
976
+ "since": "1.0.0"
977
+ }
978
+ ],
979
+ "parts": [
980
+ {
981
+ "names": [
982
+ "wu-confirm-modal-title"
983
+ ],
984
+ "description": "Heading that names the question",
985
+ "since": "1.0.0"
986
+ },
987
+ {
988
+ "names": [
989
+ "wu-confirm-modal-subject"
990
+ ],
991
+ "description": "Optional line that names the object the action applies to",
992
+ "since": "1.0.0"
993
+ },
994
+ {
995
+ "names": [
996
+ "wu-confirm-modal-message"
997
+ ],
998
+ "description": "Supporting text about the consequence",
999
+ "since": "1.0.0"
1000
+ },
1001
+ {
1002
+ "names": [
1003
+ "wu-confirm-modal-actions"
1004
+ ],
1005
+ "description": "Form that holds the buttons, aligned to the end",
1006
+ "since": "1.0.0"
1007
+ }
1008
+ ],
1009
+ "variables": [
1010
+ {
1011
+ "names": [
1012
+ "--wu-confirm-modal--Width"
1013
+ ],
1014
+ "description": "Width of the dialog",
1015
+ "since": "1.0.0",
1016
+ "default": "26rem"
1017
+ }
1018
+ ],
1019
+ "states": [],
1020
+ "changed": []
1021
+ },
1022
+ {
1023
+ "name": "data-table",
1024
+ "root": "wu-data-table",
1025
+ "summary": "Sortable table: click a header to sort rows by text or number.",
1026
+ "notes": [
1027
+ "Add it to a `wu-table`; the sort button and arrows come from the table component, and the kit script sorts the first `tbody` and sets `aria-sort`. A `data-sort-value` on a cell wins over its text.",
1028
+ "The script adds a `wu-data-table-status` live region after the table and announces each sort there."
1029
+ ],
1030
+ "since": "1.0.0",
1031
+ "needs": [
1032
+ "table"
1033
+ ],
1034
+ "js": {
1035
+ "mode": "required",
1036
+ "exports": [
1037
+ "initDataTable"
1038
+ ]
1039
+ },
1040
+ "examples": [
1041
+ {
1042
+ "lang": "html",
1043
+ "code": "<table class=\"wu-table wu-data-table\">\n <thead>\n <tr>\n <th scope=\"col\" aria-sort=\"ascending\"><button class=\"wu-table-sort\" type=\"button\">Name</button></th>\n <th scope=\"col\" class=\"wu-table-num\"><button class=\"wu-table-sort\" type=\"button\">Amount</button></th>\n </tr>\n </thead>\n <tbody>\n <tr><td>Ada</td><td class=\"wu-table-num\" data-sort-value=\"1200\">$1,200</td></tr>\n <tr><td>Grace</td><td class=\"wu-table-num\" data-sort-value=\"950\">$950</td></tr>\n </tbody>\n</table>"
1044
+ }
1045
+ ],
1046
+ "modifiers": [
1047
+ {
1048
+ "names": [
1049
+ "animated"
1050
+ ],
1051
+ "description": "Rows glide to their new place when the user allows motion; `wu-animated` on an ancestor does the same",
1052
+ "since": "1.0.0"
1053
+ }
1054
+ ],
1055
+ "parts": [
1056
+ {
1057
+ "names": [
1058
+ "wu-data-table-status"
1059
+ ],
1060
+ "description": "Visually hidden live region added by the script to announce each sort",
1061
+ "since": "1.0.0"
1062
+ },
1063
+ {
1064
+ "names": [
1065
+ "wu-data-table-row"
1066
+ ],
1067
+ "description": "View transition class, not an HTML class, set on body rows while they move; target `::view-transition-group(*.wu-data-table-row)` to restyle the glide",
1068
+ "since": "1.0.0"
1069
+ }
1070
+ ],
1071
+ "variables": [],
1072
+ "states": [
1073
+ {
1074
+ "names": [
1075
+ "aria-sort=\"ascending\""
1076
+ ],
1077
+ "description": "Header cell sorted ascending, set by the script",
1078
+ "since": "1.0.0"
1079
+ },
1080
+ {
1081
+ "names": [
1082
+ "aria-sort=\"descending\""
1083
+ ],
1084
+ "description": "Header cell sorted descending, set by the script",
1085
+ "since": "1.0.0"
1086
+ },
1087
+ {
1088
+ "names": [
1089
+ "aria-busy=\"true\""
1090
+ ],
1091
+ "description": "Set while rows move: progress cursor, and the row animation runs",
1092
+ "since": "1.0.0"
1093
+ }
1094
+ ],
1095
+ "changed": []
1096
+ },
1097
+ {
1098
+ "name": "desc-list",
1099
+ "root": "wu-desc-list",
1100
+ "summary": "Description list of terms and values, plain, divided, bordered or in columns.",
1101
+ "notes": [
1102
+ "Use a `dl`; wrap each pair in a `div` for divided, bordered and column layouts."
1103
+ ],
1104
+ "since": "1.0.0",
1105
+ "needs": [],
1106
+ "js": {
1107
+ "mode": "none",
1108
+ "exports": []
1109
+ },
1110
+ "examples": [
1111
+ {
1112
+ "lang": "html",
1113
+ "code": "<dl class=\"wu-desc-list horizontal divided\">\n <div><dt>Name</dt><dd>Ada Lovelace</dd></div>\n <div><dt>Role</dt><dd>Engineer</dd></div>\n</dl>"
1114
+ },
1115
+ {
1116
+ "lang": "html",
1117
+ "code": "<dl class=\"wu-desc-list bordered\">\n <div><dt>Plan</dt><dd>Team</dd></div>\n <div><dt>Seats</dt><dd>12</dd></div>\n</dl>"
1118
+ },
1119
+ {
1120
+ "lang": "html",
1121
+ "code": "<dl class=\"wu-desc-list columns\">\n <div><dt>City</dt><dd>Berlin</dd></div>\n <div><dt>Country</dt><dd>Germany</dd></div>\n <div><dt>Timezone</dt><dd>CET</dd></div>\n</dl>"
1122
+ }
1123
+ ],
1124
+ "modifiers": [
1125
+ {
1126
+ "names": [
1127
+ "horizontal"
1128
+ ],
1129
+ "description": "Terms in a column beside their descriptions",
1130
+ "since": "1.0.0"
1131
+ },
1132
+ {
1133
+ "names": [
1134
+ "divided"
1135
+ ],
1136
+ "description": "Lines between the `div` pairs",
1137
+ "since": "1.0.0"
1138
+ },
1139
+ {
1140
+ "names": [
1141
+ "bordered"
1142
+ ],
1143
+ "description": "Table look: lines around every cell, terms on the alternate background",
1144
+ "since": "1.0.0"
1145
+ },
1146
+ {
1147
+ "names": [
1148
+ "columns"
1149
+ ],
1150
+ "description": "Several pairs per row; with `bordered`, each pair is a term cell beside its description",
1151
+ "since": "1.0.0"
1152
+ }
1153
+ ],
1154
+ "parts": [],
1155
+ "variables": [
1156
+ {
1157
+ "names": [
1158
+ "--wu-desc-list--TermWidth"
1159
+ ],
1160
+ "description": "Width of the term column in `horizontal` and `bordered`",
1161
+ "since": "1.0.0",
1162
+ "default": "fit-content(40%)"
1163
+ },
1164
+ {
1165
+ "names": [
1166
+ "--wu-desc-list--Columns"
1167
+ ],
1168
+ "description": "Most pairs per row in `columns`",
1169
+ "since": "1.0.0",
1170
+ "default": "3"
1171
+ },
1172
+ {
1173
+ "names": [
1174
+ "--wu-desc-list--ColumnWidth"
1175
+ ],
1176
+ "description": "Narrowest a pair gets in `columns` before a row holds fewer",
1177
+ "since": "1.0.0",
1178
+ "default": "10rem"
1179
+ }
1180
+ ],
1181
+ "states": [],
1182
+ "changed": []
1183
+ },
1184
+ {
1185
+ "name": "divider",
1186
+ "root": "wu-divider",
1187
+ "summary": "Horizontal or vertical separator line, optionally with a text label between two lines.",
1188
+ "notes": [
1189
+ "Use an `hr` element. `aria-orientation=\"vertical\"` turns it into a vertical line between inline items. With content, the text is read and the lines are decoration."
1190
+ ],
1191
+ "since": "1.0.0",
1192
+ "needs": [],
1193
+ "js": {
1194
+ "mode": "none",
1195
+ "exports": []
1196
+ },
1197
+ "examples": [
1198
+ {
1199
+ "lang": "html",
1200
+ "code": "<hr class=\"wu-divider\">\n<hr class=\"wu-divider dashed\">"
1201
+ },
1202
+ {
1203
+ "lang": "html",
1204
+ "code": "<div class=\"wu-divider\">or</div>"
1205
+ },
1206
+ {
1207
+ "lang": "html",
1208
+ "code": "<span>Edit</span><hr class=\"wu-divider\" aria-orientation=\"vertical\"><span>Share</span>"
1209
+ }
1210
+ ],
1211
+ "modifiers": [
1212
+ {
1213
+ "names": [
1214
+ "dashed"
1215
+ ],
1216
+ "description": "Dashed line, also on the lines beside a label",
1217
+ "since": "1.0.0"
1218
+ }
1219
+ ],
1220
+ "parts": [],
1221
+ "variables": [],
1222
+ "states": [
1223
+ {
1224
+ "names": [
1225
+ "aria-orientation=\"vertical\""
1226
+ ],
1227
+ "description": "Vertical line that stretches to the row height",
1228
+ "since": "1.0.0"
1229
+ },
1230
+ {
1231
+ "names": [
1232
+ ":not(:empty)"
1233
+ ],
1234
+ "description": "With content: the text sits between two lines",
1235
+ "since": "1.0.0"
1236
+ }
1237
+ ],
1238
+ "changed": []
1239
+ },
1240
+ {
1241
+ "name": "dot",
1242
+ "root": "wu-dot",
1243
+ "summary": "Small status dot for use next to status text, tinted by role.",
1244
+ "notes": [
1245
+ "Add `aria-hidden=\"true\"` and put the meaning in the text beside it. `success`, `warning` and `danger` also change the shape (check, triangle, octagon), so color is never the only signal.",
1246
+ "A corner dot pins to a `wu-badge-host`, the same wrapper a corner badge uses, and reads `--wu-badge--Offset` and `--wu-avatar--RingColor` from the badge and avatar."
1247
+ ],
1248
+ "since": "1.0.0",
1249
+ "needs": [],
1250
+ "js": {
1251
+ "mode": "none",
1252
+ "exports": []
1253
+ },
1254
+ "examples": [
1255
+ {
1256
+ "lang": "html",
1257
+ "code": "<span class=\"wu-dot success\" aria-hidden=\"true\"></span> Online"
1258
+ },
1259
+ {
1260
+ "lang": "html",
1261
+ "code": "<span class=\"wu-dot danger animated\" aria-hidden=\"true\"></span> Live"
1262
+ },
1263
+ {
1264
+ "lang": "html",
1265
+ "code": "<span class=\"wu-badge-host\">\n <button class=\"wu-btn\" type=\"button\" aria-label=\"Inbox, new messages\">Inbox</button>\n <span class=\"wu-dot corner brand\" aria-hidden=\"true\"></span>\n</span>"
1266
+ }
1267
+ ],
1268
+ "modifiers": [
1269
+ {
1270
+ "names": [
1271
+ "brand",
1272
+ "success",
1273
+ "danger",
1274
+ "warning",
1275
+ "info"
1276
+ ],
1277
+ "description": "Role color; success, warning and danger also change the shape",
1278
+ "since": "1.0.0"
1279
+ },
1280
+ {
1281
+ "names": [
1282
+ "corner"
1283
+ ],
1284
+ "description": "Pins the dot to the top inline-end corner of a `wu-badge-host`",
1285
+ "since": "1.0.0"
1286
+ },
1287
+ {
1288
+ "names": [
1289
+ "animated"
1290
+ ],
1291
+ "description": "Fading ring for live status when the user allows motion; `wu-animated` on an ancestor does the same",
1292
+ "since": "1.0.0"
1293
+ }
1294
+ ],
1295
+ "parts": [],
1296
+ "variables": [
1297
+ {
1298
+ "names": [
1299
+ "--wu-dot--Size"
1300
+ ],
1301
+ "description": "Width and height of the dot",
1302
+ "since": "1.0.0",
1303
+ "default": "var(--wu-space-2)"
1304
+ }
1305
+ ],
1306
+ "states": [],
1307
+ "changed": []
1308
+ },
1309
+ {
1310
+ "name": "drawer",
1311
+ "root": "wu-drawer",
1312
+ "summary": "Side panel on the native `dialog` element, docked to the inline end, the inline start or the bottom.",
1313
+ "notes": [
1314
+ "Opens with invoker commands (`commandfor` and `command`), no script. With `show-modal` the page does not scroll while it is open; the page keeps its scrollbar gutter so it does not shift. `show` opens it non-modal and leaves the page alone.",
1315
+ "Docks to the inline end by default; `inline-start` or `bottom` moves it. Right-to-left pages mirror the slide."
1316
+ ],
1317
+ "since": "1.0.0",
1318
+ "needs": [],
1319
+ "js": {
1320
+ "mode": "none",
1321
+ "exports": []
1322
+ },
1323
+ "examples": [
1324
+ {
1325
+ "lang": "html",
1326
+ "code": "<button class=\"wu-btn\" type=\"button\" commandfor=\"d1\" command=\"show-modal\">Filters</button>\n<dialog class=\"wu-drawer\" id=\"d1\" aria-labelledby=\"d1-title\" closedby=\"any\">\n <header class=\"wu-drawer-header\">\n <h2 class=\"wu-drawer-title\" id=\"d1-title\">Filters</h2>\n <button class=\"wu-drawer-close\" type=\"button\" commandfor=\"d1\" command=\"close\" aria-label=\"Close\"></button>\n </header>\n <div class=\"wu-drawer-body\">Content</div>\n <form class=\"wu-drawer-footer\" method=\"dialog\">\n <button class=\"wu-btn brand\">Apply</button>\n </form>\n</dialog>"
1327
+ },
1328
+ {
1329
+ "lang": "html",
1330
+ "code": "<dialog class=\"wu-drawer bottom animated\" id=\"d2\" aria-label=\"Details\" closedby=\"any\">\n <div class=\"wu-drawer-body\">Content</div>\n</dialog>"
1331
+ }
1332
+ ],
1333
+ "modifiers": [
1334
+ {
1335
+ "names": [
1336
+ "inline-start"
1337
+ ],
1338
+ "description": "Docks to the inline start instead of the inline end",
1339
+ "since": "1.0.0"
1340
+ },
1341
+ {
1342
+ "names": [
1343
+ "bottom"
1344
+ ],
1345
+ "description": "Docks to the bottom edge with rounded top corners, up to `--wu-drawer--MaxHeight`",
1346
+ "since": "1.0.0"
1347
+ },
1348
+ {
1349
+ "names": [
1350
+ "animated"
1351
+ ],
1352
+ "description": "Slides in from its edge and fades the backdrop when the user allows motion; `wu-animated` on an ancestor does the same",
1353
+ "since": "1.0.0"
1354
+ }
1355
+ ],
1356
+ "parts": [
1357
+ {
1358
+ "names": [
1359
+ "wu-drawer-header"
1360
+ ],
1361
+ "description": "Top row with the title and close button",
1362
+ "since": "1.0.0"
1363
+ },
1364
+ {
1365
+ "names": [
1366
+ "wu-drawer-title"
1367
+ ],
1368
+ "description": "Heading in the header",
1369
+ "since": "1.0.0"
1370
+ },
1371
+ {
1372
+ "names": [
1373
+ "wu-drawer-body"
1374
+ ],
1375
+ "description": "Scrolling content area that fills the drawer",
1376
+ "since": "1.0.0"
1377
+ },
1378
+ {
1379
+ "names": [
1380
+ "wu-drawer-footer"
1381
+ ],
1382
+ "description": "Bottom row for actions, aligned to the inline end",
1383
+ "since": "1.0.0"
1384
+ },
1385
+ {
1386
+ "names": [
1387
+ "wu-drawer-close"
1388
+ ],
1389
+ "description": "Close button drawn by the shared close style; give it an `aria-label`",
1390
+ "since": "1.0.0"
1391
+ }
1392
+ ],
1393
+ "variables": [
1394
+ {
1395
+ "names": [
1396
+ "--wu-drawer--Width"
1397
+ ],
1398
+ "description": "Drawer width when docked to a side",
1399
+ "since": "1.0.0",
1400
+ "default": "24rem"
1401
+ },
1402
+ {
1403
+ "names": [
1404
+ "--wu-drawer--MaxHeight"
1405
+ ],
1406
+ "description": "Maximum height of a bottom drawer",
1407
+ "since": "1.0.0",
1408
+ "default": "75dvh"
1409
+ },
1410
+ {
1411
+ "names": [
1412
+ "--wu-drawer--Backdrop"
1413
+ ],
1414
+ "description": "Color behind a modal drawer",
1415
+ "since": "1.0.0",
1416
+ "default": "50% black, 70% in dark themes"
1417
+ }
1418
+ ],
1419
+ "states": [
1420
+ {
1421
+ "names": [
1422
+ "open"
1423
+ ],
1424
+ "description": "Shown as a flex column so the body scrolls between header and footer",
1425
+ "since": "1.0.0"
1426
+ },
1427
+ {
1428
+ "names": [
1429
+ ":modal"
1430
+ ],
1431
+ "description": "Locks page scroll while the drawer is open with `show-modal`",
1432
+ "since": "1.0.0"
1433
+ }
1434
+ ],
1435
+ "changed": []
1436
+ },
1437
+ {
1438
+ "name": "dropdown",
1439
+ "root": "wu-dropdown",
1440
+ "summary": "Menu of links and buttons in a native popover, anchored under its trigger.",
1441
+ "notes": [
1442
+ "A button with `popovertarget` opens it; `commandfor` with `command=\"toggle-popover\"` works as the trigger too. Esc and a click outside close it. `popovertargetaction=\"hide\"` on a button item closes the menu after its click handler runs.",
1443
+ "Opens under the trigger where anchor positioning exists and flips when there is no room; elsewhere it is centered in the viewport. Engines without implicit anchors need `anchor-name` on the trigger and `position-anchor` on the menu, with the same name.",
1444
+ "`inline-end` aligns the menu's inline end with the trigger's, as for the caret of a split button."
1445
+ ],
1446
+ "since": "1.0.0",
1447
+ "needs": [],
1448
+ "js": {
1449
+ "mode": "none",
1450
+ "exports": []
1451
+ },
1452
+ "examples": [
1453
+ {
1454
+ "lang": "html",
1455
+ "code": "<button class=\"wu-btn caret\" type=\"button\" popovertarget=\"menu1\">Actions</button>\n<div class=\"wu-dropdown\" id=\"menu1\" popover>\n <a class=\"wu-dropdown-item\" href=\"/edit\">Edit</a>\n <button class=\"wu-dropdown-item\" type=\"button\" popovertarget=\"menu1\" popovertargetaction=\"hide\">Duplicate</button>\n <hr class=\"wu-dropdown-separator\">\n <button class=\"wu-dropdown-item danger\" type=\"button\" popovertarget=\"menu1\" popovertargetaction=\"hide\">Delete</button>\n</div>"
1456
+ }
1457
+ ],
1458
+ "modifiers": [
1459
+ {
1460
+ "names": [
1461
+ "inline-end"
1462
+ ],
1463
+ "description": "Aligns the menu's inline end with the trigger's inline end",
1464
+ "since": "1.0.0"
1465
+ },
1466
+ {
1467
+ "names": [
1468
+ "danger"
1469
+ ],
1470
+ "description": "On an item: danger text and a danger hover tint",
1471
+ "since": "1.0.0"
1472
+ },
1473
+ {
1474
+ "names": [
1475
+ "animated"
1476
+ ],
1477
+ "description": "Fades and slides in and out when the user allows motion; `wu-animated` on an ancestor does the same",
1478
+ "since": "1.0.0"
1479
+ }
1480
+ ],
1481
+ "parts": [
1482
+ {
1483
+ "names": [
1484
+ "wu-dropdown-item"
1485
+ ],
1486
+ "description": "Link or button row in the menu; an `svg` child is sized as an icon",
1487
+ "since": "1.0.0"
1488
+ },
1489
+ {
1490
+ "names": [
1491
+ "wu-dropdown-separator"
1492
+ ],
1493
+ "description": "Line between groups of items; use an `hr`",
1494
+ "since": "1.0.0"
1495
+ }
1496
+ ],
1497
+ "variables": [
1498
+ {
1499
+ "names": [
1500
+ "--wu-dropdown--MinWidth"
1501
+ ],
1502
+ "description": "Minimum menu width",
1503
+ "since": "1.0.0",
1504
+ "default": "10rem"
1505
+ },
1506
+ {
1507
+ "names": [
1508
+ "--wu-dropdown--MaxHeight"
1509
+ ],
1510
+ "description": "Maximum menu height before it scrolls",
1511
+ "since": "1.0.0",
1512
+ "default": "20rem"
1513
+ }
1514
+ ],
1515
+ "states": [
1516
+ {
1517
+ "names": [
1518
+ "disabled",
1519
+ "aria-disabled=\"true\""
1520
+ ],
1521
+ "description": "On an item: half opacity, no pointer events",
1522
+ "since": "1.0.0"
1523
+ },
1524
+ {
1525
+ "names": [
1526
+ ":popover-open"
1527
+ ],
1528
+ "description": "A plain trigger button right before the menu takes a hover look while it is open",
1529
+ "since": "1.0.0"
1530
+ }
1531
+ ],
1532
+ "changed": []
1533
+ },
1534
+ {
1535
+ "name": "empty-state",
1536
+ "root": "wu-empty-state",
1537
+ "summary": "Centered message for a view with no content or a finished result, with an icon, title, text and actions.",
1538
+ "notes": [
1539
+ "The icon slot holds the app's own icon; left empty, it draws a calm empty-box shape. Result roles tint the slot, and an empty slot draws the alert's marker shape.",
1540
+ "The title text carries the meaning (\"Payment received\"); the shape repeats it."
1541
+ ],
1542
+ "since": "1.0.0",
1543
+ "needs": [],
1544
+ "js": {
1545
+ "mode": "none",
1546
+ "exports": []
1547
+ },
1548
+ "examples": [
1549
+ {
1550
+ "lang": "html",
1551
+ "code": "<div class=\"wu-empty-state\">\n <span class=\"wu-empty-state-icon\" aria-hidden=\"true\"></span>\n <h3 class=\"wu-empty-state-title\">No projects yet</h3>\n <p class=\"wu-empty-state-text\">Create a project to get started.</p>\n <div class=\"wu-empty-state-actions\">\n <button class=\"wu-btn brand\" type=\"button\">New project</button>\n </div>\n</div>"
1552
+ },
1553
+ {
1554
+ "lang": "html",
1555
+ "code": "<div class=\"wu-empty-state success sm dashed\">\n <span class=\"wu-empty-state-icon\" aria-hidden=\"true\"></span>\n <h3 class=\"wu-empty-state-title\">Payment received</h3>\n</div>"
1556
+ }
1557
+ ],
1558
+ "modifiers": [
1559
+ {
1560
+ "names": [
1561
+ "dashed"
1562
+ ],
1563
+ "description": "Dashed border and radius around the whole state",
1564
+ "since": "1.0.0"
1565
+ },
1566
+ {
1567
+ "names": [
1568
+ "sm"
1569
+ ],
1570
+ "description": "Compact size for use inside a card, panel or table",
1571
+ "since": "1.0.0"
1572
+ },
1573
+ {
1574
+ "names": [
1575
+ "success",
1576
+ "warning",
1577
+ "danger",
1578
+ "info"
1579
+ ],
1580
+ "description": "Result: tints the icon slot; an empty slot draws the marker shape",
1581
+ "since": "1.0.0"
1582
+ }
1583
+ ],
1584
+ "parts": [
1585
+ {
1586
+ "names": [
1587
+ "wu-empty-state-icon"
1588
+ ],
1589
+ "description": "Round icon slot; empty, it draws a shape",
1590
+ "since": "1.0.0"
1591
+ },
1592
+ {
1593
+ "names": [
1594
+ "wu-empty-state-title"
1595
+ ],
1596
+ "description": "Heading",
1597
+ "since": "1.0.0"
1598
+ },
1599
+ {
1600
+ "names": [
1601
+ "wu-empty-state-text"
1602
+ ],
1603
+ "description": "Supporting text, limited to a readable width",
1604
+ "since": "1.0.0"
1605
+ },
1606
+ {
1607
+ "names": [
1608
+ "wu-empty-state-actions"
1609
+ ],
1610
+ "description": "Centered row for buttons",
1611
+ "since": "1.0.0"
1612
+ }
1613
+ ],
1614
+ "variables": [],
1615
+ "states": [
1616
+ {
1617
+ "names": [
1618
+ ":empty"
1619
+ ],
1620
+ "description": "An empty icon slot draws the empty-box or marker shape",
1621
+ "since": "1.0.0"
1622
+ }
1623
+ ],
1624
+ "changed": []
1625
+ },
1626
+ {
1627
+ "name": "field-group",
1628
+ "root": "wu-field-group",
1629
+ "summary": "Group of fields in a `fieldset`, stacked by default or side by side.",
1630
+ "notes": [
1631
+ "Use a `fieldset` with a `legend` of class `wu-field-group-legend`. A `sm` or `lg` on the group sizes the inputs, affixes and buttons inside it that have no size of their own; that rule lives in the input and button partials."
1632
+ ],
1633
+ "since": "1.0.0",
1634
+ "needs": [],
1635
+ "js": {
1636
+ "mode": "none",
1637
+ "exports": []
1638
+ },
1639
+ "examples": [
1640
+ {
1641
+ "lang": "html",
1642
+ "code": "<fieldset class=\"wu-field-group\">\n <legend class=\"wu-field-group-legend\">Contact</legend>\n <div class=\"wu-field\">\n <label class=\"wu-field-label\" for=\"g-name\">Name</label>\n <input class=\"wu-input\" id=\"g-name\" type=\"text\">\n </div>\n <div class=\"wu-field\">\n <label class=\"wu-field-label\" for=\"g-mail\">Email</label>\n <input class=\"wu-input\" id=\"g-mail\" type=\"email\">\n </div>\n</fieldset>"
1643
+ },
1644
+ {
1645
+ "lang": "html",
1646
+ "code": "<fieldset class=\"wu-field-group horizontal\">\n <legend class=\"wu-field-group-legend\">Dates</legend>\n <div class=\"wu-field\">\n <label class=\"wu-field-label\" for=\"g-from\">From</label>\n <input class=\"wu-input\" id=\"g-from\" type=\"date\">\n </div>\n <div class=\"wu-field\">\n <label class=\"wu-field-label\" for=\"g-to\">To</label>\n <input class=\"wu-input\" id=\"g-to\" type=\"date\">\n </div>\n</fieldset>"
1647
+ }
1648
+ ],
1649
+ "modifiers": [
1650
+ {
1651
+ "names": [
1652
+ "horizontal"
1653
+ ],
1654
+ "description": "Fields side by side, wrapping when narrower than `--wu-field-group--MinWidth`",
1655
+ "since": "1.0.0"
1656
+ }
1657
+ ],
1658
+ "parts": [
1659
+ {
1660
+ "names": [
1661
+ "wu-field-group-legend"
1662
+ ],
1663
+ "description": "Group title",
1664
+ "since": "1.0.0"
1665
+ }
1666
+ ],
1667
+ "variables": [
1668
+ {
1669
+ "names": [
1670
+ "--wu-field-group--MinWidth"
1671
+ ],
1672
+ "description": "Width at which a field in a horizontal group wraps",
1673
+ "since": "1.0.0",
1674
+ "default": "12rem"
1675
+ }
1676
+ ],
1677
+ "states": [],
1678
+ "changed": []
1679
+ },
1680
+ {
1681
+ "name": "field-message",
1682
+ "root": "wu-field-message",
1683
+ "summary": "Hint, error or success text under a form control, with a marker shape for each role.",
1684
+ "notes": [
1685
+ "Link it from the control with `aria-describedby`. The words carry the meaning (\"Error: ...\"); the role adds color and a marker shape: `error` a larger octagon with an exclamation mark, `success` a check, `info` a small circle.",
1686
+ "Inside a `wu-field`, an `error` message stays hidden until the control is invalid."
1687
+ ],
1688
+ "since": "1.0.0",
1689
+ "needs": [],
1690
+ "js": {
1691
+ "mode": "none",
1692
+ "exports": []
1693
+ },
1694
+ "examples": [
1695
+ {
1696
+ "lang": "html",
1697
+ "code": "<p class=\"wu-field-message\" id=\"hint\">Use your work email.</p>\n<p class=\"wu-field-message error\" id=\"err\">Error: enter a valid email.</p>\n<p class=\"wu-field-message success\" id=\"ok\">Email confirmed.</p>\n<p class=\"wu-field-message info\" id=\"note\">We never share it.</p>"
1698
+ }
1699
+ ],
1700
+ "modifiers": [
1701
+ {
1702
+ "names": [
1703
+ "error",
1704
+ "success",
1705
+ "info"
1706
+ ],
1707
+ "description": "Role color and marker shape; error is also medium weight",
1708
+ "since": "1.0.0"
1709
+ }
1710
+ ],
1711
+ "parts": [],
1712
+ "variables": [],
1713
+ "states": [],
1714
+ "changed": []
1715
+ },
1716
+ {
1717
+ "name": "field",
1718
+ "root": "wu-field",
1719
+ "summary": "Form field that stacks a label, a control and its messages, with a required marker and a floating label option.",
1720
+ "notes": [
1721
+ "The required marker comes from `required` or `aria-required=\"true\"` on the control. An `error` message is hidden until the control is invalid. Its id joins `aria-describedby` only while it shows: server-rendered with `aria-invalid=\"true\"`, or added by your script. Leave it out otherwise, so a hidden error is never announced; for `:user-invalid` the browser's own validation message speaks on submit.",
1722
+ "`floating` needs `placeholder=\" \"` on the input and is not used with `horizontal`. `horizontal` puts the label beside the control from the `sm` breakpoint up."
1723
+ ],
1724
+ "since": "1.0.0",
1725
+ "needs": [],
1726
+ "js": {
1727
+ "mode": "none",
1728
+ "exports": []
1729
+ },
1730
+ "examples": [
1731
+ {
1732
+ "lang": "html",
1733
+ "code": "<div class=\"wu-field\">\n <label class=\"wu-field-label\" for=\"f1\">Email</label>\n <input class=\"wu-input\" id=\"f1\" type=\"email\" required aria-describedby=\"f1-hint\">\n <p class=\"wu-field-message\" id=\"f1-hint\">Hint</p>\n <p class=\"wu-field-message error\" id=\"f1-error\">Error: enter a valid email.</p>\n</div>"
1734
+ },
1735
+ {
1736
+ "lang": "html",
1737
+ "code": "<div class=\"wu-field floating animated\">\n <label class=\"wu-field-label\" for=\"f2\">Name</label>\n <input class=\"wu-input\" id=\"f2\" type=\"text\" placeholder=\" \">\n</div>"
1738
+ }
1739
+ ],
1740
+ "modifiers": [
1741
+ {
1742
+ "names": [
1743
+ "horizontal"
1744
+ ],
1745
+ "description": "Label beside the control from `sm` up, in a column of `--wu-field--LabelWidth`",
1746
+ "since": "1.0.0"
1747
+ },
1748
+ {
1749
+ "names": [
1750
+ "error"
1751
+ ],
1752
+ "description": "On a `wu-field-message` inside the field: hidden until the control is invalid",
1753
+ "since": "1.0.0"
1754
+ },
1755
+ {
1756
+ "names": [
1757
+ "floating"
1758
+ ],
1759
+ "description": "Label inside the input, moved up on focus or once filled",
1760
+ "since": "1.0.0"
1761
+ },
1762
+ {
1763
+ "names": [
1764
+ "animated"
1765
+ ],
1766
+ "description": "On a floating field: the label slides when the user allows motion; `wu-animated` on an ancestor does the same",
1767
+ "since": "1.0.0"
1768
+ }
1769
+ ],
1770
+ "parts": [
1771
+ {
1772
+ "names": [
1773
+ "wu-field-label"
1774
+ ],
1775
+ "description": "Label above the control",
1776
+ "since": "1.0.0"
1777
+ }
1778
+ ],
1779
+ "variables": [
1780
+ {
1781
+ "names": [
1782
+ "--wu-field--LabelWidth"
1783
+ ],
1784
+ "description": "Label column width in a horizontal field",
1785
+ "since": "1.0.0",
1786
+ "default": "10rem"
1787
+ }
1788
+ ],
1789
+ "states": [
1790
+ {
1791
+ "names": [
1792
+ ":required",
1793
+ "aria-required=\"true\""
1794
+ ],
1795
+ "description": "On the control: adds a required marker to the label",
1796
+ "since": "1.0.0"
1797
+ },
1798
+ {
1799
+ "names": [
1800
+ "aria-invalid=\"true\"",
1801
+ ":user-invalid"
1802
+ ],
1803
+ "description": "On the control: shows the `error` message",
1804
+ "since": "1.0.0"
1805
+ }
1806
+ ],
1807
+ "changed": []
1808
+ },
1809
+ {
1810
+ "name": "form-actions",
1811
+ "root": "wu-form-actions",
1812
+ "summary": "Footer row for form buttons, start-aligned by default.",
1813
+ "notes": [
1814
+ "`wu-form-actions-end` inside the row pushes a set of buttons to the inline end."
1815
+ ],
1816
+ "since": "1.0.0",
1817
+ "needs": [],
1818
+ "js": {
1819
+ "mode": "none",
1820
+ "exports": []
1821
+ },
1822
+ "examples": [
1823
+ {
1824
+ "lang": "html",
1825
+ "code": "<div class=\"wu-form-actions divided\">\n <button class=\"wu-btn brand\" type=\"submit\">Save</button>\n <button class=\"wu-btn\" type=\"reset\">Reset</button>\n</div>"
1826
+ },
1827
+ {
1828
+ "lang": "html",
1829
+ "code": "<div class=\"wu-form-actions\">\n <button class=\"wu-btn danger subtle\" type=\"button\">Delete</button>\n <div class=\"wu-form-actions-end\">\n <button class=\"wu-btn\" type=\"button\">Cancel</button>\n <button class=\"wu-btn brand\" type=\"submit\">Save</button>\n </div>\n</div>"
1830
+ }
1831
+ ],
1832
+ "modifiers": [
1833
+ {
1834
+ "names": [
1835
+ "trailing"
1836
+ ],
1837
+ "description": "Aligns the buttons to the inline end",
1838
+ "since": "1.0.0"
1839
+ },
1840
+ {
1841
+ "names": [
1842
+ "centered"
1843
+ ],
1844
+ "description": "Centers the buttons",
1845
+ "since": "1.0.0"
1846
+ },
1847
+ {
1848
+ "names": [
1849
+ "divided"
1850
+ ],
1851
+ "description": "Line and padding above the row",
1852
+ "since": "1.0.0"
1853
+ }
1854
+ ],
1855
+ "parts": [
1856
+ {
1857
+ "names": [
1858
+ "wu-form-actions-end"
1859
+ ],
1860
+ "description": "Set of buttons pushed to the inline end of the row",
1861
+ "since": "1.0.0"
1862
+ }
1863
+ ],
1864
+ "variables": [],
1865
+ "states": [],
1866
+ "changed": []
1867
+ },
1868
+ {
1869
+ "name": "info-row",
1870
+ "root": "wu-info-row",
1871
+ "summary": "One label and value pair, with a line between adjacent rows.",
1872
+ "notes": [
1873
+ "Works as a `div` with `dt` and `dd` inside a `dl`."
1874
+ ],
1875
+ "since": "1.0.0",
1876
+ "needs": [],
1877
+ "js": {
1878
+ "mode": "none",
1879
+ "exports": []
1880
+ },
1881
+ "examples": [
1882
+ {
1883
+ "lang": "html",
1884
+ "code": "<div class=\"wu-info-row\">\n <span class=\"wu-info-row-label\">Tax</span>\n <span class=\"wu-info-row-value\">$9.60</span>\n</div>\n<div class=\"wu-info-row total\">\n <span class=\"wu-info-row-label\">Total</span>\n <span class=\"wu-info-row-value\">$129.60</span>\n</div>"
1885
+ }
1886
+ ],
1887
+ "modifiers": [
1888
+ {
1889
+ "names": [
1890
+ "total"
1891
+ ],
1892
+ "description": "Strong line above, regular label text and a larger value",
1893
+ "since": "1.0.0"
1894
+ }
1895
+ ],
1896
+ "parts": [
1897
+ {
1898
+ "names": [
1899
+ "wu-info-row-label"
1900
+ ],
1901
+ "description": "Muted label",
1902
+ "since": "1.0.0"
1903
+ },
1904
+ {
1905
+ "names": [
1906
+ "wu-info-row-value"
1907
+ ],
1908
+ "description": "Value, end-aligned with tabular numbers",
1909
+ "since": "1.0.0"
1910
+ }
1911
+ ],
1912
+ "variables": [],
1913
+ "states": [],
1914
+ "changed": []
1915
+ },
1916
+ {
1917
+ "name": "input-group",
1918
+ "root": "wu-input-group",
1919
+ "summary": "Joined row of text addons, an input and buttons that share one border and radius.",
1920
+ "notes": [
1921
+ "Size the children (`wu-input sm`, `wu-btn sm`); addons stretch to the row height. Default buttons take the field border; `brand`, `danger`, `quiet` and `link` buttons keep their own look. The hovered, focused or invalid control rises above its neighbors."
1922
+ ],
1923
+ "since": "1.0.0",
1924
+ "needs": [],
1925
+ "js": {
1926
+ "mode": "none",
1927
+ "exports": []
1928
+ },
1929
+ "examples": [
1930
+ {
1931
+ "lang": "html",
1932
+ "code": "<div class=\"wu-input-group\">\n <span class=\"wu-input-group-text\">https://</span>\n <input class=\"wu-input\" type=\"text\" aria-label=\"Website\" placeholder=\"example.com\">\n</div>"
1933
+ },
1934
+ {
1935
+ "lang": "html",
1936
+ "code": "<div class=\"wu-input-group\">\n <input class=\"wu-input sm\" type=\"search\" aria-label=\"Search\" placeholder=\"Search\">\n <button class=\"wu-btn brand sm\" type=\"button\">Search</button>\n</div>"
1937
+ }
1938
+ ],
1939
+ "modifiers": [],
1940
+ "parts": [
1941
+ {
1942
+ "names": [
1943
+ "wu-input-group-text"
1944
+ ],
1945
+ "description": "Text addon with the alternate background; an `svg` child is sized as an icon",
1946
+ "since": "1.0.0"
1947
+ }
1948
+ ],
1949
+ "variables": [],
1950
+ "states": [],
1951
+ "changed": []
1952
+ },
1953
+ {
1954
+ "name": "input",
1955
+ "root": "wu-input",
1956
+ "summary": "Text input in three sizes, with disabled, read-only and invalid looks, plus prefix, suffix and a clear button inside the field border.",
1957
+ "notes": [
1958
+ "Core base already sets the border, background, hover, focus ring, invalid border, disabled look, placeholder color, padding and the md height; the kit adds the radius, type size and sizes.",
1959
+ "`wu-input-affix` draws the box and the input inside goes bare. Prefix and suffix sit on the inline start and end, so they swap in right-to-left pages. A `wu-select` can replace the input. `sm` and `lg` go on the wrapper. `wu-input-clear` is started by the kit script: it shows while the field has text, clears it and refocuses."
1960
+ ],
1961
+ "since": "1.0.0",
1962
+ "needs": [],
1963
+ "js": {
1964
+ "mode": "optional",
1965
+ "exports": [
1966
+ "initInputClear"
1967
+ ]
1968
+ },
1969
+ "examples": [
1970
+ {
1971
+ "lang": "html",
1972
+ "code": "<input class=\"wu-input\" type=\"text\" aria-label=\"Name\" placeholder=\"Name\">\n<input class=\"wu-input sm\" type=\"text\" aria-label=\"Code\" value=\"A-12\" readonly>\n<input class=\"wu-input lg\" type=\"email\" aria-label=\"Email\" aria-invalid=\"true\">"
1973
+ },
1974
+ {
1975
+ "lang": "html",
1976
+ "code": "<div class=\"wu-input-affix\">\n <span class=\"wu-input-prefix\"><svg aria-hidden=\"true\" viewBox=\"0 0 24 24\"><circle cx=\"11\" cy=\"11\" r=\"6\" /></svg></span>\n <input class=\"wu-input\" type=\"search\" aria-label=\"Search\">\n <button class=\"wu-input-clear\" type=\"button\" aria-label=\"Clear\" hidden></button>\n <span class=\"wu-input-suffix\">USD</span>\n</div>"
1977
+ }
1978
+ ],
1979
+ "modifiers": [
1980
+ {
1981
+ "names": [
1982
+ "sm",
1983
+ "lg"
1984
+ ],
1985
+ "description": "Small or large control height, padding and font size; also on `wu-input-affix`, and taken from a `wu-field-group sm` or `lg` when the control has no size",
1986
+ "since": "1.0.0"
1987
+ }
1988
+ ],
1989
+ "parts": [
1990
+ {
1991
+ "names": [
1992
+ "wu-input-affix"
1993
+ ],
1994
+ "description": "Wrapper that draws the field box around a bare input or select, with a prefix, suffix and clear button",
1995
+ "since": "1.0.0"
1996
+ },
1997
+ {
1998
+ "names": [
1999
+ "wu-input-prefix"
2000
+ ],
2001
+ "description": "Content before the input, such as an icon or currency symbol",
2002
+ "since": "1.0.0"
2003
+ },
2004
+ {
2005
+ "names": [
2006
+ "wu-input-suffix"
2007
+ ],
2008
+ "description": "Content after the input, such as a unit",
2009
+ "since": "1.0.0"
2010
+ },
2011
+ {
2012
+ "names": [
2013
+ "wu-input-clear"
2014
+ ],
2015
+ "description": "Clear button inside the affix; an empty button shows a multiplication sign; give it an `aria-label`",
2016
+ "since": "1.0.0"
2017
+ }
2018
+ ],
2019
+ "variables": [],
2020
+ "states": [
2021
+ {
2022
+ "names": [
2023
+ "disabled"
2024
+ ],
2025
+ "description": "Not-allowed cursor; an affix with a disabled control dims",
2026
+ "since": "1.0.0"
2027
+ },
2028
+ {
2029
+ "names": [
2030
+ "readonly"
2031
+ ],
2032
+ "description": "Alternate background",
2033
+ "since": "1.0.0"
2034
+ },
2035
+ {
2036
+ "names": [
2037
+ "aria-invalid=\"true\"",
2038
+ ":user-invalid"
2039
+ ],
2040
+ "description": "Danger border doubled to 2px, so the change is not color alone",
2041
+ "since": "1.0.0"
2042
+ }
2043
+ ],
2044
+ "changed": []
2045
+ },
2046
+ {
2047
+ "name": "list",
2048
+ "root": "wu-list",
2049
+ "summary": "Vertical list of rows with a title, text and room for leading or trailing content.",
2050
+ "notes": [
2051
+ "Use a `ul` or `ol`; add `role=\"list\"` to keep list semantics without markers. `wu-list-body` grows between leading and trailing content such as an avatar, badge or button."
2052
+ ],
2053
+ "since": "1.0.0",
2054
+ "needs": [],
2055
+ "js": {
2056
+ "mode": "none",
2057
+ "exports": []
2058
+ },
2059
+ "examples": [
2060
+ {
2061
+ "lang": "html",
2062
+ "code": "<ul class=\"wu-list divided\" role=\"list\">\n <li class=\"wu-list-item\">\n <div class=\"wu-list-body\">\n <p class=\"wu-list-title\">Ada Lovelace</p>\n <p class=\"wu-list-text\">Engineer</p>\n </div>\n <span class=\"wu-badge success\">Active</span>\n </li>\n <li class=\"wu-list-item\">\n <div class=\"wu-list-body\">\n <p class=\"wu-list-title\">Grace Hopper</p>\n </div>\n </li>\n</ul>"
2063
+ }
2064
+ ],
2065
+ "modifiers": [
2066
+ {
2067
+ "names": [
2068
+ "divided"
2069
+ ],
2070
+ "description": "Line between rows",
2071
+ "since": "1.0.0"
2072
+ },
2073
+ {
2074
+ "names": [
2075
+ "sm"
2076
+ ],
2077
+ "description": "Tighter row padding",
2078
+ "since": "1.0.0"
2079
+ }
2080
+ ],
2081
+ "parts": [
2082
+ {
2083
+ "names": [
2084
+ "wu-list-item"
2085
+ ],
2086
+ "description": "Row, a flex container",
2087
+ "since": "1.0.0"
2088
+ },
2089
+ {
2090
+ "names": [
2091
+ "wu-list-body"
2092
+ ],
2093
+ "description": "Column that grows between leading and trailing content",
2094
+ "since": "1.0.0"
2095
+ },
2096
+ {
2097
+ "names": [
2098
+ "wu-list-title"
2099
+ ],
2100
+ "description": "Row title, medium weight",
2101
+ "since": "1.0.0"
2102
+ },
2103
+ {
2104
+ "names": [
2105
+ "wu-list-text"
2106
+ ],
2107
+ "description": "Muted supporting text",
2108
+ "since": "1.0.0"
2109
+ }
2110
+ ],
2111
+ "variables": [],
2112
+ "states": [],
2113
+ "changed": []
2114
+ },
2115
+ {
2116
+ "name": "modal",
2117
+ "root": "wu-modal",
2118
+ "summary": "Dialog built on the native `dialog` element, with header, body and footer.",
2119
+ "notes": [
2120
+ "Esc closes it, and `closedby=\"any\"` adds click outside where supported. `showModal()` and the `command` attribute lock page scroll; `show()` opens it non-modal and leaves the page alone.",
2121
+ "The body scrolls on its own when the content is taller than the dialog."
2122
+ ],
2123
+ "since": "1.0.0",
2124
+ "needs": [],
2125
+ "js": {
2126
+ "mode": "none",
2127
+ "exports": []
2128
+ },
2129
+ "examples": [
2130
+ {
2131
+ "lang": "html",
2132
+ "code": "<button class=\"wu-btn\" type=\"button\" commandfor=\"m1\" command=\"show-modal\">Open</button>\n<dialog class=\"wu-modal\" id=\"m1\" aria-labelledby=\"m1-title\" closedby=\"any\">\n <header class=\"wu-modal-header\">\n <h2 class=\"wu-modal-title\" id=\"m1-title\">Title</h2>\n <button class=\"wu-modal-close\" type=\"button\" commandfor=\"m1\" command=\"close\" aria-label=\"Close\"></button>\n </header>\n <div class=\"wu-modal-body\">Content</div>\n <form class=\"wu-modal-footer\" method=\"dialog\">\n <button class=\"wu-btn\">Cancel</button>\n <button class=\"wu-btn brand\" value=\"confirm\">Save</button>\n </form>\n</dialog>"
2133
+ }
2134
+ ],
2135
+ "modifiers": [
2136
+ {
2137
+ "names": [
2138
+ "sm",
2139
+ "lg"
2140
+ ],
2141
+ "description": "Narrow (24rem) or wide (48rem) dialog; the default is 32rem",
2142
+ "since": "1.0.0"
2143
+ },
2144
+ {
2145
+ "names": [
2146
+ "animated"
2147
+ ],
2148
+ "description": "Fades and scales the dialog in and out and fades the backdrop when the user allows motion; `wu-animated` on an ancestor does the same",
2149
+ "since": "1.0.0"
2150
+ }
2151
+ ],
2152
+ "parts": [
2153
+ {
2154
+ "names": [
2155
+ "wu-modal-header"
2156
+ ],
2157
+ "description": "Top row for the title and close button",
2158
+ "since": "1.0.0"
2159
+ },
2160
+ {
2161
+ "names": [
2162
+ "wu-modal-title"
2163
+ ],
2164
+ "description": "Dialog heading",
2165
+ "since": "1.0.0"
2166
+ },
2167
+ {
2168
+ "names": [
2169
+ "wu-modal-close"
2170
+ ],
2171
+ "description": "Close button drawn with the shared close icon; give it an `aria-label`",
2172
+ "since": "1.0.0"
2173
+ },
2174
+ {
2175
+ "names": [
2176
+ "wu-modal-body"
2177
+ ],
2178
+ "description": "Scrolling content area",
2179
+ "since": "1.0.0"
2180
+ },
2181
+ {
2182
+ "names": [
2183
+ "wu-modal-footer"
2184
+ ],
2185
+ "description": "Bottom row for actions, aligned to the inline end",
2186
+ "since": "1.0.0"
2187
+ }
2188
+ ],
2189
+ "variables": [
2190
+ {
2191
+ "names": [
2192
+ "--wu-modal--Width"
2193
+ ],
2194
+ "description": "Dialog width",
2195
+ "since": "1.0.0",
2196
+ "default": "32rem"
2197
+ },
2198
+ {
2199
+ "names": [
2200
+ "--wu-modal--MaxHeight"
2201
+ ],
2202
+ "description": "Largest dialog height before the body scrolls",
2203
+ "since": "1.0.0",
2204
+ "default": "calc(100dvh - 4rem)"
2205
+ },
2206
+ {
2207
+ "names": [
2208
+ "--wu-modal--Backdrop"
2209
+ ],
2210
+ "description": "Backdrop color",
2211
+ "since": "1.0.0",
2212
+ "default": "50% black, 70% in dark themes"
2213
+ }
2214
+ ],
2215
+ "states": [
2216
+ {
2217
+ "names": [
2218
+ "open"
2219
+ ],
2220
+ "description": "Displays the dialog as a flex column",
2221
+ "since": "1.0.0"
2222
+ }
2223
+ ],
2224
+ "changed": []
2225
+ },
2226
+ {
2227
+ "name": "page-header",
2228
+ "root": "wu-page-header",
2229
+ "summary": "Page title row with an optional description, breadcrumb and action buttons.",
2230
+ "notes": [
2231
+ "Actions line up with the title and wrap below it on narrow screens. A direct `wu-breadcrumb` child takes its own full-width row above the title."
2232
+ ],
2233
+ "since": "1.0.0",
2234
+ "needs": [],
2235
+ "js": {
2236
+ "mode": "none",
2237
+ "exports": []
2238
+ },
2239
+ "examples": [
2240
+ {
2241
+ "lang": "html",
2242
+ "code": "<header class=\"wu-page-header divided\">\n <nav class=\"wu-breadcrumb\" aria-label=\"Breadcrumb\">\n <ol>\n <li><a href=\"/projects\">Projects</a></li>\n <li aria-current=\"page\">Apollo</li>\n </ol>\n </nav>\n <div class=\"wu-page-header-main\">\n <h1 class=\"wu-page-header-title\">Apollo</h1>\n <p class=\"wu-page-header-text\">Launch plan and open tasks.</p>\n </div>\n <div class=\"wu-page-header-actions\">\n <button class=\"wu-btn\" type=\"button\">Share</button>\n <button class=\"wu-btn brand\" type=\"button\">New task</button>\n </div>\n</header>"
2243
+ }
2244
+ ],
2245
+ "modifiers": [
2246
+ {
2247
+ "names": [
2248
+ "divided"
2249
+ ],
2250
+ "description": "Adds a bottom border and padding under the header",
2251
+ "since": "1.0.0"
2252
+ }
2253
+ ],
2254
+ "parts": [
2255
+ {
2256
+ "names": [
2257
+ "wu-page-header-main"
2258
+ ],
2259
+ "description": "Column that holds the title and description",
2260
+ "since": "1.0.0"
2261
+ },
2262
+ {
2263
+ "names": [
2264
+ "wu-page-header-title"
2265
+ ],
2266
+ "description": "Page heading",
2267
+ "since": "1.0.0"
2268
+ },
2269
+ {
2270
+ "names": [
2271
+ "wu-page-header-text"
2272
+ ],
2273
+ "description": "Muted description under the title",
2274
+ "since": "1.0.0"
2275
+ },
2276
+ {
2277
+ "names": [
2278
+ "wu-page-header-actions"
2279
+ ],
2280
+ "description": "Row of buttons, centered on the title first line",
2281
+ "since": "1.0.0"
2282
+ }
2283
+ ],
2284
+ "variables": [],
2285
+ "states": [],
2286
+ "changed": []
2287
+ },
2288
+ {
2289
+ "name": "pagination",
2290
+ "root": "wu-pagination",
2291
+ "summary": "Page navigation made of button links, with optional total count and page size select.",
2292
+ "notes": [
2293
+ "Use a `nav` with an `aria-label`, and give an arrow-only previous or next link an `aria-label`. Mark the current link with `aria-current=\"page\"`.",
2294
+ "Put a `wu-pagination-total` and a `wu-pagination-size` label holding a `wu-select` beside the list."
2295
+ ],
2296
+ "since": "1.0.0",
2297
+ "needs": [
2298
+ "button"
2299
+ ],
2300
+ "js": {
2301
+ "mode": "none",
2302
+ "exports": []
2303
+ },
2304
+ "examples": [
2305
+ {
2306
+ "lang": "html",
2307
+ "code": "<nav class=\"wu-pagination\" aria-label=\"Pagination\">\n <ul class=\"wu-pagination-list\">\n <li><a class=\"wu-btn wu-pagination-prev\" href=\"/orders?page=1\" aria-label=\"Previous page\"></a></li>\n <li><a class=\"wu-btn\" href=\"/orders?page=1\">1</a></li>\n <li><a class=\"wu-btn\" href=\"/orders?page=2\" aria-current=\"page\">2</a></li>\n <li><span class=\"wu-pagination-ellipsis\">&hellip;</span></li>\n <li><a class=\"wu-btn\" href=\"/orders?page=9\">9</a></li>\n <li><a class=\"wu-btn wu-pagination-next\" href=\"/orders?page=3\" aria-label=\"Next page\"></a></li>\n </ul>\n <span class=\"wu-pagination-total\">Showing 11 to 20 of 86</span>\n</nav>"
2308
+ }
2309
+ ],
2310
+ "modifiers": [
2311
+ {
2312
+ "names": [
2313
+ "sm",
2314
+ "lg"
2315
+ ],
2316
+ "description": "Smaller or larger buttons and ellipsis",
2317
+ "since": "1.0.0"
2318
+ }
2319
+ ],
2320
+ "parts": [
2321
+ {
2322
+ "names": [
2323
+ "wu-pagination-list"
2324
+ ],
2325
+ "description": "List that holds the page links",
2326
+ "since": "1.0.0"
2327
+ },
2328
+ {
2329
+ "names": [
2330
+ "wu-pagination-ellipsis"
2331
+ ],
2332
+ "description": "Gap marker between page numbers",
2333
+ "since": "1.0.0"
2334
+ },
2335
+ {
2336
+ "names": [
2337
+ "wu-pagination-prev"
2338
+ ],
2339
+ "description": "On a link: draws a back arrow that follows the reading direction",
2340
+ "since": "1.0.0"
2341
+ },
2342
+ {
2343
+ "names": [
2344
+ "wu-pagination-next"
2345
+ ],
2346
+ "description": "On a link: draws a forward arrow that follows the reading direction",
2347
+ "since": "1.0.0"
2348
+ },
2349
+ {
2350
+ "names": [
2351
+ "wu-pagination-total"
2352
+ ],
2353
+ "description": "Muted total count text",
2354
+ "since": "1.0.0"
2355
+ },
2356
+ {
2357
+ "names": [
2358
+ "wu-pagination-size"
2359
+ ],
2360
+ "description": "Label that holds a `wu-select` for the page size",
2361
+ "since": "1.0.0"
2362
+ }
2363
+ ],
2364
+ "variables": [],
2365
+ "states": [
2366
+ {
2367
+ "names": [
2368
+ "aria-current=\"page\""
2369
+ ],
2370
+ "description": "The current page: solid brand fill",
2371
+ "since": "1.0.0"
2372
+ }
2373
+ ],
2374
+ "changed": []
2375
+ },
2376
+ {
2377
+ "name": "panel",
2378
+ "root": "wu-panel",
2379
+ "summary": "Flat bordered region for grouped settings or data.",
2380
+ "notes": [
2381
+ "The card is the raised surface; the panel stays flat with a border."
2382
+ ],
2383
+ "since": "1.0.0",
2384
+ "needs": [],
2385
+ "js": {
2386
+ "mode": "none",
2387
+ "exports": []
2388
+ },
2389
+ "examples": [
2390
+ {
2391
+ "lang": "html",
2392
+ "code": "<section class=\"wu-panel\">\n <header class=\"wu-panel-header\">\n <h2 class=\"wu-panel-title\">Notifications</h2>\n <button class=\"wu-btn sm\" type=\"button\">Edit</button>\n </header>\n <div class=\"wu-panel-body\">Email me about new comments.</div>\n <footer class=\"wu-panel-footer\">\n <button class=\"wu-btn brand\" type=\"button\">Save</button>\n </footer>\n</section>"
2393
+ }
2394
+ ],
2395
+ "modifiers": [],
2396
+ "parts": [
2397
+ {
2398
+ "names": [
2399
+ "wu-panel-header"
2400
+ ],
2401
+ "description": "Top row with a tinted background and bottom border",
2402
+ "since": "1.0.0"
2403
+ },
2404
+ {
2405
+ "names": [
2406
+ "wu-panel-title"
2407
+ ],
2408
+ "description": "Panel heading",
2409
+ "since": "1.0.0"
2410
+ },
2411
+ {
2412
+ "names": [
2413
+ "wu-panel-body"
2414
+ ],
2415
+ "description": "Content area",
2416
+ "since": "1.0.0"
2417
+ },
2418
+ {
2419
+ "names": [
2420
+ "wu-panel-footer"
2421
+ ],
2422
+ "description": "Bottom row for actions, aligned to the inline end",
2423
+ "since": "1.0.0"
2424
+ }
2425
+ ],
2426
+ "variables": [
2427
+ {
2428
+ "names": [
2429
+ "--wu-panel--Padding"
2430
+ ],
2431
+ "description": "Inline padding of the header and footer, and padding of the body",
2432
+ "since": "1.0.0",
2433
+ "default": "1rem"
2434
+ }
2435
+ ],
2436
+ "states": [],
2437
+ "changed": []
2438
+ },
2439
+ {
2440
+ "name": "popover",
2441
+ "root": "wu-popover",
2442
+ "summary": "Small floating panel built on the native `popover` attribute.",
2443
+ "notes": [
2444
+ "Esc and click outside close it. `commandfor` with `command=\"toggle-popover\"` works as the trigger too.",
2445
+ "Opens under its trigger where anchor positioning exists, and flips when there is no room. Elsewhere it is centered in the viewport. It has no arrow.",
2446
+ "Placement follows the popover own direction, so it is right in an RTL section of an LTR page."
2447
+ ],
2448
+ "since": "1.0.0",
2449
+ "needs": [],
2450
+ "js": {
2451
+ "mode": "none",
2452
+ "exports": []
2453
+ },
2454
+ "examples": [
2455
+ {
2456
+ "lang": "html",
2457
+ "code": "<button class=\"wu-btn\" type=\"button\" popovertarget=\"p1\">Details</button>\n<div class=\"wu-popover\" id=\"p1\" popover>\n <h3 class=\"wu-popover-title\">Title</h3>\n <p>Short content.</p>\n</div>"
2458
+ },
2459
+ {
2460
+ "lang": "html",
2461
+ "code": "<button class=\"wu-btn\" type=\"button\" popovertarget=\"p2\">Delete</button>\n<div class=\"wu-popover\" id=\"p2\" popover>\n <p>Delete this item?</p>\n <div class=\"wu-popover-actions\">\n <button class=\"wu-btn sm\" type=\"button\" popovertarget=\"p2\" popovertargetaction=\"hide\">Cancel</button>\n <button class=\"wu-btn danger sm\" type=\"button\" popovertarget=\"p2\" popovertargetaction=\"hide\">Delete</button>\n </div>\n</div>"
2462
+ }
2463
+ ],
2464
+ "modifiers": [
2465
+ {
2466
+ "names": [
2467
+ "animated"
2468
+ ],
2469
+ "description": "Fades and scales the popover in and out, growing away from the trigger, when the user allows motion; `wu-animated` on an ancestor does the same",
2470
+ "since": "1.0.0"
2471
+ }
2472
+ ],
2473
+ "parts": [
2474
+ {
2475
+ "names": [
2476
+ "wu-popover-title"
2477
+ ],
2478
+ "description": "Popover heading",
2479
+ "since": "1.0.0"
2480
+ },
2481
+ {
2482
+ "names": [
2483
+ "wu-popover-actions"
2484
+ ],
2485
+ "description": "Button row at the inline end, for an inline confirm",
2486
+ "since": "1.0.0"
2487
+ }
2488
+ ],
2489
+ "variables": [
2490
+ {
2491
+ "names": [
2492
+ "--wu-popover--MaxWidth"
2493
+ ],
2494
+ "description": "Largest popover width",
2495
+ "since": "1.0.0",
2496
+ "default": "20rem"
2497
+ }
2498
+ ],
2499
+ "states": [
2500
+ {
2501
+ "names": [
2502
+ ":popover-open"
2503
+ ],
2504
+ "description": "Fully visible during the animated transition",
2505
+ "since": "1.0.0"
2506
+ }
2507
+ ],
2508
+ "changed": []
2509
+ },
2510
+ {
2511
+ "name": "progress-circle",
2512
+ "root": "wu-progress-circle",
2513
+ "summary": "Circular progress ring that shows a percentage.",
2514
+ "notes": [
2515
+ "It is not a native element, so name the role and value: `role=\"progressbar\"` with `aria-label`, `aria-valuenow`, `aria-valuemin` and `aria-valuemax`.",
2516
+ "The value is a percentage from 0 to 100, set with `--wu-progress-circle--Value`. The ring color is `currentcolor`, so roles and `color` set it."
2517
+ ],
2518
+ "since": "1.0.0",
2519
+ "needs": [],
2520
+ "js": {
2521
+ "mode": "none",
2522
+ "exports": []
2523
+ },
2524
+ "examples": [
2525
+ {
2526
+ "lang": "html",
2527
+ "code": "<div class=\"wu-progress-circle\" role=\"progressbar\" aria-label=\"Upload\" aria-valuenow=\"72\" aria-valuemin=\"0\" aria-valuemax=\"100\" style=\"--wu-progress-circle--Value: 72\">\n <span class=\"wu-progress-circle-label\">72%</span>\n</div>"
2528
+ },
2529
+ {
2530
+ "lang": "html",
2531
+ "code": "<div class=\"wu-progress-circle success lg animated\" role=\"progressbar\" aria-label=\"Storage\" aria-valuenow=\"40\" aria-valuemin=\"0\" aria-valuemax=\"100\" style=\"--wu-progress-circle--Value: 40\">\n <span class=\"wu-progress-circle-label\">40%</span>\n</div>"
2532
+ }
2533
+ ],
2534
+ "modifiers": [
2535
+ {
2536
+ "names": [
2537
+ "success",
2538
+ "danger",
2539
+ "warning",
2540
+ "info"
2541
+ ],
2542
+ "description": "Role color for the ring",
2543
+ "since": "1.0.0"
2544
+ },
2545
+ {
2546
+ "names": [
2547
+ "sm",
2548
+ "lg"
2549
+ ],
2550
+ "description": "Smaller (2.5rem) or larger (6rem) ring with a thinner or thicker band",
2551
+ "since": "1.0.0"
2552
+ },
2553
+ {
2554
+ "names": [
2555
+ "animated"
2556
+ ],
2557
+ "description": "The ring eases to each new value when the user allows motion; `wu-animated` on an ancestor does the same",
2558
+ "since": "1.0.0"
2559
+ }
2560
+ ],
2561
+ "parts": [
2562
+ {
2563
+ "names": [
2564
+ "wu-progress-circle-label"
2565
+ ],
2566
+ "description": "Text centered in the ring",
2567
+ "since": "1.0.0"
2568
+ }
2569
+ ],
2570
+ "variables": [
2571
+ {
2572
+ "names": [
2573
+ "--wu-progress-circle--Value"
2574
+ ],
2575
+ "description": "Percentage from 0 to 100; a registered property, so it can transition",
2576
+ "since": "1.0.0",
2577
+ "default": "0"
2578
+ },
2579
+ {
2580
+ "names": [
2581
+ "--wu-progress-circle--Size"
2582
+ ],
2583
+ "description": "Width and height of the ring",
2584
+ "since": "1.0.0",
2585
+ "default": "4rem"
2586
+ },
2587
+ {
2588
+ "names": [
2589
+ "--wu-progress-circle--Thickness"
2590
+ ],
2591
+ "description": "Width of the ring band",
2592
+ "since": "1.0.0",
2593
+ "default": "0.5rem"
2594
+ }
2595
+ ],
2596
+ "states": [],
2597
+ "changed": []
2598
+ },
2599
+ {
2600
+ "name": "progress",
2601
+ "root": "wu-progress",
2602
+ "summary": "Horizontal progress bar on the native `progress` element.",
2603
+ "notes": [
2604
+ "Without a `value` attribute it is indeterminate and shows a sliding segment. Label it with a `label` element or `aria-label`.",
2605
+ "The fill uses `currentcolor`, so roles and `color` set it."
2606
+ ],
2607
+ "since": "1.0.0",
2608
+ "needs": [],
2609
+ "js": {
2610
+ "mode": "none",
2611
+ "exports": []
2612
+ },
2613
+ "examples": [
2614
+ {
2615
+ "lang": "html",
2616
+ "code": "<label class=\"wu-progress-label\" for=\"upload\"><span>Uploading</span><span>72%</span></label>\n<progress class=\"wu-progress\" id=\"upload\" value=\"72\" max=\"100\"></progress>"
2617
+ },
2618
+ {
2619
+ "lang": "html",
2620
+ "code": "<progress class=\"wu-progress success sm\" value=\"40\" max=\"100\" aria-label=\"Storage used\"></progress>\n<progress class=\"wu-progress lg\" aria-label=\"Loading\"></progress>"
2621
+ }
2622
+ ],
2623
+ "modifiers": [
2624
+ {
2625
+ "names": [
2626
+ "success",
2627
+ "danger",
2628
+ "warning",
2629
+ "info"
2630
+ ],
2631
+ "description": "Role color for the fill",
2632
+ "since": "1.0.0"
2633
+ },
2634
+ {
2635
+ "names": [
2636
+ "sm",
2637
+ "lg"
2638
+ ],
2639
+ "description": "Thinner (0.25rem) or thicker (0.75rem) bar",
2640
+ "since": "1.0.0"
2641
+ }
2642
+ ],
2643
+ "parts": [
2644
+ {
2645
+ "names": [
2646
+ "wu-progress-label"
2647
+ ],
2648
+ "description": "Row above the bar for a title and a value",
2649
+ "since": "1.0.0"
2650
+ }
2651
+ ],
2652
+ "variables": [
2653
+ {
2654
+ "names": [
2655
+ "--wu-progress--Height"
2656
+ ],
2657
+ "description": "Bar height",
2658
+ "since": "1.0.0",
2659
+ "default": "0.5rem"
2660
+ }
2661
+ ],
2662
+ "states": [
2663
+ {
2664
+ "names": [
2665
+ ":indeterminate"
2666
+ ],
2667
+ "description": "No value: a segment slides across the track",
2668
+ "since": "1.0.0"
2669
+ }
2670
+ ],
2671
+ "changed": []
2672
+ },
2673
+ {
2674
+ "name": "radio",
2675
+ "root": "wu-radio",
2676
+ "summary": "Radio button with a label, drawn from the native input.",
2677
+ "notes": [
2678
+ "The circle is `1em`, so it follows the root type size. The `wu-radio-input` part also works alone with an `aria-label`.",
2679
+ "Inside a `wu-field-group sm` or `lg`, a radio without its own size takes the group size."
2680
+ ],
2681
+ "since": "1.0.0",
2682
+ "needs": [],
2683
+ "js": {
2684
+ "mode": "none",
2685
+ "exports": []
2686
+ },
2687
+ "examples": [
2688
+ {
2689
+ "lang": "html",
2690
+ "code": "<label class=\"wu-radio\">\n <input type=\"radio\" class=\"wu-radio-input\" name=\"plan\" value=\"free\" checked>\n <span class=\"wu-radio-label\">Free</span>\n</label>\n<label class=\"wu-radio\">\n <input type=\"radio\" class=\"wu-radio-input\" name=\"plan\" value=\"pro\">\n <span class=\"wu-radio-label\">Pro</span>\n</label>"
2691
+ },
2692
+ {
2693
+ "lang": "html",
2694
+ "code": "<input type=\"radio\" class=\"wu-radio-input\" name=\"size\" value=\"m\" aria-label=\"Medium\">"
2695
+ }
2696
+ ],
2697
+ "modifiers": [
2698
+ {
2699
+ "names": [
2700
+ "sm",
2701
+ "lg"
2702
+ ],
2703
+ "description": "Smaller or larger text and circle",
2704
+ "since": "1.0.0"
2705
+ }
2706
+ ],
2707
+ "parts": [
2708
+ {
2709
+ "names": [
2710
+ "wu-radio-input"
2711
+ ],
2712
+ "description": "The native radio input, drawn as a circle with a dot",
2713
+ "since": "1.0.0"
2714
+ },
2715
+ {
2716
+ "names": [
2717
+ "wu-radio-label"
2718
+ ],
2719
+ "description": "Label text beside the circle",
2720
+ "since": "1.0.0"
2721
+ }
2722
+ ],
2723
+ "variables": [],
2724
+ "states": [
2725
+ {
2726
+ "names": [
2727
+ "disabled"
2728
+ ],
2729
+ "description": "Half opacity, no pointer events",
2730
+ "since": "1.0.0"
2731
+ },
2732
+ {
2733
+ "names": [
2734
+ "aria-invalid=\"true\"",
2735
+ ":user-invalid"
2736
+ ],
2737
+ "description": "Two pixel danger edge that stays on hover and when checked",
2738
+ "since": "1.0.0"
2739
+ },
2740
+ {
2741
+ "names": [
2742
+ ":checked"
2743
+ ],
2744
+ "description": "Brand fill with a dot",
2745
+ "since": "1.0.0"
2746
+ }
2747
+ ],
2748
+ "changed": []
2749
+ },
2750
+ {
2751
+ "name": "segmented",
2752
+ "root": "wu-segmented",
2753
+ "summary": "Radio group shown as connected segments, one selected at a time.",
2754
+ "notes": [
2755
+ "Arrow keys move the choice natively, and segments share the width equally. A `div` with `role=\"radiogroup\"` and an `aria-label` works instead of a `fieldset`.",
2756
+ "Type follows the button: `xs`, `sm` and `md` for `sm`, default and `lg`. The animated thumb supports up to six label segments."
2757
+ ],
2758
+ "since": "1.0.0",
2759
+ "needs": [],
2760
+ "js": {
2761
+ "mode": "none",
2762
+ "exports": []
2763
+ },
2764
+ "examples": [
2765
+ {
2766
+ "lang": "html",
2767
+ "code": "<fieldset class=\"wu-segmented\">\n <legend class=\"sr-only\">View</legend>\n <label class=\"wu-segmented-item\"><input type=\"radio\" name=\"view\" class=\"wu-segmented-input\" value=\"day\" checked> Day</label>\n <label class=\"wu-segmented-item\"><input type=\"radio\" name=\"view\" class=\"wu-segmented-input\" value=\"week\"> Week</label>\n <label class=\"wu-segmented-item\"><input type=\"radio\" name=\"view\" class=\"wu-segmented-input\" value=\"month\"> Month</label>\n</fieldset>"
2768
+ }
2769
+ ],
2770
+ "modifiers": [
2771
+ {
2772
+ "names": [
2773
+ "sm",
2774
+ "lg"
2775
+ ],
2776
+ "description": "Smaller or larger control height and font size",
2777
+ "since": "1.0.0"
2778
+ },
2779
+ {
2780
+ "names": [
2781
+ "animated"
2782
+ ],
2783
+ "description": "One thumb slides to the checked segment with a spring when the user allows motion; `wu-animated` on an ancestor does the same",
2784
+ "since": "1.0.0"
2785
+ }
2786
+ ],
2787
+ "parts": [
2788
+ {
2789
+ "names": [
2790
+ "wu-segmented-item"
2791
+ ],
2792
+ "description": "One segment: the label that wraps a radio input",
2793
+ "since": "1.0.0"
2794
+ },
2795
+ {
2796
+ "names": [
2797
+ "wu-segmented-input"
2798
+ ],
2799
+ "description": "The radio input, visually hidden but focusable and announced",
2800
+ "since": "1.0.0"
2801
+ }
2802
+ ],
2803
+ "variables": [],
2804
+ "states": [
2805
+ {
2806
+ "names": [
2807
+ ":checked"
2808
+ ],
2809
+ "description": "The selected segment has a raised surface, an edge and a shadow",
2810
+ "since": "1.0.0"
2811
+ },
2812
+ {
2813
+ "names": [
2814
+ "disabled"
2815
+ ],
2816
+ "description": "Half opacity on that segment",
2817
+ "since": "1.0.0"
2818
+ }
2819
+ ],
2820
+ "changed": []
2821
+ },
2822
+ {
2823
+ "name": "select",
2824
+ "root": "wu-select",
2825
+ "summary": "Native `select` with the kit input look and a drawn arrow.",
2826
+ "notes": [
2827
+ "Core base already sets the border, background, hover, focus ring, invalid border, disabled look, padding and the default height. List boxes (`multiple` or `size`) keep their natural height and have no arrow.",
2828
+ "Where `appearance: base-select` is supported, the picker matches the kit; other browsers keep the native list.",
2829
+ "Inside a `wu-field-group sm` or `lg`, a select without its own size takes the group size."
2830
+ ],
2831
+ "since": "1.0.0",
2832
+ "needs": [],
2833
+ "js": {
2834
+ "mode": "none",
2835
+ "exports": []
2836
+ },
2837
+ "examples": [
2838
+ {
2839
+ "lang": "html",
2840
+ "code": "<select class=\"wu-select\" name=\"country\" aria-label=\"Country\">\n <option>Pakistan</option>\n <option>United Arab Emirates</option>\n</select>"
2841
+ },
2842
+ {
2843
+ "lang": "html",
2844
+ "code": "<select class=\"wu-select sm\" name=\"sort\" aria-label=\"Sort by\" aria-invalid=\"true\">\n <option>Newest</option>\n <option>Oldest</option>\n</select>"
2845
+ }
2846
+ ],
2847
+ "modifiers": [
2848
+ {
2849
+ "names": [
2850
+ "sm",
2851
+ "lg"
2852
+ ],
2853
+ "description": "Smaller or larger control height and padding",
2854
+ "since": "1.0.0"
2855
+ }
2856
+ ],
2857
+ "parts": [],
2858
+ "variables": [
2859
+ {
2860
+ "names": [
2861
+ "--wu-select--ArrowColor"
2862
+ ],
2863
+ "description": "Color of the arrow",
2864
+ "since": "1.0.0",
2865
+ "default": "var(--wu-text-muted)"
2866
+ }
2867
+ ],
2868
+ "states": [
2869
+ {
2870
+ "names": [
2871
+ "disabled"
2872
+ ],
2873
+ "description": "Not-allowed cursor on top of core disabled look",
2874
+ "since": "1.0.0"
2875
+ },
2876
+ {
2877
+ "names": [
2878
+ "aria-invalid=\"true\"",
2879
+ ":user-invalid"
2880
+ ],
2881
+ "description": "Danger edge doubled to two pixels, so the change is not color alone",
2882
+ "since": "1.0.0"
2883
+ }
2884
+ ],
2885
+ "changed": []
2886
+ },
2887
+ {
2888
+ "name": "sidebar",
2889
+ "root": "wu-sidebar",
2890
+ "summary": "Vertical navigation with sections, link lists and collapsible groups.",
2891
+ "notes": [
2892
+ "Use a `nav` with an `aria-label`, and mark the current link with `aria-current=\"page\"`. A collapsible group is a `details` with the `wu-sidebar-group` class and a `summary` with `wu-sidebar-toggle`; the toggle may also be a `button` with `aria-expanded`.",
2893
+ "On narrow screens put the sidebar in a `dialog` with `wu-drawer inline-start`, where it fills the drawer.",
2894
+ "Icon rail: add `collapsed`; each link holds an `svg` and a `wu-sidebar-label`, shown as a tooltip on hover or focus."
2895
+ ],
2896
+ "since": "1.0.0",
2897
+ "needs": [],
2898
+ "js": {
2899
+ "mode": "none",
2900
+ "exports": []
2901
+ },
2902
+ "examples": [
2903
+ {
2904
+ "lang": "html",
2905
+ "code": "<nav class=\"wu-sidebar\" aria-label=\"Main\">\n <div class=\"wu-sidebar-section\">\n <h2 class=\"wu-sidebar-heading\">Workspace</h2>\n <ul class=\"wu-sidebar-list\">\n <li><a class=\"wu-sidebar-link\" href=\"/dashboard\" aria-current=\"page\">Dashboard</a></li>\n <li>\n <details class=\"wu-sidebar-group\" open>\n <summary class=\"wu-sidebar-toggle\">Projects</summary>\n <ul class=\"wu-sidebar-list\">\n <li><a class=\"wu-sidebar-link\" href=\"/projects/apollo\">Apollo</a></li>\n </ul>\n </details>\n </li>\n </ul>\n </div>\n <div class=\"wu-sidebar-footer\">Signed in as Sam</div>\n</nav>"
2906
+ },
2907
+ {
2908
+ "lang": "html",
2909
+ "code": "<nav class=\"wu-sidebar collapsed pinned\" aria-label=\"Main\">\n <ul class=\"wu-sidebar-list\">\n <li>\n <a class=\"wu-sidebar-link\" href=\"/settings\">\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"4\" /></svg>\n <span class=\"wu-sidebar-label\">Settings</span>\n </a>\n </li>\n </ul>\n</nav>"
2910
+ }
2911
+ ],
2912
+ "modifiers": [
2913
+ {
2914
+ "names": [
2915
+ "pinned"
2916
+ ],
2917
+ "description": "Sticks beside scrolling content and scrolls on its own",
2918
+ "since": "1.0.0"
2919
+ },
2920
+ {
2921
+ "names": [
2922
+ "collapsed"
2923
+ ],
2924
+ "description": "Icon rail: labels and headings are visually hidden, and a label shows as a tooltip on hover or focus",
2925
+ "since": "1.0.0"
2926
+ },
2927
+ {
2928
+ "names": [
2929
+ "animated"
2930
+ ],
2931
+ "description": "Animates the width, the chevron and the opening of groups when the user allows motion; `wu-animated` on an ancestor does the same",
2932
+ "since": "1.0.0"
2933
+ }
2934
+ ],
2935
+ "parts": [
2936
+ {
2937
+ "names": [
2938
+ "wu-sidebar-header"
2939
+ ],
2940
+ "description": "Top row for a logo or title",
2941
+ "since": "1.0.0"
2942
+ },
2943
+ {
2944
+ "names": [
2945
+ "wu-sidebar-footer"
2946
+ ],
2947
+ "description": "Bottom row, pushed to the end",
2948
+ "since": "1.0.0"
2949
+ },
2950
+ {
2951
+ "names": [
2952
+ "wu-sidebar-section"
2953
+ ],
2954
+ "description": "Group of a heading and a list",
2955
+ "since": "1.0.0"
2956
+ },
2957
+ {
2958
+ "names": [
2959
+ "wu-sidebar-heading"
2960
+ ],
2961
+ "description": "Small muted section heading",
2962
+ "since": "1.0.0"
2963
+ },
2964
+ {
2965
+ "names": [
2966
+ "wu-sidebar-list"
2967
+ ],
2968
+ "description": "Vertical list of links; nested inside a group it is indented",
2969
+ "since": "1.0.0"
2970
+ },
2971
+ {
2972
+ "names": [
2973
+ "wu-sidebar-group"
2974
+ ],
2975
+ "description": "A `details` element that collapses a nested list",
2976
+ "since": "1.0.0"
2977
+ },
2978
+ {
2979
+ "names": [
2980
+ "wu-sidebar-toggle"
2981
+ ],
2982
+ "description": "Row that opens or closes a group, with a chevron",
2983
+ "since": "1.0.0"
2984
+ },
2985
+ {
2986
+ "names": [
2987
+ "wu-sidebar-link"
2988
+ ],
2989
+ "description": "Navigation link row",
2990
+ "since": "1.0.0"
2991
+ },
2992
+ {
2993
+ "names": [
2994
+ "wu-sidebar-label"
2995
+ ],
2996
+ "description": "Text label of a link; hidden and shown as a tooltip when collapsed",
2997
+ "since": "1.0.0"
2998
+ }
2999
+ ],
3000
+ "variables": [
3001
+ {
3002
+ "names": [
3003
+ "--wu-sidebar--Width"
3004
+ ],
3005
+ "description": "Sidebar width",
3006
+ "since": "1.0.0",
3007
+ "default": "16rem"
3008
+ },
3009
+ {
3010
+ "names": [
3011
+ "--wu-sidebar--CollapsedWidth"
3012
+ ],
3013
+ "description": "Width of the icon rail",
3014
+ "since": "1.0.0",
3015
+ "default": "calc(1em + 3rem)"
3016
+ }
3017
+ ],
3018
+ "states": [
3019
+ {
3020
+ "names": [
3021
+ "aria-current=\"page\""
3022
+ ],
3023
+ "description": "The current link: tinted fill and a bar at the inline start",
3024
+ "since": "1.0.0"
3025
+ },
3026
+ {
3027
+ "names": [
3028
+ "open",
3029
+ "aria-expanded=\"true\""
3030
+ ],
3031
+ "description": "The chevron points down",
3032
+ "since": "1.0.0"
3033
+ }
3034
+ ],
3035
+ "changed": []
3036
+ },
3037
+ {
3038
+ "name": "skeleton",
3039
+ "root": "wu-skeleton",
3040
+ "summary": "Placeholder shapes shown while content loads.",
3041
+ "notes": [
3042
+ "Placeholders are decorative: add `aria-hidden=\"true\"` to each skeleton and `aria-busy=\"true\"` to the region being loaded, plus visible or hidden Loading text. Remove both when the content arrives.",
3043
+ "The default shape is a block. Adjacent `text` skeletons stack with a gap, and a last `text` line is shorter."
3044
+ ],
3045
+ "since": "1.0.0",
3046
+ "needs": [],
3047
+ "js": {
3048
+ "mode": "none",
3049
+ "exports": []
3050
+ },
3051
+ "examples": [
3052
+ {
3053
+ "lang": "html",
3054
+ "code": "<div aria-busy=\"true\">\n <span class=\"sr-only\">Loading</span>\n <div class=\"wu-skeleton circle animated\" aria-hidden=\"true\"></div>\n <div class=\"wu-skeleton text animated\" aria-hidden=\"true\"></div>\n <div class=\"wu-skeleton text animated\" aria-hidden=\"true\"></div>\n</div>"
3055
+ },
3056
+ {
3057
+ "lang": "html",
3058
+ "code": "<div class=\"wu-skeleton\" aria-hidden=\"true\" style=\"--wu-skeleton--Height: 8rem\"></div>"
3059
+ }
3060
+ ],
3061
+ "modifiers": [
3062
+ {
3063
+ "names": [
3064
+ "text"
3065
+ ],
3066
+ "description": "One line of text: height of `1em`",
3067
+ "since": "1.0.0"
3068
+ },
3069
+ {
3070
+ "names": [
3071
+ "circle"
3072
+ ],
3073
+ "description": "Round shape for an avatar",
3074
+ "since": "1.0.0"
3075
+ },
3076
+ {
3077
+ "names": [
3078
+ "animated"
3079
+ ],
3080
+ "description": "Shimmer sweep, staggered across siblings where supported, when the user allows motion; `wu-animated` on an ancestor does the same",
3081
+ "since": "1.0.0"
3082
+ }
3083
+ ],
3084
+ "parts": [],
3085
+ "variables": [
3086
+ {
3087
+ "names": [
3088
+ "--wu-skeleton--Width"
3089
+ ],
3090
+ "description": "Width; a last `text` line defaults to 60%",
3091
+ "since": "1.0.0",
3092
+ "default": "100%"
3093
+ },
3094
+ {
3095
+ "names": [
3096
+ "--wu-skeleton--Height"
3097
+ ],
3098
+ "description": "Height; `text` defaults to 1em",
3099
+ "since": "1.0.0",
3100
+ "default": "6rem"
3101
+ },
3102
+ {
3103
+ "names": [
3104
+ "--wu-skeleton--Size"
3105
+ ],
3106
+ "description": "Width and height of a `circle`",
3107
+ "since": "1.0.0",
3108
+ "default": "2.5rem"
3109
+ }
3110
+ ],
3111
+ "states": [],
3112
+ "changed": []
3113
+ },
3114
+ {
3115
+ "name": "spinner",
3116
+ "root": "wu-spinner",
3117
+ "summary": "Loading ring in the current text color, with an overlay for busy regions.",
3118
+ "notes": [
3119
+ "Pair it with `role=\"status\"` and hidden text, or use `aria-hidden=\"true\"` next to visible text. Reduced motion is handled by core reset.",
3120
+ "The overlay covers its parent, dims the content and centers a spinner with optional text. The parent becomes the positioning box unless it already has a position."
3121
+ ],
3122
+ "since": "1.0.0",
3123
+ "needs": [],
3124
+ "js": {
3125
+ "mode": "none",
3126
+ "exports": []
3127
+ },
3128
+ "examples": [
3129
+ {
3130
+ "lang": "html",
3131
+ "code": "<span class=\"wu-spinner\" role=\"status\"><span class=\"sr-only\">Loading</span></span>\n<button class=\"wu-btn\" type=\"button\" aria-busy=\"true\"><span class=\"wu-spinner sm\" aria-hidden=\"true\"></span> Saving</button>"
3132
+ },
3133
+ {
3134
+ "lang": "html",
3135
+ "code": "<div aria-busy=\"true\">\n <div inert>Orders table</div>\n <div class=\"wu-spinner-overlay\"><span class=\"wu-spinner\" aria-hidden=\"true\"></span><span>Loading orders</span></div>\n</div>"
3136
+ }
3137
+ ],
3138
+ "modifiers": [
3139
+ {
3140
+ "names": [
3141
+ "sm",
3142
+ "lg"
3143
+ ],
3144
+ "description": "Smaller (1rem) or larger (2rem, thicker band) ring",
3145
+ "since": "1.0.0"
3146
+ }
3147
+ ],
3148
+ "parts": [
3149
+ {
3150
+ "names": [
3151
+ "wu-spinner-overlay"
3152
+ ],
3153
+ "description": "Layer that covers a busy region and centers a spinner with text",
3154
+ "since": "1.0.0"
3155
+ }
3156
+ ],
3157
+ "variables": [
3158
+ {
3159
+ "names": [
3160
+ "--wu-spinner--Size"
3161
+ ],
3162
+ "description": "Width and height of the ring",
3163
+ "since": "1.0.0",
3164
+ "default": "1.25rem"
3165
+ },
3166
+ {
3167
+ "names": [
3168
+ "--wu-spinner-overlay--Background"
3169
+ ],
3170
+ "description": "Overlay background",
3171
+ "since": "1.0.0",
3172
+ "default": "85% surface"
3173
+ }
3174
+ ],
3175
+ "states": [],
3176
+ "changed": []
3177
+ },
3178
+ {
3179
+ "name": "stat",
3180
+ "root": "wu-stat",
3181
+ "summary": "One figure with a label, a large value in tabular figures and an optional change line.",
3182
+ "notes": [
3183
+ "Keep the signed number as text in the change line; the arrow and the color repeat it, they never replace it."
3184
+ ],
3185
+ "since": "1.0.0",
3186
+ "needs": [],
3187
+ "js": {
3188
+ "mode": "none",
3189
+ "exports": []
3190
+ },
3191
+ "examples": [
3192
+ {
3193
+ "lang": "html",
3194
+ "code": "<div class=\"wu-stat\">\n <span class=\"wu-stat-label\">Active users</span>\n <span class=\"wu-stat-value\">1,284</span>\n <span class=\"wu-stat-delta success\" data-trend=\"up\">+12% from last month</span>\n</div>"
3195
+ },
3196
+ {
3197
+ "lang": "html",
3198
+ "code": "<div class=\"wu-stat lg\">\n <span class=\"wu-stat-label\">Open tickets</span>\n <span class=\"wu-stat-value\">37</span>\n <span class=\"wu-stat-delta\" data-trend=\"down\">-5 this week</span>\n</div>"
3199
+ }
3200
+ ],
3201
+ "modifiers": [
3202
+ {
3203
+ "names": [
3204
+ "sm",
3205
+ "lg"
3206
+ ],
3207
+ "description": "Smaller or larger value",
3208
+ "since": "1.0.0"
3209
+ },
3210
+ {
3211
+ "names": [
3212
+ "success",
3213
+ "danger"
3214
+ ],
3215
+ "description": "On the change line: success or danger text color",
3216
+ "since": "1.0.0"
3217
+ }
3218
+ ],
3219
+ "parts": [
3220
+ {
3221
+ "names": [
3222
+ "wu-stat-label"
3223
+ ],
3224
+ "description": "Muted label",
3225
+ "since": "1.0.0"
3226
+ },
3227
+ {
3228
+ "names": [
3229
+ "wu-stat-value"
3230
+ ],
3231
+ "description": "Large value",
3232
+ "since": "1.0.0"
3233
+ },
3234
+ {
3235
+ "names": [
3236
+ "wu-stat-delta"
3237
+ ],
3238
+ "description": "Change line, muted by default",
3239
+ "since": "1.0.0"
3240
+ }
3241
+ ],
3242
+ "variables": [],
3243
+ "states": [
3244
+ {
3245
+ "names": [
3246
+ "data-trend=\"up\"",
3247
+ "data-trend=\"down\""
3248
+ ],
3249
+ "description": "On the change line: draws an up or down arrow",
3250
+ "since": "1.0.0"
3251
+ }
3252
+ ],
3253
+ "changed": []
3254
+ },
3255
+ {
3256
+ "name": "table",
3257
+ "root": "wu-table",
3258
+ "summary": "Data table with sticky header and columns, selection, expandable rows, truncated cells, a summary row and striped styles.",
3259
+ "notes": [
3260
+ "Put a wide table in a `wu-table-scroll` region with `tabindex=\"0\"`, `role=\"region\"` and an `aria-label`; it shows scroll shadows on the sides with more content. Sticky columns need that region.",
3261
+ "The select-all checkbox and expandable rows need the kit script; everything else is CSS. Sorting the rows and updating `aria-sort` is up to your script.",
3262
+ "A truncated cell takes the full text in core's `data-tooltip` and `tabindex=\"0\"`. `aria-selected` on a row is valid only in a `role=\"grid\"` table."
3263
+ ],
3264
+ "since": "1.0.0",
3265
+ "needs": [],
3266
+ "js": {
3267
+ "mode": "optional",
3268
+ "exports": [
3269
+ "initTable"
3270
+ ]
3271
+ },
3272
+ "examples": [
3273
+ {
3274
+ "lang": "html",
3275
+ "code": "<div class=\"wu-table-scroll\" tabindex=\"0\" role=\"region\" aria-label=\"Invoices\">\n <table class=\"wu-table striped hover\">\n <caption>Open invoices</caption>\n <thead>\n <tr>\n <th scope=\"col\">Invoice</th>\n <th scope=\"col\" class=\"wu-table-num\">Amount</th>\n </tr>\n </thead>\n <tbody>\n <tr><th scope=\"row\">INV-1042</th><td class=\"wu-table-num\">$1,200.00</td></tr>\n <tr><th scope=\"row\">INV-1043</th><td class=\"wu-table-num\">$340.00</td></tr>\n </tbody>\n <tfoot><tr><th scope=\"row\">Total</th><td class=\"wu-table-num\">$1,540.00</td></tr></tfoot>\n </table>\n</div>"
3276
+ },
3277
+ {
3278
+ "lang": "html",
3279
+ "code": "<table class=\"wu-table\">\n <thead>\n <tr>\n <th scope=\"col\" class=\"wu-table-select\"><input type=\"checkbox\" class=\"wu-checkbox-input\" aria-label=\"Select all rows\"></th>\n <th scope=\"col\" aria-sort=\"ascending\"><button class=\"wu-table-sort\" type=\"button\">Name</button></th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td class=\"wu-table-select\"><input type=\"checkbox\" class=\"wu-checkbox-input\" aria-label=\"Select Ana Lopez\"></td>\n <th scope=\"row\"><button class=\"wu-table-expand\" type=\"button\" aria-expanded=\"false\" aria-label=\"Details for Ana Lopez\"></button> Ana Lopez</th>\n </tr>\n <tr class=\"wu-table-detail\" hidden><td colspan=\"2\">Owner since 2021</td></tr>\n </tbody>\n</table>"
3280
+ },
3281
+ {
3282
+ "lang": "html",
3283
+ "code": "<table class=\"wu-table\">\n <tbody>\n <tr><td class=\"wu-table-truncate\" tabindex=\"0\" data-tooltip=\"Typo on the billing page\"><span>Typo on the billing page</span></td></tr>\n </tbody>\n</table>"
3284
+ }
3285
+ ],
3286
+ "modifiers": [
3287
+ {
3288
+ "names": [
3289
+ "sm"
3290
+ ],
3291
+ "description": "Tighter cell padding",
3292
+ "since": "1.0.0"
3293
+ },
3294
+ {
3295
+ "names": [
3296
+ "striped"
3297
+ ],
3298
+ "description": "Tint on every second body row",
3299
+ "since": "1.0.0"
3300
+ },
3301
+ {
3302
+ "names": [
3303
+ "hover"
3304
+ ],
3305
+ "description": "Tint on the row under the pointer",
3306
+ "since": "1.0.0"
3307
+ },
3308
+ {
3309
+ "names": [
3310
+ "bordered"
3311
+ ],
3312
+ "description": "Outer border with rounded corners and borders between cells",
3313
+ "since": "1.0.0"
3314
+ },
3315
+ {
3316
+ "names": [
3317
+ "sticky-header"
3318
+ ],
3319
+ "description": "Header cells stick to the top of the page, or of the scroll region when `--wu-table--MaxHeight` is set",
3320
+ "since": "1.0.0"
3321
+ },
3322
+ {
3323
+ "names": [
3324
+ "sticky-start",
3325
+ "sticky-end"
3326
+ ],
3327
+ "description": "First or last column sticks inside a `wu-table-scroll` region, with an edge shadow on the scrolling side",
3328
+ "since": "1.0.0"
3329
+ },
3330
+ {
3331
+ "names": [
3332
+ "animated"
3333
+ ],
3334
+ "description": "Spring turn of the expand chevron when the user allows motion; `wu-animated` on an ancestor does the same",
3335
+ "since": "1.0.0"
3336
+ }
3337
+ ],
3338
+ "parts": [
3339
+ {
3340
+ "names": [
3341
+ "wu-table-scroll"
3342
+ ],
3343
+ "description": "Scroll region for a wide table, with scroll shadows",
3344
+ "since": "1.0.0"
3345
+ },
3346
+ {
3347
+ "names": [
3348
+ "wu-table-num"
3349
+ ],
3350
+ "description": "Cell with end-aligned numbers in tabular figures",
3351
+ "since": "1.0.0"
3352
+ },
3353
+ {
3354
+ "names": [
3355
+ "wu-table-select"
3356
+ ],
3357
+ "description": "Cell of a checkbox column, as narrow as its checkbox",
3358
+ "since": "1.0.0"
3359
+ },
3360
+ {
3361
+ "names": [
3362
+ "wu-table-truncate"
3363
+ ],
3364
+ "description": "Cell whose text child stays on one line with an ellipsis",
3365
+ "since": "1.0.0"
3366
+ },
3367
+ {
3368
+ "names": [
3369
+ "wu-table-sort"
3370
+ ],
3371
+ "description": "Button in a header cell that shows sort arrows",
3372
+ "since": "1.0.0"
3373
+ },
3374
+ {
3375
+ "names": [
3376
+ "wu-table-expand"
3377
+ ],
3378
+ "description": "Button with `aria-expanded` that shows or hides the detail row",
3379
+ "since": "1.0.0"
3380
+ },
3381
+ {
3382
+ "names": [
3383
+ "wu-table-detail"
3384
+ ],
3385
+ "description": "Row after an expandable row, with the alternate background",
3386
+ "since": "1.0.0"
3387
+ }
3388
+ ],
3389
+ "variables": [
3390
+ {
3391
+ "names": [
3392
+ "--wu-table--Background"
3393
+ ],
3394
+ "description": "Background that scroll shadows and sticky cells blend into",
3395
+ "since": "1.0.0",
3396
+ "default": "var(--wu-bg-surface)"
3397
+ },
3398
+ {
3399
+ "names": [
3400
+ "--wu-table--MaxHeight"
3401
+ ],
3402
+ "description": "Maximum height of the scroll region, so the header can stick inside it",
3403
+ "since": "1.0.0",
3404
+ "default": "none"
3405
+ },
3406
+ {
3407
+ "names": [
3408
+ "--wu-table--TruncateWidth"
3409
+ ],
3410
+ "description": "Maximum width of a truncated cell text",
3411
+ "since": "1.0.0",
3412
+ "default": "16rem"
3413
+ }
3414
+ ],
3415
+ "states": [
3416
+ {
3417
+ "names": [
3418
+ "aria-sort=\"ascending\"",
3419
+ "aria-sort=\"descending\""
3420
+ ],
3421
+ "description": "On a header cell: one arrow on the sort button and regular text color",
3422
+ "since": "1.0.0"
3423
+ },
3424
+ {
3425
+ "names": [
3426
+ "aria-expanded=\"true\""
3427
+ ],
3428
+ "description": "On an expand button: the chevron points down",
3429
+ "since": "1.0.0"
3430
+ },
3431
+ {
3432
+ "names": [
3433
+ "aria-selected=\"true\""
3434
+ ],
3435
+ "description": "On a row: selected tint and a bar at the start of the first cell; a checked `wu-table-select` box does the same",
3436
+ "since": "1.0.0"
3437
+ }
3438
+ ],
3439
+ "changed": []
3440
+ },
3441
+ {
3442
+ "name": "tabs",
3443
+ "root": "wu-tabs",
3444
+ "summary": "Tabs that show one panel at a time, following the WAI-ARIA tabs pattern, in line, card, boxed and vertical styles.",
3445
+ "notes": [
3446
+ "The kit script adds arrow keys, Home and End, switches the panels and fills in roles, ids, `aria-controls`, `aria-labelledby` and `tabindex` when they are missing. Without it the first panel shows.",
3447
+ "In `vertical` tabs the script sets `aria-orientation=\"vertical\"` on the list; without the script, add it yourself."
3448
+ ],
3449
+ "since": "1.0.0",
3450
+ "needs": [],
3451
+ "js": {
3452
+ "mode": "required",
3453
+ "exports": [
3454
+ "initTabs"
3455
+ ]
3456
+ },
3457
+ "examples": [
3458
+ {
3459
+ "lang": "html",
3460
+ "code": "<div class=\"wu-tabs\">\n <div class=\"wu-tabs-list\" role=\"tablist\" aria-label=\"Account\">\n <button class=\"wu-tabs-tab\" type=\"button\" role=\"tab\" id=\"tab-profile\" aria-controls=\"panel-profile\" aria-selected=\"true\">Profile</button>\n <button class=\"wu-tabs-tab\" type=\"button\" role=\"tab\" id=\"tab-billing\" aria-controls=\"panel-billing\" aria-selected=\"false\" tabindex=\"-1\">Billing</button>\n </div>\n <div class=\"wu-tabs-panel\" role=\"tabpanel\" id=\"panel-profile\" aria-labelledby=\"tab-profile\" tabindex=\"0\">Profile settings</div>\n <div class=\"wu-tabs-panel\" role=\"tabpanel\" id=\"panel-billing\" aria-labelledby=\"tab-billing\" tabindex=\"0\" hidden>Billing settings</div>\n</div>"
3461
+ },
3462
+ {
3463
+ "lang": "html",
3464
+ "code": "<div class=\"wu-tabs vertical boxed\">\n <div class=\"wu-tabs-list\" role=\"tablist\" aria-label=\"Settings\" aria-orientation=\"vertical\">\n <button class=\"wu-tabs-tab\" type=\"button\" role=\"tab\" id=\"tab-general\" aria-controls=\"panel-general\" aria-selected=\"true\">General</button>\n <button class=\"wu-tabs-tab\" type=\"button\" role=\"tab\" id=\"tab-team\" aria-controls=\"panel-team\" aria-selected=\"false\" tabindex=\"-1\" disabled>Team</button>\n </div>\n <div class=\"wu-tabs-panel\" role=\"tabpanel\" id=\"panel-general\" aria-labelledby=\"tab-general\" tabindex=\"0\">General settings</div>\n <div class=\"wu-tabs-panel\" role=\"tabpanel\" id=\"panel-team\" aria-labelledby=\"tab-team\" tabindex=\"0\" hidden>Team settings</div>\n</div>"
3465
+ }
3466
+ ],
3467
+ "modifiers": [
3468
+ {
3469
+ "names": [
3470
+ "card"
3471
+ ],
3472
+ "description": "Joined tab boxes; the selected tab opens into the panel",
3473
+ "since": "1.0.0"
3474
+ },
3475
+ {
3476
+ "names": [
3477
+ "boxed"
3478
+ ],
3479
+ "description": "Tabs and panels inside one bordered box",
3480
+ "since": "1.0.0"
3481
+ },
3482
+ {
3483
+ "names": [
3484
+ "vertical"
3485
+ ],
3486
+ "description": "Tab list at the inline start, selected bar on its inline end edge",
3487
+ "since": "1.0.0"
3488
+ },
3489
+ {
3490
+ "names": [
3491
+ "animated"
3492
+ ],
3493
+ "description": "Selected bar grows from the center and the panel fades in when the user allows motion; `wu-animated` on an ancestor does the same",
3494
+ "since": "1.0.0"
3495
+ }
3496
+ ],
3497
+ "parts": [
3498
+ {
3499
+ "names": [
3500
+ "wu-tabs-list"
3501
+ ],
3502
+ "description": "Row of tabs; scrolls sideways and fades the edge with more tabs",
3503
+ "since": "1.0.0"
3504
+ },
3505
+ {
3506
+ "names": [
3507
+ "wu-tabs-tab"
3508
+ ],
3509
+ "description": "One tab button; a direct child `svg` is sized to `1em`",
3510
+ "since": "1.0.0"
3511
+ },
3512
+ {
3513
+ "names": [
3514
+ "wu-tabs-panel"
3515
+ ],
3516
+ "description": "Content shown for the selected tab",
3517
+ "since": "1.0.0"
3518
+ }
3519
+ ],
3520
+ "variables": [],
3521
+ "states": [
3522
+ {
3523
+ "names": [
3524
+ "aria-selected=\"true\""
3525
+ ],
3526
+ "description": "On a tab: regular text color and a brand bar",
3527
+ "since": "1.0.0"
3528
+ },
3529
+ {
3530
+ "names": [
3531
+ "disabled",
3532
+ "aria-disabled=\"true\""
3533
+ ],
3534
+ "description": "On a tab: half opacity and a not-allowed cursor",
3535
+ "since": "1.0.0"
3536
+ }
3537
+ ],
3538
+ "changed": []
3539
+ },
3540
+ {
3541
+ "name": "tag",
3542
+ "root": "wu-tag",
3543
+ "summary": "Label for a category or a filter, in seven hues, as plain text, a link or a button.",
3544
+ "notes": [
3545
+ "A link or button tag gets a pointer, a hover color and the focus ring. `aria-pressed` on a button tag makes a checkable filter chip; toggling the attribute is up to your script.",
3546
+ "A direct child `svg` is sized to `1em`. The remove button needs an `aria-label` that names the tag."
3547
+ ],
3548
+ "since": "1.0.0",
3549
+ "needs": [],
3550
+ "js": {
3551
+ "mode": "none",
3552
+ "exports": []
3553
+ },
3554
+ "examples": [
3555
+ {
3556
+ "lang": "html",
3557
+ "code": "<span class=\"wu-tag\">Design</span>\n<span class=\"wu-tag blue\">Frontend</span>"
3558
+ },
3559
+ {
3560
+ "lang": "html",
3561
+ "code": "<div role=\"group\" aria-label=\"Filter by topic\">\n <button class=\"wu-tag\" type=\"button\" aria-pressed=\"true\">Design</button>\n <button class=\"wu-tag\" type=\"button\" aria-pressed=\"false\">Research</button>\n</div>"
3562
+ },
3563
+ {
3564
+ "lang": "html",
3565
+ "code": "<span class=\"wu-tag purple\">Research <button class=\"wu-tag-remove\" type=\"button\" aria-label=\"Remove Research\"></button></span>"
3566
+ }
3567
+ ],
3568
+ "modifiers": [
3569
+ {
3570
+ "names": [
3571
+ "gray",
3572
+ "red",
3573
+ "blue",
3574
+ "green",
3575
+ "yellow",
3576
+ "purple",
3577
+ "pink"
3578
+ ],
3579
+ "description": "Hue color: subtle background, hue border and hue text",
3580
+ "since": "1.0.0"
3581
+ }
3582
+ ],
3583
+ "parts": [
3584
+ {
3585
+ "names": [
3586
+ "wu-tag-remove"
3587
+ ],
3588
+ "description": "Remove button inside the tag, its cross drawn in CSS",
3589
+ "since": "1.0.0"
3590
+ }
3591
+ ],
3592
+ "variables": [],
3593
+ "states": [
3594
+ {
3595
+ "names": [
3596
+ "aria-pressed=\"true\""
3597
+ ],
3598
+ "description": "On a button tag: brand tint, ring and a check mark",
3599
+ "since": "1.0.0"
3600
+ }
3601
+ ],
3602
+ "changed": []
3603
+ },
3604
+ {
3605
+ "name": "text",
3606
+ "root": "wu-text",
3607
+ "summary": "Body text on any element, with relaxed leading and space between paragraphs in a row.",
3608
+ "notes": [],
3609
+ "since": "1.0.0",
3610
+ "needs": [],
3611
+ "js": {
3612
+ "mode": "none",
3613
+ "exports": []
3614
+ },
3615
+ "examples": [
3616
+ {
3617
+ "lang": "html",
3618
+ "code": "<p class=\"wu-text lg\">A lead paragraph introduces the page.</p>\n<p class=\"wu-text\">Body text follows with relaxed leading.</p>\n<p class=\"wu-text sm muted\">Small, muted text for notes and fine print.</p>"
3619
+ }
3620
+ ],
3621
+ "modifiers": [
3622
+ {
3623
+ "names": [
3624
+ "sm"
3625
+ ],
3626
+ "description": "Small size",
3627
+ "since": "1.0.0"
3628
+ },
3629
+ {
3630
+ "names": [
3631
+ "lg"
3632
+ ],
3633
+ "description": "Large size, for a lead paragraph",
3634
+ "since": "1.0.0"
3635
+ },
3636
+ {
3637
+ "names": [
3638
+ "muted"
3639
+ ],
3640
+ "description": "Muted color",
3641
+ "since": "1.0.0"
3642
+ }
3643
+ ],
3644
+ "parts": [],
3645
+ "variables": [],
3646
+ "states": [],
3647
+ "changed": []
3648
+ },
3649
+ {
3650
+ "name": "textarea",
3651
+ "root": "wu-textarea",
3652
+ "summary": "Multi-line field with a bounded height that grows with the content, where the browser supports it.",
3653
+ "notes": [
3654
+ "Core base already styles a `textarea` like an input (border, focus ring, invalid border, disabled). The kit adds the radius, the type size and a height between three and twelve lines.",
3655
+ "Growth uses `field-sizing: content`, and `rows` is ignored there."
3656
+ ],
3657
+ "since": "1.0.0",
3658
+ "needs": [],
3659
+ "js": {
3660
+ "mode": "none",
3661
+ "exports": []
3662
+ },
3663
+ "examples": [
3664
+ {
3665
+ "lang": "html",
3666
+ "code": "<div class=\"wu-field\">\n <label class=\"wu-field-label\" for=\"textarea-notes\">Notes</label>\n <textarea class=\"wu-textarea\" id=\"textarea-notes\">Type more lines to see the field grow.</textarea>\n</div>"
3667
+ },
3668
+ {
3669
+ "lang": "html",
3670
+ "code": "<textarea class=\"wu-textarea\" aria-label=\"Short note\" style=\"--wu-textarea--MinHeight: 2.5rem; --wu-textarea--MaxHeight: 6rem\">One line to start.</textarea>"
3671
+ }
3672
+ ],
3673
+ "modifiers": [],
3674
+ "parts": [],
3675
+ "variables": [
3676
+ {
3677
+ "names": [
3678
+ "--wu-textarea--MinHeight"
3679
+ ],
3680
+ "description": "Minimum height",
3681
+ "since": "1.0.0",
3682
+ "default": "3 lines plus padding and border"
3683
+ },
3684
+ {
3685
+ "names": [
3686
+ "--wu-textarea--MaxHeight"
3687
+ ],
3688
+ "description": "Maximum height",
3689
+ "since": "1.0.0",
3690
+ "default": "12 lines plus padding and border"
3691
+ }
3692
+ ],
3693
+ "states": [
3694
+ {
3695
+ "names": [
3696
+ ":disabled"
3697
+ ],
3698
+ "description": "Not-allowed cursor and no resize",
3699
+ "since": "1.0.0"
3700
+ },
3701
+ {
3702
+ "names": [
3703
+ "readonly"
3704
+ ],
3705
+ "description": "Alternate background",
3706
+ "since": "1.0.0"
3707
+ },
3708
+ {
3709
+ "names": [
3710
+ "aria-invalid=\"true\"",
3711
+ ":user-invalid"
3712
+ ],
3713
+ "description": "Danger border doubled to 2px, so the change is not color alone",
3714
+ "since": "1.0.0"
3715
+ }
3716
+ ],
3717
+ "changed": []
3718
+ },
3719
+ {
3720
+ "name": "timeline",
3721
+ "root": "wu-timeline",
3722
+ "summary": "Ordered list of events with markers and a rail, role colors and a progress mode.",
3723
+ "notes": [
3724
+ "Role words on an item color its marker; `success`, `warning` and `danger` also change the marker shape, so color is not the only cue.",
3725
+ "With `aria-current=\"step\"` on one item the list becomes a progress rail: earlier items filled, the current one ringed, later ones hollow. Say \"completed\" in the item text too."
3726
+ ],
3727
+ "since": "1.0.0",
3728
+ "needs": [],
3729
+ "js": {
3730
+ "mode": "none",
3731
+ "exports": []
3732
+ },
3733
+ "examples": [
3734
+ {
3735
+ "lang": "html",
3736
+ "code": "<ol class=\"wu-timeline\">\n <li class=\"wu-timeline-item success\">\n <p class=\"wu-timeline-title\">Order shipped</p>\n <time class=\"wu-timeline-time\" datetime=\"2026-03-02\">2 March</time>\n <p class=\"wu-timeline-text\">Handed to the carrier.</p>\n </li>\n <li class=\"wu-timeline-item danger\">\n <p class=\"wu-timeline-title\">Payment failed</p>\n <time class=\"wu-timeline-time\" datetime=\"2026-03-01\">1 March</time>\n </li>\n</ol>"
3737
+ },
3738
+ {
3739
+ "lang": "html",
3740
+ "code": "<ol class=\"wu-timeline\">\n <li class=\"wu-timeline-item\"><p class=\"wu-timeline-title\">Cart (completed)</p></li>\n <li class=\"wu-timeline-item\" aria-current=\"step\"><p class=\"wu-timeline-title\">Payment</p></li>\n <li class=\"wu-timeline-item\"><p class=\"wu-timeline-title\">Confirmation</p></li>\n</ol>"
3741
+ }
3742
+ ],
3743
+ "modifiers": [
3744
+ {
3745
+ "names": [
3746
+ "brand",
3747
+ "info"
3748
+ ],
3749
+ "description": "On an item: marker color",
3750
+ "since": "1.0.0"
3751
+ },
3752
+ {
3753
+ "names": [
3754
+ "success",
3755
+ "warning",
3756
+ "danger"
3757
+ ],
3758
+ "description": "On an item: marker color and a check, triangle or octagon shape",
3759
+ "since": "1.0.0"
3760
+ },
3761
+ {
3762
+ "names": [
3763
+ "animated"
3764
+ ],
3765
+ "description": "Each rail segment draws once as it scrolls into view when the user allows motion; `wu-animated` on an ancestor does the same",
3766
+ "since": "1.0.0"
3767
+ }
3768
+ ],
3769
+ "parts": [
3770
+ {
3771
+ "names": [
3772
+ "wu-timeline-item"
3773
+ ],
3774
+ "description": "One event: a marker, a rail to the next item and the content",
3775
+ "since": "1.0.0"
3776
+ },
3777
+ {
3778
+ "names": [
3779
+ "wu-timeline-title"
3780
+ ],
3781
+ "description": "Event title in medium weight",
3782
+ "since": "1.0.0"
3783
+ },
3784
+ {
3785
+ "names": [
3786
+ "wu-timeline-time"
3787
+ ],
3788
+ "description": "Muted time or date line",
3789
+ "since": "1.0.0"
3790
+ },
3791
+ {
3792
+ "names": [
3793
+ "wu-timeline-text"
3794
+ ],
3795
+ "description": "Muted description",
3796
+ "since": "1.0.0"
3797
+ }
3798
+ ],
3799
+ "variables": [],
3800
+ "states": [
3801
+ {
3802
+ "names": [
3803
+ "aria-current=\"step\""
3804
+ ],
3805
+ "description": "On an item: the current step, ringed; earlier items fill and later ones turn hollow",
3806
+ "since": "1.0.0"
3807
+ }
3808
+ ],
3809
+ "changed": []
3810
+ },
3811
+ {
3812
+ "name": "title",
3813
+ "root": "wu-title",
3814
+ "summary": "Visual heading size on any element, in four steps.",
3815
+ "notes": [
3816
+ "Pick the heading level for the document outline and the size for the look."
3817
+ ],
3818
+ "since": "1.0.0",
3819
+ "needs": [],
3820
+ "js": {
3821
+ "mode": "none",
3822
+ "exports": []
3823
+ },
3824
+ "examples": [
3825
+ {
3826
+ "lang": "html",
3827
+ "code": "<h2 class=\"wu-title xl\">Extra large title</h2>\n<h2 class=\"wu-title\">Default title</h2>"
3828
+ },
3829
+ {
3830
+ "lang": "html",
3831
+ "code": "<h3 class=\"wu-title lg\">An h3 with the large size</h3>"
3832
+ }
3833
+ ],
3834
+ "modifiers": [
3835
+ {
3836
+ "names": [
3837
+ "sm"
3838
+ ],
3839
+ "description": "Large size, one step below the default",
3840
+ "since": "1.0.0"
3841
+ },
3842
+ {
3843
+ "names": [
3844
+ "lg"
3845
+ ],
3846
+ "description": "2xl size",
3847
+ "since": "1.0.0"
3848
+ },
3849
+ {
3850
+ "names": [
3851
+ "xl"
3852
+ ],
3853
+ "description": "3xl size",
3854
+ "since": "1.0.0"
3855
+ }
3856
+ ],
3857
+ "parts": [],
3858
+ "variables": [],
3859
+ "states": [],
3860
+ "changed": []
3861
+ },
3862
+ {
3863
+ "name": "toast",
3864
+ "root": "wu-toast",
3865
+ "summary": "Short notification in a corner of the viewport, shown in a polite live region.",
3866
+ "notes": [
3867
+ "The region sits at the bottom end corner by default and scrolls when the toasts are taller than the viewport. The title text carries the meaning, not the color.",
3868
+ "`toast(\"Saved\")` from the kit script adds a toast, and the region when the page has none. It closes the toast after a delay, pauses on hover and focus, keeps at most three open and skips a repeat of an open message.",
3869
+ "Create the region at page load; a region added together with its first toast may not be announced."
3870
+ ],
3871
+ "since": "1.0.0",
3872
+ "needs": [],
3873
+ "js": {
3874
+ "mode": "required",
3875
+ "exports": [
3876
+ "toast",
3877
+ "dismiss"
3878
+ ]
3879
+ },
3880
+ "examples": [
3881
+ {
3882
+ "lang": "html",
3883
+ "code": "<section class=\"wu-toast-region animated\" aria-live=\"polite\" aria-label=\"Notifications\">\n <div class=\"wu-toast success\">\n <p class=\"wu-toast-title\">Saved</p>\n <p>Your changes are live.</p>\n <button class=\"wu-toast-close\" type=\"button\" aria-label=\"Close\"></button>\n </div>\n</section>"
3884
+ },
3885
+ {
3886
+ "lang": "html",
3887
+ "code": "<section class=\"wu-toast-region top-end\" aria-live=\"polite\" aria-label=\"Notifications\"></section>"
3888
+ }
3889
+ ],
3890
+ "modifiers": [
3891
+ {
3892
+ "names": [
3893
+ "brand",
3894
+ "success",
3895
+ "danger",
3896
+ "warning",
3897
+ "info"
3898
+ ],
3899
+ "description": "On a toast: role color on the start edge and the title",
3900
+ "since": "1.0.0"
3901
+ },
3902
+ {
3903
+ "names": [
3904
+ "top-start",
3905
+ "top-end",
3906
+ "bottom-start"
3907
+ ],
3908
+ "description": "On the region: moves it to another corner; the default is the bottom end corner",
3909
+ "since": "1.0.0"
3910
+ },
3911
+ {
3912
+ "names": [
3913
+ "animated"
3914
+ ],
3915
+ "description": "On the region: toasts slide in, fade out and stack behind the newest, fanning out on hover or focus; `wu-animated` on an ancestor does the same",
3916
+ "since": "1.0.0"
3917
+ }
3918
+ ],
3919
+ "parts": [
3920
+ {
3921
+ "names": [
3922
+ "wu-toast-region"
3923
+ ],
3924
+ "description": "Fixed live region that holds the toasts; hidden when empty",
3925
+ "since": "1.0.0"
3926
+ },
3927
+ {
3928
+ "names": [
3929
+ "wu-toast-title"
3930
+ ],
3931
+ "description": "Toast title in semibold weight",
3932
+ "since": "1.0.0"
3933
+ },
3934
+ {
3935
+ "names": [
3936
+ "wu-toast-close"
3937
+ ],
3938
+ "description": "Close button with `aria-label`, its cross drawn in CSS",
3939
+ "since": "1.0.0"
3940
+ }
3941
+ ],
3942
+ "variables": [
3943
+ {
3944
+ "names": [
3945
+ "--wu-toast--Width"
3946
+ ],
3947
+ "description": "Width of the toasts in the region",
3948
+ "since": "1.0.0",
3949
+ "default": "22rem"
3950
+ }
3951
+ ],
3952
+ "states": [
3953
+ {
3954
+ "names": [
3955
+ "hidden"
3956
+ ],
3957
+ "description": "On a toast: removed from layout, after a fade out with `animated`",
3958
+ "since": "1.0.0"
3959
+ },
3960
+ {
3961
+ "names": [
3962
+ ":empty"
3963
+ ],
3964
+ "description": "A region with no toasts is hidden",
3965
+ "since": "1.0.0"
3966
+ }
3967
+ ],
3968
+ "changed": []
3969
+ },
3970
+ {
3971
+ "name": "toggle",
3972
+ "root": "wu-toggle",
3973
+ "summary": "On and off switch built on a native checkbox with `role=\"switch\"`.",
3974
+ "notes": [
3975
+ "The track is 2.25em by 1.25em with a 1em thumb, so it follows the root type size and the `sm` and `lg` steps."
3976
+ ],
3977
+ "since": "1.0.0",
3978
+ "needs": [],
3979
+ "js": {
3980
+ "mode": "none",
3981
+ "exports": []
3982
+ },
3983
+ "examples": [
3984
+ {
3985
+ "lang": "html",
3986
+ "code": "<label class=\"wu-toggle\">\n <input class=\"wu-toggle-input\" type=\"checkbox\" role=\"switch\" checked>\n <span class=\"wu-toggle-label\">Email notifications</span>\n</label>"
3987
+ },
3988
+ {
3989
+ "lang": "html",
3990
+ "code": "<label class=\"wu-toggle lg animated\">\n <input class=\"wu-toggle-input\" type=\"checkbox\" role=\"switch\" aria-invalid=\"true\">\n <span class=\"wu-toggle-label\">Accept the terms</span>\n</label>"
3991
+ }
3992
+ ],
3993
+ "modifiers": [
3994
+ {
3995
+ "names": [
3996
+ "sm",
3997
+ "lg"
3998
+ ],
3999
+ "description": "Smaller or larger switch and label",
4000
+ "since": "1.0.0"
4001
+ },
4002
+ {
4003
+ "names": [
4004
+ "animated"
4005
+ ],
4006
+ "description": "Spring thumb when the user allows motion; `wu-animated` on an ancestor does the same",
4007
+ "since": "1.0.0"
4008
+ }
4009
+ ],
4010
+ "parts": [
4011
+ {
4012
+ "names": [
4013
+ "wu-toggle-input"
4014
+ ],
4015
+ "description": "The checkbox: track and thumb",
4016
+ "since": "1.0.0"
4017
+ },
4018
+ {
4019
+ "names": [
4020
+ "wu-toggle-label"
4021
+ ],
4022
+ "description": "Label text beside the switch",
4023
+ "since": "1.0.0"
4024
+ }
4025
+ ],
4026
+ "variables": [],
4027
+ "states": [
4028
+ {
4029
+ "names": [
4030
+ ":checked"
4031
+ ],
4032
+ "description": "Brand track and the thumb moved to the end",
4033
+ "since": "1.0.0"
4034
+ },
4035
+ {
4036
+ "names": [
4037
+ "disabled"
4038
+ ],
4039
+ "description": "Half opacity and a not-allowed cursor",
4040
+ "since": "1.0.0"
4041
+ },
4042
+ {
4043
+ "names": [
4044
+ "aria-invalid=\"true\"",
4045
+ ":user-invalid"
4046
+ ],
4047
+ "description": "Danger outline",
4048
+ "since": "1.0.0"
4049
+ }
4050
+ ],
4051
+ "changed": []
4052
+ },
4053
+ {
4054
+ "name": "toolbar",
4055
+ "root": "wu-toolbar",
4056
+ "summary": "Wrapping row of controls, with groups, separators, an end group and a boxed variant.",
4057
+ "notes": [
4058
+ "A toolbar holds controls of one height, so it lines up by itself. Status displays such as tags and badges go outside the row.",
4059
+ "`role=\"toolbar\"` promises arrow-key focus, so add it only with a script that provides it; otherwise use a plain `div`."
4060
+ ],
4061
+ "since": "1.0.0",
4062
+ "needs": [],
4063
+ "js": {
4064
+ "mode": "none",
4065
+ "exports": []
4066
+ },
4067
+ "examples": [
4068
+ {
4069
+ "lang": "html",
4070
+ "code": "<div class=\"wu-toolbar\">\n <div class=\"wu-toolbar-group\">\n <button class=\"wu-btn sm\" type=\"button\">Bold</button>\n <button class=\"wu-btn sm\" type=\"button\">Italic</button>\n </div>\n <span class=\"wu-toolbar-separator\" aria-hidden=\"true\"></span>\n <div class=\"wu-toolbar-end\">\n <button class=\"wu-btn brand sm\" type=\"button\">Publish</button>\n </div>\n</div>"
4071
+ },
4072
+ {
4073
+ "lang": "html",
4074
+ "code": "<div class=\"wu-toolbar boxed\">\n <span class=\"wu-text sm\">3 selected</span>\n <button class=\"wu-btn sm\" type=\"button\">Archive</button>\n</div>"
4075
+ }
4076
+ ],
4077
+ "modifiers": [
4078
+ {
4079
+ "names": [
4080
+ "boxed"
4081
+ ],
4082
+ "description": "Border, padding and the alternate background",
4083
+ "since": "1.0.0"
4084
+ },
4085
+ {
4086
+ "names": [
4087
+ "sm"
4088
+ ],
4089
+ "description": "Smaller gap",
4090
+ "since": "1.0.0"
4091
+ }
4092
+ ],
4093
+ "parts": [
4094
+ {
4095
+ "names": [
4096
+ "wu-toolbar-group"
4097
+ ],
4098
+ "description": "Controls that stay together",
4099
+ "since": "1.0.0"
4100
+ },
4101
+ {
4102
+ "names": [
4103
+ "wu-toolbar-separator"
4104
+ ],
4105
+ "description": "Vertical line between groups",
4106
+ "since": "1.0.0"
4107
+ },
4108
+ {
4109
+ "names": [
4110
+ "wu-toolbar-end"
4111
+ ],
4112
+ "description": "Pushes itself and what follows to the end",
4113
+ "since": "1.0.0"
4114
+ }
4115
+ ],
4116
+ "variables": [],
4117
+ "states": [],
4118
+ "changed": []
4119
+ },
4120
+ {
4121
+ "name": "topbar",
4122
+ "root": "wu-topbar",
4123
+ "summary": "Application header with a brand, a scrolling nav, an end group, a pinned variant and a page progress line.",
4124
+ "notes": [
4125
+ "`wu-topbar-nav` works on the `nav` itself or on the `ul` inside it. When space runs out the nav scrolls first, then the brand truncates.",
4126
+ "The bar stays in the flow; add `pinned` to stick it to the top. The progress line is decoration, so mark it `aria-hidden=\"true\"`; it fills as the page scrolls and stays hidden when reduced motion is set."
4127
+ ],
4128
+ "since": "1.0.0",
4129
+ "needs": [],
4130
+ "js": {
4131
+ "mode": "none",
4132
+ "exports": []
4133
+ },
4134
+ "examples": [
4135
+ {
4136
+ "lang": "html",
4137
+ "code": "<header class=\"wu-topbar pinned\">\n <a class=\"wu-topbar-brand\" href=\"/\">Acme</a>\n <nav aria-label=\"Main\">\n <ul class=\"wu-topbar-nav\">\n <li><a class=\"wu-topbar-link\" href=\"/dashboard\" aria-current=\"page\">Dashboard</a></li>\n <li><a class=\"wu-topbar-link\" href=\"/billing\">Billing</a></li>\n </ul>\n </nav>\n <div class=\"wu-topbar-end\">\n <button class=\"wu-btn sm\" type=\"button\">Sign out</button>\n </div>\n <div class=\"wu-topbar-progress\" aria-hidden=\"true\"></div>\n</header>"
4138
+ },
4139
+ {
4140
+ "lang": "html",
4141
+ "code": "<header class=\"wu-topbar\">\n <a class=\"wu-topbar-brand\" href=\"/\">Acme</a>\n <nav class=\"wu-topbar-nav\" aria-label=\"Main\">\n <a class=\"wu-topbar-link\" href=\"/billing\" aria-current=\"page\">Billing</a>\n <a class=\"wu-topbar-link\" href=\"/team\">Team</a>\n </nav>\n</header>"
4142
+ }
4143
+ ],
4144
+ "modifiers": [
4145
+ {
4146
+ "names": [
4147
+ "pinned"
4148
+ ],
4149
+ "description": "Sticks to the top of its scroll container, with a shadow once stuck",
4150
+ "since": "1.0.0"
4151
+ }
4152
+ ],
4153
+ "parts": [
4154
+ {
4155
+ "names": [
4156
+ "wu-topbar-brand"
4157
+ ],
4158
+ "description": "Brand link or text; truncates last",
4159
+ "since": "1.0.0"
4160
+ },
4161
+ {
4162
+ "names": [
4163
+ "wu-topbar-nav"
4164
+ ],
4165
+ "description": "Nav, or its list, that takes the free space and scrolls sideways",
4166
+ "since": "1.0.0"
4167
+ },
4168
+ {
4169
+ "names": [
4170
+ "wu-topbar-link"
4171
+ ],
4172
+ "description": "Nav link; a direct child `svg` is sized to `1em`",
4173
+ "since": "1.0.0"
4174
+ },
4175
+ {
4176
+ "names": [
4177
+ "wu-topbar-end"
4178
+ ],
4179
+ "description": "Group pushed to the inline end",
4180
+ "since": "1.0.0"
4181
+ },
4182
+ {
4183
+ "names": [
4184
+ "wu-topbar-progress"
4185
+ ],
4186
+ "description": "Line along the bottom edge that fills as the page scrolls",
4187
+ "since": "1.0.0"
4188
+ }
4189
+ ],
4190
+ "variables": [],
4191
+ "states": [
4192
+ {
4193
+ "names": [
4194
+ "aria-current=\"page\""
4195
+ ],
4196
+ "description": "On a link: current page, brand underline",
4197
+ "since": "1.0.0"
4198
+ }
4199
+ ],
4200
+ "changed": []
4201
+ }
4202
+ ],
4203
+ "undocumented": []
4204
+ }