@kerfjs/ui 5.0.0-beta.23 → 5.0.0-beta.25

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 (288) hide show
  1. package/README.md +45 -23
  2. package/ai/application-ui-diagnostic-ids-v1.json +3 -0
  3. package/ai/application-ui-profile.defaults.json +1 -1
  4. package/ai/compile-time-contracts-v1.json +5 -12
  5. package/ai/component-catalog-v2-overrides.json +12 -49
  6. package/ai/component-catalog-v2.d.ts +1 -0
  7. package/ai/component-catalog-v2.json +458 -123
  8. package/ai/component-catalog-v2.schema.json +2 -1
  9. package/ai/component-catalog.json +658 -195
  10. package/ai/public-api-signatures-v1.md +160 -80
  11. package/ai/skill.md +22 -22
  12. package/ai/webawesome-jsx-signatures-v1.md +2 -1
  13. package/analyzer/cli.mjs +5 -2
  14. package/analyzer/index.d.mts +1 -0
  15. package/analyzer/index.mjs +117 -10
  16. package/dist/app-tab.d.ts +10 -2
  17. package/dist/app-tab.js +1 -1
  18. package/dist/browser/list-action-row.js +1 -0
  19. package/dist/browser/list-item.js +1 -0
  20. package/dist/browser/list.js +3 -0
  21. package/dist/browser/surface-scaffold.js +3 -0
  22. package/dist/catalog.d.ts +8 -4
  23. package/dist/catalog.js +21 -11
  24. package/dist/catalog.js.map +1 -1
  25. package/dist/{chunk-ELSJX4W7.js → chunk-4EF2CMYS.js} +25 -6
  26. package/dist/chunk-4EF2CMYS.js.map +1 -0
  27. package/dist/{chunk-OHU6CI22.js → chunk-B3A3IVO5.js} +2 -2
  28. package/dist/{chunk-OHU6CI22.js.map → chunk-B3A3IVO5.js.map} +1 -1
  29. package/dist/{chunk-K57KRAOV.js → chunk-FRVS5RFM.js} +24 -6
  30. package/dist/chunk-FRVS5RFM.js.map +1 -0
  31. package/dist/{chunk-DSNIYOZ3.js → chunk-GWEAPEZI.js} +16 -3
  32. package/dist/chunk-GWEAPEZI.js.map +1 -0
  33. package/dist/chunk-HP2B2L26.js +102 -0
  34. package/dist/chunk-HP2B2L26.js.map +1 -0
  35. package/dist/{chunk-OZWU5ZPZ.js → chunk-IJBSZ4NX.js} +2 -2
  36. package/dist/{chunk-OZWU5ZPZ.js.map → chunk-IJBSZ4NX.js.map} +1 -1
  37. package/dist/chunk-J5BFYY7Q.js +35 -0
  38. package/dist/chunk-J5BFYY7Q.js.map +1 -0
  39. package/dist/{chunk-GP5DP5DL.js → chunk-JFGXQBIP.js} +85 -24
  40. package/dist/chunk-JFGXQBIP.js.map +1 -0
  41. package/dist/{chunk-QQFJMRIB.js → chunk-KWWR5VMS.js} +2 -2
  42. package/dist/{chunk-QQFJMRIB.js.map → chunk-KWWR5VMS.js.map} +1 -1
  43. package/dist/chunk-OBLTAKSX.js +43 -0
  44. package/dist/chunk-OBLTAKSX.js.map +1 -0
  45. package/dist/{chunk-PIDTEQ3U.js → chunk-OT6RPYAP.js} +17 -3
  46. package/dist/chunk-OT6RPYAP.js.map +1 -0
  47. package/dist/{chunk-W7YD6E4N.js → chunk-R7ZWUN64.js} +2 -2
  48. package/dist/{chunk-W7YD6E4N.js.map → chunk-R7ZWUN64.js.map} +1 -1
  49. package/dist/{chunk-PZQVSDLH.js → chunk-RKVQEH4J.js} +1 -1
  50. package/dist/chunk-RKVQEH4J.js.map +1 -0
  51. package/dist/{chunk-7L6EHUMV.js → chunk-SYDMYBPG.js} +3 -3
  52. package/dist/chunk-SYDMYBPG.js.map +1 -0
  53. package/dist/{chunk-W4CXQYSG.js → chunk-TB6DY7H5.js} +3 -1
  54. package/dist/chunk-TB6DY7H5.js.map +1 -0
  55. package/dist/{chunk-AASLYRGE.js → chunk-UKKSMZYT.js} +18 -7
  56. package/dist/chunk-UKKSMZYT.js.map +1 -0
  57. package/dist/{chunk-BBRXX6PF.js → chunk-VCE4MPVE.js} +26 -4
  58. package/dist/chunk-VCE4MPVE.js.map +1 -0
  59. package/dist/{chunk-VLYV65LK.js → chunk-W5L2JSBY.js} +5 -3
  60. package/dist/chunk-W5L2JSBY.js.map +1 -0
  61. package/dist/{chunk-5VTB2BKP.js → chunk-WNWD54GR.js} +16 -2
  62. package/dist/chunk-WNWD54GR.js.map +1 -0
  63. package/dist/{chunk-M7JBER5U.js → chunk-X2U3QJCJ.js} +8 -2
  64. package/dist/chunk-X2U3QJCJ.js.map +1 -0
  65. package/dist/{chunk-DPDBVKNA.js → chunk-YMKH5XTF.js} +5 -3
  66. package/dist/chunk-YMKH5XTF.js.map +1 -0
  67. package/dist/collapsible-panel.d.ts +9 -1
  68. package/dist/collapsible-panel.js +36 -15
  69. package/dist/collapsible-panel.js.map +1 -1
  70. package/dist/divider-sides-267FA7sY.d.ts +4 -0
  71. package/dist/index.d.ts +5 -3
  72. package/dist/index.js +20 -19
  73. package/dist/list-action-row.d.ts +11 -1
  74. package/dist/list-action-row.js +2 -1
  75. package/dist/list-header.d.ts +15 -2
  76. package/dist/list-header.js +1 -1
  77. package/dist/list-item.d.ts +12 -1
  78. package/dist/list-item.js +2 -1
  79. package/dist/list.d.ts +19 -0
  80. package/dist/list.js +3 -0
  81. package/dist/list.js.map +1 -0
  82. package/dist/nav-stack.js +1 -1
  83. package/dist/resizable-region.d.ts +19 -2
  84. package/dist/resizable-region.js +1 -1
  85. package/dist/segmented-control.js +1 -1
  86. package/dist/select.d.ts +12 -1
  87. package/dist/select.js +1 -1
  88. package/dist/skeleton.d.ts +1 -1
  89. package/dist/skeleton.js +1 -1
  90. package/dist/split-view.js +2 -2
  91. package/dist/state-banner.d.ts +4 -2
  92. package/dist/state-banner.js +1 -1
  93. package/dist/styles/app-tab.css +26 -0
  94. package/dist/styles/catalog.css +8 -2
  95. package/dist/styles/collapsible-panel.css +66 -4
  96. package/dist/styles/list-action-row.css +64 -0
  97. package/dist/styles/list-header.css +32 -0
  98. package/dist/styles/list-item.css +45 -6
  99. package/dist/styles/list.css +43 -0
  100. package/dist/styles/resizable-region.css +132 -0
  101. package/dist/styles/select.css +68 -0
  102. package/dist/styles/state-banner.css +32 -1
  103. package/dist/styles/styles.css +2 -1
  104. package/dist/styles/sunken-panel.css +4 -0
  105. package/dist/styles/surface-scaffold.css +51 -0
  106. package/dist/styles/tab-bar.css +24 -0
  107. package/dist/styles/toolbar-control-group.css +73 -1
  108. package/dist/styles/toolbar-text.css +1 -1
  109. package/dist/styles/toolbar.css +38 -2
  110. package/dist/styles/webawesome.css +12 -0
  111. package/dist/styles/workbench.css +89 -0
  112. package/dist/sunken-panel.d.ts +5 -2
  113. package/dist/sunken-panel.js +1 -1
  114. package/dist/surface-scaffold.d.ts +25 -0
  115. package/dist/surface-scaffold.js +3 -0
  116. package/dist/surface-scaffold.js.map +1 -0
  117. package/dist/tab-bar.d.ts +11 -2
  118. package/dist/tab-bar.js +1 -1
  119. package/dist/toolbar-control-group.d.ts +16 -2
  120. package/dist/toolbar-control-group.js +1 -1
  121. package/dist/toolbar-text.js +1 -1
  122. package/dist/toolbar.d.ts +5 -3
  123. package/dist/toolbar.js +1 -1
  124. package/dist/value-table.js +1 -1
  125. package/dist/webawesome.d.ts +1 -0
  126. package/dist/wire-catalog.d.ts +4 -2
  127. package/dist/wire-catalog.js +95 -36
  128. package/dist/wire-catalog.js.map +1 -1
  129. package/dist/wire-resizable-regions.js +1 -1
  130. package/dist/wire-sidebar.d.ts +6 -1
  131. package/dist/wire-sidebar.js +27 -8
  132. package/dist/wire-sidebar.js.map +1 -1
  133. package/dist/wire-tab-bars.js +1 -1
  134. package/dist/wire-token-search-fields.d.ts +1 -1
  135. package/dist/wire-token-search-fields.js +1 -1
  136. package/dist/workbench.d.ts +8 -0
  137. package/dist/workbench.js +42 -0
  138. package/dist/workbench.js.map +1 -1
  139. package/docs/accessibility.md +67 -15
  140. package/docs/catalog.md +17 -12
  141. package/docs/collapsible-panel.md +7 -0
  142. package/docs/component-contract.md +19 -9
  143. package/docs/component-selection.md +65 -31
  144. package/docs/design/templates/empty-state/filtered-dark.svg +1 -1
  145. package/docs/design/templates/empty-state/filtered.svg +1 -1
  146. package/docs/design/templates/empty-state/with-action-dark.svg +1 -1
  147. package/docs/design/templates/empty-state/with-action.svg +1 -1
  148. package/docs/design/templates/empty-state-dark.svg +1 -7
  149. package/docs/design/templates/empty-state.svg +1 -7
  150. package/docs/design/templates/list/compact-dark.svg +1 -0
  151. package/docs/design/templates/list/compact.svg +1 -0
  152. package/docs/design/templates/list/stack-dark.svg +1 -0
  153. package/docs/design/templates/list/stack.svg +1 -0
  154. package/docs/design/templates/list-action-row/default-dark.svg +1 -1
  155. package/docs/design/templates/list-action-row/default.svg +1 -1
  156. package/docs/design/templates/list-action-row/selected-dark.svg +1 -1
  157. package/docs/design/templates/list-action-row/selected.svg +1 -1
  158. package/docs/design/templates/list-action-row-dark.svg +1 -7
  159. package/docs/design/templates/list-action-row.svg +1 -7
  160. package/docs/design/templates/list-dark.svg +1 -0
  161. package/docs/design/templates/list-header/action-dark.svg +1 -1
  162. package/docs/design/templates/list-header/action.svg +1 -1
  163. package/docs/design/templates/list-header/toggle-collapsed-dark.svg +1 -1
  164. package/docs/design/templates/list-header/toggle-collapsed.svg +1 -1
  165. package/docs/design/templates/list-header/toggle-expanded-dark.svg +1 -1
  166. package/docs/design/templates/list-header/toggle-expanded.svg +1 -1
  167. package/docs/design/templates/list-header-dark.svg +1 -11
  168. package/docs/design/templates/list-header.svg +1 -11
  169. package/docs/design/templates/list-item/default-dark.svg +1 -1
  170. package/docs/design/templates/list-item/default.svg +1 -1
  171. package/docs/design/templates/list-item/multiline-dark.svg +1 -1
  172. package/docs/design/templates/list-item/multiline.svg +1 -1
  173. package/docs/design/templates/list-item/selected-dark.svg +1 -1
  174. package/docs/design/templates/list-item/selected.svg +1 -1
  175. package/docs/design/templates/list-item/trailing-dark.svg +1 -1
  176. package/docs/design/templates/list-item/trailing.svg +1 -1
  177. package/docs/design/templates/list-item-dark.svg +1 -11
  178. package/docs/design/templates/list-item.svg +1 -11
  179. package/docs/design/templates/list.svg +1 -0
  180. package/docs/design/templates/segmented-control-dark.svg +1 -7
  181. package/docs/design/templates/segmented-control.svg +1 -7
  182. package/docs/design/templates/skeleton-dark.svg +1 -9
  183. package/docs/design/templates/skeleton.svg +1 -9
  184. package/docs/design/templates/state-banner/danger-dark.svg +1 -1
  185. package/docs/design/templates/state-banner/danger.svg +1 -1
  186. package/docs/design/templates/state-banner/info-badge-dark.svg +1 -0
  187. package/docs/design/templates/state-banner/info-badge.svg +1 -0
  188. package/docs/design/templates/state-banner/info-dark.svg +1 -1
  189. package/docs/design/templates/state-banner/info.svg +1 -1
  190. package/docs/design/templates/state-banner/success-dark.svg +1 -1
  191. package/docs/design/templates/state-banner/success.svg +1 -1
  192. package/docs/design/templates/state-banner/warning-dark.svg +1 -1
  193. package/docs/design/templates/state-banner/warning.svg +1 -1
  194. package/docs/design/templates/state-banner-dark.svg +1 -11
  195. package/docs/design/templates/state-banner.svg +1 -11
  196. package/docs/design/templates/tab-bar/workspace-tabs-dark.svg +1 -1
  197. package/docs/design/templates/tab-bar/workspace-tabs.svg +1 -1
  198. package/docs/design/templates/tab-bar-dark.svg +1 -5
  199. package/docs/design/templates/tab-bar.svg +1 -5
  200. package/docs/design/templates/token-search-field/empty-dark.svg +1 -1
  201. package/docs/design/templates/token-search-field/empty.svg +1 -1
  202. package/docs/design/templates/token-search-field/tokens-dark.svg +1 -1
  203. package/docs/design/templates/token-search-field/tokens.svg +1 -1
  204. package/docs/design/templates/token-search-field-dark.svg +1 -7
  205. package/docs/design/templates/token-search-field.svg +1 -7
  206. package/docs/design/templates/toolbar/title-and-actions-dark.svg +1 -1
  207. package/docs/design/templates/toolbar/title-and-actions.svg +1 -1
  208. package/docs/design/templates/toolbar-control-group/borderless-single-dark.svg +1 -1
  209. package/docs/design/templates/toolbar-control-group/borderless-single.svg +1 -1
  210. package/docs/design/templates/toolbar-control-group/icon-buttons-dark.svg +1 -1
  211. package/docs/design/templates/toolbar-control-group/icon-buttons.svg +1 -1
  212. package/docs/design/templates/toolbar-control-group/push-buttons-dark.svg +1 -1
  213. package/docs/design/templates/toolbar-control-group/push-buttons.svg +1 -1
  214. package/docs/design/templates/toolbar-control-group/with-text-dark.svg +1 -1
  215. package/docs/design/templates/toolbar-control-group/with-text.svg +1 -1
  216. package/docs/design/templates/toolbar-control-group-dark.svg +1 -11
  217. package/docs/design/templates/toolbar-control-group.svg +1 -11
  218. package/docs/design/templates/toolbar-dark.svg +1 -5
  219. package/docs/design/templates/toolbar-text-dark.svg +1 -9
  220. package/docs/design/templates/toolbar-text.svg +1 -9
  221. package/docs/design/templates/toolbar.svg +1 -5
  222. package/docs/design/templates/value-table/details-dark.svg +1 -1
  223. package/docs/design/templates/value-table/details.svg +1 -1
  224. package/docs/design/templates/value-table-dark.svg +1 -5
  225. package/docs/design/templates/value-table.svg +1 -5
  226. package/docs/design/templates.md +29 -20
  227. package/docs/examples/component-catalog-extension-v2.json +3 -6
  228. package/docs/examples/component-catalog-extension.json +1 -1
  229. package/docs/layout.md +7 -9
  230. package/docs/recipes.md +8 -7
  231. package/docs/sunken-panel.md +11 -1
  232. package/docs/surface-scaffold.md +17 -0
  233. package/docs/type-contracts.md +11 -10
  234. package/docs/ui-analyzer.md +19 -1
  235. package/docs/ui-doctor.md +7 -5
  236. package/docs/ux-demo.md +6 -3
  237. package/docs/webawesome-theme.md +4 -1
  238. package/docs/workbench.md +49 -2
  239. package/doctor/eslint-diagnostics.d.mts +16 -0
  240. package/doctor/eslint-diagnostics.mjs +17 -0
  241. package/doctor/index.mjs +21 -3
  242. package/llms.txt +33 -11
  243. package/package.json +14 -8
  244. package/traversal-exclusions.mjs +7 -1
  245. package/ux-demo/recipes/app-shell.tsx +36 -23
  246. package/ux-demo/recipes/collapsible-sidebar.tsx +23 -17
  247. package/ux-demo/recipes/composer-form.tsx +15 -6
  248. package/ux-demo/recipes/list-detail-dialog.tsx +31 -15
  249. package/ux-demo/recipes/list-workspace-states.tsx +16 -7
  250. package/ux-demo/recipes/loading-inspector.tsx +39 -18
  251. package/ux-demo/recipes/navigation-sidebar.tsx +1 -1
  252. package/ux-demo/recipes/recipes.css +7 -2
  253. package/ux-demo/recipes/workspace-header.tsx +17 -7
  254. package/dist/browser/panel-header.js +0 -7
  255. package/dist/chunk-5VTB2BKP.js.map +0 -1
  256. package/dist/chunk-7L6EHUMV.js.map +0 -1
  257. package/dist/chunk-AASLYRGE.js.map +0 -1
  258. package/dist/chunk-BBRXX6PF.js.map +0 -1
  259. package/dist/chunk-DPDBVKNA.js.map +0 -1
  260. package/dist/chunk-DSNIYOZ3.js.map +0 -1
  261. package/dist/chunk-ELSJX4W7.js.map +0 -1
  262. package/dist/chunk-GP5DP5DL.js.map +0 -1
  263. package/dist/chunk-K57KRAOV.js.map +0 -1
  264. package/dist/chunk-M7JBER5U.js.map +0 -1
  265. package/dist/chunk-NENBUYX5.js +0 -79
  266. package/dist/chunk-NENBUYX5.js.map +0 -1
  267. package/dist/chunk-PIDTEQ3U.js.map +0 -1
  268. package/dist/chunk-PZQVSDLH.js.map +0 -1
  269. package/dist/chunk-RYRIFZCT.js +0 -58
  270. package/dist/chunk-RYRIFZCT.js.map +0 -1
  271. package/dist/chunk-VLYV65LK.js.map +0 -1
  272. package/dist/chunk-W4CXQYSG.js.map +0 -1
  273. package/dist/panel-header.d.ts +0 -42
  274. package/dist/panel-header.js +0 -7
  275. package/dist/panel-header.js.map +0 -1
  276. package/dist/styles/panel-header.css +0 -64
  277. package/docs/design/templates/panel-header/icon-actions-dark.svg +0 -1
  278. package/docs/design/templates/panel-header/icon-actions.svg +0 -1
  279. package/docs/design/templates/panel-header/icon-summary-actions-dark.svg +0 -1
  280. package/docs/design/templates/panel-header/icon-summary-actions.svg +0 -1
  281. package/docs/design/templates/panel-header/no-icon-dark.svg +0 -1
  282. package/docs/design/templates/panel-header/no-icon.svg +0 -1
  283. package/docs/design/templates/panel-header/page-heading-dark.svg +0 -1
  284. package/docs/design/templates/panel-header/page-heading.svg +0 -1
  285. package/docs/design/templates/panel-header/title-only-dark.svg +0 -1
  286. package/docs/design/templates/panel-header/title-only.svg +0 -1
  287. package/docs/design/templates/panel-header-dark.svg +0 -13
  288. package/docs/design/templates/panel-header.svg +0 -13
