@kerfjs/ui 5.0.0-beta.11 → 5.0.0-beta.110

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 (1358) hide show
  1. package/README.md +707 -160
  2. package/ai/application-ui-diagnostic-ids-v1.json +115 -0
  3. package/ai/application-ui-profile-sync.cjs +548 -0
  4. package/ai/application-ui-profile.d.mts +1 -0
  5. package/ai/application-ui-profile.d.ts +106 -0
  6. package/ai/application-ui-profile.defaults.json +222 -0
  7. package/ai/application-ui-profile.mjs +653 -0
  8. package/ai/application-ui-profile.schema.json +140 -0
  9. package/ai/catalog-authoring.json +34 -0
  10. package/ai/catalog-authoring.schema.json +105 -0
  11. package/ai/compile-time-contracts-v1.json +149 -0
  12. package/ai/compile-time-contracts-v1.schema.json +52 -0
  13. package/ai/component-catalog-extension.schema.json +104 -0
  14. package/ai/component-catalog.json +9111 -1376
  15. package/ai/component-catalog.schema.json +94 -1
  16. package/ai/component-class-owners.cjs +83 -0
  17. package/ai/component-composition-extension.d.ts +7 -0
  18. package/ai/component-composition-extension.schema.json +7 -0
  19. package/ai/component-composition-rules.json +570 -0
  20. package/ai/component-composition.d.ts +143 -0
  21. package/ai/component-composition.json +10437 -0
  22. package/ai/component-composition.schema.json +444 -0
  23. package/ai/components/README.md +206 -0
  24. package/ai/components/anchored-surface.md +99 -0
  25. package/ai/components/application-tabs.md +65 -0
  26. package/ai/components/backdrop-image.md +84 -0
  27. package/ai/components/badge.md +77 -0
  28. package/ai/components/button.md +94 -0
  29. package/ai/components/checkbox-group.md +89 -0
  30. package/ai/components/checkbox.md +90 -0
  31. package/ai/components/chip.md +80 -0
  32. package/ai/components/choice-chips.md +93 -0
  33. package/ai/components/collapsible-panel.md +103 -0
  34. package/ai/components/color-field.md +92 -0
  35. package/ai/components/color-picker.md +93 -0
  36. package/ai/components/color-swatches.md +82 -0
  37. package/ai/components/column-track.md +78 -0
  38. package/ai/components/combobox.md +90 -0
  39. package/ai/components/content-item.md +101 -0
  40. package/ai/components/content-swap.md +78 -0
  41. package/ai/components/corner-status.md +88 -0
  42. package/ai/components/disclosure-arrow.md +77 -0
  43. package/ai/components/disclosure.md +88 -0
  44. package/ai/components/document-baseline.md +77 -0
  45. package/ai/components/edge-activity-indicator.md +81 -0
  46. package/ai/components/empty-state.md +80 -0
  47. package/ai/components/feedback.md +71 -0
  48. package/ai/components/file-picker.md +89 -0
  49. package/ai/components/floating-toolbar.md +82 -0
  50. package/ai/components/foundation.md +65 -0
  51. package/ai/components/framed-list.md +80 -0
  52. package/ai/components/grid.md +101 -0
  53. package/ai/components/headers.md +63 -0
  54. package/ai/components/layout.md +75 -0
  55. package/ai/components/list-action-row.md +108 -0
  56. package/ai/components/list-detail-dialog.md +90 -0
  57. package/ai/components/list-header.md +91 -0
  58. package/ai/components/list-inset-control.md +74 -0
  59. package/ai/components/list-inset-text.md +72 -0
  60. package/ai/components/list-item.md +108 -0
  61. package/ai/components/list.md +127 -0
  62. package/ai/components/loading-spinner.md +73 -0
  63. package/ai/components/lucide-icon.md +99 -0
  64. package/ai/components/message-composer.md +85 -0
  65. package/ai/components/nav-stack.md +120 -0
  66. package/ai/components/pane.md +127 -0
  67. package/ai/components/popup-menu.md +174 -0
  68. package/ai/components/progress-bar.md +82 -0
  69. package/ai/components/progress-ring.md +80 -0
  70. package/ai/components/radio-group.md +89 -0
  71. package/ai/components/recipe-app-shell.md +57 -0
  72. package/ai/components/recipe-collapsible-sidebar.md +57 -0
  73. package/ai/components/recipe-compact-toolbar.md +57 -0
  74. package/ai/components/recipe-composer-form.md +57 -0
  75. package/ai/components/recipe-list-detail-dialog.md +57 -0
  76. package/ai/components/recipe-list-workspace-states.md +57 -0
  77. package/ai/components/recipe-loading-inspector.md +57 -0
  78. package/ai/components/recipe-media-detail.md +57 -0
  79. package/ai/components/recipe-navigation-sidebar.md +57 -0
  80. package/ai/components/recipe-navigation-stack.md +57 -0
  81. package/ai/components/recipe-workspace-header.md +57 -0
  82. package/ai/components/resize.md +106 -0
  83. package/ai/components/row.md +96 -0
  84. package/ai/components/search-field.md +108 -0
  85. package/ai/components/segmented-control.md +83 -0
  86. package/ai/components/select.md +118 -0
  87. package/ai/components/skeleton.md +84 -0
  88. package/ai/components/slider.md +84 -0
  89. package/ai/components/spacer.md +86 -0
  90. package/ai/components/split-button.md +83 -0
  91. package/ai/components/split-view.md +105 -0
  92. package/ai/components/state-banner.md +96 -0
  93. package/ai/components/summary-row.md +85 -0
  94. package/ai/components/sunken-panel.md +79 -0
  95. package/ai/components/surface-scaffold.md +117 -0
  96. package/ai/components/switch.md +81 -0
  97. package/ai/components/tab-bar.md +114 -0
  98. package/ai/components/tab-navigator.md +105 -0
  99. package/ai/components/tabs.md +95 -0
  100. package/ai/components/tag-field.md +86 -0
  101. package/ai/components/text-field.md +102 -0
  102. package/ai/components/text.md +93 -0
  103. package/ai/components/toast.md +85 -0
  104. package/ai/components/toolbar-control-group.md +127 -0
  105. package/ai/components/toolbar-text.md +100 -0
  106. package/ai/components/toolbar.md +103 -0
  107. package/ai/components/tooltip.md +81 -0
  108. package/ai/components/value-table.md +80 -0
  109. package/ai/components/wa-accordion-item.md +61 -0
  110. package/ai/components/wa-accordion.md +71 -0
  111. package/ai/components/wa-animated-image.md +56 -0
  112. package/ai/components/wa-animation.md +56 -0
  113. package/ai/components/wa-avatar.md +56 -0
  114. package/ai/components/wa-badge.md +62 -0
  115. package/ai/components/wa-breadcrumb-item.md +54 -0
  116. package/ai/components/wa-breadcrumb.md +56 -0
  117. package/ai/components/wa-button-group.md +62 -0
  118. package/ai/components/wa-button.md +61 -0
  119. package/ai/components/wa-callout.md +60 -0
  120. package/ai/components/wa-card.md +67 -0
  121. package/ai/components/wa-carousel-item.md +54 -0
  122. package/ai/components/wa-carousel.md +56 -0
  123. package/ai/components/wa-checkbox-group.md +62 -0
  124. package/ai/components/wa-checkbox.md +61 -0
  125. package/ai/components/wa-color-picker.md +63 -0
  126. package/ai/components/wa-comparison.md +56 -0
  127. package/ai/components/wa-copy-button.md +56 -0
  128. package/ai/components/wa-details.md +67 -0
  129. package/ai/components/wa-dialog.md +65 -0
  130. package/ai/components/wa-divider.md +54 -0
  131. package/ai/components/wa-drawer.md +62 -0
  132. package/ai/components/wa-dropdown-item.md +62 -0
  133. package/ai/components/wa-dropdown.md +62 -0
  134. package/ai/components/wa-format-bytes.md +54 -0
  135. package/ai/components/wa-format-date.md +54 -0
  136. package/ai/components/wa-format-number.md +54 -0
  137. package/ai/components/wa-icon.md +59 -0
  138. package/ai/components/wa-include.md +55 -0
  139. package/ai/components/wa-input.md +62 -0
  140. package/ai/components/wa-intersection-observer.md +54 -0
  141. package/ai/components/wa-known-date.md +54 -0
  142. package/ai/components/wa-markdown.md +54 -0
  143. package/ai/components/wa-mutation-observer.md +54 -0
  144. package/ai/components/wa-number-input.md +56 -0
  145. package/ai/components/wa-option.md +61 -0
  146. package/ai/components/wa-otp-input.md +54 -0
  147. package/ai/components/wa-page.md +62 -0
  148. package/ai/components/wa-pagination.md +56 -0
  149. package/ai/components/wa-popover.md +61 -0
  150. package/ai/components/wa-popup.md +60 -0
  151. package/ai/components/wa-progress-bar.md +60 -0
  152. package/ai/components/wa-progress-ring.md +60 -0
  153. package/ai/components/wa-qr-code.md +54 -0
  154. package/ai/components/wa-radio-group.md +67 -0
  155. package/ai/components/wa-radio.md +61 -0
  156. package/ai/components/wa-random-content.md +54 -0
  157. package/ai/components/wa-rating.md +56 -0
  158. package/ai/components/wa-relative-time.md +54 -0
  159. package/ai/components/wa-resize-observer.md +54 -0
  160. package/ai/components/wa-scroller.md +61 -0
  161. package/ai/components/wa-select.md +65 -0
  162. package/ai/components/wa-skeleton.md +60 -0
  163. package/ai/components/wa-slider.md +61 -0
  164. package/ai/components/wa-spinner.md +60 -0
  165. package/ai/components/wa-split-panel.md +60 -0
  166. package/ai/components/wa-step.md +56 -0
  167. package/ai/components/wa-stepper.md +56 -0
  168. package/ai/components/wa-switch.md +60 -0
  169. package/ai/components/wa-tab-group.md +71 -0
  170. package/ai/components/wa-tab-panel.md +62 -0
  171. package/ai/components/wa-tab.md +61 -0
  172. package/ai/components/wa-tag-input.md +62 -0
  173. package/ai/components/wa-tag.md +62 -0
  174. package/ai/components/wa-textarea.md +60 -0
  175. package/ai/components/wa-time-input.md +56 -0
  176. package/ai/components/wa-toast-item.md +62 -0
  177. package/ai/components/wa-toast.md +62 -0
  178. package/ai/components/wa-tooltip.md +61 -0
  179. package/ai/components/wa-tree-item.md +56 -0
  180. package/ai/components/wa-tree.md +56 -0
  181. package/ai/components/wa-zoomable-frame.md +56 -0
  182. package/ai/components/workbench-dialog.md +90 -0
  183. package/ai/components/workbench.md +120 -0
  184. package/ai/public-api-signatures-v1.md +6114 -445
  185. package/ai/skill.md +545 -65
  186. package/ai/webawesome-jsx-signatures-v1.md +12 -2
  187. package/analyzer/cli.mjs +49 -0
  188. package/analyzer/component-ownership.d.mts +72 -0
  189. package/analyzer/component-ownership.mjs +429 -0
  190. package/analyzer/index.d.mts +53 -0
  191. package/analyzer/index.mjs +2375 -0
  192. package/analyzer/loud-pairs.d.mts +49 -0
  193. package/analyzer/loud-pairs.mjs +357 -0
  194. package/analyzer/report.schema.json +66 -0
  195. package/analyzer/selectors.d.mts +21 -0
  196. package/analyzer/selectors.mjs +212 -0
  197. package/catalog-projection-cli.mjs +96 -0
  198. package/catalog-projection.d.mts +55 -0
  199. package/catalog-projection.mjs +62 -0
  200. package/dist/anchored-surface.d.ts +69 -0
  201. package/dist/anchored-surface.js +3 -0
  202. package/dist/anchored-surface.js.map +1 -0
  203. package/dist/backdrop-image.d.ts +132 -0
  204. package/dist/backdrop-image.js +5 -0
  205. package/dist/backdrop-image.js.map +1 -0
  206. package/dist/badge.d.ts +91 -0
  207. package/dist/badge.js +4 -0
  208. package/dist/badge.js.map +1 -0
  209. package/dist/browser/anchored-surface.js +3 -0
  210. package/dist/browser/backdrop-image.js +3 -0
  211. package/dist/browser/badge.js +3 -0
  212. package/dist/browser/button.js +5 -0
  213. package/dist/browser/catalog.js +29 -0
  214. package/dist/browser/checkbox-group.js +5 -0
  215. package/dist/browser/checkbox.js +4 -0
  216. package/dist/browser/chip.js +3 -0
  217. package/dist/browser/choice-chips.js +3 -0
  218. package/dist/browser/collapsible-panel.js +9 -0
  219. package/dist/browser/color-field.js +4 -0
  220. package/dist/browser/color-picker.js +5 -0
  221. package/dist/browser/color-swatches.js +3 -0
  222. package/dist/browser/column-track.js +3 -0
  223. package/dist/browser/combobox.js +3 -0
  224. package/dist/browser/content-item.js +3 -0
  225. package/dist/browser/content-swap.js +3 -0
  226. package/dist/browser/corner-status.js +3 -0
  227. package/dist/browser/disclosure.js +5 -0
  228. package/dist/browser/edge-activity-indicator.js +3 -0
  229. package/dist/browser/file-picker.js +3 -0
  230. package/dist/browser/framed-list.js +3 -0
  231. package/dist/browser/grid.js +3 -0
  232. package/dist/browser/list-action-row.js +3 -0
  233. package/dist/browser/list-detail-dialog.js +14 -0
  234. package/dist/browser/list-header.js +3 -1
  235. package/dist/browser/list-inset-control.js +3 -0
  236. package/dist/browser/list-inset-text.js +3 -0
  237. package/dist/browser/list-item.js +1 -0
  238. package/dist/browser/list.js +3 -0
  239. package/dist/browser/message-composer.js +5 -0
  240. package/dist/browser/nav-stack.js +11 -0
  241. package/dist/browser/pane.js +3 -0
  242. package/dist/browser/popup-menu.js +4 -0
  243. package/dist/browser/progress-bar.js +3 -0
  244. package/dist/browser/progress-ring.js +3 -0
  245. package/dist/browser/radio-group.js +3 -0
  246. package/dist/browser/row.js +3 -0
  247. package/dist/browser/search-field.js +4 -0
  248. package/dist/browser/segmented-control.js +0 -1
  249. package/dist/browser/select.js +2 -1
  250. package/dist/browser/slider.js +3 -0
  251. package/dist/browser/spacer.js +3 -0
  252. package/dist/browser/split-button.js +5 -0
  253. package/dist/browser/split-view.js +13 -0
  254. package/dist/browser/state-banner.js +1 -0
  255. package/dist/browser/summary-row.js +3 -0
  256. package/dist/browser/sunken-panel.js +3 -0
  257. package/dist/browser/surface-scaffold.js +4 -0
  258. package/dist/browser/switch.js +3 -0
  259. package/dist/browser/tab-bar-item.js +4 -0
  260. package/dist/browser/tab-navigator.js +4 -0
  261. package/dist/browser/tag-field.js +5 -0
  262. package/dist/browser/text-field.js +4 -0
  263. package/dist/browser/text.js +3 -0
  264. package/dist/browser/toolbar-control-group.js +1 -0
  265. package/dist/browser/workbench-dialog.js +15 -0
  266. package/dist/browser/workbench.js +14 -0
  267. package/dist/button.d.ts +121 -0
  268. package/dist/button.js +7 -0
  269. package/dist/button.js.map +1 -0
  270. package/dist/catalog-resources.d.ts +50 -0
  271. package/dist/catalog-resources.js +22 -0
  272. package/dist/catalog-resources.js.map +1 -0
  273. package/dist/catalog.d.ts +134 -101
  274. package/dist/catalog.js +700 -108
  275. package/dist/catalog.js.map +1 -1
  276. package/dist/checkbox-group.d.ts +70 -0
  277. package/dist/checkbox-group.js +7 -0
  278. package/dist/checkbox-group.js.map +1 -0
  279. package/dist/checkbox.d.ts +45 -0
  280. package/dist/checkbox.js +6 -0
  281. package/dist/checkbox.js.map +1 -0
  282. package/dist/chip.d.ts +117 -0
  283. package/dist/chip.js +4 -0
  284. package/dist/chip.js.map +1 -0
  285. package/dist/choice-chips.d.ts +116 -0
  286. package/dist/choice-chips.js +3 -0
  287. package/dist/choice-chips.js.map +1 -0
  288. package/dist/chunk-2FW7D4IG.js +52 -0
  289. package/dist/chunk-2FW7D4IG.js.map +1 -0
  290. package/dist/chunk-2GOCOLQL.js +270 -0
  291. package/dist/chunk-2GOCOLQL.js.map +1 -0
  292. package/dist/chunk-2LM3PYHA.js +300 -0
  293. package/dist/chunk-2LM3PYHA.js.map +1 -0
  294. package/dist/chunk-36HVQ72F.js +123 -0
  295. package/dist/chunk-36HVQ72F.js.map +1 -0
  296. package/dist/chunk-3GLYIIFR.js +230 -0
  297. package/dist/chunk-3GLYIIFR.js.map +1 -0
  298. package/dist/chunk-3VZ6SFD4.js +8 -0
  299. package/dist/chunk-3VZ6SFD4.js.map +1 -0
  300. package/dist/chunk-3WYREXW4.js +120 -0
  301. package/dist/chunk-3WYREXW4.js.map +1 -0
  302. package/dist/chunk-3Z7N2NAZ.js +385 -0
  303. package/dist/chunk-3Z7N2NAZ.js.map +1 -0
  304. package/dist/chunk-4OV272LF.js +93 -0
  305. package/dist/chunk-4OV272LF.js.map +1 -0
  306. package/dist/chunk-4RECPEHI.js +67 -0
  307. package/dist/chunk-4RECPEHI.js.map +1 -0
  308. package/dist/chunk-4UB5Z3ZZ.js +68 -0
  309. package/dist/chunk-4UB5Z3ZZ.js.map +1 -0
  310. package/dist/chunk-5J6Z4BWY.js +141 -0
  311. package/dist/chunk-5J6Z4BWY.js.map +1 -0
  312. package/dist/chunk-5USKCWGL.js +113 -0
  313. package/dist/chunk-5USKCWGL.js.map +1 -0
  314. package/dist/chunk-6C6DLP3W.js +31 -0
  315. package/dist/chunk-6C6DLP3W.js.map +1 -0
  316. package/dist/chunk-6CDILXF4.js +204 -0
  317. package/dist/chunk-6CDILXF4.js.map +1 -0
  318. package/dist/chunk-6VVIW7VB.js +69 -0
  319. package/dist/chunk-6VVIW7VB.js.map +1 -0
  320. package/dist/chunk-7AK5I7U7.js +55 -0
  321. package/dist/chunk-7AK5I7U7.js.map +1 -0
  322. package/dist/chunk-7K6U6FCN.js +122 -0
  323. package/dist/chunk-7K6U6FCN.js.map +1 -0
  324. package/dist/chunk-AMIHGFLP.js +59 -0
  325. package/dist/chunk-AMIHGFLP.js.map +1 -0
  326. package/dist/chunk-AN5IWMTM.js +24 -0
  327. package/dist/chunk-AN5IWMTM.js.map +1 -0
  328. package/dist/chunk-ATGAJVZ6.js +268 -0
  329. package/dist/chunk-ATGAJVZ6.js.map +1 -0
  330. package/dist/chunk-AYPGXR2E.js +20 -0
  331. package/dist/chunk-AYPGXR2E.js.map +1 -0
  332. package/dist/chunk-B53PS2LE.js +34 -0
  333. package/dist/chunk-B53PS2LE.js.map +1 -0
  334. package/dist/chunk-BKUMG2KB.js +95 -0
  335. package/dist/chunk-BKUMG2KB.js.map +1 -0
  336. package/dist/chunk-C26Q6P4Q.js +76 -0
  337. package/dist/chunk-C26Q6P4Q.js.map +1 -0
  338. package/dist/chunk-CEJ5FK6G.js +288 -0
  339. package/dist/chunk-CEJ5FK6G.js.map +1 -0
  340. package/dist/chunk-CIAUILRR.js +222 -0
  341. package/dist/chunk-CIAUILRR.js.map +1 -0
  342. package/dist/chunk-CNM6ZWP2.js +38 -0
  343. package/dist/chunk-CNM6ZWP2.js.map +1 -0
  344. package/dist/chunk-CPSGUGAY.js +527 -0
  345. package/dist/chunk-CPSGUGAY.js.map +1 -0
  346. package/dist/chunk-CTQUDCY5.js +26 -0
  347. package/dist/chunk-CTQUDCY5.js.map +1 -0
  348. package/dist/chunk-CVD5IZGB.js +66 -0
  349. package/dist/chunk-CVD5IZGB.js.map +1 -0
  350. package/dist/chunk-D4MXSAMI.js +50 -0
  351. package/dist/chunk-D4MXSAMI.js.map +1 -0
  352. package/dist/chunk-D5RGM3XA.js +38 -0
  353. package/dist/chunk-D5RGM3XA.js.map +1 -0
  354. package/dist/chunk-DZJ4GBSP.js +59 -0
  355. package/dist/chunk-DZJ4GBSP.js.map +1 -0
  356. package/dist/chunk-EIET4QLK.js +51 -0
  357. package/dist/chunk-EIET4QLK.js.map +1 -0
  358. package/dist/chunk-EKHDLBRP.js +86 -0
  359. package/dist/chunk-EKHDLBRP.js.map +1 -0
  360. package/dist/chunk-EYDXFOSH.js +457 -0
  361. package/dist/chunk-EYDXFOSH.js.map +1 -0
  362. package/dist/chunk-G3J7JDP6.js +29 -0
  363. package/dist/chunk-G3J7JDP6.js.map +1 -0
  364. package/dist/chunk-GS2QD3N7.js +14 -0
  365. package/dist/chunk-GS2QD3N7.js.map +1 -0
  366. package/dist/chunk-GXSX6Q6O.js +42 -0
  367. package/dist/chunk-GXSX6Q6O.js.map +1 -0
  368. package/dist/chunk-HDXUHLTQ.js +90 -0
  369. package/dist/chunk-HDXUHLTQ.js.map +1 -0
  370. package/dist/chunk-HJXVVFBT.js +108 -0
  371. package/dist/chunk-HJXVVFBT.js.map +1 -0
  372. package/dist/chunk-HQZG3OFL.js +158 -0
  373. package/dist/chunk-HQZG3OFL.js.map +1 -0
  374. package/dist/chunk-HTERKONR.js +49 -0
  375. package/dist/chunk-HTERKONR.js.map +1 -0
  376. package/dist/chunk-HU5IHXCI.js +73 -0
  377. package/dist/chunk-HU5IHXCI.js.map +1 -0
  378. package/dist/chunk-IKS72C6P.js +53 -0
  379. package/dist/chunk-IKS72C6P.js.map +1 -0
  380. package/dist/chunk-IO27YTL3.js +73 -0
  381. package/dist/chunk-IO27YTL3.js.map +1 -0
  382. package/dist/chunk-IQSRHXZR.js +164 -0
  383. package/dist/chunk-IQSRHXZR.js.map +1 -0
  384. package/dist/chunk-ITUQC4FW.js +163 -0
  385. package/dist/chunk-ITUQC4FW.js.map +1 -0
  386. package/dist/chunk-JCCN3U6X.js +176 -0
  387. package/dist/chunk-JCCN3U6X.js.map +1 -0
  388. package/dist/chunk-K57NINLH.js +137 -0
  389. package/dist/chunk-K57NINLH.js.map +1 -0
  390. package/dist/chunk-KC6WUSNS.js +34 -0
  391. package/dist/chunk-KC6WUSNS.js.map +1 -0
  392. package/dist/chunk-KCS6NJ3O.js +82 -0
  393. package/dist/chunk-KCS6NJ3O.js.map +1 -0
  394. package/dist/chunk-KDQZ3E5C.js +75 -0
  395. package/dist/chunk-KDQZ3E5C.js.map +1 -0
  396. package/dist/chunk-KH4KEMSP.js +71 -0
  397. package/dist/chunk-KH4KEMSP.js.map +1 -0
  398. package/dist/chunk-KK3S5OTW.js +98 -0
  399. package/dist/chunk-KK3S5OTW.js.map +1 -0
  400. package/dist/chunk-KPINJHIC.js +122 -0
  401. package/dist/chunk-KPINJHIC.js.map +1 -0
  402. package/dist/chunk-LMHN2TJL.js +167 -0
  403. package/dist/chunk-LMHN2TJL.js.map +1 -0
  404. package/dist/chunk-LTBVP6VN.js +59 -0
  405. package/dist/chunk-LTBVP6VN.js.map +1 -0
  406. package/dist/{chunk-YGN7OMLT.js → chunk-LZUUUHNH.js} +13 -6
  407. package/dist/chunk-LZUUUHNH.js.map +1 -0
  408. package/dist/chunk-MHMWQ7RB.js +19 -0
  409. package/dist/chunk-MHMWQ7RB.js.map +1 -0
  410. package/dist/chunk-MJ5RU6XT.js +173 -0
  411. package/dist/chunk-MJ5RU6XT.js.map +1 -0
  412. package/dist/chunk-MVKHSAKE.js +169 -0
  413. package/dist/chunk-MVKHSAKE.js.map +1 -0
  414. package/dist/chunk-NB6POCFH.js +103 -0
  415. package/dist/chunk-NB6POCFH.js.map +1 -0
  416. package/dist/chunk-NR6O74ST.js +169 -0
  417. package/dist/chunk-NR6O74ST.js.map +1 -0
  418. package/dist/chunk-OHPYT2BH.js +82 -0
  419. package/dist/chunk-OHPYT2BH.js.map +1 -0
  420. package/dist/chunk-OQP3PFKQ.js +341 -0
  421. package/dist/chunk-OQP3PFKQ.js.map +1 -0
  422. package/dist/chunk-OZ6X76G5.js +547 -0
  423. package/dist/chunk-OZ6X76G5.js.map +1 -0
  424. package/dist/chunk-P7EJ4CAD.js +147 -0
  425. package/dist/chunk-P7EJ4CAD.js.map +1 -0
  426. package/dist/chunk-QDSZTQXL.js +28 -0
  427. package/dist/chunk-QDSZTQXL.js.map +1 -0
  428. package/dist/chunk-QH5KOFNS.js +39 -0
  429. package/dist/chunk-QH5KOFNS.js.map +1 -0
  430. package/dist/chunk-QPTJ5DOO.js +87 -0
  431. package/dist/chunk-QPTJ5DOO.js.map +1 -0
  432. package/dist/chunk-QYMJHS4K.js +36 -0
  433. package/dist/chunk-QYMJHS4K.js.map +1 -0
  434. package/dist/chunk-RMWNO6BA.js +89 -0
  435. package/dist/chunk-RMWNO6BA.js.map +1 -0
  436. package/dist/chunk-S2XULQEK.js +52 -0
  437. package/dist/chunk-S2XULQEK.js.map +1 -0
  438. package/dist/chunk-S3ECMF23.js +33 -0
  439. package/dist/chunk-S3ECMF23.js.map +1 -0
  440. package/dist/chunk-S4Y3YTAI.js +35 -0
  441. package/dist/chunk-S4Y3YTAI.js.map +1 -0
  442. package/dist/chunk-S4ZGTDSG.js +18 -0
  443. package/dist/chunk-S4ZGTDSG.js.map +1 -0
  444. package/dist/chunk-SCDWURBO.js +136 -0
  445. package/dist/chunk-SCDWURBO.js.map +1 -0
  446. package/dist/chunk-SOFPUW3O.js +196 -0
  447. package/dist/chunk-SOFPUW3O.js.map +1 -0
  448. package/dist/chunk-SQ5DH66U.js +37 -0
  449. package/dist/chunk-SQ5DH66U.js.map +1 -0
  450. package/dist/chunk-T74YB76U.js +547 -0
  451. package/dist/chunk-T74YB76U.js.map +1 -0
  452. package/dist/chunk-TI2GV36S.js +90 -0
  453. package/dist/chunk-TI2GV36S.js.map +1 -0
  454. package/dist/{chunk-56RJXPHG.js → chunk-TKNVL53O.js} +7 -4
  455. package/dist/chunk-TKNVL53O.js.map +1 -0
  456. package/dist/chunk-TNJLNLVE.js +115 -0
  457. package/dist/chunk-TNJLNLVE.js.map +1 -0
  458. package/dist/chunk-TUID42UE.js +15 -0
  459. package/dist/chunk-TUID42UE.js.map +1 -0
  460. package/dist/chunk-UMNHJSIO.js +848 -0
  461. package/dist/chunk-UMNHJSIO.js.map +1 -0
  462. package/dist/chunk-VEME3D7K.js +298 -0
  463. package/dist/chunk-VEME3D7K.js.map +1 -0
  464. package/dist/chunk-WPNIKZMJ.js +507 -0
  465. package/dist/chunk-WPNIKZMJ.js.map +1 -0
  466. package/dist/chunk-WSEJ2FDE.js +162 -0
  467. package/dist/chunk-WSEJ2FDE.js.map +1 -0
  468. package/dist/chunk-WVS6CUCT.js +48 -0
  469. package/dist/chunk-WVS6CUCT.js.map +1 -0
  470. package/dist/chunk-XWNXGFX3.js +381 -0
  471. package/dist/chunk-XWNXGFX3.js.map +1 -0
  472. package/dist/chunk-Y6KT7ZTR.js +109 -0
  473. package/dist/chunk-Y6KT7ZTR.js.map +1 -0
  474. package/dist/chunk-YMUIQRWK.js +44 -0
  475. package/dist/chunk-YMUIQRWK.js.map +1 -0
  476. package/dist/chunk-ZCDRLN3B.js +138 -0
  477. package/dist/chunk-ZCDRLN3B.js.map +1 -0
  478. package/dist/chunk-ZKKO4MHC.js +25 -0
  479. package/dist/chunk-ZKKO4MHC.js.map +1 -0
  480. package/dist/chunk-ZN7KUMPY.js +48 -0
  481. package/dist/chunk-ZN7KUMPY.js.map +1 -0
  482. package/dist/chunk-ZNROKDSZ.js +54 -0
  483. package/dist/chunk-ZNROKDSZ.js.map +1 -0
  484. package/dist/chunk-ZX2QQJXD.js +249 -0
  485. package/dist/chunk-ZX2QQJXD.js.map +1 -0
  486. package/dist/collapsible-panel.d.ts +96 -17
  487. package/dist/collapsible-panel.js +133 -14
  488. package/dist/collapsible-panel.js.map +1 -1
  489. package/dist/color-field.d.ts +51 -0
  490. package/dist/color-field.js +92 -0
  491. package/dist/color-field.js.map +1 -0
  492. package/dist/color-picker.d.ts +113 -0
  493. package/dist/color-picker.js +8 -0
  494. package/dist/color-picker.js.map +1 -0
  495. package/dist/color-swatches.d.ts +56 -0
  496. package/dist/color-swatches.js +4 -0
  497. package/dist/color-swatches.js.map +1 -0
  498. package/dist/column-track.d.ts +41 -0
  499. package/dist/column-track.js +4 -0
  500. package/dist/column-track.js.map +1 -0
  501. package/dist/combobox.d.ts +40 -0
  502. package/dist/combobox.js +3 -0
  503. package/dist/combobox.js.map +1 -0
  504. package/dist/content-item.d.ts +128 -0
  505. package/dist/content-item.js +4 -0
  506. package/dist/content-item.js.map +1 -0
  507. package/dist/content-swap.d.ts +34 -0
  508. package/dist/content-swap.js +3 -0
  509. package/dist/content-swap.js.map +1 -0
  510. package/dist/corner-status.d.ts +36 -0
  511. package/dist/corner-status.js +3 -0
  512. package/dist/corner-status.js.map +1 -0
  513. package/dist/css-values.d.ts +127 -0
  514. package/dist/css-values.js +3 -0
  515. package/dist/css-values.js.map +1 -0
  516. package/dist/device-class.js +34 -6
  517. package/dist/device-class.js.map +1 -1
  518. package/dist/disclosure-arrow.d.ts +6 -1
  519. package/dist/disclosure-arrow.js +2 -1
  520. package/dist/disclosure.d.ts +66 -0
  521. package/dist/disclosure.js +51 -0
  522. package/dist/disclosure.js.map +1 -0
  523. package/dist/edge-activity-indicator.d.ts +28 -0
  524. package/dist/edge-activity-indicator.js +3 -0
  525. package/dist/edge-activity-indicator.js.map +1 -0
  526. package/dist/empty-state.d.ts +5 -2
  527. package/dist/empty-state.js +2 -1
  528. package/dist/extension-attributes-mu8MFUl0.d.ts +13 -0
  529. package/dist/file-picker.d.ts +54 -0
  530. package/dist/file-picker.js +3 -0
  531. package/dist/file-picker.js.map +1 -0
  532. package/dist/flex-alignment-4ms8ZbV8.d.ts +5 -0
  533. package/dist/floating-toolbar.d.ts +29 -6
  534. package/dist/floating-toolbar.js +1 -1
  535. package/dist/framed-list.d.ts +47 -0
  536. package/dist/framed-list.js +4 -0
  537. package/dist/framed-list.js.map +1 -0
  538. package/dist/grid.d.ts +58 -0
  539. package/dist/grid.js +6 -0
  540. package/dist/grid.js.map +1 -0
  541. package/dist/help-tags-register.d.ts +13 -0
  542. package/dist/help-tags-register.js +10 -0
  543. package/dist/help-tags-register.js.map +1 -0
  544. package/dist/index.d.ts +72 -17
  545. package/dist/index.js +84 -25
  546. package/dist/list-action-row.d.ts +69 -12
  547. package/dist/list-action-row.js +8 -1
  548. package/dist/list-detail-dialog.d.ts +123 -0
  549. package/dist/list-detail-dialog.js +167 -0
  550. package/dist/list-detail-dialog.js.map +1 -0
  551. package/dist/list-header.d.ts +72 -10
  552. package/dist/list-header.js +4 -1
  553. package/dist/list-icon-tile-B8dr97OW.d.ts +18 -0
  554. package/dist/list-inset-control.d.ts +22 -0
  555. package/dist/list-inset-control.js +3 -0
  556. package/dist/list-inset-control.js.map +1 -0
  557. package/dist/list-inset-text.d.ts +30 -0
  558. package/dist/list-inset-text.js +4 -0
  559. package/dist/list-inset-text.js.map +1 -0
  560. package/dist/list-item.d.ts +49 -5
  561. package/dist/list-item.js +4 -1
  562. package/dist/list.d.ts +149 -0
  563. package/dist/list.js +7 -0
  564. package/dist/list.js.map +1 -0
  565. package/dist/loading-spinner.d.ts +12 -2
  566. package/dist/loading-spinner.js +2 -1
  567. package/dist/lucide-icon.d.ts +23 -3
  568. package/dist/lucide-icon.js +2 -1
  569. package/dist/message-composer.d.ts +70 -0
  570. package/dist/message-composer.js +6 -0
  571. package/dist/message-composer.js.map +1 -0
  572. package/dist/nav-stack-CU_0dKtI.d.ts +194 -0
  573. package/dist/nav-stack.d.ts +15 -38
  574. package/dist/nav-stack.js +14 -1
  575. package/dist/pane.d.ts +258 -0
  576. package/dist/pane.js +6 -0
  577. package/dist/pane.js.map +1 -0
  578. package/dist/panel-toolbar-vg6Ir5Dy.d.ts +77 -0
  579. package/dist/popup-menu-register.d.ts +11 -0
  580. package/dist/popup-menu-register.js +13 -0
  581. package/dist/popup-menu-register.js.map +1 -0
  582. package/dist/popup-menu.d.ts +153 -0
  583. package/dist/popup-menu.js +7 -0
  584. package/dist/popup-menu.js.map +1 -0
  585. package/dist/progress-bar.d.ts +52 -0
  586. package/dist/progress-bar.js +68 -0
  587. package/dist/progress-bar.js.map +1 -0
  588. package/dist/progress-ring.d.ts +44 -0
  589. package/dist/progress-ring.js +73 -0
  590. package/dist/progress-ring.js.map +1 -0
  591. package/dist/radio-group.d.ts +62 -0
  592. package/dist/radio-group.js +4 -0
  593. package/dist/radio-group.js.map +1 -0
  594. package/dist/resizable-region.d.ts +32 -3
  595. package/dist/resizable-region.js +1 -1
  596. package/dist/row.d.ts +53 -0
  597. package/dist/row.js +7 -0
  598. package/dist/row.js.map +1 -0
  599. package/dist/scroll-clearance-BikHljTc.d.ts +14 -0
  600. package/dist/search-field-CrGTN5sa.d.ts +208 -0
  601. package/dist/search-field-model.d.ts +3 -0
  602. package/dist/search-field-model.js +3 -0
  603. package/dist/search-field-model.js.map +1 -0
  604. package/dist/search-field.d.ts +3 -0
  605. package/dist/search-field.js +5 -0
  606. package/dist/search-field.js.map +1 -0
  607. package/dist/segmented-control.d.ts +14 -9
  608. package/dist/segmented-control.js +1 -2
  609. package/dist/select-register.d.ts +6 -3
  610. package/dist/select-register.js +402 -8
  611. package/dist/select-register.js.map +1 -1
  612. package/dist/select.d.ts +128 -9
  613. package/dist/select.js +6 -1
  614. package/dist/selection.d.ts +54 -0
  615. package/dist/selection.js +3 -0
  616. package/dist/selection.js.map +1 -0
  617. package/dist/semantic-content-BbzjvSu9.d.ts +14 -0
  618. package/dist/semantic-tone-CdW013KF.d.ts +4 -0
  619. package/dist/sides-BPSWde0A.d.ts +4 -0
  620. package/dist/skeleton.d.ts +14 -7
  621. package/dist/skeleton.js +2 -1
  622. package/dist/slider.d.ts +74 -0
  623. package/dist/slider.js +103 -0
  624. package/dist/slider.js.map +1 -0
  625. package/dist/spacer.d.ts +18 -0
  626. package/dist/spacer.js +4 -0
  627. package/dist/spacer.js.map +1 -0
  628. package/dist/split-button.d.ts +69 -0
  629. package/dist/split-button.js +7 -0
  630. package/dist/split-button.js.map +1 -0
  631. package/dist/split-view.d.ts +66 -6
  632. package/dist/split-view.js +14 -15
  633. package/dist/split-view.js.map +1 -1
  634. package/dist/state-banner.d.ts +41 -7
  635. package/dist/state-banner.js +4 -1
  636. package/dist/styles/anchored-surface.css +44 -0
  637. package/dist/styles/backdrop-image.css +241 -0
  638. package/dist/styles/badge.css +157 -0
  639. package/dist/styles/button.css +293 -0
  640. package/dist/styles/catalog/components/catalog-example-stack.css +14 -0
  641. package/dist/styles/catalog/components/catalog-example.css +250 -0
  642. package/dist/styles/catalog/components/catalog-stage.css +61 -0
  643. package/dist/styles/catalog/components/catalog.css +26 -0
  644. package/dist/styles/catalog.css +5 -522
  645. package/dist/styles/checkbox-group.css +63 -0
  646. package/dist/styles/checkbox.css +122 -0
  647. package/dist/styles/chip.css +234 -0
  648. package/dist/styles/choice-chips.css +205 -0
  649. package/dist/styles/collapsible-panel.css +450 -16
  650. package/dist/styles/color-field.css +125 -0
  651. package/dist/styles/color-picker.css +366 -0
  652. package/dist/styles/color-swatches.css +122 -0
  653. package/dist/styles/column-track.css +57 -0
  654. package/dist/styles/combobox.css +115 -0
  655. package/dist/styles/components/actions/button/button.css +293 -0
  656. package/dist/styles/components/actions/floating-toolbar/floating-toolbar.css +119 -0
  657. package/dist/styles/components/actions/popup-menu/popup-menu.css +498 -0
  658. package/dist/styles/components/actions/split-button/split-button.css +141 -0
  659. package/dist/styles/components/actions/toolbar/toolbar.css +483 -0
  660. package/dist/styles/components/actions/toolbar-control-group/toolbar-control-group.css +1188 -0
  661. package/dist/styles/components/actions/toolbar-text/toolbar-text.css +256 -0
  662. package/dist/styles/components/collections/framed-list/framed-list.css +53 -0
  663. package/dist/styles/components/collections/list/list.css +293 -0
  664. package/dist/styles/components/collections/list-action-row/list-action-row.css +466 -0
  665. package/dist/styles/components/collections/list-header/list-header.css +236 -0
  666. package/dist/styles/components/collections/list-inset-control/list-inset-control.css +30 -0
  667. package/dist/styles/components/collections/list-inset-text/list-inset-text.css +29 -0
  668. package/dist/styles/components/collections/list-item/list-item.css +461 -0
  669. package/dist/styles/components/collections/summary-row/summary-row.css +161 -0
  670. package/dist/styles/components/data-display/value-table/value-table.css +183 -0
  671. package/dist/styles/components/feedback/anchored-surface/anchored-surface.css +44 -0
  672. package/dist/styles/components/feedback/badge/badge.css +157 -0
  673. package/dist/styles/components/feedback/chip/chip.css +234 -0
  674. package/dist/styles/components/feedback/corner-status/corner-status.css +60 -0
  675. package/dist/styles/components/feedback/edge-activity-indicator/edge-activity-indicator.css +127 -0
  676. package/dist/styles/components/feedback/empty-state/empty-state.css +47 -0
  677. package/dist/styles/components/feedback/loading-spinner/loading-spinner.css +25 -0
  678. package/dist/styles/components/feedback/progress-bar/progress-bar.css +168 -0
  679. package/dist/styles/components/feedback/progress-ring/progress-ring.css +91 -0
  680. package/dist/styles/components/feedback/skeleton/skeleton.css +92 -0
  681. package/dist/styles/components/feedback/state-banner/state-banner.css +312 -0
  682. package/dist/styles/components/forms/checkbox/checkbox.css +122 -0
  683. package/dist/styles/components/forms/checkbox-group/checkbox-group.css +63 -0
  684. package/dist/styles/components/forms/choice-chips/choice-chips.css +205 -0
  685. package/dist/styles/components/forms/color-field/color-field.css +125 -0
  686. package/dist/styles/components/forms/color-picker/color-picker.css +366 -0
  687. package/dist/styles/components/forms/color-swatches/color-swatches.css +122 -0
  688. package/dist/styles/components/forms/combobox/combobox.css +115 -0
  689. package/dist/styles/components/forms/file-picker/file-picker.css +81 -0
  690. package/dist/styles/components/forms/message-composer/message-composer.css +84 -0
  691. package/dist/styles/components/forms/radio-group/radio-group.css +158 -0
  692. package/dist/styles/components/forms/search-field/search-field.css +441 -0
  693. package/dist/styles/components/forms/segmented-control/segmented-control.css +196 -0
  694. package/dist/styles/components/forms/select/select.css +580 -0
  695. package/dist/styles/components/forms/slider/slider.css +241 -0
  696. package/dist/styles/components/forms/switch/switch.css +132 -0
  697. package/dist/styles/components/forms/tag-field/tag-field.css +8 -0
  698. package/dist/styles/components/forms/text-field/text-field.css +193 -0
  699. package/dist/styles/components/layout/collapsible-panel/collapsible-panel.css +580 -0
  700. package/dist/styles/components/layout/column-track/column-track.css +57 -0
  701. package/dist/styles/components/layout/content-swap/content-swap.css +154 -0
  702. package/dist/styles/components/layout/grid/grid.css +88 -0
  703. package/dist/styles/components/layout/pane/pane.css +780 -0
  704. package/dist/styles/components/layout/resizable-region/resizable-region.css +546 -0
  705. package/dist/styles/components/layout/row/row.css +125 -0
  706. package/dist/styles/components/layout/spacer/spacer.css +11 -0
  707. package/dist/styles/components/layout/split-view/split-view.css +171 -0
  708. package/dist/styles/components/layout/workbench/workbench.css +1098 -0
  709. package/dist/styles/components/media/lucide-icon/lucide-icon.css +15 -0
  710. package/dist/styles/components/navigation/disclosure-arrow/disclosure-arrow.css +43 -0
  711. package/dist/styles/components/navigation/nav-stack/nav-stack.css +619 -0
  712. package/dist/styles/components/navigation/tab-bar/tab-bar.css +203 -0
  713. package/dist/styles/components/navigation/tab-bar-item/tab-bar-item.css +389 -0
  714. package/dist/styles/components/navigation/tab-navigator/tab-navigator.css +460 -0
  715. package/dist/styles/components/surfaces/backdrop-image/backdrop-image.css +241 -0
  716. package/dist/styles/components/surfaces/content-item/content-item.css +168 -0
  717. package/dist/styles/components/surfaces/disclosure/disclosure.css +136 -0
  718. package/dist/styles/components/surfaces/sunken-panel/sunken-panel.css +34 -0
  719. package/dist/styles/components/surfaces/surface-scaffold/surface-scaffold.css +744 -0
  720. package/dist/styles/components/typography/text/text.css +232 -0
  721. package/dist/styles/content-item.css +168 -0
  722. package/dist/styles/content-swap.css +154 -0
  723. package/dist/styles/corner-status.css +60 -0
  724. package/dist/styles/disclosure-arrow.css +20 -0
  725. package/dist/styles/disclosure.css +136 -0
  726. package/dist/styles/document.css +98 -0
  727. package/dist/styles/edge-activity-indicator.css +127 -0
  728. package/dist/styles/file-picker.css +81 -0
  729. package/dist/styles/floating-toolbar.css +87 -6
  730. package/dist/styles/foundation.css +490 -50
  731. package/dist/styles/framed-list.css +53 -0
  732. package/dist/styles/grid.css +88 -0
  733. package/dist/styles/layout.css +3 -41
  734. package/dist/styles/list-action-row.css +324 -18
  735. package/dist/styles/list-detail-dialog.css +11 -0
  736. package/dist/styles/list-header.css +135 -59
  737. package/dist/styles/list-inset-control.css +30 -0
  738. package/dist/styles/list-inset-text.css +29 -0
  739. package/dist/styles/list-item.css +371 -33
  740. package/dist/styles/list.css +293 -0
  741. package/dist/styles/loading-spinner.css +4 -0
  742. package/dist/styles/lucide-icon.css +9 -0
  743. package/dist/styles/message-composer.css +84 -0
  744. package/dist/styles/nav-stack.css +555 -47
  745. package/dist/styles/overlay-sheet.css +211 -0
  746. package/dist/styles/overlay-toast.css +149 -0
  747. package/dist/styles/overlay-tooltip.css +55 -0
  748. package/dist/styles/pane.css +780 -0
  749. package/dist/styles/popup-menu.css +498 -0
  750. package/dist/styles/progress-bar.css +168 -0
  751. package/dist/styles/progress-ring.css +91 -0
  752. package/dist/styles/radio-group.css +158 -0
  753. package/dist/styles/resizable-region.css +439 -4
  754. package/dist/styles/row.css +125 -0
  755. package/dist/styles/search-field.css +441 -0
  756. package/dist/styles/segmented-control.css +36 -9
  757. package/dist/styles/select.css +516 -74
  758. package/dist/styles/skeleton.css +64 -3
  759. package/dist/styles/slider.css +241 -0
  760. package/dist/styles/spacer.css +11 -0
  761. package/dist/styles/split-button.css +141 -0
  762. package/dist/styles/split-view.css +139 -3
  763. package/dist/styles/state-banner.css +164 -25
  764. package/dist/styles/styles.css +38 -3
  765. package/dist/styles/summary-row.css +161 -0
  766. package/dist/styles/sunken-panel.css +34 -0
  767. package/dist/styles/surface-scaffold.css +744 -0
  768. package/dist/styles/switch.css +132 -0
  769. package/dist/styles/tab-bar-item.css +389 -0
  770. package/dist/styles/tab-bar.css +167 -9
  771. package/dist/styles/tab-navigator.css +460 -0
  772. package/dist/styles/tag-field.css +8 -0
  773. package/dist/styles/text-field.css +193 -0
  774. package/dist/styles/text.css +232 -0
  775. package/dist/styles/toolbar-control-group.css +1000 -37
  776. package/dist/styles/toolbar-text.css +223 -7
  777. package/dist/styles/toolbar.css +433 -11
  778. package/dist/styles/value-table.css +115 -7
  779. package/dist/styles/webawesome.css +474 -18
  780. package/dist/styles/workbench-dialog.css +10 -0
  781. package/dist/styles/workbench.css +1011 -7
  782. package/dist/summary-row.d.ts +56 -0
  783. package/dist/summary-row.js +4 -0
  784. package/dist/summary-row.js.map +1 -0
  785. package/dist/sunken-panel.d.ts +38 -0
  786. package/dist/sunken-panel.js +4 -0
  787. package/dist/sunken-panel.js.map +1 -0
  788. package/dist/surface-scaffold-register.d.ts +12 -0
  789. package/dist/surface-scaffold-register.js +10 -0
  790. package/dist/surface-scaffold-register.js.map +1 -0
  791. package/dist/surface-scaffold.d.ts +280 -0
  792. package/dist/surface-scaffold.js +8 -0
  793. package/dist/surface-scaffold.js.map +1 -0
  794. package/dist/switch.d.ts +38 -0
  795. package/dist/switch.js +4 -0
  796. package/dist/switch.js.map +1 -0
  797. package/dist/tab-bar-item.d.ts +65 -0
  798. package/dist/tab-bar-item.js +6 -0
  799. package/dist/tab-bar-item.js.map +1 -0
  800. package/dist/tab-bar.d.ts +33 -7
  801. package/dist/tab-bar.js +1 -1
  802. package/dist/tab-navigator.d.ts +154 -0
  803. package/dist/tab-navigator.js +131 -0
  804. package/dist/tab-navigator.js.map +1 -0
  805. package/dist/tag-field.d.ts +52 -0
  806. package/dist/tag-field.js +6 -0
  807. package/dist/tag-field.js.map +1 -0
  808. package/dist/text-field.d.ts +91 -0
  809. package/dist/text-field.js +6 -0
  810. package/dist/text-field.js.map +1 -0
  811. package/dist/text.d.ts +103 -0
  812. package/dist/text.js +3 -0
  813. package/dist/text.js.map +1 -0
  814. package/dist/toolbar-control-group.d.ts +112 -8
  815. package/dist/toolbar-control-group.js +3 -1
  816. package/dist/toolbar-text.d.ts +63 -9
  817. package/dist/toolbar-text.js +2 -1
  818. package/dist/toolbar.d.ts +77 -7
  819. package/dist/toolbar.js +1 -1
  820. package/dist/types-DmHWkSd6.d.ts +207 -0
  821. package/dist/value-table.d.ts +30 -4
  822. package/dist/value-table.js +2 -1
  823. package/dist/webawesome.d.ts +11 -1
  824. package/dist/wire-catalog.d.ts +117 -5
  825. package/dist/wire-catalog.js +314 -14
  826. package/dist/wire-catalog.js.map +1 -1
  827. package/dist/wire-checkboxes.d.ts +10 -0
  828. package/dist/wire-checkboxes.js +3 -0
  829. package/dist/{wire-token-search-fields.js.map → wire-checkboxes.js.map} +1 -1
  830. package/dist/wire-choice-chips.d.ts +17 -0
  831. package/dist/wire-choice-chips.js +4 -0
  832. package/dist/wire-choice-chips.js.map +1 -0
  833. package/dist/wire-color-fields.d.ts +33 -0
  834. package/dist/wire-color-fields.js +82 -0
  835. package/dist/wire-color-fields.js.map +1 -0
  836. package/dist/wire-color-pickers.d.ts +35 -0
  837. package/dist/wire-color-pickers.js +9 -0
  838. package/dist/wire-color-pickers.js.map +1 -0
  839. package/dist/wire-comboboxes.d.ts +26 -0
  840. package/dist/wire-comboboxes.js +4 -0
  841. package/dist/wire-comboboxes.js.map +1 -0
  842. package/dist/wire-content-items.d.ts +15 -0
  843. package/dist/wire-content-items.js +208 -0
  844. package/dist/wire-content-items.js.map +1 -0
  845. package/dist/wire-corner-status.d.ts +11 -0
  846. package/dist/wire-corner-status.js +3 -0
  847. package/dist/wire-corner-status.js.map +1 -0
  848. package/dist/wire-file-pickers.d.ts +27 -0
  849. package/dist/wire-file-pickers.js +3 -0
  850. package/dist/wire-file-pickers.js.map +1 -0
  851. package/dist/wire-list-focus-scroll.d.ts +16 -0
  852. package/dist/wire-list-focus-scroll.js +3 -0
  853. package/dist/wire-list-focus-scroll.js.map +1 -0
  854. package/dist/wire-list-reorder.d.ts +41 -0
  855. package/dist/wire-list-reorder.js +3 -0
  856. package/dist/wire-list-reorder.js.map +1 -0
  857. package/dist/wire-message-composers.d.ts +17 -0
  858. package/dist/wire-message-composers.js +3 -0
  859. package/dist/wire-message-composers.js.map +1 -0
  860. package/dist/wire-nav-stack.d.ts +4 -1
  861. package/dist/wire-nav-stack.js +352 -15
  862. package/dist/wire-nav-stack.js.map +1 -1
  863. package/dist/wire-overlay-sheets.d.ts +20 -0
  864. package/dist/wire-overlay-sheets.js +4 -0
  865. package/dist/wire-overlay-sheets.js.map +1 -0
  866. package/dist/wire-pane-chrome.d.ts +21 -0
  867. package/dist/wire-pane-chrome.js +67 -0
  868. package/dist/wire-pane-chrome.js.map +1 -0
  869. package/dist/wire-resizable-regions.d.ts +2 -1
  870. package/dist/wire-resizable-regions.js +2 -1
  871. package/dist/wire-scroll-dividers.d.ts +87 -0
  872. package/dist/wire-scroll-dividers.js +3 -0
  873. package/dist/wire-scroll-dividers.js.map +1 -0
  874. package/dist/{wire-token-search-fields.d.ts → wire-search-fields.d.ts} +34 -25
  875. package/dist/wire-search-fields.js +6 -0
  876. package/dist/wire-search-fields.js.map +1 -0
  877. package/dist/wire-sidebar.d.ts +24 -4
  878. package/dist/wire-sidebar.js +159 -45
  879. package/dist/wire-sidebar.js.map +1 -1
  880. package/dist/wire-sliders.d.ts +12 -0
  881. package/dist/wire-sliders.js +31 -0
  882. package/dist/wire-sliders.js.map +1 -0
  883. package/dist/wire-tab-bars.d.ts +6 -2
  884. package/dist/wire-tab-bars.js +1 -1
  885. package/dist/wire-tab-navigator.d.ts +13 -0
  886. package/dist/wire-tab-navigator.js +153 -0
  887. package/dist/wire-tab-navigator.js.map +1 -0
  888. package/dist/wire-tag-fields.d.ts +41 -0
  889. package/dist/wire-tag-fields.js +258 -0
  890. package/dist/wire-tag-fields.js.map +1 -0
  891. package/dist/wire-text-fields.d.ts +12 -0
  892. package/dist/wire-text-fields.js +3 -0
  893. package/dist/wire-text-fields.js.map +1 -0
  894. package/dist/wire-toolbar-visibility.d.ts +13 -0
  895. package/dist/wire-toolbar-visibility.js +3 -0
  896. package/dist/wire-toolbar-visibility.js.map +1 -0
  897. package/dist/wire-workbench.d.ts +116 -0
  898. package/dist/wire-workbench.js +6 -0
  899. package/dist/wire-workbench.js.map +1 -0
  900. package/dist/workbench-dialog.d.ts +106 -0
  901. package/dist/workbench-dialog.js +127 -0
  902. package/dist/workbench-dialog.js.map +1 -0
  903. package/dist/workbench.d.ts +258 -10
  904. package/dist/workbench.js +21 -15
  905. package/dist/workbench.js.map +1 -1
  906. package/docs/accessibility.md +829 -41
  907. package/docs/anchored-surface.md +107 -0
  908. package/docs/app-layouts.md +200 -10
  909. package/docs/apple-hig.md +2 -0
  910. package/docs/backdrop-image.md +128 -0
  911. package/docs/catalog.md +599 -63
  912. package/docs/collapsible-panel.md +308 -25
  913. package/docs/color-field.md +65 -0
  914. package/docs/color-picker.md +102 -0
  915. package/docs/color-swatches.md +46 -0
  916. package/docs/component-contract.md +865 -57
  917. package/docs/component-integration.md +75 -0
  918. package/docs/component-selection.md +1124 -108
  919. package/docs/design/templates/button/emphasis-dark.svg +1 -0
  920. package/docs/design/templates/button/emphasis.svg +1 -0
  921. package/docs/design/templates/button/full-width-dark.svg +1 -0
  922. package/docs/design/templates/button/full-width.svg +1 -0
  923. package/docs/design/templates/button/icons-dark.svg +1 -0
  924. package/docs/design/templates/button/icons.svg +1 -0
  925. package/docs/design/templates/button/pill-dark.svg +1 -0
  926. package/docs/design/templates/button/pill.svg +1 -0
  927. package/docs/design/templates/button/states-dark.svg +1 -0
  928. package/docs/design/templates/button/states.svg +1 -0
  929. package/docs/design/templates/button/toggles-dark.svg +1 -0
  930. package/docs/design/templates/button/toggles.svg +1 -0
  931. package/docs/design/templates/button/tones-dark.svg +1 -0
  932. package/docs/design/templates/button/tones.svg +1 -0
  933. package/docs/design/templates/button-dark.svg +1 -0
  934. package/docs/design/templates/button.svg +1 -0
  935. package/docs/design/templates/checkbox/compact-dark.svg +1 -0
  936. package/docs/design/templates/checkbox/compact.svg +1 -0
  937. package/docs/design/templates/checkbox/error-dark.svg +1 -0
  938. package/docs/design/templates/checkbox/error.svg +1 -0
  939. package/docs/design/templates/checkbox/mixed-dark.svg +1 -0
  940. package/docs/design/templates/checkbox/mixed.svg +1 -0
  941. package/docs/design/templates/checkbox/states-dark.svg +1 -0
  942. package/docs/design/templates/checkbox/states.svg +1 -0
  943. package/docs/design/templates/checkbox-dark.svg +1 -0
  944. package/docs/design/templates/checkbox-group/horizontal-dark.svg +1 -0
  945. package/docs/design/templates/checkbox-group/horizontal.svg +1 -0
  946. package/docs/design/templates/checkbox-group/vertical-dark.svg +1 -0
  947. package/docs/design/templates/checkbox-group/vertical.svg +1 -0
  948. package/docs/design/templates/checkbox-group-dark.svg +1 -0
  949. package/docs/design/templates/checkbox-group.svg +1 -0
  950. package/docs/design/templates/checkbox.svg +1 -0
  951. package/docs/design/templates/chip/action-filters-dark.svg +1 -0
  952. package/docs/design/templates/chip/action-filters.svg +1 -0
  953. package/docs/design/templates/chip/tags-dark.svg +1 -0
  954. package/docs/design/templates/chip/tags.svg +1 -0
  955. package/docs/design/templates/chip-dark.svg +1 -0
  956. package/docs/design/templates/chip.svg +1 -0
  957. package/docs/design/templates/choice-chips/color-palette-dark.svg +1 -0
  958. package/docs/design/templates/choice-chips/color-palette.svg +1 -0
  959. package/docs/design/templates/choice-chips/compact-icons-dark.svg +1 -0
  960. package/docs/design/templates/choice-chips/compact-icons.svg +1 -0
  961. package/docs/design/templates/choice-chips/multiple-dark.svg +1 -0
  962. package/docs/design/templates/choice-chips/multiple.svg +1 -0
  963. package/docs/design/templates/choice-chips-dark.svg +1 -0
  964. package/docs/design/templates/choice-chips.svg +1 -0
  965. package/docs/design/templates/color-field/compact-dark.svg +1 -0
  966. package/docs/design/templates/color-field/compact.svg +1 -0
  967. package/docs/design/templates/color-field/error-dark.svg +1 -0
  968. package/docs/design/templates/color-field/error.svg +1 -0
  969. package/docs/design/templates/color-field/hint-dark.svg +1 -0
  970. package/docs/design/templates/color-field/hint.svg +1 -0
  971. package/docs/design/templates/color-field-dark.svg +1 -0
  972. package/docs/design/templates/color-field.svg +1 -0
  973. package/docs/design/templates/color-picker/gray-dark.svg +1 -0
  974. package/docs/design/templates/color-picker/gray.svg +1 -0
  975. package/docs/design/templates/color-picker/hsb-dark.svg +1 -0
  976. package/docs/design/templates/color-picker/hsb.svg +1 -0
  977. package/docs/design/templates/color-picker/rgb-dark.svg +1 -0
  978. package/docs/design/templates/color-picker/rgb.svg +1 -0
  979. package/docs/design/templates/color-picker-dark.svg +1 -0
  980. package/docs/design/templates/color-picker.svg +1 -0
  981. package/docs/design/templates/color-swatches/palette-dark.svg +1 -0
  982. package/docs/design/templates/color-swatches/palette.svg +1 -0
  983. package/docs/design/templates/color-swatches-dark.svg +1 -0
  984. package/docs/design/templates/color-swatches.svg +1 -0
  985. package/docs/design/templates/disclosure/embedded-dark.svg +1 -0
  986. package/docs/design/templates/disclosure/embedded.svg +1 -0
  987. package/docs/design/templates/disclosure/framed-sunken-dark.svg +1 -0
  988. package/docs/design/templates/disclosure/framed-sunken.svg +1 -0
  989. package/docs/design/templates/disclosure/plain-dark.svg +1 -0
  990. package/docs/design/templates/disclosure/plain.svg +1 -0
  991. package/docs/design/templates/disclosure-dark.svg +1 -0
  992. package/docs/design/templates/disclosure.svg +1 -0
  993. package/docs/design/templates/empty-state/filtered-dark.svg +1 -1
  994. package/docs/design/templates/empty-state/filtered.svg +1 -1
  995. package/docs/design/templates/empty-state/with-action-dark.svg +1 -1
  996. package/docs/design/templates/empty-state/with-action.svg +1 -1
  997. package/docs/design/templates/empty-state-dark.svg +1 -7
  998. package/docs/design/templates/empty-state.svg +1 -7
  999. package/docs/design/templates/list/compact-dark.svg +1 -0
  1000. package/docs/design/templates/list/compact.svg +1 -0
  1001. package/docs/design/templates/list/stack-dark.svg +1 -0
  1002. package/docs/design/templates/list/stack.svg +1 -0
  1003. package/docs/design/templates/list-action-row/default-dark.svg +1 -1
  1004. package/docs/design/templates/list-action-row/default.svg +1 -1
  1005. package/docs/design/templates/list-action-row/icon-tile-dark.svg +1 -0
  1006. package/docs/design/templates/list-action-row/icon-tile.svg +1 -0
  1007. package/docs/design/templates/list-action-row/selected-dark.svg +1 -1
  1008. package/docs/design/templates/list-action-row/selected.svg +1 -1
  1009. package/docs/design/templates/list-action-row/trailing-menu-dark.svg +1 -0
  1010. package/docs/design/templates/list-action-row/trailing-menu.svg +1 -0
  1011. package/docs/design/templates/list-action-row-dark.svg +1 -7
  1012. package/docs/design/templates/list-action-row.svg +1 -7
  1013. package/docs/design/templates/list-dark.svg +1 -0
  1014. package/docs/design/templates/list-header/action-dark.svg +1 -1
  1015. package/docs/design/templates/list-header/action.svg +1 -1
  1016. package/docs/design/templates/list-header/count-dark.svg +1 -1
  1017. package/docs/design/templates/list-header/count.svg +1 -1
  1018. package/docs/design/templates/list-header/inline-action-dark.svg +1 -0
  1019. package/docs/design/templates/list-header/inline-action.svg +1 -0
  1020. package/docs/design/templates/list-header/size-l-dark.svg +1 -0
  1021. package/docs/design/templates/list-header/size-l.svg +1 -0
  1022. package/docs/design/templates/list-header/size-m-dark.svg +1 -0
  1023. package/docs/design/templates/list-header/size-m.svg +1 -0
  1024. package/docs/design/templates/list-header/size-xl-dark.svg +1 -0
  1025. package/docs/design/templates/list-header/size-xl.svg +1 -0
  1026. package/docs/design/templates/list-header/size-xs-dark.svg +1 -0
  1027. package/docs/design/templates/list-header/size-xs.svg +1 -0
  1028. package/docs/design/templates/list-header/toggle-collapsed-dark.svg +1 -1
  1029. package/docs/design/templates/list-header/toggle-collapsed.svg +1 -1
  1030. package/docs/design/templates/list-header/toggle-expanded-dark.svg +1 -1
  1031. package/docs/design/templates/list-header/toggle-expanded.svg +1 -1
  1032. package/docs/design/templates/list-header-dark.svg +1 -11
  1033. package/docs/design/templates/list-header.svg +1 -11
  1034. package/docs/design/templates/list-item/default-dark.svg +1 -1
  1035. package/docs/design/templates/list-item/default.svg +1 -1
  1036. package/docs/design/templates/list-item/icon-tile-dark.svg +1 -0
  1037. package/docs/design/templates/list-item/icon-tile.svg +1 -0
  1038. package/docs/design/templates/list-item/multiline-dark.svg +1 -1
  1039. package/docs/design/templates/list-item/multiline.svg +1 -1
  1040. package/docs/design/templates/list-item/selected-dark.svg +1 -1
  1041. package/docs/design/templates/list-item/selected.svg +1 -1
  1042. package/docs/design/templates/list-item/trailing-dark.svg +1 -1
  1043. package/docs/design/templates/list-item/trailing.svg +1 -1
  1044. package/docs/design/templates/list-item-dark.svg +1 -11
  1045. package/docs/design/templates/list-item.svg +1 -11
  1046. package/docs/design/templates/list.svg +1 -0
  1047. package/docs/design/templates/message-composer/chat-dark.svg +1 -0
  1048. package/docs/design/templates/message-composer/chat.svg +1 -0
  1049. package/docs/design/templates/message-composer/prompt-dark.svg +1 -0
  1050. package/docs/design/templates/message-composer/prompt.svg +1 -0
  1051. package/docs/design/templates/message-composer-dark.svg +1 -0
  1052. package/docs/design/templates/message-composer.svg +1 -0
  1053. package/docs/design/templates/progress-bar/determinate-dark.svg +1 -0
  1054. package/docs/design/templates/progress-bar/determinate.svg +1 -0
  1055. package/docs/design/templates/progress-bar/tones-dark.svg +1 -0
  1056. package/docs/design/templates/progress-bar/tones.svg +1 -0
  1057. package/docs/design/templates/progress-bar-dark.svg +1 -0
  1058. package/docs/design/templates/progress-bar.svg +1 -0
  1059. package/docs/design/templates/progress-ring/sizes-dark.svg +1 -0
  1060. package/docs/design/templates/progress-ring/sizes.svg +1 -0
  1061. package/docs/design/templates/progress-ring/tones-dark.svg +1 -0
  1062. package/docs/design/templates/progress-ring/tones.svg +1 -0
  1063. package/docs/design/templates/progress-ring-dark.svg +1 -0
  1064. package/docs/design/templates/progress-ring.svg +1 -0
  1065. package/docs/design/templates/radio-group/horizontal-dark.svg +1 -0
  1066. package/docs/design/templates/radio-group/horizontal.svg +1 -0
  1067. package/docs/design/templates/radio-group/vertical-dark.svg +1 -0
  1068. package/docs/design/templates/radio-group/vertical.svg +1 -0
  1069. package/docs/design/templates/radio-group-dark.svg +1 -0
  1070. package/docs/design/templates/radio-group.svg +1 -0
  1071. package/docs/design/templates/search-field/empty-dark.svg +1 -0
  1072. package/docs/design/templates/search-field/empty.svg +1 -0
  1073. package/docs/design/templates/search-field/tokens-dark.svg +1 -0
  1074. package/docs/design/templates/search-field/tokens.svg +1 -0
  1075. package/docs/design/templates/search-field-dark.svg +1 -0
  1076. package/docs/design/templates/search-field.svg +1 -0
  1077. package/docs/design/templates/segmented-control/equal-dark.svg +1 -1
  1078. package/docs/design/templates/segmented-control/equal.svg +1 -1
  1079. package/docs/design/templates/segmented-control/pill-small-dark.svg +1 -1
  1080. package/docs/design/templates/segmented-control/pill-small.svg +1 -1
  1081. package/docs/design/templates/segmented-control-dark.svg +1 -7
  1082. package/docs/design/templates/segmented-control.svg +1 -7
  1083. package/docs/design/templates/select/compact-dark.svg +1 -0
  1084. package/docs/design/templates/select/compact.svg +1 -0
  1085. package/docs/design/templates/select/form-dark.svg +1 -0
  1086. package/docs/design/templates/select/form.svg +1 -0
  1087. package/docs/design/templates/select/icons-dark.svg +1 -0
  1088. package/docs/design/templates/select/icons.svg +1 -0
  1089. package/docs/design/templates/select-dark.svg +1 -0
  1090. package/docs/design/templates/select.svg +1 -0
  1091. package/docs/design/templates/skeleton-dark.svg +1 -9
  1092. package/docs/design/templates/skeleton.svg +1 -9
  1093. package/docs/design/templates/slider/compact-dark.svg +1 -0
  1094. package/docs/design/templates/slider/compact.svg +1 -0
  1095. package/docs/design/templates/slider/readout-dark.svg +1 -0
  1096. package/docs/design/templates/slider/readout.svg +1 -0
  1097. package/docs/design/templates/slider/ticks-dark.svg +1 -0
  1098. package/docs/design/templates/slider/ticks.svg +1 -0
  1099. package/docs/design/templates/slider-dark.svg +1 -0
  1100. package/docs/design/templates/slider.svg +1 -0
  1101. package/docs/design/templates/split-button/full-width-dark.svg +1 -0
  1102. package/docs/design/templates/split-button/full-width.svg +1 -0
  1103. package/docs/design/templates/split-button/pill-dark.svg +1 -0
  1104. package/docs/design/templates/split-button/pill.svg +1 -0
  1105. package/docs/design/templates/split-button/states-dark.svg +1 -0
  1106. package/docs/design/templates/split-button/states.svg +1 -0
  1107. package/docs/design/templates/split-button/tones-dark.svg +1 -0
  1108. package/docs/design/templates/split-button/tones.svg +1 -0
  1109. package/docs/design/templates/split-button-dark.svg +1 -0
  1110. package/docs/design/templates/split-button.svg +1 -0
  1111. package/docs/design/templates/state-banner/danger-dark.svg +1 -1
  1112. package/docs/design/templates/state-banner/danger.svg +1 -1
  1113. package/docs/design/templates/state-banner/info-badge-dark.svg +1 -0
  1114. package/docs/design/templates/state-banner/info-badge.svg +1 -0
  1115. package/docs/design/templates/state-banner/info-dark.svg +1 -1
  1116. package/docs/design/templates/state-banner/info.svg +1 -1
  1117. package/docs/design/templates/state-banner/strip-dark.svg +1 -0
  1118. package/docs/design/templates/state-banner/strip.svg +1 -0
  1119. package/docs/design/templates/state-banner/success-dark.svg +1 -1
  1120. package/docs/design/templates/state-banner/success.svg +1 -1
  1121. package/docs/design/templates/state-banner/warning-dark.svg +1 -1
  1122. package/docs/design/templates/state-banner/warning.svg +1 -1
  1123. package/docs/design/templates/state-banner-dark.svg +1 -11
  1124. package/docs/design/templates/state-banner.svg +1 -11
  1125. package/docs/design/templates/switch/compact-dark.svg +1 -0
  1126. package/docs/design/templates/switch/compact.svg +1 -0
  1127. package/docs/design/templates/switch/states-dark.svg +1 -0
  1128. package/docs/design/templates/switch/states.svg +1 -0
  1129. package/docs/design/templates/switch-dark.svg +1 -0
  1130. package/docs/design/templates/switch.svg +1 -0
  1131. package/docs/design/templates/tab-bar/workspace-tabs-dark.svg +1 -1
  1132. package/docs/design/templates/tab-bar/workspace-tabs.svg +1 -1
  1133. package/docs/design/templates/tab-bar-dark.svg +1 -5
  1134. package/docs/design/templates/tab-bar.svg +1 -5
  1135. package/docs/design/templates/tag-field/error-dark.svg +1 -0
  1136. package/docs/design/templates/tag-field/error.svg +1 -0
  1137. package/docs/design/templates/tag-field/tags-dark.svg +1 -0
  1138. package/docs/design/templates/tag-field/tags.svg +1 -0
  1139. package/docs/design/templates/tag-field-dark.svg +1 -0
  1140. package/docs/design/templates/tag-field.svg +1 -0
  1141. package/docs/design/templates/text-field/compact-dark.svg +1 -0
  1142. package/docs/design/templates/text-field/compact.svg +1 -0
  1143. package/docs/design/templates/text-field/error-dark.svg +1 -0
  1144. package/docs/design/templates/text-field/error.svg +1 -0
  1145. package/docs/design/templates/text-field/labeled-dark.svg +1 -0
  1146. package/docs/design/templates/text-field/labeled.svg +1 -0
  1147. package/docs/design/templates/text-field/multiline-dark.svg +1 -0
  1148. package/docs/design/templates/text-field/multiline.svg +1 -0
  1149. package/docs/design/templates/text-field/number-dark.svg +1 -0
  1150. package/docs/design/templates/text-field/number.svg +1 -0
  1151. package/docs/design/templates/text-field/search-dark.svg +1 -0
  1152. package/docs/design/templates/text-field/search.svg +1 -0
  1153. package/docs/design/templates/text-field-dark.svg +1 -0
  1154. package/docs/design/templates/text-field.svg +1 -0
  1155. package/docs/design/templates/toolbar/title-and-actions-dark.svg +1 -1
  1156. package/docs/design/templates/toolbar/title-and-actions.svg +1 -1
  1157. package/docs/design/templates/toolbar/width-visibility-320-dark.svg +1 -0
  1158. package/docs/design/templates/toolbar/width-visibility-320.svg +1 -0
  1159. package/docs/design/templates/toolbar/width-visibility-600-dark.svg +1 -0
  1160. package/docs/design/templates/toolbar/width-visibility-600.svg +1 -0
  1161. package/docs/design/templates/toolbar-control-group/borderless-single-dark.svg +1 -1
  1162. package/docs/design/templates/toolbar-control-group/borderless-single.svg +1 -1
  1163. package/docs/design/templates/toolbar-control-group/glass-dark.svg +1 -0
  1164. package/docs/design/templates/toolbar-control-group/glass.svg +1 -0
  1165. package/docs/design/templates/toolbar-control-group/icon-buttons-dark.svg +1 -1
  1166. package/docs/design/templates/toolbar-control-group/icon-buttons.svg +1 -1
  1167. package/docs/design/templates/toolbar-control-group/icon-tile-brand-dark.svg +1 -0
  1168. package/docs/design/templates/toolbar-control-group/icon-tile-brand.svg +1 -0
  1169. package/docs/design/templates/toolbar-control-group/icon-tile-danger-dark.svg +1 -0
  1170. package/docs/design/templates/toolbar-control-group/icon-tile-danger.svg +1 -0
  1171. package/docs/design/templates/toolbar-control-group/icon-tile-neutral-dark.svg +1 -0
  1172. package/docs/design/templates/toolbar-control-group/icon-tile-neutral.svg +1 -0
  1173. package/docs/design/templates/toolbar-control-group/icon-tile-success-dark.svg +1 -0
  1174. package/docs/design/templates/toolbar-control-group/icon-tile-success.svg +1 -0
  1175. package/docs/design/templates/toolbar-control-group/icon-tile-warning-dark.svg +1 -0
  1176. package/docs/design/templates/toolbar-control-group/icon-tile-warning.svg +1 -0
  1177. package/docs/design/templates/toolbar-control-group/push-buttons-dark.svg +1 -1
  1178. package/docs/design/templates/toolbar-control-group/push-buttons.svg +1 -1
  1179. package/docs/design/templates/toolbar-control-group/with-text-dark.svg +1 -1
  1180. package/docs/design/templates/toolbar-control-group/with-text.svg +1 -1
  1181. package/docs/design/templates/toolbar-control-group-dark.svg +1 -11
  1182. package/docs/design/templates/toolbar-control-group.svg +1 -11
  1183. package/docs/design/templates/toolbar-dark.svg +1 -5
  1184. package/docs/design/templates/toolbar-text/dark-tone-dark.svg +1 -0
  1185. package/docs/design/templates/toolbar-text/dark-tone.svg +1 -0
  1186. package/docs/design/templates/toolbar-text/default-dark.svg +1 -1
  1187. package/docs/design/templates/toolbar-text/default.svg +1 -1
  1188. package/docs/design/templates/toolbar-text/large-dark.svg +1 -1
  1189. package/docs/design/templates/toolbar-text/large.svg +1 -1
  1190. package/docs/design/templates/toolbar-text/small-dark.svg +1 -1
  1191. package/docs/design/templates/toolbar-text/small.svg +1 -1
  1192. package/docs/design/templates/toolbar-text-dark.svg +1 -9
  1193. package/docs/design/templates/toolbar-text.svg +1 -9
  1194. package/docs/design/templates/toolbar.svg +1 -5
  1195. package/docs/design/templates/value-table/details-dark.svg +1 -1
  1196. package/docs/design/templates/value-table/details.svg +1 -1
  1197. package/docs/design/templates/value-table-dark.svg +1 -5
  1198. package/docs/design/templates/value-table.svg +1 -5
  1199. package/docs/design/templates.md +87 -33
  1200. package/docs/design-philosophy.md +65 -20
  1201. package/docs/device-class.md +10 -9
  1202. package/docs/disclosure.md +97 -0
  1203. package/docs/document-baseline.md +93 -0
  1204. package/docs/examples/application-ui-profile.json +60 -0
  1205. package/docs/examples/command-palette-adapter.tsx +69 -17
  1206. package/docs/examples/component-catalog-extension.json +52 -0
  1207. package/docs/examples/component-composition-extension.json +80 -0
  1208. package/docs/layout.md +946 -53
  1209. package/docs/list-detail-dialog.md +100 -0
  1210. package/docs/manual-test-plan.md +29 -0
  1211. package/docs/message-composer.md +156 -0
  1212. package/docs/nav-stack.md +327 -14
  1213. package/docs/overlay-toast.md +62 -0
  1214. package/docs/overlay-tooltip.md +53 -0
  1215. package/docs/progress.md +62 -0
  1216. package/docs/recipes.md +147 -73
  1217. package/docs/slider.md +64 -0
  1218. package/docs/split-view.md +96 -7
  1219. package/docs/sunken-panel.md +106 -0
  1220. package/docs/surface-scaffold.md +487 -0
  1221. package/docs/tab-navigator.md +291 -0
  1222. package/docs/tag-field.md +66 -0
  1223. package/docs/type-contracts.md +137 -0
  1224. package/docs/ui-analyzer.md +406 -0
  1225. package/docs/ui-doctor.md +298 -0
  1226. package/docs/ui-evaluator.md +139 -0
  1227. package/docs/ux-demo.md +58 -17
  1228. package/docs/webawesome-migration.md +82 -0
  1229. package/docs/webawesome-theme.md +306 -47
  1230. package/docs/workbench-dialog.md +88 -0
  1231. package/docs/workbench.md +637 -12
  1232. package/docs/writing.md +154 -0
  1233. package/doctor/cli.mjs +120 -0
  1234. package/doctor/component-style-checks.mjs +457 -0
  1235. package/doctor/config.schema.json +94 -0
  1236. package/doctor/copy-capitalization-checks.mjs +603 -0
  1237. package/doctor/eslint-diagnostics.d.mts +24 -0
  1238. package/doctor/eslint-diagnostics.mjs +24 -0
  1239. package/doctor/index.d.mts +122 -0
  1240. package/doctor/index.mjs +1424 -0
  1241. package/doctor/report.schema.json +118 -0
  1242. package/evaluator/cli.mjs +89 -0
  1243. package/evaluator/index.d.mts +90 -0
  1244. package/evaluator/index.mjs +1203 -0
  1245. package/evaluator/report.schema.json +152 -0
  1246. package/llms.txt +940 -54
  1247. package/package.json +488 -43
  1248. package/scripts/component-catalog-extension-validation.mjs +28 -0
  1249. package/traversal-exclusions.mjs +86 -0
  1250. package/ux-demo/recipes/app-shell.tsx +204 -16
  1251. package/ux-demo/recipes/collapsible-sidebar.tsx +206 -45
  1252. package/ux-demo/recipes/compact-toolbar.tsx +135 -14
  1253. package/ux-demo/recipes/composer-form.tsx +135 -24
  1254. package/ux-demo/recipes/list-detail-dialog.tsx +155 -21
  1255. package/ux-demo/recipes/list-workspace-states.tsx +183 -11
  1256. package/ux-demo/recipes/loaders.ts +11 -3
  1257. package/ux-demo/recipes/loading-inspector.tsx +162 -39
  1258. package/ux-demo/recipes/media-detail.tsx +272 -0
  1259. package/ux-demo/recipes/mount-recipe.ts +28 -11
  1260. package/ux-demo/recipes/navigation-sidebar.tsx +137 -11
  1261. package/ux-demo/recipes/navigation-stack.tsx +79 -24
  1262. package/ux-demo/recipes/types.ts +18 -2
  1263. package/ux-demo/recipes/workspace-header.tsx +86 -5
  1264. package/vite-ux-review.d.mts +83 -0
  1265. package/vite-ux-review.mjs +120 -0
  1266. package/dist/app-tab.d.ts +0 -30
  1267. package/dist/app-tab.js +0 -5
  1268. package/dist/app-tab.js.map +0 -1
  1269. package/dist/browser/app-tab.js +0 -4
  1270. package/dist/browser/panel-header.js +0 -7
  1271. package/dist/browser/token-search-field.js +0 -4
  1272. package/dist/chunk-2Z5TWHKQ.js +0 -34
  1273. package/dist/chunk-2Z5TWHKQ.js.map +0 -1
  1274. package/dist/chunk-37T3VNIZ.js +0 -19
  1275. package/dist/chunk-37T3VNIZ.js.map +0 -1
  1276. package/dist/chunk-55DATV3A.js +0 -10
  1277. package/dist/chunk-55DATV3A.js.map +0 -1
  1278. package/dist/chunk-56RJXPHG.js.map +0 -1
  1279. package/dist/chunk-5ATCDSQS.js +0 -42
  1280. package/dist/chunk-5ATCDSQS.js.map +0 -1
  1281. package/dist/chunk-5E2HVJ33.js +0 -10
  1282. package/dist/chunk-5E2HVJ33.js.map +0 -1
  1283. package/dist/chunk-7BR3DO2A.js +0 -31
  1284. package/dist/chunk-7BR3DO2A.js.map +0 -1
  1285. package/dist/chunk-7JB7VPRI.js +0 -34
  1286. package/dist/chunk-7JB7VPRI.js.map +0 -1
  1287. package/dist/chunk-7LDCTU7D.js +0 -134
  1288. package/dist/chunk-7LDCTU7D.js.map +0 -1
  1289. package/dist/chunk-AQNKJRFH.js +0 -79
  1290. package/dist/chunk-AQNKJRFH.js.map +0 -1
  1291. package/dist/chunk-AVZHJN6C.js +0 -14
  1292. package/dist/chunk-AVZHJN6C.js.map +0 -1
  1293. package/dist/chunk-B24C4A6T.js +0 -22
  1294. package/dist/chunk-B24C4A6T.js.map +0 -1
  1295. package/dist/chunk-BLK3UEEI.js +0 -23
  1296. package/dist/chunk-BLK3UEEI.js.map +0 -1
  1297. package/dist/chunk-CH4SQ6H5.js +0 -39
  1298. package/dist/chunk-CH4SQ6H5.js.map +0 -1
  1299. package/dist/chunk-DAFFDO33.js +0 -14
  1300. package/dist/chunk-DAFFDO33.js.map +0 -1
  1301. package/dist/chunk-I7INRJO4.js +0 -17
  1302. package/dist/chunk-I7INRJO4.js.map +0 -1
  1303. package/dist/chunk-L4OKFDJY.js +0 -24
  1304. package/dist/chunk-L4OKFDJY.js.map +0 -1
  1305. package/dist/chunk-LCOBDOCC.js +0 -265
  1306. package/dist/chunk-LCOBDOCC.js.map +0 -1
  1307. package/dist/chunk-M5JRI6MN.js +0 -27
  1308. package/dist/chunk-M5JRI6MN.js.map +0 -1
  1309. package/dist/chunk-RNPGFQ33.js +0 -10
  1310. package/dist/chunk-RNPGFQ33.js.map +0 -1
  1311. package/dist/chunk-RUNWEPR4.js +0 -10
  1312. package/dist/chunk-RUNWEPR4.js.map +0 -1
  1313. package/dist/chunk-W2FK7ZNY.js +0 -26
  1314. package/dist/chunk-W2FK7ZNY.js.map +0 -1
  1315. package/dist/chunk-WVPYVDXY.js +0 -15
  1316. package/dist/chunk-WVPYVDXY.js.map +0 -1
  1317. package/dist/chunk-XE5ZLPCC.js +0 -20
  1318. package/dist/chunk-XE5ZLPCC.js.map +0 -1
  1319. package/dist/chunk-XXMOARTH.js +0 -229
  1320. package/dist/chunk-XXMOARTH.js.map +0 -1
  1321. package/dist/chunk-YGN7OMLT.js.map +0 -1
  1322. package/dist/panel-header.d.ts +0 -36
  1323. package/dist/panel-header.js +0 -7
  1324. package/dist/panel-header.js.map +0 -1
  1325. package/dist/styles/app-tab.css +0 -152
  1326. package/dist/styles/panel-header.css +0 -64
  1327. package/dist/styles/tab-scaffold.css +0 -84
  1328. package/dist/styles/token-search-field.css +0 -289
  1329. package/dist/tab-scaffold.d.ts +0 -30
  1330. package/dist/tab-scaffold.js +0 -16
  1331. package/dist/tab-scaffold.js.map +0 -1
  1332. package/dist/token-search-field.d.ts +0 -43
  1333. package/dist/token-search-field.js +0 -4
  1334. package/dist/token-search-field.js.map +0 -1
  1335. package/dist/wire-tab-scaffold.d.ts +0 -11
  1336. package/dist/wire-tab-scaffold.js +0 -16
  1337. package/dist/wire-tab-scaffold.js.map +0 -1
  1338. package/dist/wire-token-search-fields.js +0 -5
  1339. package/docs/design/templates/panel-header/icon-actions-dark.svg +0 -1
  1340. package/docs/design/templates/panel-header/icon-actions.svg +0 -1
  1341. package/docs/design/templates/panel-header/icon-summary-actions-dark.svg +0 -1
  1342. package/docs/design/templates/panel-header/icon-summary-actions.svg +0 -1
  1343. package/docs/design/templates/panel-header/no-icon-dark.svg +0 -1
  1344. package/docs/design/templates/panel-header/no-icon.svg +0 -1
  1345. package/docs/design/templates/panel-header/page-heading-dark.svg +0 -1
  1346. package/docs/design/templates/panel-header/page-heading.svg +0 -1
  1347. package/docs/design/templates/panel-header/title-only-dark.svg +0 -1
  1348. package/docs/design/templates/panel-header/title-only.svg +0 -1
  1349. package/docs/design/templates/panel-header-dark.svg +0 -13
  1350. package/docs/design/templates/panel-header.svg +0 -13
  1351. package/docs/design/templates/token-search-field/empty-dark.svg +0 -1
  1352. package/docs/design/templates/token-search-field/empty.svg +0 -1
  1353. package/docs/design/templates/token-search-field/tokens-dark.svg +0 -1
  1354. package/docs/design/templates/token-search-field/tokens.svg +0 -1
  1355. package/docs/design/templates/token-search-field-dark.svg +0 -7
  1356. package/docs/design/templates/token-search-field.svg +0 -7
  1357. package/docs/tab-scaffold.md +0 -41
  1358. package/ux-demo/recipes/recipes.css +0 -448
