@kerfjs/ui 5.0.0-beta.8 → 5.0.0-beta.80

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 (807) hide show
  1. package/README.md +546 -139
  2. package/ai/application-ui-diagnostic-ids-v1.json +113 -0
  3. package/ai/application-ui-profile-sync.cjs +548 -0
  4. package/ai/application-ui-profile.d.mts +1 -0
  5. package/ai/application-ui-profile.d.ts +106 -0
  6. package/ai/application-ui-profile.defaults.json +96 -0
  7. package/ai/application-ui-profile.mjs +653 -0
  8. package/ai/application-ui-profile.schema.json +140 -0
  9. package/ai/catalog-authoring.json +36 -0
  10. package/ai/catalog-authoring.schema.json +109 -0
  11. package/ai/compile-time-contracts-v1.json +149 -0
  12. package/ai/compile-time-contracts-v1.schema.json +52 -0
  13. package/ai/component-catalog-extension.schema.json +104 -0
  14. package/ai/component-catalog.json +4280 -457
  15. package/ai/component-catalog.schema.json +94 -1
  16. package/ai/component-class-owners.cjs +83 -0
  17. package/ai/component-composition-extension.d.ts +7 -0
  18. package/ai/component-composition-extension.schema.json +7 -0
  19. package/ai/component-composition-rules.json +516 -0
  20. package/ai/component-composition.d.ts +129 -0
  21. package/ai/component-composition.json +7397 -0
  22. package/ai/component-composition.schema.json +408 -0
  23. package/ai/components/README.md +171 -0
  24. package/ai/components/application-tabs.md +65 -0
  25. package/ai/components/badge.md +72 -0
  26. package/ai/components/chip.md +72 -0
  27. package/ai/components/collapsible-panel.md +102 -0
  28. package/ai/components/content-item.md +96 -0
  29. package/ai/components/disclosure-arrow.md +77 -0
  30. package/ai/components/document-baseline.md +75 -0
  31. package/ai/components/empty-state.md +80 -0
  32. package/ai/components/feedback.md +71 -0
  33. package/ai/components/floating-toolbar.md +82 -0
  34. package/ai/components/foundation.md +65 -0
  35. package/ai/components/grid.md +100 -0
  36. package/ai/components/headers.md +63 -0
  37. package/ai/components/layout.md +75 -0
  38. package/ai/components/list-action-row.md +91 -0
  39. package/ai/components/list-header.md +91 -0
  40. package/ai/components/list-inset-control.md +74 -0
  41. package/ai/components/list-inset-text.md +72 -0
  42. package/ai/components/list-item.md +94 -0
  43. package/ai/components/list.md +106 -0
  44. package/ai/components/loading-spinner.md +73 -0
  45. package/ai/components/lucide-icon.md +97 -0
  46. package/ai/components/nav-stack.md +105 -0
  47. package/ai/components/pane.md +104 -0
  48. package/ai/components/popup-menu.md +171 -0
  49. package/ai/components/recipe-app-shell.md +57 -0
  50. package/ai/components/recipe-collapsible-sidebar.md +57 -0
  51. package/ai/components/recipe-compact-toolbar.md +57 -0
  52. package/ai/components/recipe-composer-form.md +57 -0
  53. package/ai/components/recipe-list-detail-dialog.md +57 -0
  54. package/ai/components/recipe-list-workspace-states.md +57 -0
  55. package/ai/components/recipe-loading-inspector.md +57 -0
  56. package/ai/components/recipe-navigation-sidebar.md +57 -0
  57. package/ai/components/recipe-navigation-stack.md +57 -0
  58. package/ai/components/recipe-workspace-header.md +57 -0
  59. package/ai/components/resize.md +106 -0
  60. package/ai/components/row.md +96 -0
  61. package/ai/components/segmented-control.md +82 -0
  62. package/ai/components/select.md +115 -0
  63. package/ai/components/skeleton.md +84 -0
  64. package/ai/components/spacer.md +86 -0
  65. package/ai/components/split-view.md +103 -0
  66. package/ai/components/state-banner.md +94 -0
  67. package/ai/components/sunken-panel.md +79 -0
  68. package/ai/components/surface-scaffold.md +87 -0
  69. package/ai/components/tab-bar.md +113 -0
  70. package/ai/components/tab-navigator.md +95 -0
  71. package/ai/components/tabs.md +95 -0
  72. package/ai/components/text.md +87 -0
  73. package/ai/components/token-search-field.md +107 -0
  74. package/ai/components/toolbar-control-group.md +121 -0
  75. package/ai/components/toolbar-text.md +98 -0
  76. package/ai/components/toolbar.md +101 -0
  77. package/ai/components/value-table.md +73 -0
  78. package/ai/components/wa-accordion-item.md +55 -0
  79. package/ai/components/wa-accordion.md +65 -0
  80. package/ai/components/wa-animated-image.md +55 -0
  81. package/ai/components/wa-animation.md +55 -0
  82. package/ai/components/wa-avatar.md +55 -0
  83. package/ai/components/wa-badge.md +55 -0
  84. package/ai/components/wa-breadcrumb-item.md +53 -0
  85. package/ai/components/wa-breadcrumb.md +55 -0
  86. package/ai/components/wa-button-group.md +59 -0
  87. package/ai/components/wa-button.md +55 -0
  88. package/ai/components/wa-callout.md +58 -0
  89. package/ai/components/wa-card.md +59 -0
  90. package/ai/components/wa-carousel-item.md +53 -0
  91. package/ai/components/wa-carousel.md +55 -0
  92. package/ai/components/wa-checkbox-group.md +55 -0
  93. package/ai/components/wa-checkbox.md +55 -0
  94. package/ai/components/wa-color-picker.md +55 -0
  95. package/ai/components/wa-comparison.md +55 -0
  96. package/ai/components/wa-copy-button.md +55 -0
  97. package/ai/components/wa-details.md +61 -0
  98. package/ai/components/wa-dialog.md +59 -0
  99. package/ai/components/wa-divider.md +53 -0
  100. package/ai/components/wa-drawer.md +55 -0
  101. package/ai/components/wa-dropdown-item.md +60 -0
  102. package/ai/components/wa-dropdown.md +60 -0
  103. package/ai/components/wa-format-bytes.md +53 -0
  104. package/ai/components/wa-format-date.md +53 -0
  105. package/ai/components/wa-format-number.md +53 -0
  106. package/ai/components/wa-icon.md +58 -0
  107. package/ai/components/wa-include.md +53 -0
  108. package/ai/components/wa-input.md +59 -0
  109. package/ai/components/wa-intersection-observer.md +53 -0
  110. package/ai/components/wa-known-date.md +53 -0
  111. package/ai/components/wa-markdown.md +53 -0
  112. package/ai/components/wa-mutation-observer.md +53 -0
  113. package/ai/components/wa-number-input.md +55 -0
  114. package/ai/components/wa-option.md +59 -0
  115. package/ai/components/wa-otp-input.md +53 -0
  116. package/ai/components/wa-page.md +53 -0
  117. package/ai/components/wa-pagination.md +55 -0
  118. package/ai/components/wa-popover.md +55 -0
  119. package/ai/components/wa-popup.md +53 -0
  120. package/ai/components/wa-progress-bar.md +53 -0
  121. package/ai/components/wa-progress-ring.md +53 -0
  122. package/ai/components/wa-qr-code.md +53 -0
  123. package/ai/components/wa-radio-group.md +59 -0
  124. package/ai/components/wa-radio.md +55 -0
  125. package/ai/components/wa-random-content.md +53 -0
  126. package/ai/components/wa-rating.md +55 -0
  127. package/ai/components/wa-relative-time.md +53 -0
  128. package/ai/components/wa-resize-observer.md +53 -0
  129. package/ai/components/wa-scroller.md +53 -0
  130. package/ai/components/wa-select.md +63 -0
  131. package/ai/components/wa-skeleton.md +53 -0
  132. package/ai/components/wa-slider.md +55 -0
  133. package/ai/components/wa-spinner.md +58 -0
  134. package/ai/components/wa-split-panel.md +58 -0
  135. package/ai/components/wa-switch.md +53 -0
  136. package/ai/components/wa-tab-group.md +69 -0
  137. package/ai/components/wa-tab-panel.md +60 -0
  138. package/ai/components/wa-tab.md +59 -0
  139. package/ai/components/wa-tag.md +59 -0
  140. package/ai/components/wa-textarea.md +53 -0
  141. package/ai/components/wa-time-input.md +55 -0
  142. package/ai/components/wa-toast-item.md +60 -0
  143. package/ai/components/wa-toast.md +60 -0
  144. package/ai/components/wa-tooltip.md +55 -0
  145. package/ai/components/wa-tree-item.md +55 -0
  146. package/ai/components/wa-tree.md +55 -0
  147. package/ai/components/wa-zoomable-frame.md +55 -0
  148. package/ai/components/workbench.md +119 -0
  149. package/ai/public-api-signatures-v1.md +2821 -250
  150. package/ai/skill.md +354 -66
  151. package/ai/webawesome-jsx-signatures-v1.md +9 -2
  152. package/analyzer/cli.mjs +49 -0
  153. package/analyzer/component-ownership.d.mts +72 -0
  154. package/analyzer/component-ownership.mjs +429 -0
  155. package/analyzer/index.d.mts +53 -0
  156. package/analyzer/index.mjs +2346 -0
  157. package/analyzer/loud-pairs.d.mts +49 -0
  158. package/analyzer/loud-pairs.mjs +357 -0
  159. package/analyzer/report.schema.json +66 -0
  160. package/analyzer/selectors.d.mts +21 -0
  161. package/analyzer/selectors.mjs +212 -0
  162. package/catalog-projection-cli.mjs +96 -0
  163. package/catalog-projection.d.mts +55 -0
  164. package/catalog-projection.mjs +62 -0
  165. package/dist/app-tab.d.ts +39 -4
  166. package/dist/app-tab.js +2 -1
  167. package/dist/badge.d.ts +54 -0
  168. package/dist/badge.js +3 -0
  169. package/dist/badge.js.map +1 -0
  170. package/dist/browser/badge.js +3 -0
  171. package/dist/browser/catalog.js +26 -0
  172. package/dist/browser/chip.js +3 -0
  173. package/dist/browser/collapsible-panel.js +9 -0
  174. package/dist/browser/content-item.js +3 -0
  175. package/dist/browser/floating-toolbar.js +3 -0
  176. package/dist/browser/grid.js +3 -0
  177. package/dist/browser/list-action-row.js +5 -0
  178. package/dist/browser/{menu-header.js → list-header.js} +5 -3
  179. package/dist/browser/list-inset-control.js +3 -0
  180. package/dist/browser/list-inset-text.js +3 -0
  181. package/dist/browser/list-item.js +5 -0
  182. package/dist/browser/list.js +3 -0
  183. package/dist/browser/nav-stack.js +11 -0
  184. package/dist/browser/pane.js +3 -0
  185. package/dist/browser/popup-menu.js +3 -0
  186. package/dist/browser/row.js +3 -0
  187. package/dist/browser/segmented-control.js +0 -1
  188. package/dist/browser/select.js +2 -1
  189. package/dist/browser/spacer.js +3 -0
  190. package/dist/browser/split-view.js +13 -0
  191. package/dist/browser/state-banner.js +1 -0
  192. package/dist/browser/sunken-panel.js +3 -0
  193. package/dist/browser/surface-scaffold.js +3 -0
  194. package/dist/browser/tab-navigator.js +4 -0
  195. package/dist/browser/text.js +3 -0
  196. package/dist/browser/toolbar-control-group.js +1 -0
  197. package/dist/browser/workbench.js +14 -0
  198. package/dist/catalog-resources.d.ts +48 -0
  199. package/dist/catalog-resources.js +22 -0
  200. package/dist/catalog-resources.js.map +1 -0
  201. package/dist/catalog.d.ts +92 -0
  202. package/dist/catalog.js +541 -0
  203. package/dist/catalog.js.map +1 -0
  204. package/dist/chip.d.ts +36 -0
  205. package/dist/chip.js +3 -0
  206. package/dist/chip.js.map +1 -0
  207. package/dist/chunk-2GOCOLQL.js +270 -0
  208. package/dist/chunk-2GOCOLQL.js.map +1 -0
  209. package/dist/chunk-3CXRQAYT.js +288 -0
  210. package/dist/chunk-3CXRQAYT.js.map +1 -0
  211. package/dist/chunk-3RE2JMZU.js +48 -0
  212. package/dist/chunk-3RE2JMZU.js.map +1 -0
  213. package/dist/chunk-3SXWV2IR.js +295 -0
  214. package/dist/chunk-3SXWV2IR.js.map +1 -0
  215. package/dist/chunk-3XPGJUUQ.js +37 -0
  216. package/dist/chunk-3XPGJUUQ.js.map +1 -0
  217. package/dist/chunk-4Y4L5YEI.js +66 -0
  218. package/dist/chunk-4Y4L5YEI.js.map +1 -0
  219. package/dist/chunk-5BZBIRQG.js +452 -0
  220. package/dist/chunk-5BZBIRQG.js.map +1 -0
  221. package/dist/chunk-5D3WDMIK.js +71 -0
  222. package/dist/chunk-5D3WDMIK.js.map +1 -0
  223. package/dist/chunk-62VMNBV2.js +779 -0
  224. package/dist/chunk-62VMNBV2.js.map +1 -0
  225. package/dist/chunk-75I3SNUJ.js +44 -0
  226. package/dist/chunk-75I3SNUJ.js.map +1 -0
  227. package/dist/chunk-7QQ3HE47.js +17 -0
  228. package/dist/chunk-7QQ3HE47.js.map +1 -0
  229. package/dist/chunk-7TE6XDFI.js +91 -0
  230. package/dist/chunk-7TE6XDFI.js.map +1 -0
  231. package/dist/chunk-A7DYEERU.js +59 -0
  232. package/dist/chunk-A7DYEERU.js.map +1 -0
  233. package/dist/chunk-AN5IWMTM.js +24 -0
  234. package/dist/chunk-AN5IWMTM.js.map +1 -0
  235. package/dist/chunk-ARZ4RSQO.js +48 -0
  236. package/dist/chunk-ARZ4RSQO.js.map +1 -0
  237. package/dist/chunk-BJLXE56E.js +135 -0
  238. package/dist/chunk-BJLXE56E.js.map +1 -0
  239. package/dist/chunk-BYHGRKC3.js +44 -0
  240. package/dist/chunk-BYHGRKC3.js.map +1 -0
  241. package/dist/chunk-CEJ5FK6G.js +288 -0
  242. package/dist/chunk-CEJ5FK6G.js.map +1 -0
  243. package/dist/chunk-CVKIADIS.js +172 -0
  244. package/dist/chunk-CVKIADIS.js.map +1 -0
  245. package/dist/chunk-DQDTZE4W.js +70 -0
  246. package/dist/chunk-DQDTZE4W.js.map +1 -0
  247. package/dist/chunk-EFDCALR3.js +66 -0
  248. package/dist/chunk-EFDCALR3.js.map +1 -0
  249. package/dist/chunk-FL6J644M.js +116 -0
  250. package/dist/chunk-FL6J644M.js.map +1 -0
  251. package/dist/chunk-GS2QD3N7.js +14 -0
  252. package/dist/chunk-GS2QD3N7.js.map +1 -0
  253. package/dist/chunk-H45DAZBL.js +491 -0
  254. package/dist/chunk-H45DAZBL.js.map +1 -0
  255. package/dist/chunk-H7ZJEI3H.js +52 -0
  256. package/dist/chunk-H7ZJEI3H.js.map +1 -0
  257. package/dist/chunk-HFLGWMG3.js +138 -0
  258. package/dist/chunk-HFLGWMG3.js.map +1 -0
  259. package/dist/chunk-HFQDSSED.js +188 -0
  260. package/dist/chunk-HFQDSSED.js.map +1 -0
  261. package/dist/{chunk-56RJXPHG.js → chunk-I4SDIMFA.js} +7 -4
  262. package/dist/chunk-I4SDIMFA.js.map +1 -0
  263. package/dist/chunk-IM3GKYOG.js +202 -0
  264. package/dist/chunk-IM3GKYOG.js.map +1 -0
  265. package/dist/chunk-J3AWE5I4.js +50 -0
  266. package/dist/chunk-J3AWE5I4.js.map +1 -0
  267. package/dist/chunk-JOR5LGYE.js +55 -0
  268. package/dist/chunk-JOR5LGYE.js.map +1 -0
  269. package/dist/chunk-JZM3G6RT.js +149 -0
  270. package/dist/chunk-JZM3G6RT.js.map +1 -0
  271. package/dist/{chunk-7BR3DO2A.js → chunk-LAZLBC2Q.js} +14 -5
  272. package/dist/chunk-LAZLBC2Q.js.map +1 -0
  273. package/dist/chunk-LQKY5S4F.js +506 -0
  274. package/dist/chunk-LQKY5S4F.js.map +1 -0
  275. package/dist/chunk-LRAIS3YB.js +158 -0
  276. package/dist/chunk-LRAIS3YB.js.map +1 -0
  277. package/dist/chunk-MXNIVEVL.js +48 -0
  278. package/dist/chunk-MXNIVEVL.js.map +1 -0
  279. package/dist/chunk-NJZMR7HM.js +135 -0
  280. package/dist/chunk-NJZMR7HM.js.map +1 -0
  281. package/dist/chunk-NMWDHZVM.js +35 -0
  282. package/dist/chunk-NMWDHZVM.js.map +1 -0
  283. package/dist/{chunk-YGN7OMLT.js → chunk-NS2TBYM4.js} +8 -5
  284. package/dist/chunk-NS2TBYM4.js.map +1 -0
  285. package/dist/chunk-NVKRZ5DI.js +222 -0
  286. package/dist/chunk-NVKRZ5DI.js.map +1 -0
  287. package/dist/chunk-NVRJ7C3W.js +83 -0
  288. package/dist/chunk-NVRJ7C3W.js.map +1 -0
  289. package/dist/chunk-O27D24CA.js +250 -0
  290. package/dist/chunk-O27D24CA.js.map +1 -0
  291. package/dist/chunk-PQQQXJGV.js +58 -0
  292. package/dist/chunk-PQQQXJGV.js.map +1 -0
  293. package/dist/chunk-RRCD3A6G.js +139 -0
  294. package/dist/chunk-RRCD3A6G.js.map +1 -0
  295. package/dist/chunk-S3ECMF23.js +33 -0
  296. package/dist/chunk-S3ECMF23.js.map +1 -0
  297. package/dist/chunk-S4ZGTDSG.js +18 -0
  298. package/dist/chunk-S4ZGTDSG.js.map +1 -0
  299. package/dist/chunk-VHXHLZ6R.js +69 -0
  300. package/dist/chunk-VHXHLZ6R.js.map +1 -0
  301. package/dist/chunk-VIGVNDXZ.js +165 -0
  302. package/dist/chunk-VIGVNDXZ.js.map +1 -0
  303. package/dist/chunk-VR7MWD2X.js +91 -0
  304. package/dist/chunk-VR7MWD2X.js.map +1 -0
  305. package/dist/chunk-Y6KT7ZTR.js +109 -0
  306. package/dist/chunk-Y6KT7ZTR.js.map +1 -0
  307. package/dist/chunk-YLJ6X3AC.js +34 -0
  308. package/dist/chunk-YLJ6X3AC.js.map +1 -0
  309. package/dist/collapsible-panel.d.ts +137 -0
  310. package/dist/collapsible-panel.js +135 -0
  311. package/dist/collapsible-panel.js.map +1 -0
  312. package/dist/content-item.d.ts +99 -0
  313. package/dist/content-item.js +4 -0
  314. package/dist/content-item.js.map +1 -0
  315. package/dist/css-values.d.ts +112 -0
  316. package/dist/css-values.js +3 -0
  317. package/dist/css-values.js.map +1 -0
  318. package/dist/device-class.js +34 -6
  319. package/dist/device-class.js.map +1 -1
  320. package/dist/disclosure-arrow.d.ts +6 -1
  321. package/dist/disclosure-arrow.js +2 -1
  322. package/dist/empty-state.d.ts +5 -2
  323. package/dist/empty-state.js +2 -1
  324. package/dist/flex-alignment-4ms8ZbV8.d.ts +5 -0
  325. package/dist/floating-toolbar.d.ts +51 -0
  326. package/dist/floating-toolbar.js +3 -0
  327. package/dist/floating-toolbar.js.map +1 -0
  328. package/dist/grid.d.ts +57 -0
  329. package/dist/grid.js +5 -0
  330. package/dist/grid.js.map +1 -0
  331. package/dist/help-tags-register.d.ts +13 -0
  332. package/dist/help-tags-register.js +9 -0
  333. package/dist/help-tags-register.js.map +1 -0
  334. package/dist/index.d.ts +40 -18
  335. package/dist/index.js +44 -23
  336. package/dist/{menu-action-row.d.ts → list-action-row.d.ts} +21 -9
  337. package/dist/list-action-row.js +8 -0
  338. package/dist/list-action-row.js.map +1 -0
  339. package/dist/list-header.d.ts +98 -0
  340. package/dist/list-header.js +10 -0
  341. package/dist/list-header.js.map +1 -0
  342. package/dist/list-inset-control.d.ts +22 -0
  343. package/dist/list-inset-control.js +3 -0
  344. package/dist/list-inset-control.js.map +1 -0
  345. package/dist/list-inset-text.d.ts +30 -0
  346. package/dist/list-inset-text.js +4 -0
  347. package/dist/list-inset-text.js.map +1 -0
  348. package/dist/list-item.d.ts +62 -0
  349. package/dist/list-item.js +8 -0
  350. package/dist/list-item.js.map +1 -0
  351. package/dist/list.d.ts +63 -0
  352. package/dist/list.js +6 -0
  353. package/dist/list.js.map +1 -0
  354. package/dist/loading-spinner.d.ts +12 -2
  355. package/dist/loading-spinner.js +2 -1
  356. package/dist/lucide-icon.d.ts +14 -2
  357. package/dist/lucide-icon.js +2 -1
  358. package/dist/nav-stack-B1Qc2e5q.d.ts +101 -0
  359. package/dist/nav-stack.d.ts +13 -38
  360. package/dist/nav-stack.js +10 -1
  361. package/dist/pane.d.ts +116 -0
  362. package/dist/pane.js +4 -0
  363. package/dist/pane.js.map +1 -0
  364. package/dist/panel-toolbar-CL9tYOkh.d.ts +72 -0
  365. package/dist/popup-menu-register.d.ts +9 -0
  366. package/dist/popup-menu-register.js +244 -0
  367. package/dist/popup-menu-register.js.map +1 -0
  368. package/dist/popup-menu.d.ts +100 -0
  369. package/dist/popup-menu.js +3 -0
  370. package/dist/popup-menu.js.map +1 -0
  371. package/dist/resizable-region.d.ts +32 -3
  372. package/dist/resizable-region.js +1 -1
  373. package/dist/row.d.ts +48 -0
  374. package/dist/row.js +6 -0
  375. package/dist/row.js.map +1 -0
  376. package/dist/segmented-control.d.ts +12 -9
  377. package/dist/segmented-control.js +1 -2
  378. package/dist/select-register.d.ts +5 -1
  379. package/dist/select-register.js +247 -3
  380. package/dist/select-register.js.map +1 -1
  381. package/dist/select.d.ts +103 -8
  382. package/dist/select.js +3 -1
  383. package/dist/semantic-content-BbzjvSu9.d.ts +14 -0
  384. package/dist/semantic-tone-CdW013KF.d.ts +4 -0
  385. package/dist/sides-BPSWde0A.d.ts +4 -0
  386. package/dist/skeleton.d.ts +14 -7
  387. package/dist/skeleton.js +2 -1
  388. package/dist/spacer.d.ts +18 -0
  389. package/dist/spacer.js +4 -0
  390. package/dist/spacer.js.map +1 -0
  391. package/dist/split-view.d.ts +44 -7
  392. package/dist/split-view.js +124 -10
  393. package/dist/split-view.js.map +1 -1
  394. package/dist/state-banner.d.ts +21 -7
  395. package/dist/state-banner.js +3 -1
  396. package/dist/styles/app-tab.css +224 -0
  397. package/dist/styles/badge.css +118 -0
  398. package/dist/styles/catalog/components/catalog-example-stack.css +9 -0
  399. package/dist/styles/catalog/components/catalog-example.css +168 -0
  400. package/dist/styles/catalog/components/catalog-stage.css +55 -0
  401. package/dist/styles/catalog/components/catalog.css +50 -0
  402. package/dist/styles/catalog.css +5 -0
  403. package/dist/styles/chip.css +138 -0
  404. package/dist/styles/collapsible-panel.css +580 -0
  405. package/dist/styles/components/actions/floating-toolbar/floating-toolbar.css +119 -0
  406. package/dist/styles/components/actions/popup-menu/popup-menu.css +285 -0
  407. package/dist/styles/components/actions/toolbar/toolbar.css +417 -0
  408. package/dist/styles/components/actions/toolbar-control-group/toolbar-control-group.css +891 -0
  409. package/dist/styles/components/actions/toolbar-text/toolbar-text.css +171 -0
  410. package/dist/styles/components/collections/list/list.css +133 -0
  411. package/dist/styles/components/collections/list-action-row/list-action-row.css +258 -0
  412. package/dist/styles/components/collections/list-header/list-header.css +229 -0
  413. package/dist/styles/components/collections/list-inset-control/list-inset-control.css +30 -0
  414. package/dist/styles/components/collections/list-inset-text/list-inset-text.css +29 -0
  415. package/dist/styles/components/collections/list-item/list-item.css +255 -0
  416. package/dist/styles/components/data-display/value-table/value-table.css +105 -0
  417. package/dist/styles/components/feedback/badge/badge.css +118 -0
  418. package/dist/styles/components/feedback/chip/chip.css +138 -0
  419. package/dist/styles/components/feedback/empty-state/empty-state.css +47 -0
  420. package/dist/styles/components/feedback/loading-spinner/loading-spinner.css +25 -0
  421. package/dist/styles/components/feedback/skeleton/skeleton.css +92 -0
  422. package/dist/styles/components/feedback/state-banner/state-banner.css +248 -0
  423. package/dist/styles/components/forms/segmented-control/segmented-control.css +196 -0
  424. package/dist/styles/components/forms/select/select.css +454 -0
  425. package/dist/styles/components/forms/token-search-field/token-search-field.css +392 -0
  426. package/dist/styles/components/layout/collapsible-panel/collapsible-panel.css +580 -0
  427. package/dist/styles/components/layout/grid/grid.css +85 -0
  428. package/dist/styles/components/layout/pane/pane.css +294 -0
  429. package/dist/styles/components/layout/resizable-region/resizable-region.css +545 -0
  430. package/dist/styles/components/layout/row/row.css +111 -0
  431. package/dist/styles/components/layout/spacer/spacer.css +11 -0
  432. package/dist/styles/components/layout/split-view/split-view.css +146 -0
  433. package/dist/styles/components/layout/workbench/workbench.css +1075 -0
  434. package/dist/styles/components/media/lucide-icon/lucide-icon.css +15 -0
  435. package/dist/styles/components/navigation/app-tab/app-tab.css +376 -0
  436. package/dist/styles/components/navigation/disclosure-arrow/disclosure-arrow.css +23 -0
  437. package/dist/styles/components/navigation/nav-stack/nav-stack.css +242 -0
  438. package/dist/styles/components/navigation/tab-bar/tab-bar.css +183 -0
  439. package/dist/styles/components/navigation/tab-navigator/tab-navigator.css +237 -0
  440. package/dist/styles/components/surfaces/content-item/content-item.css +120 -0
  441. package/dist/styles/components/surfaces/sunken-panel/sunken-panel.css +34 -0
  442. package/dist/styles/components/surfaces/surface-scaffold/surface-scaffold.css +111 -0
  443. package/dist/styles/components/typography/text/text.css +158 -0
  444. package/dist/styles/content-item.css +120 -0
  445. package/dist/styles/document.css +33 -0
  446. package/dist/styles/floating-toolbar.css +119 -0
  447. package/dist/styles/foundation.css +187 -45
  448. package/dist/styles/grid.css +85 -0
  449. package/dist/styles/layout.css +3 -41
  450. package/dist/styles/list-action-row.css +258 -0
  451. package/dist/styles/list-header.css +229 -0
  452. package/dist/styles/list-inset-control.css +30 -0
  453. package/dist/styles/list-inset-text.css +29 -0
  454. package/dist/styles/list-item.css +255 -0
  455. package/dist/styles/list.css +133 -0
  456. package/dist/styles/loading-spinner.css +4 -0
  457. package/dist/styles/lucide-icon.css +9 -0
  458. package/dist/styles/nav-stack.css +180 -50
  459. package/dist/styles/pane.css +294 -0
  460. package/dist/styles/popup-menu.css +285 -0
  461. package/dist/styles/resizable-region.css +438 -4
  462. package/dist/styles/row.css +111 -0
  463. package/dist/styles/segmented-control.css +36 -9
  464. package/dist/styles/select.css +337 -21
  465. package/dist/styles/skeleton.css +64 -3
  466. package/dist/styles/spacer.css +11 -0
  467. package/dist/styles/split-view.css +114 -3
  468. package/dist/styles/state-banner.css +94 -19
  469. package/dist/styles/styles.css +13 -4
  470. package/dist/styles/sunken-panel.css +34 -0
  471. package/dist/styles/surface-scaffold.css +111 -0
  472. package/dist/styles/tab-bar.css +147 -9
  473. package/dist/styles/tab-navigator.css +237 -0
  474. package/dist/styles/text.css +158 -0
  475. package/dist/styles/token-search-field.css +167 -56
  476. package/dist/styles/toolbar-control-group.css +710 -30
  477. package/dist/styles/toolbar-text.css +139 -8
  478. package/dist/styles/toolbar.css +367 -11
  479. package/dist/styles/value-table.css +34 -4
  480. package/dist/styles/webawesome.css +388 -16
  481. package/dist/styles/workbench.css +988 -7
  482. package/dist/sunken-panel.d.ts +31 -0
  483. package/dist/sunken-panel.js +3 -0
  484. package/dist/sunken-panel.js.map +1 -0
  485. package/dist/surface-scaffold-register.d.ts +4 -0
  486. package/dist/surface-scaffold-register.js +59 -0
  487. package/dist/surface-scaffold-register.js.map +1 -0
  488. package/dist/surface-scaffold.d.ts +38 -0
  489. package/dist/surface-scaffold.js +3 -0
  490. package/dist/surface-scaffold.js.map +1 -0
  491. package/dist/tab-bar.d.ts +39 -6
  492. package/dist/tab-bar.js +1 -1
  493. package/dist/tab-navigator.d.ts +86 -0
  494. package/dist/tab-navigator.js +95 -0
  495. package/dist/tab-navigator.js.map +1 -0
  496. package/dist/text.d.ts +63 -0
  497. package/dist/text.js +3 -0
  498. package/dist/text.js.map +1 -0
  499. package/dist/token-search-field.d.ts +3 -43
  500. package/dist/token-search-field.js +2 -1
  501. package/dist/token-search-model-DTcTXWMS.d.ts +154 -0
  502. package/dist/token-search-model.d.ts +3 -0
  503. package/dist/token-search-model.js +3 -0
  504. package/dist/token-search-model.js.map +1 -0
  505. package/dist/toolbar-control-group.d.ts +89 -7
  506. package/dist/toolbar-control-group.js +3 -1
  507. package/dist/toolbar-text.d.ts +45 -9
  508. package/dist/toolbar-text.js +2 -1
  509. package/dist/toolbar.d.ts +59 -7
  510. package/dist/toolbar.js +1 -1
  511. package/dist/types-C9BubXfz.d.ts +117 -0
  512. package/dist/value-table.d.ts +11 -3
  513. package/dist/value-table.js +2 -1
  514. package/dist/webawesome.d.ts +8 -1
  515. package/dist/wire-catalog.d.ts +82 -0
  516. package/dist/wire-catalog.js +407 -0
  517. package/dist/wire-catalog.js.map +1 -0
  518. package/dist/wire-content-items.d.ts +11 -0
  519. package/dist/wire-content-items.js +114 -0
  520. package/dist/wire-content-items.js.map +1 -0
  521. package/dist/wire-nav-stack.d.ts +4 -1
  522. package/dist/wire-nav-stack.js +191 -15
  523. package/dist/wire-nav-stack.js.map +1 -1
  524. package/dist/wire-resizable-regions.d.ts +2 -1
  525. package/dist/wire-resizable-regions.js +2 -1
  526. package/dist/wire-scroll-dividers.d.ts +72 -0
  527. package/dist/wire-scroll-dividers.js +3 -0
  528. package/dist/wire-scroll-dividers.js.map +1 -0
  529. package/dist/wire-sidebar.d.ts +63 -0
  530. package/dist/wire-sidebar.js +231 -0
  531. package/dist/wire-sidebar.js.map +1 -0
  532. package/dist/wire-tab-bars.d.ts +19 -2
  533. package/dist/wire-tab-bars.js +1 -1
  534. package/dist/wire-tab-navigator.d.ts +11 -0
  535. package/dist/wire-tab-navigator.js +21 -0
  536. package/dist/wire-tab-navigator.js.map +1 -0
  537. package/dist/wire-token-search-fields.d.ts +65 -3
  538. package/dist/wire-token-search-fields.js +2 -1
  539. package/dist/wire-toolbar-visibility.d.ts +13 -0
  540. package/dist/wire-toolbar-visibility.js +3 -0
  541. package/dist/wire-toolbar-visibility.js.map +1 -0
  542. package/dist/wire-workbench.d.ts +116 -0
  543. package/dist/wire-workbench.js +6 -0
  544. package/dist/wire-workbench.js.map +1 -0
  545. package/dist/workbench.d.ts +246 -9
  546. package/dist/workbench.js +17 -15
  547. package/dist/workbench.js.map +1 -1
  548. package/docs/accessibility.md +497 -26
  549. package/docs/app-layouts.md +141 -10
  550. package/docs/apple-hig.md +1 -0
  551. package/docs/catalog.md +493 -0
  552. package/docs/collapsible-panel.md +382 -0
  553. package/docs/component-contract.md +736 -61
  554. package/docs/component-integration.md +75 -0
  555. package/docs/component-selection.md +617 -97
  556. package/docs/design/templates/empty-state/filtered-dark.svg +1 -0
  557. package/docs/design/templates/empty-state/filtered.svg +1 -0
  558. package/docs/design/templates/empty-state/with-action-dark.svg +1 -0
  559. package/docs/design/templates/empty-state/with-action.svg +1 -0
  560. package/docs/design/templates/empty-state-dark.svg +1 -0
  561. package/docs/design/templates/empty-state.svg +1 -0
  562. package/docs/design/templates/list/compact-dark.svg +1 -0
  563. package/docs/design/templates/list/compact.svg +1 -0
  564. package/docs/design/templates/list/stack-dark.svg +1 -0
  565. package/docs/design/templates/list/stack.svg +1 -0
  566. package/docs/design/templates/list-action-row/default-dark.svg +1 -0
  567. package/docs/design/templates/list-action-row/default.svg +1 -0
  568. package/docs/design/templates/list-action-row/selected-dark.svg +1 -0
  569. package/docs/design/templates/list-action-row/selected.svg +1 -0
  570. package/docs/design/templates/list-action-row-dark.svg +1 -0
  571. package/docs/design/templates/list-action-row.svg +1 -0
  572. package/docs/design/templates/list-dark.svg +1 -0
  573. package/docs/design/templates/list-header/action-dark.svg +1 -0
  574. package/docs/design/templates/list-header/action.svg +1 -0
  575. package/docs/design/templates/list-header/count-dark.svg +1 -0
  576. package/docs/design/templates/list-header/count.svg +1 -0
  577. package/docs/design/templates/list-header/inline-action-dark.svg +1 -0
  578. package/docs/design/templates/list-header/inline-action.svg +1 -0
  579. package/docs/design/templates/list-header/size-l-dark.svg +1 -0
  580. package/docs/design/templates/list-header/size-l.svg +1 -0
  581. package/docs/design/templates/list-header/size-m-dark.svg +1 -0
  582. package/docs/design/templates/list-header/size-m.svg +1 -0
  583. package/docs/design/templates/list-header/size-xl-dark.svg +1 -0
  584. package/docs/design/templates/list-header/size-xl.svg +1 -0
  585. package/docs/design/templates/list-header/size-xs-dark.svg +1 -0
  586. package/docs/design/templates/list-header/size-xs.svg +1 -0
  587. package/docs/design/templates/list-header/toggle-collapsed-dark.svg +1 -0
  588. package/docs/design/templates/list-header/toggle-collapsed.svg +1 -0
  589. package/docs/design/templates/list-header/toggle-expanded-dark.svg +1 -0
  590. package/docs/design/templates/list-header/toggle-expanded.svg +1 -0
  591. package/docs/design/templates/list-header-dark.svg +1 -0
  592. package/docs/design/templates/list-header.svg +1 -0
  593. package/docs/design/templates/list-item/default-dark.svg +1 -0
  594. package/docs/design/templates/list-item/default.svg +1 -0
  595. package/docs/design/templates/list-item/multiline-dark.svg +1 -0
  596. package/docs/design/templates/list-item/multiline.svg +1 -0
  597. package/docs/design/templates/list-item/selected-dark.svg +1 -0
  598. package/docs/design/templates/list-item/selected.svg +1 -0
  599. package/docs/design/templates/list-item/trailing-dark.svg +1 -0
  600. package/docs/design/templates/list-item/trailing.svg +1 -0
  601. package/docs/design/templates/list-item-dark.svg +1 -0
  602. package/docs/design/templates/list-item.svg +1 -0
  603. package/docs/design/templates/list.svg +1 -0
  604. package/docs/design/templates/segmented-control/equal-dark.svg +1 -0
  605. package/docs/design/templates/segmented-control/equal.svg +1 -0
  606. package/docs/design/templates/segmented-control/pill-small-dark.svg +1 -0
  607. package/docs/design/templates/segmented-control/pill-small.svg +1 -0
  608. package/docs/design/templates/segmented-control-dark.svg +1 -0
  609. package/docs/design/templates/segmented-control.svg +1 -0
  610. package/docs/design/templates/skeleton/avatar-dark.svg +1 -0
  611. package/docs/design/templates/skeleton/avatar.svg +1 -0
  612. package/docs/design/templates/skeleton/block-dark.svg +1 -0
  613. package/docs/design/templates/skeleton/block.svg +1 -0
  614. package/docs/design/templates/skeleton/lines-dark.svg +1 -0
  615. package/docs/design/templates/skeleton/lines.svg +1 -0
  616. package/docs/design/templates/skeleton-dark.svg +1 -0
  617. package/docs/design/templates/skeleton.svg +1 -0
  618. package/docs/design/templates/state-banner/danger-dark.svg +1 -0
  619. package/docs/design/templates/state-banner/danger.svg +1 -0
  620. package/docs/design/templates/state-banner/info-badge-dark.svg +1 -0
  621. package/docs/design/templates/state-banner/info-badge.svg +1 -0
  622. package/docs/design/templates/state-banner/info-dark.svg +1 -0
  623. package/docs/design/templates/state-banner/info.svg +1 -0
  624. package/docs/design/templates/state-banner/success-dark.svg +1 -0
  625. package/docs/design/templates/state-banner/success.svg +1 -0
  626. package/docs/design/templates/state-banner/warning-dark.svg +1 -0
  627. package/docs/design/templates/state-banner/warning.svg +1 -0
  628. package/docs/design/templates/state-banner-dark.svg +1 -0
  629. package/docs/design/templates/state-banner.svg +1 -0
  630. package/docs/design/templates/tab-bar/workspace-tabs-dark.svg +1 -0
  631. package/docs/design/templates/tab-bar/workspace-tabs.svg +1 -0
  632. package/docs/design/templates/tab-bar-dark.svg +1 -0
  633. package/docs/design/templates/tab-bar.svg +1 -0
  634. package/docs/design/templates/token-search-field/empty-dark.svg +1 -0
  635. package/docs/design/templates/token-search-field/empty.svg +1 -0
  636. package/docs/design/templates/token-search-field/tokens-dark.svg +1 -0
  637. package/docs/design/templates/token-search-field/tokens.svg +1 -0
  638. package/docs/design/templates/token-search-field-dark.svg +1 -0
  639. package/docs/design/templates/token-search-field.svg +1 -0
  640. package/docs/design/templates/toolbar/title-and-actions-dark.svg +1 -0
  641. package/docs/design/templates/toolbar/title-and-actions.svg +1 -0
  642. package/docs/design/templates/toolbar/width-visibility-320-dark.svg +1 -0
  643. package/docs/design/templates/toolbar/width-visibility-320.svg +1 -0
  644. package/docs/design/templates/toolbar/width-visibility-600-dark.svg +1 -0
  645. package/docs/design/templates/toolbar/width-visibility-600.svg +1 -0
  646. package/docs/design/templates/toolbar-control-group/borderless-single-dark.svg +1 -0
  647. package/docs/design/templates/toolbar-control-group/borderless-single.svg +1 -0
  648. package/docs/design/templates/toolbar-control-group/icon-buttons-dark.svg +1 -0
  649. package/docs/design/templates/toolbar-control-group/icon-buttons.svg +1 -0
  650. package/docs/design/templates/toolbar-control-group/icon-tile-brand-dark.svg +1 -0
  651. package/docs/design/templates/toolbar-control-group/icon-tile-brand.svg +1 -0
  652. package/docs/design/templates/toolbar-control-group/icon-tile-danger-dark.svg +1 -0
  653. package/docs/design/templates/toolbar-control-group/icon-tile-danger.svg +1 -0
  654. package/docs/design/templates/toolbar-control-group/icon-tile-neutral-dark.svg +1 -0
  655. package/docs/design/templates/toolbar-control-group/icon-tile-neutral.svg +1 -0
  656. package/docs/design/templates/toolbar-control-group/icon-tile-success-dark.svg +1 -0
  657. package/docs/design/templates/toolbar-control-group/icon-tile-success.svg +1 -0
  658. package/docs/design/templates/toolbar-control-group/icon-tile-warning-dark.svg +1 -0
  659. package/docs/design/templates/toolbar-control-group/icon-tile-warning.svg +1 -0
  660. package/docs/design/templates/toolbar-control-group/push-buttons-dark.svg +1 -0
  661. package/docs/design/templates/toolbar-control-group/push-buttons.svg +1 -0
  662. package/docs/design/templates/toolbar-control-group/with-text-dark.svg +1 -0
  663. package/docs/design/templates/toolbar-control-group/with-text.svg +1 -0
  664. package/docs/design/templates/toolbar-control-group-dark.svg +1 -0
  665. package/docs/design/templates/toolbar-control-group.svg +1 -0
  666. package/docs/design/templates/toolbar-dark.svg +1 -0
  667. package/docs/design/templates/toolbar-text/dark-tone-dark.svg +1 -0
  668. package/docs/design/templates/toolbar-text/dark-tone.svg +1 -0
  669. package/docs/design/templates/toolbar-text/default-dark.svg +1 -0
  670. package/docs/design/templates/toolbar-text/default.svg +1 -0
  671. package/docs/design/templates/toolbar-text/large-dark.svg +1 -0
  672. package/docs/design/templates/toolbar-text/large.svg +1 -0
  673. package/docs/design/templates/toolbar-text/small-dark.svg +1 -0
  674. package/docs/design/templates/toolbar-text/small.svg +1 -0
  675. package/docs/design/templates/toolbar-text-dark.svg +1 -0
  676. package/docs/design/templates/toolbar-text.svg +1 -0
  677. package/docs/design/templates/toolbar.svg +1 -0
  678. package/docs/design/templates/value-table/details-dark.svg +1 -0
  679. package/docs/design/templates/value-table/details.svg +1 -0
  680. package/docs/design/templates/value-table-dark.svg +1 -0
  681. package/docs/design/templates/value-table.svg +1 -0
  682. package/docs/design/templates.md +140 -0
  683. package/docs/design-philosophy.md +48 -20
  684. package/docs/device-class.md +10 -9
  685. package/docs/document-baseline.md +42 -0
  686. package/docs/examples/application-ui-profile.json +60 -0
  687. package/docs/examples/command-palette-adapter.tsx +69 -17
  688. package/docs/examples/component-catalog-extension.json +52 -0
  689. package/docs/examples/component-composition-extension.json +80 -0
  690. package/docs/layout.md +601 -59
  691. package/docs/nav-stack.md +154 -14
  692. package/docs/recipes.md +142 -55
  693. package/docs/split-view.md +77 -6
  694. package/docs/sunken-panel.md +93 -0
  695. package/docs/surface-scaffold.md +74 -0
  696. package/docs/tab-navigator.md +210 -0
  697. package/docs/type-contracts.md +135 -0
  698. package/docs/ui-analyzer.md +404 -0
  699. package/docs/ui-doctor.md +202 -0
  700. package/docs/ui-evaluator.md +139 -0
  701. package/docs/ux-demo.md +46 -16
  702. package/docs/webawesome-theme.md +188 -16
  703. package/docs/workbench.md +621 -12
  704. package/doctor/cli.mjs +120 -0
  705. package/doctor/component-style-checks.mjs +457 -0
  706. package/doctor/config.schema.json +94 -0
  707. package/doctor/eslint-diagnostics.d.mts +24 -0
  708. package/doctor/eslint-diagnostics.mjs +24 -0
  709. package/doctor/index.d.mts +122 -0
  710. package/doctor/index.mjs +1403 -0
  711. package/doctor/report.schema.json +118 -0
  712. package/evaluator/cli.mjs +89 -0
  713. package/evaluator/index.d.mts +90 -0
  714. package/evaluator/index.mjs +1203 -0
  715. package/evaluator/report.schema.json +152 -0
  716. package/llms.txt +510 -49
  717. package/package.json +266 -44
  718. package/scripts/component-catalog-extension-validation.mjs +28 -0
  719. package/traversal-exclusions.mjs +27 -0
  720. package/ux-demo/recipes/app-shell.tsx +205 -17
  721. package/ux-demo/recipes/collapsible-sidebar.tsx +260 -0
  722. package/ux-demo/recipes/compact-toolbar.tsx +135 -14
  723. package/ux-demo/recipes/composer-form.tsx +133 -21
  724. package/ux-demo/recipes/list-detail-dialog.tsx +286 -0
  725. package/ux-demo/recipes/list-workspace-states.tsx +183 -11
  726. package/ux-demo/recipes/loaders.ts +15 -5
  727. package/ux-demo/recipes/loading-inspector.tsx +204 -0
  728. package/ux-demo/recipes/mount-recipe.ts +28 -10
  729. package/ux-demo/recipes/navigation-sidebar.tsx +139 -13
  730. package/ux-demo/recipes/navigation-stack.tsx +81 -26
  731. package/ux-demo/recipes/types.ts +23 -2
  732. package/ux-demo/recipes/workspace-header.tsx +86 -5
  733. package/dist/browser/menu-action-row.js +0 -4
  734. package/dist/browser/menu-item.js +0 -4
  735. package/dist/browser/panel-header.js +0 -7
  736. package/dist/chunk-2RJBFNB6.js +0 -172
  737. package/dist/chunk-2RJBFNB6.js.map +0 -1
  738. package/dist/chunk-2Z5TWHKQ.js +0 -34
  739. package/dist/chunk-2Z5TWHKQ.js.map +0 -1
  740. package/dist/chunk-3YD6ZNRA.js +0 -34
  741. package/dist/chunk-3YD6ZNRA.js.map +0 -1
  742. package/dist/chunk-55DATV3A.js +0 -10
  743. package/dist/chunk-55DATV3A.js.map +0 -1
  744. package/dist/chunk-56RJXPHG.js.map +0 -1
  745. package/dist/chunk-7BR3DO2A.js.map +0 -1
  746. package/dist/chunk-7LDCTU7D.js +0 -134
  747. package/dist/chunk-7LDCTU7D.js.map +0 -1
  748. package/dist/chunk-AQNKJRFH.js +0 -79
  749. package/dist/chunk-AQNKJRFH.js.map +0 -1
  750. package/dist/chunk-B24C4A6T.js +0 -22
  751. package/dist/chunk-B24C4A6T.js.map +0 -1
  752. package/dist/chunk-BLK3UEEI.js +0 -23
  753. package/dist/chunk-BLK3UEEI.js.map +0 -1
  754. package/dist/chunk-BNQ2YDV4.js +0 -20
  755. package/dist/chunk-BNQ2YDV4.js.map +0 -1
  756. package/dist/chunk-DAFFDO33.js +0 -14
  757. package/dist/chunk-DAFFDO33.js.map +0 -1
  758. package/dist/chunk-H6URQGJI.js +0 -42
  759. package/dist/chunk-H6URQGJI.js.map +0 -1
  760. package/dist/chunk-I7INRJO4.js +0 -17
  761. package/dist/chunk-I7INRJO4.js.map +0 -1
  762. package/dist/chunk-LC3YSAZC.js +0 -39
  763. package/dist/chunk-LC3YSAZC.js.map +0 -1
  764. package/dist/chunk-M5JRI6MN.js +0 -27
  765. package/dist/chunk-M5JRI6MN.js.map +0 -1
  766. package/dist/chunk-MBR3TYNL.js +0 -14
  767. package/dist/chunk-MBR3TYNL.js.map +0 -1
  768. package/dist/chunk-MFKMHK5W.js +0 -10
  769. package/dist/chunk-MFKMHK5W.js.map +0 -1
  770. package/dist/chunk-MQIZAD4A.js +0 -227
  771. package/dist/chunk-MQIZAD4A.js.map +0 -1
  772. package/dist/chunk-PONXLV5U.js +0 -19
  773. package/dist/chunk-PONXLV5U.js.map +0 -1
  774. package/dist/chunk-RUNWEPR4.js +0 -10
  775. package/dist/chunk-RUNWEPR4.js.map +0 -1
  776. package/dist/chunk-W2FK7ZNY.js +0 -26
  777. package/dist/chunk-W2FK7ZNY.js.map +0 -1
  778. package/dist/chunk-WVPYVDXY.js +0 -15
  779. package/dist/chunk-WVPYVDXY.js.map +0 -1
  780. package/dist/chunk-YGN7OMLT.js.map +0 -1
  781. package/dist/chunk-YKUUZPED.js +0 -24
  782. package/dist/chunk-YKUUZPED.js.map +0 -1
  783. package/dist/menu-action-row.js +0 -5
  784. package/dist/menu-action-row.js.map +0 -1
  785. package/dist/menu-header.d.ts +0 -43
  786. package/dist/menu-header.js +0 -7
  787. package/dist/menu-header.js.map +0 -1
  788. package/dist/menu-item.d.ts +0 -33
  789. package/dist/menu-item.js +0 -5
  790. package/dist/menu-item.js.map +0 -1
  791. package/dist/panel-header.d.ts +0 -36
  792. package/dist/panel-header.js +0 -7
  793. package/dist/panel-header.js.map +0 -1
  794. package/dist/styles/menu-action-row.css +0 -160
  795. package/dist/styles/menu-header.css +0 -160
  796. package/dist/styles/menu-item.css +0 -123
  797. package/dist/styles/panel-header.css +0 -64
  798. package/dist/styles/tab-scaffold.css +0 -84
  799. package/dist/tab-scaffold.d.ts +0 -30
  800. package/dist/tab-scaffold.js +0 -16
  801. package/dist/tab-scaffold.js.map +0 -1
  802. package/dist/wire-tab-scaffold.d.ts +0 -11
  803. package/dist/wire-tab-scaffold.js +0 -16
  804. package/dist/wire-tab-scaffold.js.map +0 -1
  805. package/docs/tab-scaffold.md +0 -41
  806. package/ux-demo/recipes/master-detail-dialog.tsx +0 -45
  807. package/ux-demo/recipes/recipes.css +0 -355