@@ -433,6 +433,240 @@
433
433
  "composition": "generated-permissive-default"
434
434
  }
435
435
  },
436
+ {
437
+ "key": "@kerfjs/ui:nav-stack",
438
+ "package": "@kerfjs/ui",
439
+ "id": "nav-stack",
440
+ "name": "NavStack",
441
+ "kind": "component",
442
+ "source": "kerf",
443
+ "parents": { "mode": "any", "entries": [] },
444
+ "contexts": ["application-ui"],
445
+ "zones": [],
446
+ "children": { "mode": "any", "concepts": [], "requiredConcepts": [] },
447
+ "state": [
448
+ {
449
+ "id": "ordered view stack and stable keys",
450
+ "owner": "application",
451
+ "required": false
452
+ },
453
+ {
454
+ "id": "view content and titles",
455
+ "owner": "application",
456
+ "required": false
457
+ },
458
+ {
459
+ "id": "push and pop actions",
460
+ "owner": "application",
461
+ "required": false
462
+ },
463
+ {
464
+ "id": "focus restoration policy",
465
+ "owner": "application",
466
+ "required": false
467
+ },
468
+ {
469
+ "id": "optional persistent bottom toolbar",
470
+ "owner": "application",
471
+ "required": false
472
+ }
473
+ ],
474
+ "wiring": {
475
+ "required": true,
476
+ "helpers": ["wireNavStack"],
477
+ "obligations": ["Use wireNavStack as documented."]
478
+ },
479
+ "responsive": { "owner": "not-applicable", "behaviors": [] },
480
+ "layout": {
481
+ "roles": ["structure"],
482
+ "geometry": {
483
+ "margin": "none",
484
+ "border": "conditional",
485
+ "padding": "child",
486
+ "notes": [
487
+ "The stack owns its full-height chrome and viewport; each view owns its internal content padding and scrollable content."
488
+ ]
489
+ }
490
+ },
491
+ "accessibility": {
492
+ "obligations": [
493
+ "Give the stack region an accessible label and every back control a stable action label.",
494
+ "Wire pop behavior and restore focus to the control that opened the departing view after the controlled rerender."
495
+ ]
496
+ },
497
+ "boundaries": {
498
+ "rootClass": "kui-nav-stack",
499
+ "publicClasses": [
500
+ "kui-nav-stack",
501
+ "kui-nav-stack__chrome",
502
+ "kui-nav-stack__lead",
503
+ "kui-nav-stack__back",
504
+ "kui-nav-stack__back-icon",
505
+ "kui-nav-stack__title",
506
+ "kui-nav-stack__actions",
507
+ "kui-nav-stack__viewport",
508
+ "kui-nav-stack__view",
509
+ "kui-nav-stack__view--entering",
510
+ "kui-nav-stack__view--exiting",
511
+ "kui-nav-stack__bottom"
512
+ ],
513
+ "publicTokens": []
514
+ },
515
+ "diagnostics": [],
516
+ "provenance": {
517
+ "selection": "ai/component-catalog.json",
518
+ "composition": "generated-permissive-default"
519
+ }
520
+ },
521
+ {
522
+ "key": "@kerfjs/ui:split-view",
523
+ "package": "@kerfjs/ui",
524
+ "id": "split-view",
525
+ "name": "SplitView",
526
+ "kind": "component",
527
+ "source": "kerf",
528
+ "parents": { "mode": "any", "entries": [] },
529
+ "contexts": ["application-ui"],
530
+ "zones": [],
531
+ "children": { "mode": "any", "concepts": [], "requiredConcepts": [] },
532
+ "state": [
533
+ {
534
+ "id": "device-class policy",
535
+ "owner": "application",
536
+ "required": false
537
+ },
538
+ {
539
+ "id": "selected item and detail-active state",
540
+ "owner": "application",
541
+ "required": false
542
+ },
543
+ {
544
+ "id": "list and detail content",
545
+ "owner": "application",
546
+ "required": false
547
+ },
548
+ {
549
+ "id": "optional list width and persistence",
550
+ "owner": "application",
551
+ "required": false
552
+ },
553
+ { "id": "back action", "owner": "application", "required": false }
554
+ ],
555
+ "wiring": {
556
+ "required": true,
557
+ "helpers": ["wireResizableRegions", "wireNavStack"],
558
+ "obligations": ["Use wireNavStack as documented."]
559
+ },
560
+ "responsive": { "owner": "not-applicable", "behaviors": [] },
561
+ "layout": {
562
+ "roles": ["structure"],
563
+ "geometry": {
564
+ "margin": "none",
565
+ "border": "self",
566
+ "padding": "child",
567
+ "notes": [
568
+ "The root owns the two-column split and the list pane owns its separator; list and detail content own their internal padding and scroll behavior."
569
+ ]
570
+ }
571
+ },
572
+ "accessibility": {
573
+ "obligations": [
574
+ "Give the overall split and both meaningful panes accessible labels.",
575
+ "Wire the compact back action and optional separator keyboard behavior, and restore focus when controlled navigation replaces a view."
576
+ ]
577
+ },
578
+ "boundaries": {
579
+ "rootClass": "kui-split-view",
580
+ "publicClasses": [
581
+ "kui-split-view",
582
+ "kui-split-view__list",
583
+ "kui-resizable-region",
584
+ "kui-split-view__detail",
585
+ "kui-split-view--compact"
586
+ ],
587
+ "publicTokens": ["--kui-split-view-list-width"]
588
+ },
589
+ "diagnostics": [],
590
+ "provenance": {
591
+ "selection": "ai/component-catalog.json",
592
+ "composition": "generated-permissive-default"
593
+ }
594
+ },
595
+ {
596
+ "key": "@kerfjs/ui:tab-scaffold",
597
+ "package": "@kerfjs/ui",
598
+ "id": "tab-scaffold",
599
+ "name": "TabScaffold",
600
+ "kind": "component",
601
+ "source": "kerf",
602
+ "parents": { "mode": "any", "entries": [] },
603
+ "contexts": ["application-ui"],
604
+ "zones": [],
605
+ "children": { "mode": "any", "concepts": [], "requiredConcepts": [] },
606
+ "state": [
607
+ {
608
+ "id": "controlled active tab id",
609
+ "owner": "application",
610
+ "required": false
611
+ },
612
+ {
613
+ "id": "tab labels, icons, and content",
614
+ "owner": "application",
615
+ "required": false
616
+ },
617
+ {
618
+ "id": "routing and persistence",
619
+ "owner": "application",
620
+ "required": false
621
+ },
622
+ {
623
+ "id": "responsive replacement on larger device classes",
624
+ "owner": "application",
625
+ "required": false
626
+ }
627
+ ],
628
+ "wiring": {
629
+ "required": true,
630
+ "helpers": ["wireTabScaffold"],
631
+ "obligations": ["Use wireTabScaffold as documented."]
632
+ },
633
+ "responsive": { "owner": "not-applicable", "behaviors": [] },
634
+ "layout": {
635
+ "roles": ["structure"],
636
+ "geometry": {
637
+ "margin": "none",
638
+ "border": "self",
639
+ "padding": "self",
640
+ "notes": [
641
+ "The scaffold owns the full-height scene region and safe-area-aware bottom bar; scene content owns its internal geometry."
642
+ ]
643
+ }
644
+ },
645
+ "accessibility": {
646
+ "obligations": [
647
+ "Give the tablist an accessible label and keep exactly the active tab in the sequential focus order.",
648
+ "Wire selection through the controlled active id while leaving inactive scenes mounted and hidden."
649
+ ]
650
+ },
651
+ "boundaries": {
652
+ "rootClass": "kui-tab-scaffold",
653
+ "publicClasses": [
654
+ "kui-tab-scaffold",
655
+ "kui-tab-scaffold__scenes",
656
+ "kui-tab-scaffold__scene",
657
+ "kui-tab-scaffold__bar",
658
+ "kui-tab-scaffold__tab",
659
+ "kui-tab-scaffold__tab-icon",
660
+ "kui-tab-scaffold__tab-label"
661
+ ],
662
+ "publicTokens": []
663
+ },
664
+ "diagnostics": [],
665
+ "provenance": {
666
+ "selection": "ai/component-catalog.json",
667
+ "composition": "generated-permissive-default"
668
+ }
669
+ },
436
670
  {
437
671
  "key": "@kerfjs/ui:workbench",
438
672
  "package": "@kerfjs/ui",
@@ -489,14 +723,106 @@
489
723
  "kui-workbench__rail",
490
724
  "kui-workbench__rail--left",
491
725
  "kui-workbench__rail--right",
726
+ "kui-workbench__drawer",
492
727
  "kui-workbench__center",
493
728
  "kui-workbench__main",
494
- "kui-workbench__drawer",
495
- "kui-workbench__panel-content"
729
+ "kui-workbench__panel-content",
730
+ "kui-workbench__restore"
496
731
  ],
