@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
@@ -2,6 +2,16 @@
2
2
 
3
3
  `@kerfjs/ui` components are plain functions that return Kerf `SafeHtml`. They have no component instance or lifecycle.
4
4
 
5
+ ### Shared semantic tones
6
+
7
+ `SemanticTone` is the shared color-role type for `Badge`, `Chip`, `StateBanner`,
8
+ and semantic `ContentItem` appearances: `neutral`, `info`, `pop`, `success`,
9
+ `warning`, and `danger`. Import it as a type from `@kerfjs/ui`,
10
+ `@kerfjs/ui/badge`, `@kerfjs/ui/state-banner`, or `@kerfjs/ui/content-item`.
11
+ Use `info` for the role backed by the existing `--kui-color-brand-*` tokens.
12
+ Migrate Badge/Chip `tone="brand"` to `tone="info"`; `BadgeTone` and
13
+ `StateBannerTone` remain deprecated aliases of `SemanticTone`.
14
+
5
15
  ## Selection boundary
6
16
 
7
17
  Begin with the [need-first component matrix](./component-selection.md). Reuse a
@@ -18,16 +28,292 @@ package delivery paths, Web Awesome's installed manifest, AI guidance, and
18
28
  documentation links. Nuanced prose in this contract and the selection guide
19
29
  remains authored rather than generated.
20
30
 
