@kerfjs/ui 4.4.1 → 5.0.0-beta.11

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 (386) hide show
  1. package/README.md +241 -10
  2. package/ai/component-catalog.json +4828 -0
  3. package/ai/component-catalog.schema.json +79 -0
  4. package/ai/public-api-signatures-v1.md +1371 -0
  5. package/ai/skill.md +73 -11
  6. package/ai/webawesome-jsx-signatures-v1.md +106 -0
  7. package/dist/app-tab.d.ts +14 -2
  8. package/dist/app-tab.js +3 -1
  9. package/dist/browser/app-tab.js +3 -2
  10. package/dist/browser/disclosure-arrow.js +4 -0
  11. package/dist/browser/empty-state.js +3 -3
  12. package/dist/browser/floating-toolbar.js +3 -0
  13. package/dist/browser/list-action-row.js +4 -0
  14. package/dist/browser/list-header.js +6 -0
  15. package/dist/browser/list-item.js +4 -0
  16. package/dist/browser/loading-spinner.js +2 -2
  17. package/dist/browser/lucide-icon.js +2 -2
  18. package/dist/browser/panel-header.js +7 -0
  19. package/dist/browser/resizable-region.js +2 -2
  20. package/dist/browser/segmented-control.js +3 -2
  21. package/dist/browser/select.js +4 -3
  22. package/dist/browser/skeleton.js +3 -0
  23. package/dist/browser/state-banner.js +3 -2
  24. package/dist/browser/tab-bar.js +2 -2
  25. package/dist/browser/token-search-field.js +4 -0
  26. package/dist/browser/toolbar-control-group.js +2 -2
  27. package/dist/browser/toolbar-text.js +3 -2
  28. package/dist/browser/toolbar.js +2 -2
  29. package/dist/browser/value-table.js +3 -2
  30. package/dist/catalog.d.ts +119 -0
  31. package/dist/catalog.js +146 -0
  32. package/dist/catalog.js.map +1 -0
  33. package/dist/chunk-2Z5TWHKQ.js +34 -0
  34. package/dist/chunk-2Z5TWHKQ.js.map +1 -0
  35. package/dist/chunk-37T3VNIZ.js +19 -0
  36. package/dist/chunk-37T3VNIZ.js.map +1 -0
  37. package/dist/chunk-56RJXPHG.js +43 -0
  38. package/dist/chunk-56RJXPHG.js.map +1 -0
  39. package/dist/chunk-5ATCDSQS.js +42 -0
  40. package/dist/chunk-5ATCDSQS.js.map +1 -0
  41. package/dist/chunk-5E2HVJ33.js +10 -0
  42. package/dist/chunk-5E2HVJ33.js.map +1 -0
  43. package/dist/chunk-7BR3DO2A.js +31 -0
  44. package/dist/chunk-7BR3DO2A.js.map +1 -0
  45. package/dist/chunk-7JB7VPRI.js +34 -0
  46. package/dist/chunk-7JB7VPRI.js.map +1 -0
  47. package/dist/chunk-7LDCTU7D.js +134 -0
  48. package/dist/chunk-7LDCTU7D.js.map +1 -0
  49. package/dist/{chunk-4HHCYSGT.js → chunk-AQNKJRFH.js} +2 -2
  50. package/dist/{chunk-4HHCYSGT.js.map → chunk-AQNKJRFH.js.map} +1 -1
  51. package/dist/{chunk-MBR3TYNL.js → chunk-AVZHJN6C.js} +3 -3
  52. package/dist/chunk-AVZHJN6C.js.map +1 -0
  53. package/dist/chunk-B24C4A6T.js +22 -0
  54. package/dist/chunk-B24C4A6T.js.map +1 -0
  55. package/dist/chunk-BLK3UEEI.js +23 -0
  56. package/dist/chunk-BLK3UEEI.js.map +1 -0
  57. package/dist/chunk-CH4SQ6H5.js +39 -0
  58. package/dist/chunk-CH4SQ6H5.js.map +1 -0
  59. package/dist/chunk-I7INRJO4.js +17 -0
  60. package/dist/chunk-I7INRJO4.js.map +1 -0
  61. package/dist/chunk-L4OKFDJY.js +24 -0
  62. package/dist/chunk-L4OKFDJY.js.map +1 -0
  63. package/dist/chunk-LCOBDOCC.js +265 -0
  64. package/dist/chunk-LCOBDOCC.js.map +1 -0
  65. package/dist/{chunk-3O7ZEUW2.js → chunk-M5JRI6MN.js} +3 -3
  66. package/dist/chunk-M5JRI6MN.js.map +1 -0
  67. package/dist/{chunk-MFKMHK5W.js → chunk-RNPGFQ33.js} +3 -3
  68. package/dist/chunk-RNPGFQ33.js.map +1 -0
  69. package/dist/chunk-RUNWEPR4.js +10 -0
  70. package/dist/chunk-RUNWEPR4.js.map +1 -0
  71. package/dist/chunk-XE5ZLPCC.js +20 -0
  72. package/dist/chunk-XE5ZLPCC.js.map +1 -0
  73. package/dist/{chunk-MQIZAD4A.js → chunk-XXMOARTH.js} +5 -3
  74. package/dist/chunk-XXMOARTH.js.map +1 -0
  75. package/dist/{chunk-TRNBHPNW.js → chunk-YGN7OMLT.js} +11 -8
  76. package/dist/chunk-YGN7OMLT.js.map +1 -0
  77. package/dist/collapsible-panel.d.ts +66 -0
  78. package/dist/collapsible-panel.js +22 -0
  79. package/dist/collapsible-panel.js.map +1 -0
  80. package/dist/device-class.d.ts +62 -0
  81. package/dist/device-class.js +75 -0
  82. package/dist/device-class.js.map +1 -0
  83. package/dist/disclosure-arrow.d.ts +14 -0
  84. package/dist/disclosure-arrow.js +4 -0
  85. package/dist/disclosure-arrow.js.map +1 -0
  86. package/dist/floating-toolbar.d.ts +28 -0
  87. package/dist/floating-toolbar.js +3 -0
  88. package/dist/floating-toolbar.js.map +1 -0
  89. package/dist/index.d.ts +11 -6
  90. package/dist/index.js +22 -16
  91. package/dist/list-action-row.d.ts +52 -0
  92. package/dist/list-action-row.js +5 -0
  93. package/dist/list-action-row.js.map +1 -0
  94. package/dist/list-header.d.ts +43 -0
  95. package/dist/list-header.js +7 -0
  96. package/dist/list-header.js.map +1 -0
  97. package/dist/list-item.d.ts +33 -0
  98. package/dist/list-item.js +5 -0
  99. package/dist/list-item.js.map +1 -0
  100. package/dist/nav-stack.d.ts +38 -0
  101. package/dist/nav-stack.js +5 -0
  102. package/dist/nav-stack.js.map +1 -0
  103. package/dist/panel-header.d.ts +36 -0
  104. package/dist/panel-header.js +7 -0
  105. package/dist/panel-header.js.map +1 -0
  106. package/dist/resizable-region.d.ts +3 -1
  107. package/dist/resizable-region.js +1 -1
  108. package/dist/segmented-control.d.ts +3 -1
  109. package/dist/segmented-control.js +2 -1
  110. package/dist/select-register.d.ts +5 -1
  111. package/dist/select-register.js +3 -0
  112. package/dist/select-register.js.map +1 -1
  113. package/dist/select.d.ts +5 -2
  114. package/dist/select.js +2 -1
  115. package/dist/skeleton.d.ts +24 -0
  116. package/dist/skeleton.js +3 -0
  117. package/dist/skeleton.js.map +1 -0
  118. package/dist/split-view.d.ts +42 -0
  119. package/dist/split-view.js +21 -0
  120. package/dist/split-view.js.map +1 -0
  121. package/dist/state-banner.d.ts +3 -1
  122. package/dist/state-banner.js +2 -1
  123. package/dist/styles/app-tab.css +152 -0
  124. package/dist/styles/catalog.css +522 -0
  125. package/dist/styles/collapsible-panel.css +146 -0
  126. package/dist/styles/disclosure-arrow.css +23 -0
  127. package/dist/styles/empty-state.css +47 -0
  128. package/dist/styles/floating-toolbar.css +38 -0
  129. package/dist/styles/foundation.css +347 -0
  130. package/dist/styles/layout.css +73 -0
  131. package/dist/styles/list-action-row.css +160 -0
  132. package/dist/styles/list-header.css +160 -0
  133. package/dist/styles/list-item.css +123 -0
  134. package/dist/styles/loading-spinner.css +21 -0
  135. package/dist/styles/lucide-icon.css +6 -0
  136. package/dist/styles/nav-stack.css +111 -0
  137. package/dist/styles/panel-header.css +64 -0
  138. package/dist/styles/resizable-region.css +111 -0
  139. package/{src → dist/styles}/segmented-control.css +62 -31
  140. package/dist/styles/select.css +138 -0
  141. package/dist/styles/skeleton.css +31 -0
  142. package/dist/styles/split-view.css +35 -0
  143. package/dist/styles/state-banner.css +173 -0
  144. package/dist/styles/styles.css +23 -0
  145. package/dist/styles/tab-bar.css +45 -0
  146. package/dist/styles/tab-scaffold.css +84 -0
  147. package/dist/styles/token-search-field.css +289 -0
  148. package/dist/styles/toolbar-control-group.css +225 -0
  149. package/dist/styles/toolbar-text.css +40 -0
  150. package/dist/styles/toolbar.css +61 -0
  151. package/dist/styles/value-table.css +75 -0
  152. package/{src → dist/styles}/webawesome.css +119 -29
  153. package/dist/styles/workbench.css +94 -0
  154. package/dist/tab-bar.d.ts +8 -1
  155. package/dist/tab-bar.js +1 -1
  156. package/dist/tab-scaffold.d.ts +30 -0
  157. package/dist/tab-scaffold.js +16 -0
  158. package/dist/tab-scaffold.js.map +1 -0
  159. package/dist/token-search-field.d.ts +43 -0
  160. package/dist/token-search-field.js +4 -0
  161. package/dist/token-search-field.js.map +1 -0
  162. package/dist/toolbar-control-group.d.ts +3 -1
  163. package/dist/toolbar-control-group.js +1 -1
  164. package/dist/toolbar-text.d.ts +15 -3
  165. package/dist/toolbar-text.js +2 -1
  166. package/dist/value-table.d.ts +12 -2
  167. package/dist/value-table.js +2 -1
  168. package/dist/webawesome.d.ts +100 -0
  169. package/dist/webawesome.js +3 -0
  170. package/dist/webawesome.js.map +1 -0
  171. package/dist/wire-catalog.d.ts +26 -0
  172. package/dist/wire-catalog.js +48 -0
  173. package/dist/wire-catalog.js.map +1 -0
  174. package/dist/wire-nav-stack.d.ts +15 -0
  175. package/dist/wire-nav-stack.js +88 -0
  176. package/dist/wire-nav-stack.js.map +1 -0
  177. package/dist/wire-resizable-regions.js +1 -1
  178. package/dist/wire-sidebar.d.ts +43 -0
  179. package/dist/wire-sidebar.js +117 -0
  180. package/dist/wire-sidebar.js.map +1 -0
  181. package/dist/wire-tab-bars.d.ts +15 -2
  182. package/dist/wire-tab-bars.js +1 -1
  183. package/dist/wire-tab-scaffold.d.ts +11 -0
  184. package/dist/wire-tab-scaffold.js +16 -0
  185. package/dist/wire-tab-scaffold.js.map +1 -0
  186. package/dist/wire-token-search-fields.d.ts +106 -0
  187. package/dist/wire-token-search-fields.js +5 -0
  188. package/dist/wire-token-search-fields.js.map +1 -0
  189. package/dist/workbench.d.ts +33 -0
  190. package/dist/workbench.js +17 -0
  191. package/dist/workbench.js.map +1 -0
  192. package/docs/accessibility.md +112 -3
  193. package/docs/app-layouts.md +61 -0
  194. package/docs/catalog.md +155 -0
  195. package/docs/collapsible-panel.md +102 -0
  196. package/docs/component-contract.md +169 -4
  197. package/docs/component-selection.md +186 -0
  198. package/docs/design/templates/empty-state/filtered-dark.svg +1 -0
  199. package/docs/design/templates/empty-state/filtered.svg +1 -0
  200. package/docs/design/templates/empty-state/with-action-dark.svg +1 -0
  201. package/docs/design/templates/empty-state/with-action.svg +1 -0
  202. package/docs/design/templates/empty-state-dark.svg +7 -0
  203. package/docs/design/templates/empty-state.svg +7 -0
  204. package/docs/design/templates/list-action-row/default-dark.svg +1 -0
  205. package/docs/design/templates/list-action-row/default.svg +1 -0
  206. package/docs/design/templates/list-action-row/selected-dark.svg +1 -0
  207. package/docs/design/templates/list-action-row/selected.svg +1 -0
  208. package/docs/design/templates/list-action-row-dark.svg +7 -0
  209. package/docs/design/templates/list-action-row.svg +7 -0
  210. package/docs/design/templates/list-header/action-dark.svg +1 -0
  211. package/docs/design/templates/list-header/action.svg +1 -0
  212. package/docs/design/templates/list-header/count-dark.svg +1 -0
  213. package/docs/design/templates/list-header/count.svg +1 -0
  214. package/docs/design/templates/list-header/toggle-collapsed-dark.svg +1 -0
  215. package/docs/design/templates/list-header/toggle-collapsed.svg +1 -0
  216. package/docs/design/templates/list-header/toggle-expanded-dark.svg +1 -0
  217. package/docs/design/templates/list-header/toggle-expanded.svg +1 -0
  218. package/docs/design/templates/list-header-dark.svg +11 -0
  219. package/docs/design/templates/list-header.svg +11 -0
  220. package/docs/design/templates/list-item/default-dark.svg +1 -0
  221. package/docs/design/templates/list-item/default.svg +1 -0
  222. package/docs/design/templates/list-item/multiline-dark.svg +1 -0
  223. package/docs/design/templates/list-item/multiline.svg +1 -0
  224. package/docs/design/templates/list-item/selected-dark.svg +1 -0
  225. package/docs/design/templates/list-item/selected.svg +1 -0
  226. package/docs/design/templates/list-item/trailing-dark.svg +1 -0
  227. package/docs/design/templates/list-item/trailing.svg +1 -0
  228. package/docs/design/templates/list-item-dark.svg +11 -0
  229. package/docs/design/templates/list-item.svg +11 -0
  230. package/docs/design/templates/panel-header/icon-actions-dark.svg +1 -0
  231. package/docs/design/templates/panel-header/icon-actions.svg +1 -0
  232. package/docs/design/templates/panel-header/icon-summary-actions-dark.svg +1 -0
  233. package/docs/design/templates/panel-header/icon-summary-actions.svg +1 -0
  234. package/docs/design/templates/panel-header/no-icon-dark.svg +1 -0
  235. package/docs/design/templates/panel-header/no-icon.svg +1 -0
  236. package/docs/design/templates/panel-header/page-heading-dark.svg +1 -0
  237. package/docs/design/templates/panel-header/page-heading.svg +1 -0
  238. package/docs/design/templates/panel-header/title-only-dark.svg +1 -0
  239. package/docs/design/templates/panel-header/title-only.svg +1 -0
  240. package/docs/design/templates/panel-header-dark.svg +13 -0
  241. package/docs/design/templates/panel-header.svg +13 -0
  242. package/docs/design/templates/segmented-control/equal-dark.svg +1 -0
  243. package/docs/design/templates/segmented-control/equal.svg +1 -0
  244. package/docs/design/templates/segmented-control/pill-small-dark.svg +1 -0
  245. package/docs/design/templates/segmented-control/pill-small.svg +1 -0
  246. package/docs/design/templates/segmented-control-dark.svg +7 -0
  247. package/docs/design/templates/segmented-control.svg +7 -0
  248. package/docs/design/templates/skeleton/avatar-dark.svg +1 -0
  249. package/docs/design/templates/skeleton/avatar.svg +1 -0
  250. package/docs/design/templates/skeleton/block-dark.svg +1 -0
  251. package/docs/design/templates/skeleton/block.svg +1 -0
  252. package/docs/design/templates/skeleton/lines-dark.svg +1 -0
  253. package/docs/design/templates/skeleton/lines.svg +1 -0
  254. package/docs/design/templates/skeleton-dark.svg +9 -0
  255. package/docs/design/templates/skeleton.svg +9 -0
  256. package/docs/design/templates/state-banner/danger-dark.svg +1 -0
  257. package/docs/design/templates/state-banner/danger.svg +1 -0
  258. package/docs/design/templates/state-banner/info-dark.svg +1 -0
  259. package/docs/design/templates/state-banner/info.svg +1 -0
  260. package/docs/design/templates/state-banner/success-dark.svg +1 -0
  261. package/docs/design/templates/state-banner/success.svg +1 -0
  262. package/docs/design/templates/state-banner/warning-dark.svg +1 -0
  263. package/docs/design/templates/state-banner/warning.svg +1 -0
  264. package/docs/design/templates/state-banner-dark.svg +11 -0
  265. package/docs/design/templates/state-banner.svg +11 -0
  266. package/docs/design/templates/tab-bar/workspace-tabs-dark.svg +1 -0
  267. package/docs/design/templates/tab-bar/workspace-tabs.svg +1 -0
  268. package/docs/design/templates/tab-bar-dark.svg +5 -0
  269. package/docs/design/templates/tab-bar.svg +5 -0
  270. package/docs/design/templates/token-search-field/empty-dark.svg +1 -0
  271. package/docs/design/templates/token-search-field/empty.svg +1 -0
  272. package/docs/design/templates/token-search-field/tokens-dark.svg +1 -0
  273. package/docs/design/templates/token-search-field/tokens.svg +1 -0
  274. package/docs/design/templates/token-search-field-dark.svg +7 -0
  275. package/docs/design/templates/token-search-field.svg +7 -0
  276. package/docs/design/templates/toolbar/title-and-actions-dark.svg +1 -0
  277. package/docs/design/templates/toolbar/title-and-actions.svg +1 -0
  278. package/docs/design/templates/toolbar-control-group/borderless-single-dark.svg +1 -0
  279. package/docs/design/templates/toolbar-control-group/borderless-single.svg +1 -0
  280. package/docs/design/templates/toolbar-control-group/icon-buttons-dark.svg +1 -0
  281. package/docs/design/templates/toolbar-control-group/icon-buttons.svg +1 -0
  282. package/docs/design/templates/toolbar-control-group/push-buttons-dark.svg +1 -0
  283. package/docs/design/templates/toolbar-control-group/push-buttons.svg +1 -0
  284. package/docs/design/templates/toolbar-control-group/with-text-dark.svg +1 -0
  285. package/docs/design/templates/toolbar-control-group/with-text.svg +1 -0
  286. package/docs/design/templates/toolbar-control-group-dark.svg +11 -0
  287. package/docs/design/templates/toolbar-control-group.svg +11 -0
  288. package/docs/design/templates/toolbar-dark.svg +5 -0
  289. package/docs/design/templates/toolbar-text/default-dark.svg +1 -0
  290. package/docs/design/templates/toolbar-text/default.svg +1 -0
  291. package/docs/design/templates/toolbar-text/large-dark.svg +1 -0
  292. package/docs/design/templates/toolbar-text/large.svg +1 -0
  293. package/docs/design/templates/toolbar-text/small-dark.svg +1 -0
  294. package/docs/design/templates/toolbar-text/small.svg +1 -0
  295. package/docs/design/templates/toolbar-text-dark.svg +9 -0
  296. package/docs/design/templates/toolbar-text.svg +9 -0
  297. package/docs/design/templates/toolbar.svg +5 -0
  298. package/docs/design/templates/value-table/details-dark.svg +1 -0
  299. package/docs/design/templates/value-table/details.svg +1 -0
  300. package/docs/design/templates/value-table-dark.svg +5 -0
  301. package/docs/design/templates/value-table.svg +5 -0
  302. package/docs/design/templates.md +114 -0
  303. package/docs/design-philosophy.md +61 -1
  304. package/docs/device-class.md +54 -0
  305. package/docs/examples/command-palette-adapter.tsx +70 -0
  306. package/docs/layout.md +131 -0
  307. package/docs/nav-stack.md +47 -0
  308. package/docs/recipes.md +167 -0
  309. package/docs/split-view.md +49 -0
  310. package/docs/tab-scaffold.md +41 -0
  311. package/docs/ux-demo.md +23 -9
  312. package/docs/webawesome-theme.md +15 -0
  313. package/docs/workbench.md +47 -0
  314. package/llms.txt +123 -14
  315. package/package.json +147 -44
  316. package/ux-demo/recipes/app-shell.tsx +32 -0
  317. package/ux-demo/recipes/collapsible-sidebar.tsx +100 -0
  318. package/ux-demo/recipes/compact-toolbar.tsx +43 -0
  319. package/ux-demo/recipes/composer-form.tsx +63 -0
  320. package/ux-demo/recipes/list-detail-dialog.tsx +45 -0
  321. package/ux-demo/recipes/list-workspace-states.tsx +26 -0
  322. package/ux-demo/recipes/loaders.ts +33 -0
  323. package/ux-demo/recipes/loading-inspector.tsx +81 -0
  324. package/ux-demo/recipes/mount-recipe.ts +43 -0
  325. package/ux-demo/recipes/navigation-sidebar.tsx +26 -0
  326. package/ux-demo/recipes/navigation-stack.tsx +76 -0
  327. package/ux-demo/recipes/recipes.css +448 -0
  328. package/ux-demo/recipes/types.ts +17 -0
  329. package/ux-demo/recipes/workspace-header.tsx +12 -0
  330. package/dist/browser/dialog-header.js +0 -3
  331. package/dist/browser/menu-header.js +0 -3
  332. package/dist/browser/menu-item.js +0 -3
  333. package/dist/browser/page-header.js +0 -3
  334. package/dist/chunk-2PES33HS.js +0 -13
  335. package/dist/chunk-2PES33HS.js.map +0 -1
  336. package/dist/chunk-3O7ZEUW2.js.map +0 -1
  337. package/dist/chunk-723YNJBH.js +0 -17
  338. package/dist/chunk-723YNJBH.js.map +0 -1
  339. package/dist/chunk-GY5WH7TO.js +0 -10
  340. package/dist/chunk-GY5WH7TO.js.map +0 -1
  341. package/dist/chunk-MBR3TYNL.js.map +0 -1
  342. package/dist/chunk-MFKMHK5W.js.map +0 -1
  343. package/dist/chunk-MQIZAD4A.js.map +0 -1
  344. package/dist/chunk-NHXX4JI5.js +0 -28
  345. package/dist/chunk-NHXX4JI5.js.map +0 -1
  346. package/dist/chunk-OPCJRCYO.js +0 -19
  347. package/dist/chunk-OPCJRCYO.js.map +0 -1
  348. package/dist/chunk-T5XNMVOI.js +0 -24
  349. package/dist/chunk-T5XNMVOI.js.map +0 -1
  350. package/dist/chunk-TRNBHPNW.js.map +0 -1
  351. package/dist/chunk-VHW5YNIB.js +0 -17
  352. package/dist/chunk-VHW5YNIB.js.map +0 -1
  353. package/dist/chunk-VKH2JLDZ.js +0 -10
  354. package/dist/chunk-VKH2JLDZ.js.map +0 -1
  355. package/dist/chunk-WY4CAEPG.js +0 -14
  356. package/dist/chunk-WY4CAEPG.js.map +0 -1
  357. package/dist/dialog-header.d.ts +0 -14
  358. package/dist/dialog-header.js +0 -3
  359. package/dist/dialog-header.js.map +0 -1
  360. package/dist/menu-header.d.ts +0 -15
  361. package/dist/menu-header.js +0 -3
  362. package/dist/menu-header.js.map +0 -1
  363. package/dist/menu-item.d.ts +0 -22
  364. package/dist/menu-item.js +0 -3
  365. package/dist/menu-item.js.map +0 -1
  366. package/dist/page-header.d.ts +0 -9
  367. package/dist/page-header.js +0 -3
  368. package/dist/page-header.js.map +0 -1
  369. package/src/app-tab.css +0 -20
  370. package/src/dialog-header.css +0 -9
  371. package/src/empty-state.css +0 -6
  372. package/src/foundation.css +0 -106
  373. package/src/loading-spinner.css +0 -4
  374. package/src/lucide-icon.css +0 -1
  375. package/src/menu-header.css +0 -13
  376. package/src/menu-item.css +0 -12
  377. package/src/page-header.css +0 -3
  378. package/src/resizable-region.css +0 -19
  379. package/src/select.css +0 -18
  380. package/src/state-banner.css +0 -31
  381. package/src/styles.css +0 -18
  382. package/src/tab-bar.css +0 -4
  383. package/src/toolbar-control-group.css +0 -25
  384. package/src/toolbar-text.css +0 -4
  385. package/src/toolbar.css +0 -9
  386. package/src/value-table.css +0 -5