497
732
  "publicTokens": [
498
733
  "--kui-workbench-rail-width",
499
- "--kui-workbench-drawer-height"
734
+ "--kui-workbench-drawer-height",
735
+ "--kui-workbench-popup-z",
736
+ "--kui-workbench-overlay-z",
737
+ "--kui-workbench-overlay-max-width",
738
+ "--kui-workbench-overlay-max-height",
739
+ "--kui-workbench-restore-z",
740
+ "--kui-workbench-restore-inset"
741
+ ]
742
+ },
743
+ "diagnostics": [],
744
+ "provenance": {
745
+ "selection": "ai/component-catalog.json",
746
+ "composition": "generated-permissive-default"
747
+ }
748
+ },
749
+ {
750
+ "key": "@kerfjs/ui:collapsible-panel",
751
+ "package": "@kerfjs/ui",
752
+ "id": "collapsible-panel",
753
+ "name": "CollapsiblePanel",
754
+ "kind": "component",
755
+ "source": "kerf",
756
+ "parents": { "mode": "any", "entries": [] },
757
+ "contexts": ["application-ui"],
758
+ "zones": [],
759
+ "children": { "mode": "any", "concepts": [], "requiredConcepts": [] },
760
+ "state": [
761
+ {
762
+ "id": "controlled collapsed state",
763
+ "owner": "application",
764
+ "required": false
765
+ },
766
+ {
767
+ "id": "panel content and size",
768
+ "owner": "application",
769
+ "required": false
770
+ },
771
+ { "id": "toggle placement", "owner": "application", "required": false },
772
+ {
773
+ "id": "persistence policy",
774
+ "owner": "application",
775
+ "required": false
776
+ },
777
+ {
778
+ "id": "compact-device policy",
779
+ "owner": "application",
780
+ "required": false
781
+ }
782
+ ],
783
+ "wiring": {
784
+ "required": true,
785
+ "helpers": ["wireSidebar"],
786
+ "obligations": ["Use wireSidebar as documented."]
787
+ },
788
+ "responsive": { "owner": "not-applicable", "behaviors": [] },
789
+ "layout": {
790
+ "roles": ["structure"],
791
+ "geometry": {
792
+ "margin": "none",
793
+ "border": "self",
794
+ "padding": "child",
795
+ "notes": [
796
+ "The panel owns its dock-edge separator and size track; its child content owns internal padding and scrolling."
797
+ ]
798
+ }
799
+ },
800
+ "accessibility": {
801
+ "obligations": [
802
+ "Give the panel region and every collapse or restore control an accessible label.",
803
+ "Keep the restore control outside the disappearing panel and use wireSidebar for focus transfer, Escape, backdrop dismissal, and compact focus trapping."
804
+ ]
805
+ },
806
+ "boundaries": {
807
+ "rootClass": "kui-collapsible-panel",
808
+ "publicClasses": [
809
+ "kui-collapsible-panel",
810
+ "kui-collapsible-panel--left",
811
+ "kui-collapsible-panel--right",
812
+ "kui-collapsible-panel--bottom",
813
+ "kui-collapsible-panel__content",
814
+ "kui-collapsible-panel__restore",
815
+ "kui-collapsible-panel__backdrop",
816
+ "kui-collapsible-panel__toggle"
817
+ ],
818
+ "publicTokens": [
819
+ "--kui-collapsible-panel-width",
820
+ "--kui-collapsible-panel-height",
821
+ "--kui-collapsible-panel-popup-z",
822
+ "--kui-collapsible-panel-overlay-z",
823
+ "--kui-collapsible-panel-restore-z",
824
+ "--kui-collapsible-panel-restore-inset",
825
+ "--kui-collapsible-panel-backdrop-z"
500
826
  ]
501
827
  },
502
828
  "diagnostics": [],
@@ -522,6 +848,7 @@
522
848
  "owner": "application",
523
849
  "required": false
524
850
  },
