@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
@@ -555,6 +555,286 @@
555
555
  "recipe": "docs/layout.md#anatomy"
556
556
  }
557
557
  },
558
+ {
559
+ "id": "nav-stack",
560
+ "name": "NavStack",
561
+ "category": "Structure",
562
+ "kind": "component",
563
+ "source": "kerf",
564
+ "description": "A controlled one-pane navigation stack that keeps prior views mounted and animates push and pop transitions.",
565
+ "uses": [
566
+ "toolbar-text"
567
+ ],
568
+ "purpose": "Present a single linear or drill-down flow while preserving each prior view's state, scroll position, and place in the stack.",
569
+ "publicExports": [
570
+ "NavStackView",
571
+ "NavStackProps",
572
+ "NavStack"
573
+ ],
574
+ "useWhen": [
575
+ "A compact surface shows one view at a time and navigation pushes into details or pops back.",
576
+ "A simple single-pane screen needs the same stable app-layout contract without any nested navigation."
577
+ ],
578
+ "avoidWhen": [
579
+ "Do not use NavStack when a list and detail should remain visible together; use SplitView.",
580
+ "Do not use it for co-equal top-level destinations on compact devices; wrap one stack per destination in TabScaffold."
581
+ ],
582
+ "alternatives": [
583
+ {
584
+ "id": "split-view",
585
+ "relationship": "roomy-alternative",
586
+ "when": "Promote a list-to-detail stack to SplitView once both regions fit together."
587
+ },
588
+ {
589
+ "id": "tab-scaffold",
590
+ "relationship": "composes-with",
591
+ "when": "Use one NavStack as each TabScaffold tab's persistent content."
592
+ }
593
+ ],
594
+ "appOwns": [
595
+ "ordered view stack and stable keys",
596
+ "view content and titles",
597
+ "push and pop actions",
598
+ "focus restoration policy",
599
+ "optional persistent bottom toolbar"
600
+ ],
601
+ "variants": [
602
+ "single root view",
603
+ "pushed detail view",
604
+ "toolbar hidden",
605
+ "persistent bottom toolbar"
606
+ ],
607
+ "accessibility": [
608
+ "Give the stack region an accessible label and every back control a stable action label.",
609
+ "Wire pop behavior and restore focus to the control that opened the departing view after the controlled rerender."
610
+ ],
611
+ "geometry": {
612
+ "margin": "none",
613
+ "border": "conditional",
614
+ "padding": "child",
615
+ "notes": [
616
+ "The stack owns its full-height chrome and viewport; each view owns its internal content padding and scrollable content."
617
+ ]
618
+ },
619
+ "delivery": {
620
+ "moduleImport": "@kerfjs/ui/nav-stack",
621
+ "manualCssImport": "@kerfjs/ui/nav-stack.css",
622
+ "sideEffects": [
623
+ "manual-css"
624
+ ]
625
+ },
626
+ "wiring": [
627
+ {
628
+ "export": "wireNavStack",
629
+ "import": "@kerfjs/ui/wire-nav-stack",
630
+ "required": true
631
+ }
632
+ ],
633
+ "publicClasses": [
634
+ "kui-nav-stack",
635
+ "kui-nav-stack__chrome",
636
+ "kui-nav-stack__lead",
637
+ "kui-nav-stack__back",
638
+ "kui-nav-stack__back-icon",
639
+ "kui-nav-stack__title",
640
+ "kui-nav-stack__actions",
641
+ "kui-nav-stack__viewport",
642
+ "kui-nav-stack__view",
643
+ "kui-nav-stack__view--entering",
644
+ "kui-nav-stack__view--exiting",
645
+ "kui-nav-stack__bottom"
646
+ ],
647
+ "publicTokens": [],
648
+ "links": {
649
+ "catalogRoute": "?component=nav-stack",
650
+ "documentation": "docs/nav-stack.md",
651
+ "recipe": "docs/app-layouts.md#decision-matrix"
652
+ }
653
+ },
654
+ {
655
+ "id": "split-view",
656
+ "name": "SplitView",
657
+ "category": "Structure",
658
+ "kind": "component",
659
+ "source": "kerf",
660
+ "description": "A responsive list-detail layout that shows both panes on roomy device classes and collapses to a navigation stack on compact classes.",
661
+ "uses": [
662
+ "nav-stack",
663
+ "resize"
664
+ ],
665
+ "purpose": "Present a selectable list and its detail together when space permits, with a one-pane drill-down replacement on compact devices.",
666
+ "publicExports": [
667
+ "SplitView",
668
+ "SplitViewProps",
669
+ "SplitViewResizable"
670
+ ],
671
+ "useWhen": [
672
+ "Selection in a primary list updates a related detail pane and both should remain visible on roomy device classes.",
673
+ "The same list-detail flow must become a navigation stack on a handset or portrait tablet."
674
+ ],
675
+ "avoidWhen": [
676
+ "Do not use SplitView for a single linear flow; use NavStack.",
677
+ "Do not use it for a complex desktop tool with multiple peripheral panels; use Workbench."
678
+ ],
679
+ "alternatives": [
680
+ {
681
+ "id": "recipe-navigation-stack",
682
+ "relationship": "responsive-alternative",
683
+ "when": "SplitView renders the one-pane navigation-stack form on compact device classes."
684
+ },
685
+ {
686
+ "id": "workbench",
687
+ "relationship": "nearest",
688
+ "when": "Use Workbench when a desktop-class tool needs more than the list and detail regions."
689
+ }
690
+ ],
691
+ "appOwns": [
692
+ "device-class policy",
693
+ "selected item and detail-active state",
694
+ "list and detail content",
695
+ "optional list width and persistence",
696
+ "back action"
697
+ ],
698
+ "variants": [
699
+ "fixed roomy split",
700
+ "resizable roomy split",
701
+ "compact list",
702
+ "compact detail"
703
+ ],
704
+ "accessibility": [
705
+ "Give the overall split and both meaningful panes accessible labels.",
706
+ "Wire the compact back action and optional separator keyboard behavior, and restore focus when controlled navigation replaces a view."
707
+ ],
708
+ "geometry": {
709
+ "margin": "none",
710
+ "border": "self",
711
+ "padding": "child",
712
+ "notes": [
713
+ "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."
714
+ ]
715
+ },
716
+ "delivery": {
717
+ "moduleImport": "@kerfjs/ui/split-view",
718
+ "manualCssImport": "@kerfjs/ui/split-view.css",
719
+ "sideEffects": [
720
+ "manual-css"
721
+ ]
722
+ },
723
+ "wiring": [
724
+ {
725
+ "export": "wireResizableRegions",
726
+ "import": "@kerfjs/ui/wire-resizable-regions",
727
+ "required": false
728
+ },
729
+ {
730
+ "export": "wireNavStack",
731
+ "import": "@kerfjs/ui/wire-nav-stack",
732
+ "required": true
733
+ }
734
+ ],
735
+ "publicClasses": [
736
+ "kui-split-view",
737
+ "kui-split-view__list",
738
+ "kui-resizable-region",
739
+ "kui-split-view__detail",
740
+ "kui-split-view--compact"
741
+ ],
742
+ "publicTokens": [
743
+ "--kui-split-view-list-width"
744
+ ],
745
+ "links": {
746
+ "catalogRoute": "?component=split-view",
747
+ "documentation": "docs/split-view.md",
748
+ "recipe": "docs/app-layouts.md#decision-matrix"
749
+ }
750
+ },
751
+ {
752
+ "id": "tab-scaffold",
753
+ "name": "TabScaffold",
754
+ "category": "Structure",
755
+ "kind": "component",
756
+ "source": "kerf",
757
+ "description": "A controlled compact-device bottom tab scaffold that keeps every tab scene mounted so its navigation and scroll state survive selection changes.",
758
+ "uses": [],
759
+ "purpose": "Switch among two to five co-equal top-level destinations on compact devices while preserving each destination's independent content state.",
760
+ "publicExports": [
761
+ "TabScaffoldTab",
762
+ "TabScaffoldProps",
763
+ "TabScaffold"
764
+ ],
765
+ "useWhen": [
766
+ "A handset or portrait-tablet app has two to five co-equal top-level destinations.",
767
+ "Each destination must stay mounted so its NavStack and scroll position survive tab switches."
768
+ ],
769
+ "avoidWhen": [
770
+ "Do not use TabScaffold for document tabs or reorderable work items; use TabBar.",
771
+ "Do not retain the bottom bar on desktop when the same destinations should be promoted to a Workbench rail or sidebar."
772
+ ],
773
+ "alternatives": [
774
+ {
775
+ "id": "tabs",
776
+ "relationship": "semantic-alternative",
777
+ "when": "Use TabBar and AppTab for document-style tabpanels, overflow, closing, or reordering."
778
+ },
779
+ {
780
+ "id": "workbench",
781
+ "relationship": "roomy-alternative",
782
+ "when": "Promote top-level destinations to a rail or sidebar on desktop-class layouts."
783
+ }
784
+ ],
785
+ "appOwns": [
786
+ "controlled active tab id",
787
+ "tab labels, icons, and content",
788
+ "routing and persistence",
789
+ "responsive replacement on larger device classes"
790
+ ],
791
+ "variants": [
792
+ "text-only tabs",
793
+ "icon and text tabs",
794
+ "one NavStack per tab"
795
+ ],
796
+ "accessibility": [
797
+ "Give the tablist an accessible label and keep exactly the active tab in the sequential focus order.",
798
+ "Wire selection through the controlled active id while leaving inactive scenes mounted and hidden."
799
+ ],
800
+ "geometry": {
801
+ "margin": "none",
802
+ "border": "self",
803
+ "padding": "self",
804
+ "notes": [
805
+ "The scaffold owns the full-height scene region and safe-area-aware bottom bar; scene content owns its internal geometry."
806
+ ]
807
+ },
808
+ "delivery": {
809
+ "moduleImport": "@kerfjs/ui/tab-scaffold",
810
+ "manualCssImport": "@kerfjs/ui/tab-scaffold.css",
811
+ "sideEffects": [
812
+ "manual-css"
813
+ ]
814
+ },
815
+ "wiring": [
816
+ {
817
+ "export": "wireTabScaffold",
818
+ "import": "@kerfjs/ui/wire-tab-scaffold",
819
+ "required": true
820
+ }
821
+ ],
822
+ "publicClasses": [
823
+ "kui-tab-scaffold",
824
+ "kui-tab-scaffold__scenes",
825
+ "kui-tab-scaffold__scene",
826
+ "kui-tab-scaffold__bar",
827
+ "kui-tab-scaffold__tab",
828
+ "kui-tab-scaffold__tab-icon",
829
+ "kui-tab-scaffold__tab-label"
830
+ ],
831
+ "publicTokens": [],
832
+ "links": {
833
+ "catalogRoute": "?component=tab-scaffold",
834
+ "documentation": "docs/tab-scaffold.md",
835
+ "recipe": "docs/app-layouts.md#decision-matrix"
836
+ }
837
+ },
558
838
  {
559
839
  "id": "workbench",
560
840
  "name": "Workbench",
@@ -596,7 +876,12 @@
596
876
  "right rail",
597
877
  "bottom drawer",
598
878
  "all panels",
599
- "independently collapsed panels"
879
+ "independently collapsed panels",
880
+ "hidden separator",
881
+ "slide, fade-slide, or instant content",
882
+ "clipped, scrolling, or popup-visible content",
883
+ "inline, overlay, or hidden responsive presentation",
884
+ "safe-area restore control"
600
885
  ],
