@kerfjs/ui 5.0.0-beta.4 → 5.0.0-beta.41

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 (498) hide show
  1. package/README.md +342 -108
  2. package/ai/application-ui-diagnostic-ids-v1.json +100 -0
  3. package/ai/application-ui-profile-sync.cjs +529 -0
  4. package/ai/application-ui-profile.d.mts +1 -0
  5. package/ai/application-ui-profile.d.ts +102 -0
  6. package/ai/application-ui-profile.defaults.json +41 -0
  7. package/ai/application-ui-profile.mjs +626 -0
  8. package/ai/application-ui-profile.schema.json +130 -0
  9. package/ai/catalog-authoring.json +25 -0
  10. package/ai/catalog-authoring.schema.json +61 -0
  11. package/ai/compile-time-contracts-v1.json +132 -0
  12. package/ai/compile-time-contracts-v1.schema.json +51 -0
  13. package/ai/component-catalog-extension-v2.d.ts +7 -0
  14. package/ai/component-catalog-extension-v2.schema.json +7 -0
  15. package/ai/component-catalog-extension.schema.json +79 -0
  16. package/ai/component-catalog-v2-overrides.json +496 -0
  17. package/ai/component-catalog-v2.d.ts +90 -0
  18. package/ai/component-catalog-v2.json +5678 -0
  19. package/ai/component-catalog-v2.schema.json +298 -0
  20. package/ai/component-catalog.json +2694 -417
  21. package/ai/component-catalog.schema.json +39 -0
  22. package/ai/public-api-signatures-v1.md +1591 -126
  23. package/ai/skill.md +140 -54
  24. package/ai/webawesome-jsx-signatures-v1.md +2 -1
  25. package/analyzer/cli.mjs +49 -0
  26. package/analyzer/index.d.mts +46 -0
  27. package/analyzer/index.mjs +1086 -0
  28. package/analyzer/report.schema.json +66 -0
  29. package/dist/app-tab.d.ts +15 -4
  30. package/dist/app-tab.js +3 -1
  31. package/dist/browser/app-tab.js +1 -0
  32. package/dist/browser/floating-toolbar.js +3 -0
  33. package/dist/browser/list-action-row.js +5 -0
  34. package/dist/browser/list-header.js +7 -0
  35. package/dist/browser/list-inset-control.js +3 -0
  36. package/dist/browser/list-inset-text.js +3 -0
  37. package/dist/browser/list-item.js +5 -0
  38. package/dist/browser/list.js +3 -0
  39. package/dist/browser/pane.js +3 -0
  40. package/dist/browser/row.js +3 -0
  41. package/dist/browser/segmented-control.js +1 -0
  42. package/dist/browser/select.js +1 -0
  43. package/dist/browser/skeleton.js +3 -0
  44. package/dist/browser/spacer.js +3 -0
  45. package/dist/browser/state-banner.js +1 -0
  46. package/dist/browser/sunken-panel.js +3 -0
  47. package/dist/browser/surface-scaffold.js +3 -0
  48. package/dist/browser/text.js +3 -0
  49. package/dist/browser/toolbar-text.js +1 -0
  50. package/dist/browser/value-table.js +1 -0
  51. package/dist/catalog-resources.d.ts +35 -0
  52. package/dist/catalog-resources.js +22 -0
  53. package/dist/catalog-resources.js.map +1 -0
  54. package/dist/catalog.d.ts +151 -0
  55. package/dist/catalog.js +396 -0
  56. package/dist/catalog.js.map +1 -0
  57. package/dist/chunk-2TYUFZUC.js +22 -0
  58. package/dist/chunk-2TYUFZUC.js.map +1 -0
  59. package/dist/chunk-6NDBE2OK.js +32 -0
  60. package/dist/chunk-6NDBE2OK.js.map +1 -0
  61. package/dist/chunk-6WTETUZ6.js +21 -0
  62. package/dist/chunk-6WTETUZ6.js.map +1 -0
  63. package/dist/chunk-AQFWBG23.js +83 -0
  64. package/dist/chunk-AQFWBG23.js.map +1 -0
  65. package/dist/chunk-B6JYRX3P.js +51 -0
  66. package/dist/chunk-B6JYRX3P.js.map +1 -0
  67. package/dist/chunk-C34NZOLJ.js +53 -0
  68. package/dist/chunk-C34NZOLJ.js.map +1 -0
  69. package/dist/chunk-CAB6NQ2T.js +102 -0
  70. package/dist/chunk-CAB6NQ2T.js.map +1 -0
  71. package/dist/chunk-CK6P5AUK.js +136 -0
  72. package/dist/chunk-CK6P5AUK.js.map +1 -0
  73. package/dist/chunk-DAO2VFTT.js +129 -0
  74. package/dist/chunk-DAO2VFTT.js.map +1 -0
  75. package/dist/chunk-DEYOGDE7.js +141 -0
  76. package/dist/chunk-DEYOGDE7.js.map +1 -0
  77. package/dist/chunk-DYBPI5O2.js +25 -0
  78. package/dist/chunk-DYBPI5O2.js.map +1 -0
  79. package/dist/{chunk-TRNBHPNW.js → chunk-E34TE2ZI.js} +12 -8
  80. package/dist/chunk-E34TE2ZI.js.map +1 -0
  81. package/dist/chunk-EYALJQQD.js +25 -0
  82. package/dist/chunk-EYALJQQD.js.map +1 -0
  83. package/dist/chunk-I45QO2IZ.js +88 -0
  84. package/dist/chunk-I45QO2IZ.js.map +1 -0
  85. package/dist/chunk-I4V3UDSA.js +79 -0
  86. package/dist/chunk-I4V3UDSA.js.map +1 -0
  87. package/dist/chunk-OGTJNHRG.js +42 -0
  88. package/dist/chunk-OGTJNHRG.js.map +1 -0
  89. package/dist/chunk-OL4TC3U2.js +156 -0
  90. package/dist/chunk-OL4TC3U2.js.map +1 -0
  91. package/dist/chunk-OMSRSL3B.js +120 -0
  92. package/dist/chunk-OMSRSL3B.js.map +1 -0
  93. package/dist/chunk-R3EBGEAW.js +46 -0
  94. package/dist/chunk-R3EBGEAW.js.map +1 -0
  95. package/dist/chunk-SOK5EUF7.js +25 -0
  96. package/dist/chunk-SOK5EUF7.js.map +1 -0
  97. package/dist/{chunk-7BR3DO2A.js → chunk-SRSJO5QE.js} +13 -4
  98. package/dist/chunk-SRSJO5QE.js.map +1 -0
  99. package/dist/chunk-T7DOWS6T.js +61 -0
  100. package/dist/chunk-T7DOWS6T.js.map +1 -0
  101. package/dist/chunk-TIGSG6BX.js +218 -0
  102. package/dist/chunk-TIGSG6BX.js.map +1 -0
  103. package/dist/chunk-UDHHKZWO.js +41 -0
  104. package/dist/chunk-UDHHKZWO.js.map +1 -0
  105. package/dist/{chunk-MQIZAD4A.js → chunk-UKKSMZYT.js} +76 -22
  106. package/dist/chunk-UKKSMZYT.js.map +1 -0
  107. package/dist/chunk-V6GQKOX2.js +39 -0
  108. package/dist/chunk-V6GQKOX2.js.map +1 -0
  109. package/dist/chunk-V6HCTCVD.js +46 -0
  110. package/dist/chunk-V6HCTCVD.js.map +1 -0
  111. package/dist/chunk-VDUJZF5G.js +515 -0
  112. package/dist/chunk-VDUJZF5G.js.map +1 -0
  113. package/dist/chunk-VXFGMDA7.js +31 -0
  114. package/dist/chunk-VXFGMDA7.js.map +1 -0
  115. package/dist/chunk-WN52USHV.js +115 -0
  116. package/dist/chunk-WN52USHV.js.map +1 -0
  117. package/dist/chunk-WSXUPSID.js +43 -0
  118. package/dist/chunk-WSXUPSID.js.map +1 -0
  119. package/dist/chunk-X5GRDQ7V.js +50 -0
  120. package/dist/chunk-X5GRDQ7V.js.map +1 -0
  121. package/dist/{chunk-56RJXPHG.js → chunk-Y6LYKFXY.js} +1 -1
  122. package/dist/{chunk-56RJXPHG.js.map → chunk-Y6LYKFXY.js.map} +1 -1
  123. package/dist/chunk-ZASJJMGV.js +17 -0
  124. package/dist/chunk-ZASJJMGV.js.map +1 -0
  125. package/dist/chunk-ZPWZIVI6.js +47 -0
  126. package/dist/chunk-ZPWZIVI6.js.map +1 -0
  127. package/dist/collapsible-panel.d.ts +77 -0
  128. package/dist/collapsible-panel.js +84 -0
  129. package/dist/collapsible-panel.js.map +1 -0
  130. package/dist/css-values.d.ts +75 -0
  131. package/dist/css-values.js +3 -0
  132. package/dist/css-values.js.map +1 -0
  133. package/dist/device-class.d.ts +62 -0
  134. package/dist/device-class.js +103 -0
  135. package/dist/device-class.js.map +1 -0
  136. package/dist/disclosure-arrow.js +1 -1
  137. package/dist/divider-sides-BzB6rphT.d.ts +6 -0
  138. package/dist/empty-state.d.ts +3 -2
  139. package/dist/empty-state.js +1 -1
  140. package/dist/flex-alignment-CF8NLj7i.d.ts +4 -0
  141. package/dist/floating-toolbar.d.ts +29 -0
  142. package/dist/floating-toolbar.js +3 -0
  143. package/dist/floating-toolbar.js.map +1 -0
  144. package/dist/index.d.ts +28 -14
  145. package/dist/index.js +34 -23
  146. package/dist/{menu-action-row.d.ts → list-action-row.d.ts} +19 -8
  147. package/dist/list-action-row.js +7 -0
  148. package/dist/list-action-row.js.map +1 -0
  149. package/dist/list-header.d.ts +80 -0
  150. package/dist/list-header.js +9 -0
  151. package/dist/list-header.js.map +1 -0
  152. package/dist/list-inset-control.d.ts +20 -0
  153. package/dist/list-inset-control.js +3 -0
  154. package/dist/list-inset-control.js.map +1 -0
  155. package/dist/list-inset-text.d.ts +29 -0
  156. package/dist/list-inset-text.js +3 -0
  157. package/dist/list-inset-text.js.map +1 -0
  158. package/dist/list-item.d.ts +45 -0
  159. package/dist/list-item.js +7 -0
  160. package/dist/list-item.js.map +1 -0
  161. package/dist/list.d.ts +30 -0
  162. package/dist/list.js +5 -0
  163. package/dist/list.js.map +1 -0
  164. package/dist/loading-spinner.js +1 -1
  165. package/dist/nav-stack.d.ts +41 -0
  166. package/dist/nav-stack.js +6 -0
  167. package/dist/nav-stack.js.map +1 -0
  168. package/dist/pane.d.ts +50 -0
  169. package/dist/pane.js +4 -0
  170. package/dist/pane.js.map +1 -0
  171. package/dist/resizable-region.d.ts +21 -3
  172. package/dist/resizable-region.js +1 -1
  173. package/dist/row.d.ts +28 -0
  174. package/dist/row.js +5 -0
  175. package/dist/row.js.map +1 -0
  176. package/dist/segmented-control.d.ts +11 -8
  177. package/dist/segmented-control.js +3 -1
  178. package/dist/select-register.d.ts +5 -1
  179. package/dist/select-register.js +129 -1
  180. package/dist/select-register.js.map +1 -1
  181. package/dist/select.d.ts +34 -8
  182. package/dist/select.js +3 -1
  183. package/dist/semantic-content-BbzjvSu9.d.ts +14 -0
  184. package/dist/skeleton.d.ts +25 -0
  185. package/dist/skeleton.js +4 -0
  186. package/dist/skeleton.js.map +1 -0
  187. package/dist/spacer.d.ts +16 -0
  188. package/dist/spacer.js +4 -0
  189. package/dist/spacer.js.map +1 -0
  190. package/dist/split-view.d.ts +43 -0
  191. package/dist/split-view.js +82 -0
  192. package/dist/split-view.js.map +1 -0
  193. package/dist/state-banner.d.ts +11 -5
  194. package/dist/state-banner.js +3 -1
  195. package/dist/styles/app-tab.css +26 -0
  196. package/dist/styles/catalog.css +582 -0
  197. package/dist/styles/collapsible-panel.css +212 -0
  198. package/dist/styles/floating-toolbar.css +38 -0
  199. package/dist/styles/foundation.css +80 -0
  200. package/dist/styles/layout.css +2 -20
  201. package/dist/styles/list-action-row.css +224 -0
  202. package/dist/styles/list-header.css +224 -0
  203. package/dist/styles/list-inset-control.css +23 -0
  204. package/dist/styles/list-inset-text.css +30 -0
  205. package/dist/styles/list-item.css +171 -0
  206. package/dist/styles/list.css +118 -0
  207. package/dist/styles/nav-stack.css +141 -0
  208. package/dist/styles/pane.css +62 -0
  209. package/dist/styles/resizable-region.css +158 -0
  210. package/dist/styles/row.css +92 -0
  211. package/dist/styles/segmented-control.css +10 -7
  212. package/dist/styles/select.css +115 -2
  213. package/dist/styles/skeleton.css +31 -0
  214. package/dist/styles/spacer.css +11 -0
  215. package/dist/styles/split-view.css +35 -0
  216. package/dist/styles/state-banner.css +49 -10
  217. package/dist/styles/styles.css +10 -5
  218. package/dist/styles/sunken-panel.css +22 -0
  219. package/dist/styles/surface-scaffold.css +51 -0
  220. package/dist/styles/tab-bar.css +24 -0
  221. package/dist/styles/tab-scaffold.css +85 -0
  222. package/dist/styles/text.css +6 -0
  223. package/dist/styles/token-search-field.css +14 -2
  224. package/dist/styles/toolbar-control-group.css +235 -8
  225. package/dist/styles/toolbar-text.css +65 -2
  226. package/dist/styles/toolbar.css +47 -2
  227. package/dist/styles/webawesome.css +171 -0
  228. package/dist/styles/workbench.css +187 -0
  229. package/dist/sunken-panel.d.ts +20 -0
  230. package/dist/sunken-panel.js +3 -0
  231. package/dist/sunken-panel.js.map +1 -0
  232. package/dist/surface-scaffold.d.ts +26 -0
  233. package/dist/surface-scaffold.js +3 -0
  234. package/dist/surface-scaffold.js.map +1 -0
  235. package/dist/tab-bar.d.ts +24 -6
  236. package/dist/tab-bar.js +1 -1
  237. package/dist/tab-scaffold.d.ts +31 -0
  238. package/dist/tab-scaffold.js +51 -0
  239. package/dist/tab-scaffold.js.map +1 -0
  240. package/dist/text.d.ts +20 -0
  241. package/dist/text.js +3 -0
  242. package/dist/text.js.map +1 -0
  243. package/dist/token-search-field.d.ts +30 -13
  244. package/dist/token-search-field.js +1 -1
  245. package/dist/toolbar-control-group.d.ts +33 -7
  246. package/dist/toolbar-control-group.js +1 -1
  247. package/dist/toolbar-text.d.ts +31 -4
  248. package/dist/toolbar-text.js +3 -1
  249. package/dist/toolbar.d.ts +10 -7
  250. package/dist/toolbar.js +1 -1
  251. package/dist/value-table.d.ts +7 -3
  252. package/dist/value-table.js +3 -1
  253. package/dist/webawesome.d.ts +1 -0
  254. package/dist/wire-catalog.d.ts +57 -0
  255. package/dist/wire-catalog.js +302 -0
  256. package/dist/wire-catalog.js.map +1 -0
  257. package/dist/wire-nav-stack.d.ts +18 -0
  258. package/dist/wire-nav-stack.js +228 -0
  259. package/dist/wire-nav-stack.js.map +1 -0
  260. package/dist/wire-resizable-regions.d.ts +1 -1
  261. package/dist/wire-resizable-regions.js +1 -1
  262. package/dist/wire-sidebar.d.ts +48 -0
  263. package/dist/wire-sidebar.js +147 -0
  264. package/dist/wire-sidebar.js.map +1 -0
  265. package/dist/wire-tab-bars.d.ts +19 -2
  266. package/dist/wire-tab-bars.js +1 -1
  267. package/dist/wire-tab-scaffold.d.ts +11 -0
  268. package/dist/wire-tab-scaffold.js +21 -0
  269. package/dist/wire-tab-scaffold.js.map +1 -0
  270. package/dist/wire-token-search-fields.d.ts +104 -4
  271. package/dist/wire-token-search-fields.js +1 -1
  272. package/dist/workbench.d.ts +44 -0
  273. package/dist/workbench.js +106 -0
  274. package/dist/workbench.js.map +1 -0
  275. package/docs/accessibility.md +155 -20
  276. package/docs/app-layouts.md +61 -0
  277. package/docs/catalog.md +364 -0
  278. package/docs/collapsible-panel.md +142 -0
  279. package/docs/component-contract.md +258 -28
  280. package/docs/component-integration.md +63 -0
  281. package/docs/component-selection.md +219 -57
  282. package/docs/design/templates/empty-state/filtered-dark.svg +1 -0
  283. package/docs/design/templates/empty-state/filtered.svg +1 -0
  284. package/docs/design/templates/empty-state/with-action-dark.svg +1 -0
  285. package/docs/design/templates/empty-state/with-action.svg +1 -0
  286. package/docs/design/templates/empty-state-dark.svg +1 -0
  287. package/docs/design/templates/empty-state.svg +1 -0
  288. package/docs/design/templates/list/compact-dark.svg +1 -0
  289. package/docs/design/templates/list/compact.svg +1 -0
  290. package/docs/design/templates/list/stack-dark.svg +1 -0
  291. package/docs/design/templates/list/stack.svg +1 -0
  292. package/docs/design/templates/list-action-row/default-dark.svg +1 -0
  293. package/docs/design/templates/list-action-row/default.svg +1 -0
  294. package/docs/design/templates/list-action-row/selected-dark.svg +1 -0
  295. package/docs/design/templates/list-action-row/selected.svg +1 -0
  296. package/docs/design/templates/list-action-row-dark.svg +1 -0
  297. package/docs/design/templates/list-action-row.svg +1 -0
  298. package/docs/design/templates/list-dark.svg +1 -0
  299. package/docs/design/templates/list-header/action-dark.svg +1 -0
  300. package/docs/design/templates/list-header/action.svg +1 -0
  301. package/docs/design/templates/list-header/count-dark.svg +1 -0
  302. package/docs/design/templates/list-header/count.svg +1 -0
  303. package/docs/design/templates/list-header/inline-action-dark.svg +1 -0
  304. package/docs/design/templates/list-header/inline-action.svg +1 -0
  305. package/docs/design/templates/list-header/toggle-collapsed-dark.svg +1 -0
  306. package/docs/design/templates/list-header/toggle-collapsed.svg +1 -0
  307. package/docs/design/templates/list-header/toggle-expanded-dark.svg +1 -0
  308. package/docs/design/templates/list-header/toggle-expanded.svg +1 -0
  309. package/docs/design/templates/list-header-dark.svg +1 -0
  310. package/docs/design/templates/list-header.svg +1 -0
  311. package/docs/design/templates/list-item/default-dark.svg +1 -0
  312. package/docs/design/templates/list-item/default.svg +1 -0
  313. package/docs/design/templates/list-item/multiline-dark.svg +1 -0
  314. package/docs/design/templates/list-item/multiline.svg +1 -0
  315. package/docs/design/templates/list-item/selected-dark.svg +1 -0
  316. package/docs/design/templates/list-item/selected.svg +1 -0
  317. package/docs/design/templates/list-item/trailing-dark.svg +1 -0
  318. package/docs/design/templates/list-item/trailing.svg +1 -0
  319. package/docs/design/templates/list-item-dark.svg +1 -0
  320. package/docs/design/templates/list-item.svg +1 -0
  321. package/docs/design/templates/list.svg +1 -0
  322. package/docs/design/templates/segmented-control/equal-dark.svg +1 -0
  323. package/docs/design/templates/segmented-control/equal.svg +1 -0
  324. package/docs/design/templates/segmented-control/pill-small-dark.svg +1 -0
  325. package/docs/design/templates/segmented-control/pill-small.svg +1 -0
  326. package/docs/design/templates/segmented-control-dark.svg +1 -0
  327. package/docs/design/templates/segmented-control.svg +1 -0
  328. package/docs/design/templates/skeleton/avatar-dark.svg +1 -0
  329. package/docs/design/templates/skeleton/avatar.svg +1 -0
  330. package/docs/design/templates/skeleton/block-dark.svg +1 -0
  331. package/docs/design/templates/skeleton/block.svg +1 -0
  332. package/docs/design/templates/skeleton/lines-dark.svg +1 -0
  333. package/docs/design/templates/skeleton/lines.svg +1 -0
  334. package/docs/design/templates/skeleton-dark.svg +1 -0
  335. package/docs/design/templates/skeleton.svg +1 -0
  336. package/docs/design/templates/state-banner/danger-dark.svg +1 -0
  337. package/docs/design/templates/state-banner/danger.svg +1 -0
  338. package/docs/design/templates/state-banner/info-badge-dark.svg +1 -0
  339. package/docs/design/templates/state-banner/info-badge.svg +1 -0
  340. package/docs/design/templates/state-banner/info-dark.svg +1 -0
  341. package/docs/design/templates/state-banner/info.svg +1 -0
  342. package/docs/design/templates/state-banner/success-dark.svg +1 -0
  343. package/docs/design/templates/state-banner/success.svg +1 -0
  344. package/docs/design/templates/state-banner/warning-dark.svg +1 -0
  345. package/docs/design/templates/state-banner/warning.svg +1 -0
  346. package/docs/design/templates/state-banner-dark.svg +1 -0
  347. package/docs/design/templates/state-banner.svg +1 -0
  348. package/docs/design/templates/tab-bar/workspace-tabs-dark.svg +1 -0
  349. package/docs/design/templates/tab-bar/workspace-tabs.svg +1 -0
  350. package/docs/design/templates/tab-bar-dark.svg +1 -0
  351. package/docs/design/templates/tab-bar.svg +1 -0
  352. package/docs/design/templates/token-search-field/empty-dark.svg +1 -0
  353. package/docs/design/templates/token-search-field/empty.svg +1 -0
  354. package/docs/design/templates/token-search-field/tokens-dark.svg +1 -0
  355. package/docs/design/templates/token-search-field/tokens.svg +1 -0
  356. package/docs/design/templates/token-search-field-dark.svg +1 -0
  357. package/docs/design/templates/token-search-field.svg +1 -0
  358. package/docs/design/templates/toolbar/title-and-actions-dark.svg +1 -0
  359. package/docs/design/templates/toolbar/title-and-actions.svg +1 -0
  360. package/docs/design/templates/toolbar-control-group/borderless-single-dark.svg +1 -0
  361. package/docs/design/templates/toolbar-control-group/borderless-single.svg +1 -0
  362. package/docs/design/templates/toolbar-control-group/icon-buttons-dark.svg +1 -0
  363. package/docs/design/templates/toolbar-control-group/icon-buttons.svg +1 -0
  364. package/docs/design/templates/toolbar-control-group/push-buttons-dark.svg +1 -0
  365. package/docs/design/templates/toolbar-control-group/push-buttons.svg +1 -0
  366. package/docs/design/templates/toolbar-control-group/with-text-dark.svg +1 -0
  367. package/docs/design/templates/toolbar-control-group/with-text.svg +1 -0
  368. package/docs/design/templates/toolbar-control-group-dark.svg +1 -0
  369. package/docs/design/templates/toolbar-control-group.svg +1 -0
  370. package/docs/design/templates/toolbar-dark.svg +1 -0
  371. package/docs/design/templates/toolbar-text/default-dark.svg +1 -0
  372. package/docs/design/templates/toolbar-text/default.svg +1 -0
  373. package/docs/design/templates/toolbar-text/large-dark.svg +1 -0
  374. package/docs/design/templates/toolbar-text/large.svg +1 -0
  375. package/docs/design/templates/toolbar-text/small-dark.svg +1 -0
  376. package/docs/design/templates/toolbar-text/small.svg +1 -0
  377. package/docs/design/templates/toolbar-text-dark.svg +1 -0
  378. package/docs/design/templates/toolbar-text.svg +1 -0
  379. package/docs/design/templates/toolbar.svg +1 -0
  380. package/docs/design/templates/value-table/details-dark.svg +1 -0
  381. package/docs/design/templates/value-table/details.svg +1 -0
  382. package/docs/design/templates/value-table-dark.svg +1 -0
  383. package/docs/design/templates/value-table.svg +1 -0
  384. package/docs/design/templates.md +128 -0
  385. package/docs/design-philosophy.md +33 -11
  386. package/docs/device-class.md +54 -0
  387. package/docs/examples/application-ui-profile.json +60 -0
  388. package/docs/examples/command-palette-adapter.tsx +68 -17
  389. package/docs/examples/component-catalog-extension-v2.json +80 -0
  390. package/docs/examples/component-catalog-extension.json +45 -0
  391. package/docs/layout.md +169 -38
  392. package/docs/nav-stack.md +77 -0
  393. package/docs/recipes.md +64 -16
  394. package/docs/split-view.md +55 -0
  395. package/docs/sunken-panel.md +53 -0
  396. package/docs/surface-scaffold.md +25 -0
  397. package/docs/tab-scaffold.md +52 -0
  398. package/docs/type-contracts.md +127 -0
  399. package/docs/ui-analyzer.md +118 -0
  400. package/docs/ui-doctor.md +91 -0
  401. package/docs/ui-evaluator.md +122 -0
  402. package/docs/ux-demo.md +29 -10
  403. package/docs/webawesome-theme.md +82 -8
  404. package/docs/workbench.md +123 -0
  405. package/doctor/cli.mjs +115 -0
  406. package/doctor/config.schema.json +68 -0
  407. package/doctor/eslint-diagnostics.d.mts +24 -0
  408. package/doctor/eslint-diagnostics.mjs +24 -0
  409. package/doctor/index.d.mts +116 -0
  410. package/doctor/index.mjs +1272 -0
  411. package/doctor/report.schema.json +118 -0
  412. package/evaluator/cli.mjs +89 -0
  413. package/evaluator/index.d.mts +90 -0
  414. package/evaluator/index.mjs +1138 -0
  415. package/evaluator/report.schema.json +152 -0
  416. package/llms.txt +260 -32
  417. package/package.json +205 -38
  418. package/traversal-exclusions.mjs +27 -0
  419. package/ux-demo/recipes/app-shell.tsx +223 -13
  420. package/ux-demo/recipes/collapsible-sidebar.tsx +230 -0
  421. package/ux-demo/recipes/compact-toolbar.tsx +116 -12
  422. package/ux-demo/recipes/composer-form.tsx +120 -19
  423. package/ux-demo/recipes/list-detail-dialog.tsx +205 -0
  424. package/ux-demo/recipes/list-workspace-states.tsx +176 -9
  425. package/ux-demo/recipes/loaders.ts +13 -4
  426. package/ux-demo/recipes/loading-inspector.tsx +191 -0
  427. package/ux-demo/recipes/mount-recipe.ts +31 -5
  428. package/ux-demo/recipes/navigation-sidebar.tsx +123 -11
  429. package/ux-demo/recipes/navigation-stack.tsx +121 -0
  430. package/ux-demo/recipes/recipes.css +125 -16
  431. package/ux-demo/recipes/types.ts +9 -1
  432. package/ux-demo/recipes/workspace-header.tsx +72 -3
  433. package/dist/browser/dialog-header.js +0 -5
  434. package/dist/browser/menu-action-row.js +0 -3
  435. package/dist/browser/menu-header.js +0 -5
  436. package/dist/browser/menu-item.js +0 -3
  437. package/dist/browser/page-header.js +0 -3
  438. package/dist/chunk-2PES33HS.js +0 -13
  439. package/dist/chunk-2PES33HS.js.map +0 -1
  440. package/dist/chunk-55DATV3A.js +0 -10
  441. package/dist/chunk-55DATV3A.js.map +0 -1
  442. package/dist/chunk-7BR3DO2A.js.map +0 -1
  443. package/dist/chunk-7LDCTU7D.js +0 -134
  444. package/dist/chunk-7LDCTU7D.js.map +0 -1
  445. package/dist/chunk-AQNKJRFH.js +0 -79
  446. package/dist/chunk-AQNKJRFH.js.map +0 -1
  447. package/dist/chunk-CTQKI2XL.js +0 -28
  448. package/dist/chunk-CTQKI2XL.js.map +0 -1
  449. package/dist/chunk-DAFFDO33.js +0 -14
  450. package/dist/chunk-DAFFDO33.js.map +0 -1
  451. package/dist/chunk-EGHL5S4P.js +0 -33
  452. package/dist/chunk-EGHL5S4P.js.map +0 -1
  453. package/dist/chunk-GY5WH7TO.js +0 -10
  454. package/dist/chunk-GY5WH7TO.js.map +0 -1
  455. package/dist/chunk-H5AGGVU5.js +0 -75
  456. package/dist/chunk-H5AGGVU5.js.map +0 -1
  457. package/dist/chunk-K3G72I6D.js +0 -24
  458. package/dist/chunk-K3G72I6D.js.map +0 -1
  459. package/dist/chunk-M5JRI6MN.js +0 -27
  460. package/dist/chunk-M5JRI6MN.js.map +0 -1
  461. package/dist/chunk-MBR3TYNL.js +0 -14
  462. package/dist/chunk-MBR3TYNL.js.map +0 -1
  463. package/dist/chunk-MFKMHK5W.js +0 -10
  464. package/dist/chunk-MFKMHK5W.js.map +0 -1
  465. package/dist/chunk-MQIZAD4A.js.map +0 -1
  466. package/dist/chunk-NPPD2A6O.js +0 -40
  467. package/dist/chunk-NPPD2A6O.js.map +0 -1
  468. package/dist/chunk-R6JHHBKQ.js +0 -19
  469. package/dist/chunk-R6JHHBKQ.js.map +0 -1
  470. package/dist/chunk-S3TPM2LP.js +0 -23
  471. package/dist/chunk-S3TPM2LP.js.map +0 -1
  472. package/dist/chunk-TRNBHPNW.js.map +0 -1
  473. package/dist/chunk-VHW5YNIB.js +0 -17
  474. package/dist/chunk-VHW5YNIB.js.map +0 -1
  475. package/dist/chunk-WVPYVDXY.js +0 -15
  476. package/dist/chunk-WVPYVDXY.js.map +0 -1
  477. package/dist/chunk-XZXRLY5Q.js +0 -33
  478. package/dist/chunk-XZXRLY5Q.js.map +0 -1
  479. package/dist/dialog-header.d.ts +0 -15
  480. package/dist/dialog-header.js +0 -5
  481. package/dist/dialog-header.js.map +0 -1
  482. package/dist/menu-action-row.js +0 -4
  483. package/dist/menu-action-row.js.map +0 -1
  484. package/dist/menu-header.d.ts +0 -41
  485. package/dist/menu-header.js +0 -6
  486. package/dist/menu-header.js.map +0 -1
  487. package/dist/menu-item.d.ts +0 -31
  488. package/dist/menu-item.js +0 -4
  489. package/dist/menu-item.js.map +0 -1
  490. package/dist/page-header.d.ts +0 -9
  491. package/dist/page-header.js +0 -3
  492. package/dist/page-header.js.map +0 -1
  493. package/dist/styles/dialog-header.css +0 -87
  494. package/dist/styles/menu-action-row.css +0 -160
  495. package/dist/styles/menu-header.css +0 -143
  496. package/dist/styles/menu-item.css +0 -123
  497. package/dist/styles/page-header.css +0 -33
  498. package/ux-demo/recipes/master-detail-dialog.tsx +0 -45
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kerfjs/ui",
3
- "version": "5.0.0-beta.4",
3
+ "version": "5.0.0-beta.41",
4
4
  "description": "Accessible, composable UI primitives for kerf applications.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -27,6 +27,11 @@