851
+ { "id": "corner shape", "owner": "application", "required": false },
525
852
  { "id": "scroll ownership", "owner": "application", "required": false },
526
853
  {
527
854
  "id": "child ordering and content",
@@ -572,7 +899,12 @@
572
899
  "kind": "component",
573
900
  "source": "kerf",
574
901
  "parents": { "mode": "any", "entries": [] },
575
- "contexts": ["application-chrome", "panel-header"],
902
+ "contexts": [
903
+ "application-chrome",
904
+ "page-header",
905
+ "panel-header",
906
+ "dialog-header"
907
+ ],
576
908
  "zones": [
577
909
  {
578
910
  "id": "leading",
@@ -620,7 +952,7 @@
620
952
  "border": "conditional",
621
953
  "padding": "self",
622
954
  "notes": [
623
- "Padding belongs to the toolbar; the optional divider variant also owns its border."
955
+ "Padding belongs to the toolbar; dividerSides selects any canonical combination of its physical top, right, bottom, and left edges."
624
956
  ]
625
957
  }
626
958
  },
@@ -637,7 +969,11 @@
637
969
  "kui-toolbar__leading",
638
970
  "kui-toolbar__trailing"
639
971
  ],
640
- "publicTokens": ["--kui-color-border", "--kui-font-sans"]
972
+ "publicTokens": [
973
+ "--kui-color-border",
974
+ "--kui-font-sans",
975
+ "--kui-toolbar-divider-color"
976
+ ]
641
977
  },