601
886
  "accessibility": [
602
887
  "Give the Workbench and each meaningful rail or drawer an accessible label.",
@@ -623,14 +908,21 @@
623
908
  "kui-workbench__rail",
624
909
  "kui-workbench__rail--left",
625
910
  "kui-workbench__rail--right",
911
+ "kui-workbench__drawer",
626
912
  "kui-workbench__center",
627
913
  "kui-workbench__main",
628
- "kui-workbench__drawer",
629
- "kui-workbench__panel-content"
914
+ "kui-workbench__panel-content",
915
+ "kui-workbench__restore"
630
916
  ],
631
917
  "publicTokens": [
632
918
  "--kui-workbench-rail-width",
633
- "--kui-workbench-drawer-height"
919
+ "--kui-workbench-drawer-height",
920
+ "--kui-workbench-popup-z",
921
+ "--kui-workbench-overlay-z",
922
+ "--kui-workbench-overlay-max-width",
923
+ "--kui-workbench-overlay-max-height",
924
+ "--kui-workbench-restore-z",
925
+ "--kui-workbench-restore-inset"
634
926
  ],
635
927
  "links": {
636
928
  "catalogRoute": "?component=workbench",
@@ -638,20 +930,130 @@
638
930
  "recipe": "docs/workbench.md#state-lives-in-the-app"
639
931
  }
640
932
  },