27
27
  "publishConfig": {
28
28
  "access": "public"
29
29
  },
30
+ "bin": {
31
+ "kerf-ui-analyze": "./analyzer/cli.mjs",
32
+ "kerf-ui-doctor": "./doctor/cli.mjs",
33
+ "kerf-ui-evaluate": "./evaluator/cli.mjs"
34
+ },
30
35
  "main": "./dist/index.js",
31
36
  "types": "./dist/index.d.ts",
32
37
  "sideEffects": [
@@ -39,6 +44,10 @@
39
44
  "types": "./dist/index.d.ts",
40
45
  "import": "./dist/index.js"
41
46
  },
47
+ "./css-values": {
48
+ "types": "./dist/css-values.d.ts",
49
+ "import": "./dist/css-values.js"
50
+ },
42
51
  "./lucide-icon": {
43
52
  "types": "./dist/lucide-icon.d.ts",
44
53
  "browser": "./dist/browser/lucide-icon.js",
@@ -59,25 +68,65 @@
59
68
  "browser": "./dist/browser/toolbar-control-group.js",
60
69
  "import": "./dist/toolbar-control-group.js"
61
70
  },
71
+ "./surface-scaffold": {
72
+ "types": "./dist/surface-scaffold.d.ts",
73
+ "browser": "./dist/browser/surface-scaffold.js",
74
+ "import": "./dist/surface-scaffold.js"
75
+ },
76
+ "./floating-toolbar": {
77
+ "types": "./dist/floating-toolbar.d.ts",
78
+ "browser": "./dist/browser/floating-toolbar.js",
79
+ "import": "./dist/floating-toolbar.js"
80
+ },
62
81
  "./toolbar-text": {
63
82
  "types": "./dist/toolbar-text.d.ts",
64
83
  "browser": "./dist/browser/toolbar-text.js",
65
84
  "import": "./dist/toolbar-text.js"
66
85
  },