642
978
  "diagnostics": [
643
979
  {
@@ -659,10 +995,7 @@
659
995
  "name": "ToolbarControlGroup",
660
996
  "kind": "component",
661
997
  "source": "kerf",
662
- "parents": {
663
- "mode": "listed",
664
- "entries": ["@kerfjs/ui:toolbar", "@kerfjs/ui:panel-header"]
665
- },
998
+ "parents": { "mode": "listed", "entries": ["@kerfjs/ui:toolbar"] },
666
999
  "contexts": ["toolbar-zone"],
667
1000
  "zones": [
668
1001
  {
@@ -726,6 +1059,51 @@
726
1059
  "composition": "docs/component-selection.md#toolbar-composition"
727
1060
  }
728
1061
  },
1062
+ {
1063
+ "key": "@kerfjs/ui:surface-scaffold",
1064
+ "package": "@kerfjs/ui",
1065
+ "id": "surface-scaffold",
1066
+ "name": "Surface scaffolds",
1067
+ "kind": "component",
1068
+ "source": "kerf",
1069
+ "parents": { "mode": "any", "entries": [] },
1070
+ "contexts": ["application-ui"],
1071
+ "zones": [],
1072
+ "children": { "mode": "any", "concepts": [], "requiredConcepts": [] },
1073
+ "state": [
1074
+ { "id": "open state", "owner": "application", "required": false },
1075
+ { "id": "focus lifecycle", "owner": "application", "required": false },
1076
+ { "id": "dismissal policy", "owner": "application", "required": false },
1077
+ { "id": "content", "owner": "application", "required": false },
1078
+ { "id": "outer placement", "owner": "application", "required": false }
1079
+ ],
1080
+ "wiring": { "required": false, "helpers": [], "obligations": [] },
1081
+ "responsive": { "owner": "not-applicable", "behaviors": [] },
1082
+ "layout": {
1083
+ "roles": ["structure"],
1084
+ "geometry": { "margin": "parent", "border": "child", "padding": "self" }
1085
+ },
1086
+ "accessibility": {
1087
+ "obligations": [
1088
+ "Supply the wrapped wa-dialog label and retain Web Awesome's native modal and focus behavior.",
1089
+ "Use popup surfaces only for real dropdown menus with named triggers."
1090
+ ]
1091
+ },
1092
+ "boundaries": {
1093
+ "rootClass": "kui-dialog-surface",
1094
+ "publicClasses": ["kui-dialog-surface", "kui-popup-surface"],
1095
+ "publicTokens": [
1096
+ "--kui-radius-l",
1097
+ "--kui-wa-container-inset",
1098
+ "--kui-wa-surface-inset"
1099
+ ]
1100
+ },
1101
+ "diagnostics": [],
1102
+ "provenance": {
1103
+ "selection": "ai/component-catalog.json",
1104
+ "composition": "generated-permissive-default"
1105
+ }
1106
+ },
729
1107
  {
730
1108
  "key": "@kerfjs/ui:floating-toolbar",
731
1109
  "package": "@kerfjs/ui",
@@ -853,81 +1231,6 @@
853
1231
  "composition": "generated-permissive-default"
854
1232
  }
855
1233
  },
856
- {
857
- "key": "@kerfjs/ui:panel-header",
858
- "package": "@kerfjs/ui",
859
- "id": "panel-header",
860
- "name": "PanelHeader",
861
- "kind": "component",
862
- "source": "kerf",
863
- "parents": { "mode": "any", "entries": [] },
864
- "contexts": ["page-header", "panel-header", "dialog-header"],
865
- "zones": [
866
- {
867
- "id": "title",
868
- "accepts": ["text"],
869
- "cardinality": { "min": 1, "max": 1 },
870
- "exclusiveWith": []
871
- },
872
- {
873
- "id": "subtitle",
874
- "accepts": ["text"],
875
- "cardinality": { "min": 0, "max": 1 },
876
- "exclusiveWith": []
877
- },
878
- {
879
- "id": "controls",
880
- "accepts": ["control"],
881
- "cardinality": { "min": 0, "max": "unbounded" },
882
- "exclusiveWith": []
883
- }
884
- ],
885
- "children": { "mode": "any", "concepts": [], "requiredConcepts": [] },
886
- "state": [
887
- { "id": "placeholder", "owner": "controlled", "required": false }
888
- ],
889
- "wiring": { "required": false, "helpers": [], "obligations": [] },
890
- "responsive": { "owner": "not-applicable", "behaviors": [] },
891
- "layout": {
892
- "roles": ["structure"],
893
- "geometry": { "margin": "none", "border": "child", "padding": "child" }
894
- },
895
- "accessibility": {
896
- "obligations": [
897
- "Connect the title id and any provided summary id to the dialog or panel host.",
898
- "Pass the trailing actions as a labeled ToolbarControlGroup when the group needs an accessible name.",
899
- "For a page/view title pass headingLevel (usually 1) so the title exposes role=heading + aria-level as a heading landmark; omit it for a dialog title, which is referenced via aria-labelledby to titleId."
900
- ]
901
- },
902
- "boundaries": {
903
- "rootClass": "kui-panel-header",
904
- "publicClasses": [
905
- "kui-panel-header",
906
- "kui-panel-header__icon",
907
- "kui-panel-header__summary"
908
- ],
909
- "publicTokens": [
910
- "--kui-color-brand-fill-quiet",
911
- "--kui-color-brand-on-quiet",
912
- "--kui-color-text-quiet",
913
- "--kui-panel-header-icon-background",
914
- "--kui-panel-header-icon-border",
915
- "--kui-panel-header-icon-foreground"
916
- ]
917
- },
918
- "diagnostics": [
919
- {
920
- "id": "KUI-C102",
921
- "severity": "error",
922
- "when": "the title is absent",
923
- "message": "PanelHeader requires a title that names its page, panel, or dialog."
924
- }
925
- ],
926
- "provenance": {
927
- "selection": "ai/component-catalog.json",
928
- "composition": "docs/component-selection.md#problem-to-component-matrix"
929
- }
930
- },
931
1234
  {
932
1235
  "key": "@kerfjs/ui:value-table",
933
1236
  "package": "@kerfjs/ui",
@@ -988,33 +1291,26 @@
988
1291
  "key": "@kerfjs/ui:list",
989
1292
  "package": "@kerfjs/ui",
990
1293
  "id": "list",
991
- "name": "List composition",
992
- "kind": "composition",
1294
+ "name": "List",
1295
+ "kind": "component",
993
1296
  "source": "kerf",
994
1297
  "parents": { "mode": "any", "entries": [] },
995
- "contexts": ["navigation-list"],
996
- "zones": [
997
- {
998
- "id": "rows",
999
- "accepts": ["list-header", "list-item", "list-action-row"],
1000
- "cardinality": { "min": 1, "max": "unbounded" },
1001
- "exclusiveWith": []
1002
- }
1003
- ],
1004
- "children": {
1005
- "mode": "listed",
1006
- "concepts": ["list-header", "list-item", "list-action-row"],
1007
- "requiredConcepts": []
1008
- },
1298
+ "contexts": ["application-ui", "navigation-list", "vertical-layout"],
1299
+ "zones": [],
1300
+ "children": { "mode": "any", "concepts": [], "requiredConcepts": [] },
1009
1301
  "state": [
1010
1302
  {
1011
- "id": "information architecture",
1303
+ "id": "child semantics and content",
1012
1304
  "owner": "application",
1013
1305
  "required": false
1014
1306
  },
1015
- { "id": "routing", "owner": "application", "required": false },
1016
1307
  {
1017
- "id": "responsive shell behavior",
1308
+ "id": "the bounded height needed for scrolling",
1309
+ "owner": "application",
1310
+ "required": false
1311
+ },
1312
+ {
1313
+ "id": "gap, flex, and divider choices",
1018
1314
  "owner": "application",
1019
1315
  "required": false
1020
1316
  }
@@ -1023,28 +1319,35 @@
1023
1319
  "responsive": { "owner": "not-applicable", "behaviors": [] },
1024
1320
  "layout": {
1025
1321
  "roles": ["navigation"],
1026
- "geometry": { "margin": "child", "border": "child", "padding": "child" }
1322
+ "geometry": {
1323
+ "margin": "none",
1324
+ "border": "conditional",
1325
+ "padding": "none",
1326
+ "notes": [
1327
+ "List adds no margin or padding; dividerSides draws only the selected physical edges without changing box geometry."
1328
+ ]
1329
+ }
1027
1330
  },
1028
1331
  "accessibility": {
1029
1332
  "obligations": [
1030
- "Use native links for link navigation, retain ListItem button semantics for actions, and keep standalone header and toolbar actions at least 44px square.",
1031
- "A ListHeader disclosure controls real content, keeps a stable accessible name and aria-expanded state, and uses the production DisclosureArrow visual."
1333
+ "List adds layout only and no list role; children retain responsibility for their native or ARIA semantics.",
1334
+ "Give a scrollable List a bounded block size and keep keyboard focus visible as its contents scroll."
1032
1335
  ]
1033
1336
  },
1034
1337
  "boundaries": {
1035
- "rootClass": "kui-content",
1036
- "publicClasses": ["kui-content", "kui-content-item"],
1338
+ "rootClass": "kui-list",
1339
+ "publicClasses": ["kui-list"],
1037
1340
  "publicTokens": [
1038
- "--kui-layout-content-gap",
1039
- "--kui-layout-inline-margin",
1040
- "--kui-layout-item-padding",
1041
- "--kui-layout-rounded-radius"
1341
+ "--kui-color-border",
1342
+ "--kui-layout-item-gap",
1343
+ "--kui-list-divider-color",
1344
+ "--kui-list-gap"
1042
1345
  ]
1043
1346
  },
1044
1347
  "diagnostics": [],
1045
1348
  "provenance": {
1046
1349
  "selection": "ai/component-catalog.json",
1047
- "composition": "docs/component-selection.md#correct-composition-and-duplicated-markup-trap"
1350
+ "composition": "docs/component-selection.md#problem-to-component-matrix"
1048
1351
  }
1049
1352
  },
1050
1353
  {
@@ -1096,7 +1399,11 @@
1096
1399
  "--kui-layout-item-padding",
1097
1400
  "--kui-layout-pill-radius",
1098
1401
  "--kui-list-header-count-font-size",
1099
- "--kui-list-header-hover-background"
1402
+ "--kui-list-header-hover-background",
1403
+ "--kui-list-group-divider-color",
1404
+ "--kui-color-brand-on-normal",
1405
+ "--kui-color-danger-fill-normal",
1406
+ "--kui-color-danger-on-normal"
1100
1407
  ]
1101
1408
  },
1102
1409
  "diagnostics": [
@@ -1156,6 +1463,9 @@
1156
1463
  "kui-list-action-row",
1157
1464
  "kui-list-action-row__icon",
1158
1465
  "kui-list-action-row__label",
1466
+ "kui-list-action-row__primary-label",
1467
+ "kui-list-action-row__description",
1468
+ "kui-list-action-row__status",
1159
1469
  "kui-list-action-row__primary",
1160
1470
  "kui-list-action-row__trailing-action"
1161
1471
  ],
@@ -1166,6 +1476,8 @@
1166
1476
  "--kui-color-neutral-fill-normal",
1167
1477
  "--kui-color-neutral-fill-quiet",
1168
1478
  "--kui-color-neutral-on-normal",
1479
+ "--kui-color-neutral-on-quiet",
1480
+ "--kui-color-neutral-border-quiet",
1169
1481
  "--kui-focus-ring",
1170
1482
  "--kui-layout-inline-margin",
1171
1483
  "--kui-layout-item-gap",
@@ -1180,7 +1492,9 @@
1180
1492
  "--kui-list-action-row-selected-background",
1181
1493
  "--kui-list-action-row-selected-border",
1182
1494
  "--kui-list-action-row-selected-color",
1183
- "--kui-list-action-row-trailing-hover-background"
1495
+ "--kui-list-action-row-trailing-hover-background",
1496
+ "--kui-list-group-divider-color",
1497
+ "--kui-font-xs"
1184
1498
  ]