933
+ {
934
+ "id": "collapsible-panel",
935
+ "name": "CollapsiblePanel",
936
+ "category": "Structure",
937
+ "kind": "component",
938
+ "source": "kerf",
939
+ "description": "A standalone controlled left or right rail or bottom drawer with standard collapse icons and optional compact-overlay behavior through wireSidebar.",
940
+ "uses": [
941
+ "lucide-icon"
942
+ ],
943
+ "purpose": "Add one independently collapsible peripheral panel without adopting the complete multi-panel Workbench shell.",
944
+ "publicExports": [
945
+ "CollapsiblePanelSide",
946
+ "collapsiblePanelToggleIcon",
947
+ "CollapsiblePanelToggleProps",
948
+ "CollapsiblePanelToggle",
949
+ "CollapsiblePanelProps",
950
+ "CollapsiblePanel"
951
+ ],
952
+ "useWhen": [
953
+ "An application needs one collapsible side rail or bottom drawer outside a full Workbench.",
954
+ "The panel should become a dismissable, focus-managed overlay on compact devices."
955
+ ],
956
+ "avoidWhen": [
957
+ "Do not use CollapsiblePanel for a complete editor shell with multiple coordinated rails and a drawer; use Workbench.",
958
+ "Do not preserve an empty icon-only rail when collapsed; move the restore control into adjacent visible chrome."
959
+ ],
960
+ "alternatives": [
961
+ {
962
+ "id": "workbench",
963
+ "relationship": "larger-composition",
964
+ "when": "Use Workbench when the central work area coordinates multiple peripheral panels."
965
+ },
966
+ {
967
+ "id": "recipe-collapsible-sidebar",
968
+ "relationship": "recipe",
969
+ "when": "Use the production recipe for collapse, restore, compact overlay, focus, and persistence ownership."
970
+ }
971
+ ],
972
+ "appOwns": [
973
+ "controlled collapsed state",
974
+ "panel content and size",
975
+ "toggle placement",
976
+ "persistence policy",
977
+ "compact-device policy"
978
+ ],
979
+ "variants": [
980
+ "left rail",
981
+ "right rail",
982
+ "bottom drawer",
983
+ "collapsed",
984
+ "compact overlay",
985
+ "compact responsive replacement",
986
+ "hidden separator",
987
+ "slide, fade-slide, or instant content",
988
+ "clipped, scrolling, or popup-visible content",
989
+ "safe-area restore control"
990
+ ],
991
+ "accessibility": [
992
+ "Give the panel region and every collapse or restore control an accessible label.",
993
+ "Keep the restore control outside the disappearing panel and use wireSidebar for focus transfer, Escape, backdrop dismissal, and compact focus trapping."
994
+ ],
995
+ "geometry": {
996
+ "margin": "none",
997
+ "border": "self",
998
+ "padding": "child",
999
+ "notes": [
1000
+ "The panel owns its dock-edge separator and size track; its child content owns internal padding and scrolling."
1001
+ ]
1002
+ },
1003
+ "delivery": {
1004
+ "moduleImport": "@kerfjs/ui/collapsible-panel",
1005
+ "manualCssImport": "@kerfjs/ui/collapsible-panel.css",
1006
+ "sideEffects": [
1007
+ "manual-css"
1008
+ ]
1009
+ },
1010
+ "wiring": [
1011
+ {
1012
+ "export": "wireSidebar",
1013
+ "import": "@kerfjs/ui/wire-sidebar",
1014
+ "required": true
1015
+ }
1016
+ ],
1017
+ "publicClasses": [
1018
+ "kui-collapsible-panel",
1019
+ "kui-collapsible-panel--left",
1020
+ "kui-collapsible-panel--right",
1021
+ "kui-collapsible-panel--bottom",
1022
+ "kui-collapsible-panel__content",
1023
+ "kui-collapsible-panel__restore",
1024
+ "kui-collapsible-panel__backdrop",
1025
+ "kui-collapsible-panel__toggle"
1026
+ ],
1027
+ "publicTokens": [
1028
+ "--kui-collapsible-panel-width",
1029
+ "--kui-collapsible-panel-height",
1030
+ "--kui-collapsible-panel-popup-z",
1031
+ "--kui-collapsible-panel-overlay-z",
1032
+ "--kui-collapsible-panel-restore-z",
1033
+ "--kui-collapsible-panel-restore-inset",
1034
+ "--kui-collapsible-panel-backdrop-z"
1035
+ ],
1036
+ "links": {
1037
+ "catalogRoute": "?component=collapsible-panel",
1038
+ "documentation": "docs/collapsible-panel.md",
1039
+ "recipe": "docs/collapsible-panel.md#recipe-and-coverage"
1040
+ }
1041
+ },
641
1042
  {
642
1043
  "id": "sunken-panel",
643
1044
  "name": "SunkenPanel",
644
1045
  "category": "Structure",
645
1046
  "kind": "component",
646
1047
  "source": "kerf",
647
- "description": "A lowered application surface with one compact inset and a vertical content stack.",
1048
+ "description": "A rounded or square-corner lowered application surface with one compact inset and a vertical content stack.",
648
1049
  "uses": [],
649
- "purpose": "Group a vertical list of application content on a visually lowered surface with one owned 8px inset.",
1050
+ "purpose": "Group a vertical list of application content on a visually lowered surface with one owned 8px inset and an explicit rounded or square-corner shape.",
650
1051
  "publicExports": [
651
1052
  "SunkenPanel"
652
1053
  ],
653
1054
  "useWhen": [
654
- "A main content region or nested work area needs a darker/lowered background and one compact inset around a vertical stack."
1055
+ "A main content region or nested work area needs a darker/lowered background and one compact inset around a vertical stack.",
1056
+ "Use the default rounded shape for an inset surface; choose square for a flush or edge-to-edge application area."
655
1057
  ],
656
1058
  "avoidWhen": [
657
1059
  "Do not use it merely to add padding, as a substitute for Pane anatomy, or around children that already own the same outer surface."
@@ -665,10 +1067,13 @@
665
1067
  ],
666
1068
  "appOwns": [
667
1069
  "region semantics and accessible name",
1070
+ "corner shape",
668
1071
  "scroll ownership",
669
1072
  "child ordering and content"
670
1073
  ],
671
1074
  "variants": [
1075
+ "rounded surface",
1076
+ "square-corner surface",
672
1077
  "unnamed surface",
673
1078
  "named region"
674
1079
  ],
@@ -723,25 +1128,21 @@
723
1128
  "Toolbar"
724
1129
  ],
725
1130
  "useWhen": [
726
- "Compose persistent application chrome with leading, center, and trailing regions."
1131
+ "Compose application chrome or a page, panel, or dialog heading with leading, center, and trailing regions."
727
1132
  ],
728
1133
  "avoidWhen": [
729
- "Do not use for a page title or dialog heading."
730
- ],
731
- "alternatives": [
732
- {
733
- "id": "panel-header",
734
- "relationship": "nearest"
735
- }
1134
+ "Do not use it as a generic wrapper when no toolbar or heading relationship exists."
736
1135
  ],
1136
+ "alternatives": [],
737
1137
  "appOwns": [
738
1138
  "actions",
739
1139
  "command availability",
740
1140
  "responsive relocation"
741
1141
  ],
742
1142
  "variants": [
743
- "divider",
744
- "no divider",
1143
+ "bottom divider (default)",
1144
+ "no dividers",
1145
+ "top/right/bottom/left divider combinations",
745
1146
  "centered content"
746
1147
  ],
747
1148
  "accessibility": [
@@ -752,7 +1153,7 @@
752
1153
  "border": "conditional",
753
1154
  "padding": "self",
754
1155
  "notes": [
755
- "Padding belongs to the toolbar; the optional divider variant also owns its border."
1156
+ "Padding belongs to the toolbar; dividerSides selects any canonical combination of its physical top, right, bottom, and left edges."
756
1157
  ]
757
1158
  },
758
1159
  "delivery": {
@@ -771,7 +1172,8 @@
771
1172
  ],
772
1173
  "publicTokens": [
773
1174
  "--kui-color-border",
774
- "--kui-font-sans"
1175
+ "--kui-font-sans",
1176
+ "--kui-toolbar-divider-color"
775
1177
  ],
