@kerfjs/ui 4.5.0-beta.1 → 5.0.0-beta.100

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 (980) hide show
  1. package/README.md +461 -116
  2. package/ai/application-ui-diagnostic-ids-v1.json +23 -1
  3. package/ai/application-ui-profile-sync.cjs +21 -2
  4. package/ai/application-ui-profile.d.ts +4 -0
  5. package/ai/application-ui-profile.defaults.json +63 -8
  6. package/ai/application-ui-profile.mjs +28 -1
  7. package/ai/application-ui-profile.schema.json +10 -0
  8. package/ai/catalog-authoring.json +13 -4
  9. package/ai/catalog-authoring.schema.json +52 -8
  10. package/ai/compile-time-contracts-v1.json +63 -16
  11. package/ai/compile-time-contracts-v1.schema.json +4 -1
  12. package/ai/component-catalog-extension.schema.json +25 -0
  13. package/ai/component-catalog.json +5585 -1175
  14. package/ai/component-catalog.schema.json +78 -1
  15. package/ai/component-class-owners.cjs +83 -0
  16. package/ai/component-composition-extension.d.ts +7 -0
  17. package/ai/component-composition-extension.schema.json +7 -0
  18. package/ai/{component-catalog-v2-overrides.json → component-composition-rules.json} +281 -49
  19. package/ai/component-composition.d.ts +132 -0
  20. package/ai/component-composition.json +8729 -0
  21. package/ai/component-composition.schema.json +412 -0
  22. package/ai/components/README.md +185 -0
  23. package/ai/components/anchored-surface.md +99 -0
  24. package/ai/components/application-tabs.md +65 -0
  25. package/ai/components/badge.md +76 -0
  26. package/ai/components/chip.md +76 -0
  27. package/ai/components/choice-chips.md +87 -0
  28. package/ai/components/collapsible-panel.md +103 -0
  29. package/ai/components/column-track.md +78 -0
  30. package/ai/components/combobox.md +88 -0
  31. package/ai/components/composer.md +83 -0
  32. package/ai/components/content-item.md +98 -0
  33. package/ai/components/content-swap.md +78 -0
  34. package/ai/components/corner-status.md +88 -0
  35. package/ai/components/disclosure-arrow.md +77 -0
  36. package/ai/components/document-baseline.md +77 -0
  37. package/ai/components/edge-activity-indicator.md +81 -0
  38. package/ai/components/empty-state.md +80 -0
  39. package/ai/components/feedback.md +71 -0
  40. package/ai/components/file-picker.md +88 -0
  41. package/ai/components/floating-toolbar.md +82 -0
  42. package/ai/components/foundation.md +65 -0
  43. package/ai/components/framed-list.md +80 -0
  44. package/ai/components/grid.md +101 -0
  45. package/ai/components/headers.md +63 -0
  46. package/ai/components/icon-button.md +82 -0
  47. package/ai/components/icon-toggle-button.md +80 -0
  48. package/ai/components/layout.md +75 -0
  49. package/ai/components/list-action-row.md +108 -0
  50. package/ai/components/list-header.md +91 -0
  51. package/ai/components/list-inset-control.md +74 -0
  52. package/ai/components/list-inset-text.md +72 -0
  53. package/ai/components/list-item.md +108 -0
  54. package/ai/components/list.md +125 -0
  55. package/ai/components/loading-spinner.md +73 -0
  56. package/ai/components/lucide-icon.md +97 -0
  57. package/ai/components/nav-stack.md +115 -0
  58. package/ai/components/pane.md +115 -0
  59. package/ai/components/popup-menu.md +171 -0
  60. package/ai/components/recipe-app-shell.md +57 -0
  61. package/ai/components/recipe-collapsible-sidebar.md +57 -0
  62. package/ai/components/recipe-compact-toolbar.md +57 -0
  63. package/ai/components/recipe-composer-form.md +57 -0
  64. package/ai/components/recipe-list-detail-dialog.md +57 -0
  65. package/ai/components/recipe-list-workspace-states.md +57 -0
  66. package/ai/components/recipe-loading-inspector.md +57 -0
  67. package/ai/components/recipe-navigation-sidebar.md +57 -0
  68. package/ai/components/recipe-navigation-stack.md +57 -0
  69. package/ai/components/recipe-workspace-header.md +57 -0
  70. package/ai/components/resize.md +106 -0
  71. package/ai/components/row.md +96 -0
  72. package/ai/components/segmented-control.md +82 -0
  73. package/ai/components/select.md +116 -0
  74. package/ai/components/skeleton.md +84 -0
  75. package/ai/components/spacer.md +86 -0
  76. package/ai/components/split-button.md +80 -0
  77. package/ai/components/split-view.md +105 -0
  78. package/ai/components/state-banner.md +96 -0
  79. package/ai/components/summary-row.md +85 -0
  80. package/ai/components/sunken-panel.md +79 -0
  81. package/ai/components/surface-scaffold.md +105 -0
  82. package/ai/components/tab-bar.md +114 -0
  83. package/ai/components/tab-navigator.md +100 -0
  84. package/ai/components/tabs.md +95 -0
  85. package/ai/components/text.md +90 -0
  86. package/ai/components/token-search-field.md +107 -0
  87. package/ai/components/toolbar-control-group.md +125 -0
  88. package/ai/components/toolbar-text.md +100 -0
  89. package/ai/components/toolbar.md +103 -0
  90. package/ai/components/value-table.md +80 -0
  91. package/ai/components/wa-accordion-item.md +55 -0
  92. package/ai/components/wa-accordion.md +65 -0
  93. package/ai/components/wa-animated-image.md +55 -0
  94. package/ai/components/wa-animation.md +55 -0
  95. package/ai/components/wa-avatar.md +55 -0
  96. package/ai/components/wa-badge.md +55 -0
  97. package/ai/components/wa-breadcrumb-item.md +53 -0
  98. package/ai/components/wa-breadcrumb.md +55 -0
  99. package/ai/components/wa-button-group.md +60 -0
  100. package/ai/components/wa-button.md +59 -0
  101. package/ai/components/wa-callout.md +58 -0
  102. package/ai/components/wa-card.md +59 -0
  103. package/ai/components/wa-carousel-item.md +53 -0
  104. package/ai/components/wa-carousel.md +55 -0
  105. package/ai/components/wa-checkbox-group.md +55 -0
  106. package/ai/components/wa-checkbox.md +55 -0
  107. package/ai/components/wa-color-picker.md +55 -0
  108. package/ai/components/wa-comparison.md +55 -0
  109. package/ai/components/wa-copy-button.md +55 -0
  110. package/ai/components/wa-details.md +61 -0
  111. package/ai/components/wa-dialog.md +59 -0
  112. package/ai/components/wa-divider.md +53 -0
  113. package/ai/components/wa-drawer.md +55 -0
  114. package/ai/components/wa-dropdown-item.md +60 -0
  115. package/ai/components/wa-dropdown.md +60 -0
  116. package/ai/components/wa-format-bytes.md +53 -0
  117. package/ai/components/wa-format-date.md +53 -0
  118. package/ai/components/wa-format-number.md +53 -0
  119. package/ai/components/wa-icon.md +58 -0
  120. package/ai/components/wa-include.md +53 -0
  121. package/ai/components/wa-input.md +59 -0
  122. package/ai/components/wa-intersection-observer.md +53 -0
  123. package/ai/components/wa-known-date.md +53 -0
  124. package/ai/components/wa-markdown.md +53 -0
  125. package/ai/components/wa-mutation-observer.md +53 -0
  126. package/ai/components/wa-number-input.md +55 -0
  127. package/ai/components/wa-option.md +59 -0
  128. package/ai/components/wa-otp-input.md +53 -0
  129. package/ai/components/wa-page.md +53 -0
  130. package/ai/components/wa-pagination.md +55 -0
  131. package/ai/components/wa-popover.md +55 -0
  132. package/ai/components/wa-popup.md +53 -0
  133. package/ai/components/wa-progress-bar.md +53 -0
  134. package/ai/components/wa-progress-ring.md +53 -0
  135. package/ai/components/wa-qr-code.md +53 -0
  136. package/ai/components/wa-radio-group.md +59 -0
  137. package/ai/components/wa-radio.md +55 -0
  138. package/ai/components/wa-random-content.md +53 -0
  139. package/ai/components/wa-rating.md +55 -0
  140. package/ai/components/wa-relative-time.md +53 -0
  141. package/ai/components/wa-resize-observer.md +53 -0
  142. package/ai/components/wa-scroller.md +53 -0
  143. package/ai/components/wa-select.md +63 -0
  144. package/ai/components/wa-skeleton.md +53 -0
  145. package/ai/components/wa-slider.md +55 -0
  146. package/ai/components/wa-spinner.md +58 -0
  147. package/ai/components/wa-split-panel.md +58 -0
  148. package/ai/components/wa-switch.md +53 -0
  149. package/ai/components/wa-tab-group.md +69 -0
  150. package/ai/components/wa-tab-panel.md +60 -0
  151. package/ai/components/wa-tab.md +59 -0
  152. package/ai/components/wa-tag.md +59 -0
  153. package/ai/components/wa-textarea.md +53 -0
  154. package/ai/components/wa-time-input.md +55 -0
  155. package/ai/components/wa-toast-item.md +60 -0
  156. package/ai/components/wa-toast.md +60 -0
  157. package/ai/components/wa-tooltip.md +55 -0
  158. package/ai/components/wa-tree-item.md +55 -0
  159. package/ai/components/wa-tree.md +55 -0
  160. package/ai/components/wa-zoomable-frame.md +55 -0
  161. package/ai/components/workbench.md +120 -0
  162. package/ai/public-api-signatures-v1.md +3851 -441
  163. package/ai/skill.md +402 -70
  164. package/ai/webawesome-jsx-signatures-v1.md +9 -2
  165. package/analyzer/cli.mjs +5 -2
  166. package/analyzer/component-ownership.d.mts +72 -0
  167. package/analyzer/component-ownership.mjs +429 -0
  168. package/analyzer/index.d.mts +8 -0
  169. package/analyzer/index.mjs +1687 -49
  170. package/analyzer/loud-pairs.d.mts +49 -0
  171. package/analyzer/loud-pairs.mjs +357 -0
  172. package/analyzer/selectors.d.mts +21 -0
  173. package/analyzer/selectors.mjs +212 -0
  174. package/catalog-projection-cli.mjs +96 -0
  175. package/catalog-projection.d.mts +55 -0
  176. package/catalog-projection.mjs +62 -0
  177. package/dist/anchored-surface.d.ts +69 -0
  178. package/dist/anchored-surface.js +3 -0
  179. package/dist/anchored-surface.js.map +1 -0
  180. package/dist/app-tab.d.ts +39 -4
  181. package/dist/app-tab.js +2 -1
  182. package/dist/badge.d.ts +83 -0
  183. package/dist/badge.js +4 -0
  184. package/dist/badge.js.map +1 -0
  185. package/dist/browser/anchored-surface.js +3 -0
  186. package/dist/browser/badge.js +3 -0
  187. package/dist/browser/catalog.js +28 -0
  188. package/dist/browser/chip.js +3 -0
  189. package/dist/browser/choice-chips.js +3 -0
  190. package/dist/browser/collapsible-panel.js +9 -0
  191. package/dist/browser/column-track.js +3 -0
  192. package/dist/browser/combobox.js +3 -0
  193. package/dist/browser/composer.js +4 -0
  194. package/dist/browser/content-item.js +3 -0
  195. package/dist/browser/content-swap.js +3 -0
  196. package/dist/browser/corner-status.js +3 -0
  197. package/dist/browser/edge-activity-indicator.js +3 -0
  198. package/dist/browser/file-picker.js +3 -0
  199. package/dist/browser/framed-list.js +3 -0
  200. package/dist/browser/grid.js +3 -0
  201. package/dist/browser/icon-button.js +4 -0
  202. package/dist/browser/icon-toggle-button.js +4 -0
  203. package/dist/browser/list-action-row.js +2 -0
  204. package/dist/browser/list-header.js +3 -1
  205. package/dist/browser/list-item.js +1 -0
  206. package/dist/browser/nav-stack.js +11 -0
  207. package/dist/browser/popup-menu.js +3 -0
  208. package/dist/browser/row.js +3 -0
  209. package/dist/browser/segmented-control.js +0 -1
  210. package/dist/browser/select.js +2 -1
  211. package/dist/browser/spacer.js +3 -0
  212. package/dist/browser/split-button.js +5 -0
  213. package/dist/browser/split-view.js +13 -0
  214. package/dist/browser/state-banner.js +1 -0
  215. package/dist/browser/summary-row.js +3 -0
  216. package/dist/browser/surface-scaffold.js +3 -0
  217. package/dist/browser/tab-navigator.js +4 -0
  218. package/dist/browser/text.js +3 -0
  219. package/dist/browser/toolbar-control-group.js +1 -0
  220. package/dist/browser/workbench.js +14 -0
  221. package/dist/catalog-resources.d.ts +17 -1
  222. package/dist/catalog-resources.js +5 -5
  223. package/dist/catalog-resources.js.map +1 -1
  224. package/dist/catalog.d.ts +123 -121
  225. package/dist/catalog.js +598 -269
  226. package/dist/catalog.js.map +1 -1
  227. package/dist/chip.d.ts +69 -0
  228. package/dist/chip.js +3 -0
  229. package/dist/chip.js.map +1 -0
  230. package/dist/choice-chips.d.ts +82 -0
  231. package/dist/choice-chips.js +3 -0
  232. package/dist/choice-chips.js.map +1 -0
  233. package/dist/chunk-2GOCOLQL.js +270 -0
  234. package/dist/chunk-2GOCOLQL.js.map +1 -0
  235. package/dist/chunk-2MSPNRWJ.js +82 -0
  236. package/dist/chunk-2MSPNRWJ.js.map +1 -0
  237. package/dist/chunk-34U4ANDJ.js +119 -0
  238. package/dist/chunk-34U4ANDJ.js.map +1 -0
  239. package/dist/chunk-3GLYIIFR.js +230 -0
  240. package/dist/chunk-3GLYIIFR.js.map +1 -0
  241. package/dist/{chunk-Y6LYKFXY.js → chunk-3VXDSIBJ.js} +7 -4
  242. package/dist/chunk-3VXDSIBJ.js.map +1 -0
  243. package/dist/chunk-3WYREXW4.js +120 -0
  244. package/dist/chunk-3WYREXW4.js.map +1 -0
  245. package/dist/chunk-4UB5Z3ZZ.js +68 -0
  246. package/dist/chunk-4UB5Z3ZZ.js.map +1 -0
  247. package/dist/chunk-6C6DLP3W.js +31 -0
  248. package/dist/chunk-6C6DLP3W.js.map +1 -0
  249. package/dist/chunk-7IUEBNCO.js +108 -0
  250. package/dist/chunk-7IUEBNCO.js.map +1 -0
  251. package/dist/{chunk-QO55FN2Y.js → chunk-AN5IWMTM.js} +7 -3
  252. package/dist/chunk-AN5IWMTM.js.map +1 -0
  253. package/dist/chunk-AV7CPAPT.js +82 -0
  254. package/dist/chunk-AV7CPAPT.js.map +1 -0
  255. package/dist/{chunk-PX3YSS5C.js → chunk-B53PS2LE.js} +5 -3
  256. package/dist/chunk-B53PS2LE.js.map +1 -0
  257. package/dist/chunk-CA7LNX3J.js +44 -0
  258. package/dist/chunk-CA7LNX3J.js.map +1 -0
  259. package/dist/chunk-CEJ5FK6G.js +288 -0
  260. package/dist/chunk-CEJ5FK6G.js.map +1 -0
  261. package/dist/chunk-CMETHPKR.js +175 -0
  262. package/dist/chunk-CMETHPKR.js.map +1 -0
  263. package/dist/chunk-CMLPFIC5.js +46 -0
  264. package/dist/chunk-CMLPFIC5.js.map +1 -0
  265. package/dist/{chunk-RKVQEH4J.js → chunk-CVD5IZGB.js} +10 -5
  266. package/dist/chunk-CVD5IZGB.js.map +1 -0
  267. package/dist/chunk-CXZXHZTR.js +514 -0
  268. package/dist/chunk-CXZXHZTR.js.map +1 -0
  269. package/dist/chunk-D5RGM3XA.js +38 -0
  270. package/dist/chunk-D5RGM3XA.js.map +1 -0
  271. package/dist/{chunk-KWWR5VMS.js → chunk-DZJ4GBSP.js} +19 -5
  272. package/dist/chunk-DZJ4GBSP.js.map +1 -0
  273. package/dist/chunk-EIET4QLK.js +51 -0
  274. package/dist/chunk-EIET4QLK.js.map +1 -0
  275. package/dist/chunk-ELCMSQNJ.js +49 -0
  276. package/dist/chunk-ELCMSQNJ.js.map +1 -0
  277. package/dist/chunk-EOO6PYGF.js +162 -0
  278. package/dist/chunk-EOO6PYGF.js.map +1 -0
  279. package/dist/chunk-ETCWQLJV.js +85 -0
  280. package/dist/chunk-ETCWQLJV.js.map +1 -0
  281. package/dist/chunk-FDZNYD4C.js +138 -0
  282. package/dist/chunk-FDZNYD4C.js.map +1 -0
  283. package/dist/chunk-FR76ZJQC.js +90 -0
  284. package/dist/chunk-FR76ZJQC.js.map +1 -0
  285. package/dist/chunk-G3J7JDP6.js +29 -0
  286. package/dist/chunk-G3J7JDP6.js.map +1 -0
  287. package/dist/chunk-GS2QD3N7.js +14 -0
  288. package/dist/chunk-GS2QD3N7.js.map +1 -0
  289. package/dist/chunk-HGV7J4T6.js +86 -0
  290. package/dist/chunk-HGV7J4T6.js.map +1 -0
  291. package/dist/chunk-HLDRH23D.js +84 -0
  292. package/dist/chunk-HLDRH23D.js.map +1 -0
  293. package/dist/chunk-HQZYKJ56.js +302 -0
  294. package/dist/chunk-HQZYKJ56.js.map +1 -0
  295. package/dist/chunk-HZPHCSCS.js +95 -0
  296. package/dist/chunk-HZPHCSCS.js.map +1 -0
  297. package/dist/chunk-IKS72C6P.js +53 -0
  298. package/dist/chunk-IKS72C6P.js.map +1 -0
  299. package/dist/chunk-IM3GKYOG.js +202 -0
  300. package/dist/chunk-IM3GKYOG.js.map +1 -0
  301. package/dist/{chunk-JRKSK2HX.js → chunk-INI4WDWC.js} +53 -7
  302. package/dist/chunk-INI4WDWC.js.map +1 -0
  303. package/dist/chunk-IQSRHXZR.js +164 -0
  304. package/dist/chunk-IQSRHXZR.js.map +1 -0
  305. package/dist/{chunk-M7JBER5U.js → chunk-JOR5LGYE.js} +18 -4
  306. package/dist/chunk-JOR5LGYE.js.map +1 -0
  307. package/dist/chunk-K4AT3V3J.js +545 -0
  308. package/dist/chunk-K4AT3V3J.js.map +1 -0
  309. package/dist/chunk-KCS6NJ3O.js +82 -0
  310. package/dist/chunk-KCS6NJ3O.js.map +1 -0
  311. package/dist/{chunk-SRSJO5QE.js → chunk-KH4KEMSP.js} +34 -3
  312. package/dist/chunk-KH4KEMSP.js.map +1 -0
  313. package/dist/chunk-LL45C7BB.js +122 -0
  314. package/dist/chunk-LL45C7BB.js.map +1 -0
  315. package/dist/chunk-LOSRXZAH.js +100 -0
  316. package/dist/chunk-LOSRXZAH.js.map +1 -0
  317. package/dist/{chunk-7KEUJIIC.js → chunk-MF6ZUUJZ.js} +93 -11
  318. package/dist/chunk-MF6ZUUJZ.js.map +1 -0
  319. package/dist/chunk-MHMWQ7RB.js +19 -0
  320. package/dist/chunk-MHMWQ7RB.js.map +1 -0
  321. package/dist/chunk-MJ5RU6XT.js +173 -0
  322. package/dist/chunk-MJ5RU6XT.js.map +1 -0
  323. package/dist/chunk-MXNIVEVL.js +48 -0
  324. package/dist/chunk-MXNIVEVL.js.map +1 -0
  325. package/dist/{chunk-IJBSZ4NX.js → chunk-NS2TBYM4.js} +8 -5
  326. package/dist/chunk-NS2TBYM4.js.map +1 -0
  327. package/dist/chunk-PIVY32AE.js +140 -0
  328. package/dist/chunk-PIVY32AE.js.map +1 -0
  329. package/dist/chunk-PYBBYSZ3.js +526 -0
  330. package/dist/chunk-PYBBYSZ3.js.map +1 -0
  331. package/dist/chunk-QDSZTQXL.js +28 -0
  332. package/dist/chunk-QDSZTQXL.js.map +1 -0
  333. package/dist/chunk-QH5KOFNS.js +39 -0
  334. package/dist/chunk-QH5KOFNS.js.map +1 -0
  335. package/dist/chunk-QIG4IGUP.js +139 -0
  336. package/dist/chunk-QIG4IGUP.js.map +1 -0
  337. package/dist/chunk-QLA25V2K.js +493 -0
  338. package/dist/chunk-QLA25V2K.js.map +1 -0
  339. package/dist/chunk-QROYYGWU.js +52 -0
  340. package/dist/chunk-QROYYGWU.js.map +1 -0
  341. package/dist/chunk-QYMJHS4K.js +36 -0
  342. package/dist/chunk-QYMJHS4K.js.map +1 -0
  343. package/dist/chunk-RHD7RKGI.js +176 -0
  344. package/dist/chunk-RHD7RKGI.js.map +1 -0
  345. package/dist/chunk-S2XULQEK.js +52 -0
  346. package/dist/chunk-S2XULQEK.js.map +1 -0
  347. package/dist/{chunk-LPOMRC4C.js → chunk-S3ECMF23.js} +11 -3
  348. package/dist/chunk-S3ECMF23.js.map +1 -0
  349. package/dist/chunk-S4Y3YTAI.js +35 -0
  350. package/dist/chunk-S4Y3YTAI.js.map +1 -0
  351. package/dist/chunk-S4ZGTDSG.js +18 -0
  352. package/dist/chunk-S4ZGTDSG.js.map +1 -0
  353. package/dist/{chunk-PSKN344N.js → chunk-T4WJ5VGP.js} +63 -12
  354. package/dist/chunk-T4WJ5VGP.js.map +1 -0
  355. package/dist/chunk-TDMHA7C3.js +251 -0
  356. package/dist/chunk-TDMHA7C3.js.map +1 -0
  357. package/dist/{chunk-Y45PPBDV.js → chunk-TGLUDQP2.js} +47 -14
  358. package/dist/chunk-TGLUDQP2.js.map +1 -0
  359. package/dist/chunk-TLMMFQWM.js +222 -0
  360. package/dist/chunk-TLMMFQWM.js.map +1 -0
  361. package/dist/chunk-U6QYTMDB.js +85 -0
  362. package/dist/chunk-U6QYTMDB.js.map +1 -0
  363. package/dist/chunk-UMKV7YVQ.js +20 -0
  364. package/dist/chunk-UMKV7YVQ.js.map +1 -0
  365. package/dist/chunk-VFYO3UGZ.js +45 -0
  366. package/dist/chunk-VFYO3UGZ.js.map +1 -0
  367. package/dist/chunk-W4IK7AWD.js +73 -0
  368. package/dist/chunk-W4IK7AWD.js.map +1 -0
  369. package/dist/chunk-WVS6CUCT.js +48 -0
  370. package/dist/chunk-WVS6CUCT.js.map +1 -0
  371. package/dist/chunk-Y6KT7ZTR.js +109 -0
  372. package/dist/chunk-Y6KT7ZTR.js.map +1 -0
  373. package/dist/chunk-YMUIQRWK.js +44 -0
  374. package/dist/chunk-YMUIQRWK.js.map +1 -0
  375. package/dist/chunk-YOA5W5ZH.js +807 -0
  376. package/dist/chunk-YOA5W5ZH.js.map +1 -0
  377. package/dist/chunk-YQ2AC4E2.js +59 -0
  378. package/dist/chunk-YQ2AC4E2.js.map +1 -0
  379. package/dist/chunk-ZKKO4MHC.js +25 -0
  380. package/dist/chunk-ZKKO4MHC.js.map +1 -0
  381. package/dist/chunk-ZNROKDSZ.js +54 -0
  382. package/dist/chunk-ZNROKDSZ.js.map +1 -0
  383. package/dist/collapsible-panel.d.ts +96 -17
  384. package/dist/collapsible-panel.js +104 -27
  385. package/dist/collapsible-panel.js.map +1 -1
  386. package/dist/column-track.d.ts +41 -0
  387. package/dist/column-track.js +4 -0
  388. package/dist/column-track.js.map +1 -0
  389. package/dist/combobox.d.ts +40 -0
  390. package/dist/combobox.js +3 -0
  391. package/dist/combobox.js.map +1 -0
  392. package/dist/composer.d.ts +62 -0
  393. package/dist/composer.js +5 -0
  394. package/dist/composer.js.map +1 -0
  395. package/dist/content-item.d.ts +116 -0
  396. package/dist/content-item.js +4 -0
  397. package/dist/content-item.js.map +1 -0
  398. package/dist/content-swap.d.ts +34 -0
  399. package/dist/content-swap.js +3 -0
  400. package/dist/content-swap.js.map +1 -0
  401. package/dist/corner-status.d.ts +36 -0
  402. package/dist/corner-status.js +3 -0
  403. package/dist/corner-status.js.map +1 -0
  404. package/dist/css-values.d.ts +127 -0
  405. package/dist/css-values.js +3 -0
  406. package/dist/css-values.js.map +1 -0
  407. package/dist/device-class.js +1 -1
  408. package/dist/device-class.js.map +1 -1
  409. package/dist/disclosure-arrow.d.ts +6 -1
  410. package/dist/disclosure-arrow.js +2 -1
  411. package/dist/edge-activity-indicator.d.ts +28 -0
  412. package/dist/edge-activity-indicator.js +3 -0
  413. package/dist/edge-activity-indicator.js.map +1 -0
  414. package/dist/empty-state.d.ts +5 -2
  415. package/dist/empty-state.js +2 -1
  416. package/dist/extension-attributes-mu8MFUl0.d.ts +13 -0
  417. package/dist/file-picker.d.ts +47 -0
  418. package/dist/file-picker.js +3 -0
  419. package/dist/file-picker.js.map +1 -0
  420. package/dist/flex-alignment-4ms8ZbV8.d.ts +5 -0
  421. package/dist/floating-toolbar.d.ts +29 -6
  422. package/dist/floating-toolbar.js +1 -1
  423. package/dist/framed-list.d.ts +47 -0
  424. package/dist/framed-list.js +4 -0
  425. package/dist/framed-list.js.map +1 -0
  426. package/dist/grid.d.ts +58 -0
  427. package/dist/grid.js +6 -0
  428. package/dist/grid.js.map +1 -0
  429. package/dist/help-tags-register.d.ts +13 -0
  430. package/dist/help-tags-register.js +9 -0
  431. package/dist/help-tags-register.js.map +1 -0
  432. package/dist/icon-button.d.ts +46 -0
  433. package/dist/icon-button.js +6 -0
  434. package/dist/icon-button.js.map +1 -0
  435. package/dist/icon-toggle-button.d.ts +42 -0
  436. package/dist/icon-toggle-button.js +6 -0
  437. package/dist/icon-toggle-button.js.map +1 -0
  438. package/dist/index.d.ts +59 -20
  439. package/dist/index.js +66 -29
  440. package/dist/list-action-row.d.ts +69 -12
  441. package/dist/list-action-row.js +5 -1
  442. package/dist/list-header.d.ts +36 -2
  443. package/dist/list-header.js +4 -1
  444. package/dist/list-icon-tile-B8dr97OW.d.ts +18 -0
  445. package/dist/list-inset-control.d.ts +10 -4
  446. package/dist/list-inset-control.js +1 -1
  447. package/dist/list-inset-text.d.ts +17 -12
  448. package/dist/list-inset-text.js +2 -1
  449. package/dist/list-item.d.ts +49 -5
  450. package/dist/list-item.js +4 -1
  451. package/dist/list.d.ts +121 -12
  452. package/dist/list.js +5 -1
  453. package/dist/loading-spinner.d.ts +12 -2
  454. package/dist/loading-spinner.js +2 -1
  455. package/dist/lucide-icon.d.ts +15 -3
  456. package/dist/lucide-icon.js +2 -1
  457. package/dist/nav-stack-VXTumzKa.d.ts +158 -0
  458. package/dist/nav-stack.d.ts +15 -38
  459. package/dist/nav-stack.js +13 -1
  460. package/dist/pane.d.ts +111 -7
  461. package/dist/pane.js +2 -1
  462. package/dist/panel-toolbar-vg6Ir5Dy.d.ts +77 -0
  463. package/dist/popup-menu-register.d.ts +10 -0
  464. package/dist/popup-menu-register.js +336 -0
  465. package/dist/popup-menu-register.js.map +1 -0
  466. package/dist/popup-menu.d.ts +125 -0
  467. package/dist/popup-menu.js +3 -0
  468. package/dist/popup-menu.js.map +1 -0
  469. package/dist/resizable-region.d.ts +32 -3
  470. package/dist/resizable-region.js +1 -1
  471. package/dist/row.d.ts +53 -0
  472. package/dist/row.js +7 -0
  473. package/dist/row.js.map +1 -0
  474. package/dist/scroll-clearance-BikHljTc.d.ts +14 -0
  475. package/dist/segmented-control.d.ts +7 -4
  476. package/dist/segmented-control.js +1 -2
  477. package/dist/select-register.js +255 -3
  478. package/dist/select-register.js.map +1 -1
  479. package/dist/select.d.ts +95 -6
  480. package/dist/select.js +4 -1
  481. package/dist/semantic-content-BbzjvSu9.d.ts +14 -0
  482. package/dist/semantic-tone-CdW013KF.d.ts +4 -0
  483. package/dist/sides-BPSWde0A.d.ts +4 -0
  484. package/dist/skeleton.d.ts +14 -7
  485. package/dist/skeleton.js +2 -1
  486. package/dist/spacer.d.ts +18 -0
  487. package/dist/spacer.js +4 -0
  488. package/dist/spacer.js.map +1 -0
  489. package/dist/split-button.d.ts +57 -0
  490. package/dist/split-button.js +7 -0
  491. package/dist/split-button.js.map +1 -0
  492. package/dist/split-view.d.ts +63 -6
  493. package/dist/split-view.js +88 -9
  494. package/dist/split-view.js.map +1 -1
  495. package/dist/state-banner.d.ts +37 -6
  496. package/dist/state-banner.js +4 -1
  497. package/dist/styles/anchored-surface.css +41 -0
  498. package/dist/styles/app-tab.css +232 -0
  499. package/dist/styles/badge.css +145 -0
  500. package/dist/styles/catalog/components/catalog-example-stack.css +14 -0
  501. package/dist/styles/catalog/components/catalog-example.css +204 -0
  502. package/dist/styles/catalog/components/catalog-stage.css +61 -0
  503. package/dist/styles/catalog/components/catalog.css +26 -0
  504. package/dist/styles/catalog.css +5 -575
  505. package/dist/styles/chip.css +208 -0
  506. package/dist/styles/choice-chips.css +154 -0
  507. package/dist/styles/collapsible-panel.css +450 -16
  508. package/dist/styles/column-track.css +57 -0
  509. package/dist/styles/combobox.css +113 -0
  510. package/dist/styles/components/actions/floating-toolbar/floating-toolbar.css +119 -0
  511. package/dist/styles/components/actions/icon-button/icon-button.css +22 -0
  512. package/dist/styles/components/actions/icon-toggle-button/icon-toggle-button.css +83 -0
  513. package/dist/styles/components/actions/popup-menu/popup-menu.css +370 -0
  514. package/dist/styles/components/actions/split-button/split-button.css +95 -0
  515. package/dist/styles/components/actions/toolbar/toolbar.css +443 -0
  516. package/dist/styles/components/actions/toolbar-control-group/toolbar-control-group.css +1069 -0
  517. package/dist/styles/components/actions/toolbar-text/toolbar-text.css +269 -0
  518. package/dist/styles/components/collections/framed-list/framed-list.css +47 -0
  519. package/dist/styles/components/collections/list/list.css +250 -0
  520. package/dist/styles/components/collections/list-action-row/list-action-row.css +466 -0
  521. package/dist/styles/components/collections/list-header/list-header.css +229 -0
  522. package/dist/styles/components/collections/list-inset-control/list-inset-control.css +30 -0
  523. package/dist/styles/components/collections/list-inset-text/list-inset-text.css +29 -0
  524. package/dist/styles/components/collections/list-item/list-item.css +461 -0
  525. package/dist/styles/components/collections/summary-row/summary-row.css +161 -0
  526. package/dist/styles/components/data-display/value-table/value-table.css +183 -0
  527. package/dist/styles/components/feedback/anchored-surface/anchored-surface.css +41 -0
  528. package/dist/styles/components/feedback/badge/badge.css +145 -0
  529. package/dist/styles/components/feedback/chip/chip.css +208 -0
  530. package/dist/styles/components/feedback/corner-status/corner-status.css +60 -0
  531. package/dist/styles/components/feedback/edge-activity-indicator/edge-activity-indicator.css +127 -0
  532. package/dist/styles/components/feedback/empty-state/empty-state.css +47 -0
  533. package/dist/styles/components/feedback/loading-spinner/loading-spinner.css +25 -0
  534. package/dist/styles/components/feedback/skeleton/skeleton.css +92 -0
  535. package/dist/styles/components/feedback/state-banner/state-banner.css +297 -0
  536. package/dist/styles/components/forms/choice-chips/choice-chips.css +154 -0
  537. package/dist/styles/components/forms/combobox/combobox.css +113 -0
  538. package/dist/styles/components/forms/composer/composer.css +100 -0
  539. package/dist/styles/components/forms/file-picker/file-picker.css +81 -0
  540. package/dist/styles/components/forms/segmented-control/segmented-control.css +196 -0
  541. package/dist/styles/components/forms/select/select.css +455 -0
  542. package/dist/styles/components/forms/token-search-field/token-search-field.css +432 -0
  543. package/dist/styles/components/layout/collapsible-panel/collapsible-panel.css +580 -0
  544. package/dist/styles/components/layout/column-track/column-track.css +57 -0
  545. package/dist/styles/components/layout/content-swap/content-swap.css +154 -0
  546. package/dist/styles/components/layout/grid/grid.css +88 -0
  547. package/dist/styles/components/layout/pane/pane.css +382 -0
  548. package/dist/styles/components/layout/resizable-region/resizable-region.css +545 -0
  549. package/dist/styles/components/layout/row/row.css +114 -0
  550. package/dist/styles/components/layout/spacer/spacer.css +11 -0
  551. package/dist/styles/components/layout/split-view/split-view.css +146 -0
  552. package/dist/styles/components/layout/workbench/workbench.css +1086 -0
  553. package/dist/styles/components/media/lucide-icon/lucide-icon.css +15 -0
  554. package/dist/styles/components/navigation/app-tab/app-tab.css +384 -0
  555. package/dist/styles/components/navigation/disclosure-arrow/disclosure-arrow.css +23 -0
  556. package/dist/styles/components/navigation/nav-stack/nav-stack.css +342 -0
  557. package/dist/styles/components/navigation/tab-bar/tab-bar.css +197 -0
  558. package/dist/styles/components/navigation/tab-navigator/tab-navigator.css +325 -0
  559. package/dist/styles/components/surfaces/content-item/content-item.css +138 -0
  560. package/dist/styles/components/surfaces/sunken-panel/sunken-panel.css +31 -0
  561. package/dist/styles/components/surfaces/surface-scaffold/surface-scaffold.css +425 -0
  562. package/dist/styles/components/typography/text/text.css +220 -0
  563. package/dist/styles/composer.css +100 -0
  564. package/dist/styles/content-item.css +138 -0
  565. package/dist/styles/content-swap.css +154 -0
  566. package/dist/styles/corner-status.css +60 -0
  567. package/dist/styles/document.css +98 -0
  568. package/dist/styles/edge-activity-indicator.css +127 -0
  569. package/dist/styles/file-picker.css +81 -0
  570. package/dist/styles/floating-toolbar.css +87 -6
  571. package/dist/styles/foundation.css +254 -53
  572. package/dist/styles/framed-list.css +47 -0
  573. package/dist/styles/grid.css +88 -0
  574. package/dist/styles/icon-button.css +22 -0
  575. package/dist/styles/icon-toggle-button.css +83 -0
  576. package/dist/styles/layout.css +1 -21
  577. package/dist/styles/list-action-row.css +323 -17
  578. package/dist/styles/list-header.css +128 -59
  579. package/dist/styles/list-inset-control.css +25 -2
  580. package/dist/styles/list-inset-text.css +27 -12
  581. package/dist/styles/list-item.css +371 -33
  582. package/dist/styles/list.css +214 -7
  583. package/dist/styles/loading-spinner.css +4 -0
  584. package/dist/styles/lucide-icon.css +9 -0
  585. package/dist/styles/nav-stack.css +280 -49
  586. package/dist/styles/pane.css +322 -2
  587. package/dist/styles/popup-menu.css +370 -0
  588. package/dist/styles/resizable-region.css +438 -4
  589. package/dist/styles/row.css +114 -0
  590. package/dist/styles/segmented-control.css +34 -3
  591. package/dist/styles/select.css +338 -23
  592. package/dist/styles/skeleton.css +64 -3
  593. package/dist/styles/spacer.css +11 -0
  594. package/dist/styles/split-button.css +95 -0
  595. package/dist/styles/split-view.css +114 -3
  596. package/dist/styles/state-banner.css +141 -42
  597. package/dist/styles/styles.css +22 -1
  598. package/dist/styles/summary-row.css +161 -0
  599. package/dist/styles/sunken-panel.css +13 -4
  600. package/dist/styles/surface-scaffold.css +425 -0
  601. package/dist/styles/tab-bar.css +161 -9
  602. package/dist/styles/tab-navigator.css +325 -0
  603. package/dist/styles/text.css +220 -0
  604. package/dist/styles/token-search-field.css +202 -59
  605. package/dist/styles/toolbar-control-group.css +886 -42
  606. package/dist/styles/toolbar-text.css +184 -7
  607. package/dist/styles/toolbar.css +363 -17
  608. package/dist/styles/value-table.css +115 -7
  609. package/dist/styles/webawesome.css +282 -20
  610. package/dist/styles/workbench.css +999 -7
  611. package/dist/summary-row.d.ts +56 -0
  612. package/dist/summary-row.js +4 -0
  613. package/dist/summary-row.js.map +1 -0
  614. package/dist/sunken-panel.d.ts +23 -4
  615. package/dist/sunken-panel.js +2 -1
  616. package/dist/surface-scaffold-register.d.ts +9 -0
  617. package/dist/surface-scaffold-register.js +151 -0
  618. package/dist/surface-scaffold-register.js.map +1 -0
  619. package/dist/surface-scaffold.d.ts +170 -0
  620. package/dist/surface-scaffold.js +4 -0
  621. package/dist/surface-scaffold.js.map +1 -0
  622. package/dist/tab-bar.d.ts +31 -6
  623. package/dist/tab-bar.js +1 -1
  624. package/dist/tab-navigator.d.ts +114 -0
  625. package/dist/tab-navigator.js +102 -0
  626. package/dist/tab-navigator.js.map +1 -0
  627. package/dist/text.d.ts +98 -0
  628. package/dist/text.js +3 -0
  629. package/dist/text.js.map +1 -0
  630. package/dist/token-search-field.d.ts +3 -59
  631. package/dist/token-search-field.js +2 -1
  632. package/dist/token-search-model-aYR0YAei.d.ts +184 -0
  633. package/dist/token-search-model.d.ts +3 -0
  634. package/dist/token-search-model.js +3 -0
  635. package/dist/token-search-model.js.map +1 -0
  636. package/dist/toolbar-control-group.d.ts +87 -4
  637. package/dist/toolbar-control-group.js +3 -1
  638. package/dist/toolbar-text.d.ts +46 -12
  639. package/dist/toolbar-text.js +2 -1
  640. package/dist/toolbar.d.ts +71 -9
  641. package/dist/toolbar.js +1 -1
  642. package/dist/types-CVgIwSdq.d.ts +189 -0
  643. package/dist/value-table.d.ts +30 -4
  644. package/dist/value-table.js +2 -1
  645. package/dist/webawesome.d.ts +8 -1
  646. package/dist/wire-catalog.d.ts +88 -13
  647. package/dist/wire-catalog.js +240 -206
  648. package/dist/wire-catalog.js.map +1 -1
  649. package/dist/wire-comboboxes.d.ts +26 -0
  650. package/dist/wire-comboboxes.js +3 -0
  651. package/dist/wire-comboboxes.js.map +1 -0
  652. package/dist/wire-composers.d.ts +16 -0
  653. package/dist/wire-composers.js +3 -0
  654. package/dist/wire-composers.js.map +1 -0
  655. package/dist/wire-content-items.d.ts +11 -0
  656. package/dist/wire-content-items.js +139 -0
  657. package/dist/wire-content-items.js.map +1 -0
  658. package/dist/wire-corner-status.d.ts +11 -0
  659. package/dist/wire-corner-status.js +3 -0
  660. package/dist/wire-corner-status.js.map +1 -0
  661. package/dist/wire-file-pickers.d.ts +26 -0
  662. package/dist/wire-file-pickers.js +3 -0
  663. package/dist/wire-file-pickers.js.map +1 -0
  664. package/dist/wire-list-focus-scroll.d.ts +16 -0
  665. package/dist/wire-list-focus-scroll.js +3 -0
  666. package/dist/wire-list-focus-scroll.js.map +1 -0
  667. package/dist/wire-list-reorder.d.ts +41 -0
  668. package/dist/wire-list-reorder.js +3 -0
  669. package/dist/wire-list-reorder.js.map +1 -0
  670. package/dist/wire-nav-stack.d.ts +4 -1
  671. package/dist/wire-nav-stack.js +312 -16
  672. package/dist/wire-nav-stack.js.map +1 -1
  673. package/dist/wire-resizable-regions.d.ts +2 -1
  674. package/dist/wire-resizable-regions.js +2 -1
  675. package/dist/wire-scroll-dividers.d.ts +87 -0
  676. package/dist/wire-scroll-dividers.js +3 -0
  677. package/dist/wire-scroll-dividers.js.map +1 -0
  678. package/dist/wire-sidebar.d.ts +24 -4
  679. package/dist/wire-sidebar.js +122 -19
  680. package/dist/wire-sidebar.js.map +1 -1
  681. package/dist/wire-tab-bars.d.ts +1 -0
  682. package/dist/wire-tab-bars.js +1 -1
  683. package/dist/wire-tab-navigator.d.ts +13 -0
  684. package/dist/wire-tab-navigator.js +153 -0
  685. package/dist/wire-tab-navigator.js.map +1 -0
  686. package/dist/wire-token-search-fields.d.ts +5 -1
  687. package/dist/wire-token-search-fields.js +2 -1
  688. package/dist/wire-toolbar-visibility.d.ts +13 -0
  689. package/dist/wire-toolbar-visibility.js +3 -0
  690. package/dist/wire-toolbar-visibility.js.map +1 -0
  691. package/dist/wire-workbench.d.ts +116 -0
  692. package/dist/wire-workbench.js +6 -0
  693. package/dist/wire-workbench.js.map +1 -0
  694. package/dist/workbench.d.ts +253 -10
  695. package/dist/workbench.js +20 -62
  696. package/dist/workbench.js.map +1 -1
  697. package/docs/accessibility.md +617 -32
  698. package/docs/anchored-surface.md +101 -0
  699. package/docs/app-layouts.md +159 -10
  700. package/docs/apple-hig.md +2 -0
  701. package/docs/catalog.md +403 -110
  702. package/docs/collapsible-panel.md +272 -16
  703. package/docs/component-contract.md +700 -79
  704. package/docs/component-integration.md +75 -0
  705. package/docs/component-selection.md +908 -79
  706. package/docs/composer.md +143 -0
  707. package/docs/design/templates/choice-chips/color-palette-dark.svg +1 -0
  708. package/docs/design/templates/choice-chips/color-palette.svg +1 -0
  709. package/docs/design/templates/choice-chips/compact-icons-dark.svg +1 -0
  710. package/docs/design/templates/choice-chips/compact-icons.svg +1 -0
  711. package/docs/design/templates/choice-chips/multiple-dark.svg +1 -0
  712. package/docs/design/templates/choice-chips/multiple.svg +1 -0
  713. package/docs/design/templates/choice-chips-dark.svg +1 -0
  714. package/docs/design/templates/choice-chips.svg +1 -0
  715. package/docs/design/templates/composer/chat-dark.svg +1 -0
  716. package/docs/design/templates/composer/chat.svg +1 -0
  717. package/docs/design/templates/composer/prompt-dark.svg +1 -0
  718. package/docs/design/templates/composer/prompt.svg +1 -0
  719. package/docs/design/templates/composer-dark.svg +1 -0
  720. package/docs/design/templates/composer.svg +1 -0
  721. package/docs/design/templates/empty-state/filtered-dark.svg +1 -1
  722. package/docs/design/templates/empty-state/filtered.svg +1 -1
  723. package/docs/design/templates/empty-state/with-action-dark.svg +1 -1
  724. package/docs/design/templates/empty-state/with-action.svg +1 -1
  725. package/docs/design/templates/empty-state-dark.svg +1 -1
  726. package/docs/design/templates/empty-state.svg +1 -1
  727. package/docs/design/templates/list/compact-dark.svg +1 -1
  728. package/docs/design/templates/list/compact.svg +1 -1
  729. package/docs/design/templates/list/stack-dark.svg +1 -1
  730. package/docs/design/templates/list/stack.svg +1 -1
  731. package/docs/design/templates/list-action-row/default-dark.svg +1 -1
  732. package/docs/design/templates/list-action-row/default.svg +1 -1
  733. package/docs/design/templates/list-action-row/icon-tile-dark.svg +1 -0
  734. package/docs/design/templates/list-action-row/icon-tile.svg +1 -0
  735. package/docs/design/templates/list-action-row/selected-dark.svg +1 -1
  736. package/docs/design/templates/list-action-row/selected.svg +1 -1
  737. package/docs/design/templates/list-action-row/trailing-menu-dark.svg +1 -0
  738. package/docs/design/templates/list-action-row/trailing-menu.svg +1 -0
  739. package/docs/design/templates/list-action-row-dark.svg +1 -1
  740. package/docs/design/templates/list-action-row.svg +1 -1
  741. package/docs/design/templates/list-dark.svg +1 -1
  742. package/docs/design/templates/list-header/action-dark.svg +1 -1
  743. package/docs/design/templates/list-header/action.svg +1 -1
  744. package/docs/design/templates/list-header/count-dark.svg +1 -1
  745. package/docs/design/templates/list-header/count.svg +1 -1
  746. package/docs/design/templates/list-header/inline-action-dark.svg +1 -0
  747. package/docs/design/templates/list-header/inline-action.svg +1 -0
  748. package/docs/design/templates/list-header/size-l-dark.svg +1 -0
  749. package/docs/design/templates/list-header/size-l.svg +1 -0
  750. package/docs/design/templates/list-header/size-m-dark.svg +1 -0
  751. package/docs/design/templates/list-header/size-m.svg +1 -0
  752. package/docs/design/templates/list-header/size-xl-dark.svg +1 -0
  753. package/docs/design/templates/list-header/size-xl.svg +1 -0
  754. package/docs/design/templates/list-header/size-xs-dark.svg +1 -0
  755. package/docs/design/templates/list-header/size-xs.svg +1 -0
  756. package/docs/design/templates/list-header/toggle-collapsed-dark.svg +1 -1
  757. package/docs/design/templates/list-header/toggle-collapsed.svg +1 -1
  758. package/docs/design/templates/list-header/toggle-expanded-dark.svg +1 -1
  759. package/docs/design/templates/list-header/toggle-expanded.svg +1 -1
  760. package/docs/design/templates/list-header-dark.svg +1 -1
  761. package/docs/design/templates/list-header.svg +1 -1
  762. package/docs/design/templates/list-item/default-dark.svg +1 -1
  763. package/docs/design/templates/list-item/default.svg +1 -1
  764. package/docs/design/templates/list-item/icon-tile-dark.svg +1 -0
  765. package/docs/design/templates/list-item/icon-tile.svg +1 -0
  766. package/docs/design/templates/list-item/multiline-dark.svg +1 -1
  767. package/docs/design/templates/list-item/multiline.svg +1 -1
  768. package/docs/design/templates/list-item/selected-dark.svg +1 -1
  769. package/docs/design/templates/list-item/selected.svg +1 -1
  770. package/docs/design/templates/list-item/trailing-dark.svg +1 -1
  771. package/docs/design/templates/list-item/trailing.svg +1 -1
  772. package/docs/design/templates/list-item-dark.svg +1 -1
  773. package/docs/design/templates/list-item.svg +1 -1
  774. package/docs/design/templates/list.svg +1 -1
  775. package/docs/design/templates/segmented-control/equal-dark.svg +1 -1
  776. package/docs/design/templates/segmented-control/equal.svg +1 -1
  777. package/docs/design/templates/segmented-control/pill-small-dark.svg +1 -1
  778. package/docs/design/templates/segmented-control/pill-small.svg +1 -1
  779. package/docs/design/templates/segmented-control-dark.svg +1 -1
  780. package/docs/design/templates/segmented-control.svg +1 -1
  781. package/docs/design/templates/skeleton-dark.svg +1 -1
  782. package/docs/design/templates/skeleton.svg +1 -1
  783. package/docs/design/templates/state-banner/danger-dark.svg +1 -1
  784. package/docs/design/templates/state-banner/danger.svg +1 -1
  785. package/docs/design/templates/state-banner/info-badge-dark.svg +1 -1
  786. package/docs/design/templates/state-banner/info-badge.svg +1 -1
  787. package/docs/design/templates/state-banner/info-dark.svg +1 -1
  788. package/docs/design/templates/state-banner/info.svg +1 -1
  789. package/docs/design/templates/state-banner/strip-dark.svg +1 -0
  790. package/docs/design/templates/state-banner/strip.svg +1 -0
  791. package/docs/design/templates/state-banner/success-dark.svg +1 -1
  792. package/docs/design/templates/state-banner/success.svg +1 -1
  793. package/docs/design/templates/state-banner/warning-dark.svg +1 -1
  794. package/docs/design/templates/state-banner/warning.svg +1 -1
  795. package/docs/design/templates/state-banner-dark.svg +1 -1
  796. package/docs/design/templates/state-banner.svg +1 -1
  797. package/docs/design/templates/tab-bar/workspace-tabs-dark.svg +1 -1
  798. package/docs/design/templates/tab-bar/workspace-tabs.svg +1 -1
  799. package/docs/design/templates/tab-bar-dark.svg +1 -1
  800. package/docs/design/templates/tab-bar.svg +1 -1
  801. package/docs/design/templates/token-search-field/empty-dark.svg +1 -1
  802. package/docs/design/templates/token-search-field/empty.svg +1 -1
  803. package/docs/design/templates/token-search-field/tokens-dark.svg +1 -1
  804. package/docs/design/templates/token-search-field/tokens.svg +1 -1
  805. package/docs/design/templates/token-search-field-dark.svg +1 -1
  806. package/docs/design/templates/token-search-field.svg +1 -1
  807. package/docs/design/templates/toolbar/title-and-actions-dark.svg +1 -1
  808. package/docs/design/templates/toolbar/title-and-actions.svg +1 -1
  809. package/docs/design/templates/toolbar/width-visibility-320-dark.svg +1 -0
  810. package/docs/design/templates/toolbar/width-visibility-320.svg +1 -0
  811. package/docs/design/templates/toolbar/width-visibility-600-dark.svg +1 -0
  812. package/docs/design/templates/toolbar/width-visibility-600.svg +1 -0
  813. package/docs/design/templates/toolbar-control-group/borderless-single-dark.svg +1 -1
  814. package/docs/design/templates/toolbar-control-group/borderless-single.svg +1 -1
  815. package/docs/design/templates/toolbar-control-group/icon-buttons-dark.svg +1 -1
  816. package/docs/design/templates/toolbar-control-group/icon-buttons.svg +1 -1
  817. package/docs/design/templates/toolbar-control-group/icon-tile-brand-dark.svg +1 -0
  818. package/docs/design/templates/toolbar-control-group/icon-tile-brand.svg +1 -0
  819. package/docs/design/templates/toolbar-control-group/icon-tile-danger-dark.svg +1 -0
  820. package/docs/design/templates/toolbar-control-group/icon-tile-danger.svg +1 -0
  821. package/docs/design/templates/toolbar-control-group/icon-tile-neutral-dark.svg +1 -0
  822. package/docs/design/templates/toolbar-control-group/icon-tile-neutral.svg +1 -0
  823. package/docs/design/templates/toolbar-control-group/icon-tile-success-dark.svg +1 -0
  824. package/docs/design/templates/toolbar-control-group/icon-tile-success.svg +1 -0
  825. package/docs/design/templates/toolbar-control-group/icon-tile-warning-dark.svg +1 -0
  826. package/docs/design/templates/toolbar-control-group/icon-tile-warning.svg +1 -0
  827. package/docs/design/templates/toolbar-control-group/push-buttons-dark.svg +1 -1
  828. package/docs/design/templates/toolbar-control-group/push-buttons.svg +1 -1
  829. package/docs/design/templates/toolbar-control-group/with-text-dark.svg +1 -1
  830. package/docs/design/templates/toolbar-control-group/with-text.svg +1 -1
  831. package/docs/design/templates/toolbar-control-group-dark.svg +1 -1
  832. package/docs/design/templates/toolbar-control-group.svg +1 -1
  833. package/docs/design/templates/toolbar-dark.svg +1 -1
  834. package/docs/design/templates/toolbar-text/dark-tone-dark.svg +1 -0
  835. package/docs/design/templates/toolbar-text/dark-tone.svg +1 -0
  836. package/docs/design/templates/toolbar-text/default-dark.svg +1 -1
  837. package/docs/design/templates/toolbar-text/default.svg +1 -1
  838. package/docs/design/templates/toolbar-text/large-dark.svg +1 -1
  839. package/docs/design/templates/toolbar-text/large.svg +1 -1
  840. package/docs/design/templates/toolbar-text/small-dark.svg +1 -1
  841. package/docs/design/templates/toolbar-text/small.svg +1 -1
  842. package/docs/design/templates/toolbar-text-dark.svg +1 -1
  843. package/docs/design/templates/toolbar-text.svg +1 -1
  844. package/docs/design/templates/toolbar.svg +1 -1
  845. package/docs/design/templates/value-table/details-dark.svg +1 -1
  846. package/docs/design/templates/value-table/details.svg +1 -1
  847. package/docs/design/templates/value-table-dark.svg +1 -1
  848. package/docs/design/templates/value-table.svg +1 -1
  849. package/docs/design/templates.md +19 -9
  850. package/docs/design-philosophy.md +58 -11
  851. package/docs/device-class.md +2 -1
  852. package/docs/document-baseline.md +93 -0
  853. package/docs/examples/application-ui-profile.json +8 -8
  854. package/docs/examples/command-palette-adapter.tsx +9 -7
  855. package/docs/examples/component-catalog-extension.json +8 -1
  856. package/docs/examples/{component-catalog-extension-v2.json → component-composition-extension.json} +8 -9
  857. package/docs/layout.md +764 -40
  858. package/docs/nav-stack.md +275 -11
  859. package/docs/recipes.md +125 -69
  860. package/docs/split-view.md +94 -5
  861. package/docs/sunken-panel.md +54 -1
  862. package/docs/surface-scaffold.md +270 -0
  863. package/docs/tab-navigator.md +255 -0
  864. package/docs/type-contracts.md +57 -22
  865. package/docs/ui-analyzer.md +334 -14
  866. package/docs/ui-doctor.md +207 -10
  867. package/docs/ui-evaluator.md +17 -0
  868. package/docs/ux-demo.md +47 -16
  869. package/docs/webawesome-theme.md +148 -14
  870. package/docs/workbench.md +600 -11
  871. package/docs/writing.md +152 -0
  872. package/doctor/cli.mjs +5 -0
  873. package/doctor/component-style-checks.mjs +457 -0
  874. package/doctor/config.schema.json +26 -0
  875. package/doctor/copy-capitalization-checks.mjs +591 -0
  876. package/doctor/eslint-diagnostics.d.mts +16 -0
  877. package/doctor/eslint-diagnostics.mjs +17 -0
  878. package/doctor/index.d.mts +6 -0
  879. package/doctor/index.mjs +214 -47
  880. package/evaluator/index.mjs +73 -8
  881. package/llms.txt +702 -56
  882. package/package.json +256 -25
  883. package/scripts/component-catalog-extension-validation.mjs +28 -0
  884. package/traversal-exclusions.mjs +60 -1
  885. package/ux-demo/recipes/app-shell.tsx +181 -189
  886. package/ux-demo/recipes/collapsible-sidebar.tsx +177 -139
  887. package/ux-demo/recipes/compact-toolbar.tsx +120 -101
  888. package/ux-demo/recipes/composer-form.tsx +86 -62
  889. package/ux-demo/recipes/list-detail-dialog.tsx +219 -114
  890. package/ux-demo/recipes/list-workspace-states.tsx +95 -80
  891. package/ux-demo/recipes/loaders.ts +5 -2
  892. package/ux-demo/recipes/loading-inspector.tsx +157 -117
  893. package/ux-demo/recipes/mount-recipe.ts +0 -5
  894. package/ux-demo/recipes/navigation-sidebar.tsx +98 -83
  895. package/ux-demo/recipes/navigation-stack.tsx +42 -29
  896. package/ux-demo/recipes/types.ts +14 -1
  897. package/ux-demo/recipes/workspace-header.tsx +77 -51
  898. package/vite-ux-review.d.mts +83 -0
  899. package/vite-ux-review.mjs +120 -0
  900. package/ai/component-catalog-extension-v2.d.ts +0 -7
  901. package/ai/component-catalog-extension-v2.schema.json +0 -7
  902. package/ai/component-catalog-v2.d.ts +0 -67
  903. package/ai/component-catalog-v2.json +0 -4675
  904. package/ai/component-catalog-v2.schema.json +0 -246
  905. package/dist/browser/panel-header.js +0 -7
  906. package/dist/chunk-5VTB2BKP.js +0 -35
  907. package/dist/chunk-5VTB2BKP.js.map +0 -1
  908. package/dist/chunk-6WTETUZ6.js +0 -21
  909. package/dist/chunk-6WTETUZ6.js.map +0 -1
  910. package/dist/chunk-7KEUJIIC.js.map +0 -1
  911. package/dist/chunk-7XRDUG4Y.js +0 -58
  912. package/dist/chunk-7XRDUG4Y.js.map +0 -1
  913. package/dist/chunk-B3A3IVO5.js +0 -83
  914. package/dist/chunk-B3A3IVO5.js.map +0 -1
  915. package/dist/chunk-DPDBVKNA.js +0 -113
  916. package/dist/chunk-DPDBVKNA.js.map +0 -1
  917. package/dist/chunk-FEAMR7S4.js +0 -68
  918. package/dist/chunk-FEAMR7S4.js.map +0 -1
  919. package/dist/chunk-FEY65TBV.js +0 -15
  920. package/dist/chunk-FEY65TBV.js.map +0 -1
  921. package/dist/chunk-IJBSZ4NX.js.map +0 -1
  922. package/dist/chunk-J5BFYY7Q.js +0 -35
  923. package/dist/chunk-J5BFYY7Q.js.map +0 -1
  924. package/dist/chunk-JRKSK2HX.js.map +0 -1
  925. package/dist/chunk-KWWR5VMS.js.map +0 -1
  926. package/dist/chunk-LPOMRC4C.js.map +0 -1
  927. package/dist/chunk-M7JBER5U.js.map +0 -1
  928. package/dist/chunk-NENBUYX5.js +0 -79
  929. package/dist/chunk-NENBUYX5.js.map +0 -1
  930. package/dist/chunk-NWSEP5RT.js +0 -117
  931. package/dist/chunk-NWSEP5RT.js.map +0 -1
  932. package/dist/chunk-OJWWHFH3.js +0 -426
  933. package/dist/chunk-OJWWHFH3.js.map +0 -1
  934. package/dist/chunk-PSKN344N.js.map +0 -1
  935. package/dist/chunk-PX3YSS5C.js.map +0 -1
  936. package/dist/chunk-QO55FN2Y.js.map +0 -1
  937. package/dist/chunk-R7ZWUN64.js +0 -38
  938. package/dist/chunk-R7ZWUN64.js.map +0 -1
  939. package/dist/chunk-RKVQEH4J.js.map +0 -1
  940. package/dist/chunk-SRSJO5QE.js.map +0 -1
  941. package/dist/chunk-SYDMYBPG.js +0 -31
  942. package/dist/chunk-SYDMYBPG.js.map +0 -1
  943. package/dist/chunk-TB6DY7H5.js +0 -25
  944. package/dist/chunk-TB6DY7H5.js.map +0 -1
  945. package/dist/chunk-UFZKLBCF.js +0 -108
  946. package/dist/chunk-UFZKLBCF.js.map +0 -1
  947. package/dist/chunk-UKKSMZYT.js +0 -281
  948. package/dist/chunk-UKKSMZYT.js.map +0 -1
  949. package/dist/chunk-W2FK7ZNY.js +0 -26
  950. package/dist/chunk-W2FK7ZNY.js.map +0 -1
  951. package/dist/chunk-W5L2JSBY.js +0 -40
  952. package/dist/chunk-W5L2JSBY.js.map +0 -1
  953. package/dist/chunk-Y45PPBDV.js.map +0 -1
  954. package/dist/chunk-Y6LYKFXY.js.map +0 -1
  955. package/dist/divider-sides-267FA7sY.d.ts +0 -4
  956. package/dist/panel-header.d.ts +0 -42
  957. package/dist/panel-header.js +0 -7
  958. package/dist/panel-header.js.map +0 -1
  959. package/dist/styles/panel-header.css +0 -64
  960. package/dist/styles/tab-scaffold.css +0 -84
  961. package/dist/tab-scaffold.d.ts +0 -30
  962. package/dist/tab-scaffold.js +0 -51
  963. package/dist/tab-scaffold.js.map +0 -1
  964. package/dist/wire-tab-scaffold.d.ts +0 -11
  965. package/dist/wire-tab-scaffold.js +0 -21
  966. package/dist/wire-tab-scaffold.js.map +0 -1
  967. package/docs/design/templates/panel-header/icon-actions-dark.svg +0 -1
  968. package/docs/design/templates/panel-header/icon-actions.svg +0 -1
  969. package/docs/design/templates/panel-header/icon-summary-actions-dark.svg +0 -1
  970. package/docs/design/templates/panel-header/icon-summary-actions.svg +0 -1
  971. package/docs/design/templates/panel-header/no-icon-dark.svg +0 -1
  972. package/docs/design/templates/panel-header/no-icon.svg +0 -1
  973. package/docs/design/templates/panel-header/page-heading-dark.svg +0 -1
  974. package/docs/design/templates/panel-header/page-heading.svg +0 -1
  975. package/docs/design/templates/panel-header/title-only-dark.svg +0 -1
  976. package/docs/design/templates/panel-header/title-only.svg +0 -1
  977. package/docs/design/templates/panel-header-dark.svg +0 -1
  978. package/docs/design/templates/panel-header.svg +0 -1
  979. package/docs/tab-scaffold.md +0 -50
  980. package/ux-demo/recipes/recipes.css +0 -448