1185
1499
  },
1186
1500
  "diagnostics": [],
@@ -1228,6 +1542,9 @@
1228
1542
  "kui-list-item",
1229
1543
  "kui-list-item__icon",
1230
1544
  "kui-list-item__label",
1545
+ "kui-list-item__primary-label",
1546
+ "kui-list-item__description",
1547
+ "kui-list-item__status",
1231
1548
  "kui-list-item__trailing"
1232
1549
  ],
1233
1550
  "publicTokens": [
@@ -1235,11 +1552,14 @@
1235
1552
  "--kui-color-neutral-fill-quiet",
1236
1553
  "--kui-color-neutral-on-normal",
1237
1554
  "--kui-color-neutral-on-quiet",
1555
+ "--kui-color-neutral-border-quiet",
1238
1556
  "--kui-focus-ring",
1239
1557
  "--kui-list-item-color",
1240
1558
  "--kui-list-item-hover-background",
1241
1559
  "--kui-list-item-selected-background",
1242
1560
  "--kui-list-item-selected-color",
1561
+ "--kui-list-group-divider-color",
1562
+ "--kui-font-xs",
1243
1563
  "--kui-layout-inline-margin",
1244
1564
  "--kui-layout-item-gap",
1245
1565
  "--kui-layout-item-padding",
@@ -1349,7 +1669,8 @@
1349
1669
  "id": "application data attribute values",
1350
1670
  "owner": "application",
1351
1671
  "required": false
1352
- }
1672
+ },
1673
+ { "id": "outer placement", "owner": "application", "required": false }
1353
1674
  ],