67
- "./menu-action-row": {
68
- "types": "./dist/menu-action-row.d.ts",
69
- "browser": "./dist/browser/menu-action-row.js",
70
- "import": "./dist/menu-action-row.js"
86
+ "./text": {
87
+ "types": "./dist/text.d.ts",
88
+ "browser": "./dist/browser/text.js",
89
+ "import": "./dist/text.js"
90
+ },
91
+ "./list": {
92
+ "types": "./dist/list.d.ts",
93
+ "browser": "./dist/browser/list.js",
94
+ "import": "./dist/list.js"
95
+ },
96
+ "./row": {
97
+ "types": "./dist/row.d.ts",
98
+ "browser": "./dist/browser/row.js",
99
+ "import": "./dist/row.js"
100
+ },
101
+ "./spacer": {
102
+ "types": "./dist/spacer.d.ts",
103
+ "browser": "./dist/browser/spacer.js",
104
+ "import": "./dist/spacer.js"
105
+ },
106
+ "./list-action-row": {
107
+ "types": "./dist/list-action-row.d.ts",
108
+ "browser": "./dist/browser/list-action-row.js",
109
+ "import": "./dist/list-action-row.js"
71
110
  },
72
- "./menu-item": {
73
- "types": "./dist/menu-item.d.ts",
74
- "browser": "./dist/browser/menu-item.js",
75
- "import": "./dist/menu-item.js"
111
+ "./list-item": {
112
+ "types": "./dist/list-item.d.ts",
113
+ "browser": "./dist/browser/list-item.js",
114
+ "import": "./dist/list-item.js"
76
115
  },
77
- "./menu-header": {
78
- "types": "./dist/menu-header.d.ts",
79
- "browser": "./dist/browser/menu-header.js",
80
- "import": "./dist/menu-header.js"
116
+ "./list-header": {
117
+ "types": "./dist/list-header.d.ts",
118
+ "browser": "./dist/browser/list-header.js",
119
+ "import": "./dist/list-header.js"
120
+ },
121
+ "./list-inset-control": {
122
+ "types": "./dist/list-inset-control.d.ts",
123
+ "browser": "./dist/browser/list-inset-control.js",
124
+ "import": "./dist/list-inset-control.js"
125
+ },
126
+ "./list-inset-text": {
127
+ "types": "./dist/list-inset-text.d.ts",
128
+ "browser": "./dist/browser/list-inset-text.js",
129
+ "import": "./dist/list-inset-text.js"
81
130
  },
82
131
  "./resizable-region": {
83
132
  "types": "./dist/resizable-region.d.ts",
@@ -88,11 +137,43 @@
88
137
  "types": "./dist/wire-resizable-regions.d.ts",
89
138
  "import": "./dist/wire-resizable-regions.js"
90
139
  },
140
+ "./device-class": {
141
+ "types": "./dist/device-class.d.ts",
142
+ "import": "./dist/device-class.js"
143
+ },
91
144
  "./app-tab": {
92
145
  "types": "./dist/app-tab.d.ts",
93
146
  "browser": "./dist/browser/app-tab.js",
94
147
  "import": "./dist/app-tab.js"
95
148
  },
149
+ "./catalog": {
150
+ "types": "./dist/catalog.d.ts",
151
+ "import": "./dist/catalog.js"
152
+ },
153
+ "./catalog-resources": {
154
+ "types": "./dist/catalog-resources.d.ts",
155
+ "import": "./dist/catalog-resources.js"
156
+ },
157
+ "./analyzer": {
158
+ "types": "./analyzer/index.d.mts",
159
+ "import": "./analyzer/index.mjs"
160
+ },
161
+ "./analyzer/report.schema.json": "./analyzer/report.schema.json",
162
+ "./doctor": {
163
+ "types": "./doctor/index.d.mts",
164
+ "import": "./doctor/index.mjs"
165
+ },
166
+ "./doctor/config.schema.json": "./doctor/config.schema.json",
167
+ "./doctor/report.schema.json": "./doctor/report.schema.json",
168
+ "./evaluator": {
169
+ "types": "./evaluator/index.d.mts",
170
+ "import": "./evaluator/index.mjs"
171
+ },
172
+ "./evaluator/report.schema.json": "./evaluator/report.schema.json",
173
+ "./wire-catalog": {
174
+ "types": "./dist/wire-catalog.d.ts",
175
+ "import": "./dist/wire-catalog.js"
176
+ },
96
177
  "./tab-bar": {
97
178
  "types": "./dist/tab-bar.d.ts",
98
179
  "browser": "./dist/browser/tab-bar.js",
@@ -102,10 +183,42 @@
102
183
  "types": "./dist/wire-tab-bars.d.ts",
103
184
  "import": "./dist/wire-tab-bars.js"
104
185
  },
105
- "./page-header": {
106
- "types": "./dist/page-header.d.ts",
107
- "browser": "./dist/browser/page-header.js",
108
- "import": "./dist/page-header.js"
186
+ "./nav-stack": {
187
+ "types": "./dist/nav-stack.d.ts",
188
+ "import": "./dist/nav-stack.js"
189
+ },
190
+ "./wire-nav-stack": {
191
+ "types": "./dist/wire-nav-stack.d.ts",
192
+ "import": "./dist/wire-nav-stack.js"
193
+ },
194
+ "./split-view": {
195
+ "types": "./dist/split-view.d.ts",
196
+ "import": "./dist/split-view.js"
197
+ },
198
+ "./pane": {
199
+ "types": "./dist/pane.d.ts",
200
+ "browser": "./dist/browser/pane.js",
201
+ "import": "./dist/pane.js"
202
+ },
203
+ "./workbench": {
204
+ "types": "./dist/workbench.d.ts",
205
+ "import": "./dist/workbench.js"
206
+ },
207
+ "./collapsible-panel": {
208
+ "types": "./dist/collapsible-panel.d.ts",
209
+ "import": "./dist/collapsible-panel.js"
210
+ },
211
+ "./wire-sidebar": {
212
+ "types": "./dist/wire-sidebar.d.ts",
213
+ "import": "./dist/wire-sidebar.js"
214
+ },
215
+ "./tab-scaffold": {
216
+ "types": "./dist/tab-scaffold.d.ts",
217
+ "import": "./dist/tab-scaffold.js"
218
+ },
219
+ "./wire-tab-scaffold": {
220
+ "types": "./dist/wire-tab-scaffold.d.ts",
221
+ "import": "./dist/wire-tab-scaffold.js"
109
222
  },
110
223
  "./loading-spinner": {
111
224
  "types": "./dist/loading-spinner.d.ts",
@@ -117,6 +230,16 @@
117
230
  "browser": "./dist/browser/select.js",
118
231
  "import": "./dist/select.js"
119
232
  },
233
+ "./skeleton": {
234
+ "types": "./dist/skeleton.d.ts",
235
+ "browser": "./dist/browser/skeleton.js",
236
+ "import": "./dist/skeleton.js"
237
+ },
238
+ "./sunken-panel": {
239
+ "types": "./dist/sunken-panel.d.ts",
240
+ "browser": "./dist/browser/sunken-panel.js",
241
+ "import": "./dist/sunken-panel.js"
242
+ },
120
243
  "./segmented-control": {
121
244
  "types": "./dist/segmented-control.d.ts",
122
245
  "browser": "./dist/browser/segmented-control.js",
@@ -149,11 +272,6 @@
149
272
  "browser": "./dist/browser/empty-state.js",
150
273
  "import": "./dist/empty-state.js"
151
274
  },
152
- "./dialog-header": {
153
- "types": "./dist/dialog-header.d.ts",
154
- "browser": "./dist/browser/dialog-header.js",
155
- "import": "./dist/dialog-header.js"
156
- },
157
275
  "./value-table": {
158
276
  "types": "./dist/value-table.d.ts",
159
277
  "browser": "./dist/browser/value-table.js",
@@ -171,21 +289,36 @@
171
289
  "./disclosure-arrow.css": "./dist/styles/disclosure-arrow.css",
172
290
  "./toolbar.css": "./dist/styles/toolbar.css",
173
291
  "./toolbar-control-group.css": "./dist/styles/toolbar-control-group.css",
292
+ "./surface-scaffold.css": "./dist/styles/surface-scaffold.css",
293
+ "./floating-toolbar.css": "./dist/styles/floating-toolbar.css",
174
294
  "./toolbar-text.css": "./dist/styles/toolbar-text.css",
175
- "./menu-action-row.css": "./dist/styles/menu-action-row.css",
176
- "./menu-item.css": "./dist/styles/menu-item.css",
177
- "./menu-header.css": "./dist/styles/menu-header.css",
295
+ "./text.css": "./dist/styles/text.css",
296
+ "./list.css": "./dist/styles/list.css",
297
+ "./row.css": "./dist/styles/row.css",
298
+ "./spacer.css": "./dist/styles/spacer.css",
299
+ "./list-action-row.css": "./dist/styles/list-action-row.css",
300
+ "./list-item.css": "./dist/styles/list-item.css",
301
+ "./list-header.css": "./dist/styles/list-header.css",
302
+ "./list-inset-control.css": "./dist/styles/list-inset-control.css",
303
+ "./list-inset-text.css": "./dist/styles/list-inset-text.css",
178
304
  "./resizable-region.css": "./dist/styles/resizable-region.css",
179
305
  "./app-tab.css": "./dist/styles/app-tab.css",
306
+ "./catalog.css": "./dist/styles/catalog.css",
180
307
  "./tab-bar.css": "./dist/styles/tab-bar.css",
181
- "./page-header.css": "./dist/styles/page-header.css",
308
+ "./nav-stack.css": "./dist/styles/nav-stack.css",
309
+ "./split-view.css": "./dist/styles/split-view.css",
310
+ "./pane.css": "./dist/styles/pane.css",
311
+ "./workbench.css": "./dist/styles/workbench.css",
312
+ "./collapsible-panel.css": "./dist/styles/collapsible-panel.css",
313
+ "./tab-scaffold.css": "./dist/styles/tab-scaffold.css",
182
314
  "./loading-spinner.css": "./dist/styles/loading-spinner.css",
183
315
  "./select.css": "./dist/styles/select.css",
316
+ "./skeleton.css": "./dist/styles/skeleton.css",
317
+ "./sunken-panel.css": "./dist/styles/sunken-panel.css",
184
318
  "./segmented-control.css": "./dist/styles/segmented-control.css",
185
319
  "./token-search-field.css": "./dist/styles/token-search-field.css",
186
320
  "./state-banner.css": "./dist/styles/state-banner.css",
187
321
  "./empty-state.css": "./dist/styles/empty-state.css",
188
- "./dialog-header.css": "./dist/styles/dialog-header.css",
189
322
  "./value-table.css": "./dist/styles/value-table.css",
190
323
  "./ai/*": "./ai/*",
191
324
  "./docs/*": "./docs/*"
@@ -193,6 +326,10 @@
193
326
  "files": [
194
327
  "dist",
195
328
  "ai",
329
+ "analyzer",
330
+ "doctor",
331
+ "evaluator",
332
+ "traversal-exclusions.mjs",
196
333
  "docs",
197
334
  "ux-demo/recipes",
198
335
  "llms.txt",
@@ -204,39 +341,68 @@
204
341
  "dev": "npm run build && vite --config ux-demo/vite.config.ts",
205
342
  "demo:build": "npm run build && vite build --config ux-demo/vite.config.ts && node scripts/check-demo-bundle.mjs",
206
343
  "demo:serve": "vite preview --config ux-demo/vite.config.ts",
344
+ "test:e2e:serve": "npm run check:catalog && npm run check:demo-conformance && npm run demo:build && npm run demo:serve",
345
+ "format": "prettier --write . --ignore-unknown",
207
346
  "format:css": "prettier --write \"src/**/*.css\" \"ux-demo/**/*.css\"",
208
- "check:format": "prettier --check \"src/**/*.css\" \"ux-demo/**/*.css\"",
209
- "catalog:sync": "node scripts/sync-component-catalog.mjs",
210
- "check:catalog": "node scripts/sync-component-catalog.mjs --check && node scripts/check-component-catalog.mjs",
347
+ "check:format": "prettier --check . --ignore-unknown",
348
+ "catalog:sync": "node scripts/sync-component-catalog.mjs && node scripts/sync-component-catalog-v2.mjs",
349
+ "catalog:v2:sync": "node scripts/sync-component-catalog-v2.mjs",
350
+ "check:component-integrations": "node scripts/check-component-integrations.mjs",
351
+ "component-integrations:dry-run": "node scripts/check-component-integrations.mjs --dry-run",
352
+ "check:change": "node scripts/check-ui-change.mjs",
353
+ "check:catalog": "node scripts/sync-component-catalog.mjs --check && node scripts/sync-component-catalog-v2.mjs --check && node scripts/check-component-catalog.mjs",
354
+ "check:profile": "node scripts/check-application-ui-profile.mjs",
355
+ "check:demo-conformance": "node scripts/check-catalog-demo-conformance.mjs",
211
356
  "check:recipes": "node scripts/check-recipes.mjs",
212
- "check:ai-regressions": "node scripts/check-ai-regressions.mjs && node scripts/audit-ai-regression-results.mjs",
357
+ "check:ai-regressions": "node scripts/check-ai-regressions.mjs && node scripts/audit-ai-regression-results.mjs && node scripts/audit-ai-regression-results-v3.mjs",
213
358
  "check:ai-signatures": "node scripts/sync-ai-public-signatures.mjs --check",
214
359
  "ai:signatures:sync": "npm run build && node scripts/sync-ai-public-signatures.mjs",
360
+ "check:ai-compatibility": "node scripts/sync-ai-compatibility.mjs",
361
+ "ai:compatibility:sync": "node scripts/sync-ai-compatibility.mjs --write",
215
362
  "ai:regressions:compile": "node scripts/compile-ai-regression-response.mjs",
216
363
  "ai:regressions:prepare": "node scripts/prepare-ai-regression.mjs",
217
364
  "ai:regressions:record": "node scripts/record-ai-regression-run.mjs",
365
+ "ai:regressions:record-v3": "node scripts/record-ai-regression-run-v3.mjs",
366
+ "ai:regressions:replay-v3": "node scripts/replay-ai-regression-run-v3.mjs",
218
367
  "ai:regressions:score": "node scripts/score-ai-regression.mjs",
219
368
  "check:guidance": "node scripts/check-decision-guidance.mjs",
220
- "lint": "eslint src tests ux-demo docs/examples --max-warnings 0",
369
+ "lint:eslint": "eslint src tests ux-demo docs/examples --max-warnings 0",
370
+ "lint": "npm run lint:eslint && npm run check:format",
221
371
  "typecheck": "node node_modules/typescript7/bin/tsc --noEmit",
222
- "test": "npm run test:unit && npm run test:bundle",
372
+ "test": "npm run test:unit && npm run test:bundle && npm run test:analyzer && npm run test:doctor && npm run test:evaluator",
223
373
  "test:unit": "vitest run tests/unit --coverage",
224
374
  "test:bundle": "npm run build && vitest run tests/bundle",
225
- "test:consumer-types": "npm run build && node node_modules/typescript7/bin/tsc -p tests/consumer-types/webawesome/tsconfig.json",
226
- "test:e2e": "npm run demo:build && playwright test",
227
- "check": "npm run check:format && npm run check:catalog && npm run check:recipes && npm run check:guidance && npm run check:ai-regressions && npm run lint && npm run typecheck && npm test && npm run test:consumer-types && npm run check:ai-signatures && npm run demo:build && npm pack --dry-run",
228
- "prepublishOnly": "npm run check"
375
+ "test:analyzer": "vitest run tests/integration/ui-analyzer-downstream.test.ts",
376
+ "test:doctor": "vitest run tests/unit/ui-doctor.test.ts tests/integration/ui-doctor-downstream.test.ts",
377
+ "test:evaluator": "vitest run tests/unit/ui-evaluator.test.ts tests/integration/ui-evaluator-downstream.test.ts",
378
+ "test:contract-types:source": "node node_modules/typescript7/bin/tsc -p tests/consumer-types/contracts/tsconfig.source.json",
379
+ "test:contract-types:packed": "node scripts/check-packed-type-contracts.mjs",
380
+ "test:consumer-types": "npm run test:contract-types:source && npm run build && node node_modules/typescript7/bin/tsc -p tests/consumer-types/webawesome/tsconfig.json && npm run test:contract-types:packed",
381
+ "test:e2e": "playwright test",
382
+ "check": "npm run check:catalog && npm run check:component-integrations && npm run check:profile && npm run check:demo-conformance && npm run check:recipes && npm run check:guidance && npm run check:ai-compatibility && npm run check:ai-regressions && npm run lint && npm run typecheck && npm test && npm run test:consumer-types && npm run check:ai-signatures && npm run demo:build && npm run check:design-templates && npm pack --dry-run",
383
+ "prepublishOnly": "npm run check",
384
+ "check:design-templates": "node scripts/check-design-templates.mjs",
385
+ "check:design-templates:drift": "node scripts/check-design-templates-drift.mjs",
386
+ "design-templates:build": "node scripts/build-design-templates.mjs"
229
387
  },
230
388
  "peerDependencies": {
231
389
  "@awesome.me/webawesome": "^3.12.0",
232
390
  "kerfjs": "^5.0.0-0",
233
- "lucide": "^1.43.0"
391
+ "lucide": "^1.43.0",
392
+ "playwright": "^1.63.0"
234
393
  },
235
394
  "peerDependenciesMeta": {
236
395
  "@awesome.me/webawesome": {
237
396
  "optional": true
397
+ },
398
+ "playwright": {
399
+ "optional": true
238
400
  }
239
401
  },
402
+ "dependencies": {
403
+ "postcss": "^8.5.28",
404
+ "typescript": "^6.0.3"
405
+ },
240
406
  "devDependencies": {
241
407
  "@awesome.me/webawesome": "3.12.0",
242
408
  "@eslint/js": "^10.0.1",
@@ -245,6 +411,7 @@
245
411
  "@typescript-eslint/eslint-plugin": "^8.65.0",
246
412
  "@typescript-eslint/parser": "^8.65.0",
247
413
  "@vitest/coverage-v8": "4.1.11",
414
+ "domotion-svg": "^0.30.1",
248
415
  "esbuild": "^0.25.0",
249
416
  "eslint": "^10.8.0",
250
417
  "eslint-plugin-simple-import-sort": "^12.1.1",
@@ -0,0 +1,27 @@
1
+ import { relative, sep } from 'node:path';
2
+
3
+ export const UI_TRAVERSAL_IGNORED_DIRECTORY_NAMES = Object.freeze([
4
+ '.git',
5
+ '.kerf-cache',
6
+ 'coverage',
7
+ 'dist',
8
+ 'kerf-ui-evidence',
9
+ 'node_modules',
10
+ ]);
11
+ const ignoredDirectoryNames = new Set(UI_TRAVERSAL_IGNORED_DIRECTORY_NAMES);
12
+
13
+ export const UI_TRAVERSAL_ESLINT_IGNORES = Object.freeze([
14
+ ...UI_TRAVERSAL_IGNORED_DIRECTORY_NAMES.map((name) => `**/${name}/**`),
15
+ '**/.claude/worktrees/**',
16
+ ]);
17
+
18
+ export function isUiTraversalExcluded(root, candidate) {
19
+ const segments = relative(root, candidate).split(sep);
20
+ return (
21
+ segments.some((segment) => ignoredDirectoryNames.has(segment)) ||
22
+ segments.some(
23
+ (segment, index) =>
24
+ segment === '.claude' && segments[index + 1] === 'worktrees',
25
+ )
26
+ );
27
+ }
@@ -1,11 +1,11 @@
1
1
  import '@kerfjs/ui/layout.css';
2
2
  import './recipes.css';
3
3
 
4
+ import { ListHeader } from '@kerfjs/ui/list-header';
5
+ import { ListItem } from '@kerfjs/ui/list-item';
4
6
  import { LucideIcon } from '@kerfjs/ui/lucide-icon';
5
- import { MenuHeader } from '@kerfjs/ui/menu-header';
6
- import { MenuItem } from '@kerfjs/ui/menu-item';
7
- import { PageHeader } from '@kerfjs/ui/page-header';
8
7
  import { ResizableRegion } from '@kerfjs/ui/resizable-region';
8
+ import { Text } from '@kerfjs/ui/text';
9
9
  import { Toolbar } from '@kerfjs/ui/toolbar';
10
10
  import { ToolbarControlGroup } from '@kerfjs/ui/toolbar-control-group';
11
11
  import { ToolbarText } from '@kerfjs/ui/toolbar-text';
@@ -19,14 +19,224 @@ export const createRecipe: RecipeFactory = (announce) => {
19
19
  const selected = signal('inbox');
20
20
  const navigationSize = signal(224);
21
21
  const inspectorSize = signal(240);
22
- const responsivePane = signal<'content' | 'navigation' | 'inspector'>('content');
23
- const render = () => <section class="kui-recipe recipe-shell kui-recipe__surface kui-layout" data-recipe="recipe-app-shell" data-responsive-pane={responsivePane.value}>
24
- <Toolbar label="Atlas workspace" leading={<ToolbarControlGroup appearance="borderless" single><ToolbarText text="Atlas" /></ToolbarControlGroup>} trailing={<div class="recipe-shell__toolbar-actions"><ToolbarControlGroup className="recipe-shell__responsive-controls" appearance="borderless" label="Workspace panes"><button type="button" aria-label="Show navigation" aria-controls="recipe-shell-navigation" aria-pressed={String(responsivePane.value === 'navigation')} data-action="recipe-action" data-recipe-command="show-navigation"><LucideIcon icon={Folder} name="folder" /></button><button type="button" aria-label="Show content" aria-controls="recipe-shell-content" aria-pressed={String(responsivePane.value === 'content')} data-action="recipe-action" data-recipe-command="show-content"><LucideIcon icon={Inbox} name="inbox" /></button><button type="button" aria-label="Show inspector" aria-controls="recipe-shell-inspector" aria-pressed={String(responsivePane.value === 'inspector')} data-action="recipe-action" data-recipe-command="show-inspector"><LucideIcon icon={Settings} name="settings" /></button></ToolbarControlGroup><ToolbarControlGroup appearance="borderless" label="Workspace controls"><button type="button" aria-label="Notifications" data-action="recipe-action" data-recipe-command="notify"><LucideIcon icon={Bell} name="bell" /></button><button type="button" aria-label="Settings" data-action="recipe-action" data-recipe-command="settings"><LucideIcon icon={Settings} name="settings" /></button></ToolbarControlGroup></div>} />
25
- <div class="recipe-shell__body">
26
- <div id="recipe-shell-navigation" class="recipe-shell__nav-region"><ResizableRegion id="recipe-navigation" label="Navigation" size={navigationSize.value} min={180} max={320}><aside class="recipe-shell__nav kui-pane"><MenuHeader label="Workspace" /><nav class="recipe-shell__nav-list kui-pane__content kui-content" aria-label="Workspace"><section><MenuItem action="recipe-action" itemId="inbox" label="Inbox" icon={<LucideIcon icon={Inbox} name="inbox" />} selected={selected.value === 'inbox'} /><MenuItem action="recipe-action" itemId="projects" label="Projects with a deliberately wrapping title" icon={<LucideIcon icon={Folder} name="folder" />} selected={selected.value === 'projects'} multiline /></section></nav></aside></ResizableRegion></div>
27
- <main id="recipe-shell-content" class="recipe-shell__main kui-pane"><PageHeader title={selected.value === 'inbox' ? 'Inbox triage' : 'Active projects'} action={<button class="kui-recipe__button" data-primary="true" type="button" data-action="recipe-action" data-recipe-command="new">New task</button>} /><div class="recipe-shell__main-body kui-pane__content kui-content"><p class="kui-recipe__ownership kui-content-item">Recipe owns pane geometry and one scroll owner per pane. The app owns routing, data, pane visibility, sizes, and persistence.</p><div class="recipe-shell__cards">{['Release accessibility audit', 'Prepare tablet navigation', 'Review stale-data states', 'Confirm package boundaries'].map((title) => <article class="recipe-shell__card kui-content-item"><strong>{title}</strong><p class="kui-recipe__muted">Assigned to the interface systems team · due this week</p></article>)}</div></div></main>
28
- <div id="recipe-shell-inspector" class="recipe-shell__inspector-region"><ResizableRegion id="recipe-inspector" label="Inspector" size={inspectorSize.value} min={200} max={360} edge="start"><aside class="recipe-shell__inspector kui-pane"><PageHeader title="Inspector" /><div class="recipe-shell__inspector-body kui-pane__content kui-content"><ValueTable label="Selected task"><ValueTableRow label="Status" value="In review" /><ValueTableRow label="Owner" value="Mara Chen" /><ValueTableRow label="Priority" value="High" /></ValueTable></div></aside></ResizableRegion></div>
29
- </div>
30
- </section>;
31
- return { render, action(command, element) { const pane = command.match(/^show-(navigation|content|inspector)$/)?.[1] as typeof responsivePane.value | undefined; if (pane) responsivePane.value = pane; const id = element.dataset.itemId; if (id) selected.value = id; announce(id ? `Opened ${id}` : pane ? `Showing ${pane}` : command === 'new' ? 'New task requested' : `${command} requested`); }, resize(id, size) { if (id === 'recipe-navigation') navigationSize.value = size; if (id === 'recipe-inspector') inspectorSize.value = size; announce(`${id} resized to ${size}px`); } };
22
+ const responsivePane = signal<'content' | 'navigation' | 'inspector'>(
23
+ 'content',
24
+ );
25
+ const render = () => (
26
+ <section
27
+ class="kui-recipe recipe-shell kui-recipe__surface kui-layout"
28
+ data-recipe="recipe-app-shell"
29
+ data-responsive-pane={responsivePane.value}
30
+ >
31
+ <Toolbar
32
+ label="Atlas workspace"
33
+ leading={<ToolbarText text="Atlas" />}
34
+ trailing={
35
+ <div class="recipe-shell__toolbar-actions">
36
+ <ToolbarControlGroup
37
+ className="recipe-shell__responsive-controls"
38
+ appearance="borderless"
39
+ label="Workspace panes"
40
+ >
41
+ <button
42
+ type="button"
43
+ aria-label="Show navigation"
44
+ aria-controls="recipe-shell-navigation"
45
+ aria-pressed={String(responsivePane.value === 'navigation')}
46
+ data-action="recipe-action"
47
+ data-recipe-command="show-navigation"
48
+ >
49
+ <LucideIcon icon={Folder} name="folder" />
50
+ </button>
51
+ <button
52
+ type="button"
53
+ aria-label="Show content"
54
+ aria-controls="recipe-shell-content"
55
+ aria-pressed={String(responsivePane.value === 'content')}
56
+ data-action="recipe-action"
57
+ data-recipe-command="show-content"
58
+ >
59
+ <LucideIcon icon={Inbox} name="inbox" />
60
+ </button>
61
+ <button
62
+ type="button"
63
+ aria-label="Show inspector"
64
+ aria-controls="recipe-shell-inspector"
65
+ aria-pressed={String(responsivePane.value === 'inspector')}
66
+ data-action="recipe-action"
67
+ data-recipe-command="show-inspector"
68
+ >
69
+ <LucideIcon icon={Settings} name="settings" />
70
+ </button>
71
+ </ToolbarControlGroup>
72
+ <ToolbarControlGroup
73
+ appearance="borderless"
74
+ label="Workspace controls"
75
+ >
76
+ <button
77
+ type="button"
78
+ aria-label="Notifications"
79
+ data-action="recipe-action"
80
+ data-recipe-command="notify"
81
+ >
82
+ <LucideIcon icon={Bell} name="bell" />
83
+ </button>
84
+ <button
85
+ type="button"
86
+ aria-label="Settings"
87
+ data-action="recipe-action"
88
+ data-recipe-command="settings"
89
+ >
90
+ <LucideIcon icon={Settings} name="settings" />
91
+ </button>
92
+ </ToolbarControlGroup>
93
+ </div>
94
+ }
95
+ />
96
+ <div class="recipe-shell__body">
97
+ <div id="recipe-shell-navigation" class="recipe-shell__nav-region">
98
+ <ResizableRegion
99
+ id="recipe-navigation"
100
+ label="Navigation"
101
+ size={navigationSize.value}
102
+ min={180}
103
+ max={320}
104
+ >
105
+ <aside class="recipe-shell__nav kui-pane">
106
+ <ListHeader label="Workspace" />
107
+ <nav
108
+ class="recipe-shell__nav-list kui-pane__content kui-content"
109
+ aria-label="Workspace"
110
+ >
111
+ <section>
112
+ <ListItem
113
+ action="recipe-action"
114
+ itemId="inbox"
115
+ label="Inbox"
116
+ icon={<LucideIcon icon={Inbox} name="inbox" />}
117
+ selected={selected.value === 'inbox'}
118
+ />
119
+ <ListItem
120
+ action="recipe-action"
121
+ itemId="projects"
122
+ label="Projects with a deliberately wrapping title"
123
+ icon={<LucideIcon icon={Folder} name="folder" />}
124
+ selected={selected.value === 'projects'}
125
+ multiline
126
+ />
127
+ </section>
128
+ </nav>
129
+ </aside>
130
+ </ResizableRegion>
131
+ </div>
132
+ <main id="recipe-shell-content" class="recipe-shell__main kui-pane">
133
+ <Toolbar
134
+ label="Current workspace view"
135
+ dividerSides=""
136
+ leading={
137
+ <ToolbarText
138
+ text={
139
+ selected.value === 'inbox'
140
+ ? 'Inbox triage'
141
+ : 'Active projects'
142
+ }
143
+ size="xlarge"
144
+ id="recipe-shell-main-title"
145
+ />
146
+ }
147
+ trailing={
148
+ <ToolbarControlGroup appearance="borderless" single>
149
+ <button
150
+ class="kui-recipe__button"
151
+ data-primary="true"
152
+ type="button"
153
+ data-action="recipe-action"
154
+ data-recipe-command="new"
155
+ >
156
+ New task
157
+ </button>
158
+ </ToolbarControlGroup>
159
+ }
160
+ />
161
+ <div class="recipe-shell__main-body kui-pane__content kui-content">
162
+ <Text variant="p" class="kui-recipe__ownership kui-content-item">
163
+ Recipe owns pane geometry and one scroll owner per pane. The app
164
+ owns routing, data, pane visibility, sizes, and persistence.
165
+ </Text>
166
+ <div class="recipe-shell__cards">
167
+ {[
168
+ 'Release accessibility audit',
169
+ 'Prepare tablet navigation',
170
+ 'Review stale-data states',
171
+ 'Confirm package boundaries',
172
+ ].map((title) => (
173
+ <article class="recipe-shell__card kui-content-item">
174
+ <strong>{title}</strong>
175
+ <Text variant="p" class="kui-recipe__muted">
176
+ Assigned to the interface systems team · due this week
177
+ </Text>
178
+ </article>
179
+ ))}
180
+ </div>
181
+ </div>
182
+ </main>
183
+ <div id="recipe-shell-inspector" class="recipe-shell__inspector-region">
184
+ <ResizableRegion
185
+ id="recipe-inspector"
186
+ label="Inspector"
187
+ size={inspectorSize.value}
188
+ min={200}
189
+ max={360}
190
+ edge="start"
191
+ >
192
+ <aside class="recipe-shell__inspector kui-pane">
193
+ <Toolbar
194
+ label="Inspector"
195
+ dividerSides=""
196
+ leading={
197
+ <ToolbarText
198
+ text="Inspector"
199
+ size="xlarge"
200
+ id="recipe-shell-inspector-title"
201
+ />
202
+ }
203
+ />
204
+ <div class="recipe-shell__inspector-body kui-pane__content kui-content">
205
+ <ValueTable label="Selected task">
206
+ <ValueTableRow label="Status" value="In review" />
207
+ <ValueTableRow label="Owner" value="Mara Chen" />
208
+ <ValueTableRow label="Priority" value="High" />
209
+ </ValueTable>
210
+ </div>
211
+ </aside>
212
+ </ResizableRegion>
213
+ </div>
214
+ </div>
215
+ </section>
216
+ );
217
+ return {
218
+ render,
219
+ action(command, element) {
220
+ const pane = command.match(
221
+ /^show-(navigation|content|inspector)$/,
222
+ )?.[1] as typeof responsivePane.value | undefined;
223
+ if (pane) responsivePane.value = pane;
224
+ const id = element.dataset.itemId;
225
+ if (id) selected.value = id;
226
+ announce(
227
+ id
228
+ ? `Opened ${id}`
229
+ : pane
230
+ ? `Showing ${pane}`
231
+ : command === 'new'
232
+ ? 'New task requested'
233
+ : `${command} requested`,
234
+ );
235
+ },
236
+ resize(id, size) {
237
+ if (id === 'recipe-navigation') navigationSize.value = size;
238
+ if (id === 'recipe-inspector') inspectorSize.value = size;
239
+ announce(`${id} resized to ${size}px`);
240
+ },
241
+ };
32
242
  };