@@ -0,0 +1,493 @@
1
+ # Catalog — a reusable component-gallery shell
2
+
3
+ `@kerfjs/ui/catalog` is an opt-in, whole-screen shell for building a **component
4
+ catalog** — the collapsible category sidebar + titled preview stage + resources
5
+ footer that the kerf UI catalog itself uses. Point it at your own components and
6
+ you get the same shell without rebuilding it. Like the app layouts, it is a
7
+ subpath-only, tree-shakeable module that adds nothing to the main barrel.
8
+
9
+ The shell is a [`Workbench`](workbench.md) built entirely from `@kerfjs/ui`
10
+ components: the sidebar is its left rail and the active entry its work area. So
11
+ the sidebar behaves like any Workbench rail — its standard toggle moves into the
12
+ entry toolbar while it is collapsed, and on a small screen (a Workbench narrower
13
+ than 704px) it overlays the stage, one tap from the entry toolbar, filling the
14
+ width less a 44px strip that closes it, instead of squeezing the stage. Pass the
15
+ app's `collapsed` signal to `wireCatalog` so that overlay closes on Escape, on a
16
+ press outside, and when an entry is chosen from it.
17
+
18
+ ```bash
19
+ npm install @kerfjs/ui # kerfjs is a peer; @kerfjs/ui/select/register is needed only if entries use `related`
20
+ ```
21
+
22
+ - `Catalog(props)` returns the shell as `SafeHtml` (a `<main class="kui-catalog">`).
23
+ It is **controlled and stateless**: your app owns the `active`, `collapsed`, and
24
+ `theme` signals and computes the preview `content` from `active` in its own
25
+ `mount()` render.
26
+ - `wireCatalog(root, options)` wires the interactions (sidebar selection, the
27
+ related-entry popup menu, the built-in sidebar filter, and the collapse/theme
28
+ toggles) with one delegated listener set and returns a disposer; it can also
29
+ mirror the active id into the URL and reveal the active sidebar row after a
30
+ controlled render.
31
+
32
+ ## What you supply
33
+
34
+ - **`sections`** — category-grouped entries: `{ category, entries: [{ id, name,
35
+ description?, tags?, resources?, related? }] }`. Each entry becomes a sidebar
36
+ `ListItem` under a `ListHeader` for its category. Short `tags` render through
37
+ the row's quiet status treatment for decision metadata such as `Discouraged`.
38
+ - **`content`** — the rendered preview for the active entry. Keep a map of `id →
39
+ () => SafeHtml` in your app and call `renderers[active]()` in your render.
40
+ - **`brand`** — `{ title, subtitle?, logoUrl? }` for the sidebar header.
41
+ - **`secondarySections`** — an optional secondary "ecosystem" group shown below the
42
+ primary sections with a quieter treatment: `{ label, sections, collapsible?,
43
+ expanded? }`. When `collapsible`, the label is a disclosure toggle controlling
44
+ `expanded` (the app owns it; wire it with `wireCatalog`'s `onToggleSecondary`).
45
+ - Optional slots: `headerActions` (extra header controls), `sidebarFooter` (extra
46
+ sidebar content), and `status` (a footer status line).
47
+
48
+ The sidebar includes a search field automatically for every Catalog consumer.
49
+ `wireCatalog` filters entry names and section headings as text is typed,
50
+ ignoring case. A heading match shows all its entries; a matching secondary
51
+ group heading searches its sections too, even while that group is collapsed.
52
+ Empty sections disappear and an empty-result message appears when nothing
53
+ matches. The query survives controlled Catalog rerenders and clears through the
54
+ search field's native clear control. Filtering does not change the selected
55
+ entry or its preview.
56
+
57
+ Per-entry `resources` render as "open in new tab" links in the footer, and
58
+ `related` renders a "Related entries" `PopupMenu` in a `single`
59
+ `ToolbarControlGroup` (grouped by each entry's `group`), so register its elements
60
+ with `@kerfjs/ui/popup-menu/register` when you use it.
61
+
62
+ ## Catalog demo authoring contract
63
+
64
+ This section is the single authoritative contract for tools and people that
65
+ author Catalog previews. The machine-readable discovery entry is
66
+ [`catalog-authoring.json`](../ai/catalog-authoring.json); exact props remain in
67
+ [`public-api-signatures-v1.md`](../ai/public-api-signatures-v1.md#kerfjsuicatalog).
68
+ The component catalog deliberately does not duplicate these rules: it describes
69
+ which component to choose, while this contract describes how to present the
70
+ chosen component.
71
+
72
+ ### Choose the demo mode
73
+
74
+ Classify every entry before rendering it:
75
+
76
+ | Entry kind | Preview purpose | Geometry overlay |
77
+ | --------------- | ------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- |
78
+ | **Component** | Show one public component, its meaningful variants, and adverse states. | `true`; the overlay inspects each selected specimen. |
79
+ | **Composition** | Show components commonly used together in one focused container or surface. | `false`; child geometry remains unmarked so the composition can be read as a whole. |
80
+ | **Recipe** | Teach the recommended production approach to a specific task, including ownership and application glue. | `false`; child geometry remains unmarked so the complete approach can be read. |
81
+
82
+ These three kinds are exhaustive. Theme/foundation showcases use a functional
83
+ category, third-party specimens use source metadata, and state galleries retain
84
+ the kind of the thing they demonstrate; none needs another demo kind.
85
+
86
+ Organize the catalog by functional group, with groups in descending product
87
+ importance. Within every group, list all component demos before all composition
88
+ demos. Order each kind by descending importance where a meaningful distinction
89
+ exists, then alphabetically by display name to break ties. Put recipes after all
90
+ component/composition groups, ordered by the same importance-then-alphabetical
91
+ rule. Treat source order as the authored importance order when no explicit rank
92
+ field exists. Show a `Composition` tag rather than repeating the word in a
93
+ composition's display name; the generic `Catalog` accepts that through the
94
+ entry's `tags` array.
95
+
96
+ Keep `geometryOverlay` present and compute it from the active entry. Do not make
97
+ it a permanent catalog-wide `true`, and do not give individual specimens their
98
+ own overlay implementation.
99
+
100
+ ### Required structure
101
+
102
+ - `Catalog` is the one shell. The app owns active-entry state and passes one
103
+ active preview through `content`.
104
+ - `CatalogExampleStack` is the group for one preview's rows. Put route/test
105
+ metadata such as `data-demo` on its rendered root through `rootAttributes`.
106
+ Pass `label` when the stack needs an accessible name: the rendered `section`
107
+ is then exposed as a named region. An unlabeled stack remains an ordinary
108
+ grouping rather than adding an unnecessary landmark.
109
+ - `CatalogExample` is one row: optional generated `ListHeader` label, optional
110
+ generated note, then one specimen or one intentionally coupled specimen
111
+ cluster. Use one row per variant/state; do not hand-author the helper's private
112
+ classes.
113
+ - Focused demos do not import local stylesheets, use inline `style`, or invent
114
+ styling-only `demo-*` classes. Prefer a public Kerf component, then a Web
115
+ Awesome surface when Kerf has no equivalent, then ordinary semantic HTML.
116
+ Use `CatalogExample.viewport` for bounded specimen width, height, frame,
117
+ surface, overflow, responsive visibility, and public custom-property values;
118
+ keep those constraints catalog-owned instead of recreating a demo stylesheet.
119
+ Component heights run `short` (220px) through `tall` (360px); frame an app
120
+ shell, whole-screen layout, or other application-sized recipe with
121
+ `height: "app"` (592px), and give its root `fill` rather than a frame `Pane`.
122
+ An app frame stands in for the screen: it is the containing block for
123
+ screen-fixed chrome, so a compact `CollapsiblePanel` overlay, its backdrop,
124
+ and restore controls dock to the frame's edges rather than the page's.
125
+ - The specimen is an immediate child of `CatalogExample`. A focused component
126
+ row should place the component root there, without a decorative card or
127
+ spacing wrapper. A composition row may place the composition root there.
128
+
129
+ Use `align="glyph"` for a bare glyph/text specimen, `align="inline-control"`
130
+ for a control whose own inline padding contributes about 8px, and
131
+ `align="text-trigger"` for a Web Awesome dropdown's text trigger whose visible
132
+ label needs an 8px inset (such as a plain `PopupMenu` trigger). The dropdown host
133
+ has no layout box, so this inset applies to its button child. Use
134
+ `align="none"` (the default) for a content item or composition that owns its
135
+ geometry.
136
+
137
+ ```tsx
138
+ import { CatalogExample, CatalogExampleStack } from "@kerfjs/ui/catalog";
139
+
140
+ const buttonPreview = (
141
+ <CatalogExampleStack
142
+ label="Button variants"
143
+ rootAttributes={{ "data-demo": "button" }}
144
+ >
145
+ <CatalogExample label="Icon" note="A bare glyph." align="glyph">
146
+ <LucideIcon icon={Plus} name="plus" />
147
+ </CatalogExample>
148
+ <CatalogExample label="Control" align="inline-control">
149
+ <SegmentedControl id="view" label="View" value="list" choices={choices} />
150
+ </CatalogExample>
151
+ <CatalogExample
152
+ label="Authoring note"
153
+ note="Explanatory chrome is not a specimen."
154
+ rootAttributes={{ "data-catalog-geometry-overlay-skip": "" }}
155
+ >
156
+ <p>Use the public helper contract.</p>
157
+ </CatalogExample>
158
+ </CatalogExampleStack>
159
+ );
160
+ ```
161
+
162
+ The overlay selects every immediate child of a `CatalogExample`; the helper
163
+ marks its generated label and note so they are excluded automatically. It does
164
+ not recursively promote a nested child to be the specimen. Outside an example
165
+ row, it selects only top-level
166
+ `[data-component]` roots in the canvas and ignores nested component descendants.
167
+ These rules keep a row's label/group scaffolding out of the measurement and make
168
+ the authored nesting determine exactly what is inspected.
169
+
170
+ ### Metadata ownership
171
+
172
+ Use `rootAttributes` on either helper for authoring metadata such as `data-demo`
173
+ or `data-catalog-geometry-overlay-skip`; the metadata lands on that helper's
174
+ rendered root. The slot accepts only `data-*` strings. Structural
175
+ `data-catalog-example`, `data-catalog-example-stack`, and `data-align` semantics
176
+ remain helper-owned and are rejected case-insensitively at runtime, including
177
+ from structurally widened or JavaScript objects. Do not copy the helpers'
178
+ private `kui-catalog-*` classes into preview markup.
179
+
180
+ The app owns entry ids, `kind`, routing, sources, relationships, and test hooks.
181
+ `Catalog.stageRootAttributes` places app-owned `data-*` state on the
182
+ catalog-owned preview stage without an extra wrapper; `data-catalog-stage`
183
+ remains protected.
184
+ The helpers own their structural markers, label/note anatomy, alignment marker,
185
+ and private classes. Component metadata such as margin/border/padding ownership
186
+ lives in `component-catalog.json`; do not infer or overwrite it from overlay
187
+ pixels.
188
+
189
+ ### Geometry overlay and legend
190
+
191
+ Pass the conditional `geometryOverlay` boolean to `Catalog`, then call
192
+ `wireCatalogGeometryOverlay(root)` once after the first render and retain its
193
+ disposer alongside `wireCatalog`'s.
194
+
195
+ | Overlay mark | Meaning | It is not |
196
+ | ----------------------- | ---------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------ |
197
+ | Orange translucent band | A positive computed margin on the selected specimen, after subtracting the helper's alignment inset. | Padding, gap, or empty content. Zero and negative margins are not drawn. |
198
+ | Accent solid edge | The selected specimen's computed border widths and radius, except `none`/`hidden` styles. | A focus ring, outline, child border, or metadata ownership claim. |
199
+ | Quiet dashed outline | The border-box bound of a transparent selected specimen with no visible border. | A real CSS border, padding edge, or proof that the specimen owns size. |
200
+
201
+ The overlay recomputes from live rendered styles when specimens resize, preview
202
+ markup changes, theme/root attributes change, or loaded/inline stylesheets
203
+ change. Component CSS is therefore the source of truth; do not duplicate margin
204
+ or border values in demo data. The overlay does not visualize padding, gaps,
205
+ negative/zero margins, scroll overflow, hit targets, or nested descendants.
206
+ Inspect computed styles and the machine-readable `geometry` metadata for those
207
+ facts. Opaque borderless specimens do not receive the dashed bound.
208
+
209
+ ```tsx
210
+ <Catalog
211
+ {...props}
212
+ geometryOverlay={activeEntry.kind === "component"}
213
+ content={renderers[active.value]()}
214
+ />
215
+ ```
216
+
217
+ Put `rootAttributes={{ "data-catalog-geometry-overlay-skip": "" }}` on a
218
+ `CatalogExample` or `CatalogExampleStack` only when that whole subtree is
219
+ explanatory chrome rather than a specimen. The marker excludes the marked root
220
+ and every descendant from selection; it does not merely hide one band. It is
221
+ normally unnecessary in a composition because the active entry already sets the
222
+ global overlay to `false`.
223
+
224
+ Use the overlay together with machine-readable geometry ownership metadata; the
225
+ overlay verifies what is rendered, while metadata tells people and AI tools
226
+ whether the component, its parent, or its children are responsible for margin,
227
+ border, and padding. Catalogs for downstream components should conform to the
228
+ [`component-catalog-extension.schema.json`](../ai/component-catalog-extension.schema.json)
229
+ contract and can start from the checked
230
+ [`component-catalog-extension.json`](./examples/component-catalog-extension.json)
231
+ example; provide those entries beside Kerf's shipped catalog to AI tools.
232
+ An extension entry may declare `uses` with direct Kerf or extension entry ids,
233
+ plus repository-relative `source` and `demoSource` paths. Keep the ids unique
234
+ and resolvable across both catalogs; paths use `/` separators and cannot
235
+ traverse outside the repository. These fields let consumer demos derive source
236
+ links and composition relationships from the catalog.
237
+
238
+ For a consumer UX demo, `@kerfjs/ui/catalog-projection` exports
239
+ `projectConsumerCatalog(extension, kerfCatalog, options)` and
240
+ `projectCatalogEntries(entries, options)`. The projection maps `purpose` to
241
+ `description`, `uses` to related-entry ids, `source` to `componentSource`, and
242
+ `demoSource` to the demo source link. It defaults the source identity to
243
+ `consumer` and category to `Application`. Explicit paths in an extension entry
244
+ take precedence over templates. Template placeholders are `{id}`, `{name}`,
245
+ `{kind}`, and `{package}`. Design templates are omitted unless configured.
246
+
247
+ The package also ships `kerf-catalog-demo` for a committed TypeScript module:
248
+
249
+ ```sh
250
+ kerf-catalog-demo --extension ai/component-catalog-extension.json \
251
+ --out ux-demo/catalog.generated.ts \
252
+ --repo-base https://github.com/acme/app/blob/main/ \
253
+ --source-template 'src/{id}.tsx' \
254
+ --demo-template 'ux-demo/demos/{id}.tsx' --write
255
+ kerf-catalog-demo --extension ai/component-catalog-extension.json \
256
+ --out ux-demo/catalog.generated.ts \
257
+ --repo-base https://github.com/acme/app/blob/main/ \
258
+ --source-template 'src/{id}.tsx' \
259
+ --demo-template 'ux-demo/demos/{id}.tsx' --check
260
+ ```
261
+
262
+ The command uses the Kerf catalog shipped with the package to resolve `uses`;
263
+ `--kerf-catalog` selects another catalog file. `--category`,
264
+ `--documentation-template`, and `--design-template` configure optional row
265
+ fields. `--check` fails if the generated file is missing or stale. The output
266
+ exports `generatedConsumerCatalog` and `catalogRepositoryBlobUrl`; the latter
267
+ is normalized to a trailing slash for source and documentation links.
268
+
269
+ ### Automated conformance and reviewed exceptions
270
+
271
+ Run `npm run check:demo-conformance` after changing a first-party demo, its
272
+ catalog kind, or the shell's overlay logic. The TypeScript-AST gate verifies
273
+ facts that source can prove without guessing at rendered intent:
274
+
275
+ - focused component routes import and use `CatalogExampleStack` and
276
+ `CatalogExample` from the public package;
277
+ - focused route metadata uses the helpers' `rootAttributes` slot, example rows
278
+ are not empty, and composition routes do not add redundant skip markers;
279
+ - every `@kerfjs/ui` import is a published package export and relative imports
280
+ do not reach into `ui/src`;
281
+ - focused demos have no relative stylesheet imports, inline style attributes,
282
+ or styling-only `demo-*`, `wa-demo-*`, and token-search class names;
283
+ - demo JSX does not copy private `kui-catalog-*` structural classes;
284
+ - recipe sources (checked by `npm run check:recipes` with the same shared
285
+ analyzer) import no stylesheet other than public `@kerfjs/ui` CSS, set no
286
+ inline style, and name only published layout and Web Awesome classes; each
287
+ recipe declares its catalog frame through an exported `presentation`; and
288
+ - the shell derives both geometry-overlay enablement and documented demo mode
289
+ from the active entry's source and kind.
290
+
291
+ The gate deliberately does not infer component ownership from arbitrary class
292
+ names, margins, borders, or nested descendants. Runtime selection and geometry
293
+ remain the browser suite's job.
294
+
295
+ A focused route may bypass the two public layout helpers only when the route's
296
+ stage geometry is itself the reviewed specimen. Add the narrow waiver to
297
+ [`catalog-conformance-exceptions.json`](../ux-demo/catalog-conformance-exceptions.json)
298
+ with the exact route, source file, stable diagnostic ids, a substantive reason,
299
+ and the reviewing `KF-*` ticket. Only helper/metadata rules are waivable;
300
+ private imports, local styling, private markup, empty examples, composition overlay drift, and
301
+ shell-mode drift always fail. The gate rejects duplicate, malformed, unused,
302
+ and stale exceptions, so delete a waiver when its route adopts the standard
303
+ helpers.
304
+
305
+ ## Selection reveal
306
+
307
+ Set `revealSelection: true` on `wireCatalog` for a long desktop sidebar. After
308
+ `onSelect` updates controlled state, the helper waits one animation frame, finds
309
+ the exact matching `data-item-id`, and scrolls it into view without changing
310
+ focus. A newer selection or disposal cancels the pending reveal. The default
311
+ media guard follows the Workbench's inline sidebar (`min-width: 44.01rem`), so a
312
+ closed phone overlay is never scrolled behind the user's back.
313
+
314
+ Pass an options object instead of `true` to customize `block`, `inline`,
315
+ `behavior`, or `media`; `media: false` deliberately enables the behavior at all
316
+ sizes. For an initial deep link that did not come through `wireCatalog`, call
317
+ `revealCatalogEntry(app, initialId, { block: "center" })` after the first mount.
318
+
319
+ ## Complete example
320
+
321
+ ```tsx
322
+ import { mount, signal, type SafeHtml } from "kerfjs";
323
+ import {
324
+ Catalog,
325
+ CatalogExample,
326
+ CatalogExampleStack,
327
+ type CatalogSection,
328
+ } from "@kerfjs/ui/catalog";
329
+ import {
330
+ revealCatalogEntry,
331
+ wireCatalog,
332
+ wireCatalogGeometryOverlay,
333
+ } from "@kerfjs/ui/wire-catalog";
334
+ // A CSS-aware (browser-condition) bundler loads the Catalog's CSS with its import.
335
+
336
+ type DemoKind = "component" | "composition";
337
+ type DemoEntry = CatalogSection["entries"][number] & { kind: DemoKind };
338
+
339
+ // 1. Describe selection and overlay mode once.
340
+ const entries: DemoEntry[] = [
341
+ {
342
+ id: "button",
343
+ name: "Button",
344
+ kind: "component",
345
+ description: "A pressable control.",
346
+ resources: [
347
+ { label: "Source", href: "/src/button.tsx", detail: "src/button.tsx" },
348
+ ],
349
+ },
350
+ {
351
+ id: "profile-form",
352
+ name: "Profile form",
353
+ kind: "composition",
354
+ description: "A labeled field and save action working together.",
355
+ },
356
+ ];
357
+ const sections: CatalogSection[] = [
358
+ {
359
+ category: "Examples",
360
+ entries: entries.map(({ kind, ...entry }) => ({
361
+ ...entry,
362
+ tags: kind === "composition" ? ["Composition"] : undefined,
363
+ })),
364
+ },
365
+ ];
366
+
367
+ // 2. Every preview uses one public group and public example rows.
368
+ const renderers: Record<string, () => SafeHtml> = {
369
+ button: () => (
370
+ <CatalogExampleStack
371
+ label="Button states"
372
+ rootAttributes={{ "data-demo": "button" }}
373
+ >
374
+ <CatalogExample label="Default" align="inline-control">
375
+ <Button label="Save" />
376
+ </CatalogExample>
377
+ <CatalogExample
378
+ label="Authoring note"
379
+ note="This explanatory row is deliberately excluded from inspection."
380
+ rootAttributes={{ "data-catalog-geometry-overlay-skip": "" }}
381
+ >
382
+ <p>The application owns product copy and actions.</p>
383
+ </CatalogExample>
384
+ </CatalogExampleStack>
385
+ ),
386
+ "profile-form": () => (
387
+ <CatalogExampleStack
388
+ label="Profile form composition"
389
+ rootAttributes={{ "data-demo": "profile-form" }}
390
+ >
391
+ <CatalogExample label="Complete composition">
392
+ <ProfileForm />
393
+ </CatalogExample>
394
+ </CatalogExampleStack>
395
+ ),
396
+ };
397
+
398
+ // 3. App-owned state (domain: which entry; transient: collapsed; global: theme).
399
+ const initial =
400
+ new URLSearchParams(location.search).get("c") ?? sections[0].entries[0].id;
401
+ const active = signal(initial);
402
+ const collapsed = signal(false);
403
+ const theme = signal<"light" | "dark">("light");
404
+ const activeEntry = () => entries.find(({ id }) => id === active.value) ?? entries[0];
405
+
406
+ const app = document.getElementById("app")!;
407
+ mount(app, () => (
408
+ <Catalog
409
+ brand={{ title: "Acme UI", subtitle: "Design system" }}
410
+ sections={sections}
411
+ active={active.value}
412
+ content={renderers[active.value]?.() ?? <></>}
413
+ collapsed={collapsed.value}
414
+ theme={theme.value}
415
+ geometryOverlay={activeEntry().kind === "component"}
416
+ />
417
+ ));
418
+
419
+ wireCatalog(app, {
420
+ onSelect: (id) => {
421
+ active.value = id;
422
+ },
423
+ onToggleSidebar: () => {
424
+ collapsed.value = !collapsed.value;
425
+ },
426
+ onToggleTheme: () => {
427
+ theme.value = theme.value === "dark" ? "light" : "dark";
428
+ document.documentElement.dataset.theme = theme.value; // apply your theme however you like
429
+ },
430
+ urlParam: "c", // mirror the active id into ?c=<id>
431
+ revealSelection: true, // reveal long desktop sidebars without moving focus
432
+ });
433
+ wireCatalogGeometryOverlay(app);
434
+
435
+ // Optional for an initial deep link whose row may start outside the viewport.
436
+ revealCatalogEntry(app, initial, { block: "center" });
437
+ ```
438
+
439
+ ## Ownership boundary
440
+
441
+ `Catalog` renders the shell; the app owns everything stateful:
442
+
443
+ - **`active`** is domain state (which entry is shown) — the app's signal, updated in
444
+ `onSelect`, read to compute `content`.
445
+ - **`collapsed`** is transient UI — the app's signal, flipped in `onToggleSidebar`.
446
+ Pass the same signal as `wireCatalog`'s `collapsed` option so the sidebar is
447
+ wired as a Workbench rail (transient on small screens, focus handed to the
448
+ relocated toggle).
449
+ - **`headerPlacement` / `footerPlacement`** choose whether the entry toolbar and
450
+ description, and the status + resource footer, stay pinned (`fixed`), scroll with
451
+ the preview (`scroll`), or stay pinned while the entry pane is tall enough and
452
+ scroll with the preview when it is short (`auto`, the default) — so a short
453
+ window or large text never squeezes the preview out.
454
+ The resource footer uses `ToolbarControlGroup overflow="wrap"`: whole links
455
+ move to another row when they do not fit, keeping Guidance and source labels
456
+ readable without horizontal scrolling.
457
+ - **`sidebar`** configures the sidebar rail — it forwards to the Workbench's left
458
+ rail: `size` (default 288px), `resizable` (`true` or `{ min, max }`),
459
+ `separator`, `collapseMotion`, `presentation`, `responsiveOverlayAt` (default
460
+ `narrow`), `compactOverlay` (default `inset`), and `toolbar` (the sidebar
461
+ header's `ToolbarConfig`). A resizable sidebar's width is app state like
462
+ `collapsed`: render your size signal as `sidebar.size` and pass the same signal
463
+ as `wireCatalog`'s `sidebarSize` (plus `sidebarStorageKey` to remember it).
464
+ - **`mainToolbar` / `footerToolbar`** take the entry toolbar's and the resource
465
+ footer toolbar's `ToolbarConfig` (`dividerSides`, `centerAlign`, `responsive`,
466
+ `responsiveAt`, `safeAreaEdges`). The defaults are a wrapping entry toolbar
467
+ and a footer toolbar that stacks at `narrow`, all without dividers of their
468
+ own: `wireCatalog` wires `wireScrollDividers`, so the shell's panes draw
469
+ their chrome dividers only while scrolled; an omitted or
470
+ `undefined` field keeps them. Configure these instead of styling the shell.
471
+ - **`theme`** is a global preference — the app's signal; `wireCatalog` only reports
472
+ the toggle, the app applies the theme (the shell reads `theme` to show the toggle's
473
+ opposite-state label). Omit `theme` to hide the toggle entirely.
474
+
475
+ ## Custom action names
476
+
477
+ The shell emits `data-action="catalog-select"` (sidebar items),
478
+ `catalog-toggle-sidebar`, and `catalog-toggle-theme`. Override them with
479
+ `selectAction` / `toggleSidebarAction` / `toggleThemeAction` on `Catalog` (and the
480
+ matching options on `wireCatalog`) if they collide with your own action table.
481
+
482
+ ## CSS
483
+
484
+ `Catalog` composes public components (`Workbench`, `Pane`, `Toolbar`, `List`,
485
+ `ListHeader`, `ListItem`, `ListInsetText`, `Text`, …) and owns only the preview stage
486
+ (the checkerboard and centered canvas), the geometry overlay, the example viewport
487
+ options, and the brand mark's size. A bundler that honors the `browser` export
488
+ condition loads the Catalog's stylesheets and those of every component it renders
489
+ internally with the `@kerfjs/ui/catalog` import alone — no dependence on which other
490
+ subpaths the app happens to import. Without that condition, import
491
+ `@kerfjs/ui/styles.css` for the whole layer, or `@kerfjs/ui/catalog.css` plus
492
+ `@kerfjs/ui/workbench.css` and each composed primitive's CSS. Like any Workbench it needs a definite containing height — the
493
+ `@kerfjs/ui/document.css` baseline's `.kui-app-root`.