1354
1675
  "wiring": { "required": false, "helpers": [], "obligations": [] },
1355
1676
  "responsive": { "owner": "not-applicable", "behaviors": [] },
@@ -1565,7 +1886,7 @@
1565
1886
  "obligations": [
1566
1887
  "Announce result changes when useful and keep tokens atomic during editing.",
1567
1888
  "Keep leading and trailing controls aligned to the first text line while content wraps.",
1568
- "Wire Enter to submit without inserting a contenteditable line break and preserve focus plus the text-relative caret across controlled keyboard chip deletion; visual wrapping remains available.",
1889
+ "Wire Enter to submit without inserting a contenteditable line break and preserve focus plus the text-relative caret across controlled keyboard chip deletion before the next keystroke. Select All deletion preserves managed open state and replacement focus; persist both edited query and tokens. Visual wrapping remains available.",
1569
1890
  "In collapsible mode, wireTokenSearchFields manages this by default: activating the trigger reveals the searchbox and moves focus into it, Escape on an empty field collapses and returns focus to the trigger, and focus leaving an empty field collapses it; each behavior is individually opt-out."
1570
1891
  ]
1571
1892
  },
@@ -1659,7 +1980,8 @@
1659
1980
  "kui-resizable-region",
1660
1981
  "kui-resizable-region__content",