package/README.md CHANGED
@@ -2,46 +2,179 @@
2
2
 
3
3
  Accessible, composable UI primitives for [kerf](https://github.com/brianwestphal/kerf). The package ships production components, component-reachable CSS, accessibility and keyboard contracts, an AI-readable guide, and a production-backed UX catalog.
4
4
 
5
+ Start interface work with the [need-first component selection matrix](./docs/component-selection.md). It distinguishes direct reuse, composition, thin application adapters, and genuinely custom semantics, with imports, required wiring, application ownership, alternatives, and recipes for every public primitive.
6
+
7
+ For connective application patterns, use the seven [production composition
8
+ recipes](./docs/recipes.md). Each has a stable catalog route, runnable state,
9
+ public-subpath source, semantic layout ownership, and explicit application
10
+ customization boundaries. The composer recipe demonstrates one coherent form
11
+ surface with `PanelHeader` hierarchy and field/action controls aligned to the
12
+ shared 8px gutter; only persistent feedback adds a nested semantic
13
+ `StateBanner` surface.
14
+
15
+ When no primitive matches, keep policy application-owned while reusing the
16
+ layout vocabulary. The typed
17
+ [`command-palette-adapter.tsx`](./docs/examples/command-palette-adapter.tsx)
18
+ shows that application boundary explicitly; it is reference source, not a package
19
+ runtime export.
20
+
5
21
  ```bash
6
22
  npm install kerfjs @kerfjs/ui
7
23
  ```
8
24
 
9
25
  ```tsx
10
- import { MenuItem } from '@kerfjs/ui/menu-item';
26
+ import { ListItem } from '@kerfjs/ui/list-item';
27
+ import { ListHeader } from '@kerfjs/ui/list-header';
28
+ import { ListActionRow } from '@kerfjs/ui/list-action-row';
11
29
  import { Toolbar } from '@kerfjs/ui/toolbar';
30
+ import { ToolbarControlGroup } from '@kerfjs/ui/toolbar-control-group';
12
31
  import { ToolbarText } from '@kerfjs/ui/toolbar-text';
13
32
 
14
33
  mount(root, () => <>
15
- <Toolbar label="Document" leading={<ToolbarText text="Notes" />} />
16
- <MenuItem action="open-notes" label="Notes" selected />
34
+ <Toolbar label="Document" leading={<ToolbarControlGroup appearance="borderless" single><ToolbarText text="Notes" /></ToolbarControlGroup>} />
35
+ <section>
36
+ <ListHeader
37
+ label="Workspace"
38
+ action="show-workspace-actions"
39
+ actionLabel="Workspace actions"
40
+ rootAttributes={{ 'data-section-id': 'workspace' }}
41
+ triggerAttributes={{
42
+ popoverTarget: 'workspace-actions',
43
+ popoverTargetAction: 'toggle',
44
+ 'aria-controls': 'workspace-actions',
45
+ 'aria-haspopup': 'dialog',
46
+ }}
47
+ />
48
+ <ListItem
49
+ action="open-notes"
50
+ label="Notes"
51
+ selected
52
+ rootAttributes={{ 'data-command-color': 'blue', 'data-drop-status': 'ready' }}
53
+ />
54
+ <ListActionRow
55
+ action="open-file"
56
+ itemId="src/main.ts"
57
+ label="src/main.ts"
58
+ trailingAction="open-file-actions"
59
+ trailingActionLabel="Actions for src/main.ts"
60
+ trailingActionIcon={moreIcon}
61
+ />
62
+ <div id="workspace-actions" popover="auto">Application-owned actions</div>
63
+ </section>
17
64
  </>);
18
65
  ```
19
66
 
20
67
  Components return Kerf `SafeHtml`. They do not own application state or attach transient listeners. Actions are stable `data-action` hooks; the application wires them once with `delegate()` or `delegateActions()` and retains the disposer.
21
68
 
69
+ `ListItem.rootAttributes`, `ListHeader.rootAttributes`,
70
+ `ListActionRow.rootAttributes`, and `AppTab.rootAttributes` carry typed
71
+ application `data-*` metadata without
72
+ teaching the package domain fields. `ListHeader.triggerAttributes` and
73
+ `ListActionRow.trailingActionAttributes` additionally support native popover
74
+ target and relationship attributes. Roles and component-owned action, selection,
75
+ disclosure, naming, disabled, and icon semantics remain protected props; an
76
+ isolated `role="menuitem"` is not an extension shortcut.
77
+ The slots are also filtered at runtime, so structurally widened objects and
78
+ JavaScript callers cannot bypass those protections with case-variant names.
79
+ `ListItem.trailing` is dormant metadata. Use `ListActionRow` when a row needs
80
+ sibling primary and trailing native-button actions with independent names,
81
+ disabled states, focus, and click ownership. Its `label`, `icon`, and
82
+ `trailingActionIcon` slots are dormant content and must not contain controls.
83
+ In either component's multiline mode, the leading icon remains aligned with
84
+ the first text line as the label wraps below it.
85
+ For section quantities, pass a non-negative safe-integer `count` together with
86
+ the localized full spoken phrase in `countLabel`, for example
87
+ `count={3} countLabel="3 notes"`. This renders the standard neutral count pill
88
+ and includes the count in the heading or disclosure button's accessible name.
89
+ Do not concatenate a count into `label` or pass a numeric `badge`; the mutually
90
+ exclusive legacy `badge` slot remains available for non-count `SafeHtml` such
91
+ as a `New` marker.
92
+
22
93
  ## Component subpaths
23
94
 
24
95
  | Component | Browser import (includes reachable CSS) | Manual CSS export |
25
96
  | --- | --- | --- |
26
97
  | `LucideIcon` | `@kerfjs/ui/lucide-icon` | `@kerfjs/ui/lucide-icon.css` |
98
+ | `DisclosureArrow` | `@kerfjs/ui/disclosure-arrow` | `@kerfjs/ui/disclosure-arrow.css` |
27
99
  | `Toolbar` | `@kerfjs/ui/toolbar` | `@kerfjs/ui/toolbar.css` |
28
100
  | `ToolbarControlGroup` | `@kerfjs/ui/toolbar-control-group` | `@kerfjs/ui/toolbar-control-group.css` |
101
+ | `FloatingToolbar` | `@kerfjs/ui/floating-toolbar` | `@kerfjs/ui/floating-toolbar.css` |
29
102
  | `ToolbarText` | `@kerfjs/ui/toolbar-text` | `@kerfjs/ui/toolbar-text.css` |
30
- | `MenuItem` | `@kerfjs/ui/menu-item` | `@kerfjs/ui/menu-item.css` |
31
- | `MenuHeader` | `@kerfjs/ui/menu-header` | `@kerfjs/ui/menu-header.css` |
103
+ | `ListActionRow` | `@kerfjs/ui/list-action-row` | `@kerfjs/ui/list-action-row.css` |
104
+ | `ListItem` | `@kerfjs/ui/list-item` | `@kerfjs/ui/list-item.css` |
105
+ | `ListHeader` | `@kerfjs/ui/list-header` | `@kerfjs/ui/list-header.css` |
106
+ | Pane, content, and navigation composition | — | `@kerfjs/ui/layout.css` |
32
107
  | `ResizableRegion` | `@kerfjs/ui/resizable-region` | `@kerfjs/ui/resizable-region.css` |
33
108
  | `wireResizableRegions` | `@kerfjs/ui/wire-resizable-regions` | — |
34
109
  | `AppTab` | `@kerfjs/ui/app-tab` | `@kerfjs/ui/app-tab.css` |
35
110
  | `TabBar` | `@kerfjs/ui/tab-bar` | `@kerfjs/ui/tab-bar.css` |
36
111
  | `wireTabBars`, `reorderTabs` | `@kerfjs/ui/wire-tab-bars` | — |
37
- | `PageHeader` | `@kerfjs/ui/page-header` | `@kerfjs/ui/page-header.css` |
38
112
  | `LoadingSpinner` | `@kerfjs/ui/loading-spinner` | `@kerfjs/ui/loading-spinner.css` |
113
+ | `Skeleton` | `@kerfjs/ui/skeleton` | `@kerfjs/ui/skeleton.css` |
39
114
  | `Select` | `@kerfjs/ui/select` | `@kerfjs/ui/select.css` |
40
115
  | `SegmentedControl` | `@kerfjs/ui/segmented-control` | `@kerfjs/ui/segmented-control.css` |
116
+ | `TokenSearchField`, `readTokenSearchField`, `placeTokenSearchCaret` | `@kerfjs/ui/token-search-field` | `@kerfjs/ui/token-search-field.css` |
117
+ | `wireTokenSearchFields` | `@kerfjs/ui/wire-token-search-fields` | — |
41
118
  | `StateBanner` | `@kerfjs/ui/state-banner` | `@kerfjs/ui/state-banner.css` |
42
119
  | `EmptyState` | `@kerfjs/ui/empty-state` | `@kerfjs/ui/empty-state.css` |
43
- | `DialogHeader` | `@kerfjs/ui/dialog-header` | `@kerfjs/ui/dialog-header.css` |
44
- | `ValueTable` | `@kerfjs/ui/value-table` | `@kerfjs/ui/value-table.css` |
120
+ | `PanelHeader` | `@kerfjs/ui/panel-header` | `@kerfjs/ui/panel-header.css` |
121
+ | `ValueTable`, `ValueTableRow` | `@kerfjs/ui/value-table` | `@kerfjs/ui/value-table.css` |
122
+
123
+ `PanelHeader` is a plain `Toolbar` used as a panel, dialog, or page heading: an
124
+ optional icon control group (given a brand fill with a matching border), the
125
+ title as extra-large `ToolbarText`, the app's trailing action controls, and an
126
+ optional subtitle on a separate row below the title. It overrides no toolbar
127
+ styles — the app passes its own trailing controls (typically a
128
+ `ToolbarControlGroup`).
129
+
130
+ `DisclosureArrow` defaults to an 18px root-scaled decorative visual. Override
131
+ `--kui-disclosure-arrow-size` at the narrowest useful scope when a consumer
132
+ needs another size; the owning control still supplies interaction, naming, and
133
+ expanded state. Kerf `Select` retains its independent Web Awesome expand-glyph
134
+ scale of `.5` through `--kui-disclosure-icon-scale`. Author replacement
135
+ `DisclosureArrow` icon content facing right before its configured direction
136
+ transform is applied. Direction changes take the shortest rotation path; a
137
+ 180-degree closed-to-open tie uses counterclockwise rotation.
138
+
139
+ `ListHeader` supplies that production `DisclosureArrow` automatically when
140
+ `toggle` is true and `actionIcon` is omitted. Keep `expanded` synchronized with
141
+ real controlled content and preserve the button's stable label; ordinary
142
+ navigation must not display a disclosure arrow. A custom `actionIcon` remains
143
+ an escape hatch and replaces the default arrow entirely. The header fills its
144
+ available inline width, keeping a separate action at the logical end in a 44px
145
+ target. Its visible action glyph defaults to 18px through
146
+ `--kui-list-header-action-icon-size`.
147
+
148
+ ## Machine-readable catalog
149
+
150
+ AI tools can retrieve the shipped [`ai/component-catalog.json`](./ai/component-catalog.json)
151
+ for the exhaustive component and composition inventory. It is the canonical
152
+ source for ids, public exports, purpose and selection guidance, relationships,
153
+ delivery and side effects, companion wiring, application-owned policy,
154
+ variants, accessibility obligations, public CSS hooks, routes, and current
155
+ documentation/recipe links. The adjacent
156
+ [`component-catalog.schema.json`](./ai/component-catalog.schema.json) describes
157
+ the versioned format.
158
+
159
+ For code generation, pair catalog selection guidance with the checked-in
160
+ [`public-api-signatures-v1.md`](./ai/public-api-signatures-v1.md) declaration
161
+ snapshot. It is generated from the emitted `@kerfjs/ui` declarations and the
162
+ installed `kerfjs/actions` declaration, so callback names, props, return values,
163
+ and accepted import paths do not have to be inferred from examples. Direct
164
+ Web Awesome JSX has its own generated
165
+ [`webawesome-jsx-signatures-v1.md`](./ai/webawesome-jsx-signatures-v1.md)
166
+ context so adding the declaration boundary does not mutate a frozen measured
167
+ regression suite.
168
+
169
+ `npm run catalog:sync` deterministically projects the fields used by the UX
170
+ catalog into `ux-demo/catalog.generated.ts`, including the existing guidance
171
+ path and the first-party source path for each main, recipe, or Web Awesome
172
+ specimen. First-party component entries also derive their implementation path
173
+ from the canonical browser import. Do not edit that generated file.
174
+ `npm run check:catalog` rejects stale generated output, exports and package
175
+ paths, Web Awesome manifest/declaration drift, invalid relationships, broken
176
+ links, or a missing AI-guidance entry. Prose remains authored where design
177
+ nuance matters.
45
178
 
46
179
  Import components from their explicit JavaScript subpaths. CSS-aware browser
47
180
  bundlers such as Vite, webpack, and esbuild follow each subpath's `browser`
@@ -61,17 +194,61 @@ entry for a browser build with a custom styling pipeline. The exported
61
194
  delivery. Load application overrides after package styles, or scope `--kui-*`
62
195
  variables directly on a component instance.
63
196
 
197
+ ## Pane and content geometry
198
+
199
+ Import `@kerfjs/ui/layout.css` and use the same structural vocabulary for a
200
+ sidebar, main area, inspector, or dialog. `.kui-pane` is unpadded and contains
201
+ an optional toolbar, one scrolling `.kui-pane__content`, and an optional footer.
202
+ Add `.kui-content` to make its major children a vertical stack with 24px gaps.
203
+
204
+ ```tsx
205
+ <aside class="kui-pane">
206
+ <div class="kui-pane__toolbar"><Toolbar label="Workspace" ... /></div>
207
+ <nav class="kui-pane__content kui-content">
208
+ <section>
209
+ <ListHeader label="Workspace" count={3} countLabel="3 workspaces" />
210
+ <ListItem action="open" label="Inbox" icon={inboxIcon} />
211
+ <ListItem action="open" label="Drafts" />
212
+ </section>
213
+ <div class="kui-content-item">Workspace details</div>
214
+ </nav>
215
+ </aside>
216
+ ```
217
+
218
+ Ordinary children use `.kui-content-item`: 8px inline margin, a real 1px border
219
+ (transparent by default), 8px padding, and 12px rounded corners. The pill
220
+ modifier uses a 22px radius. A component can expose a transparent border or
221
+ background without changing layout. `ListHeader` follows the same rule while
222
+ keeping its dormant title and count-or-badge cluster separate from its optional
223
+ 44px action.
224
+
225
+ ## Spacing and application layout
226
+
227
+ Use 24px only for major vertical separation; use 8px inside content items and
228
+ between toolbar groups. Toolbar groups are 44px outside (`2px + 42px`) and keep
229
+ that geometry when their border/background are transparent. Wrap text and other
230
+ dormant toolbar content in a `ToolbarControlGroup` too. Do not pad the pane
231
+ itself, add competing wrapper insets, or give it more than one scroll owner.
232
+ Reading width and responsive pane placement remain application decisions. See
233
+ the complete [layout contract](./docs/layout.md).
234
+
64
235
  ## Web Awesome theme
65
236
 
66
237
  Apps using Web Awesome's free components can opt into the same visual universe
67
238
  with one CSS import:
68
239
 
69
240
  ```ts
241
+ import type {} from '@kerfjs/ui/webawesome';
70
242
  import '@kerfjs/ui/webawesome.css';
71
243
  import '@awesome.me/webawesome/dist/components/button/button.js';
72
244
  import '@awesome.me/webawesome/dist/components/input/input.js';
73
245
  ```
74
246
 
247
+ The type-only `@kerfjs/ui/webawesome` import adds Kerf JSX intrinsic-element
248
+ declarations for the same 70 elements tracked by the catalog. It emits no
249
+ runtime code and registers nothing; keep importing only the individual Web
250
+ Awesome modules the application renders.
251
+
75
252
  `webawesome.css` includes Web Awesome's native/base theme and then applies the
76
253
  Hot Sheet 2 palette, surfaces, status colors, focus treatment, form geometry,
77
254
  radii, tooltips, and shadows through Web Awesome's public `--wa-*` contract.
@@ -100,6 +277,10 @@ foreground roles through `--kui-color-*`; stateful components also expose
100
277
  component variables such as `--kui-state-banner-background`. Override the
101
278
  foundation for an application theme, a tone variable for one semantic state, or
102
279
  a component variable on one instance without replacing component selectors.
280
+ Prefer an equivalent prop or token. When composition-specific layout still
281
+ needs a selector, the component catalog's `publicClasses` arrays define the
282
+ exact stable anatomy: public-class-to-public-class selectors are supported;
283
+ descendant tag, id, attribute-only, and unlisted-class selectors are not.
103
284
 
104
285
  `StateBanner` has opinionated `neutral`, `info`, `success`, `warning`, and
105
286
  `danger` palettes. Override an individual banner with
@@ -137,12 +318,45 @@ value through `data-segment-value`. Override an instance through
137
318
  `--kui-segmented-{background|border|foreground|hover-background}` and
138
319
  `--kui-segmented-selected-{background|foreground|border|shadow}`.
139
320
 
321
+ `TokenSearchField` is a token-controlled contenteditable searchbox that keeps
322
+ free text and ordered filter chips in one field. Its editable text stays
323
+ DOM-owned between token changes so typing does not replace the caret. Tokens
324
+ expose stable edit/remove actions and remain atomic during editing; the app owns
325
+ parsing, suggestions, query execution, and state. Use `readTokenSearchField()`
326
+ after browser input to recover text plus token offsets, and
327
+ `placeTokenSearchCaret()` when restoring focus after a controlled update.
328
+ Call `wireTokenSearchFields()` once at a stable root to make Enter submit through
329
+ `onSubmit` without inserting a contenteditable line break and to preserve focus
330
+ plus the text-relative caret when keyboard deletion of a chip causes controlled
331
+ rendering to replace the editor. Text still wraps visually when it reaches the
332
+ field edge.
333
+ Clear actions should empty the editor's `textContent` before clearing app state.
334
+ The leading icon, first text line, clear action, and trailing slot share one
335
+ fixed alignment row; when text wraps, those controls stay pinned to that first
336
+ row instead of recentering against the taller editor.
337
+ Set `collapsible` for the first-class compact presentation: an empty closed
338
+ field renders as one iconic search action, `expanded` reveals the complete
339
+ field, and text or tokens keep it expanded. Width changes animate by default
340
+ and respect reduced-motion preferences. The field works standalone or inside a
341
+ `ToolbarControlGroup`; the application owns the transient focused/open signal,
342
+ focus transfer, and focusout policy. The catalog's Toolbar route demonstrates
343
+ that composition at wide and narrow sizes.
344
+ Override its surface through `--kui-token-search-{background|border}` and its
345
+ chips through `--kui-token-search-token-{background|foreground}`. Override
346
+ `--kui-token-search-line-size` only when the complete first-line geometry must
347
+ change together.
348
+
140
349
  `TabBar` is controlled: pass ordered `AppTab` children, then wire its keyboard
141
350
  and same-bar drag behavior with `wireTabBars(root, { onReorder })`. During a
142
351
  drag, the scroll strip automatically moves toward either edge with speed based
143
352
  on pointer proximity, exposing earlier or later drop targets. Apply the reported
144
353
  change with `reorderTabs()` or application-specific state logic. The application
145
354
  still owns selection, closing, routing, and persistence.
355
+ Use `AppTab.rootAttributes` for domain `data-*` metadata and `closeIcon` for a
356
+ decorative replacement glyph. The runtime rejects roles and case variants of
357
+ the component- or wiring-owned action, tab identity, selection, drag, drop, and
358
+ component markers. Keep the icon free of interactive descendants; the named
359
+ close button retains all close interaction.
146
360
 
147
361
  `Select` uses Web Awesome but does not register anything by itself. Install the optional peer, import the shared theme if desired, and explicitly import the registration entry in the application:
148
362
 
@@ -152,25 +366,42 @@ import '@kerfjs/ui/select/register';
152
366
  ```
153
367
 
154
368
  That boundary keeps Web Awesome and its custom-element side effects out of bundles that use unrelated components. Automated consumer-bundle tests enforce it.
369
+ `Select` also owns the Kerf/Web Awesome reconciliation boundary: option icons
370
+ keep stable slotted elements across rerenders, and `renderSelected` content is
371
+ replaced when the controlled value changes. Consumers do not need to add
372
+ `data-key` or `data-morph-skip` workarounds around choice icons.
155
373
 
156
374
  For application choices and panes, prefer Kerf's purpose-built primitives:
157
375
  `Select` over direct Web Awesome selection/dropdown composition,
158
376
  `SegmentedControl` over Button Group, `TabBar` or `SegmentedControl` over Web
159
377
  Awesome Tabs, `LucideIcon` over Web Awesome Icon, and `ResizableRegion` over
160
378
  Split Panel. `ResizableRegion` includes Hot Sheet 2's 1px separator and
161
- hover/focus grip. Consider Web Awesome Popup when its anchored-positioning
379
+ hover/focus grip. Its optional `handleIcon` replaces only the decorative glyph;
380
+ the component and `wireResizableRegions()` retain separator semantics and
381
+ pointer/keyboard behavior. Consider Web Awesome Popup when its anchored-positioning
162
382
  engine removes custom placement code; treat Tree, Animated Image, Comparison,
163
383
  Zoomable Frame, and the displaced alternatives above as exceptional rather
164
384
  than default patterns. The detailed rationale lives in the theme contract.
165
385
 
166
386
  ## Design and tool guidance
167
387
 
388
+ - [Component selection and composition](./docs/component-selection.md)
168
389
  - [Design philosophy](./docs/design-philosophy.md)
169
390
  - [Apple HIG translation](./docs/apple-hig.md)
170
391
  - [Accessibility and keyboard contracts](./docs/accessibility.md)
171
392
  - [Component and integration contract](./docs/component-contract.md)
393
+ - [Spacing and application layout](./docs/layout.md)
172
394
  - [Web Awesome theme contract](./docs/webawesome-theme.md)
173
395
  - [UX catalog contract](./docs/ux-demo.md)
174
396
  - [AI guide](./ai/skill.md)
175
397
 
176
- Run `npm run dev` from this directory for the category-grouped master/detail catalog. Every public visual component has a focused route; all 70 free Web Awesome 3.12 components have focused routes under the collapsible ecosystem section. One grouped `Related components` selector contains derived `Uses` / `Used by` navigation across both sets. Run `npm run check` for static/unit/bundle gates and `npm run test:e2e` for the real-browser suite.
398
+ Run `npm run dev` from this directory for the category-grouped master/detail catalog. Every public visual component has a focused route; all 70 free Web Awesome 3.12 components have focused routes under the collapsible ecosystem section. Every detail visibly links its first-party demo source and existing guidance while showing the repository-relative paths; first-party components also link their implementation source, and Web Awesome entries label local guidance as Kerf integration guidance. One grouped `Related components` selector contains derived `Uses` / `Used by` navigation across both sets. Run `npm run check` for static/unit/bundle gates and `npm run test:e2e` for the real-browser suite.
399
+
400
+ Run `npm run format:css` after editing styles. The normal `npm run check` gate
401
+ uses Prettier to reject unformatted CSS in `src/` and `ux-demo/`.
402
+
403
+ For dimensions that should scale with the root font size, author pixels with
404
+ `remify()`: `gap: remify(17px)` builds to `gap: 1.0625rem` using a fixed 16px
405
+ baseline. Keep intentional 1px borders in pixels and contextual `em` values
406
+ explicit. `npm run build` emits standard CSS to `dist/styles`; `npm run dev`
407
+ applies the same transform directly to source styles and hot-reloads edits.