776
1178
  "links": {
777
1179
  "catalogRoute": "?component=toolbar",
@@ -785,12 +1187,12 @@
785
1187
  "category": "Structure",
786
1188
  "kind": "component",
787
1189
  "source": "kerf",
788
- "description": "Contained, borderless, pressed, and single-control toolbar groups.",
1190
+ "description": "Typed toolbar groups for compact, mixed, selected, dropdown, and avatar controls.",
789
1191
  "uses": [
790
1192
  "lucide-icon",
791
1193
  "segmented-control"
792
1194
  ],
793
- "purpose": "Contained, borderless, pressed, and single-control toolbar groups.",
1195
+ "purpose": "Typed toolbar groups for compact, mixed, selected, dropdown, and avatar controls.",
794
1196
  "publicExports": [
795
1197
  "ToolbarControlGroup"
796
1198
  ],
@@ -821,7 +1223,14 @@
821
1223
  "contained",
822
1224
  "borderless",
823
1225
  "pressed",
824
- "single"
1226
+ "single",
1227
+ "default or compact size",
1228
+ "comfortable or tight density",
1229
+ "icon, text, mixed, or avatar content",
1230
+ "raised, filled, or outline selected chrome",
1231
+ "brand or neutral selected tone",
1232
+ "nested dropdown trigger",
1233
+ "avatar scrim"
825
1234
  ],
826
1235
  "accessibility": [
827
1236
  "Name the group when its relationship is not evident from context."
@@ -871,6 +1280,75 @@
871
1280
  "recipe": "docs/component-selection.md#problem-to-component-matrix"
872
1281
  }
873
1282
  },
1283
+ {
1284
+ "id": "surface-scaffold",
1285
+ "name": "Surface scaffolds",
1286
+ "category": "Structure",
1287
+ "kind": "component",
1288
+ "source": "kerf",
1289
+ "description": "Typed Web Awesome dialog and popup surface sizing, presentation, and inset composition.",
1290
+ "uses": [
1291
+ "wa-dialog",
1292
+ "wa-dropdown",
1293
+ "wa-dropdown-item"
1294
+ ],
1295
+ "purpose": "Configure recurring dialog and popup geometry without consumer ::part() overrides.",
1296
+ "publicExports": [
1297
+ "DialogSurface",
1298
+ "PopupSurface"
1299
+ ],
1300
+ "useWhen": [
1301
+ "A Web Awesome dialog or dropdown needs a standard size, presentation, body/footer inset, or list-compatible menu inset."
1302
+ ],
1303
+ "avoidWhen": [
1304
+ "Do not use it as a generic layout wrapper or to replace application-owned modal state and focus lifecycle."
1305
+ ],
1306
+ "alternatives": [],
1307
+ "appOwns": [
1308
+ "open state",
1309
+ "focus lifecycle",
1310
+ "dismissal policy",
1311
+ "content",
1312
+ "outer placement"
1313
+ ],
1314
+ "variants": [
1315
+ "small, medium, or large dialog",
1316
+ "modal, side-sheet, or fullscreen dialog",
1317
+ "none, compact, or comfortable body and footer inset",
1318
+ "standard, compact, or zero-inset popup menu"
1319
+ ],
1320
+ "accessibility": [
1321
+ "Supply the wrapped wa-dialog label and retain Web Awesome's native modal and focus behavior.",
1322
+ "Use popup surfaces only for real dropdown menus with named triggers."
1323
+ ],
1324
+ "geometry": {
1325
+ "margin": "parent",
1326
+ "border": "child",
1327
+ "padding": "self"
1328
+ },
1329
+ "delivery": {
1330
+ "browserImport": "@kerfjs/ui/surface-scaffold",
1331
+ "manualCssImport": "@kerfjs/ui/surface-scaffold.css",
1332
+ "sideEffects": [
1333
+ "browser-condition-css"
1334
+ ]
1335
+ },
1336
+ "wiring": [],
1337
+ "publicClasses": [
1338
+ "kui-dialog-surface",
1339
+ "kui-popup-surface"
1340
+ ],
1341
+ "publicTokens": [
1342
+ "--kui-radius-l",
1343
+ "--kui-wa-container-inset",
1344
+ "--kui-wa-surface-inset"
1345
+ ],
1346
+ "links": {
1347
+ "catalogRoute": "?component=surface-scaffold",
1348
+ "documentation": "docs/surface-scaffold.md",
1349
+ "recipe": "docs/component-selection.md#problem-to-component-matrix"
1350
+ }
1351
+ },
874
1352
  {
875
1353
  "id": "floating-toolbar",
876
1354
  "name": "FloatingToolbar",
@@ -951,17 +1429,12 @@
951
1429
  "ToolbarText"
952
1430
  ],
953
1431
  "useWhen": [
954
- "Render toolbar identity text at a supported hierarchy size."
1432
+ "Render toolbar identity or heading text at a supported hierarchy size; pass headingLevel for heading semantics."
955
1433
  ],
956
1434
  "avoidWhen": [
957
- "Do not substitute it for document heading semantics."
958
- ],
959
- "alternatives": [
960
- {
961
- "id": "panel-header",
962
- "relationship": "nearest"
963
- }
1435
+ "Do not omit headingLevel when the text is the page or section heading."
964
1436
  ],
1437
+ "alternatives": [],
965
1438
  "appOwns": [
966
1439
  "text",
967
1440
  "responsive priority"
@@ -1012,7 +1485,9 @@
1012
1485
  "source": "kerf",
1013
1486
  "description": "Page, dialog, and definition-list hierarchy.",
1014
1487
  "uses": [
1015
- "panel-header",
1488
+ "toolbar",
1489
+ "toolbar-control-group",
1490
+ "toolbar-text",
1016
1491
  "value-table"
1017
1492
  ],
1018
1493
  "purpose": "Page, dialog, and definition-list hierarchy.",
@@ -1023,16 +1498,7 @@
1023
1498
  "avoidWhen": [
1024
1499
  "Do not reuse one header primitive only because its typography looks similar."
1025
1500
  ],
1026
- "alternatives": [
1027
- {
1028
- "id": "toolbar",
1029
- "relationship": "nearest"
1030
- },
1031
- {
1032
- "id": "panel-header",
1033
- "relationship": "nearest"
1034
- }
1035
- ],
1501
+ "alternatives": [],
1036
1502
  "appOwns": [
1037
1503
  "scope hierarchy",
1038
1504
  "copy",
@@ -1065,91 +1531,6 @@
1065
1531
  "recipe": "docs/component-selection.md#ambiguous-choices"
1066
1532
  }
1067
1533
  },