1661
1982
  "kui-resizable-region__handle",
1662
- "kui-resizable-region__handle-icon"
1983
+ "kui-resizable-region__handle-icon",
1984
+ "kui-resizable-region__restore"
1663
1985
  ],
1664
1986
  "publicTokens": [
1665
1987
  "--kui-color-border",
@@ -1669,6 +1991,10 @@
1669
1991
  "--kui-radius-s",
1670
1992
  "--kui-resizable-region-handle-active-color",
1671
1993
  "--kui-resizable-region-handle-color",
1994
+ "--kui-resizable-region-overlay-z",
1995
+ "--kui-resizable-region-popup-z",
1996
+ "--kui-resizable-region-restore-inset",
1997
+ "--kui-resizable-region-restore-z",
1672
1998
  "--kui-resizable-region-separator-color",
1673
1999
  "--kui-resizable-region-size"
1674
2000
  ]
@@ -1712,7 +2038,9 @@
1712
2038
  },
1713
2039
  "accessibility": {
1714
2040
  "obligations": [
1715
- "Verify the live value, standard events, focus, and rendered output."
2041
+ "Verify the live value, standard events, focus, and rendered output.",
2042
+ "A nonempty label names the internal combobox; otherwise ariaLabel supplies a visually hidden label without adding control height, including custom selected content.",
2043
+ "Hint text is visible below the control through Web Awesome's native hint relationship; placeholderText remains the empty value inside the closed control."
1716
2044
  ]
1717
2045
  },
1718
2046
  "boundaries": {
@@ -1721,6 +2049,7 @@
1721
2049
  "kui-select",
1722
2050
  "kui-select--custom-selected",
1723
2051
  "kui-select--fit-menu",
2052
+ "kui-select--label-hidden",
1724
2053
  "kui-select__custom-selected",
1725
2054
  "kui-select__group",
1726
2055
  "kui-select__group--separated",
@@ -1799,6 +2128,7 @@
1799
2128
  "zones": [],
1800
2129
  "children": { "mode": "any", "concepts": [], "requiredConcepts": [] },
1801
2130
  "state": [
2131
+ { "id": "badge content", "owner": "application", "required": false },
1802
2132
  { "id": "state mapping", "owner": "application", "required": false },
1803
2133
  { "id": "message lifetime", "owner": "application", "required": false },
1804
2134
  { "id": "retry behavior", "owner": "application", "required": false },
@@ -1812,7 +2142,8 @@
1812
2142
  },
1813
2143
  "accessibility": {
1814
2144
  "obligations": [
1815
- "Use alert urgency only for an attention-requiring failure."
2145
+ "Use alert urgency only for an attention-requiring failure.",
2146
+ "Keep optional badge content terse and do not rely on its tone alone for meaning."
1816
2147
  ]
1817
2148
  },
1818
2149
  "boundaries": {
@@ -1820,7 +2151,9 @@
1820
2151
  "publicClasses": [
1821
2152
  "kui-state-banner",
1822
2153
  "kui-state-banner__action",
2154
+ "kui-state-banner__badge",
1823
2155
  "kui-state-banner__copy",
2156
+ "kui-state-banner__detail",
1824
2157
  "kui-state-banner__icon"
1825
2158
  ],
1826
2159
  "publicTokens": [
@@ -1847,6 +2180,8 @@
1847
2180
  "--kui-state-banner-action-background",
1848
2181
  "--kui-state-banner-action-hover-background",
1849
2182
  "--kui-state-banner-background",
2183
+ "--kui-state-banner-badge-background",
2184
+ "--kui-state-banner-badge-foreground",
1850
2185
  "--kui-state-banner-border",
1851
2186
  "--kui-state-banner-danger-background",
1852
2187
  "--kui-state-banner-danger-border",
@@ -4353,7 +4688,7 @@
4353
4688
  },
4354
4689
  "accessibility": {
4355
4690
  "obligations": [
4356
- "Web Awesome owns modal focus and Escape; the application adapter restores the invoking control after hide, and PanelHeader supplies the visible hierarchy."
4691
+ "Web Awesome owns modal focus and Escape; the application adapter restores the invoking control after hide, and Toolbar plus ToolbarText supply the visible hierarchy."
4357
4692
  ]
4358
4693
  },
4359
4694
  "boundaries": {
@@ -4400,7 +4735,7 @@
4400
4735
  },
4401
4736
  "accessibility": {
4402
4737
  "obligations": [
4403
- "The form references PanelHeader's title and summary ids; production fields own labels and help; invalid submission creates an assertive persistent StateBanner while successful submission creates a polite persistent banner."
4738
+ "The form references its ToolbarText title and supporting-summary ids; production fields own labels and help; invalid submission creates an assertive persistent StateBanner while successful submission creates a polite persistent banner."
4404
4739
  ]
4405
4740
  },
4406
4741
  "boundaries": {