package/README.md CHANGED
@@ -4,11 +4,57 @@ 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
- For connective application patterns, use the seven [production composition
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
+
46
+ When authoring a component gallery, follow the single
47
+ [Catalog demo authoring contract](./docs/catalog.md#catalog-demo-authoring-contract)
48
+ for focused-versus-composition modes, helper nesting, specimen selection,
49
+ geometry inspection, and metadata ownership. AI tools can discover that
50
+ contract and its public imports through the shipped
51
+ [`catalog-authoring.json`](./ai/catalog-authoring.json) artifact.
52
+
53
+ For connective application patterns, use the eleven [production composition
8
54
  recipes](./docs/recipes.md). Each has a stable catalog route, runnable state,
9
55
  public-subpath source, semantic layout ownership, and explicit application
10
56
  customization boundaries. The composer recipe demonstrates one coherent form
11
- 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
12
58
  shared 8px gutter; only persistent feedback adds a nested semantic
13
59
  `StateBanner` surface.
14
60
 
@@ -23,57 +69,90 @@ npm install kerfjs @kerfjs/ui
23
69
  ```
24
70
 
25
71
  ```tsx
26
- import { ListItem } from '@kerfjs/ui/list-item';
27
- import { ListHeader } from '@kerfjs/ui/list-header';
28
- import { ListActionRow } from '@kerfjs/ui/list-action-row';
29
- import { Toolbar } from '@kerfjs/ui/toolbar';
30
- import { ToolbarControlGroup } from '@kerfjs/ui/toolbar-control-group';
31
- import { ToolbarText } from '@kerfjs/ui/toolbar-text';
32
-
33
- mount(root, () => <>
34
- <Toolbar label="Document" leading={<ToolbarControlGroup appearance="borderless" single><ToolbarText text="Notes" /></ToolbarControlGroup>} />
35
- <section>
36
- <ListHeader
37
- label="Workspace"
38
- action="show-workspace-actions"
39
- actionLabel="Workspace actions"
40
- rootAttributes={{ 'data-section-id': 'workspace' }}
41
- triggerAttributes={{
42
- popoverTarget: 'workspace-actions',
43
- popoverTargetAction: 'toggle',
44
- 'aria-controls': 'workspace-actions',
45
- 'aria-haspopup': 'dialog',
46
- }}
47
- />
48
- <ListItem
49
- action="open-notes"
50
- label="Notes"
51
- selected
52
- rootAttributes={{ 'data-command-color': 'blue', 'data-drop-status': 'ready' }}
72
+ import { mount } from "kerfjs";
73
+ import { ListItem } from "@kerfjs/ui/list-item";
74
+ import { ListHeader } from "@kerfjs/ui/list-header";
75
+ import { ListActionRow } from "@kerfjs/ui/list-action-row";
76
+ import { Toolbar } from "@kerfjs/ui/toolbar";
77
+ import { ToolbarText } from "@kerfjs/ui/toolbar-text";
78
+
79
+ const root = document.getElementById("app")!;
80
+
81
+ mount(root, () => (
82
+ <>
83
+ <Toolbar
84
+ label="Document"
85
+ leading={<ToolbarText text="Notes" />}
53
86
  />
54
- <ListActionRow
55
- action="open-file"
56
- itemId="src/main.ts"
57
- label="src/main.ts"
58
- trailingAction="open-file-actions"
59
- trailingActionLabel="Actions for src/main.ts"
60
- trailingActionIcon={moreIcon}
61
- />
62
- <div id="workspace-actions" popover="auto">Application-owned actions</div>
63
- </section>
64
- </>);
87
+ <section>
88
+ <ListHeader
89
+ label="Workspace"
90
+ action="show-workspace-actions"
91
+ actionLabel="Workspace actions"
92
+ rootAttributes={{ "data-section-id": "workspace" }}
93
+ triggerAttributes={{
94
+ popoverTarget: "workspace-actions",
95
+ popoverTargetAction: "toggle",
96
+ "aria-controls": "workspace-actions",
97
+ "aria-haspopup": "dialog",
98
+ }}
99
+ />
100
+ <ListItem
101
+ action="open-notes"
102
+ label="Notes"
103
+ selected
104
+ rootAttributes={{
105
+ "data-command-color": "blue",
106
+ "data-drop-status": "ready",
107
+ }}
108
+ />
109
+ <ListActionRow
110
+ action="open-file"
111
+ itemId="src/main.ts"
112
+ label="src/main.ts"
113
+ trailingAction="open-file-actions"
114
+ trailingActionLabel="Actions for src/main.ts"
115
+ trailingActionIcon={<span aria-hidden="true">⋯</span>}
116
+ />
117
+ <div id="workspace-actions" popover="auto">
118
+ Application-owned actions
119
+ </div>
120
+ </section>
121
+ </>
122
+ ));
65
123
  ```
66
124
 
67
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.
68
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
+
69
144
  `ListItem.rootAttributes`, `ListHeader.rootAttributes`,
70
- `ListActionRow.rootAttributes`, and `AppTab.rootAttributes` carry typed
145
+ `ListActionRow.rootAttributes`, `TabBarItem.rootAttributes`,
146
+ `Catalog.stageRootAttributes`, `CatalogExample.rootAttributes`, and `CatalogExampleStack.rootAttributes` carry typed
71
147
  application `data-*` metadata without
72
148
  teaching the package domain fields. `ListHeader.triggerAttributes` and
73
149
  `ListActionRow.trailingActionAttributes` additionally support native popover
74
150
  target and relationship attributes. Roles and component-owned action, selection,
75
- disclosure, naming, disabled, and icon semantics remain protected props; an
151
+ disclosure, naming, disabled, icon, and catalog-structure semantics remain protected props; an
76
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.
77
156
  The slots are also filtered at runtime, so structurally widened objects and
78
157
  JavaScript callers cannot bypass those protections with case-variant names.
79
158
  `ListItem.trailing` is dormant metadata. Use `ListActionRow` when a row needs
@@ -90,47 +169,186 @@ Do not concatenate a count into `label` or pass a numeric `badge`; the mutually
90
169
  exclusive legacy `badge` slot remains available for non-count `SafeHtml` such
91
170
  as a `New` marker.
92
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
+
93
208
  ## Component subpaths
94
209
 
95
- | Component | Browser import (includes reachable CSS) | Manual CSS export |
96
- | --- | --- | --- |
97
- | `LucideIcon` | `@kerfjs/ui/lucide-icon` | `@kerfjs/ui/lucide-icon.css` |
98
- | `DisclosureArrow` | `@kerfjs/ui/disclosure-arrow` | `@kerfjs/ui/disclosure-arrow.css` |
99
- | `Toolbar` | `@kerfjs/ui/toolbar` | `@kerfjs/ui/toolbar.css` |
100
- | `ToolbarControlGroup` | `@kerfjs/ui/toolbar-control-group` | `@kerfjs/ui/toolbar-control-group.css` |
101
- | `FloatingToolbar` | `@kerfjs/ui/floating-toolbar` | `@kerfjs/ui/floating-toolbar.css` |
102
- | `ToolbarText` | `@kerfjs/ui/toolbar-text` | `@kerfjs/ui/toolbar-text.css` |
103
- | `ListActionRow` | `@kerfjs/ui/list-action-row` | `@kerfjs/ui/list-action-row.css` |
104
- | `ListItem` | `@kerfjs/ui/list-item` | `@kerfjs/ui/list-item.css` |
105
- | `ListHeader` | `@kerfjs/ui/list-header` | `@kerfjs/ui/list-header.css` |
106
- | Pane, content, and navigation composition | — | `@kerfjs/ui/layout.css` |
107
- | `ResizableRegion` | `@kerfjs/ui/resizable-region` | `@kerfjs/ui/resizable-region.css` |
108
- | `wireResizableRegions` | `@kerfjs/ui/wire-resizable-regions` | — |
109
- | `AppTab` | `@kerfjs/ui/app-tab` | `@kerfjs/ui/app-tab.css` |
110
- | `TabBar` | `@kerfjs/ui/tab-bar` | `@kerfjs/ui/tab-bar.css` |
111
- | `wireTabBars`, `reorderTabs` | `@kerfjs/ui/wire-tab-bars` | — |
112
- | `LoadingSpinner` | `@kerfjs/ui/loading-spinner` | `@kerfjs/ui/loading-spinner.css` |
113
- | `Skeleton` | `@kerfjs/ui/skeleton` | `@kerfjs/ui/skeleton.css` |
114
- | `Select` | `@kerfjs/ui/select` | `@kerfjs/ui/select.css` |
115
- | `SegmentedControl` | `@kerfjs/ui/segmented-control` | `@kerfjs/ui/segmented-control.css` |
116
- | `TokenSearchField`, `readTokenSearchField`, `placeTokenSearchCaret` | `@kerfjs/ui/token-search-field` | `@kerfjs/ui/token-search-field.css` |
117
- | `wireTokenSearchFields` | `@kerfjs/ui/wire-token-search-fields` | — |
118
- | `StateBanner` | `@kerfjs/ui/state-banner` | `@kerfjs/ui/state-banner.css` |
119
- | `EmptyState` | `@kerfjs/ui/empty-state` | `@kerfjs/ui/empty-state.css` |
120
- | `PanelHeader` | `@kerfjs/ui/panel-header` | `@kerfjs/ui/panel-header.css` |
121
- | `ValueTable`, `ValueTableRow` | `@kerfjs/ui/value-table` | `@kerfjs/ui/value-table.css` |
122
-
123
- `PanelHeader` is a plain `Toolbar` used as a panel, dialog, or page heading: an
124
- optional icon control group (given a brand fill with a matching border), the
125
- title as extra-large `ToolbarText`, the app's trailing action controls, and an
126
- optional subtitle on a separate row below the title. It overrides no toolbar
127
- styles — the app passes its own trailing controls (typically a
128
- `ToolbarControlGroup`).
129
-
130
- `DisclosureArrow` defaults to an 18px root-scaled decorative visual. Override
131
- `--kui-disclosure-arrow-size` at the narrowest useful scope when a consumer
132
- needs another size; the owning control still supplies interaction, naming, and
133
- expanded state. Kerf `Select` retains its independent Web Awesome expand-glyph
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
+ | `ListDetailDialog` | `@kerfjs/ui/list-detail-dialog` | `@kerfjs/ui/list-detail-dialog.css` |
220
+ | `WorkbenchDialog` | `@kerfjs/ui/workbench-dialog` | `@kerfjs/ui/workbench-dialog.css` |
221
+ | `Disclosure` | `@kerfjs/ui/disclosure` | `@kerfjs/ui/disclosure.css` |
222
+ | `ProgressBar` | `@kerfjs/ui/progress-bar` | `@kerfjs/ui/progress-bar.css` |
223
+ | `ProgressRing` | `@kerfjs/ui/progress-ring` | `@kerfjs/ui/progress-ring.css` |
224
+ | `Slider` | `@kerfjs/ui/slider` | `@kerfjs/ui/slider.css` |
225
+ | `wireSliders`, `syncSlider` | `@kerfjs/ui/wire-sliders` | — |
226
+ | `TagField` | `@kerfjs/ui/tag-field` | `@kerfjs/ui/tag-field.css` |
227
+ | `wireTagFields` | `@kerfjs/ui/wire-tag-fields` | — |
228
+ | `ColorSwatches` | `@kerfjs/ui/color-swatches` | `@kerfjs/ui/color-swatches.css` |
229
+ | `ColorPicker` | `@kerfjs/ui/color-picker` | `@kerfjs/ui/color-picker.css` |
230
+ | `wireColorPickers` | `@kerfjs/ui/wire-color-pickers` | — |
231
+ | `ColorField` | `@kerfjs/ui/color-field` | `@kerfjs/ui/color-field.css` |
232
+ | `wireColorFields` | `@kerfjs/ui/wire-color-fields` | — |
233
+ | `FloatingToolbar` | `@kerfjs/ui/floating-toolbar` | `@kerfjs/ui/floating-toolbar.css` |
234
+ | `PopupMenu` (register with `@kerfjs/ui/popup-menu/register`) | `@kerfjs/ui/popup-menu` | `@kerfjs/ui/popup-menu.css` |
235
+ | `openAnchoredSurface`, `openAnchoredSurfaceAt` | `@kerfjs/ui/anchored-surface` | `@kerfjs/ui/anchored-surface.css` |
236
+ | `ToolbarText` | `@kerfjs/ui/toolbar-text` | `@kerfjs/ui/toolbar-text.css` |
237
+ | `Text`, `FieldLabel` | `@kerfjs/ui/text` | `@kerfjs/ui/text.css` |
238
+ | `List` | `@kerfjs/ui/list` | `@kerfjs/ui/list.css` |
239
+ | `Row` | `@kerfjs/ui/row` | `@kerfjs/ui/row.css` |
240
+ | `Grid` | `@kerfjs/ui/grid` | `@kerfjs/ui/grid.css` |
241
+ | `Spacer` | `@kerfjs/ui/spacer` | `@kerfjs/ui/spacer.css` |
242
+ | Typed CSS dimension builders | `@kerfjs/ui/css-values` | — |
243
+ | `ListActionRow` | `@kerfjs/ui/list-action-row` | `@kerfjs/ui/list-action-row.css` |
244
+ | `ListItem` | `@kerfjs/ui/list-item` | `@kerfjs/ui/list-item.css` |
245
+ | `wireListReorder`, `reorderListItems` | `@kerfjs/ui/wire-list-reorder` | — |
246
+ | `wireListFocusScroll` | `@kerfjs/ui/wire-list-focus-scroll` | — |
247
+ | `ListHeader` | `@kerfjs/ui/list-header` | `@kerfjs/ui/list-header.css` |
248
+ | `ListInsetControl` | `@kerfjs/ui/list-inset-control` | `@kerfjs/ui/list-inset-control.css` |
249
+ | `ListInsetText` | `@kerfjs/ui/list-inset-text` | `@kerfjs/ui/list-inset-text.css` |
250
+ | `ContentItem` | `@kerfjs/ui/content-item` | `@kerfjs/ui/content-item.css` |
251
+ | `Pane` | `@kerfjs/ui/pane` | `@kerfjs/ui/pane.css` |
252
+ | `NavStack` | `@kerfjs/ui/nav-stack` | `@kerfjs/ui/nav-stack.css` |
253
+ | `wireNavStack` | `@kerfjs/ui/wire-nav-stack` | — |
254
+ | `wirePaneChrome` | `@kerfjs/ui/wire-pane-chrome` | — |
255
+ | `SplitView` | `@kerfjs/ui/split-view` | `@kerfjs/ui/split-view.css` |
256
+ | `TabNavigator` | `@kerfjs/ui/tab-navigator` | `@kerfjs/ui/tab-navigator.css` |
257
+ | `wireTabNavigator` | `@kerfjs/ui/wire-tab-navigator` | — |
258
+ | `Workbench` | `@kerfjs/ui/workbench` | `@kerfjs/ui/workbench.css` |
259
+ | `wireWorkbench` | `@kerfjs/ui/wire-workbench` | — |
260
+ | `CollapsiblePanel`, `CollapsiblePanelToggle` | `@kerfjs/ui/collapsible-panel` | `@kerfjs/ui/collapsible-panel.css` |
261
+ | `wireSidebar` | `@kerfjs/ui/wire-sidebar` | — |
262
+ | Content and navigation composition | — | `@kerfjs/ui/layout.css` |
263
+ | `ResizableRegion` | `@kerfjs/ui/resizable-region` | `@kerfjs/ui/resizable-region.css` |
264
+ | `wireResizableRegions` | `@kerfjs/ui/wire-resizable-regions` | — |
265
+ | `TabBarItem` | `@kerfjs/ui/tab-bar-item` | `@kerfjs/ui/tab-bar-item.css` |
266
+ | `TabBar` | `@kerfjs/ui/tab-bar` | `@kerfjs/ui/tab-bar.css` |
267
+ | `wireTabBars`, `reorderTabs` | `@kerfjs/ui/wire-tab-bars` | — |
268
+ | `wireScrollDividers` | `@kerfjs/ui/wire-scroll-dividers` | — |
269
+ | `wireToolbarVisibility` | `@kerfjs/ui/wire-toolbar-visibility` | — |
270
+ | `wireOverlaySheets` | `@kerfjs/ui/wire-overlay-sheets` | `@kerfjs/ui/overlay-sheet.css` |
271
+ | Toasts for `kerfjs/overlay` `toast()` | — | `@kerfjs/ui/overlay-toast.css` |
272
+ | Tooltips for `kerfjs/overlay` `tooltip()` | — | `@kerfjs/ui/overlay-tooltip.css` |
273
+ | `LoadingSpinner` | `@kerfjs/ui/loading-spinner` | `@kerfjs/ui/loading-spinner.css` |
274
+ | `Skeleton` | `@kerfjs/ui/skeleton` | `@kerfjs/ui/skeleton.css` |
275
+ | `SunkenPanel` | `@kerfjs/ui/sunken-panel` | `@kerfjs/ui/sunken-panel.css` |
276
+ | `BackdropImage` | `@kerfjs/ui/backdrop-image` | `@kerfjs/ui/backdrop-image.css` |
277
+ | `Select` | `@kerfjs/ui/select` | `@kerfjs/ui/select.css` |
278
+ | `SegmentedControl` | `@kerfjs/ui/segmented-control` | `@kerfjs/ui/segmented-control.css` |
279
+ | `ChoiceChips` | `@kerfjs/ui/choice-chips` | `@kerfjs/ui/choice-chips.css` |
280
+ | `TextField` | `@kerfjs/ui/text-field` | `@kerfjs/ui/text-field.css` |
281
+ | `wireTextFields` | `@kerfjs/ui/wire-text-fields` | — |
282
+ | `Checkbox` | `@kerfjs/ui/checkbox` | `@kerfjs/ui/checkbox.css` |
283
+ | `CheckboxGroup` | `@kerfjs/ui/checkbox-group` | `@kerfjs/ui/checkbox-group.css` |
284
+ | `wireCheckboxes` | `@kerfjs/ui/wire-checkboxes` | — |
285
+ | `RadioGroup` | `@kerfjs/ui/radio-group` | `@kerfjs/ui/radio-group.css` |
286
+ | `Switch` | `@kerfjs/ui/switch` | `@kerfjs/ui/switch.css` |
287
+ | `MessageComposer` | `@kerfjs/ui/message-composer` | `@kerfjs/ui/message-composer.css` |
288
+ | `wireMessageComposers` | `@kerfjs/ui/wire-message-composers` | — |
289
+ | `SearchField`, `readSearchField`, `placeSearchFieldCaret` | `@kerfjs/ui/search-field` | `@kerfjs/ui/search-field.css` |
290
+ | `wireSearchFields` | `@kerfjs/ui/wire-search-fields` | — |
291
+ | `createSearchFieldModel` | `@kerfjs/ui/search-field-model` | — |
292
+ | `StateBanner` | `@kerfjs/ui/state-banner` | `@kerfjs/ui/state-banner.css` |
293
+ | `Button` | `@kerfjs/ui/button` | `@kerfjs/ui/button.css` |
294
+ | `SplitButton` | `@kerfjs/ui/split-button` | `@kerfjs/ui/split-button.css` |
295
+ | `FramedList`, `FramedListRow` | `@kerfjs/ui/framed-list` | `@kerfjs/ui/framed-list.css` |
296
+ | `SummaryRow` | `@kerfjs/ui/summary-row` | `@kerfjs/ui/summary-row.css` |
297
+ | `ColumnTrack` | `@kerfjs/ui/column-track` | `@kerfjs/ui/column-track.css` |
298
+ | `ContentSwap` | `@kerfjs/ui/content-swap` | `@kerfjs/ui/content-swap.css` |
299
+ | `FilePickerTrigger`, `FileDropZone` | `@kerfjs/ui/file-picker` | `@kerfjs/ui/file-picker.css` |
300
+ | `wireFilePickers`, `fileMatchesAccept` | `@kerfjs/ui/wire-file-pickers` | — |
301
+ | `Combobox` | `@kerfjs/ui/combobox` | `@kerfjs/ui/combobox.css` |
302
+ | `wireComboboxes` | `@kerfjs/ui/wire-comboboxes` | — |
303
+ | `CornerStatus` | `@kerfjs/ui/corner-status` | `@kerfjs/ui/corner-status.css` |
304
+ | `EdgeActivityIndicator` | `@kerfjs/ui/edge-activity-indicator` | `@kerfjs/ui/edge-activity-indicator.css` |
305
+ | `wireCornerStatus` | `@kerfjs/ui/wire-corner-status` | — |
306
+ | `EmptyState` | `@kerfjs/ui/empty-state` | `@kerfjs/ui/empty-state.css` |
307
+ | `ValueTable`, `ValueTableRow` | `@kerfjs/ui/value-table` | `@kerfjs/ui/value-table.css` |
308
+
309
+ Application layouts are separate component subpaths. Browser-condition imports
310
+ include their reachable CSS; use the matching manual CSS export when your
311
+ bundler does not select the browser condition. Add a wire subpath when the
312
+ layout has interactive behavior. The catalog
313
+ entries for `nav-stack`, `split-view`, `tab-navigator`, `workbench`, and
314
+ `collapsible-panel` document their selection rules, ownership boundaries,
315
+ public classes, tokens, and focused demos. See
316
+ [`docs/app-layouts.md`](./docs/app-layouts.md) for the layout decision matrix.
317
+ `NavStack` and `TabNavigator` expose `chromeDividers="scroll" | "always" |
318
+ "none"` for their chrome lines; `SplitView` forwards the setting to its
319
+ compact stack. A sole `Pane` in a view or scene fills it, keeping the Pane's
320
+ header in place while its own content scrolls.
321
+
322
+ For a `Workbench` or `CollapsiblePanel`, place panel toolbar groups in its
323
+ `leading`, `center`, and `trailing` zones. Add `relocateOnCollapse` to each
324
+ `ToolbarControlGroup` that should remain available in the work-area toolbar
325
+ while the panel is closed. The panel collects marked groups in zone order;
326
+ its toggle follows them. See [Workbench panel toolbars](./docs/workbench.md#panel-toolbars).
327
+
328
+ Compose panel, dialog, and page headings directly with `Toolbar`: put an optional
329
+ icon in a `ToolbarControlGroup`, use a direct extra-large `ToolbarText` for the
330
+ title, and put actions in the trailing zone inside their own control group. Set
331
+ `headingLevel` for page or section headings. Supporting copy is app-owned content
332
+ below the toolbar and should be connected to its host with `aria-describedby`
333
+ when it adds useful context. Set `responsive="wrap"` on a heading whose title
334
+ must stay whole: it keeps one row while everything fits and otherwise moves the
335
+ trailing actions below the title instead of truncating it.
336
+
337
+ A toolbar with a single zone gives it the whole content box, so content set to
338
+ fill the row reaches both insets; an absent zone leaves no empty track or gap.
339
+
340
+ A toolbar never clips an action. Its trailing zone wraps whole control groups
341
+ onto another trailing-aligned row under every `responsive` policy, and a
342
+ `responsive="stack"` toolbar wraps its stacked center and trailing groups the
343
+ same way. Wrapping keeps every command visible at its full 44px target without
344
+ moving focus or DOM identity. When a product wants fewer visible commands at
345
+ narrow widths, it chooses them: render a lower-priority command inside an
346
+ app-owned "More" `PopupMenu` (in a `single` group with `nestedDropdown`).
347
+
348
+ `DisclosureArrow` defaults to an 18px root-scaled decorative visual. Pass a
349
+ typed `size` (for example `size={remify(24)}` from `@kerfjs/ui/css-values`)
350
+ when a consumer needs another size; the owning control still supplies interaction, naming, and
351
+ expanded state. Kerf `Select` keeps its own expand-glyph
134
352
  scale of `.5` through `--kui-disclosure-icon-scale`. Author replacement
135
353
  `DisclosureArrow` icon content facing right before its configured direction
136
354
  transform is applied. Direction changes take the shortest rotation path; a
@@ -141,20 +359,172 @@ transform is applied. Direction changes take the shortest rotation path; a
141
359
  real controlled content and preserve the button's stable label; ordinary
142
360
  navigation must not display a disclosure arrow. A custom `actionIcon` remains
143
361
  an escape hatch and replaces the default arrow entirely. The header fills its
144
- available inline width, keeping a separate action at the logical end in a 44px
145
- target. Its visible action glyph defaults to 18px through
362
+ available inline width by default; set `inline` to shrink-wrap it beside other
363
+ content and remove its root margin, border, and padding. It keeps a separate
364
+ action at the logical end. Its visible action glyph defaults to 18px through
146
365
  `--kui-list-header-action-icon-size`.
147
366
 
148
367
  ## Machine-readable catalog
149
368
 
150
- AI tools can retrieve the shipped [`ai/component-catalog.json`](./ai/component-catalog.json)
369
+ AI assistants should start from the generated markdown reference,
370
+ [`ai/components/README.md`](./ai/components/README.md): a one-line index of
371
+ every entry grouped like the catalog, plus one short page per entry
372
+ (`ai/components/<id>.md`) covering when to use and avoid it, imports and
373
+ CSS/registration side effects, where its exact props live, legal parents,
374
+ zones with their JSX props and child counts, app- and wiring-owned state,
375
+ geometry ownership, accessibility obligations, the styling boundary
376
+ (configure through props; never override internals), and its composition
377
+ diagnostics. The pages are projected from the two JSON catalogs by
378
+ `scripts/sync-component-docs.mjs` (`npm run catalog:sync`), and
379
+ `npm run check:catalog` fails when any page drifts.
380
+
381
+ Tools can retrieve the shipped [`ai/component-catalog.json`](./ai/component-catalog.json)
151
382
  for the exhaustive component and composition inventory. It is the canonical
152
383
  source for ids, public exports, purpose and selection guidance, relationships,
153
384
  delivery and side effects, companion wiring, application-owned policy,
154
385
  variants, accessibility obligations, public CSS hooks, routes, and current
155
386
  documentation/recipe links. The adjacent
156
387
  [`component-catalog.schema.json`](./ai/component-catalog.schema.json) describes
157
- the versioned format.
388
+ the versioned format. Every visual entry also declares who owns its margin,
389
+ border, and padding, so a generator can fit it into Kerf's alignment model
390
+ without guessing from a screenshot or private CSS.
391
+
392
+ Catalog demo authoring is deliberately separate from the entry inventory. Load
393
+ [`catalog-authoring.json`](./ai/catalog-authoring.json) to discover the
394
+ authoritative [Catalog demo authoring contract](./docs/catalog.md#catalog-demo-authoring-contract),
395
+ the exact API-signature context, public imports/helpers, sanctioned metadata
396
+ slot, three-kind taxonomy, and functional-group/importance ordering policy.
397
+ Keeping this as a companion artifact prevents per-entry selection facts from
398
+ duplicating presentation rules.
399
+
400
+ Tools that evaluate composition may additionally load
401
+ [`component-composition.json`](./ai/component-composition.json). It is a
402
+ generated composition layer beside `component-catalog.json`, not a newer
403
+ version of it: a deterministic, package-qualified projection of every
404
+ component-catalog entry with formal parent/context, zone/cardinality, child,
405
+ state ownership, wiring, responsive, layout, accessibility, public-boundary,
406
+ and stable-diagnostic fields. `component-catalog.json` remains the selection
407
+ and delivery surface. Composition defaults are
408
+ deliberately permissive; only documented objective rules receive an
409
+ authoritative override and enforceable diagnostic. The adjacent schema and
410
+ [`component-composition.d.ts`](./ai/component-composition.d.ts) types describe
411
+ the same contract.
412
+
413
+ Applications and downstream design systems should publish the same facts for
414
+ their own components. Start from the reusable
415
+ [`component-catalog-extension.schema.json`](./ai/component-catalog-extension.schema.json)
416
+ and the checked
417
+ [`component-catalog-extension.json`](./docs/examples/component-catalog-extension.json)
418
+ example. Give each app-owned component or composition a stable id, selection
419
+ guidance, public hooks, and explicit geometry ownership; then concatenate its
420
+ `entries` with Kerf's shipped `entries` in the AI context. Keep package/source
421
+ identity alongside each input when ids could collide. This makes a combined
422
+ tool reason about both sides of a composition using one vocabulary without
423
+ pretending app-local components are `@kerfjs/ui` exports. A package that
424
+ keeps a `kerf.components.json` generates this extension with
425
+ `kerf-component-catalog` by setting `kerfComponentCatalog.selectionOutput`
426
+ instead of maintaining a second JSON by hand.
427
+ For a consumer UX demo, `@kerfjs/ui/catalog-projection` derives rows and
428
+ relationships from that extension; `kerf-catalog-demo --write` emits a typed
429
+ module and `--check` catches drift. See the [catalog guide](./docs/catalog.md)
430
+ for repository base and source path configuration. To offer the catalog's
431
+ **Capture region** link to UX Review on a local server, add the Node-only
432
+ `uxReviewPlugin` from `@kerfjs/ui/vite-ux-review` to the Vite config (or, for a
433
+ catalog your own backend serves, mount its `uxReviewProjectResponse` /
434
+ `uxReviewMiddleware` on the development server) and pass `wireCatalog`'s
435
+ `onUxReviewProject` result to `Catalog`'s `uxReview` (the
436
+ [catalog guide](./docs/catalog.md#ux-review-capture) has the wiring).
437
+
438
+ Composition-aware consumers use
439
+ [`component-composition-extension.schema.json`](./ai/component-composition-extension.schema.json),
440
+ its shipped TypeScript types, and the checked
441
+ [`component-composition-extension.json`](./docs/examples/component-composition-extension.json)
442
+ example. Preserve each catalog's package and qualify every identity and
443
+ cross-catalog reference as `package:id`; never merge entries by bare id.
444
+
445
+ [`compile-time-contracts-v1.json`](./ai/compile-time-contracts-v1.json) is the
446
+ matching declaration contract: stable `KUI-T###` ids identify the invalid prop,
447
+ state, identity, accessibility, and protected-attribute combinations TypeScript
448
+ rejects. The package gate compiles one positive/negative consumer fixture against
449
+ both source and declarations extracted from the real packed tarball. The
450
+ [compile-time contract guide](./docs/type-contracts.md) documents migrations and
451
+ the dynamic DOM/children relationships that remain runtime or catalog checks.
452
+ Packages scaffolded by `create-kerf-component` maintain this composition input from
453
+ `kerf.components.json`: `npm run catalog:generate` emits the catalog and
454
+ `npm run catalog:check` verifies source files, named public exports, explicit
455
+ author decisions, and byte-for-byte drift. Tools index the generated consumer
456
+ entries and this catalog by full key, reject duplicate full keys, search the
457
+ consumer package first, and retain package identity across every reference.
458
+ They must not infer missing semantics or geometry from rendered appearance.
459
+
460
+ ### Application UI profile
461
+
462
+ Applications can check in `.kerf-ui-profile.json` so tools do not have to infer
463
+ project-wide UI policy. Start from the shipped
464
+ [`application-ui-profile.defaults.json`](./ai/application-ui-profile.defaults.json)
465
+ and the checked
466
+ [`application-ui-profile.json`](./docs/examples/application-ui-profile.json)
467
+ workspace example. The versioned
468
+ [`application-ui-profile.schema.json`](./ai/application-ui-profile.schema.json)
469
+ and [`application-ui-profile.d.ts`](./ai/application-ui-profile.d.ts) cover
470
+ catalog locations, concept preferences, allowed theme/density choices, semantic
471
+ token overrides, layout/responsive conventions, and narrow rule exceptions.
472
+ Profiles contain policy only—never product records, user data, or broad styling
473
+ waivers.
474
+
475
+ Catalog declarations always provide a `composition` location. Consumer
476
+ packages generated with composition-only metadata omit `selection`;
477
+ `@kerfjs/ui` continues to require its `component-catalog.json` selection catalog.
478
+
479
+ Node-based AI and static-analysis tools may import the shipped discovery API
480
+ from `@kerfjs/ui/ai/application-ui-profile.mjs`. It discovers package defaults,
481
+ then the workspace profile, then directory profiles from parent to child;
482
+ `mergeApplicationUiProfiles()` applies later scalar/map values, replaces a
483
+ catalog by package and an exception by id, and preserves source provenance.
484
+ `loadApplicationUiProfile()` resolves catalogs and returns diagnostics with the
485
+ originating file plus JSON path. Unknown/stale components, tokens, rules, and
486
+ catalog locations are errors. Every layer is checked against its then-effective
487
+ catalogs, including parent references and catalog paths later overridden by a
488
+ child profile. Synchronous integrations can require the shipped
489
+ `application-ui-profile-sync.cjs` projection and call
490
+ `loadApplicationUiProfileSync()` with already-discovered layers. Consumers that define additional stable
491
+ diagnostics pass their ids through the additive `knownRules` option; those ids
492
+ are merged with catalog diagnostics before exception validation.
493
+
494
+ ### Static CSS and layout ownership analysis
495
+
496
+ Run `kerf-ui-analyze --root . src` (or import
497
+ `@kerfjs/ui/analyzer`) to evaluate cross-file integration facts against the
498
+ composition catalogs and application profile. It catches provable private
499
+ selector reach-through, unknown tokens, competing geometry owners, nested
500
+ scroll owners, and cataloged CSS-value violations in JavaScript/TypeScript
501
+ component calls and JSX, plus component-ownership overrides: CSS that makes
502
+ another package's component its subject, touches its private variables,
503
+ overrides a token its typed prop sets, or styles it through a hook class on
504
+ its root (`KUI-L019`–`KUI-L022`; forcing a component's dimensions is one such
505
+ restyle). It reports repeated insets, exceptional spacing shorthands, and
506
+ dynamic classes separately as review findings. Text, versioned JSON,
507
+ and SARIF outputs carry stable `KUI-L###` ids, repository-relative locations,
508
+ evidence, and ownership chains. See the [analyzer guide](./docs/ui-analyzer.md).
509
+ Opt into ownership between components in one package with Doctor's
510
+ `"ownership": "component"` setting and catalog `styleSources` declarations;
511
+ the default keeps package-level ownership.
512
+
513
+ ### Browser-backed integration evaluation
514
+
515
+ Run `kerf-ui-evaluate --url <running-app>` (or import
516
+ `@kerfjs/ui/evaluator`) after the static analyzer. Its Playwright-backed
517
+ wide/intermediate/narrow/200%-zoom, light/dark, and reduced-motion matrix checks
518
+ rendered overflow, clipping, reachability, focus/keyboard behavior, accessible
519
+ names, contrast, hit targets, scrolling, alignment, and cataloged runtime
520
+ geometry. The versioned report carries stable `KUI-B###` diagnostics, focused
521
+ DOM/computed-style evidence, hashed screenshot artifacts, explicit timeout and
522
+ retention policy, and a separate unscored human-visual rubric. See the
523
+ [browser evaluator guide](./docs/ui-evaluator.md).
524
+
525
+ ### Unified repair-loop doctor
526
+
527
+ 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).
158
528
 
159
529
  For code generation, pair catalog selection guidance with the checked-in
160
530
  [`public-api-signatures-v1.md`](./ai/public-api-signatures-v1.md) declaration
@@ -184,40 +554,74 @@ roots therefore do not need a transitive stylesheet list, and removing the last
184
554
  component import also removes its reachable CSS. This is component-level CSS
185
555
  tree shaking; variants within an imported component remain together.
186
556
 
557
+ When one public subpath groups several visual components, its source is a
558
+ folder: one component per file and one owned stylesheet per visual component.
559
+ The public JavaScript/TypeScript compatibility entrypoint only re-exports those
560
+ modules, and its CSS compatibility entrypoint only imports the owner
561
+ stylesheets. Do not accumulate multiple visual owners in either compatibility
562
+ file.
563
+
564
+ `npm run check:css-ownership` keeps that boundary honest: application CSS may
565
+ style only application-owned structure, never package component classes or
566
+ Web Awesome descendants, and a package component's stylesheet styles only
567
+ itself (in a composing parent's context when needed) — never another kerf
568
+ component's root, the `wa-*` tags it renders, its variables, or a hook class on
569
+ its root. The UX catalog's `style.css` contains document-shell
570
+ mechanics only, recipes ship no stylesheets (`npm run check:recipes` rejects
571
+ route stylesheets, inline styles, and styling-only classes), and `catalog.css`
572
+ remains a
573
+ minimal compatibility entrypoint.
574
+
187
575
  The root `@kerfjs/ui` barrel stays JavaScript-only because making a side-effectful
188
576
  CSS barrel tree-shakable is not portable across bundlers. If an application uses
189
577
  that convenience import, also import `@kerfjs/ui/styles.css`, which deliberately
190
578
  contains the complete layer. Non-browser/SSR tools resolve the pure `import`
191
579
  condition automatically; `@kerfjs/ui/unstyled` is the explicit CSS-free root
192
580
  entry for a browser build with a custom styling pipeline. The exported
193
- `foundation.css` and component CSS paths remain available for fully manual
194
- delivery. Load application overrides after package styles, or scope `--kui-*`
195
- variables directly on a component instance.
581
+ `@kerfjs/ui/foundation.css` and component CSS paths remain available for fully
582
+ manual delivery. Its complete supported `--kui-*` token surface is cataloged
583
+ under the `foundation` entry. Load application overrides after package styles,
584
+ or scope variables directly on a component instance.
585
+
586
+ Applications can separately opt into `@kerfjs/ui/document.css` for border-box
587
+ sizing, token-backed body typography/colors, zero body margin, plain-link color,
588
+ inherited native table-cell and form-control font metrics, and a definite
589
+ full-height chain. Add `class="kui-app-root"` to the one direct
590
+ mount container when a percentage-height application shell must fill the
591
+ viewport. This global baseline is deliberately absent from `styles.css` and
592
+ component browser imports. See [Document baseline](./docs/document-baseline.md).
196
593
 
197
594
  ## Pane and content geometry
198
595
 
199
- Import `@kerfjs/ui/layout.css` and use the same structural vocabulary for a
200
- sidebar, main area, inspector, or dialog. `.kui-pane` is unpadded and contains
201
- an optional toolbar, one scrolling `.kui-pane__content`, and an optional footer.
202
- Add `.kui-content` to make its major children a vertical stack with 24px gaps.
596
+ Render `Pane` (`@kerfjs/ui/pane`) for a sidebar, main area, inspector, or
597
+ dialog: the same structural vocabulary everywhere. Its `.kui-pane` root is
598
+ unpadded and contains an optional header, one scrolling `.kui-pane__content`,
599
+ and an optional footer; the content slot already carries `.kui-content`, which
600
+ makes its major children a vertical stack with 24px gaps. Choose landmark
601
+ semantics with `element` / `contentElement` rather than writing the pane
602
+ classes onto your own elements — `eslint-plugin-kerfjs` reports a component's
603
+ anatomy class on an application-owned element as `KUI-L103`.
203
604
 
204
605
  ```tsx
205
- <aside class="kui-pane">
206
- <div class="kui-pane__toolbar"><Toolbar label="Workspace" ... /></div>
207
- <nav class="kui-pane__content kui-content">
208
- <section>
209
- <ListHeader label="Workspace" count={3} countLabel="3 workspaces" />
210
- <ListItem action="open" label="Inbox" icon={inboxIcon} />
211
- <ListItem action="open" label="Drafts" />
212
- </section>
213
- <div class="kui-content-item">Workspace details</div>
214
- </nav>
215
- </aside>
606
+ <Pane
607
+ element="aside"
608
+ label="Workspace"
609
+ contentElement="nav"
610
+ header={<Toolbar label="Workspace" ... />}
611
+ >
612
+ <section>
613
+ <ListHeader label="Workspace" count={3} countLabel="3 workspaces" />
614
+ <ListItem action="open" label="Inbox" icon={inboxIcon} />
615
+ <ListItem action="open" label="Drafts" />
616
+ </section>
617
+ <ContentItem>Workspace details</ContentItem>
618
+ </Pane>
216
619
  ```
217
620
 
218
- Ordinary children use `.kui-content-item`: 8px inline margin, a real 1px border
219
- (transparent by default), 8px padding, and 12px rounded corners. The pill
220
- modifier uses a 22px radius. A component can expose a transparent border or
621
+ Ordinary children use `ContentItem` (`@kerfjs/ui/content-item`): 8px inline
622
+ margin, a real 1px border (transparent by default), 8px padding, and 12px
623
+ rounded corners. `shape="pill"` uses a 22px radius, and `frame="framed"` paints
624
+ the neutral border only when the item marks a real distinction. A component can expose a transparent border or
221
625
  background without changing layout. `ListHeader` follows the same rule while
222
626
  keeping its dormant title and count-or-badge cluster separate from its optional
223
627
  44px action.
@@ -234,14 +638,17 @@ the complete [layout contract](./docs/layout.md).
234
638
 
235
639
  ## Web Awesome theme
236
640
 
237
- Apps using Web Awesome's free components can opt into the same visual universe
238
- with one CSS import:
641
+ Kerf components never need Web Awesome: every Kerf component draws native
642
+ controls and reads only `--kui-*` tokens, which resolve to the same values with
643
+ or without the Web Awesome theme. `@awesome.me/webawesome` is an optional peer
644
+ for applications that also render Web Awesome's `wa-*` elements. Those apps opt
645
+ into the same visual universe with one CSS import:
239
646
 
240
647
  ```ts
241
- import type {} from '@kerfjs/ui/webawesome';
242
- import '@kerfjs/ui/webawesome.css';
243
- import '@awesome.me/webawesome/dist/components/button/button.js';
244
- import '@awesome.me/webawesome/dist/components/input/input.js';
648
+ import type {} from "@kerfjs/ui/webawesome";
649
+ import "@kerfjs/ui/webawesome.css";
650
+ import "@awesome.me/webawesome/dist/components/button/button.js";
651
+ import "@awesome.me/webawesome/dist/components/input/input.js";
245
652
  ```
246
653
 
247
654
  The type-only `@kerfjs/ui/webawesome` import adds Kerf JSX intrinsic-element
@@ -252,7 +659,10 @@ Awesome modules the application renders.
252
659
  `webawesome.css` includes Web Awesome's native/base theme and then applies the
253
660
  Hot Sheet 2 palette, surfaces, status colors, focus treatment, form geometry,
254
661
  radii, tooltips, and shadows through Web Awesome's public `--wa-*` contract.
255
- Those tokens flow into all free component families. Every free Web Awesome 3.12
662
+ On `wa-dialog`, the optional `hide-actions` class hides the exported
663
+ `header-actions` shadow part for compositions that provide another dismissal
664
+ affordance.
665
+ Those tokens flow into all free component families. Every free Web Awesome 3.14
256
666
  component has an individual UX-catalog route under the collapsible ecosystem
257
667
  section, but the theme entry does not import or register component JavaScript,
258
668
  so each component module remains independently tree-shakeable in consuming apps.
@@ -260,37 +670,44 @@ Tooltip and Popover surfaces omit pointer arrows by default. Override
260
670
  `--wa-tooltip-arrow-size` and `--kui-wa-popover-arrow-size`, or a single
261
671
  popover's public `--arrow-size`, when an arrow communicates useful context.
262
672
 
263
- Load application CSS afterward to override semantic values globally, or scope
264
- them to a subtree. Use Web Awesome's `.wa-light`, `.wa-dark`, and `.wa-invert`
673
+ Configure semantic values globally at the application root, or scope variables
674
+ to a self-owned subtree. Use Web Awesome's `.wa-light`, `.wa-dark`, and `.wa-invert`
265
675
  classes for explicit appearance boundaries:
266
676
 
267
677
  ```css
268
678
  :root {
269
679
  --wa-color-brand-fill-loud: #7540a8;
270
- --wa-form-control-border-radius: .5rem;
680
+ --wa-form-control-border-radius: 0.5rem;
271
681
  }
272
682
  ```
273
683
 
274
684
  `foundation.css` follows Hot Sheet 2's Web Awesome-compatible semantic palette.
275
- Brand, neutral, success, warning, and danger each expose fill, border, and
276
- foreground roles through `--kui-color-*`; stateful components also expose
685
+ Brand, pop, neutral, success, warning, and danger each expose fill, border, and
686
+ foreground roles through `--kui-color-*`. Pop is attractive, non-status emphasis
687
+ for featured, novel, or celebratory content; it never substitutes for success,
688
+ warning, or danger. Stateful components also expose
277
689
  component variables such as `--kui-state-banner-background`. Override the
278
690
  foundation for an application theme, a tone variable for one semantic state, or
279
691
  a component variable on one instance without replacing component selectors.
280
- Prefer an equivalent prop or token. When composition-specific layout still
281
- needs a selector, the component catalog's `publicClasses` arrays define the
282
- exact stable anatomy: public-class-to-public-class selectors are supported;
283
- descendant tag, id, attribute-only, and unlisted-class selectors are not.
284
-
285
- `StateBanner` has opinionated `neutral`, `info`, `success`, `warning`, and
286
- `danger` palettes. Override an individual banner with
692
+ Prefer an equivalent prop or token. The component catalog's `publicClasses`
693
+ arrays support diagnostics, tooling, browser assertions, and package-owned
694
+ composition; they are not an application styling API. Application-owned CSS may
695
+ style new structure rendered by its own component, but it must not select a
696
+ nested Kerf or Web Awesome component. Add missing configuration to the owner.
697
+ Markup follows the same rule: write only an entry's `placeableClasses` (layout
698
+ utilities, `kui-app-root`, `kui-content-item` on a non-div carrier) onto your
699
+ own elements; any other public class recreates a component by class, which
700
+ `eslint-plugin-kerfjs` reports as `KUI-L103` with the component to render.
701
+
702
+ `StateBanner` has opinionated `neutral`, `info`, `pop`, `success`, `warning`,
703
+ and `danger` palettes. Override an individual banner with
287
704
  `--kui-state-banner-background`, `--kui-state-banner-border`,
288
705
  `--kui-state-banner-foreground`, `--kui-state-banner-detail`,
289
706
  `--kui-state-banner-action-background`, and
290
707
  `--kui-state-banner-action-hover-background`. To retheme one tone everywhere,
291
708
  override `--kui-state-banner-{tone}-{background|border|foreground}`. Other
292
709
  stateful components follow the same public-variable pattern, including
293
- `--kui-toolbar-control-*`, `--kui-segmented-*`, `--kui-app-tab-*`, and
710
+ `--kui-toolbar-control-*`, `--kui-segmented-*`, `--kui-tab-bar-item-*`, and
294
711
  `--kui-tab-bar-*`.
295
712
 
296
713
  `SegmentedControl` is a controlled exclusive-choice component. Use
@@ -307,8 +724,8 @@ standalone `filled`/`outlined` appearance with `shape="rounded"` or
307
724
  appearance="toolbar"
308
725
  shape="pill"
309
726
  choices={[
310
- { value: 'list', label: 'List' },
311
- { value: 'columns', label: 'Columns' },
727
+ { value: "list", label: "List" },
728
+ { value: "columns", label: "Columns" },
312
729
  ]}
313
730
  />
314
731
  ```
@@ -318,18 +735,97 @@ value through `data-segment-value`. Override an instance through
318
735
  `--kui-segmented-{background|border|foreground|hover-background}` and
319
736
  `--kui-segmented-selected-{background|foreground|border|shadow}`.
320
737
 
321
- `TokenSearchField` is a token-controlled contenteditable searchbox that keeps
738
+ `ChoiceChips` is the wrapping exclusive choice for a visible set too large for
739
+ one segmented track, such as a labeled color palette. Each choice is a separate
740
+ pill backed by a native radio, so the group is one Tab stop, arrow keys move
741
+ the selection, and the checked radio submits the form value under `name`. A
742
+ choice may lead with a `swatch` (a `CssColor`, or `'transparent'` for the
743
+ struck-through no-color dot) or a decorative `icon`:
744
+
745
+ ```tsx
746
+ <ChoiceChips
747
+ name="color"
748
+ label="Command color"
749
+ value={color.value}
750
+ action="select-command-color"
751
+ choices={[
752
+ { value: "transparent", label: "Transparent", swatch: "transparent" },
753
+ { value: "blue", label: "Blue", swatch: fillColor("#3b82f6") },
754
+ ]}
755
+ />
756
+ ```
757
+
758
+ Listen for `change` on the supplied action (for example
759
+ `delegateActions(root, "change", { "select-command-color": … })`), read the
760
+ radio's `value`, and re-render.
761
+
762
+ Set `multiple` when any number of the options may be on, such as label filters
763
+ or annotation intents. `value` is then a `readonly Value[]`, the pills are
764
+ native checkboxes in a `role="group"` (each a Tab stop that Space toggles), and
765
+ every checked value submits under `name`. Read the checked boxes by name in the
766
+ change handler. A multiple group takes no `required`. On dark inverse chrome,
767
+ place the chips in a dark appearance scope (`.wa-dark`) instead of restyling
768
+ them.
769
+
770
+ `MessageComposer` is the chat or prompt composer: a raised frame (the standard
771
+ border, large radius, and `shadow-l`) whose border turns brand while focus is
772
+ within. Its borderless message field grows with its content between `minRows`
773
+ (default 1) and `maxRows` (default 8) lines, then scrolls, above an action row
774
+ with an optional quiet `hint` and the trailing `actions`:
775
+
776
+ ```tsx
777
+ <MessageComposer
778
+ id="assistant-message"
779
+ name="message"
780
+ label="Message"
781
+ placeholder="Ask about this build"
782
+ hint="Answers use the latest nightly build."
783
+ trailing={<Button tone="brand" action="send-message">Send</Button>}
784
+ />
785
+ ```
786
+
787
+ The app reads and clears the textarea from its send action. For
788
+ Enter-to-send, set `submitOnEnter` and call `wireMessageComposers(root)` from
789
+ `@kerfjs/ui/wire-message-composers` once: Enter or Cmd/Ctrl+Enter clicks the first
790
+ trailing action, Shift+Enter inserts a newline, and an IME composition commit
791
+ or an empty message never sends. Put it in a `DialogSurface` with
792
+ `footerPresentation="floating"` (`slot="footer"`) to float it over a
793
+ transcript, and give the transcript `scrollClearance="block-end"` so it
794
+ scrolls beneath the composer while its last message still rests above it.
795
+ Add `headerPresentation="floating"` with a `fill` body and
796
+ `scrollClearance="both"` to let the transcript scroll beneath a translucent
797
+ title bar as well.
798
+
799
+ `SearchField` is a token-controlled contenteditable searchbox that keeps
322
800
  free text and ordered filter chips in one field. Its editable text stays
323
801
  DOM-owned between token changes so typing does not replace the caret. Tokens
324
802
  expose stable edit/remove actions and remain atomic during editing; the app owns
325
- parsing, suggestions, query execution, and state. Use `readTokenSearchField()`
803
+ parsing, suggestions, query execution, and state in manual mode. For automatic
804
+ handling, create a model with `createSearchFieldModel({ rules, evaluate })`,
805
+ pass it as the field's `model`, and register it under the field id in
806
+ `wireSearchFields(root, { models })`. Rules parse `name:value` expressions;
807
+ their optional `suggest` function supplies selectable completions. The model
808
+ commits valid expressions on whitespace or Enter, owns chips and clear/edit/
809
+ remove actions, and exposes `state`, `suggestions`, and the latest `result` as
810
+ signals. The field subscribes only to `model.structure`, which changes when a
811
+ token is committed or removed, the text becomes empty or non-empty, or the
812
+ editor revision changes, so typing plain text never re-runs the host render.
813
+ Keep it that way in the host: read `model.state.peek()` in render, and bind
814
+ `model.result` (or a `computed`) as a fine-grained signal hole rather than
815
+ reading `model.state.value`. Omit the model to retain full manual control. Use `readSearchField()`
326
816
  after browser input to recover text plus token offsets, and
327
- `placeTokenSearchCaret()` when restoring focus after a controlled update.
328
- Call `wireTokenSearchFields()` once at a stable root to make Enter submit through
817
+ `placeSearchFieldCaret()` when restoring focus after a controlled update.
818
+ Call `wireSearchFields()` once at a stable root to make Enter submit through
329
819
  `onSubmit` without inserting a contenteditable line break and to preserve focus
330
820
  plus the text-relative caret when keyboard deletion of a chip causes controlled
331
- rendering to replace the editor. Text still wraps visually when it reaches the
332
- field edge.
821
+ rendering to replace the editor. A select-all deletion is normalized to a truly
822
+ empty editor even when the browser leaves an atomic chip or line break behind;
823
+ replacement typing consumes that intent so a later Backspace/Delete remains an
824
+ ordinary character edit.
825
+ Managed deletion keeps a collapsible replacement editor open and focused before
826
+ the next keystroke; applications must persist both query and tokens from the DOM
827
+ read. Genuine outside focus and Escape still collapse an empty field.
828
+ Text still wraps visually when it reaches the field edge.
333
829
  Clear actions should empty the editor's `textContent` before clearing app state.
334
830
  The leading icon, first text line, clear action, and trailing slot share one
335
831
  fixed alignment row; when text wraps, those controls stay pinned to that first
@@ -341,67 +837,118 @@ and respect reduced-motion preferences. The field works standalone or inside a
341
837
  `ToolbarControlGroup`; the application owns the transient focused/open signal,
342
838
  focus transfer, and focusout policy. The catalog's Toolbar route demonstrates
343
839
  that composition at wide and narrow sizes.
344
- Override its surface through `--kui-token-search-{background|border}` and its
345
- chips through `--kui-token-search-token-{background|foreground}`. Override
346
- `--kui-token-search-line-size` only when the complete first-line geometry must
840
+ Override its surface through `--kui-search-field-{background|border}` and its
841
+ chips through `--kui-search-field-token-{background|foreground}`. Override
842
+ `--kui-search-field-line-size` only when the complete first-line geometry must
347
843
  change together.
348
844
 
349
- `TabBar` is controlled: pass ordered `AppTab` children, then wire its keyboard
845
+ `TabBar` is controlled: pass ordered `TabBarItem` children, then wire its keyboard
350
846
  and same-bar drag behavior with `wireTabBars(root, { onReorder })`. During a
351
847
  drag, the scroll strip automatically moves toward either edge with speed based
352
848
  on pointer proximity, exposing earlier or later drop targets. Apply the reported
353
849
  change with `reorderTabs()` or application-specific state logic. The application
354
850
  still owns selection, closing, routing, and persistence.
355
- Use `AppTab.rootAttributes` for domain `data-*` metadata and `closeIcon` for a
851
+ For a tab-local action immediately after the final tab plus a workspace action
852
+ at the opposite edge, set `trailingPlacement="adjacent"`, pass the local action
853
+ through `trailing`, and pass the workspace action through `end`. TabBar owns the
854
+ flex geometry: the tab strip shrinks and scrolls while both action regions stay
855
+ visible. Do not recreate that split with descendant CSS overrides.
856
+ Use `TabBarItem.rootAttributes` for domain `data-*` metadata and `closeIcon` for a
356
857
  decorative replacement glyph. The runtime rejects roles and case variants of
357
858
  the component- or wiring-owned action, tab identity, selection, drag, drop, and
358
859
  component markers. Keep the icon free of interactive descendants; the named
359
860
  close button retains all close interaction.
360
861
 
361
- `Select` uses Web Awesome but does not register anything by itself. Install the optional peer, import the shared theme if desired, and explicitly import the registration entry in the application:
862
+ `Select` and `PopupMenu` draw their own native controls and need no Web Awesome. Each renders inert markup until its registration entry is imported once in the application:
362
863
 
363
864
  ```ts
364
- import '@kerfjs/ui/webawesome.css';
365
- import '@kerfjs/ui/select/register';
865
+ import "@kerfjs/ui/select/register";
866
+ import "@kerfjs/ui/popup-menu/register";
366
867
  ```
367
868
 
368
- That boundary keeps Web Awesome and its custom-element side effects out of bundles that use unrelated components. Automated consumer-bundle tests enforce it.
369
- `Select` also owns the Kerf/Web Awesome reconciliation boundary: option icons
370
- keep stable slotted elements across rerenders, and `renderSelected` content is
371
- replaced when the controlled value changes. Consumers do not need to add
372
- `data-key` or `data-morph-skip` workarounds around choice icons.
373
-
374
- For application choices and panes, prefer Kerf's purpose-built primitives:
375
- `Select` over direct Web Awesome selection/dropdown composition,
376
- `SegmentedControl` over Button Group, `TabBar` or `SegmentedControl` over Web
377
- Awesome Tabs, `LucideIcon` over Web Awesome Icon, and `ResizableRegion` over
378
- Split Panel. `ResizableRegion` includes Hot Sheet 2's 1px separator and
869
+ `select/register` defines the form-associated `kui-select` root and wires every `Select` in the document; `popup-menu/register` wires every `PopupMenu` (opening, keyboard navigation, submenus, the `kui-menu-select` event, and focus return). That boundary keeps custom-element and document-listener side effects out of bundles that use unrelated components. Automated consumer-bundle tests enforce it, and also prove that no public entry except `@kerfjs/ui/webawesome.css` pulls in Web Awesome. 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.
870
+
871
+ `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, { placement? })` still opens a menu rendered without `anchor`); `closePopupMenu(menu)` closes it programmatically. See [component selection](docs/component-selection.md#popup-menu-migration) for examples.
872
+ Use `label` for a visible label or `ariaLabel` for a visually hidden name. A
873
+ nonempty visible label takes precedence when both are supplied. Kerf names the
874
+ native trigger without adding visible label spacing; this also works with
875
+ `renderSelected`. Use `hint`
876
+ for persistent supporting text below the control and `placeholderText` for the
877
+ empty value inside the closed control. Loading placeholders preserve the hint.
878
+
879
+ `Select` also owns its reconciliation boundary: option icons keep stable
880
+ elements across rerenders, and `renderSelected` content is replaced when the
881
+ controlled value changes. Consumers do not need to add
882
+ `data-key` or `data-morph-skip` workarounds around choice icons. Icon-bearing
883
+ options retain the standard icon-to-label gap. When a compact Select is wrapped
884
+ in a `ToolbarControlGroup`, use `focusRingOwner="group"`; the group paints the
885
+ focus ring with its configured pill or rounded geometry.
886
+
887
+ For application choices and panes, use Kerf's purpose-built primitives;
888
+ Web Awesome is an optional integration, and the
889
+ [migration guide](./docs/webawesome-migration.md) maps each Web Awesome
890
+ element a Kerf component replaces (`Select`, `PopupMenu`, `SegmentedControl`,
891
+ `TabBar`, `LucideIcon`, `ResizableRegion`, and the native form controls). `ResizableRegion` includes Hot Sheet 2's 1px separator and
379
892
  hover/focus grip. Its optional `handleIcon` replaces only the decorative glyph;
380
893
  the component and `wireResizableRegions()` retain separator semantics and
381
- pointer/keyboard behavior. Consider Web Awesome Popup when its anchored-positioning
382
- engine removes custom placement code; treat Tree, Animated Image, Comparison,
383
- Zoomable Frame, and the displaced alternatives above as exceptional rather
384
- than default patterns. The detailed rationale lives in the theme contract.
894
+ pointer/keyboard behavior. Typed policies cover separator visibility,
895
+ instant-track/composited-content collapse, popup-safe overflow,
896
+ inline/overlay/hidden responsive presentation, `responsiveFillAt` single-track
897
+ replacement, and safe-area restore controls;
898
+ the same policies are available on `Workbench` and `CollapsiblePanel`. In an
899
+ integration application, consider Web Awesome Popup when its anchored-positioning
900
+ engine removes custom placement code, and treat Tree, Animated Image,
901
+ Comparison, and Zoomable Frame as exceptional rather than default patterns.
902
+ The detailed rationale lives in the theme contract.
385
903
 
386
904
  ## Design and tool guidance
387
905
 
388
906
  - [Component selection and composition](./docs/component-selection.md)
389
907
  - [Design philosophy](./docs/design-philosophy.md)
390
908
  - [Apple HIG translation](./docs/apple-hig.md)
909
+ - [Writing interface copy](./docs/writing.md)
391
910
  - [Accessibility and keyboard contracts](./docs/accessibility.md)
392
911
  - [Component and integration contract](./docs/component-contract.md)
393
912
  - [Spacing and application layout](./docs/layout.md)
394
913
  - [Web Awesome theme contract](./docs/webawesome-theme.md)
914
+ - [Moving an application off Web Awesome](./docs/webawesome-migration.md)
395
915
  - [UX catalog contract](./docs/ux-demo.md)
396
916
  - [AI guide](./ai/skill.md)
397
917
 
398
- Run `npm run dev` from this directory for the category-grouped master/detail catalog. Every public visual component has a focused route; all 70 free Web Awesome 3.12 components have focused routes under the collapsible ecosystem section. Every detail visibly links its first-party demo source and existing guidance while showing the repository-relative paths; first-party components also link their implementation source, and Web Awesome entries label local guidance as Kerf integration guidance. One grouped `Related components` selector contains derived `Uses` / `Used by` navigation across both sets. Run `npm run check` for static/unit/bundle gates and `npm run test:e2e` for the real-browser suite.
918
+ Run `npm run dev` from this directory for the category-grouped master/detail catalog. Every public visual component has a focused route; all 73 free Web Awesome 3.14 components have focused routes under the collapsible Web Awesome Integration section. Every detail visibly links its first-party demo source and existing guidance while showing the repository-relative paths; first-party components also link their implementation source, and Web Awesome entries label local guidance as Kerf integration guidance. One grouped `Related components` selector contains derived `Uses` / `Used by` navigation across both sets. Run `npm run check` for static/unit/bundle gates and `npm run test:e2e` for the real-browser suite.
399
919
 
400
- Run `npm run format:css` after editing styles. The normal `npm run check` gate
401
- uses Prettier to reject unformatted CSS in `src/` and `ux-demo/`.
920
+ Run `npm run format` after editing source or structured content. The narrower
921
+ `npm run format:css` command remains available for style-only work. The normal
922
+ `npm run lint` and `npm run check` gates use Prettier to reject formatting drift.
402
923
 
403
924
  For dimensions that should scale with the root font size, author pixels with
404
925
  `remify()`: `gap: remify(17px)` builds to `gap: 1.0625rem` using a fixed 16px
405
926
  baseline. Keep intentional 1px borders in pixels and contextual `em` values
406
927
  explicit. `npm run build` emits standard CSS to `dist/styles`; `npm run dev`
407
928
  applies the same transform directly to source styles and hot-reloads edits.
929
+
930
+ 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).
931
+
932
+ `ToolbarText` and `ToolbarControlGroup` accept typed `hideBelow`/`showBelow`
933
+ lengths (for example `px(416)`). Wire `wireToolbarVisibility(root)` from
934
+ `@kerfjs/ui/wire-toolbar-visibility` and dispose on unmount. Thresholds use the
935
+ nearest Toolbar content-box width: hideBelow hides strictly below, showBelow
936
+ shows strictly below, with complementary behavior at equality. Percentages use
937
+ that content width; em and custom properties use the item's own context. Invalid,
938
+ negative, unresolved, or contradictory values leave the item visible under this
939
+ width policy. Keep primary actions visible and offer a complementary overflow
940
+ group. See `docs/component-contract.md` "Toolbar width visibility" for lifecycle
941
+ details.
942
+
943
+ ## License and third-party notices
944
+
945
+ `@kerfjs/ui` is MIT licensed (see `LICENSE`).
946
+
947
+ Web Awesome (`@awesome.me/webawesome`, copyright Fonticons, Inc., MIT) is an
948
+ optional peer dependency. This package does not copy or bundle Web Awesome
949
+ code: `@kerfjs/ui/webawesome.css` imports Web Awesome's stylesheet from the
950
+ application's own installation, and `@kerfjs/ui/webawesome` contains only type
951
+ declarations. An application that bundles Web Awesome components
952
+ redistributes them, so it should retain Web Awesome's MIT notice; Font Awesome
953
+ Free, whose icons Web Awesome embeds, asks that the attribution comments in
954
+ those icons stay intact.