1068
- {
1069
- "id": "panel-header",
1070
- "name": "PanelHeader",
1071
- "category": "Structure",
1072
- "kind": "component",
1073
- "source": "kerf",
1074
- "description": "A plain Toolbar as a panel, dialog, or page heading: optional icon group, an extra-large title, trailing actions, and an optional subtitle row.",
1075
- "uses": [
1076
- "lucide-icon",
1077
- "toolbar",
1078
- "toolbar-control-group",
1079
- "toolbar-text"
1080
- ],
1081
- "purpose": "A plain Toolbar as a panel, dialog, or page heading: optional icon group, an extra-large title, trailing actions, and an optional subtitle row.",
1082
- "publicExports": [
1083
- "PanelHeader"
1084
- ],
1085
- "useWhen": [
1086
- "Give a panel, dialog, or page a heading with an extra-large title, optional icon and subtitle, and trailing actions."
1087
- ],
1088
- "avoidWhen": [
1089
- "Do not use it as persistent application chrome; use Toolbar. It supplies header structure, not modal behavior."
1090
- ],
1091
- "alternatives": [
1092
- {
1093
- "id": "toolbar",
1094
- "relationship": "nearest"
1095
- },
1096
- {
1097
- "id": "wa-dialog",
1098
- "relationship": "prefer-over"
1099
- }
1100
- ],
1101
- "appOwns": [
1102
- "open state",
1103
- "focus lifecycle",
1104
- "dismissal",
1105
- "copy",
1106
- "the trailing action controls"
1107
- ],
1108
- "variants": [
1109
- "title",
1110
- "optional summary",
1111
- "icon",
1112
- "actions",
1113
- "placeholder (loading)",
1114
- "page heading (headingLevel)"
1115
- ],
1116
- "accessibility": [
1117
- "Connect the title id and any provided summary id to the dialog or panel host.",
1118
- "Pass the trailing actions as a labeled ToolbarControlGroup when the group needs an accessible name.",
1119
- "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."
1120
- ],
1121
- "geometry": {
1122
- "margin": "none",
1123
- "border": "child",
1124
- "padding": "child"
1125
- },
1126
- "delivery": {
1127
- "browserImport": "@kerfjs/ui/panel-header",
1128
- "manualCssImport": "@kerfjs/ui/panel-header.css",
1129
- "sideEffects": [
1130
- "browser-condition-css"
1131
- ]
1132
- },
1133
- "wiring": [],
1134
- "publicClasses": [
1135
- "kui-panel-header",
1136
- "kui-panel-header__icon",
1137
- "kui-panel-header__summary"
1138
- ],
1139
- "publicTokens": [
1140
- "--kui-color-brand-fill-quiet",
1141
- "--kui-color-brand-on-quiet",
1142
- "--kui-color-text-quiet",
1143
- "--kui-panel-header-icon-background",
1144
- "--kui-panel-header-icon-border",
1145
- "--kui-panel-header-icon-foreground"
1146
- ],
1147
- "links": {
1148
- "catalogRoute": "?component=panel-header",
1149
- "documentation": "docs/component-selection.md",
1150
- "recipe": "docs/component-selection.md#ambiguous-choices"
1151
- }
1152
- },
1153
1534
  {
1154
1535
  "id": "value-table",
1155
1536
  "name": "ValueTable",
@@ -1226,63 +1607,69 @@
1226
1607
  },