31
+ ### Markdown component reference (AI entry point)
32
+
33
+ [`ai/components/README.md`](../ai/components/README.md) and one
34
+ `ai/components/<id>.md` page per catalog entry are the assistant-facing view of
35
+ both catalogs. An assistant reads the index, then only the pages it uses,
36
+ instead of loading the full JSON. Each page merges the entry's selection facts
37
+ (purpose, use/avoid, alternatives), delivery (JavaScript subpath, CSS,
38
+ registration, wiring helpers), a link into `public-api-signatures-v1.md` for
39
+ exact props, composition (parents, contexts, zones with their JSX prop and
40
+ cardinality, children), state and wiring ownership including wiring-owned
41
+ state attributes, geometry, accessibility obligations, public class and token
42
+ hooks framed as a styling boundary (components own their styles; configure
43
+ through props rather than overriding internals), and `KUI-C###` diagnostics
44
+ with their conditions. `scripts/sync-component-docs.mjs` renders them only from
45
+ `component-catalog.json` and `component-composition.json` (plus the signature
46
+ file's module headings for anchors), sorted and Prettier-formatted;
47
+ `check:catalog` rejects a stale, missing, or orphaned page. The JSON files stay
48
+ the canonical tool-facing sources.
49
+
50
+ ### Composition catalog
51
+
52
+ [`component-composition.json`](../ai/component-composition.json) adds a formal,
53
+ machine-evaluable composition layer beside `component-catalog.json` without
54
+ changing its selection and delivery contract; it is a generated companion, not
55
+ a newer version of that catalog. Every component-catalog entry projects once,
56
+ in order, under the stable qualified key `package:id`. Each composition entry
57
+ explicitly covers parents/contexts,
58
+ named zones and cardinality, optional explicit JSX prop bindings, child concepts, state ownership, required wiring,
59
+ responsive ownership, layout and geometry, accessibility obligations, public
60
+ CSS boundaries, diagnostics, and provenance. A wrapper entry may add
61
+ `rendersAs`: the cataloged roots it renders (any one of them, or nothing), so
62
+ composition checks treat its elements as each root rather than as an unknown
63
+ child. A placement with listed parent constraints produces one `KUI-L201`
64
+ diagnostic even when both the wrapper and a rendered root reject that parent.
65
+ When one catalog entry exports another JSX component with different placement,
66
+ `jsxExports` gives that export its own parent contract. The extra export does
67
+ not stand for the entry's root when a parent zone is checked.
68
+ An entry whose own geometry an owner already provides in some configuration
69
+ declares `insetFreeChildren`: `{ prop, equals }` conditions under which its
70
+ direct JSX children must bring no content-item inset (`Disclosure` with
71
+ `appearance="embedded"`). A child brings that inset when its
72
+ `layout.geometry` owns its margin, border, and padding (`self` on all three),
73
+ unless one of its own `insetFreeWhen` conditions holds (`Text` with `flush` or
74
+ `variant="span"`). `ui-composition` reports a child that statically brings the
75
+ inset as `KUI-L204` and names the child's inset-free form when it has one.
76
+ Generated `boundaries.rootClass` prefers the public `kui-<entry-id>` class when
77
+ present, so a sibling export's class cannot become the entry's root class.
78
+
79
+ `boundaries.placeableClasses` names the subset of `publicClasses` an
80
+ application may write onto its own elements (layout utilities, the document
81
+ root, item geometry on another carrier); absent means none, and every other
82
+ public class is the component's rendered anatomy. `boundaries.rootElement`
83
+ names the element a component renders around its own placeable classes
84
+ (`content-item`: `div`), so a plain element of that tag carrying them is still
85
+ the component recreated. `eslint-plugin-kerfjs`'s `ui-public-boundaries`
86
+ reports both as `KUI-L103` with the export to render — for `@kerfjs/ui` and for
87
+ every consumer catalog a `.kerf-ui-profile.json` declares, whatever the class
88
+ prefix. `create-kerf-component` packages declare the same fields in
89
+ `kerf.components.json`.
90
+
91
+ `descendantRootAttribute` optionally names a `data-*` attribute on a
92
+ cataloged `rootElement`. It anchors ownership of arbitrary unclassed child
93
+ element selectors below that exact root, as `LucideIcon` does with
94
+ `svg[data-lucide]`. Without the attribute in a selector, the analyzer uses
95
+ only cataloged `descendantElements` and composed JSX evidence.
96
+
97
+ An entry's optional `cssValueProps` makes CSS-adjacent prop grammar equally
98
+ machine-evaluable. Each path records the property grammar, finite shorthands,
99
+ canonical versus exceptional spacing choices, standalone and expression-only
100
+ helpers, raw/unsafe policy, and serialization examples. Nested paths are
101
+ dot-separated object members, each optionally suffixed with `[]` to visit
102
+ every array element: `items[].property` for a value inside each array item,
103
+ `iconTile.color` for a member of an object-valued prop. A member that is not a
104
+ literal object or array (a tone string such as `iconTile="brand"`, a variable)
105
+ is skipped rather than guessed. Consumer catalogs can publish the same facts;
106
+ ESLint, `kerf-ui-analyze`, and `kerf-ui-doctor` then issue the same stable
107
+ `KUI-L013`–`KUI-L017` feedback for application and third-party components.
108
+
109
+ `wiring.stateAttributes` lists the **wiring-owned state attributes**: the
110
+ `data-*` attributes a wiring helper writes at runtime, such as
111
+ `data-handle-inset` and `data-resizing`, which `wireResizableRegions` puts on a
112
+ `ResizableRegion`. Each entry names the attribute, the element that carries it
113
+ (`on`), the `helper` that writes it, and what it means. An application must not
114
+ render, remove, or treat these attributes as its own state; tools use the list
115
+ to tell them apart from app-authored attributes. They are declared once, on the
116
+ helper's wiring item in the component catalog, and the composition catalog
117
+ flattens them. `check:catalog`
118
+ reads each `wire*` helper's source and fails when its declarations differ from
119
+ the `data-*` attributes it actually writes. First-party entries always carry
120
+ the list, empty when their helpers write none; it is optional in extension
121
+ catalogs.
122
+
123
+ An extension catalog may add `wiring.sources` entries with `export` and
124
+ `source` for each application-owned helper. The source path is relative to its
125
+ package root; `ui-wiring` resolves helper imports through this file, including
126
+ relative re-export barrels. Every named export must also appear in
127
+ `wiring.helpers`.
128
+
129
+ When a component's required wiring is the application's own root-delegated
130
+ handlers rather than a named helper, list the `data-action` values it must
131
+ handle in `wiring.actions`. Required wiring names at least one helper or action.
132
+ `ui-wiring` accepts an action when a reachable module that imports `delegate`,
133
+ `delegateCapture`, or `delegateActions` (from `kerfjs` or `kerfjs/actions`)
134
+ names it as a string, selector, or table key; a cataloged component's own
135
+ source never counts, because it renders the attribute.
136
+
137
+ The selection catalog's `wiringProviders` lists public helpers that install
138
+ other wiring helpers. The `ui-wiring` rule accepts a provider call for each
139
+ helper it declares; `wireCatalog` provides `wireScrollDividers`.
140
+
141
+ The generator starts with permissive defaults. An `any` mode records that the
142
+ catalog has no defensible prohibition; it does not claim every composition is
143
+ recommended. Objective rules live in
144
+ `component-composition-rules.json` and may carry stable `KUI-C###`
145
+ diagnostics. A tool reports a diagnostic only after proving its exact `when`
146
+ condition. Subjective choice, product policy, and visual taste remain prose.
147
+
148
+ Kerf UI calls component content positions **named `SafeHtml` prop slots**.
149
+ Use `children` for one homogeneous primary region; use explicit named
150
+ `SafeHtml` props for semantic positions or replacement content such as
151
+ `header`, `footer`, `leading`, `trailing`, `icon`, and `action`. These are typed
152
+ function-component props, not native web-component `<slot>` elements and not a
153
+ generic `slots={{...}}` object. A composition zone declares `jsx.prop` only when tooling
154
+ can soundly bind that zone to one public JSX prop; `children` is spelled
155
+ explicitly. Zones without that binding remain guidance and are never guessed
156
+ from their ids. Static tools inspect only visible JSX structure and leave
157
+ dynamic `SafeHtml` expressions to runtime and accessibility evaluation.
158
+
159
+ ### Native named-slot assignment
160
+
161
+ Every public visual component with one stable conceptual root accepts an
162
+ explicit `slot?: string` prop and forwards it to that root on every render
163
+ branch. Use it when a Kerf component is a light-DOM child of a custom element,
164
+ for example `StateBanner({ title: 'Ready', slot: 'status' })`. Omitting the prop
165
+ omits the attribute.
166
+
167
+ This contract does not open a generic native-attribute bag: components still
168
+ accept only their documented props and narrow extension-attribute objects.
169
+ `ResizableRegion` and `CollapsiblePanel` are deliberately excluded because each
170
+ can return a region plus a sibling restore control, leaving no single root that
171
+ can truthfully own native slot assignment. Their single-root controls and all
172
+ alternate-root branches of supported components retain the contract.
173
+
174
+ Component-catalog consumers continue unchanged. Composition-aware consumers
175
+ read `component-catalog.json` for selection/delivery and
176
+ `component-composition.json` for composition. `npm run catalog:sync` projects every new component,
177
+ recipe, and supported Web Awesome entry, and the completeness gate prevents
178
+ silent omissions. Downstream catalogs use the composition extension schema and types,
179
+ retain their own package identity, and qualify cross-catalog references. See
180
+ the checked
181
+ [`component-composition-extension.json`](./examples/component-composition-extension.json)
182
+ application-owned example.
183
+
184
+ ### Compile-time contract boundary
185
+
186
+ The versioned
187
+ [`compile-time-contracts-v1.json`](../ai/compile-time-contracts-v1.json)
188
+ artifact maps stable `KUI-T###` ids to public imports, emitted symbols, and
189
+ catalog identities. Its positive/negative fixture compiles against both source
190
+ and a freshly packed package, so source declarations and shipped declarations
191
+ cannot silently diverge. See [Compile-time contracts](./type-contracts.md) for
192
+ the full audit, migration guidance, and the relationships deliberately left to
193
+ runtime/catalog checks because TypeScript cannot prove them.
194
+
195
+ ### Application UI profile
196
+
197
+ The component catalogs describe what packages provide; an application profile
198
+ describes which supported choices a project has approved. A workspace may
199
+ check in `.kerf-ui-profile.json` conforming to
200
+ [`application-ui-profile.schema.json`](../ai/application-ui-profile.schema.json).
201
+ Keep package-qualified catalog locations and recurring-concept preferences,
202
+ allowed color schemes and density, public semantic-token overrides,
203
+ layout/responsive conventions, application wiring entry paths, and narrow rule exceptions there. Product
204
+ records, copy, permissions, user preferences, and transport state do not belong
205
+ in this policy file.
206
+
207
+ Every catalog location names a composition artifact. `selection` is optional
208
+ for consumer packages whose generated metadata declares component-catalog
209
+ selection guidance not applicable; `@kerfjs/ui` retains its required
210
+ `component-catalog.json` selection artifact. This
211
+ lets a generated `component-composition.json` participate directly without a
212
+ fabricated compatibility file.
213
+
214
+ Discovery and precedence are deterministic:
215
+
216
+ 1. Load `application-ui-profile.defaults.json` from `@kerfjs/ui`.
217
+ 2. Load `.kerf-ui-profile.json` at the workspace root when present.
218
+ 3. Walk from the workspace root toward the target directory and load each
219
+ directory-local profile in parent-to-child order.
220
+
221
+ Later scalar and object-map values win. Catalogs merge by package; preferences
222
+ and token overrides merge by key; exceptions merge by stable id. Lists such as
223
+ allowed themes/densities replace the earlier list rather than accumulating.
224
+ `wiring.entries` similarly names workspace-relative application entry modules;
225
+ later profile layers replace the entry list. The `ui-wiring` ESLint rule checks
226
+ application-scoped helper calls and registration imports once at each entry
227
+ that reaches a rendering module, while a composition entry with
228
+ `wiring.scope: "module"` keeps a local obligation. See the
229
+ [`ui-wiring` rule](../../eslint-plugin/docs/rules/ui-wiring.md).
230
+ Every resolved field retains its source file. The shipped
231
+ `application-ui-profile.mjs` API implements discovery, merge, loading, and
232
+ validation and reports actionable originating file + JSON-path diagnostics for stale
233
+ catalogs, unknown component/rule/token references, preference conflicts, and
234
+ broad exceptions. Each raw layer is validated against the catalogs effective at
235
+ that exact precedence point before merge, so a broken parent catalog, stale
236
+ parent reference, invalid value, or unknown field cannot disappear merely
237
+ because a child profile replaces it. The shipped
238
+ `application-ui-profile-sync.cjs` projects the same merge and validation contract
239
+ for synchronous hosts such as ESLint rules; it deliberately performs no async
240
+ I/O.
241
+ See the
242
+ [`application-ui-profile.json`](./examples/application-ui-profile.json) example.
243
+
244
+ The package defaults avoid every `Discouraged` Web Awesome entry — each
245
+ `webawesome` catalog entry whose `recommendation` is not `supported` — under a concept whose `preferred` value is the
246
+ Kerf component that wraps or replaces it (`command-menu` → `PopupMenu`,
247
+ `value-selection` → `Select`, `application-tabs` → `TabBar`, `icon` →
248
+ `LucideIcon`, `resizable-pane` → `ResizableRegion`, `exclusive-choice` →
249
+ `SegmentedControl`, `hierarchy-navigation` → `List`, `embedded-media` →
250
+ `ContentItem`, `anchored-surface` → `AnchoredSurface`, `content-container` →
251
+ `ContentItem`, `inline-status` → `StateBanner`, `application-shell` → the
252
+ app-shell recipe, `modal-dialog` → `DialogSurface`). `eslint-plugin-kerfjs` `ui-preferences` (`KUI-L301`, also run by
253
+ `kerf-ui-doctor`) therefore reports a Discouraged element written directly as a
254
+ JSX tag (`<wa-dropdown>`) as well as through an imported component. A declared
255
+ component's own source file is exempt, because that wrapper is the sanctioned
256
+ owner of the element it renders. A unit test holds the avoid set and the
257
+ catalog's Discouraged set equal in both directions, so neither can drift. A
258
+ product that genuinely needs one of these elements records a narrow `KUI-L301`
259
+ profile exception for the file that renders it.
260
+
261
+ Catalog detail footers use one standard resource vocabulary and order. Build
262
+ them with `catalogResources()` from `@kerfjs/ui/catalog-resources`: `Demo Source`
263
+ first, optional `Component Source` and `Design Template`, then `Guidance`.
264
+ Third-party entries use the typed `integrationGuidance` kind, which renders
265
+ `Integration Guidance`, and omit `Component Source` when the implementation is
266
+ not owned by the catalog's project. Prefer these semantic kinds over local labels
267
+ such as “View source” or “Read UI guidance”; the helper makes that convention a
268
+ compile-time choice while still returning ordinary `CatalogResource[]` values.
269
+
21
270
  ## Ownership boundaries
22
271
 
23
- - Components own semantic markup, stable anatomy, documented variants, ARIA projection, and package CSS hooks.
272
+ ### Geometry ownership metadata
273
+
274
+ The canonical [`component-catalog.json`](../ai/component-catalog.json) records
275
+ the margin, border, and padding owner for every component and composition under
276
+ `geometry`. Read it before adding a wrapper or local spacing rule:
277
+
278
+ - `self` means the entry's public visual contract supplies that geometry.
279
+ - `parent` means the embedding layout must supply it.
280
+ - `child` means composed descendants supply it; the entry's outer shell does not.
281
+ - `none` means that dimension is intentionally absent from the standard contract.
282
+ - `conditional` means a variant, part, or configuration changes ownership; the
283
+ accompanying `notes` explain the boundary.
284
+
285
+ The values describe public ownership, including themed shadow parts, rather
286
+ than merely asking whether a CSS declaration appears on the host element.
287
+ Recipes are exempt because they arrange entries whose individual ownership is
288
+ already cataloged.
289
+
290
+ Downstream packages and applications should publish the same contract for their
291
+ reusable visual components. Use
292
+ [`component-catalog-extension.schema.json`](../ai/component-catalog-extension.schema.json)
293
+ and copy the structure of the checked
294
+ [`component-catalog-extension.json`](./examples/component-catalog-extension.json)
295
+ example. Keep app and Kerf entries as package-qualified inputs, then let people
296
+ or AI tools search their combined entries and compare `geometry` before adding
297
+ wrappers or insets. Do not add app-owned entries to Kerf's canonical catalog or
298
+ claim Kerf delivery paths for them.
299
+ Packages that keep a `kerf.components.json` can generate this file instead of
300
+ hand-maintaining it: set `kerfComponentCatalog.selectionOutput` and run
301
+ `kerf-component-catalog` (see `create-kerf-component`'s README).
302
+ Extension entries may add `uses` for direct composition dependencies and
303
+ repository-relative `source` and `demoSource` files. Resolve each dependency
304
+ against the combined Kerf and consumer catalogs; do not duplicate a Kerf id.
305
+ For Doctor's opt-in component ownership mode, add `styleSources` with the CSS
306
+ paths each entry owns, relative to the consumer package root.
307
+
308
+ - Components own semantic markup, stable anatomy, documented variants, ARIA projection, and package CSS hooks. They may render and style raw HTML or Web Awesome implementation elements they create and control. A nested Kerf or application component remains its own owner even when the parent renders it.
24
309
  - Applications own signals/stores, product copy, domain-state mapping, persistence, routing, permissions, and transport.
25
310
  - Actions are `data-action` strings. Wire them at a stable root with `delegate()` or `delegateActions()` and retain the disposer.
26
311
  - A reusable component never owns per-instance mutable module state.
27
- - Consumers style through `--kui-*` semantic tokens and public component classes. Foundation tokens provide opinionated neutral, brand/info, success, warning, and danger fill/border/foreground roles. Stateful components expose local override variables; prefer an equivalent prop or token before writing a selector.
312
+ - Consumers configure presentation through component props and documented `--kui-*` semantic tokens. Foundation tokens provide opinionated neutral, brand/info, non-status pop, success, warning, and danger fill/border/foreground roles. Application stylesheets must not select package component classes or descendants. If genuinely new structure needs CSS, encapsulate that structure and its stylesheet in an application-owned component; configure any nested Kerf components through their public APIs. A thin composition that only connects other components should normally have no stylesheet. It may style only raw elements or layout it owns, never its component children.
28
313
 
29
314
  `ListItem.rootAttributes`, `ListActionRow.rootAttributes`,
30
- `ListHeader.rootAttributes`, and `AppTab.rootAttributes` accept
315
+ `ListHeader.rootAttributes`, `TabBarItem.rootAttributes`,
316
+ `CatalogExample.rootAttributes`, and `CatalogExampleStack.rootAttributes` accept
31
317
  application-owned `data-*` metadata without
32
318
  adding product fields to the shared API. A `ListActionRow` trailing action uses
33
319
  `trailingActionAttributes`, and a `ListHeader` action/disclosure uses
@@ -36,11 +322,11 @@ the corresponding `aria-controls`/`aria-haspopup` relationship. These slots do
36
322
  not accept roles or component-owned action, selection, disclosure, accessible
37
323
  name, disabled, or icon fields. Extension objects are filtered at runtime,
38
324
  including case-insensitive rejection of protected `data-*` names, and the
39
- component writes its protected attributes after the accepted metadata. Typed,
325
+ component or helper writes its protected attributes after the accepted metadata. Typed,
40
326
  structurally widened, and JavaScript callers therefore cannot replace its
41
327
  contract.
42
328
 
43
- `AppTab.closeIcon` and `ResizableRegion.handleIcon` replace dormant decorative
329
+ `TabBarItem.closeIcon` and `ResizableRegion.handleIcon` replace dormant decorative
44
330
  glyph content only. They must not contain controls or interactive roles. The
45
331
  component continues to own the named close button or focusable separator, and
46
332
  `wireTabBars()` / `wireResizableRegions()` continue to own transient behavior
@@ -51,29 +337,166 @@ and disposal.
51
337
  contain controls. When a row needs an independently interactive trailing
52
338
  region, `ListActionRow` owns the noninteractive root and the two sibling native
53
339
  buttons; the application owns their delegated behavior and controlled state.
340
+ A `ListActionRow` with `trailingMenu` composes a real `PopupMenu` as that
341
+ sibling trailing control instead of a button; the menu styles its trigger in
342
+ the row's context from `popup-menu.css`, and the row never styles it.
54
343
  Both row components align a leading icon with the first label line when
55
344
  `multiline` allows the label to wrap; additional lines extend below that fixed
56
345
  visual anchor.
57
346
 
347
+ `ToolbarControlGroup.tileTone` selects `neutral`, `brand`, `success`, `warning`, or `danger` quiet fill, matching quiet border, and on-quiet foreground for a non-interactive icon tile. Compose a contained `single` group whose only child is a direct decorative LucideIcon (`aria-hidden="true"`). Omission preserves the normal group palette. The prop does not recolor interactive, mixed, multi-control, or borderless groups; keep real actions in controls with their existing focus/hover/pressed treatments.
348
+
349
+ `ToolbarControlGroup` `material="glass"` paints a group that floats over imagery or a clear (transparent) toolbar on the translucent chrome material (`--kui-chrome-material` with the blur/saturate `--kui-chrome-material-filter`), with a specular edge in place of the gray border and a soft shadow. Its controls take `--kui-color-text`, so they stay at AA over any content; a raised or outline selection paints an opaque surface pill. The fill turns opaque under reduced transparency, increased contrast, static effects (`update: slow` or `:root[data-kui-effects="static"]`), or without backdrop-filter support, and paints Canvas/CanvasText in forced colors. A `tone="dark"` glass group keeps its loud fill and gains the blur and edge; a borderless group has no surface and ignores the material. Keep the solid default on an opaque toolbar, and never add your own `backdrop-filter` or translucent background to a group.
350
+
351
+ `ListItem`, `ListItemLink`, and `ListActionRow` take `iconTile` to present their leading `icon` in a filled 32px rounded tile holding an 18px glyph, for settings or command rows that identify each entry by color. Pass a tone (`neutral`, `brand`, `success`, `warning`, or `danger`) for the same quiet fill, matching quiet border, and on-quiet foreground as `ToolbarControlGroup.tileTone`, or `{ color, foreground? }` for an application color: `color` is a `CssColor` (`uiColor()`, `colorVar()`, or `fillColor('#e5484d')`) and `foreground` a `CssForegroundColor`; without one, the glyph is black or white, whichever contrasts with the fill. The tile sits 6px clear of a standard 44px row (a compact row is at least 42px tall), moves the label to the tile's edge, and keeps its colors when the row is hovered or selected. Never wrap the icon in your own tile or resize the row's icon slot.
352
+
58
353
  ### Public CSS anatomy
59
354
 
60
355
  The `publicClasses` array on each entry in
61
- [`component-catalog.json`](../ai/component-catalog.json) is the exact supported
62
- anatomy boundary. A scoped selector may join documented public classes, such as
63
- `.workspace .kui-toolbar .kui-toolbar__trailing`, when composition-specific
64
- layout cannot be expressed by a prop or token. A class being public does not
65
- make copied component markup an invocation or transfer state and accessibility
66
- ownership to the application.
67
-
68
- Do not select a component's descendant by element name, id, attribute alone, or
69
- an unlisted implementation class. Selectors such as `.kui-state-banner span`,
70
- `.kui-list-item [data-state]`, and `.kui-list-item .local-label` depend on
71
- private structure. If no prop, token, or cataloged class expresses a recurring
72
- need, request a supported hook instead of inferring one from rendered markup.
73
-
74
- `DisclosureArrow` uses an 18px root-scaled visual by default. Override
75
- `--kui-disclosure-arrow-size` on the component or its containing scope when a
76
- consumer needs another size. Kerf `Select` uses a separate Web Awesome expand
356
+ [`component-catalog.json`](../ai/component-catalog.json) identifies stable
357
+ anatomy for diagnostics, tooling, browser assertions, and package-owned
358
+ composition. It is not an application customization API. Applications choose
359
+ documented props and tokens; package components may compose other components
360
+ only through those public contracts, never by styling a child's classes from a
361
+ parent stylesheet.
362
+
363
+ Inside the package, a component never styles another component or writes
364
+ another component's variables. When a child must adapt to a composing parent,
365
+ the child styles itself in that context from its own stylesheet: the parent's
366
+ class and state appear only in an ancestor compound, the styled compound is
367
+ the child's own class (or one of the child's own unclassed internals below
368
+ it), and the child reads context values the parent provides under the
369
+ parent's name. `ResizableRegion` widens its edge extent by the unsafe inset a
370
+ split `SplitView` provides, and a `Skeleton` derives its fill from a solid
371
+ `Badge`'s on-solid color, both in their own stylesheets; an `TabBarItem` rounds its
372
+ outer corners in a segmented `TabBar` and shares a fill-allocated strip from
373
+ `tab-bar-item.css`. An inspector `TabBar` uses the shared 12px rounded rectangle
374
+ radius on its strip; its segmented `TabBarItem` corners follow that strip's inner
375
+ curve, while an ordinary segmented strip keeps its pill ends and smaller
376
+ interior corners. A `PopupMenu` sizes
377
+ its trigger and applies a group's `menuInset` in its own stylesheet, and an
378
+ icon-only `Select` reads the control slot a `ToolbarControlGroup` provides
379
+ (`--_kui-toolbar-control-group-slot-*`). A parent may still style its own
380
+ elements keyed on a child's state, naming the child by class inside `:has()`
381
+ (`:has(> .kui-select[open])`, or `TabBar` insetting a segmented strip that
382
+ holds compact tabs), and it keeps styling raw native and raw Web
383
+ Awesome children no kerf component owns, excluding kerf children by class
384
+ (`wa-dropdown:not(.kui-popup-menu)`). `npm run check:css-ownership` enforces
385
+ this in every component stylesheet (a same-basename `.css` and `.tsx` pair
386
+ under `src/components/<family>/<component>/`), deriving the component names,
387
+ the Web Awesome tags each component renders, and its composed children from the
388
+ colocated component source:
389
+
390
+ - **Foreign classes.** Another component's class or `[data-component]` may
391
+ appear only in an ancestor compound or inside `:has()` / `:not()`; the
392
+ styled compound is the stylesheet's own class.
393
+ - **Owned Web Awesome tags.** Kerf components are named by class, never by a
394
+ `wa-*` tag they render. A tag another component renders — as the
395
+ subject, or as an ancestor whose internals the rule reaches — must be scoped
396
+ to that component by its class or excluded with `:not()`. A direct child
397
+ that cannot be the owner's internal
398
+ (`.kui-toolbar-control-group > wa-button`) needs no exclusion.
399
+ - **Variables.** A stylesheet writes only its own `--_kui-<self>-*` private
400
+ variables, and never overrides a public `--kui-<other>-*` token that another
401
+ component reads. Shared foundation tokens (`--kui-layout-*`,
402
+ `--kui-color-*`, …) are not any one component's. Context a parent provides
403
+ is named after the parent.
404
+ - **Context on any child.** Custom properties set on a subject that can be any
405
+ element (`.kui-x > *`, `> :not(…)`) also land on composed components' roots.
406
+ - **Hook classes.** A class the component places on a composed kerf child's
407
+ root (`<ToolbarText className="kui-nav-stack__title">`, a class NavStack once styled) may not be styled;
408
+ the child styles itself in that context instead.
409
+
410
+ The documented exceptions live with their reasons in
411
+ `scripts/lib/css-ownership.mjs`, and an exception that stops matching fails the
412
+ check, so the list only shrinks. The layout regions' inherited edge-inset
413
+ context (`--kui-edge-inset-*` handed to a sole Pane or layout child and cleared
414
+ for any other content, and a Toolbar clearing it for its zones) is the one
415
+ design exception; the others name the open fix ticket. The scroll-clearance
416
+ context (`--kui-scroll-clearance-block-*`) needs no exception: overlaying
417
+ chrome publishes it on its own element (a `DialogSurface` on its dialog body,
418
+ a `Pane` overlay header, through `wireScrollDividers`, on its own Pane root).
419
+ A scroll owner reads it only through its own `scrollClearance` prop, or, for an
420
+ overlay-header Pane's content, through its own `headerPresentation`.
421
+
422
+ The surface context needs no exception either. A component that changes the
423
+ background behind its children publishes, on its own painted element, the
424
+ foundation tokens `--kui-color-surface-current` (the opaque surface beneath:
425
+ a raised `DialogSurface`, popover dialog, `AnchoredSurface`, or `List`
426
+ `surface`, and a sunken Pane's opaque auto chrome, set it and clear both
427
+ layers), `--kui-color-surface-current-region` (a layout region's fill: a sunken
428
+ `Pane`, `Workbench` area, or `TabNavigator` scene, and a `Pane`'s or
429
+ `TabNavigator`'s app `background`), and `--kui-color-surface-current-tint` (a
430
+ content surface's fill: a `SunkenPanel`, a sunken `Disclosure`, a lowered
431
+ `FramedList` and its highlighted row, a quiet, hovered, pressed, or selected
432
+ `ContentItem`, a `TabBar` strip, and translucent glass chrome at rest — a
433
+ `Pane` overlay header, `NavStack` overlay chrome or bottom toolbar, a
434
+ `TabNavigator` overlay bar, and a dialog's floating header; clear chrome
435
+ paints nothing and keeps the inherited context). Interactive rows (`ListItem`,
436
+ `ListActionRow`, `SummaryRow`) are buttons or links themselves, so no control
437
+ nests on their hover or selection fill and they publish nothing. They are undeclared at `:root`
438
+ and a scoped `[data-kui-tint]` resets them. A control that must match what
439
+ lies behind it (the inset focus ring's inner line on `Button` and
440
+ `SplitButton`) layers tint over region over the opaque color, falling back to
441
+ `--kui-color-surface`. Custom properties cannot fold an inherited value into a
442
+ new one, so a content surface inside a sunken region composes exactly while a
443
+ third translucent level keeps only the innermost content tint. An application
444
+ surface that paints its own background sets the same tokens on its own root.
445
+
446
+ Applications and component packages built on the package follow the same
447
+ rules, and the downstream tools enforce them against the composition catalog
448
+ instead of package source: `kerf-ui-analyze` / `kerf-ui-doctor` report a rule
449
+ whose subject is another package's component (`KUI-L019`), another
450
+ component's private `--_*` variable (`KUI-L020`), an override of a token a
451
+ typed prop sets (`KUI-L021`), and a hook class on a component's root
452
+ (`KUI-L022`), plus borrowed public classes in source markup (`KUI-L023`);
453
+ `eslint-plugin-kerfjs`'s `ui-component-ownership` reports
454
+ `KUI-L020` / `KUI-L021` in script. Both share the selector parsing in
455
+ `analyzer/selectors.mjs` with `check:css-ownership`, and
456
+ `check:css-ownership` fails when a component renders a Web Awesome tag the
457
+ catalog does not list, so `KUI-L019` keeps covering every tag a kerf component
458
+ renders. Each finding names the configuration to use and routes a missing
459
+ prop to a component-gap report (see [the analyzer guide](./ui-analyzer.md#component-ownership-kui-l019kui-l023)).
460
+
461
+ The composition catalog additionally requires `boundaries.rootClass` to be
462
+ either one exact member of `publicClasses` or `null` when the entry has no
463
+ rendered class root. Runtime geometry tooling uses this explicit field; array
464
+ order never implies root ownership.
465
+
466
+ Do not select a component root or descendant by class, element name, id, or
467
+ attribute. Selectors such as `.workspace .kui-toolbar`,
468
+ `.kui-state-banner span`, and `.kui-list-item [data-state]` cross the ownership
469
+ boundary. If no prop or token expresses a recurring need, add the configuration
470
+ to the owning component instead of inferring it from rendered markup.
471
+
472
+ `Badge` owns the complete visual treatment for compact status, count, category,
473
+ and metadata labels. Configure its semantic `tone`, `appearance`, `shape`, and
474
+ `size`; do not recreate or override badge anatomy in an application or consuming
475
+ component. Use `label` when visible content is abbreviated and `ariaHidden` only
476
+ when a surrounding component already includes the same value in its accessible name.
477
+ Every tone's text and solid fill use that tone's `--kui-color-{tone}-on-fill`
478
+ token (`neutral` uses the text colors), the foreground tuned to clear WCAG AA
479
+ (4.5:1) on the tone's fills in light and dark mode.
480
+
481
+ `ListItem` renders its leading icon and nested SVG at a root-scaled 18px by
482
+ default while retaining the row's 44px minimum interactive target. Multiline
483
+ rows align that 18px visual with the first inherited text line. The row clips
484
+ descendant painting to its rounded root so labels, status, and dormant trailing
485
+ content cannot escape its visible boundary. Rows with descriptions grow enough
486
+ to keep their owned two-line label stack readable; use `multiline` when the
487
+ primary label should wrap rather than truncate. A single-line row ends its
488
+ primary label and description with an ellipsis before the trailing status
489
+ slot, even when the label is one long word; a `multiline` row wraps instead,
490
+ breaking a word wider than the label column (a long component or file name)
491
+ rather than letting it run under the trailing slot. A string label in a
492
+ `multiline` row gets line-break opportunities at its camelCase and acronym
493
+ boundaries, so `QuickTicketComposer` wraps as `QuickTicket` / `Composer`
494
+ rather than mid-word; breaking anywhere is only the last resort for a single
495
+ word that is still too wide. The text and accessible name are unchanged. `ListActionRow` labels
496
+ follow the same single-line and `multiline` rules before the trailing action.
497
+
498
+ `DisclosureArrow` uses an 18px root-scaled visual by default. Pass its typed
499
+ `size` prop when a consumer needs another size. Kerf `Select` uses a separate Web Awesome expand
77
500
  glyph contract, `--kui-disclosure-icon-scale: .5`; changing one contract does
78
501
  not implicitly change the other. Direction changes take the shortest rotation
79
502
  path; a 180-degree closed-to-open tie uses counterclockwise rotation.
@@ -82,53 +505,246 @@ In `ListHeader` toggle mode, omitting `actionIcon` composes the production
82
505
  `DisclosureArrow` and derives its visual direction from `expanded`. The app
83
506
  must update that controlled state and reveal or hide real content. Passing a
84
507
  custom `actionIcon` replaces the default rather than layering or rotating both.
85
- The root fills the available inline width after its standard margins. A
86
- separate action stays at the logical end in its 44px target while the visible
87
- glyph defaults to 18px through `--kui-list-header-action-icon-size`.
508
+ The root fills the available inline width after its standard margins by
509
+ default. Set `inline` when it must shrink-wrap beside surrounding content; that
510
+ presentation removes the root margin, border, and padding while retaining the
511
+ title and optional action's own control geometry. A separate action stays at
512
+ the logical end while the visible glyph defaults to 18px through
513
+ `--kui-list-header-action-icon-size`.
88
514
 
89
515
  `StateBanner` exposes instance-level `--kui-state-banner-background`,
90
516
  `--kui-state-banner-border`, `--kui-state-banner-foreground`,
91
- `--kui-state-banner-detail`, and action background variables. Its five built-in
517
+ `--kui-state-banner-detail` and action background variables. Its optional
518
+ badge composes `Badge` beside the title and follows the banner tone by default. The
519
+ title, badge, and detail flow as inline text: a wrapping title keeps the badge one item
520
+ gap after its last word, and a detail that does not fit whole beside them moves to its
521
+ own line and truncates at the full copy width (below 576px it always takes its own
522
+ line). The title and detail both use the tone's `--kui-color-{tone}-on-fill`
523
+ foreground (`info` uses `brand`) at full strength, clearing WCAG AA over the tone's fill in light and dark
524
+ mode; the detail reads as secondary through its smaller, regular-weight type, and
525
+ only the neutral tone quiets it, to `--kui-color-neutral-on-quiet`. Its five built-in
92
526
  tones can be rethemed globally with
93
527
  `--kui-state-banner-{tone}-{background|border|foreground}`. Toolbar control,
94
- segmented-control, app-tab, and tab-bar colors likewise use their public
528
+ segmented-control, tab-bar-item, and tab-bar colors likewise use their public
95
529
  `--kui-*-*` variables. `SegmentedControl` exposes surface, border, foreground,
96
530
  hover, and selected-state variables, so rounded, pill, and toolbar presentations
97
- remain opinionated but locally overridable.
531
+ remain opinionated but locally overridable. Its label color switches with the
532
+ theme without Web Awesome's native button color transition, so a dark filled
533
+ track never briefly pairs with an interpolated low-contrast label.
534
+
535
+ Inset hover and selection surfaces follow the outer control shape instead of
536
+ choosing an independent radius. `--kui-layout-highlight-inset` is the full
537
+ distance between those edges; the inner radius is the outer radius minus that
538
+ inset. `ToolbarControlGroup` publishes its derived radius to nested toolbar
539
+ `SegmentedControl` choices, keeping both direct buttons and exclusive-choice
540
+ highlights concentric when the group switches between pill and rounded shapes.
98
541
 
99
542
  `ResizableRegion` owns the Hot Sheet 2 split treatment: a persistent 1px
100
- separator with a compact grip that appears on hover or keyboard focus. Override
543
+ separator with a compact grip that appears on hover or keyboard focus. The grip
544
+ is drawn centered on the separator line even though the pointer target is wider
545
+ than the line, so the handle never reads as offset into a pane. Override
101
546
  `--kui-resizable-region-separator-color`,
102
547
  `--kui-resizable-region-handle-color`, or
103
548
  `--kui-resizable-region-handle-active-color` on a region when its containing
104
549
  surface needs a different contrast level.
105
550
 
106
- `@kerfjs/ui/layout.css` defines one structural model for sidebars, main areas,
107
- inspectors, and dialogs. `.kui-pane` is unpadded and contains an optional
108
- toolbar, one scrolling `.kui-pane__content`, and an optional footer.
551
+ `Pane` defines one structural model for sidebars, main areas, inspectors, and
552
+ dialogs. Its `.kui-pane` root is unpadded and contains an optional vertical
553
+ header, one scrolling vertical `.kui-pane__content`, and an optional footer.
554
+ Logical-edge separator lines are independently opt-in and default off.
555
+ `@kerfjs/ui/layout.css` retains the pane roles and supplies the related content
556
+ geometry classes.
557
+ `List` is the corresponding layout-only vertical stack: its children stretch by
558
+ default, while `gap`, `flex`, and `scrollable` opt into typed spacing,
559
+ flex growth, and vertical scroll ownership. `Row.flex` uses the same typed flex
560
+ participation contract on the horizontal counterpart. `dividerSides` accepts canonical
561
+ physical top/right/bottom/left combinations such as `tr` and `trbl`; the stack
562
+ adds no list semantics, margin, or padding of its own. Use a direct finite
563
+ spacing shorthand such as `gap="2xs"`, or pass a `CssLength` created by the
564
+ CSS-free `@kerfjs/ui/css-values` helpers: `space('m')`, `rem(0.25)`,
565
+ `lengthVar('--app-gap')`, or `calc(plus(rem(0.25), pct(10)))`. `plus` returns a
566
+ non-standalone `CssLengthExpression`; only `calc` turns it into a complete
567
+ length. `gap={{ column: 'none', row: 'm' }}` sets the two CSS gap axes
568
+ independently; each axis keeps the same typed spacing contract. `remify(18)` is
569
+ the runtime twin of source CSS's `remify(18px)`: it
570
+ takes a pixel count and returns a `CssLength` in rem (`1.125rem`) against the
571
+ same fixed 16px baseline. Raw CSS strings, and the source-only `remify(4px)`
572
+ string form, are not valid runtime props. The `CssLength` name intentionally includes percentages for UI dimension
573
+ props. Its opaque string brand improves authoring correctness; it is not a CSS
574
+ sanitizer or security boundary.
575
+ `Row.flex` and `List.flex` likewise accept their boolean default, finite keywords, or `CssFlex`
576
+ from `flex(grow, shrink, basis)`. `Skeleton` width/height use `CssSize`, radius
577
+ uses `CssLength`, and `SelectChoice.color` uses `CssForegroundColor` from
578
+ `uiColor()` with a foreground token such as `success-on-quiet`, or from
579
+ `foregroundColorVar()`. Fill tokens such as `success` are pale background tints
580
+ and do not type-check there. Never exchange these property grammars. List rows expose
581
+ `className`, public tokens, and semantic props instead of unrestricted `style`
582
+ declarations.
109
583
  `.kui-content` gives major children 24px vertical separation.
110
- `.kui-content-item` gives one child 8px inline margin, a real 1px border,
111
- 8px padding, and 12px corners; border and background may be transparent without
112
- changing geometry. `.kui-content-item--pill` selects the 22px radius.
584
+ `ContentItem` (`@kerfjs/ui/content-item`, rendering `.kui-content-item`) gives
585
+ one child 8px inline margin, a real 1px border, 8px padding, and 12px corners;
586
+ the border stays transparent unless `frame="framed"`, so framing never changes
587
+ geometry. `shape="pill"` selects the 22px radius. `appearance="surface"`
588
+ paints the base surface, while `neutral`, `info`, `pop`, `success`, `warning`,
589
+ and `danger` coordinate the same quiet background, border, and readable
590
+ foreground tokens as `StateBanner`. The default `transparent` appearance
591
+ preserves the surrounding surface.
592
+ `flush` removes block padding and borders while preserving inline geometry;
593
+ `title` passes through as the native tooltip. Interactive hover uses the normal
594
+ neutral fill so it remains visible on a lowered surface. For a card with
595
+ multiple actions, put sibling buttons in a static ContentItem (or use
596
+ `ListActionRow` for a simple two-action row).
597
+ For an interactive ContentItem, `wireContentItems` activates the card on Enter
598
+ or Space only when the key event originated from the card itself. A nested
599
+ native control, including one inside a custom element's shadow root, keeps its
600
+ own keyboard activation. The activation click carries the key's Shift, Ctrl,
601
+ and Cmd state (Space uses the state at press), so one delegated click handler
602
+ implements range and toggle selection for pointer and keyboard alike.
603
+ Alt-modified keys are left to the platform.
113
604
 
114
605
  `ToolbarControlGroup` is the unit of toolbar organization, even for dormant
115
606
  text. Each group reserves `calc(2px + remify(42px))`, or 44px, with 8px between
116
- groups and inside items. `ListHeader` similarly separates its dormant title and
117
- optional count or badge from its optional 44px action. Use the mutually
118
- exclusive `count`/`countLabel` pair for non-negative safe-integer section
119
- quantities; reserve `badge` for non-count `SafeHtml`. Do not concatenate counts
120
- into the section label. Do not add padding to pane shells,
607
+ groups and inside items. For an ordinary icon/action control inside a group, use
608
+ a plain `<button>` — the group styles `> button` fully, and it keeps the group
609
+ free of a Web Awesome dependency and shadow DOM. Use `ToolbarActionLink` when
610
+ the action must retain native anchor navigation; the group owns its geometry,
611
+ hover, and focus treatment. Set `overflow="scroll"` when a row of controls must
612
+ stay inside the available toolbar width. A disabled native button — `disabled`,
613
+ or `aria-disabled="true"` when it must stay focusable — keeps the group's
614
+ geometry, dims to half opacity, uses the `not-allowed` cursor, and paints
615
+ neither its own nor a lone group's hover surface; a disabled raw `wa-button`
616
+ likewise paints no hover surface.
617
+ Set `visibility="compact-only"` for a
618
+ group that replaces wider toolbar controls below the Toolbar's compact container
619
+ breakpoint; do not hide the group with an application class.
620
+ Use `sizing="grow"` on an expanded search group in a wrapping zone: it grows from
621
+ `growBasis` (19rem by default) into available row space, then takes a whole
622
+ row at 480px container width or less. The basis remains its intrinsic minimum
623
+ in a wider, non-stacked Toolbar, so sibling trailing groups can share the
624
+ row. The collapsed search stays icon-sized. The group owns the open and
625
+ close motion: its flex size animates while a collapsible `SearchField`
626
+ inside fills it on every frame, laid out at least basis-wide and clipped by the
627
+ group, so a query never wraps or leaves an empty band mid-transition. At 480px
628
+ container width or less, and under reduced motion, it opens in one frame.
629
+ A plain collapsible search group (no `sizing`) animates its own width the same
630
+ way: the `SearchField` follows the group on every frame and keeps its
631
+ query on one line until the opening ends, so it never shows an empty band or a
632
+ query wrapped in a narrow, still-opening field.
633
+ Use `sizing="fill"` for a group, including a non-search segmented control,
634
+ that spans its wrapping row. Set `visibility="hide-collapsed-tiny"` on a
635
+ collapsible group to omit its closed icon at 224px or less; expanded content
636
+ remains visible. These sizes use the enclosing Toolbar's container width.
637
+ In a stacked Toolbar, set `placement="end"` on a collapsed group that should
638
+ sit at the trailing edge of its flex row. An expanded search with
639
+ `sizing="fill"` takes a whole row and enters from the row above; reduced-motion
640
+ preferences remove that entrance animation.
641
+ Use `visibility="yield-to-expanded-sibling"` on trailing groups that should
642
+ leave a 480px-or-narrower toolbar while a sibling trailing group is expanded.
643
+ They return when it collapses or the toolbar widens; leading and center zones
644
+ remain visible. In a `responsive="trailing-priority"` Toolbar, use
645
+ `visibility="yield-to-priority-row"` instead: the group leaves exactly while
646
+ the expanded trailing control has its own row, from the same container query
647
+ as the row at the Toolbar's `responsiveAt` (832px for `narrow`, 704px for
648
+ `compact`, both inclusive). Do not restate that width with `hideBelow`, which
649
+ hides strictly below its threshold: at exactly 704px the row is active while
650
+ `hideBelow={rem(44)}` still shows the group, which then wraps onto a third
651
+ row.
652
+ A group's controls are plain `<button>`s (a standalone `Button` belongs outside a group); a popup menu is a `PopupMenu`, which renders its own
653
+ trigger. By default a group stays on one row: each icon sits beside its label,
654
+ and the enclosing `Toolbar`'s responsive policy relocates whole groups. Set
655
+ `overflow="wrap"` only for independent links that should move as whole actions
656
+ to another row within the group; use `overflow="scroll"` for a bounded one-row
657
+ action strip. A wrapping group centers in the toolbar band on one row and
658
+ starts at its top when it grows to multiple rows. For a compact mixed-content
659
+ group, set `nestedDropdown`; a
660
+ text-and-caret trigger grows to its intrinsic width while an icon-only trigger
661
+ can remain square. A compact icon `<button>` is a 32px circle, so a selected
662
+ compact segment never becomes an oval. An icon-only `Select` joins a group as
663
+ one more segment with its siblings' inset, radius, hover, and focus ring; only a
664
+ lone Select grows the group to its icon-and-caret pill.
665
+
666
+ Select menus use native viewport shifting with 10px gutters: default menus grow to content (up to 20rem), while `fitMenu` matches trigger width and long labels wrap. A listbox (like a PopupMenu menu) shifts only along its trigger's edge, never over the trigger: when neither side fits, it opens on the side with more room and scrolls inside its capped height, so a second press on the trigger still closes it. Keep popup sizing and position repairs out of consumer CSS.
667
+
668
+ For a rail view heading, use `Select presentation="title"`: its intrinsic
669
+ 36px borderless trigger has a bold large label flush with its leading edge and
670
+ a caret beside that label. Set `focusRingInset` when a NavStack or panel clips
671
+ outside painting; the Select keeps its focus outline 3px inside the trigger
672
+ and drops it while the listbox is open. Both settings belong to Select, not an
673
+ application `::part()` override. `Button` and `SplitButton` take the same
674
+ `focusRingInset` for a clipping ancestor: the ring moves inside the box (each
675
+ half's, for a SplitButton) with a line inside it in the color of the surface
676
+ it sits on (the surface context), so it stays visible on a loud fill of its
677
+ own hue without a halo on a sunken or tinted surface. Never re-offset their outline from
678
+ application CSS.
679
+
680
+ Set `menuInset` to configure the menu surface
681
+ without application `::part(menu)` CSS; the default `standard` keeps each menu's
682
+ own inset (8px for a raw `wa-dropdown`, the Select listbox's 4px for a
683
+ `PopupMenu`), while `compact` and `list-zero` apply to every nested menu. A
684
+ `PopupMenu` and a `Select` draw one popup: the same caret that turns to face the
685
+ open popup, fade-in surface, surface inset, row height and padding, current-row
686
+ fill, group titles, and scroll cue, all read from one private popup-choice
687
+ contract in `foundation.css`. A capped popup that scrolls (a long listbox, a
688
+ menu, or a phone submenu) shows a soft shadow along each edge with more
689
+ choices beyond it, so overlay scrollbars never leave it looking complete; the
690
+ cue is CSS-only, appears only toward hidden rows, and a popup whose choices
691
+ all fit draws none. Checkbox items reserve a check column, and so does every
692
+ plain command in a level (the top menu or one submenu) that holds a checkbox
693
+ item, through an `aria-hidden` icon-slot spacer, so check, icon, and label
694
+ columns align across the level. A level without a checkbox item keeps the
695
+ compact start: plain commands begin at the checkmark's leading edge, beside the
696
+ group title rather than the farther-in Select option label. Checked submenu
697
+ items keep their checkmark inside the submenu surface with the same check-column
698
+ advance as the top level. Compact mixed controls retain the standard
699
+ item padding, omit an internal separator, and let the raised selected item paint
700
+ over the outer border instead of shrinking to an inset highlight. The
701
+ PopupMenu trigger sizes to max-content, so icons, localized text, and the caret
702
+ determine the width without a fixed measurement.
703
+ At viewport widths of 480px or less, `PopupMenu` places an open submenu above
704
+ or below its parent menu, choosing the side with room and constraining the
705
+ submenu to the viewport. It never paints over the parent list. The reverse
706
+ horizontal arrow (ArrowLeft in LTR, ArrowRight in RTL) returns focus to its
707
+ parent item, Escape closes it, and choosing a child dispatches the normal
708
+ `data-action` and `kui-menu-select` events. Wider viewports retain the side cascade.
709
+ The enclosing `Toolbar` owns zone alignment and responsive topology: use
710
+ `centerAlign="stretch"` when the center group should consume its track, and
711
+ choose `responsive="stack"` with `responsiveAt="compact" | "narrow"`,
712
+ `responsive="wrap"` for a heading whose title must stay whole, or
713
+ `responsive="center-priority"` instead of selecting its zone classes from a
714
+ parent stylesheet. No policy clips an action: the trailing zone wraps whole
715
+ groups and its standalone primary `Button` onto another row; a stacked
716
+ center zone wraps its groups. The center zone never
717
+ compresses below its content width, so when the leading identity, center, and
718
+ trailing zones share a row that is too narrow, the leading title is what gives
719
+ way: it truncates with an ellipsis (as a platform toolbar's title does) instead
720
+ of the center group painting over it. When everything fits, the center group
721
+ keeps its place, centered in the track between the leading and trailing zones.
722
+ `ListHeader` similarly separates its dormant title and optional indicators
723
+ from its optional 44px action. Use the `count`/`countLabel` pair for a sole
724
+ non-negative safe-integer section quantity; it excludes `badge` and `status`.
725
+ `badge` and `status` may appear together, and either may be explicitly
726
+ `undefined` as app state changes. Give a contextual quantity in a badge a full
727
+ spoken phrase, such as "3 lines unpriced". Do not concatenate counts into the
728
+ section label. Set `width="content"` to shrink-wrap while retaining
729
+ normal header geometry; `inline` is the separate zero-outer-geometry mode. Do
730
+ not add padding to pane shells,
121
731
  double child-owned geometry with wrapper insets, or create competing scroll
122
732
  owners. The [layout contract](./layout.md) lists the public roles and tokens.
123
733
 
124
- `PanelHeader` is a plain top `Toolbar` used as a panel, dialog, or page heading;
125
- it overrides no Toolbar styles. The leading zone holds an optional icon (a normal
126
- bordered `ToolbarControlGroup` given a brand fill with a matching border) and the
127
- title as extra-large `ToolbarText`, and the app's `actions` go straight into the
128
- trailing zone (typically as a `ToolbarControlGroup`). The icon group is omitted
129
- when no icon is passed. The optional summary is a separate row aligned below the
130
- title, so it cannot pull the icon group out of vertical alignment with the
131
- title and action row.
734
+ Panel, dialog, and page headings are direct `Toolbar` compositions. The leading
735
+ zone holds an optional icon `ToolbarControlGroup` and a direct extra-large
736
+ `ToolbarText`; app actions belong in a trailing `ToolbarControlGroup`. Omit the
737
+ icon group when it has no content. A short supporting line is the title's
738
+ `ToolbarText` `description`: it renders quiet, single-line, truncating copy
739
+ under the title, starting at the title's text with or without an icon group,
740
+ and the title and description share the control band so the icon and actions
741
+ stay aligned. Longer supporting copy is app-owned content below the toolbar.
742
+ For an editable title, `ToolbarText action="edit-title"` renders a native button
743
+ directly in the leading zone. It keeps content width when there is room, shrinks
744
+ and ellipsizes beside a status chip when space is tight, and emits the delegated
745
+ action on click or keyboard activation. The application owns the editing control
746
+ and the swap between display and edit states. An actionable title is a button,
747
+ so place any required heading landmark on another element in the view.
132
748
 
133
749
  `ValueTable` composes typed `ValueTableRow` entries. A row owns its `dt`/`dd`
134
750
  semantics and may receive a leading `SafeHtml` icon. Every row keeps 8px of
@@ -139,6 +755,23 @@ padding + 24px icon + 8px gap) and 8px from the right edge for an icon-bearing
139
755
  row. Applications own the values, formatting, and whether an icon is decorative
140
756
  or meaningfully labeled.
141
757
 
758
+ A row follows the settings-style key/value priority: the value keeps its
759
+ content and the label gives way. The label and value are two content-sized
760
+ columns that share the row's free space equally, each stopping once its content
761
+ fits. A short value therefore stays whole on one line beside any label, and a
762
+ long label takes the remaining width, wrapping at its spaces and ending a word
763
+ wider than its column (a long component or file name) in an ellipsis before the
764
+ value rather than running under it. A short label keeps its width beside a
765
+ long value, which wraps; when both are long they split the row, so neither is
766
+ starved.
767
+
768
+ `ValueTable` defaults to the shared lowered surface and uses the normal text
769
+ color for normal-weight labels, including when nested in a
770
+ sunken `Pane`. Set `--kui-value-table-background` on an application-owned
771
+ ancestor to change that surface for its tables; the table reads the inherited
772
+ token and falls back to the lowered surface when it is absent. The application
773
+ is responsible for checking text contrast when it supplies a custom background.
774
+
142
775
  ## Imports and side effects
143
776
 
144
777
  Every component has an explicit JS and CSS subpath. In CSS-aware browser builds,
@@ -153,23 +786,53 @@ overrides load later in the cascade or set scoped `--kui-*` variables. JavaScrip
153
786
  modules are pure except the browser style wrappers and `@kerfjs/ui/select/register`,
154
787
  which registers exactly the Web Awesome elements used by `Select`. Eventful
155
788
  helpers such as `wireResizableRegions` and `wireTabBars` attach listeners only
156
- when called and return disposers. `wireTokenSearchFields` goes one step further:
789
+ when called and return disposers. `wireSearchFields` goes one step further:
157
790
  by default it also owns the collapsible field's transient expand/collapse/focus
158
791
  (activate to reveal and focus, Escape or empty blur to collapse), holding that
159
792
  state in a signal it exposes on the returned handle. An app reads that signal in
160
793
  render, hands in its own via `collapsible.signals`, drives it through
161
794
  `handle.open`/`handle.close`, or disables any individual behavior — so transient
162
- UI is consistent by default without every app reinventing it.
795
+ UI is consistent by default without every app reinventing it. A collapsed
796
+ field may reveal its editor after the current microtask; the helper keeps a
797
+ bounded render-frame focus handoff for that reveal and cancels it on disposal.
798
+ When a pointer press moves focus out of an empty field, the collapse waits until
799
+ the pressed control has received its click and every app handler has run, then
800
+ renders in a microtask in that same click task, so the click's render and the
801
+ collapse share one style recalculation and layout. A click that stops
802
+ propagating before the window, or a press without a click, collapses in the
803
+ next task instead.
804
+ `SearchField.trailingAction` supplies an icon, accessible `label`, delegated
805
+ `action`, and optional `id`; the field renders a 24px wide button that fills its
806
+ 34px line slot (32px in `toolbar-group`), including the hit target, disabled
807
+ state, hover, focus ring, and the clear button's radius in each presentation.
808
+ `expanded` renders `aria-expanded` and `pressed` renders `aria-pressed` (one or
809
+ the other, never both); either `true` state keeps the hover fill at full text
810
+ strength. `controls` and `haspopup` render `aria-controls` and `aria-haspopup`,
811
+ and `attributes` carries domain `data-*` metadata but never `data-action`.
812
+ Use `trailing` for passive content. The two props are mutually exclusive.
813
+ For a collapsible search in a stretched Toolbar center, `fill` lets the expanded
814
+ field and its enclosing search `ToolbarControlGroup` consume the available width;
815
+ the collapsed action retains its fixed icon width.
816
+ Grammar suggestion rows align their labels to one leading edge inside the
817
+ anchored popover, including when the labels have different lengths.
818
+
819
+ A public subpath that exposes several visual components is a folder-backed
820
+ surface. Put each component in its own source file and give each visual
821
+ component exactly one owned stylesheet alongside it. Keep the public
822
+ compatibility entrypoints implementation-free: the JavaScript/TypeScript
823
+ entrypoint only re-exports the folder modules, and the CSS entrypoint only
824
+ imports their owner stylesheets. A shared public name is not permission to put
825
+ several component implementations or visual contracts back into one file.
163
826
 
164
- `wireTokenSearchFields` is a deliberate exception, not the rule for `wire…`
165
- helpers. Its collapse behavior was *rich and error-prone* — reveal, focus
827
+ `wireSearchFields` is a deliberate exception, not the rule for `wire…`
828
+ helpers. Its collapse behavior was _rich and error-prone_ — reveal, focus
166
829
  transfer, Escape, empty-blur collapse, focus return — the kind of transient chrome
167
830
  apps kept reimplementing inconsistently, so the helper owns it. Everywhere else the
168
831
  app's state is **domain or persisted, not transient chrome, and stays app-owned**: a
169
- `NavStack`'s view stack is navigation history, a `TabBar`/`TabScaffold`'s selection
832
+ `NavStack`'s view stack is navigation history, a `TabBar`/`TabNavigator`'s selection
170
833
  and tab order are data, a `ResizableRegion`'s committed size and a
171
834
  `Workbench`/`SplitView` rail's `collapsed` flag are persisted layout preferences.
172
- Each helper already owns only the *ephemeral mechanics* around that state —
835
+ Each helper already owns only the _ephemeral mechanics_ around that state —
173
836
  `wireNavStack` the push/pop animation, `wireTabBars` the overflow autoscroll and
174
837
  drag preview, `wireResizableRegions` the live drag preview — and reports committed
175
838
  changes through callbacks. A `ListHeader` `toggle` disclosure's `expanded` is
@@ -178,6 +841,35 @@ render the section body, so a managed helper would remove no real complexity. Re
178
841
  for a managed default only when the transient behavior is substantial enough that
179
842
  hand-rolling it produces genuine, inconsistent variation.
180
843
 
844
+ TabBar itself owns the inline geometry around those mechanics. Its tab list is
845
+ the only shrinking, horizontally scrolling region; `leading`, `trailing`, and
846
+ `end` action regions remain fixed. Set `trailingPlacement="adjacent"` when the
847
+ trailing action belongs immediately after the final tab and use `end` for a
848
+ separate action pinned to the far edge. Applications own the action content,
849
+ but must not restyle TabBar descendants to recreate that allocation.
850
+ When a leading TabBarItem is pinned, the leading scroll divider appears at that
851
+ tab's trailing edge while peer tabs scroll beneath it, including in RTL.
852
+ With `snapTabs`, `wireTabBars` measures the pinned tab and settles peers at
853
+ whole-tab starts after scroll and selection changes, reserving end room so the
854
+ last peer can align there. That room is scrollable content after the last tab,
855
+ inside the strip, so it lengthens the scroll range without widening the strip:
856
+ the strip still shrinks to its allocation, and `trailing` and `end` stay inside
857
+ the bar. The room is still in-flow content, so it counts toward the strip's
858
+ content-based flex basis: when another zone also shrinks (a trailing zone
859
+ given `--kui-tab-bar-trailing-flex: 0 1 auto` with shrinkable content), the
860
+ strip keeps a proportionally larger share. The share converges within a few
861
+ frames and never pushes `trailing` or `end` out of the bar; keep the trailing
862
+ zone non-shrinking with `snapTabs` to avoid it. The application still owns
863
+ selection and tab order.
864
+ ResizeObserver notifications coalesce snap measurements into the next animation
865
+ frame, so inset writes cannot resize the observed strip during observer delivery.
866
+ `wireTabBars` watches the whole root it is given, but a mutation re-measures only
867
+ the bars it touched: a change inside a bar, a newly inserted bar, or a `dir`
868
+ change on an element above one. Content elsewhere in the root (terminal output,
869
+ list updates, streamed text) triggers no style or layout reads. A pinned strip
870
+ re-measures when its own size changes, so a layout change outside the bar still
871
+ reaches it.
872
+
181
873
  CSS, the generated wrappers that make it
182
874
  reachable, and the registration module are the package's only declared side
183
875
  effects.
@@ -186,14 +878,78 @@ A value-bearing component's `placeholder` prop is a first-class loading mode: th
186
878
  component renders its own real chrome (labels, icon and action affordances,
187
879
  container geometry) while replacing each **value** slot with a subtle, deliberately
188
880
  unanimated `Skeleton` block and disabling its own interactive controls
189
- (`aria-busy`, dropped `data-action`, disabled buttons). Sizes and shapes stay
881
+ (`aria-busy`, dropped `data-action`, disabled buttons). Only unknown values become
882
+ skeletons; nothing else may change. Sizes, shapes, typography, color, and opacity stay
190
883
  identical to the populated component, so a parent composes a faithful loading view —
191
884
  an inspector, a detail pane — from placeholder children without hand-rebuilding
192
885
  markup. The application still owns the loading lifecycle (when to pass `placeholder`)
193
- and which slots are unknown; the standalone `Skeleton` covers custom slots. It is a
886
+ and which slots are unknown; the standalone `Skeleton` covers custom slots. A
887
+ `Skeleton` is `inline-block` so it sits in a text line; pass `block` to lay it out
888
+ as `display: block` where it stands in for a box, such as an icon, so it takes no
889
+ line of its own and centers in its slot. It is a
194
890
  placeholder, not progress: use `LoadingSpinner` for known busy activity, and never
195
891
  animate the skeleton.
196
892
 
893
+ `LucideIcon` defaults to `appearance="outline"`. Pass
894
+ `appearance="solid"` for a filled state glyph such as a selected star or
895
+ triangle. The SVG uses `fill="currentColor"`, so fill follows the icon's text
896
+ color without styling its internal SVG from the application. Choose a Lucide
897
+ node whose geometry supports a solid fill; the prop does not replace an icon
898
+ node's own fill attributes.
899
+ The SVG is block-level by default. Pass `inline` when it belongs inside a
900
+ sentence or `Text`: the SVG becomes `inline-block`, keeps its inherited 1em
901
+ size unless `size` is supplied, and stays decorative unless `label` is set.
902
+ `LucideIcon` serializes an icon node's child markup once per node identity and
903
+ reuses it on every later render (Lucide nodes are module constants), so a list
904
+ that repeats a glyph per row does not re-escape its path data each render.
905
+ Treat a node as immutable once rendered; build a new node for new geometry.
906
+
907
+ `LoadingSpinner` accepts the same `size` steps as `LucideIcon`: `xs`, `s`, `m`,
908
+ `l`, `xl` (12/16/20/24/32px at a 16px root) or a positive finite pixel
909
+ number converted to rem. Omit `size` to keep its inherited 1em box. A supplied
910
+ size is exposed as `data-size`; callers configure the spinner through this prop
911
+ instead of sizing its SVG from outside.
912
+
913
+ A placeholder is loading, not unavailable, so it keeps the `disabled` attribute (its
914
+ controls stay inert and out of the keyboard order) but never shows disabled chrome.
915
+ `skeleton.css`, which every component that renders a skeleton loads, neutralizes generic
916
+ disabled styling under `[data-placeholder="true"]` — including Web Awesome's native
917
+ `button:disabled { opacity: 0.5; cursor: not-allowed }` when `webawesome.css` is
918
+ loaded — to full opacity and the non-interactive `default` cursor. That opacity reset
919
+ carries zero specificity, so a component's own opacity (a control hidden until
920
+ interaction) still wins, and each component excludes placeholders from its own
921
+ disabled tone and hover feedback — including hover reveals: a `ListActionRow` with
922
+ `trailingActionVisibility="interaction"` keeps its trailing action hidden when its
923
+ placeholder is hovered, as the resting live row does. The cursor is the one intentional difference from the
924
+ live state: a placeholder is not clickable, so it never advertises a pointer.
925
+
926
+ A control the author disabled is different: it will be unavailable once loaded, so its
927
+ placeholder keeps the live disabled tone. Each such control carries the component-owned
928
+ `data-kui-disabled="true"` marker whenever its own disabled prop is set, independent of
929
+ `placeholder` — `ListItem` and `ListActionRow` `disabled`, `trailingActionDisabled`,
930
+ a `SegmentedControl` choice's `disabled`, and `ListHeader` `actionDisabled` (on the
931
+ action or disclosure toggle). The placeholder reset skips the marker and components key
932
+ their disabled tone on it, so only the `placeholder`-only `disabled` attribute is
933
+ neutralized. That tone is each component's own, never Web Awesome's native
934
+ `button:disabled`, so an author-disabled control is dimmed with or without
935
+ `webawesome.css`. The marker is reserved: the extension-attribute channels
936
+ (`rootAttributes`, `trailingActionAttributes`, `triggerAttributes`) cannot set it. A
937
+ disabled placeholder still shows the `default` cursor, never `not-allowed`.
938
+ Chrome a component draws itself from a known prop stays live, even inside a slot that
939
+ also holds values. `ListItem`'s trailing slot has three inputs: the `busy` spinner is
940
+ component-owned chrome and stays live, while `status` text and author-supplied
941
+ `trailing` content are values and each become a skeleton (the component cannot tell an
942
+ author's chevron from a count, so all `trailing` content is treated as a value).
943
+ `ListActionRow`'s status line follows the same split: its `busy` spinner stays live and
944
+ only the `status` text becomes a skeleton.
945
+ `SegmentedControl` is the one placeholder without a skeleton: its choices are known
946
+ chrome and only the selection is unknown, so it renders every choice's live label or
947
+ icon at its live geometry, selects none, and neutralizes its own disabled chrome.
948
+ `tests/browser/placeholder-fixture.spec.ts` enforces the rule: it renders every
949
+ placeholder component live and as a placeholder from identical props and diffs each
950
+ element's geometry and computed chrome, excluding only the value slots, and checks that
951
+ every author-disabled control is dimmed in both renders.
952
+
197
953
  Package source styles express root-scaled geometry with `remify(<px>)`; the
198
954
  build converts it against the 16px authoring baseline and exposes only ordinary
199
955
  `rem` CSS. Literal pixels remain for intentional hairlines, and `em` remains
@@ -209,7 +965,25 @@ Kerf JSX declaration boundary for every catalog-supported `wa-*` tag.
209
965
  Consumers register only the individual Web Awesome modules they render and can
210
966
  override `--wa-*` values after the theme import. The shared `--wa-*` values feed
211
967
  both Web Awesome controls and Kerf's `--kui-*` foundation aliases, preventing a
212
- second application palette.
968
+ second application palette. Without the theme, every foundation color token,
969
+ every elevation token (`--kui-shadow-*`), and the focus-ring color fall back to
970
+ the same value the theme assigns, including its `light-dark()` pair, so
971
+ surfaces (including the dark `surface-raised`), links (`text-link` is the brand
972
+ on-quiet text color, not the brand fill), tone text, fills, and raised-surface
973
+ shadows keep their light and dark appearance and contrast either way. The
974
+ theme's elevation shadows are scheme-aware: light keeps the soft Hot Sheet 2
975
+ alphas, and dark raises them (`--wa-shadow-s` 14% to 50% black, `-m` 11% to
976
+ 40%, `-l` 9% to 32%) so a raised surface still separates from a near-black
977
+ page.
978
+ Kerf owns the light `brand`, `success`, and `warning` `on-quiet` values in that
979
+ theme layer: each keeps its hue but is dark enough to clear WCAG AA (4.5:1) on
980
+ the lowered page background (`--kui-color-surface-lowered`, approximately `#f2f2f7` over white), not
981
+ only on the white surface, so toned text reads on every background a page
982
+ paints. It likewise owns every tone's loud pair: each `on-loud` text color
983
+ clears AA on its `fill-loud` in both schemes. Light brand and danger keep white
984
+ text on a slightly deeper fill of the same hue (`#0075db`, `#eb0005`); success
985
+ keeps its bright green with dark text, as warning does; the dark-mode brand and
986
+ danger fills keep their color with dark text.
213
987
 
214
988
  `Select` owns its custom-element reconciliation seam. It gives each slotted
215
989
  option icon a stable key and leaves the upgraded Web Awesome-owned slot subtree
@@ -228,4 +1002,38 @@ Keep product adapters outside the package: connection-state maps, ticket empty-s
228
1002
 
229
1003
  ## Testing contract
230
1004
 
231
- Each behavior has focused unit coverage and a real-browser flow through the production-backed catalog. Consumer bundle tests enforce subpath CSS reachability, transitive component styles, root/SSR isolation, optional registration boundaries, and the CSS-only Web Awesome theme boundary. Visual evidence supplements—never replaces—keyboard, focus, state, and event assertions.
1005
+ Each behavior has focused unit coverage and a real-browser flow through the production-backed catalog. Consumer bundle tests enforce subpath CSS reachability, transitive component styles, root/SSR isolation, optional registration boundaries, and the CSS-only Web Awesome theme boundary. `npm run check:css-ownership` rejects application selectors into Kerf or Web Awesome components, a non-minimal catalog compatibility stylesheet, or a return of the shared recipe stylesheet. Visual evidence supplements—never replaces—keyboard, focus, state, and event assertions.
1006
+
1007
+ ### Toolbar width visibility
1008
+
1009
+ `ToolbarText` and `ToolbarControlGroup` accept typed `hideBelow` and
1010
+ `showBelow` CSS lengths. Call `wireToolbarVisibility(root)` from
1011
+ `@kerfjs/ui/wire-toolbar-visibility` after mounting, and call its disposer when
1012
+ the application unmounts. The nearest Toolbar's **content-box width**, excluding
1013
+ padding, borders, and safe-area insets, determines visibility. `hideBelow={px(416)}`
1014
+ hides strictly below 416px; `showBelow={px(416)}` shows strictly below 416px. At
1015
+ 416px the first is visible and the second hidden. Together they define the visible
1016
+ interval `[hideBelow, showBelow)`. Width rules intersect existing visibility and
1017
+ expanded-state rules; they never force a CSS-hidden group visible.
1018
+
1019
+ Use `px`, `rem`, `em`, `pct`, `space`, `lengthVar`, or `calc`/`plus` to construct
1020
+ lengths. Percentages resolve against that content box, `em` uses the child item's
1021
+ font size, and custom properties use its inherited and own token context. The
1022
+ helper follows resizes, theme/token/font changes, inserted items, nested toolbars,
1023
+ and relocated groups. Invalid, unresolved, negative, or contradictory thresholds
1024
+ leave the item visible under this width policy. Server-rendered content is visible
1025
+ until wiring runs; without browser observers, initial wiring and window resize
1026
+ still update it. Probe context and lengths are reconciled only when their CSSOM
1027
+ values change, so unrelated DOM observers can redraw without feeding an ongoing
1028
+ mutation loop. Probes are helper-owned imperative nodes preserved across Kerf
1029
+ rerenders, preventing repeated probe creation and resize/DOM observer churn.
1030
+ Invisible preserved state children keep actual CSS visibility stable while a render
1031
+ removes transient parent markers, so post-render geometry measurements cannot
1032
+ feed a show/hide render loop. These children never enter layout, focus or the
1033
+ accessible tree. Toolbar replacement or deliberate internal-node removal is
1034
+ still repaired. Dispose to
1035
+ remove measurement probes and restore prior markers.
1036
+
1037
+ Hidden controls leave layout and keyboard navigation. A hidden busy group also
1038
+ hides only its own adjacent busy status. Keep primary actions always available;
1039
+ show a complementary overflow group for secondary actions at narrow widths.