@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
package/README.md CHANGED
@@ -15,7 +15,7 @@ For connective application patterns, use the seven [production composition
15
15
  recipes](./docs/recipes.md). Each has a stable catalog route, runnable state,
16
16
  public-subpath source, semantic layout ownership, and explicit application
17
17
  customization boundaries. The composer recipe demonstrates one coherent form
18
- surface with `PanelHeader` hierarchy and field/action controls aligned to the
18
+ surface with a `Toolbar`/`ToolbarText` heading and field/action controls aligned to the
19
19
  shared 8px gutter; only persistent feedback adds a nested semantic
20
20
  `StateBanner` surface.
21
21
 
@@ -41,11 +41,7 @@ mount(root, () => (
41
41
  <>
42
42
  <Toolbar
43
43
  label="Document"
44
- leading={
45
- <ToolbarControlGroup appearance="borderless" single>
46
- <ToolbarText text="Notes" />
47
- </ToolbarControlGroup>
48
- }
44
+ leading={<ToolbarText text="Notes" />}
49
45
  />
50
46
  <section>
51
47
  <ListHeader
@@ -120,14 +116,24 @@ as a `New` marker.
120
116
  | `DisclosureArrow` | `@kerfjs/ui/disclosure-arrow` | `@kerfjs/ui/disclosure-arrow.css` |
121
117
  | `Toolbar` | `@kerfjs/ui/toolbar` | `@kerfjs/ui/toolbar.css` |
122
118
  | `ToolbarControlGroup` | `@kerfjs/ui/toolbar-control-group` | `@kerfjs/ui/toolbar-control-group.css` |
119
+ | `DialogSurface`, `PopupSurface` | `@kerfjs/ui/surface-scaffold` | `@kerfjs/ui/surface-scaffold.css` |
123
120
  | `FloatingToolbar` | `@kerfjs/ui/floating-toolbar` | `@kerfjs/ui/floating-toolbar.css` |
124
121
  | `ToolbarText` | `@kerfjs/ui/toolbar-text` | `@kerfjs/ui/toolbar-text.css` |
122
+ | `List` | `@kerfjs/ui/list` | `@kerfjs/ui/list.css` |
125
123
  | `ListActionRow` | `@kerfjs/ui/list-action-row` | `@kerfjs/ui/list-action-row.css` |
126
124
  | `ListItem` | `@kerfjs/ui/list-item` | `@kerfjs/ui/list-item.css` |
127
125
  | `ListHeader` | `@kerfjs/ui/list-header` | `@kerfjs/ui/list-header.css` |
128
126
  | `ListInsetControl` | `@kerfjs/ui/list-inset-control` | `@kerfjs/ui/list-inset-control.css` |
129
127
  | `ListInsetText` | `@kerfjs/ui/list-inset-text` | `@kerfjs/ui/list-inset-text.css` |
130
128
  | `Pane` | `@kerfjs/ui/pane` | `@kerfjs/ui/pane.css` |
129
+ | `NavStack` | `@kerfjs/ui/nav-stack` | `@kerfjs/ui/nav-stack.css` |
130
+ | `wireNavStack` | `@kerfjs/ui/wire-nav-stack` | — |
131
+ | `SplitView` | `@kerfjs/ui/split-view` | `@kerfjs/ui/split-view.css` |
132
+ | `TabScaffold` | `@kerfjs/ui/tab-scaffold` | `@kerfjs/ui/tab-scaffold.css` |
133
+ | `wireTabScaffold` | `@kerfjs/ui/wire-tab-scaffold` | — |
134
+ | `Workbench` | `@kerfjs/ui/workbench` | `@kerfjs/ui/workbench.css` |
135
+ | `CollapsiblePanel`, `CollapsiblePanelToggle` | `@kerfjs/ui/collapsible-panel` | `@kerfjs/ui/collapsible-panel.css` |
136
+ | `wireSidebar` | `@kerfjs/ui/wire-sidebar` | — |
131
137
  | Content and navigation composition | — | `@kerfjs/ui/layout.css` |
132
138
  | `ResizableRegion` | `@kerfjs/ui/resizable-region` | `@kerfjs/ui/resizable-region.css` |
133
139
  | `wireResizableRegions` | `@kerfjs/ui/wire-resizable-regions` | — |
@@ -143,22 +149,22 @@ as a `New` marker.
143
149
  | `wireTokenSearchFields` | `@kerfjs/ui/wire-token-search-fields` | — |
144
150
  | `StateBanner` | `@kerfjs/ui/state-banner` | `@kerfjs/ui/state-banner.css` |
145
151
  | `EmptyState` | `@kerfjs/ui/empty-state` | `@kerfjs/ui/empty-state.css` |
146
- | `PanelHeader` | `@kerfjs/ui/panel-header` | `@kerfjs/ui/panel-header.css` |
147
152
  | `ValueTable`, `ValueTableRow` | `@kerfjs/ui/value-table` | `@kerfjs/ui/value-table.css` |
148
153
 
149
- Opt-in application layouts keep JavaScript and CSS explicit. For the
150
- desktop-class multi-panel shell, import `Workbench` from
151
- `@kerfjs/ui/workbench` and load `@kerfjs/ui/workbench.css`; its supported
152
- classes and size tokens are cataloged under the `workbench` entry. See
153
- [`docs/workbench.md`](./docs/workbench.md) for panel ownership and responsive
154
- replacement guidance.
155
-
156
- `PanelHeader` is a plain `Toolbar` used as a panel, dialog, or page heading: an
157
- optional icon control group (given a brand fill with a matching border), the
158
- title as extra-large `ToolbarText`, the app's trailing action controls, and an
159
- optional subtitle on a separate row below the title. It overrides no toolbar
160
- styles the app passes its own trailing controls (typically a
161
- `ToolbarControlGroup`).
154
+ Opt-in application layouts keep JavaScript and CSS explicit. Import each
155
+ layout from its component subpath, load the matching manual CSS export, and
156
+ add its wire subpath when the layout has interactive behavior. The catalog
157
+ entries for `nav-stack`, `split-view`, `tab-scaffold`, `workbench`, and
158
+ `collapsible-panel` document their selection rules, ownership boundaries,
159
+ public classes, tokens, and focused demos. See
160
+ [`docs/app-layouts.md`](./docs/app-layouts.md) for the layout decision matrix.
161
+
162
+ Compose panel, dialog, and page headings directly with `Toolbar`: put an optional
163
+ icon in a `ToolbarControlGroup`, use a direct extra-large `ToolbarText` for the
164
+ title, and put actions in the trailing zone inside their own control group. Set
165
+ `headingLevel` for page or section headings. Supporting copy is app-owned content
166
+ below the toolbar and should be connected to its host with `aria-describedby`
167
+ when it adds useful context.
162
168
 
163
169
  `DisclosureArrow` defaults to an 18px root-scaled decorative visual. Override
164
170
  `--kui-disclosure-arrow-size` at the narrowest useful scope when a consumer
@@ -302,7 +308,7 @@ retention policy, and a separate unscored human-visual rubric. See the
302
308
 
303
309
  ### Unified repair-loop doctor
304
310
 
305
- Use `kerf-ui-doctor` for the supported application repair loop across profile/catalog validation, TypeScript, the Kerf UI ESLint preset, static layout analysis, and an optional explicitly authorized browser evaluation. It emits one portable versioned JSON report with deterministic exit codes, exact suppressions, monorepo package selection, changed/full modes, caching, and local-path redaction. See the [UI doctor guide](./docs/ui-doctor.md).
311
+ Use `kerf-ui-doctor` for the supported application repair loop across profile/catalog validation, TypeScript, the Kerf UI ESLint preset, static layout analysis, and an optional explicitly authorized browser evaluation. Its isolated Kerf lint pass preserves each file's applicable core-rule and suppression settings without executing consumer plugin rules. It emits one portable versioned JSON report with deterministic exit codes, exact suppressions, monorepo package selection, changed/full modes, caching, and local-path redaction. See the [UI doctor guide](./docs/ui-doctor.md).
306
312
 
307
313
  For code generation, pair catalog selection guidance with the checked-in
308
314
  [`public-api-signatures-v1.md`](./ai/public-api-signatures-v1.md) declaration
@@ -478,7 +484,12 @@ Call `wireTokenSearchFields()` once at a stable root to make Enter submit throug
478
484
  `onSubmit` without inserting a contenteditable line break and to preserve focus
479
485
  plus the text-relative caret when keyboard deletion of a chip causes controlled
480
486
  rendering to replace the editor. A select-all deletion is normalized to a truly
481
- empty editor even when the browser leaves an atomic chip or line break behind.
487
+ empty editor even when the browser leaves an atomic chip or line break behind;
488
+ replacement typing consumes that intent so a later Backspace/Delete remains an
489
+ ordinary character edit.
490
+ Managed deletion keeps a collapsible replacement editor open and focused before
491
+ the next keystroke; applications must persist both query and tokens from the DOM
492
+ read. Genuine outside focus and Escape still collapse an empty field.
482
493
  Text still wraps visually when it reaches the field edge.
483
494
  Clear actions should empty the editor's `textContent` before clearing app state.
484
495
  The leading icon, first text line, clear action, and trailing slot share one
@@ -516,6 +527,13 @@ import "@kerfjs/ui/select/register";
516
527
  ```
517
528
 
518
529
  That boundary keeps Web Awesome and its custom-element side effects out of bundles that use unrelated components. Automated consumer-bundle tests enforce it.
530
+ Use `label` for a visible label or `ariaLabel` for a visually hidden name. A
531
+ nonempty visible label takes precedence when both are supplied. Kerf names the
532
+ actual shadow combobox without adding visible label spacing; this also works
533
+ with `renderSelected`, and needs no application shadow-DOM patch. Use `hint`
534
+ for persistent supporting text below the control and `placeholderText` for the
535
+ empty value inside the closed control. Loading placeholders preserve the hint.
536
+
519
537
  `Select` also owns the Kerf/Web Awesome reconciliation boundary: option icons
520
538
  keep stable slotted elements across rerenders, and `renderSelected` content is
521
539
  replaced when the controlled value changes. Consumers do not need to add
@@ -528,7 +546,11 @@ Awesome Tabs, `LucideIcon` over Web Awesome Icon, and `ResizableRegion` over
528
546
  Split Panel. `ResizableRegion` includes Hot Sheet 2's 1px separator and
529
547
  hover/focus grip. Its optional `handleIcon` replaces only the decorative glyph;
530
548
  the component and `wireResizableRegions()` retain separator semantics and
531
- pointer/keyboard behavior. Consider Web Awesome Popup when its anchored-positioning
549
+ pointer/keyboard behavior. Typed policies cover separator visibility,
550
+ instant-track/composited-content collapse, popup-safe overflow,
551
+ inline/overlay/hidden responsive presentation, and safe-area restore controls;
552
+ the same policies are available on `Workbench` and `CollapsiblePanel`. Consider
553
+ Web Awesome Popup when its anchored-positioning
532
554
  engine removes custom placement code; treat Tree, Animated Image, Comparison,
533
555
  Zoomable Frame, and the displaced alternatives above as exceptional rather
534
556
  than default patterns. The detailed rationale lives in the theme contract.
@@ -38,6 +38,9 @@
38
38
  "KUI-L007",
39
39
  "KUI-L008",
40
40
  "KUI-L009",
41
+ "KUI-L010",
42
+ "KUI-L011",
43
+ "KUI-L012",
41
44
  "KUI-L090",
42
45
  "KUI-L101",
43
46
  "KUI-L102",
@@ -19,7 +19,7 @@
19
19
  "avoid": ["@kerfjs/ui:wa-button-group"]
20
20
  },
21
21
  "navigation-row": { "preferred": "@kerfjs/ui:list-item" },
22
- "panel-heading": { "preferred": "@kerfjs/ui:panel-header" },
22
+ "panel-heading": { "preferred": "@kerfjs/ui:toolbar" },
23
23
  "structured-search": { "preferred": "@kerfjs/ui:token-search-field" }
24
24
  },
25
25
  "theme": {
@@ -54,14 +54,6 @@
54
54
  },
55
55
  {
56
56
  "id": "KUI-T007",
57
- "catalogKey": "@kerfjs/ui:panel-header",
58
- "publicImport": "@kerfjs/ui/panel-header",
59
- "symbols": ["PanelHeaderProps"],
60
- "kind": "conditional-property",
61
- "summary": "PanelHeader summaryId cannot be supplied without rendered summary content."
62
- },
63
- {
64
- "id": "KUI-T008",
65
57
  "catalogKey": "@kerfjs/ui:toolbar-text",
66
58
  "publicImport": "@kerfjs/ui/toolbar-text",
67
59
  "symbols": ["ToolbarTextProps"],
@@ -69,14 +61,14 @@
69
61
  "summary": "ToolbarText maxLines is accepted only when wrapping is enabled."
70
62
  },
71
63
  {
72
- "id": "KUI-T009",
64
+ "id": "KUI-T008",
73
65
  "publicImport": "@kerfjs/ui/tab-scaffold",
74
66
  "symbols": ["TabScaffoldTab", "TabScaffoldProps"],
75
67
  "kind": "literal-identity",
76
68
  "summary": "Literal TabScaffold active ids are constrained to the declared tab ids; dynamic integrations may widen the generic to string."
77
69
  },
78
70
  {
79
- "id": "KUI-T010",
71
+ "id": "KUI-T009",
80
72
  "catalogKey": "@kerfjs/ui:token-search-field",
81
73
  "publicImport": "@kerfjs/ui/wire-token-search-fields",
82
74
  "symbols": ["TokenSearchKeyboardOptions", "WireTokenSearchFieldsOptions"],
@@ -84,9 +76,10 @@
84
76
  "summary": "Adjacent-token removal requires the callback that commits removal to application-owned state."
85
77
  },
86
78
  {
87
- "id": "KUI-T011",
79
+ "id": "KUI-T010",
88
80
  "publicImport": "@kerfjs/ui",
89
81
  "symbols": [
82
+ "DividerSides",
90
83
  "StateBannerUrgency",
91
84
  "TabActivation",
92
85
  "ToolbarControlGroupAppearance",
@@ -95,7 +88,7 @@
95
88
  "ToolbarControlGroupTone"
96
89
  ],
97
90
  "kind": "finite-vocabulary",
98
- "summary": "Finite public variant vocabularies are named exported unions rather than anonymous string sets."
91
+ "summary": "Finite public variant vocabularies, including canonical divider-edge combinations, are named exported unions rather than anonymous string sets."
99
92
  }
100
93
  ]
101
94
  }
@@ -1,7 +1,12 @@
1
1
  {
2
2
  "@kerfjs/ui:toolbar": {
3
3
  "_source": "docs/component-selection.md#toolbar-composition",
4
- "contexts": ["application-chrome", "panel-header"],
4
+ "contexts": [
5
+ "application-chrome",
6
+ "page-header",
7
+ "panel-header",
8
+ "dialog-header"
9
+ ],
5
10
  "zones": [
6
11
  {
7
12
  "id": "leading",
@@ -40,7 +45,7 @@
40
45
  "_source": "docs/component-selection.md#toolbar-composition",
41
46
  "parents": {
42
47
  "mode": "listed",
43
- "entries": ["@kerfjs/ui:toolbar", "@kerfjs/ui:panel-header"]
48
+ "entries": ["@kerfjs/ui:toolbar"]
44
49
  },
45
50
  "contexts": ["toolbar-zone"],
46
51
  "zones": [
@@ -57,57 +62,15 @@
57
62
  "requiredConcepts": ["control"]
58
63
  }
59
64
  },
60
- "@kerfjs/ui:panel-header": {
61
- "_source": "docs/component-selection.md#problem-to-component-matrix",
62
- "contexts": ["page-header", "panel-header", "dialog-header"],
63
- "zones": [
64
- {
65
- "id": "title",
66
- "accepts": ["text"],
67
- "cardinality": { "min": 1, "max": 1 },
68
- "exclusiveWith": []
69
- },
70
- {
71
- "id": "subtitle",
72
- "accepts": ["text"],
73
- "cardinality": { "min": 0, "max": 1 },
74
- "exclusiveWith": []
75
- },
76
- {
77
- "id": "controls",
78
- "accepts": ["control"],
79
- "cardinality": { "min": 0, "max": "unbounded" },
80
- "exclusiveWith": []
81
- }
82
- ],
83
- "state": [
84
- { "id": "placeholder", "owner": "controlled", "required": false }
85
- ],
86
- "diagnostics": [
87
- {
88
- "id": "KUI-C102",
89
- "severity": "error",
90
- "when": "the title is absent",
91
- "message": "PanelHeader requires a title that names its page, panel, or dialog."
92
- }
93
- ]
94
- },
95
65
  "@kerfjs/ui:list": {
96
- "_source": "docs/component-selection.md#correct-composition-and-duplicated-markup-trap",
97
- "contexts": ["navigation-list"],
66
+ "_source": "docs/component-selection.md#problem-to-component-matrix",
67
+ "contexts": ["application-ui", "navigation-list", "vertical-layout"],
98
68
  "children": {
99
- "mode": "listed",
100
- "concepts": ["list-header", "list-item", "list-action-row"],
69
+ "mode": "any",
70
+ "concepts": [],
101
71
  "requiredConcepts": []
102
72
  },
103
- "zones": [
104
- {
105
- "id": "rows",
106
- "accepts": ["list-header", "list-item", "list-action-row"],
107
- "cardinality": { "min": 1, "max": "unbounded" },
108
- "exclusiveWith": []
109
- }
110
- ]
73
+ "zones": []
111
74
  },
112
75
  "@kerfjs/ui:list-header": {
113
76
  "_source": "docs/accessibility.md#shared-rules",
@@ -54,6 +54,7 @@ export interface CatalogCompositionEntryV2 {
54
54
  rootClass: string | null;
55
55
  publicClasses: string[];
56
56
  publicTokens: string[];
57
+ publicParts?: string[];
57
58
  };
58
59
  diagnostics: CatalogDiagnostic[];
59
60
  provenance: { selection: string; composition: string };