1227
1608
  {
1228
1609
  "id": "list",
1229
- "name": "List composition",
1610
+ "name": "List",
1230
1611
  "category": "Navigation",
1231
- "kind": "composition",
1612
+ "kind": "component",
1232
1613
  "source": "kerf",
1233
- "description": "Navigation rows and section headers composed as ordinary content items inside a pane.",
1614
+ "description": "A stretch-aligned vertical stack with optional gap, flex growth, vertical scrolling, and independently selectable divider edges.",
1234
1615
  "uses": [
1235
1616
  "list-header",
1236
1617
  "list-action-row",
1237
1618
  "list-item"
1238
1619
  ],
1239
- "purpose": "Compose navigation with the same pane, content stack, item, and toolbar geometry used throughout the application, including a controlled ListHeader disclosure only when it reveals real content.",
1240
- "publicExports": [],
1620
+ "purpose": "Standardize vertical component layout and its scroll/divider ownership instead of repeating ad-hoc flex-column wrappers.",
1621
+ "publicExports": [
1622
+ "List"
1623
+ ],
1241
1624
  "useWhen": [
1242
- "Compose navigation sections in a .kui-content stack, using ListHeader, ListItem, and ListActionRow children plus optional .kui-content-item surfaces."
1625
+ "Arrange component rows or sections in a vertical stretch-aligned stack.",
1626
+ "Let one bounded list own vertical scrolling, flex growth, or one or more physical-edge dividers."
1243
1627
  ],
1244
1628
  "avoidWhen": [
1245
- "Do not add sidebar-specific wrapper padding or use the pattern for unrelated inline controls.",
1246
- "Do not place a disclosure chevron on navigation that does not expand content."
1629
+ "Do not use List as semantic list markup; use ul/ol when list semantics are required and apply layout deliberately.",
1630
+ "Do not create nested scroll owners or use divider sides as a substitute for meaningful grouping."
1247
1631
  ],
1248
1632
  "alternatives": [],
1249
1633
  "appOwns": [
1250
- "information architecture",
1251
- "routing",
1252
- "responsive shell behavior"
1634
+ "child semantics and content",
1635
+ "the bounded height needed for scrolling",
1636
+ "gap, flex, and divider choices"
1253
1637
  ],
1254
1638
  "variants": [
1255
- "section",
1256
- "icon rows",
1257
- "iconless rows",
1258
- "content item",
1259
- "pane toolbar or footer"
1639
+ "no gap",
1640
+ "standard or custom gap",
1641
+ "boolean or custom flex",
1642
+ "scrollable",
1643
+ "top/right/bottom/left divider combinations"
1260
1644
  ],
1261
1645
  "accessibility": [
1262
- "Use native links for link navigation, retain ListItem button semantics for actions, and keep standalone header and toolbar actions at least 44px square.",
1263
- "A ListHeader disclosure controls real content, keeps a stable accessible name and aria-expanded state, and uses the production DisclosureArrow visual."
1646
+ "List adds layout only and no list role; children retain responsibility for their native or ARIA semantics.",
1647
+ "Give a scrollable List a bounded block size and keep keyboard focus visible as its contents scroll."
1264
1648
  ],
1265
1649
  "geometry": {
1266
- "margin": "child",
1267
- "border": "child",
1268
- "padding": "child"
1650
+ "margin": "none",
1651
+ "border": "conditional",
1652
+ "padding": "none",
1653
+ "notes": [
1654
+ "List adds no margin or padding; dividerSides draws only the selected physical edges without changing box geometry."
1655
+ ]
1269
1656
  },
1270
1657
  "delivery": {
1271
- "manualCssImport": "@kerfjs/ui/layout.css",
1658
+ "browserImport": "@kerfjs/ui/list",
1659
+ "manualCssImport": "@kerfjs/ui/list.css",
1272
1660
  "sideEffects": [
1273
- "css"
1661
+ "browser-condition-css"
1274
1662
  ]
1275
1663
  },
1276
1664
  "wiring": [],
1277
1665
  "publicClasses": [
1278
- "kui-content",
1279
- "kui-content-item"
1666
+ "kui-list"
1280
1667
  ],
1281
1668
  "publicTokens": [
1282
- "--kui-layout-content-gap",
1283
- "--kui-layout-inline-margin",
1284
- "--kui-layout-item-padding",
1285
- "--kui-layout-rounded-radius"
1669
+ "--kui-color-border",
1670
+ "--kui-layout-item-gap",
1671
+ "--kui-list-divider-color",
1672
+ "--kui-list-gap"
1286
1673
  ],
1287
1674
  "links": {
1288
1675
  "catalogRoute": "?component=list",
@@ -1296,7 +1683,7 @@
1296
1683
  "category": "Navigation",
1297
1684
  "kind": "component",
1298
1685
  "source": "kerf",
1299
- "description": "Full-width section headings with a semantic neutral count pill or non-count badge, a logical-end action, disclosure states, and protected native-popover trigger metadata.",
1686
+ "description": "Configurable section headings with semantic count/status indicators, density, group dividers, a logical-end action, disclosure states, and protected native-popover trigger metadata.",
1300
1687
  "uses": [
1301
1688
  "lucide-icon",
1302
1689
  "disclosure-arrow"
@@ -1314,7 +1701,7 @@
1314
1701
  ],
1315
1702
  "alternatives": [
1316
1703
  {
1317
- "id": "panel-header",
1704
+ "id": "toolbar",
1318
1705
  "relationship": "nearest"
1319
1706
  }
1320
1707
  ],
@@ -1333,7 +1720,10 @@
1333
1720
  "badge",
1334
1721
  "action",
1335
1722
  "toggle",
1336
- "placeholder (loading)"
1723
+ "placeholder (loading)",
1724
+ "compact density",
1725
+ "neutral, accent, or danger indicator tone",
1726
+ "before, after, or paired group divider"
1337
1727
  ],
1338
1728
  "accessibility": [
1339
1729
  "A valid count is hidden as duplicate visual text and its required localized countLabel joins the owned heading or disclosure-button accessible name; zero remains visible.",
@@ -1375,7 +1765,11 @@
1375
1765
  "--kui-layout-item-padding",
1376
1766
  "--kui-layout-pill-radius",
1377
1767
  "--kui-list-header-count-font-size",
1378
- "--kui-list-header-hover-background"
1768
+ "--kui-list-header-hover-background",
1769
+ "--kui-list-group-divider-color",
1770
+ "--kui-color-brand-on-normal",
1771
+ "--kui-color-danger-fill-normal",
1772
+ "--kui-color-danger-on-normal"
1379
1773
  ],
1380
1774
  "links": {
1381
1775
  "catalogRoute": "?component=list-header",
@@ -1389,9 +1783,10 @@
1389
1783
  "category": "Navigation",
1390
1784
  "kind": "component",
1391
1785
  "source": "kerf",
1392
- "description": "Full-width navigation rows with sibling primary and trailing native-button actions.",
1786
+ "description": "Configurable navigation rows with structured labels, status/busy metadata, density, group dividers, and sibling primary/trailing native-button actions.",
1393
1787
  "uses": [
1394
- "lucide-icon"
1788
+ "lucide-icon",
1789
+ "loading-spinner"
1395
1790
  ],
1396
1791
  "purpose": "Keep a selectable primary row action and an independently named trailing action as sibling native controls inside one noninteractive visual row.",
1397
1792
  "publicExports": [
@@ -1428,7 +1823,12 @@
1428
1823
  "disabled primary",
1429
1824
  "disabled trailing action",
1430
1825
  "multiline",
1431
- "placeholder (loading)"
1826
+ "placeholder (loading)",
1827
+ "compact density",
1828
+ "description and status",
1829
+ "busy while retaining content",
1830
+ "interaction-revealed trailing action",
1831
+ "before, after, or paired group divider"
1432
1832
  ],
1433
1833
  "accessibility": [
1434
1834
  "The noninteractive root contains two sibling native buttons in primary-then-trailing focus order; each button has its own action, item identity, accessible name, and disabled state.",
@@ -1451,6 +1851,9 @@
1451
1851
  "kui-list-action-row",
1452
1852
  "kui-list-action-row__icon",
1453
1853
  "kui-list-action-row__label",
1854
+ "kui-list-action-row__primary-label",
1855
+ "kui-list-action-row__description",
1856
+ "kui-list-action-row__status",
1454
1857
  "kui-list-action-row__primary",
1455
1858
  "kui-list-action-row__trailing-action"
1456
1859
  ],
@@ -1461,6 +1864,8 @@
1461
1864
  "--kui-color-neutral-fill-normal",
1462
1865
  "--kui-color-neutral-fill-quiet",
1463
1866
  "--kui-color-neutral-on-normal",
1867
+ "--kui-color-neutral-on-quiet",
1868
+ "--kui-color-neutral-border-quiet",
1464
1869
  "--kui-focus-ring",
1465
1870
  "--kui-layout-inline-margin",
1466
1871
  "--kui-layout-item-gap",
@@ -1475,7 +1880,9 @@
1475
1880
  "--kui-list-action-row-selected-background",
1476
1881
  "--kui-list-action-row-selected-border",
1477
1882
  "--kui-list-action-row-selected-color",
1478
- "--kui-list-action-row-trailing-hover-background"
1883
+ "--kui-list-action-row-trailing-hover-background",
1884
+ "--kui-list-group-divider-color",
1885
+ "--kui-font-xs"
1479
1886
  ],
1480
1887
  "links": {
1481
1888
  "catalogRoute": "?component=list-action-row",
@@ -1489,9 +1896,10 @@
1489
1896
  "category": "Navigation",
1490
1897
  "kind": "component",
1491
1898
  "source": "kerf",
1492
- "description": "Selectable, disabled, trailing, and multiline native-button navigation rows with protected domain metadata hooks.",
1899
+ "description": "Configurable native-button navigation rows with structured labels, status/busy metadata, density, group dividers, and protected domain metadata hooks.",
1493
1900
  "uses": [
1494
- "lucide-icon"
1901
+ "lucide-icon",
1902
+ "loading-spinner"
1495
1903
  ],
1496
1904
  "purpose": "Selectable, disabled, trailing, and multiline navigation rows.",
1497
1905
  "publicExports": [
@@ -1523,7 +1931,11 @@
1523
1931
  "disabled",
1524
1932
  "trailing",
1525
1933
  "multiline",
1526
- "placeholder (loading)"
1934
+ "placeholder (loading)",
1935
+ "compact density",
1936
+ "description and status",
1937
+ "busy while retaining content",
1938
+ "before, after, or paired group divider"
1527
1939
  ],
1528
1940
  "accessibility": [
1529
1941
  "Uses native button activation; selected maps to aria-current and pressed to aria-pressed; rootAttributes cannot add role=menuitem or replace owned ARIA; trailing is dormant content and must not contain controls."
@@ -1545,6 +1957,9 @@
1545
1957
  "kui-list-item",
1546
1958
  "kui-list-item__icon",
1547
1959
  "kui-list-item__label",
1960
+ "kui-list-item__primary-label",
1961
+ "kui-list-item__description",
1962
+ "kui-list-item__status",
1548
1963
  "kui-list-item__trailing"
1549
1964
  ],
1550
1965
  "publicTokens": [
@@ -1552,11 +1967,14 @@
1552
1967
  "--kui-color-neutral-fill-quiet",
1553
1968
  "--kui-color-neutral-on-normal",
1554
1969
  "--kui-color-neutral-on-quiet",
1970
+ "--kui-color-neutral-border-quiet",
1555
1971
  "--kui-focus-ring",
1556
1972
  "--kui-list-item-color",
1557
1973
  "--kui-list-item-hover-background",
1558
1974
  "--kui-list-item-selected-background",
1559
1975
  "--kui-list-item-selected-color",
1976
+ "--kui-list-group-divider-color",
1977
+ "--kui-font-xs",
1560
1978
  "--kui-layout-inline-margin",
1561
1979
  "--kui-layout-item-gap",
1562
1980
  "--kui-layout-item-padding",
@@ -1683,11 +2101,11 @@
1683
2101
  "category": "Navigation",
1684
2102
  "kind": "component",
1685
2103
  "source": "kerf",
1686
- "description": "Roving-tabindex-ready tabs with protected application metadata and customizable close affordances.",
2104
+ "description": "Roving-tabindex-ready tabs with typed compact, segmented, icon-only, and truncating-label presentations.",
1687
2105
  "uses": [
1688
2106
  "lucide-icon"
1689
2107
  ],
1690
- "purpose": "Roving-tabindex-ready tabs with protected application metadata and customizable close affordances.",
2108
+ "purpose": "Roving-tabindex-ready tabs with typed compact, segmented, icon-only, and truncating-label presentations.",
1691
2109
  "publicExports": [
1692
2110
  "AppTab"
1693
2111
  ],
@@ -1708,7 +2126,8 @@
1708
2126
  "selection",
1709
2127
  "close policy",
1710
2128
  "content",
1711
- "application data attribute values"
2129
+ "application data attribute values",
2130
+ "outer placement"
1712
2131
  ],
1713
2132
  "variants": [
1714
2133
  "selected",
@@ -1717,7 +2136,11 @@
1717
2136
  "leading",
1718
2137
  "trailing",
1719
2138
  "custom close icon",
1720
- "root metadata"
2139
+ "root metadata",
2140
+ "compact size",
2141
+ "segmented presentation",
2142
+ "icon-only accessible presentation",
2143
+ "label maximum width and truncation"
1721
2144
  ],
1722
2145
  "accessibility": [
1723
2146
  "Compose in a tablist and pair with an application-owned tabpanel.",
@@ -1777,12 +2200,12 @@
1777
2200
  "category": "Navigation",
1778
2201
  "kind": "component",
1779
2202
  "source": "kerf",
1780
- "description": "Controlled, reorderable tab strips with horizontal overflow.",
2203
+ "description": "Controlled tab strips with typed rail, segmented, and inspector presentation plus intrinsic or fill allocation.",
1781
2204
  "uses": [
1782
2205
  "tabs",
1783
2206
  "toolbar-control-group"
1784
2207
  ],
1785
- "purpose": "Controlled, reorderable tab strips with horizontal overflow.",
2208
+ "purpose": "Controlled tab strips with typed rail, segmented, and inspector presentation plus intrinsic or fill allocation.",
1786
2209
  "publicExports": [
1787
2210
  "TabBar",
1788
2211
  "wireTabBars",
@@ -1813,13 +2236,17 @@
1813
2236
  "selection",
1814
2237
  "panels",
1815
2238
  "routing",
1816
- "persistence"
2239
+ "persistence",
2240
+ "outer placement"
1817
2241
  ],
1818
2242
  "variants": [
1819
2243
  "leading",
1820
2244
  "trailing",
1821
2245
  "overflow",
1822
- "reorderable"
2246
+ "reorderable",
2247
+ "rail, segmented, and inspector presentation",
2248
+ "intrinsic or fill allocation",
2249
+ "separate or adjacent trailing action"
1823
2250
  ],
1824
2251
  "accessibility": [
1825
2252
  "Keep exactly one selected tab at tabindex 0 and preserve the wiring keyboard model."
@@ -2014,7 +2441,7 @@
2014
2441
  "accessibility": [
2015
2442
  "Announce result changes when useful and keep tokens atomic during editing.",
2016
2443
  "Keep leading and trailing controls aligned to the first text line while content wraps.",
2017
- "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.",
2444
+ "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.",
2018
2445
  "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."
2019
2446
  ],
2020
2447
  "geometry": {
@@ -2127,7 +2554,12 @@
2127
2554
  "start edge",
2128
2555
  "end edge",
2129
2556
  "collapsed",
2130
- "custom handle icon"
2557
+ "custom handle icon",
2558
+ "hidden separator",
2559
+ "slide, fade-slide, or instant content",
2560
+ "clipped, scrolling, or popup-visible content",
2561
+ "inline, overlay, or hidden responsive presentation",
2562
+ "safe-area restore control"
2131
2563
  ],
2132
2564
  "accessibility": [
2133
2565
  "Preserve separator naming, value ARIA, and keyboard behavior.",
@@ -2169,7 +2601,8 @@
2169
2601
  "kui-resizable-region",
2170
2602
  "kui-resizable-region__content",
2171
2603
  "kui-resizable-region__handle",
2172
- "kui-resizable-region__handle-icon"
2604
+ "kui-resizable-region__handle-icon",
2605
+ "kui-resizable-region__restore"
2173
2606
  ],
2174
2607
  "publicTokens": [
2175
2608
  "--kui-color-border",
@@ -2179,6 +2612,10 @@
2179
2612
  "--kui-radius-s",
2180
2613
  "--kui-resizable-region-handle-active-color",
2181
2614
  "--kui-resizable-region-handle-color",
2615
+ "--kui-resizable-region-overlay-z",
2616
+ "--kui-resizable-region-popup-z",
2617
+ "--kui-resizable-region-restore-inset",
2618
+ "--kui-resizable-region-restore-z",
2182
2619
  "--kui-resizable-region-separator-color",
2183
2620
  "--kui-resizable-region-size"
2184
2621
  ],
@@ -2194,13 +2631,13 @@
2194
2631
  "category": "Controls",
2195
2632
  "kind": "component",
2196
2633
  "source": "kerf",
2197
- "description": "Controlled Web Awesome select with grouped choices and rerender-stable icon slots.",
2634
+ "description": "Controlled Web Awesome select with typed form, toolbar, navigation, compact, icon-only, truncating, hint, and grouped-choice presentations.",
2198
2635
  "uses": [
2199
2636
  "lucide-icon",
2200
2637
  "wa-select",
2201
2638
  "wa-option"
2202
2639
  ],
2203
- "purpose": "Controlled Web Awesome select with grouped choices and rerender-stable icon slots.",
2640
+ "purpose": "Controlled Web Awesome select with typed form, toolbar, navigation, compact, icon-only, truncating, hint, and grouped-choice presentations.",
2204
2641
  "publicExports": [
2205
2642
  "Select"
2206
2643
  ],
@@ -2228,7 +2665,9 @@
2228
2665
  "value",
2229
2666
  "validation",
2230
2667
  "choices",
2231
- "domain mapping"
2668
+ "hint copy",
2669
+ "domain mapping",
2670
+ "outer placement"
2232
2671
  ],
2233
2672
  "variants": [
2234
2673
  "placeholder",
@@ -2236,10 +2675,18 @@
2236
2675
  "fit menu",
2237
2676
  "grouped",
2238
2677
  "custom selected content",
2239
- "placeholder (loading)"
2678
+ "hint text",
2679
+ "placeholder (loading)",
2680
+ "form, toolbar-borderless, or navigation presentation",
2681
+ "default or compact size",
2682
+ "label or icon-only selected presentation",
2683
+ "select- or group-owned focus ring",
2684
+ "label maximum width and truncation"
2240
2685
  ],
2241
2686
  "accessibility": [
2242
- "Verify the live value, standard events, focus, and rendered output."
2687
+ "Verify the live value, standard events, focus, and rendered output.",
2688
+ "A nonempty label names the internal combobox; otherwise ariaLabel supplies a visually hidden label without adding control height, including custom selected content.",
2689
+ "Hint text is visible below the control through Web Awesome's native hint relationship; placeholderText remains the empty value inside the closed control."
2243
2690
  ],
2244
2691
  "geometry": {
2245
2692
  "margin": "none",
@@ -2259,6 +2706,7 @@
2259
2706
  "kui-select",
2260
2707
  "kui-select--custom-selected",
2261
2708
  "kui-select--fit-menu",
2709
+ "kui-select--label-hidden",
2262
2710
  "kui-select__custom-selected",
2263
2711
  "kui-select__group",
2264
2712
  "kui-select__group--separated",
@@ -2385,6 +2833,7 @@
2385
2833
  }
2386
2834
  ],
2387
2835
  "appOwns": [
2836
+ "badge content",
2388
2837
  "state mapping",
2389
2838
  "message lifetime",
2390
2839
  "retry behavior",
@@ -2398,10 +2847,12 @@
2398
2847
  "danger",
2399
2848
  "status",
2400
2849
  "alert",
2850
+ "badge",
2401
2851
  "placeholder (loading)"
2402
2852
  ],
2403
2853
  "accessibility": [
2404
- "Use alert urgency only for an attention-requiring failure."
2854
+ "Use alert urgency only for an attention-requiring failure.",
2855
+ "Keep optional badge content terse and do not rely on its tone alone for meaning."
2405
2856
  ],
2406
2857
  "geometry": {
2407
2858
  "margin": "self",
@@ -2419,7 +2870,9 @@
2419
2870
  "publicClasses": [
2420
2871
  "kui-state-banner",
2421
2872
  "kui-state-banner__action",
2873
+ "kui-state-banner__badge",
2422
2874
  "kui-state-banner__copy",
2875
+ "kui-state-banner__detail",
2423
2876
  "kui-state-banner__icon"
2424
2877
  ],
2425
2878
  "publicTokens": [
@@ -2446,6 +2899,8 @@
2446
2899
  "--kui-state-banner-action-background",
2447
2900
  "--kui-state-banner-action-hover-background",
2448
2901
  "--kui-state-banner-background",
2902
+ "--kui-state-banner-badge-background",
2903
+ "--kui-state-banner-badge-foreground",
2449
2904
  "--kui-state-banner-border",
2450
2905
  "--kui-state-banner-danger-background",
2451
2906
  "--kui-state-banner-danger-border",
@@ -5405,7 +5860,6 @@
5405
5860
  "toolbar-control-group",
5406
5861
  "list-header",
5407
5862
  "list-item",
5408
- "panel-header",
5409
5863
  "resize",
5410
5864
  "value-table",
5411
5865
  "layout"
@@ -5483,7 +5937,9 @@
5483
5937
  "source": "kerf",
5484
5938
  "purpose": "Page identity with primary, secondary, and overflow actions that relocate at narrow widths.",
5485
5939
  "uses": [
5486
- "panel-header",
5940
+ "toolbar",
5941
+ "toolbar-control-group",
5942
+ "toolbar-text",
5487
5943
  "state-banner",
5488
5944
  "layout"
5489
5945
  ],
@@ -5491,7 +5947,7 @@
5491
5947
  "A workspace page needs one primary heading and a small prioritized action set."
5492
5948
  ],
5493
5949
  "avoidWhen": [
5494
- "Use Toolbar for persistent application chrome or PanelHeader for a focused modal task."
5950
+ "Use a smaller local heading when the page does not need actions or persistent identity."
5495
5951
  ],
5496
5952
  "appOwns": [
5497
5953
  "authorization",
@@ -5519,9 +5975,11 @@
5519
5975
  "category": "Recipes",
5520
5976
  "kind": "recipe",
5521
5977
  "source": "kerf",
5522
- "purpose": "Production modal containing a PanelHeader, navigable record master list, and ValueTable detail.",
5978
+ "purpose": "Production modal containing a Toolbar heading, navigable record master list, and ValueTable detail.",
5523
5979
  "uses": [
5524
- "panel-header",
5980
+ "toolbar",
5981
+ "toolbar-control-group",
5982
+ "toolbar-text",
5525
5983
  "list-header",
5526
5984
  "list-item",
5527
5985
  "value-table",
@@ -5541,7 +5999,7 @@
5541
5999
  "record actions"
5542
6000
  ],
5543
6001
  "accessibility": [
5544
- "Web Awesome owns modal focus and Escape; the application adapter restores the invoking control after hide, and PanelHeader supplies the visible hierarchy."
6002
+ "Web Awesome owns modal focus and Escape; the application adapter restores the invoking control after hide, and Toolbar plus ToolbarText supply the visible hierarchy."
5545
6003
  ],
5546
6004
  "delivery": {
5547
6005
  "sideEffects": [
@@ -5561,9 +6019,11 @@
5561
6019
  "category": "Recipes",
5562
6020
  "kind": "recipe",
5563
6021
  "source": "kerf",
5564
- "purpose": "One visible publishing-form surface with PanelHeader hierarchy, fields and actions on the shared 8px control gutter, 24px major rhythm, and a conditional StateBanner as its only nested semantic surface.",
6022
+ "purpose": "One visible publishing-form surface with Toolbar heading hierarchy, fields and actions on the shared 8px control gutter, 24px major rhythm, and a conditional StateBanner as its only nested semantic surface.",
5565
6023
  "uses": [
5566
- "panel-header",
6024
+ "toolbar",
6025
+ "toolbar-control-group",
6026
+ "toolbar-text",
5567
6027
  "select",
5568
6028
  "state-banner",
5569
6029
  "wa-input",
@@ -5584,7 +6044,7 @@
5584
6044
  "transport"
5585
6045
  ],
5586
6046
  "accessibility": [
5587
- "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."
6047
+ "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."
5588
6048
  ],
5589
6049
  "delivery": {
5590
6050
  "sideEffects": [
@@ -5606,7 +6066,9 @@
5606
6066
  "source": "kerf",
5607
6067
  "purpose": "Deterministic loading, empty, populated, stale refresh, and error states around one stable list workspace.",
5608
6068
  "uses": [
5609
- "panel-header",
6069
+ "toolbar",
6070
+ "toolbar-control-group",
6071
+ "toolbar-text",
5610
6072
  "state-banner",
5611
6073
  "empty-state",
5612
6074
  "loading-spinner",
@@ -5727,7 +6189,9 @@
5727
6189
  "source": "kerf",
5728
6190
  "purpose": "A record inspector whose per-record values load asynchronously — every value-bearing component takes a shared placeholder flag, so the same chrome renders a faithful loading state and then the populated record.",
5729
6191
  "uses": [
5730
- "panel-header",
6192
+ "toolbar",
6193
+ "toolbar-control-group",
6194
+ "toolbar-text",
5731
6195
  "value-table",
5732
6196
  "select",
5733
6197
  "segmented-control",
@@ -5770,7 +6234,6 @@
5770
6234
  "source": "kerf",
5771
6235
  "purpose": "A mini app frame whose left navigation rail and bottom activity drawer are standalone CollapsiblePanels driven by wireSidebar: per-side collapse/expand toggles, focus move-in and restore, a dismissable compact overlay, and per-panel persistence.",
5772
6236
  "uses": [
5773
- "panel-header",
5774
6237
  "list-header",
5775
6238
  "list-item",
5776
6239
  "toolbar",