package/README.md CHANGED
@@ -4,6 +4,45 @@ Accessible, composable UI primitives for [kerf](https://github.com/brianwestphal
4
4
 
5
5
  Start interface work with the [need-first component selection matrix](./docs/component-selection.md). It distinguishes direct reuse, composition, thin application adapters, and genuinely custom semantics, with imports, required wiring, application ownership, alternatives, and recipes for every public primitive.
6
6
 
7
+ When adding a first-party public component, follow the
8
+ [component integration workflow](./docs/component-integration.md). The catalog
9
+ entry drives one validator across package, build, barrel, CSS, demo, route, and
10
+ AI signature projections, with a non-mutating dry-run report.
11
+
12
+ ### Shared semantic tones
13
+
14
+ `SemanticTone` is the shared color-role type for `Badge`, `Chip`, `StateBanner`,
15
+ and semantic `ContentItem` appearances: `neutral`, `info`, `pop`, `success`,
16
+ `warning`, and `danger`. Import it as a type from `@kerfjs/ui`,
17
+ `@kerfjs/ui/badge`, `@kerfjs/ui/state-banner`, or `@kerfjs/ui/content-item`.
18
+ Use `info` for the role backed by the existing `--kui-color-brand-*` tokens.
19
+ Migrate Badge/Chip `tone="brand"` to `tone="info"`; `BadgeTone` and
20
+ `StateBannerTone` remain deprecated aliases of `SemanticTone`.
21
+
22
+ ## Source organization
23
+
24
+ The flat files directly under `src/` are stable package entry facades. Keep
25
+ component implementation and CSS together under
26
+ `src/components/<family>/<component>/`. Put support code used by one component
27
+ in its `internal/`, `model/`, `register/`, or `wiring/` folder. Shared types and
28
+ utilities live under `src/shared/`; wiring that spans several components lives
29
+ under `src/wiring/`; Web Awesome integration code lives under
30
+ `src/integrations/`. Catalog-only implementation remains under `src/catalog/`.
31
+
32
+ Choose an existing family by the component role, and add a family only when no
33
+ current one fits. Public JavaScript and CSS subpaths remain flat through their
34
+ root facades. `npm run check:source-organization` rejects implementation added
35
+ back to the root or component-local support code placed in the wrong folder.
36
+
37
+ Browser verification always builds current source: both `npm run test:e2e`
38
+ and direct focused Playwright commands run the catalog/conformance preflights
39
+ and production build before preview. See the [UX catalog contract](./docs/ux-demo.md).
40
+ Failed Playwright tests retain traces and screenshots alongside an HTML report.
41
+ CI runs the complete suite in concurrent Chromium, Firefox, and WebKit jobs,
42
+ while the `ui` job checks the package. A failing browser job uploads its report
43
+ and per-test evidence for 14 days as
44
+ `ui-browser-failure-<browser>-<run>-<attempt>`.
45
+
7
46
  When authoring a component gallery, follow the single
8
47
  [Catalog demo authoring contract](./docs/catalog.md#catalog-demo-authoring-contract)
9
48
  for focused-versus-composition modes, helper nesting, specimen selection,
@@ -11,11 +50,11 @@ geometry inspection, and metadata ownership. AI tools can discover that
11
50
  contract and its public imports through the shipped
12
51
  [`catalog-authoring.json`](./ai/catalog-authoring.json) artifact.
13
52
 
14
- For connective application patterns, use the seven [production composition
53
+ For connective application patterns, use the ten [production composition
15
54
  recipes](./docs/recipes.md). Each has a stable catalog route, runnable state,
16
55
  public-subpath source, semantic layout ownership, and explicit application
17
56
  customization boundaries. The composer recipe demonstrates one coherent form
18
- surface with `PanelHeader` hierarchy and field/action controls aligned to the
57
+ surface with a `Toolbar`/`ToolbarText` heading and field/action controls aligned to the
19
58
  shared 8px gutter; only persistent feedback adds a nested semantic
20
59
  `StateBanner` surface.
21
60
 
@@ -30,22 +69,20 @@ npm install kerfjs @kerfjs/ui
30
69
  ```
31
70
 
32
71
  ```tsx
72
+ import { mount } from "kerfjs";
33
73
  import { ListItem } from "@kerfjs/ui/list-item";
34
74
  import { ListHeader } from "@kerfjs/ui/list-header";
35
75
  import { ListActionRow } from "@kerfjs/ui/list-action-row";
36
76
  import { Toolbar } from "@kerfjs/ui/toolbar";
37
- import { ToolbarControlGroup } from "@kerfjs/ui/toolbar-control-group";
38
77
  import { ToolbarText } from "@kerfjs/ui/toolbar-text";
39
78
 
79
+ const root = document.getElementById("app")!;
80
+
40
81
  mount(root, () => (
41
82
  <>
42
83
  <Toolbar
43
84
  label="Document"
44
- leading={
45
- <ToolbarControlGroup appearance="borderless" single>
46
- <ToolbarText text="Notes" />
47
- </ToolbarControlGroup>
48
- }
85
+ leading={<ToolbarText text="Notes" />}
49
86
  />
50
87
  <section>
51
88
  <ListHeader
@@ -75,7 +112,7 @@ mount(root, () => (
75
112
  label="src/main.ts"
76
113
  trailingAction="open-file-actions"
77
114
  trailingActionLabel="Actions for src/main.ts"
78
- trailingActionIcon={moreIcon}
115
+ trailingActionIcon={<span aria-hidden="true">⋯</span>}
79
116
  />
80
117
  <div id="workspace-actions" popover="auto">
81
118
  Application-owned actions
@@ -87,15 +124,35 @@ mount(root, () => (
87
124
 
88
125
  Components return Kerf `SafeHtml`. They do not own application state or attach transient listeners. Actions are stable `data-action` hooks; the application wires them once with `delegate()` or `delegateActions()` and retains the disposer.
89
126
 
127
+ Component content positions use one convention: `children` is the homogeneous
128
+ primary region, while semantic positions and replacement content use explicit
129
+ named `SafeHtml` props such as `header`, `footer`, `leading`, `trailing`,
130
+ `icon`, and `action`. These named `SafeHtml` prop slots are ordinary typed
131
+ function-component props—not native `<slot>` elements, wrapper slot
132
+ components, or a generic `slots` object. The composition catalog publishes
133
+ sound prop bindings as `zone.jsx.prop`, allowing ESLint to validate statically
134
+ visible content and cardinality without guessing from zone names.
135
+
136
+ Stable single-root visual components also accept the explicit native
137
+ `slot?: string` prop, so their returned root can participate directly in a web
138
+ component's named slot and keep that assignment through Kerf rerenders. This is
139
+ a narrow interop attribute, not general native-attribute spreading. The
140
+ multi-root `ResizableRegion` and `CollapsiblePanel` intentionally omit it
141
+ because neither has one unambiguous returned root; `CollapsiblePanelToggle`
142
+ supports it as a normal single-root control.
143
+
90
144
  `ListItem.rootAttributes`, `ListHeader.rootAttributes`,
91
145
  `ListActionRow.rootAttributes`, `AppTab.rootAttributes`,
92
- `CatalogExample.rootAttributes`, and `CatalogExampleStack.rootAttributes` carry typed
146
+ `Catalog.stageRootAttributes`, `CatalogExample.rootAttributes`, and `CatalogExampleStack.rootAttributes` carry typed
93
147
  application `data-*` metadata without
94
148
  teaching the package domain fields. `ListHeader.triggerAttributes` and
95
149
  `ListActionRow.trailingActionAttributes` additionally support native popover
96
150
  target and relationship attributes. Roles and component-owned action, selection,
97
151
  disclosure, naming, disabled, icon, and catalog-structure semantics remain protected props; an
98
152
  isolated `role="menuitem"` is not an extension shortcut.
153
+ `CatalogExample.viewport` owns the finite layout constraints needed by focused
154
+ specimens, so catalog authors do not need route-local stylesheets, inline
155
+ styles, or styling-only demo classes.
99
156
  The slots are also filtered at runtime, so structurally widened objects and
100
157
  JavaScript callers cannot bypass those protections with case-variant names.
101
158
  `ListItem.trailing` is dormant metadata. Use `ListActionRow` when a row needs
@@ -112,58 +169,157 @@ Do not concatenate a count into `label` or pass a numeric `badge`; the mutually
112
169
  exclusive legacy `badge` slot remains available for non-count `SafeHtml` such
113
170
  as a `New` marker.
114
171
 
172
+ `Row.gap`, `Grid.gap`, `List.gap`, and `Spacer` dimensions accept a direct spacing name such as
173
+ `gap="xs"` or `gap="m"`, or a branded `CssLength`. Import `space`, `rem`, `em`,
174
+ `px`, `pct`, `lengthVar`, `plus`, and `calc` from the CSS-free
175
+ `@kerfjs/ui/css-values` subpath when a named step is not enough. `plus` returns
176
+ an incomplete expression, so wrap it with `calc` before passing it to a prop.
177
+ Raw CSS strings are deliberately rejected; the opaque brands catch authoring
178
+ mistakes but are not sanitizers.
179
+
180
+ Use `Row` for horizontal flex composition and `List` for vertical composition.
181
+ Both accept `hAlign` (`left`, `center`, `right`, `full`) and `vAlign` (`top`,
182
+ `middle`, `bottom`, `full`), plus their documented short/CSS aliases. `Row`
183
+ also accepts `vAlign="baseline"` for cross-axis text alignment; baseline is not
184
+ available on `List`, whose vertical axis uses `justify-content`. `Row`
185
+ defaults to left/full alignment, the `xs` gap, and `wrap={false}`; List keeps
186
+ its existing full/top alignment and zero-gap defaults. Set `textInsets` or
187
+ `controlInsets` with canonical physical sides in `t`/`r`/`b`/`l` order (for
188
+ example, `textInsets="tbl"` or `controlInsets="r"`). Text geometry takes
189
+ precedence where both select the same side. `ListInsetText` and
190
+ `ListInsetControl` inset all four sides by default and accept the same `sides`
191
+ grammar for selective insets. Nested Rows and Lists resolve their inset sides
192
+ independently, so an unselected inner side does not inherit its parent's inset.
193
+
194
+ Use `Grid` for a fixed positive number of evenly distributed columns. Its
195
+ `minmax(0, 1fr)` tracks stay equal when children have different intrinsic
196
+ widths; the application owns responsive count changes. Use application CSS grid
197
+ for asymmetric or intrinsic tracks and `ResizableRegion` for adjustable ones.
198
+
199
+ The same property-specific boundary applies beyond spacing: use `flex()` (or a
200
+ finite keyword) for `Row.flex`, `Grid.flex`, and `List.flex`; length builders and intrinsic-size keywords for
201
+ `Skeleton.width`/`height`; length builders for `Skeleton.radius`; and
202
+ a foreground color for `SelectChoice.color` — `uiColor()` with a foreground
203
+ token such as `success-on-quiet`, or `foregroundColorVar()` (fill tokens such
204
+ as `uiColor('success-fill-quiet')` are rejected). These grammars are not
205
+ interchangeable. `ListItem` and `ListActionRow` deliberately expose no raw
206
+ `style` declarations; use `className`, public tokens, and component props.
207
+
115
208
  ## Component subpaths
116
209
 
117
- | Component | Browser import (includes reachable CSS) | Manual CSS export |
118
- | ------------------------------------------------------------------- | --------------------------------------- | -------------------------------------- |
119
- | `LucideIcon` | `@kerfjs/ui/lucide-icon` | `@kerfjs/ui/lucide-icon.css` |
120
- | `DisclosureArrow` | `@kerfjs/ui/disclosure-arrow` | `@kerfjs/ui/disclosure-arrow.css` |
121
- | `Toolbar` | `@kerfjs/ui/toolbar` | `@kerfjs/ui/toolbar.css` |
122
- | `ToolbarControlGroup` | `@kerfjs/ui/toolbar-control-group` | `@kerfjs/ui/toolbar-control-group.css` |
123
- | `FloatingToolbar` | `@kerfjs/ui/floating-toolbar` | `@kerfjs/ui/floating-toolbar.css` |
124
- | `ToolbarText` | `@kerfjs/ui/toolbar-text` | `@kerfjs/ui/toolbar-text.css` |
125
- | `List` | `@kerfjs/ui/list` | `@kerfjs/ui/list.css` |
126
- | `ListActionRow` | `@kerfjs/ui/list-action-row` | `@kerfjs/ui/list-action-row.css` |
127
- | `ListItem` | `@kerfjs/ui/list-item` | `@kerfjs/ui/list-item.css` |
128
- | `ListHeader` | `@kerfjs/ui/list-header` | `@kerfjs/ui/list-header.css` |
129
- | `ListInsetControl` | `@kerfjs/ui/list-inset-control` | `@kerfjs/ui/list-inset-control.css` |
130
- | `ListInsetText` | `@kerfjs/ui/list-inset-text` | `@kerfjs/ui/list-inset-text.css` |
131
- | `Pane` | `@kerfjs/ui/pane` | `@kerfjs/ui/pane.css` |
132
- | Content and navigation composition | — | `@kerfjs/ui/layout.css` |
133
- | `ResizableRegion` | `@kerfjs/ui/resizable-region` | `@kerfjs/ui/resizable-region.css` |
134
- | `wireResizableRegions` | `@kerfjs/ui/wire-resizable-regions` | — |
135
- | `AppTab` | `@kerfjs/ui/app-tab` | `@kerfjs/ui/app-tab.css` |
136
- | `TabBar` | `@kerfjs/ui/tab-bar` | `@kerfjs/ui/tab-bar.css` |
137
- | `wireTabBars`, `reorderTabs` | `@kerfjs/ui/wire-tab-bars` | — |
138
- | `LoadingSpinner` | `@kerfjs/ui/loading-spinner` | `@kerfjs/ui/loading-spinner.css` |
139
- | `Skeleton` | `@kerfjs/ui/skeleton` | `@kerfjs/ui/skeleton.css` |
140
- | `SunkenPanel` | `@kerfjs/ui/sunken-panel` | `@kerfjs/ui/sunken-panel.css` |
141
- | `Select` | `@kerfjs/ui/select` | `@kerfjs/ui/select.css` |
142
- | `SegmentedControl` | `@kerfjs/ui/segmented-control` | `@kerfjs/ui/segmented-control.css` |
143
- | `TokenSearchField`, `readTokenSearchField`, `placeTokenSearchCaret` | `@kerfjs/ui/token-search-field` | `@kerfjs/ui/token-search-field.css` |
144
- | `wireTokenSearchFields` | `@kerfjs/ui/wire-token-search-fields` | — |
145
- | `StateBanner` | `@kerfjs/ui/state-banner` | `@kerfjs/ui/state-banner.css` |
146
- | `EmptyState` | `@kerfjs/ui/empty-state` | `@kerfjs/ui/empty-state.css` |
147
- | `PanelHeader` | `@kerfjs/ui/panel-header` | `@kerfjs/ui/panel-header.css` |
148
- | `ValueTable`, `ValueTableRow` | `@kerfjs/ui/value-table` | `@kerfjs/ui/value-table.css` |
149
-
150
- Opt-in application layouts keep JavaScript and CSS explicit. For the
151
- desktop-class multi-panel shell, import `Workbench` from
152
- `@kerfjs/ui/workbench` and load `@kerfjs/ui/workbench.css`; its supported
153
- classes and size tokens are cataloged under the `workbench` entry. See
154
- [`docs/workbench.md`](./docs/workbench.md) for panel ownership and responsive
155
- replacement guidance.
156
-
157
- `PanelHeader` is a plain `Toolbar` used as a panel, dialog, or page heading: an
158
- optional icon control group (given a brand fill with a matching border), the
159
- title as extra-large `ToolbarText`, the app's trailing action controls, and an
160
- optional subtitle on a separate row below the title. It overrides no toolbar
161
- styles — the app passes its own trailing controls (typically a
162
- `ToolbarControlGroup`).
163
-
164
- `DisclosureArrow` defaults to an 18px root-scaled decorative visual. Override
165
- `--kui-disclosure-arrow-size` at the narrowest useful scope when a consumer
166
- needs another size; the owning control still supplies interaction, naming, and
210
+ | Component | Browser import (includes reachable CSS) | Manual CSS export |
211
+ | ------------------------------------------------------------------- | --------------------------------------- | ---------------------------------------- |
212
+ | `LucideIcon` | `@kerfjs/ui/lucide-icon` | `@kerfjs/ui/lucide-icon.css` |
213
+ | `Badge` | `@kerfjs/ui/badge` | `@kerfjs/ui/badge.css` |
214
+ | `Chip` | `@kerfjs/ui/chip` | `@kerfjs/ui/chip.css` |
215
+ | `DisclosureArrow` | `@kerfjs/ui/disclosure-arrow` | `@kerfjs/ui/disclosure-arrow.css` |
216
+ | `Toolbar` | `@kerfjs/ui/toolbar` | `@kerfjs/ui/toolbar.css` |
217
+ | `ToolbarControlGroup`, `ToolbarActionLink` | `@kerfjs/ui/toolbar-control-group` | `@kerfjs/ui/toolbar-control-group.css` |
218
+ | `DialogSurface`, `PopupSurface` | `@kerfjs/ui/surface-scaffold` | `@kerfjs/ui/surface-scaffold.css` |
219
+ | `FloatingToolbar` | `@kerfjs/ui/floating-toolbar` | `@kerfjs/ui/floating-toolbar.css` |
220
+ | `PopupMenu` (register with `@kerfjs/ui/popup-menu/register`) | `@kerfjs/ui/popup-menu` | `@kerfjs/ui/popup-menu.css` |
221
+ | `openAnchoredSurface`, `openAnchoredSurfaceAt` | `@kerfjs/ui/anchored-surface` | `@kerfjs/ui/anchored-surface.css` |
222
+ | `ToolbarText` | `@kerfjs/ui/toolbar-text` | `@kerfjs/ui/toolbar-text.css` |
223
+ | `Text`, `FieldLabel` | `@kerfjs/ui/text` | `@kerfjs/ui/text.css` |
224
+ | `List` | `@kerfjs/ui/list` | `@kerfjs/ui/list.css` |
225
+ | `Row` | `@kerfjs/ui/row` | `@kerfjs/ui/row.css` |
226
+ | `Grid` | `@kerfjs/ui/grid` | `@kerfjs/ui/grid.css` |
227
+ | `Spacer` | `@kerfjs/ui/spacer` | `@kerfjs/ui/spacer.css` |
228
+ | Typed CSS dimension builders | `@kerfjs/ui/css-values` | — |
229
+ | `ListActionRow` | `@kerfjs/ui/list-action-row` | `@kerfjs/ui/list-action-row.css` |
230
+ | `ListItem` | `@kerfjs/ui/list-item` | `@kerfjs/ui/list-item.css` |
231
+ | `wireListReorder`, `reorderListItems` | `@kerfjs/ui/wire-list-reorder` | — |
232
+ | `wireListFocusScroll` | `@kerfjs/ui/wire-list-focus-scroll` | — |
233
+ | `ListHeader` | `@kerfjs/ui/list-header` | `@kerfjs/ui/list-header.css` |
234
+ | `ListInsetControl` | `@kerfjs/ui/list-inset-control` | `@kerfjs/ui/list-inset-control.css` |
235
+ | `ListInsetText` | `@kerfjs/ui/list-inset-text` | `@kerfjs/ui/list-inset-text.css` |
236
+ | `ContentItem` | `@kerfjs/ui/content-item` | `@kerfjs/ui/content-item.css` |
237
+ | `Pane` | `@kerfjs/ui/pane` | `@kerfjs/ui/pane.css` |
238
+ | `NavStack` | `@kerfjs/ui/nav-stack` | `@kerfjs/ui/nav-stack.css` |
239
+ | `wireNavStack` | `@kerfjs/ui/wire-nav-stack` | — |
240
+ | `SplitView` | `@kerfjs/ui/split-view` | `@kerfjs/ui/split-view.css` |
241
+ | `TabNavigator` | `@kerfjs/ui/tab-navigator` | `@kerfjs/ui/tab-navigator.css` |
242
+ | `wireTabNavigator` | `@kerfjs/ui/wire-tab-navigator` | — |
243
+ | `Workbench` | `@kerfjs/ui/workbench` | `@kerfjs/ui/workbench.css` |
244
+ | `wireWorkbench` | `@kerfjs/ui/wire-workbench` | — |
245
+ | `CollapsiblePanel`, `CollapsiblePanelToggle` | `@kerfjs/ui/collapsible-panel` | `@kerfjs/ui/collapsible-panel.css` |
246
+ | `wireSidebar` | `@kerfjs/ui/wire-sidebar` | — |
247
+ | Content and navigation composition | — | `@kerfjs/ui/layout.css` |
248
+ | `ResizableRegion` | `@kerfjs/ui/resizable-region` | `@kerfjs/ui/resizable-region.css` |
249
+ | `wireResizableRegions` | `@kerfjs/ui/wire-resizable-regions` | — |
250
+ | `AppTab` | `@kerfjs/ui/app-tab` | `@kerfjs/ui/app-tab.css` |
251
+ | `TabBar` | `@kerfjs/ui/tab-bar` | `@kerfjs/ui/tab-bar.css` |
252
+ | `wireTabBars`, `reorderTabs` | `@kerfjs/ui/wire-tab-bars` | — |
253
+ | `wireScrollDividers` | `@kerfjs/ui/wire-scroll-dividers` | — |
254
+ | `wireToolbarVisibility` | `@kerfjs/ui/wire-toolbar-visibility` | — |
255
+ | `LoadingSpinner` | `@kerfjs/ui/loading-spinner` | `@kerfjs/ui/loading-spinner.css` |
256
+ | `Skeleton` | `@kerfjs/ui/skeleton` | `@kerfjs/ui/skeleton.css` |
257
+ | `SunkenPanel` | `@kerfjs/ui/sunken-panel` | `@kerfjs/ui/sunken-panel.css` |
258
+ | `Select` | `@kerfjs/ui/select` | `@kerfjs/ui/select.css` |
259
+ | `SegmentedControl` | `@kerfjs/ui/segmented-control` | `@kerfjs/ui/segmented-control.css` |
260
+ | `ChoiceChips` | `@kerfjs/ui/choice-chips` | `@kerfjs/ui/choice-chips.css` |
261
+ | `Composer` | `@kerfjs/ui/composer` | `@kerfjs/ui/composer.css` |
262
+ | `wireComposers` | `@kerfjs/ui/wire-composers` | — |
263
+ | `TokenSearchField`, `readTokenSearchField`, `placeTokenSearchCaret` | `@kerfjs/ui/token-search-field` | `@kerfjs/ui/token-search-field.css` |
264
+ | `wireTokenSearchFields` | `@kerfjs/ui/wire-token-search-fields` | — |
265
+ | `createTokenSearchModel` | `@kerfjs/ui/token-search-model` | — |
266
+ | `StateBanner` | `@kerfjs/ui/state-banner` | `@kerfjs/ui/state-banner.css` |
267
+ | `IconButton` | `@kerfjs/ui/icon-button` | `@kerfjs/ui/icon-button.css` |
268
+ | `IconToggleButton` | `@kerfjs/ui/icon-toggle-button` | `@kerfjs/ui/icon-toggle-button.css` |
269
+ | `SplitButton` | `@kerfjs/ui/split-button` | `@kerfjs/ui/split-button.css` |
270
+ | `FramedList`, `FramedListRow` | `@kerfjs/ui/framed-list` | `@kerfjs/ui/framed-list.css` |
271
+ | `SummaryRow` | `@kerfjs/ui/summary-row` | `@kerfjs/ui/summary-row.css` |
272
+ | `ColumnTrack` | `@kerfjs/ui/column-track` | `@kerfjs/ui/column-track.css` |
273
+ | `ContentSwap` | `@kerfjs/ui/content-swap` | `@kerfjs/ui/content-swap.css` |
274
+ | `FilePickerTrigger`, `FileDropZone` | `@kerfjs/ui/file-picker` | `@kerfjs/ui/file-picker.css` |
275
+ | `wireFilePickers`, `fileMatchesAccept` | `@kerfjs/ui/wire-file-pickers` | — |
276
+ | `Combobox` | `@kerfjs/ui/combobox` | `@kerfjs/ui/combobox.css` |
277
+ | `wireComboboxes` | `@kerfjs/ui/wire-comboboxes` | — |
278
+ | `CornerStatus` | `@kerfjs/ui/corner-status` | `@kerfjs/ui/corner-status.css` |
279
+ | `EdgeActivityIndicator` | `@kerfjs/ui/edge-activity-indicator` | `@kerfjs/ui/edge-activity-indicator.css` |
280
+ | `wireCornerStatus` | `@kerfjs/ui/wire-corner-status` | — |
281
+ | `EmptyState` | `@kerfjs/ui/empty-state` | `@kerfjs/ui/empty-state.css` |
282
+ | `ValueTable`, `ValueTableRow` | `@kerfjs/ui/value-table` | `@kerfjs/ui/value-table.css` |
283
+
284
+ Application layouts are separate component subpaths. Browser-condition imports
285
+ include their reachable CSS; use the matching manual CSS export when your
286
+ bundler does not select the browser condition. Add a wire subpath when the
287
+ layout has interactive behavior. The catalog
288
+ entries for `nav-stack`, `split-view`, `tab-navigator`, `workbench`, and
289
+ `collapsible-panel` document their selection rules, ownership boundaries,
290
+ public classes, tokens, and focused demos. See
291
+ [`docs/app-layouts.md`](./docs/app-layouts.md) for the layout decision matrix.
292
+ `NavStack` and `TabNavigator` expose `chromeDividers="scroll" | "always" |
293
+ "none"` for their chrome lines; `SplitView` forwards the setting to its
294
+ compact stack. A sole `Pane` in a view or scene fills it, keeping the Pane's
295
+ header in place while its own content scrolls.
296
+
297
+ For a `Workbench` or `CollapsiblePanel`, place panel toolbar groups in its
298
+ `leading`, `center`, and `trailing` zones. Add `relocateOnCollapse` to each
299
+ `ToolbarControlGroup` that should remain available in the work-area toolbar
300
+ while the panel is closed. The panel collects marked groups in zone order;
301
+ its toggle follows them. See [Workbench panel toolbars](./docs/workbench.md#panel-toolbars).
302
+
303
+ Compose panel, dialog, and page headings directly with `Toolbar`: put an optional
304
+ icon in a `ToolbarControlGroup`, use a direct extra-large `ToolbarText` for the
305
+ title, and put actions in the trailing zone inside their own control group. Set
306
+ `headingLevel` for page or section headings. Supporting copy is app-owned content
307
+ below the toolbar and should be connected to its host with `aria-describedby`
308
+ when it adds useful context. Set `responsive="wrap"` on a heading whose title
309
+ must stay whole: it keeps one row while everything fits and otherwise moves the
310
+ trailing actions below the title instead of truncating it.
311
+
312
+ A toolbar never clips an action. Its trailing zone wraps whole control groups
313
+ onto another trailing-aligned row under every `responsive` policy, and a
314
+ `responsive="stack"` toolbar wraps its stacked center and trailing groups the
315
+ same way. Wrapping keeps every command visible at its full 44px target without
316
+ moving focus or DOM identity. When a product wants fewer visible commands at
317
+ narrow widths, it chooses them: render a lower-priority command inside an
318
+ app-owned "More" `PopupMenu` (in a `single` group with `nestedDropdown`).
319
+
320
+ `DisclosureArrow` defaults to an 18px root-scaled decorative visual. Pass a
321
+ typed `size` (for example `size={remify(24)}` from `@kerfjs/ui/css-values`)
322
+ when a consumer needs another size; the owning control still supplies interaction, naming, and
167
323
  expanded state. Kerf `Select` retains its independent Web Awesome expand-glyph
168
324
  scale of `.5` through `--kui-disclosure-icon-scale`. Author replacement
169
325
  `DisclosureArrow` icon content facing right before its configured direction
@@ -175,13 +331,26 @@ transform is applied. Direction changes take the shortest rotation path; a
175
331
  real controlled content and preserve the button's stable label; ordinary
176
332
  navigation must not display a disclosure arrow. A custom `actionIcon` remains
177
333
  an escape hatch and replaces the default arrow entirely. The header fills its
178
- available inline width, keeping a separate action at the logical end in a 44px
179
- target. Its visible action glyph defaults to 18px through
334
+ available inline width by default; set `inline` to shrink-wrap it beside other
335
+ content and remove its root margin, border, and padding. It keeps a separate
336
+ action at the logical end. Its visible action glyph defaults to 18px through
180
337
  `--kui-list-header-action-icon-size`.
181
338
 
182
339
  ## Machine-readable catalog
183
340
 
184
- AI tools can retrieve the shipped [`ai/component-catalog.json`](./ai/component-catalog.json)
341
+ AI assistants should start from the generated markdown reference,
342
+ [`ai/components/README.md`](./ai/components/README.md): a one-line index of
343
+ every entry grouped like the catalog, plus one short page per entry
344
+ (`ai/components/<id>.md`) covering when to use and avoid it, imports and
345
+ CSS/registration side effects, where its exact props live, legal parents,
346
+ zones with their JSX props and child counts, app- and wiring-owned state,
347
+ geometry ownership, accessibility obligations, the styling boundary
348
+ (configure through props; never override internals), and its composition
349
+ diagnostics. The pages are projected from the two JSON catalogs by
350
+ `scripts/sync-component-docs.mjs` (`npm run catalog:sync`), and
351
+ `npm run check:catalog` fails when any page drifts.
352
+
353
+ Tools can retrieve the shipped [`ai/component-catalog.json`](./ai/component-catalog.json)
185
354
  for the exhaustive component and composition inventory. It is the canonical
186
355
  source for ids, public exports, purpose and selection guidance, relationships,
187
356
  delivery and side effects, companion wiring, application-owned policy,
@@ -195,19 +364,22 @@ without guessing from a screenshot or private CSS.
195
364
  Catalog demo authoring is deliberately separate from the entry inventory. Load
196
365
  [`catalog-authoring.json`](./ai/catalog-authoring.json) to discover the
197
366
  authoritative [Catalog demo authoring contract](./docs/catalog.md#catalog-demo-authoring-contract),
198
- the exact API-signature context, public imports/helpers, and sanctioned metadata
199
- slot. Keeping this as a companion artifact prevents per-entry selection facts
200
- from duplicating presentation rules.
367
+ the exact API-signature context, public imports/helpers, sanctioned metadata
368
+ slot, three-kind taxonomy, and functional-group/importance ordering policy.
369
+ Keeping this as a companion artifact prevents per-entry selection facts from
370
+ duplicating presentation rules.
201
371
 
202
372
  Tools that evaluate composition may additionally load
203
- [`component-catalog-v2.json`](./ai/component-catalog-v2.json). It is a
204
- deterministic, package-qualified projection of every v1 entry with formal
205
- parent/context, zone/cardinality, child, state ownership, wiring, responsive,
206
- layout, accessibility, public-boundary, and stable-diagnostic fields. V1
207
- remains the selection and delivery compatibility surface. V2 defaults are
373
+ [`component-composition.json`](./ai/component-composition.json). It is a
374
+ generated composition layer beside `component-catalog.json`, not a newer
375
+ version of it: a deterministic, package-qualified projection of every
376
+ component-catalog entry with formal parent/context, zone/cardinality, child,
377
+ state ownership, wiring, responsive, layout, accessibility, public-boundary,
378
+ and stable-diagnostic fields. `component-catalog.json` remains the selection
379
+ and delivery surface. Composition defaults are
208
380
  deliberately permissive; only documented objective rules receive an
209
381
  authoritative override and enforceable diagnostic. The adjacent schema and
210
- [`component-catalog-v2.d.ts`](./ai/component-catalog-v2.d.ts) types describe
382
+ [`component-composition.d.ts`](./ai/component-composition.d.ts) types describe
211
383
  the same contract.
212
384
 
213
385
  Applications and downstream design systems should publish the same facts for
@@ -220,12 +392,25 @@ guidance, public hooks, and explicit geometry ownership; then concatenate its
220
392
  `entries` with Kerf's shipped `entries` in the AI context. Keep package/source
221
393
  identity alongside each input when ids could collide. This makes a combined
222
394
  tool reason about both sides of a composition using one vocabulary without
223
- pretending app-local components are `@kerfjs/ui` exports.
395
+ pretending app-local components are `@kerfjs/ui` exports. A package that
396
+ keeps a `kerf.components.json` generates this extension with
397
+ `kerf-component-catalog` by setting `kerfComponentCatalog.selectionOutput`
398
+ instead of maintaining a second JSON by hand.
399
+ For a consumer UX demo, `@kerfjs/ui/catalog-projection` derives rows and
400
+ relationships from that extension; `kerf-catalog-demo --write` emits a typed
401
+ module and `--check` catches drift. See the [catalog guide](./docs/catalog.md)
402
+ for repository base and source path configuration. To offer the catalog's
403
+ **Capture region** link to UX Review on a local server, add the Node-only
404
+ `uxReviewPlugin` from `@kerfjs/ui/vite-ux-review` to the Vite config (or, for a
405
+ catalog your own backend serves, mount its `uxReviewProjectResponse` /
406
+ `uxReviewMiddleware` on the development server) and pass `wireCatalog`'s
407
+ `onUxReviewProject` result to `Catalog`'s `uxReview` (the
408
+ [catalog guide](./docs/catalog.md#ux-review-capture) has the wiring).
224
409
 
225
410
  Composition-aware consumers use
226
- [`component-catalog-extension-v2.schema.json`](./ai/component-catalog-extension-v2.schema.json),
411
+ [`component-composition-extension.schema.json`](./ai/component-composition-extension.schema.json),
227
412
  its shipped TypeScript types, and the checked
228
- [`component-catalog-extension-v2.json`](./docs/examples/component-catalog-extension-v2.json)
413
+ [`component-composition-extension.json`](./docs/examples/component-composition-extension.json)
229
414
  example. Preserve each catalog's package and qualify every identity and
230
415
  cross-catalog reference as `package:id`; never merge entries by bare id.
231
416
 
@@ -236,7 +421,7 @@ rejects. The package gate compiles one positive/negative consumer fixture agains
236
421
  both source and declarations extracted from the real packed tarball. The
237
422
  [compile-time contract guide](./docs/type-contracts.md) documents migrations and
238
423
  the dynamic DOM/children relationships that remain runtime or catalog checks.
239
- Packages scaffolded by `create-kerf-component` maintain this v2 input from
424
+ Packages scaffolded by `create-kerf-component` maintain this composition input from
240
425
  `kerf.components.json`: `npm run catalog:generate` emits the catalog and
241
426
  `npm run catalog:check` verifies source files, named public exports, explicit
242
427
  author decisions, and byte-for-byte drift. Tools index the generated consumer
@@ -259,9 +444,9 @@ token overrides, layout/responsive conventions, and narrow rule exceptions.
259
444
  Profiles contain policy only—never product records, user data, or broad styling
260
445
  waivers.
261
446
 
262
- Catalog declarations always provide a v2 `composition` location. Consumer
447
+ Catalog declarations always provide a `composition` location. Consumer
263
448
  packages generated with composition-only metadata omit `selection`;
264
- `@kerfjs/ui` continues to require its v1 selection catalog.
449
+ `@kerfjs/ui` continues to require its `component-catalog.json` selection catalog.
265
450
 
266
451
  Node-based AI and static-analysis tools may import the shipped discovery API
267
452
  from `@kerfjs/ui/ai/application-ui-profile.mjs`. It discovers package defaults,
@@ -283,11 +468,19 @@ are merged with catalog diagnostics before exception validation.
283
468
  Run `kerf-ui-analyze --root . src` (or import
284
469
  `@kerfjs/ui/analyzer`) to evaluate cross-file integration facts against the
285
470
  composition catalogs and application profile. It catches provable private
286
- selector reach-through, unknown tokens, competing geometry owners, and nested
287
- scroll owners; it reports forced dimensions, repeated insets, off-scale literal
288
- spacing, and dynamic classes separately as review findings. Text, versioned JSON,
471
+ selector reach-through, unknown tokens, competing geometry owners, nested
472
+ scroll owners, and cataloged CSS-value violations in JavaScript/TypeScript
473
+ component calls and JSX, plus component-ownership overrides: CSS that makes
474
+ another package's component its subject, touches its private variables,
475
+ overrides a token its typed prop sets, or styles it through a hook class on
476
+ its root (`KUI-L019`–`KUI-L022`; forcing a component's dimensions is one such
477
+ restyle). It reports repeated insets, exceptional spacing shorthands, and
478
+ dynamic classes separately as review findings. Text, versioned JSON,
289
479
  and SARIF outputs carry stable `KUI-L###` ids, repository-relative locations,
290
480
  evidence, and ownership chains. See the [analyzer guide](./docs/ui-analyzer.md).
481
+ Opt into ownership between components in one package with Doctor's
482
+ `"ownership": "component"` setting and catalog `styleSources` declarations;
483
+ the default keeps package-level ownership.
291
484
 
292
485
  ### Browser-backed integration evaluation
293
486
 
@@ -303,7 +496,7 @@ retention policy, and a separate unscored human-visual rubric. See the
303
496
 
304
497
  ### Unified repair-loop doctor
305
498
 
306
- Use `kerf-ui-doctor` for the supported application repair loop across profile/catalog validation, TypeScript, the Kerf UI ESLint preset, static layout analysis, and an optional explicitly authorized browser evaluation. It emits one portable versioned JSON report with deterministic exit codes, exact suppressions, monorepo package selection, changed/full modes, caching, and local-path redaction. See the [UI doctor guide](./docs/ui-doctor.md).
499
+ Use `kerf-ui-doctor` for the supported application repair loop across profile/catalog validation, TypeScript, the Kerf UI ESLint preset, static layout analysis, and an optional explicitly authorized browser evaluation. Its isolated Kerf lint pass preserves each file's applicable core-rule and suppression settings without executing consumer plugin rules. It emits one portable versioned JSON report with deterministic exit codes, exact suppressions, monorepo package selection, changed/full modes, caching, and local-path redaction. See the [UI doctor guide](./docs/ui-doctor.md).
307
500
 
308
501
  For code generation, pair catalog selection guidance with the checked-in
309
502
  [`public-api-signatures-v1.md`](./ai/public-api-signatures-v1.md) declaration
@@ -333,6 +526,24 @@ roots therefore do not need a transitive stylesheet list, and removing the last
333
526
  component import also removes its reachable CSS. This is component-level CSS
334
527
  tree shaking; variants within an imported component remain together.
335
528
 
529
+ When one public subpath groups several visual components, its source is a
530
+ folder: one component per file and one owned stylesheet per visual component.
531
+ The public JavaScript/TypeScript compatibility entrypoint only re-exports those
532
+ modules, and its CSS compatibility entrypoint only imports the owner
533
+ stylesheets. Do not accumulate multiple visual owners in either compatibility
534
+ file.
535
+
536
+ `npm run check:css-ownership` keeps that boundary honest: application CSS may
537
+ style only application-owned structure, never package component classes or
538
+ Web Awesome descendants, and a package component's stylesheet styles only
539
+ itself (in a composing parent's context when needed) — never another kerf
540
+ component's root, the `wa-*` tags it renders, its variables, or a hook class on
541
+ its root. The UX catalog's `style.css` contains document-shell
542
+ mechanics only, recipes ship no stylesheets (`npm run check:recipes` rejects
543
+ route stylesheets, inline styles, and styling-only classes), and `catalog.css`
544
+ remains a
545
+ minimal compatibility entrypoint.
546
+
336
547
  The root `@kerfjs/ui` barrel stays JavaScript-only because making a side-effectful
337
548
  CSS barrel tree-shakable is not portable across bundlers. If an application uses
338
549
  that convenience import, also import `@kerfjs/ui/styles.css`, which deliberately
@@ -344,30 +555,45 @@ manual delivery. Its complete supported `--kui-*` token surface is cataloged
344
555
  under the `foundation` entry. Load application overrides after package styles,
345
556
  or scope variables directly on a component instance.
346
557
 
558
+ Applications can separately opt into `@kerfjs/ui/document.css` for border-box
559
+ sizing, token-backed body typography/colors, zero body margin, plain-link color,
560
+ inherited native table-cell and form-control font metrics, and a definite
561
+ full-height chain. Add `class="kui-app-root"` to the one direct
562
+ mount container when a percentage-height application shell must fill the
563
+ viewport. This global baseline is deliberately absent from `styles.css` and
564
+ component browser imports. See [Document baseline](./docs/document-baseline.md).
565
+
347
566
  ## Pane and content geometry
348
567
 
349
- Import `@kerfjs/ui/layout.css` and use the same structural vocabulary for a
350
- sidebar, main area, inspector, or dialog. `.kui-pane` is unpadded and contains
351
- an optional toolbar, one scrolling `.kui-pane__content`, and an optional footer.
352
- Add `.kui-content` to make its major children a vertical stack with 24px gaps.
568
+ Render `Pane` (`@kerfjs/ui/pane`) for a sidebar, main area, inspector, or
569
+ dialog: the same structural vocabulary everywhere. Its `.kui-pane` root is
570
+ unpadded and contains an optional header, one scrolling `.kui-pane__content`,
571
+ and an optional footer; the content slot already carries `.kui-content`, which
572
+ makes its major children a vertical stack with 24px gaps. Choose landmark
573
+ semantics with `element` / `contentElement` rather than writing the pane
574
+ classes onto your own elements — `eslint-plugin-kerfjs` reports a component's
575
+ anatomy class on an application-owned element as `KUI-L103`.
353
576
 
354
577
  ```tsx
355
- <aside class="kui-pane">
356
- <div class="kui-pane__toolbar"><Toolbar label="Workspace" ... /></div>
357
- <nav class="kui-pane__content kui-content">
358
- <section>
359
- <ListHeader label="Workspace" count={3} countLabel="3 workspaces" />
360
- <ListItem action="open" label="Inbox" icon={inboxIcon} />
361
- <ListItem action="open" label="Drafts" />
362
- </section>
363
- <div class="kui-content-item">Workspace details</div>
364
- </nav>
365
- </aside>
578
+ <Pane
579
+ element="aside"
580
+ label="Workspace"
581
+ contentElement="nav"
582
+ header={<Toolbar label="Workspace" ... />}
583
+ >
584
+ <section>
585
+ <ListHeader label="Workspace" count={3} countLabel="3 workspaces" />
586
+ <ListItem action="open" label="Inbox" icon={inboxIcon} />
587
+ <ListItem action="open" label="Drafts" />
588
+ </section>
589
+ <ContentItem>Workspace details</ContentItem>
590
+ </Pane>
366
591
  ```
367
592
 
368
- Ordinary children use `.kui-content-item`: 8px inline margin, a real 1px border
369
- (transparent by default), 8px padding, and 12px rounded corners. The pill
370
- modifier uses a 22px radius. A component can expose a transparent border or
593
+ Ordinary children use `ContentItem` (`@kerfjs/ui/content-item`): 8px inline
594
+ margin, a real 1px border (transparent by default), 8px padding, and 12px
595
+ rounded corners. `shape="pill"` uses a 22px radius, and `frame="framed"` paints
596
+ the neutral border only when the item marks a real distinction. A component can expose a transparent border or
371
597
  background without changing layout. `ListHeader` follows the same rule while
372
598
  keeping its dormant title and count-or-badge cluster separate from its optional
373
599
  44px action.
@@ -402,6 +628,9 @@ Awesome modules the application renders.
402
628
  `webawesome.css` includes Web Awesome's native/base theme and then applies the
403
629
  Hot Sheet 2 palette, surfaces, status colors, focus treatment, form geometry,
404
630
  radii, tooltips, and shadows through Web Awesome's public `--wa-*` contract.
631
+ On `wa-dialog`, the optional `hide-actions` class hides the exported
632
+ `header-actions` shadow part for compositions that provide another dismissal
633
+ affordance.
405
634
  Those tokens flow into all free component families. Every free Web Awesome 3.12
406
635
  component has an individual UX-catalog route under the collapsible ecosystem
407
636
  section, but the theme entry does not import or register component JavaScript,
@@ -410,8 +639,8 @@ Tooltip and Popover surfaces omit pointer arrows by default. Override
410
639
  `--wa-tooltip-arrow-size` and `--kui-wa-popover-arrow-size`, or a single
411
640
  popover's public `--arrow-size`, when an arrow communicates useful context.
412
641
 
413
- Load application CSS afterward to override semantic values globally, or scope
414
- them to a subtree. Use Web Awesome's `.wa-light`, `.wa-dark`, and `.wa-invert`
642
+ Configure semantic values globally at the application root, or scope variables
643
+ to a self-owned subtree. Use Web Awesome's `.wa-light`, `.wa-dark`, and `.wa-invert`
415
644
  classes for explicit appearance boundaries:
416
645
 
417
646
  ```css
@@ -422,18 +651,25 @@ classes for explicit appearance boundaries:
422
651
  ```
423
652
 
424
653
  `foundation.css` follows Hot Sheet 2's Web Awesome-compatible semantic palette.
425
- Brand, neutral, success, warning, and danger each expose fill, border, and
426
- foreground roles through `--kui-color-*`; stateful components also expose
654
+ Brand, pop, neutral, success, warning, and danger each expose fill, border, and
655
+ foreground roles through `--kui-color-*`. Pop is attractive, non-status emphasis
656
+ for featured, novel, or celebratory content; it never substitutes for success,
657
+ warning, or danger. Stateful components also expose
427
658
  component variables such as `--kui-state-banner-background`. Override the
428
659
  foundation for an application theme, a tone variable for one semantic state, or
429
660
  a component variable on one instance without replacing component selectors.
430
- Prefer an equivalent prop or token. When composition-specific layout still
431
- needs a selector, the component catalog's `publicClasses` arrays define the
432
- exact stable anatomy: public-class-to-public-class selectors are supported;
433
- descendant tag, id, attribute-only, and unlisted-class selectors are not.
434
-
435
- `StateBanner` has opinionated `neutral`, `info`, `success`, `warning`, and
436
- `danger` palettes. Override an individual banner with
661
+ Prefer an equivalent prop or token. The component catalog's `publicClasses`
662
+ arrays support diagnostics, tooling, browser assertions, and package-owned
663
+ composition; they are not an application styling API. Application-owned CSS may
664
+ style new structure rendered by its own component, but it must not select a
665
+ nested Kerf or Web Awesome component. Add missing configuration to the owner.
666
+ Markup follows the same rule: write only an entry's `placeableClasses` (layout
667
+ utilities, `kui-app-root`, `kui-content-item` on a non-div carrier) onto your
668
+ own elements; any other public class recreates a component by class, which
669
+ `eslint-plugin-kerfjs` reports as `KUI-L103` with the component to render.
670
+
671
+ `StateBanner` has opinionated `neutral`, `info`, `pop`, `success`, `warning`,
672
+ and `danger` palettes. Override an individual banner with
437
673
  `--kui-state-banner-background`, `--kui-state-banner-border`,
438
674
  `--kui-state-banner-foreground`, `--kui-state-banner-detail`,
439
675
  `--kui-state-banner-action-background`, and
@@ -468,18 +704,91 @@ value through `data-segment-value`. Override an instance through
468
704
  `--kui-segmented-{background|border|foreground|hover-background}` and
469
705
  `--kui-segmented-selected-{background|foreground|border|shadow}`.
470
706
 
707
+ `ChoiceChips` is the wrapping exclusive choice for a visible set too large for
708
+ one segmented track, such as a labeled color palette. Each choice is a separate
709
+ pill backed by a native radio, so the group is one Tab stop, arrow keys move
710
+ the selection, and the checked radio submits the form value under `name`. A
711
+ choice may lead with a `swatch` (a `CssColor`, or `'transparent'` for the
712
+ struck-through no-color dot) or a decorative `icon`:
713
+
714
+ ```tsx
715
+ <ChoiceChips
716
+ name="color"
717
+ label="Command color"
718
+ value={color.value}
719
+ action="select-command-color"
720
+ choices={[
721
+ { value: "transparent", label: "Transparent", swatch: "transparent" },
722
+ { value: "blue", label: "Blue", swatch: fillColor("#3b82f6") },
723
+ ]}
724
+ />
725
+ ```
726
+
727
+ Listen for `change` on the supplied action (for example
728
+ `delegateActions(root, "change", { "select-command-color": … })`), read the
729
+ radio's `value`, and re-render.
730
+
731
+ Set `multiple` when any number of the options may be on, such as label filters
732
+ or annotation intents. `value` is then a `readonly Value[]`, the pills are
733
+ native checkboxes in a `role="group"` (each a Tab stop that Space toggles), and
734
+ every checked value submits under `name`. Read the checked boxes by name in the
735
+ change handler. A multiple group takes no `required`. On dark inverse chrome,
736
+ place the chips in a dark appearance scope (`.wa-dark`) instead of restyling
737
+ them.
738
+
739
+ `Composer` is the chat or prompt composer: a raised frame (the standard
740
+ border, large radius, and `shadow-l`) whose border turns brand while focus is
741
+ within. Its borderless message field grows with its content between `minRows`
742
+ (default 1) and `maxRows` (default 8) lines, then scrolls, above an action row
743
+ with an optional quiet `hint` and the trailing `actions`:
744
+
745
+ ```tsx
746
+ <Composer
747
+ id="assistant-message"
748
+ name="message"
749
+ label="Message"
750
+ placeholder="Ask about this build"
751
+ hint="Answers use the latest nightly build."
752
+ actions={<wa-button variant="brand" data-action="send-message">Send</wa-button>}
753
+ />
754
+ ```
755
+
756
+ The app reads and clears the textarea from its send action. For
757
+ Enter-to-send, set `submitOnEnter` and call `wireComposers(root)` from
758
+ `@kerfjs/ui/wire-composers` once: Enter or Cmd/Ctrl+Enter clicks the first
759
+ trailing action, Shift+Enter inserts a newline, and an IME composition commit
760
+ or an empty message never sends. Put it in a `DialogSurface` with
761
+ `footerPresentation="floating"` (`slot="footer"`) to float it over a
762
+ transcript, and give the transcript `scrollClearance="block-end"` so it
763
+ scrolls beneath the composer while its last message still rests above it.
764
+ Add `headerPresentation="floating"` with a `fill` body and
765
+ `scrollClearance="both"` to let the transcript scroll beneath a translucent
766
+ title bar as well.
767
+
471
768
  `TokenSearchField` is a token-controlled contenteditable searchbox that keeps
472
769
  free text and ordered filter chips in one field. Its editable text stays
473
770
  DOM-owned between token changes so typing does not replace the caret. Tokens
474
771
  expose stable edit/remove actions and remain atomic during editing; the app owns
475
- parsing, suggestions, query execution, and state. Use `readTokenSearchField()`
772
+ parsing, suggestions, query execution, and state in manual mode. For automatic
773
+ handling, create a model with `createTokenSearchModel({ rules, evaluate })`,
774
+ pass it as the field's `model`, and register it under the field id in
775
+ `wireTokenSearchFields(root, { models })`. Rules parse `name:value` expressions;
776
+ their optional `suggest` function supplies selectable completions. The model
777
+ commits valid expressions on whitespace or Enter, owns chips and clear/edit/
778
+ remove actions, and exposes `state`, `suggestions`, and the latest `result` as
779
+ signals. Omit the model to retain full manual control. Use `readTokenSearchField()`
476
780
  after browser input to recover text plus token offsets, and
477
781
  `placeTokenSearchCaret()` when restoring focus after a controlled update.
478
782
  Call `wireTokenSearchFields()` once at a stable root to make Enter submit through
479
783
  `onSubmit` without inserting a contenteditable line break and to preserve focus
480
784
  plus the text-relative caret when keyboard deletion of a chip causes controlled
481
785
  rendering to replace the editor. A select-all deletion is normalized to a truly
482
- empty editor even when the browser leaves an atomic chip or line break behind.
786
+ empty editor even when the browser leaves an atomic chip or line break behind;
787
+ replacement typing consumes that intent so a later Backspace/Delete remains an
788
+ ordinary character edit.
789
+ Managed deletion keeps a collapsible replacement editor open and focused before
790
+ the next keystroke; applications must persist both query and tokens from the DOM
791
+ read. Genuine outside focus and Escape still collapse an empty field.
483
792
  Text still wraps visually when it reaches the field edge.
484
793
  Clear actions should empty the editor's `textContent` before clearing app state.
485
794
  The leading icon, first text line, clear action, and trailing slot share one
@@ -503,6 +812,11 @@ drag, the scroll strip automatically moves toward either edge with speed based
503
812
  on pointer proximity, exposing earlier or later drop targets. Apply the reported
504
813
  change with `reorderTabs()` or application-specific state logic. The application
505
814
  still owns selection, closing, routing, and persistence.
815
+ For a tab-local action immediately after the final tab plus a workspace action
816
+ at the opposite edge, set `trailingPlacement="adjacent"`, pass the local action
817
+ through `trailing`, and pass the workspace action through `end`. TabBar owns the
818
+ flex geometry: the tab strip shrinks and scrolls while both action regions stay
819
+ visible. Do not recreate that split with descendant CSS overrides.
506
820
  Use `AppTab.rootAttributes` for domain `data-*` metadata and `closeIcon` for a
507
821
  decorative replacement glyph. The runtime rejects roles and case variants of
508
822
  the component- or wiring-owned action, tab identity, selection, drag, drop, and
@@ -516,11 +830,23 @@ import "@kerfjs/ui/webawesome.css";
516
830
  import "@kerfjs/ui/select/register";
517
831
  ```
518
832
 
519
- That boundary keeps Web Awesome and its custom-element side effects out of bundles that use unrelated components. Automated consumer-bundle tests enforce it.
833
+ That boundary keeps Web Awesome and its custom-element side effects out of bundles that use unrelated components. Automated consumer-bundle tests enforce it. `PopupMenu` follows the same rule: import `@kerfjs/ui/popup-menu/register` once to register the dropdown, item, button, and divider elements it renders. Either registration also installs help tags: an icon-only Select, PopupMenu, or `aria-label`-named `<button>` in a `ToolbarControlGroup` shows its name in an `aria-hidden` tooltip on hover and keyboard focus. A toolbar with icon-only buttons but neither control imports `@kerfjs/ui/help-tags/register`, which registers only the tooltip.
834
+
835
+ `PopupMenu` items may include `submenu` children, `checked` choices, a leading `icon`, trailing `details`, `disabledReason`, and a `danger` tone. The app owns choice state and dispatches each item's `action`. For a right-click menu, set `context: true`, a `label`, and `anchor={pointSignal.value}`; the app's `contextmenu` handler stores `{ x: event.clientX, y: event.clientY }` in that signal and calls `openPopupMenu(menu)`. The menu renders its own zero-footprint anchor host and keeps the point across re-renders, so it needs no wrapper or CSS (`openPopupMenuAt(menu, x, y)` still opens a menu rendered without `anchor`); `closePopupMenu(menu)` closes it programmatically. See [component selection](docs/component-selection.md#popup-menu-migration) for examples.
836
+ Use `label` for a visible label or `ariaLabel` for a visually hidden name. A
837
+ nonempty visible label takes precedence when both are supplied. Kerf names the
838
+ actual shadow combobox without adding visible label spacing; this also works
839
+ with `renderSelected`, and needs no application shadow-DOM patch. Use `hint`
840
+ for persistent supporting text below the control and `placeholderText` for the
841
+ empty value inside the closed control. Loading placeholders preserve the hint.
842
+
520
843
  `Select` also owns the Kerf/Web Awesome reconciliation boundary: option icons
521
844
  keep stable slotted elements across rerenders, and `renderSelected` content is
522
845
  replaced when the controlled value changes. Consumers do not need to add
523
- `data-key` or `data-morph-skip` workarounds around choice icons.
846
+ `data-key` or `data-morph-skip` workarounds around choice icons. Icon-bearing
847
+ options retain the standard icon-to-label gap. When a compact Select is wrapped
848
+ in a `ToolbarControlGroup`, use `focusRingOwner="group"`; the group paints the
849
+ focus ring with its configured pill or rounded geometry.
524
850
 
525
851
  For application choices and panes, prefer Kerf's purpose-built primitives:
526
852
  `Select` over direct Web Awesome selection/dropdown composition,
@@ -529,7 +855,12 @@ Awesome Tabs, `LucideIcon` over Web Awesome Icon, and `ResizableRegion` over
529
855
  Split Panel. `ResizableRegion` includes Hot Sheet 2's 1px separator and
530
856
  hover/focus grip. Its optional `handleIcon` replaces only the decorative glyph;
531
857
  the component and `wireResizableRegions()` retain separator semantics and
532
- pointer/keyboard behavior. Consider Web Awesome Popup when its anchored-positioning
858
+ pointer/keyboard behavior. Typed policies cover separator visibility,
859
+ instant-track/composited-content collapse, popup-safe overflow,
860
+ inline/overlay/hidden responsive presentation, `responsiveFillAt` single-track
861
+ replacement, and safe-area restore controls;
862
+ the same policies are available on `Workbench` and `CollapsiblePanel`. Consider
863
+ Web Awesome Popup when its anchored-positioning
533
864
  engine removes custom placement code; treat Tree, Animated Image, Comparison,
534
865
  Zoomable Frame, and the displaced alternatives above as exceptional rather
535
866
  than default patterns. The detailed rationale lives in the theme contract.
@@ -539,6 +870,7 @@ than default patterns. The detailed rationale lives in the theme contract.
539
870
  - [Component selection and composition](./docs/component-selection.md)
540
871
  - [Design philosophy](./docs/design-philosophy.md)
541
872
  - [Apple HIG translation](./docs/apple-hig.md)
873
+ - [Writing interface copy](./docs/writing.md)
542
874
  - [Accessibility and keyboard contracts](./docs/accessibility.md)
543
875
  - [Component and integration contract](./docs/component-contract.md)
544
876
  - [Spacing and application layout](./docs/layout.md)
@@ -557,3 +889,16 @@ For dimensions that should scale with the root font size, author pixels with
557
889
  baseline. Keep intentional 1px borders in pixels and contextual `em` values
558
890
  explicit. `npm run build` emits standard CSS to `dist/styles`; `npm run dev`
559
891
  applies the same transform directly to source styles and hot-reloads edits.
892
+
893
+ Lowered surfaces and decorative neutral fills/borders use translucent shared theme colors. Nested surfaces compound naturally; demos compose public components without per-depth overrides. See [contextual transparency](docs/webawesome-theme.md#contextual-transparency).
894
+
895
+ `ToolbarText` and `ToolbarControlGroup` accept typed `hideBelow`/`showBelow`
896
+ lengths (for example `px(416)`). Wire `wireToolbarVisibility(root)` from
897
+ `@kerfjs/ui/wire-toolbar-visibility` and dispose on unmount. Thresholds use the
898
+ nearest Toolbar content-box width: hideBelow hides strictly below, showBelow
899
+ shows strictly below, with complementary behavior at equality. Percentages use
900
+ that content width; em and custom properties use the item's own context. Invalid,
901
+ negative, unresolved, or contradictory values leave the item visible under this
902
+ width policy. Keep primary actions visible and offer a complementary overflow
903
+ group. See `docs/component-contract.md` "Toolbar width visibility" for lifecycle
904
+ details.