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

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 (1362) hide show
  1. package/README.md +708 -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 +9118 -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 +10444 -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 +97 -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 +120 -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 +6162 -446
  185. package/ai/skill.md +549 -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 +140 -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 +4 -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 +123 -0
  268. package/dist/button.js +7 -0
  269. package/dist/button.js.map +1 -0
  270. package/dist/catalog-resources.d.ts +51 -0
  271. package/dist/catalog-resources.js +22 -0
  272. package/dist/catalog-resources.js.map +1 -0
  273. package/dist/catalog.d.ts +135 -101
  274. package/dist/catalog.js +701 -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-6C6DLP3W.js +31 -0
  313. package/dist/chunk-6C6DLP3W.js.map +1 -0
  314. package/dist/chunk-6VVIW7VB.js +69 -0
  315. package/dist/chunk-6VVIW7VB.js.map +1 -0
  316. package/dist/chunk-7AK5I7U7.js +55 -0
  317. package/dist/chunk-7AK5I7U7.js.map +1 -0
  318. package/dist/chunk-7K6U6FCN.js +122 -0
  319. package/dist/chunk-7K6U6FCN.js.map +1 -0
  320. package/dist/chunk-AMIHGFLP.js +59 -0
  321. package/dist/chunk-AMIHGFLP.js.map +1 -0
  322. package/dist/chunk-AN5IWMTM.js +24 -0
  323. package/dist/chunk-AN5IWMTM.js.map +1 -0
  324. package/dist/chunk-ATGAJVZ6.js +268 -0
  325. package/dist/chunk-ATGAJVZ6.js.map +1 -0
  326. package/dist/chunk-AYPGXR2E.js +20 -0
  327. package/dist/chunk-AYPGXR2E.js.map +1 -0
  328. package/dist/chunk-B53PS2LE.js +34 -0
  329. package/dist/chunk-B53PS2LE.js.map +1 -0
  330. package/dist/chunk-BKUMG2KB.js +95 -0
  331. package/dist/chunk-BKUMG2KB.js.map +1 -0
  332. package/dist/chunk-C26Q6P4Q.js +76 -0
  333. package/dist/chunk-C26Q6P4Q.js.map +1 -0
  334. package/dist/chunk-CEJ5FK6G.js +288 -0
  335. package/dist/chunk-CEJ5FK6G.js.map +1 -0
  336. package/dist/chunk-CIAUILRR.js +222 -0
  337. package/dist/chunk-CIAUILRR.js.map +1 -0
  338. package/dist/chunk-CNM6ZWP2.js +38 -0
  339. package/dist/chunk-CNM6ZWP2.js.map +1 -0
  340. package/dist/chunk-CTQUDCY5.js +26 -0
  341. package/dist/chunk-CTQUDCY5.js.map +1 -0
  342. package/dist/chunk-CVD5IZGB.js +66 -0
  343. package/dist/chunk-CVD5IZGB.js.map +1 -0
  344. package/dist/chunk-D4MXSAMI.js +50 -0
  345. package/dist/chunk-D4MXSAMI.js.map +1 -0
  346. package/dist/chunk-D5RGM3XA.js +38 -0
  347. package/dist/chunk-D5RGM3XA.js.map +1 -0
  348. package/dist/chunk-DZJ4GBSP.js +59 -0
  349. package/dist/chunk-DZJ4GBSP.js.map +1 -0
  350. package/dist/chunk-EIET4QLK.js +51 -0
  351. package/dist/chunk-EIET4QLK.js.map +1 -0
  352. package/dist/chunk-EKHDLBRP.js +86 -0
  353. package/dist/chunk-EKHDLBRP.js.map +1 -0
  354. package/dist/chunk-ETFP7HAR.js +147 -0
  355. package/dist/chunk-ETFP7HAR.js.map +1 -0
  356. package/dist/chunk-EYDXFOSH.js +457 -0
  357. package/dist/chunk-EYDXFOSH.js.map +1 -0
  358. package/dist/chunk-G3J7JDP6.js +29 -0
  359. package/dist/chunk-G3J7JDP6.js.map +1 -0
  360. package/dist/chunk-GS2QD3N7.js +14 -0
  361. package/dist/chunk-GS2QD3N7.js.map +1 -0
  362. package/dist/chunk-GXSX6Q6O.js +42 -0
  363. package/dist/chunk-GXSX6Q6O.js.map +1 -0
  364. package/dist/chunk-HDXUHLTQ.js +90 -0
  365. package/dist/chunk-HDXUHLTQ.js.map +1 -0
  366. package/dist/chunk-HJXVVFBT.js +108 -0
  367. package/dist/chunk-HJXVVFBT.js.map +1 -0
  368. package/dist/chunk-HTERKONR.js +49 -0
  369. package/dist/chunk-HTERKONR.js.map +1 -0
  370. package/dist/chunk-HU5IHXCI.js +73 -0
  371. package/dist/chunk-HU5IHXCI.js.map +1 -0
  372. package/dist/chunk-IIQ2XIMU.js +197 -0
  373. package/dist/chunk-IIQ2XIMU.js.map +1 -0
  374. package/dist/chunk-IKS72C6P.js +53 -0
  375. package/dist/chunk-IKS72C6P.js.map +1 -0
  376. package/dist/chunk-IO27YTL3.js +73 -0
  377. package/dist/chunk-IO27YTL3.js.map +1 -0
  378. package/dist/chunk-IQSRHXZR.js +164 -0
  379. package/dist/chunk-IQSRHXZR.js.map +1 -0
  380. package/dist/chunk-IRC5N7FA.js +16 -0
  381. package/dist/chunk-IRC5N7FA.js.map +1 -0
  382. package/dist/chunk-ITENVZ6Q.js +24 -0
  383. package/dist/chunk-ITENVZ6Q.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-LMHN2TJL.js +167 -0
  401. package/dist/chunk-LMHN2TJL.js.map +1 -0
  402. package/dist/chunk-LTBVP6VN.js +59 -0
  403. package/dist/chunk-LTBVP6VN.js.map +1 -0
  404. package/dist/{chunk-YGN7OMLT.js → chunk-LZUUUHNH.js} +13 -6
  405. package/dist/chunk-LZUUUHNH.js.map +1 -0
  406. package/dist/chunk-MHMWQ7RB.js +19 -0
  407. package/dist/chunk-MHMWQ7RB.js.map +1 -0
  408. package/dist/chunk-MJ5RU6XT.js +173 -0
  409. package/dist/chunk-MJ5RU6XT.js.map +1 -0
  410. package/dist/chunk-MVKHSAKE.js +169 -0
  411. package/dist/chunk-MVKHSAKE.js.map +1 -0
  412. package/dist/chunk-NB6POCFH.js +103 -0
  413. package/dist/chunk-NB6POCFH.js.map +1 -0
  414. package/dist/chunk-NR6O74ST.js +169 -0
  415. package/dist/chunk-NR6O74ST.js.map +1 -0
  416. package/dist/chunk-OHPYT2BH.js +82 -0
  417. package/dist/chunk-OHPYT2BH.js.map +1 -0
  418. package/dist/chunk-OQP3PFKQ.js +341 -0
  419. package/dist/chunk-OQP3PFKQ.js.map +1 -0
  420. package/dist/chunk-OUCHU7JB.js +162 -0
  421. package/dist/chunk-OUCHU7JB.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-PS24PVR6.js +124 -0
  425. package/dist/chunk-PS24PVR6.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-SOBRGH7T.js +151 -0
  445. package/dist/chunk-SOBRGH7T.js.map +1 -0
  446. package/dist/chunk-T74YB76U.js +547 -0
  447. package/dist/chunk-T74YB76U.js.map +1 -0
  448. package/dist/chunk-TI2GV36S.js +90 -0
  449. package/dist/chunk-TI2GV36S.js.map +1 -0
  450. package/dist/{chunk-56RJXPHG.js → chunk-TKNVL53O.js} +7 -4
  451. package/dist/chunk-TKNVL53O.js.map +1 -0
  452. package/dist/chunk-TNJLNLVE.js +115 -0
  453. package/dist/chunk-TNJLNLVE.js.map +1 -0
  454. package/dist/chunk-TUID42UE.js +15 -0
  455. package/dist/chunk-TUID42UE.js.map +1 -0
  456. package/dist/chunk-UMNHJSIO.js +848 -0
  457. package/dist/chunk-UMNHJSIO.js.map +1 -0
  458. package/dist/chunk-VEME3D7K.js +298 -0
  459. package/dist/chunk-VEME3D7K.js.map +1 -0
  460. package/dist/chunk-VGECEXM6.js +213 -0
  461. package/dist/chunk-VGECEXM6.js.map +1 -0
  462. package/dist/chunk-WD6KABEU.js +200 -0
  463. package/dist/chunk-WD6KABEU.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-WVS6CUCT.js +48 -0
  467. package/dist/chunk-WVS6CUCT.js.map +1 -0
  468. package/dist/chunk-XRZSK2WC.js +159 -0
  469. package/dist/chunk-XRZSK2WC.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-YPAQFBMN.js +527 -0
  477. package/dist/chunk-YPAQFBMN.js.map +1 -0
  478. package/dist/chunk-ZCDRLN3B.js +138 -0
  479. package/dist/chunk-ZCDRLN3B.js.map +1 -0
  480. package/dist/chunk-ZKKO4MHC.js +25 -0
  481. package/dist/chunk-ZKKO4MHC.js.map +1 -0
  482. package/dist/chunk-ZN7KUMPY.js +48 -0
  483. package/dist/chunk-ZN7KUMPY.js.map +1 -0
  484. package/dist/chunk-ZNROKDSZ.js +54 -0
  485. package/dist/chunk-ZNROKDSZ.js.map +1 -0
  486. package/dist/chunk-ZX2QQJXD.js +249 -0
  487. package/dist/chunk-ZX2QQJXD.js.map +1 -0
  488. package/dist/collapsible-panel.d.ts +97 -17
  489. package/dist/collapsible-panel.js +134 -14
  490. package/dist/collapsible-panel.js.map +1 -1
  491. package/dist/color-field.d.ts +51 -0
  492. package/dist/color-field.js +92 -0
  493. package/dist/color-field.js.map +1 -0
  494. package/dist/color-picker.d.ts +113 -0
  495. package/dist/color-picker.js +8 -0
  496. package/dist/color-picker.js.map +1 -0
  497. package/dist/color-swatches.d.ts +56 -0
  498. package/dist/color-swatches.js +4 -0
  499. package/dist/color-swatches.js.map +1 -0
  500. package/dist/column-track.d.ts +41 -0
  501. package/dist/column-track.js +4 -0
  502. package/dist/column-track.js.map +1 -0
  503. package/dist/combobox.d.ts +40 -0
  504. package/dist/combobox.js +3 -0
  505. package/dist/combobox.js.map +1 -0
  506. package/dist/content-item.d.ts +170 -0
  507. package/dist/content-item.js +7 -0
  508. package/dist/content-item.js.map +1 -0
  509. package/dist/content-swap.d.ts +34 -0
  510. package/dist/content-swap.js +3 -0
  511. package/dist/content-swap.js.map +1 -0
  512. package/dist/corner-status.d.ts +36 -0
  513. package/dist/corner-status.js +3 -0
  514. package/dist/corner-status.js.map +1 -0
  515. package/dist/css-values.d.ts +127 -0
  516. package/dist/css-values.js +3 -0
  517. package/dist/css-values.js.map +1 -0
  518. package/dist/device-class.js +34 -6
  519. package/dist/device-class.js.map +1 -1
  520. package/dist/disclosure-arrow.d.ts +6 -1
  521. package/dist/disclosure-arrow.js +2 -1
  522. package/dist/disclosure.d.ts +66 -0
  523. package/dist/disclosure.js +51 -0
  524. package/dist/disclosure.js.map +1 -0
  525. package/dist/edge-activity-indicator.d.ts +28 -0
  526. package/dist/edge-activity-indicator.js +3 -0
  527. package/dist/edge-activity-indicator.js.map +1 -0
  528. package/dist/empty-state.d.ts +5 -2
  529. package/dist/empty-state.js +2 -1
  530. package/dist/extension-attributes-mu8MFUl0.d.ts +13 -0
  531. package/dist/file-picker.d.ts +54 -0
  532. package/dist/file-picker.js +3 -0
  533. package/dist/file-picker.js.map +1 -0
  534. package/dist/flex-alignment-4ms8ZbV8.d.ts +5 -0
  535. package/dist/floating-toolbar.d.ts +29 -6
  536. package/dist/floating-toolbar.js +1 -1
  537. package/dist/framed-list.d.ts +47 -0
  538. package/dist/framed-list.js +4 -0
  539. package/dist/framed-list.js.map +1 -0
  540. package/dist/grid.d.ts +58 -0
  541. package/dist/grid.js +6 -0
  542. package/dist/grid.js.map +1 -0
  543. package/dist/help-tags-register.d.ts +13 -0
  544. package/dist/help-tags-register.js +10 -0
  545. package/dist/help-tags-register.js.map +1 -0
  546. package/dist/index.d.ts +73 -17
  547. package/dist/index.js +85 -25
  548. package/dist/list-action-row.d.ts +69 -12
  549. package/dist/list-action-row.js +8 -1
  550. package/dist/list-detail-dialog.d.ts +124 -0
  551. package/dist/list-detail-dialog.js +168 -0
  552. package/dist/list-detail-dialog.js.map +1 -0
  553. package/dist/list-header.d.ts +72 -10
  554. package/dist/list-header.js +4 -1
  555. package/dist/list-icon-tile-B8dr97OW.d.ts +18 -0
  556. package/dist/list-inset-control.d.ts +22 -0
  557. package/dist/list-inset-control.js +3 -0
  558. package/dist/list-inset-control.js.map +1 -0
  559. package/dist/list-inset-text.d.ts +30 -0
  560. package/dist/list-inset-text.js +4 -0
  561. package/dist/list-inset-text.js.map +1 -0
  562. package/dist/list-item.d.ts +49 -5
  563. package/dist/list-item.js +4 -1
  564. package/dist/list.d.ts +149 -0
  565. package/dist/list.js +7 -0
  566. package/dist/list.js.map +1 -0
  567. package/dist/loading-spinner.d.ts +12 -2
  568. package/dist/loading-spinner.js +2 -1
  569. package/dist/lucide-icon.d.ts +23 -3
  570. package/dist/lucide-icon.js +2 -1
  571. package/dist/message-composer.d.ts +70 -0
  572. package/dist/message-composer.js +6 -0
  573. package/dist/message-composer.js.map +1 -0
  574. package/dist/nav-stack-CrZF95VO.d.ts +195 -0
  575. package/dist/nav-stack.d.ts +16 -38
  576. package/dist/nav-stack.js +15 -1
  577. package/dist/pane.d.ts +238 -0
  578. package/dist/pane.js +7 -0
  579. package/dist/pane.js.map +1 -0
  580. package/dist/panel-toolbar-vg6Ir5Dy.d.ts +77 -0
  581. package/dist/popup-menu-register.d.ts +11 -0
  582. package/dist/popup-menu-register.js +13 -0
  583. package/dist/popup-menu-register.js.map +1 -0
  584. package/dist/popup-menu.d.ts +153 -0
  585. package/dist/popup-menu.js +7 -0
  586. package/dist/popup-menu.js.map +1 -0
  587. package/dist/progress-bar.d.ts +52 -0
  588. package/dist/progress-bar.js +68 -0
  589. package/dist/progress-bar.js.map +1 -0
  590. package/dist/progress-ring.d.ts +44 -0
  591. package/dist/progress-ring.js +73 -0
  592. package/dist/progress-ring.js.map +1 -0
  593. package/dist/radio-group.d.ts +62 -0
  594. package/dist/radio-group.js +4 -0
  595. package/dist/radio-group.js.map +1 -0
  596. package/dist/resizable-region.d.ts +32 -3
  597. package/dist/resizable-region.js +1 -1
  598. package/dist/row.d.ts +53 -0
  599. package/dist/row.js +7 -0
  600. package/dist/row.js.map +1 -0
  601. package/dist/scroll-clearance-BikHljTc.d.ts +14 -0
  602. package/dist/search-field-CrGTN5sa.d.ts +208 -0
  603. package/dist/search-field-model.d.ts +3 -0
  604. package/dist/search-field-model.js +3 -0
  605. package/dist/search-field-model.js.map +1 -0
  606. package/dist/search-field.d.ts +3 -0
  607. package/dist/search-field.js +5 -0
  608. package/dist/search-field.js.map +1 -0
  609. package/dist/segmented-control.d.ts +14 -9
  610. package/dist/segmented-control.js +1 -2
  611. package/dist/select-register.d.ts +6 -3
  612. package/dist/select-register.js +402 -8
  613. package/dist/select-register.js.map +1 -1
  614. package/dist/select.d.ts +128 -9
  615. package/dist/select.js +6 -1
  616. package/dist/selection.d.ts +54 -0
  617. package/dist/selection.js +3 -0
  618. package/dist/selection.js.map +1 -0
  619. package/dist/semantic-content-BbzjvSu9.d.ts +14 -0
  620. package/dist/semantic-tone-CdW013KF.d.ts +4 -0
  621. package/dist/sides-BPSWde0A.d.ts +4 -0
  622. package/dist/skeleton.d.ts +14 -7
  623. package/dist/skeleton.js +2 -1
  624. package/dist/slider.d.ts +74 -0
  625. package/dist/slider.js +103 -0
  626. package/dist/slider.js.map +1 -0
  627. package/dist/spacer.d.ts +18 -0
  628. package/dist/spacer.js +4 -0
  629. package/dist/spacer.js.map +1 -0
  630. package/dist/split-button.d.ts +69 -0
  631. package/dist/split-button.js +7 -0
  632. package/dist/split-button.js.map +1 -0
  633. package/dist/split-view.d.ts +67 -6
  634. package/dist/split-view.js +15 -15
  635. package/dist/split-view.js.map +1 -1
  636. package/dist/state-banner.d.ts +41 -7
  637. package/dist/state-banner.js +4 -1
  638. package/dist/styles/anchored-surface.css +44 -0
  639. package/dist/styles/backdrop-image.css +258 -0
  640. package/dist/styles/badge.css +157 -0
  641. package/dist/styles/button.css +293 -0
  642. package/dist/styles/catalog/components/catalog-example-stack.css +14 -0
  643. package/dist/styles/catalog/components/catalog-example.css +250 -0
  644. package/dist/styles/catalog/components/catalog-stage.css +61 -0
  645. package/dist/styles/catalog/components/catalog.css +26 -0
  646. package/dist/styles/catalog.css +5 -522
  647. package/dist/styles/checkbox-group.css +63 -0
  648. package/dist/styles/checkbox.css +122 -0
  649. package/dist/styles/chip.css +234 -0
  650. package/dist/styles/choice-chips.css +205 -0
  651. package/dist/styles/collapsible-panel.css +450 -16
  652. package/dist/styles/color-field.css +125 -0
  653. package/dist/styles/color-picker.css +366 -0
  654. package/dist/styles/color-swatches.css +122 -0
  655. package/dist/styles/column-track.css +57 -0
  656. package/dist/styles/combobox.css +115 -0
  657. package/dist/styles/components/actions/button/button.css +293 -0
  658. package/dist/styles/components/actions/floating-toolbar/floating-toolbar.css +119 -0
  659. package/dist/styles/components/actions/popup-menu/popup-menu.css +498 -0
  660. package/dist/styles/components/actions/split-button/split-button.css +141 -0
  661. package/dist/styles/components/actions/toolbar/toolbar.css +483 -0
  662. package/dist/styles/components/actions/toolbar-control-group/toolbar-control-group.css +1188 -0
  663. package/dist/styles/components/actions/toolbar-text/toolbar-text.css +256 -0
  664. package/dist/styles/components/collections/framed-list/framed-list.css +53 -0
  665. package/dist/styles/components/collections/list/list.css +293 -0
  666. package/dist/styles/components/collections/list-action-row/list-action-row.css +466 -0
  667. package/dist/styles/components/collections/list-header/list-header.css +236 -0
  668. package/dist/styles/components/collections/list-inset-control/list-inset-control.css +30 -0
  669. package/dist/styles/components/collections/list-inset-text/list-inset-text.css +29 -0
  670. package/dist/styles/components/collections/list-item/list-item.css +461 -0
  671. package/dist/styles/components/collections/summary-row/summary-row.css +161 -0
  672. package/dist/styles/components/data-display/value-table/value-table.css +183 -0
  673. package/dist/styles/components/feedback/anchored-surface/anchored-surface.css +44 -0
  674. package/dist/styles/components/feedback/badge/badge.css +157 -0
  675. package/dist/styles/components/feedback/chip/chip.css +234 -0
  676. package/dist/styles/components/feedback/corner-status/corner-status.css +60 -0
  677. package/dist/styles/components/feedback/edge-activity-indicator/edge-activity-indicator.css +127 -0
  678. package/dist/styles/components/feedback/empty-state/empty-state.css +47 -0
  679. package/dist/styles/components/feedback/loading-spinner/loading-spinner.css +25 -0
  680. package/dist/styles/components/feedback/progress-bar/progress-bar.css +168 -0
  681. package/dist/styles/components/feedback/progress-ring/progress-ring.css +91 -0
  682. package/dist/styles/components/feedback/skeleton/skeleton.css +92 -0
  683. package/dist/styles/components/feedback/state-banner/state-banner.css +312 -0
  684. package/dist/styles/components/forms/checkbox/checkbox.css +122 -0
  685. package/dist/styles/components/forms/checkbox-group/checkbox-group.css +63 -0
  686. package/dist/styles/components/forms/choice-chips/choice-chips.css +205 -0
  687. package/dist/styles/components/forms/color-field/color-field.css +125 -0
  688. package/dist/styles/components/forms/color-picker/color-picker.css +366 -0
  689. package/dist/styles/components/forms/color-swatches/color-swatches.css +122 -0
  690. package/dist/styles/components/forms/combobox/combobox.css +115 -0
  691. package/dist/styles/components/forms/file-picker/file-picker.css +81 -0
  692. package/dist/styles/components/forms/message-composer/message-composer.css +84 -0
  693. package/dist/styles/components/forms/radio-group/radio-group.css +158 -0
  694. package/dist/styles/components/forms/search-field/search-field.css +441 -0
  695. package/dist/styles/components/forms/segmented-control/segmented-control.css +196 -0
  696. package/dist/styles/components/forms/select/select.css +580 -0
  697. package/dist/styles/components/forms/slider/slider.css +241 -0
  698. package/dist/styles/components/forms/switch/switch.css +132 -0
  699. package/dist/styles/components/forms/tag-field/tag-field.css +8 -0
  700. package/dist/styles/components/forms/text-field/text-field.css +193 -0
  701. package/dist/styles/components/layout/collapsible-panel/collapsible-panel.css +580 -0
  702. package/dist/styles/components/layout/column-track/column-track.css +57 -0
  703. package/dist/styles/components/layout/content-swap/content-swap.css +154 -0
  704. package/dist/styles/components/layout/grid/grid.css +88 -0
  705. package/dist/styles/components/layout/pane/pane.css +780 -0
  706. package/dist/styles/components/layout/resizable-region/resizable-region.css +546 -0
  707. package/dist/styles/components/layout/row/row.css +125 -0
  708. package/dist/styles/components/layout/spacer/spacer.css +11 -0
  709. package/dist/styles/components/layout/split-view/split-view.css +171 -0
  710. package/dist/styles/components/layout/workbench/workbench.css +1098 -0
  711. package/dist/styles/components/media/lucide-icon/lucide-icon.css +15 -0
  712. package/dist/styles/components/navigation/disclosure-arrow/disclosure-arrow.css +43 -0
  713. package/dist/styles/components/navigation/nav-stack/nav-stack.css +619 -0
  714. package/dist/styles/components/navigation/tab-bar/tab-bar.css +203 -0
  715. package/dist/styles/components/navigation/tab-bar-item/tab-bar-item.css +389 -0
  716. package/dist/styles/components/navigation/tab-navigator/tab-navigator.css +460 -0
  717. package/dist/styles/components/surfaces/backdrop-image/backdrop-image.css +258 -0
  718. package/dist/styles/components/surfaces/content-item/content-item.css +220 -0
  719. package/dist/styles/components/surfaces/disclosure/disclosure.css +136 -0
  720. package/dist/styles/components/surfaces/sunken-panel/sunken-panel.css +34 -0
  721. package/dist/styles/components/surfaces/surface-scaffold/surface-scaffold.css +752 -0
  722. package/dist/styles/components/typography/text/text.css +232 -0
  723. package/dist/styles/content-item.css +3 -0
  724. package/dist/styles/content-swap.css +154 -0
  725. package/dist/styles/corner-status.css +60 -0
  726. package/dist/styles/disclosure-arrow.css +20 -0
  727. package/dist/styles/disclosure.css +136 -0
  728. package/dist/styles/document.css +98 -0
  729. package/dist/styles/edge-activity-indicator.css +127 -0
  730. package/dist/styles/file-picker.css +81 -0
  731. package/dist/styles/floating-toolbar.css +87 -6
  732. package/dist/styles/foundation.css +491 -51
  733. package/dist/styles/framed-list.css +53 -0
  734. package/dist/styles/grid.css +88 -0
  735. package/dist/styles/layout.css +3 -41
  736. package/dist/styles/list-action-row.css +324 -18
  737. package/dist/styles/list-detail-dialog.css +11 -0
  738. package/dist/styles/list-header.css +135 -59
  739. package/dist/styles/list-inset-control.css +30 -0
  740. package/dist/styles/list-inset-text.css +29 -0
  741. package/dist/styles/list-item.css +371 -33
  742. package/dist/styles/list.css +293 -0
  743. package/dist/styles/loading-spinner.css +4 -0
  744. package/dist/styles/lucide-icon.css +9 -0
  745. package/dist/styles/message-composer.css +84 -0
  746. package/dist/styles/nav-stack.css +555 -47
  747. package/dist/styles/overlay-sheet.css +211 -0
  748. package/dist/styles/overlay-toast.css +149 -0
  749. package/dist/styles/overlay-tooltip.css +55 -0
  750. package/dist/styles/pane.css +780 -0
  751. package/dist/styles/popup-menu.css +498 -0
  752. package/dist/styles/progress-bar.css +168 -0
  753. package/dist/styles/progress-ring.css +91 -0
  754. package/dist/styles/radio-group.css +158 -0
  755. package/dist/styles/resizable-region.css +439 -4
  756. package/dist/styles/row.css +125 -0
  757. package/dist/styles/search-field.css +441 -0
  758. package/dist/styles/segmented-control.css +36 -9
  759. package/dist/styles/select.css +516 -74
  760. package/dist/styles/skeleton.css +64 -3
  761. package/dist/styles/slider.css +241 -0
  762. package/dist/styles/spacer.css +11 -0
  763. package/dist/styles/split-button.css +141 -0
  764. package/dist/styles/split-view.css +139 -3
  765. package/dist/styles/state-banner.css +164 -25
  766. package/dist/styles/styles.css +38 -3
  767. package/dist/styles/summary-row.css +161 -0
  768. package/dist/styles/sunken-panel.css +34 -0
  769. package/dist/styles/surface-scaffold.css +752 -0
  770. package/dist/styles/switch.css +132 -0
  771. package/dist/styles/tab-bar-item.css +389 -0
  772. package/dist/styles/tab-bar.css +167 -9
  773. package/dist/styles/tab-navigator.css +460 -0
  774. package/dist/styles/tag-field.css +8 -0
  775. package/dist/styles/text-field.css +193 -0
  776. package/dist/styles/text.css +232 -0
  777. package/dist/styles/toolbar-control-group.css +1000 -37
  778. package/dist/styles/toolbar-text.css +223 -7
  779. package/dist/styles/toolbar.css +433 -11
  780. package/dist/styles/value-table.css +115 -7
  781. package/dist/styles/webawesome.css +476 -20
  782. package/dist/styles/workbench-dialog.css +10 -0
  783. package/dist/styles/workbench.css +1011 -7
  784. package/dist/summary-row.d.ts +56 -0
  785. package/dist/summary-row.js +4 -0
  786. package/dist/summary-row.js.map +1 -0
  787. package/dist/sunken-panel.d.ts +38 -0
  788. package/dist/sunken-panel.js +4 -0
  789. package/dist/sunken-panel.js.map +1 -0
  790. package/dist/surface-scaffold-register.d.ts +12 -0
  791. package/dist/surface-scaffold-register.js +10 -0
  792. package/dist/surface-scaffold-register.js.map +1 -0
  793. package/dist/surface-scaffold.d.ts +284 -0
  794. package/dist/surface-scaffold.js +8 -0
  795. package/dist/surface-scaffold.js.map +1 -0
  796. package/dist/surface-tint-DQgYCaP9.d.ts +25 -0
  797. package/dist/switch.d.ts +38 -0
  798. package/dist/switch.js +4 -0
  799. package/dist/switch.js.map +1 -0
  800. package/dist/tab-bar-item.d.ts +65 -0
  801. package/dist/tab-bar-item.js +6 -0
  802. package/dist/tab-bar-item.js.map +1 -0
  803. package/dist/tab-bar.d.ts +33 -7
  804. package/dist/tab-bar.js +1 -1
  805. package/dist/tab-navigator.d.ts +155 -0
  806. package/dist/tab-navigator.js +132 -0
  807. package/dist/tab-navigator.js.map +1 -0
  808. package/dist/tag-field.d.ts +52 -0
  809. package/dist/tag-field.js +6 -0
  810. package/dist/tag-field.js.map +1 -0
  811. package/dist/text-field.d.ts +91 -0
  812. package/dist/text-field.js +6 -0
  813. package/dist/text-field.js.map +1 -0
  814. package/dist/text.d.ts +103 -0
  815. package/dist/text.js +3 -0
  816. package/dist/text.js.map +1 -0
  817. package/dist/toolbar-control-group.d.ts +112 -8
  818. package/dist/toolbar-control-group.js +3 -1
  819. package/dist/toolbar-text.d.ts +63 -9
  820. package/dist/toolbar-text.js +2 -1
  821. package/dist/toolbar.d.ts +78 -7
  822. package/dist/toolbar.js +1 -1
  823. package/dist/types-DmHWkSd6.d.ts +207 -0
  824. package/dist/value-table.d.ts +30 -4
  825. package/dist/value-table.js +2 -1
  826. package/dist/webawesome.d.ts +11 -1
  827. package/dist/wire-catalog.d.ts +118 -5
  828. package/dist/wire-catalog.js +314 -14
  829. package/dist/wire-catalog.js.map +1 -1
  830. package/dist/wire-checkboxes.d.ts +10 -0
  831. package/dist/wire-checkboxes.js +3 -0
  832. package/dist/{wire-token-search-fields.js.map → wire-checkboxes.js.map} +1 -1
  833. package/dist/wire-choice-chips.d.ts +17 -0
  834. package/dist/wire-choice-chips.js +4 -0
  835. package/dist/wire-choice-chips.js.map +1 -0
  836. package/dist/wire-color-fields.d.ts +33 -0
  837. package/dist/wire-color-fields.js +82 -0
  838. package/dist/wire-color-fields.js.map +1 -0
  839. package/dist/wire-color-pickers.d.ts +35 -0
  840. package/dist/wire-color-pickers.js +9 -0
  841. package/dist/wire-color-pickers.js.map +1 -0
  842. package/dist/wire-comboboxes.d.ts +26 -0
  843. package/dist/wire-comboboxes.js +4 -0
  844. package/dist/wire-comboboxes.js.map +1 -0
  845. package/dist/wire-content-items.d.ts +15 -0
  846. package/dist/wire-content-items.js +270 -0
  847. package/dist/wire-content-items.js.map +1 -0
  848. package/dist/wire-corner-status.d.ts +11 -0
  849. package/dist/wire-corner-status.js +3 -0
  850. package/dist/wire-corner-status.js.map +1 -0
  851. package/dist/wire-file-pickers.d.ts +27 -0
  852. package/dist/wire-file-pickers.js +3 -0
  853. package/dist/wire-file-pickers.js.map +1 -0
  854. package/dist/wire-list-focus-scroll.d.ts +16 -0
  855. package/dist/wire-list-focus-scroll.js +3 -0
  856. package/dist/wire-list-focus-scroll.js.map +1 -0
  857. package/dist/wire-list-reorder.d.ts +41 -0
  858. package/dist/wire-list-reorder.js +3 -0
  859. package/dist/wire-list-reorder.js.map +1 -0
  860. package/dist/wire-message-composers.d.ts +17 -0
  861. package/dist/wire-message-composers.js +3 -0
  862. package/dist/wire-message-composers.js.map +1 -0
  863. package/dist/wire-nav-stack.d.ts +4 -1
  864. package/dist/wire-nav-stack.js +352 -15
  865. package/dist/wire-nav-stack.js.map +1 -1
  866. package/dist/wire-overlay-sheets.d.ts +20 -0
  867. package/dist/wire-overlay-sheets.js +4 -0
  868. package/dist/wire-overlay-sheets.js.map +1 -0
  869. package/dist/wire-pane-chrome.d.ts +21 -0
  870. package/dist/wire-pane-chrome.js +67 -0
  871. package/dist/wire-pane-chrome.js.map +1 -0
  872. package/dist/wire-resizable-regions.d.ts +2 -1
  873. package/dist/wire-resizable-regions.js +2 -1
  874. package/dist/wire-scroll-dividers.d.ts +87 -0
  875. package/dist/wire-scroll-dividers.js +3 -0
  876. package/dist/wire-scroll-dividers.js.map +1 -0
  877. package/dist/{wire-token-search-fields.d.ts → wire-search-fields.d.ts} +34 -25
  878. package/dist/wire-search-fields.js +6 -0
  879. package/dist/wire-search-fields.js.map +1 -0
  880. package/dist/wire-sidebar.d.ts +24 -4
  881. package/dist/wire-sidebar.js +159 -45
  882. package/dist/wire-sidebar.js.map +1 -1
  883. package/dist/wire-sliders.d.ts +12 -0
  884. package/dist/wire-sliders.js +31 -0
  885. package/dist/wire-sliders.js.map +1 -0
  886. package/dist/wire-tab-bars.d.ts +6 -2
  887. package/dist/wire-tab-bars.js +1 -1
  888. package/dist/wire-tab-navigator.d.ts +13 -0
  889. package/dist/wire-tab-navigator.js +153 -0
  890. package/dist/wire-tab-navigator.js.map +1 -0
  891. package/dist/wire-tag-fields.d.ts +41 -0
  892. package/dist/wire-tag-fields.js +258 -0
  893. package/dist/wire-tag-fields.js.map +1 -0
  894. package/dist/wire-text-fields.d.ts +12 -0
  895. package/dist/wire-text-fields.js +3 -0
  896. package/dist/wire-text-fields.js.map +1 -0
  897. package/dist/wire-toolbar-visibility.d.ts +13 -0
  898. package/dist/wire-toolbar-visibility.js +3 -0
  899. package/dist/wire-toolbar-visibility.js.map +1 -0
  900. package/dist/wire-workbench.d.ts +116 -0
  901. package/dist/wire-workbench.js +6 -0
  902. package/dist/wire-workbench.js.map +1 -0
  903. package/dist/workbench-dialog.d.ts +107 -0
  904. package/dist/workbench-dialog.js +128 -0
  905. package/dist/workbench-dialog.js.map +1 -0
  906. package/dist/workbench.d.ts +259 -10
  907. package/dist/workbench.js +22 -15
  908. package/dist/workbench.js.map +1 -1
  909. package/docs/accessibility.md +835 -41
  910. package/docs/anchored-surface.md +107 -0
  911. package/docs/app-layouts.md +200 -10
  912. package/docs/apple-hig.md +2 -0
  913. package/docs/backdrop-image.md +132 -0
  914. package/docs/button.md +15 -0
  915. package/docs/catalog.md +599 -63
  916. package/docs/collapsible-panel.md +308 -25
  917. package/docs/color-field.md +65 -0
  918. package/docs/color-picker.md +102 -0
  919. package/docs/color-swatches.md +46 -0
  920. package/docs/component-contract.md +872 -57
  921. package/docs/component-integration.md +75 -0
  922. package/docs/component-selection.md +1124 -108
  923. package/docs/design/templates/button/emphasis-dark.svg +1 -0
  924. package/docs/design/templates/button/emphasis.svg +1 -0
  925. package/docs/design/templates/button/full-width-dark.svg +1 -0
  926. package/docs/design/templates/button/full-width.svg +1 -0
  927. package/docs/design/templates/button/icons-dark.svg +1 -0
  928. package/docs/design/templates/button/icons.svg +1 -0
  929. package/docs/design/templates/button/pill-dark.svg +1 -0
  930. package/docs/design/templates/button/pill.svg +1 -0
  931. package/docs/design/templates/button/states-dark.svg +1 -0
  932. package/docs/design/templates/button/states.svg +1 -0
  933. package/docs/design/templates/button/toggles-dark.svg +1 -0
  934. package/docs/design/templates/button/toggles.svg +1 -0
  935. package/docs/design/templates/button/tones-dark.svg +1 -0
  936. package/docs/design/templates/button/tones.svg +1 -0
  937. package/docs/design/templates/button-dark.svg +1 -0
  938. package/docs/design/templates/button.svg +1 -0
  939. package/docs/design/templates/checkbox/compact-dark.svg +1 -0
  940. package/docs/design/templates/checkbox/compact.svg +1 -0
  941. package/docs/design/templates/checkbox/error-dark.svg +1 -0
  942. package/docs/design/templates/checkbox/error.svg +1 -0
  943. package/docs/design/templates/checkbox/mixed-dark.svg +1 -0
  944. package/docs/design/templates/checkbox/mixed.svg +1 -0
  945. package/docs/design/templates/checkbox/states-dark.svg +1 -0
  946. package/docs/design/templates/checkbox/states.svg +1 -0
  947. package/docs/design/templates/checkbox-dark.svg +1 -0
  948. package/docs/design/templates/checkbox-group/horizontal-dark.svg +1 -0
  949. package/docs/design/templates/checkbox-group/horizontal.svg +1 -0
  950. package/docs/design/templates/checkbox-group/vertical-dark.svg +1 -0
  951. package/docs/design/templates/checkbox-group/vertical.svg +1 -0
  952. package/docs/design/templates/checkbox-group-dark.svg +1 -0
  953. package/docs/design/templates/checkbox-group.svg +1 -0
  954. package/docs/design/templates/checkbox.svg +1 -0
  955. package/docs/design/templates/chip/action-filters-dark.svg +1 -0
  956. package/docs/design/templates/chip/action-filters.svg +1 -0
  957. package/docs/design/templates/chip/tags-dark.svg +1 -0
  958. package/docs/design/templates/chip/tags.svg +1 -0
  959. package/docs/design/templates/chip-dark.svg +1 -0
  960. package/docs/design/templates/chip.svg +1 -0
  961. package/docs/design/templates/choice-chips/color-palette-dark.svg +1 -0
  962. package/docs/design/templates/choice-chips/color-palette.svg +1 -0
  963. package/docs/design/templates/choice-chips/compact-icons-dark.svg +1 -0
  964. package/docs/design/templates/choice-chips/compact-icons.svg +1 -0
  965. package/docs/design/templates/choice-chips/multiple-dark.svg +1 -0
  966. package/docs/design/templates/choice-chips/multiple.svg +1 -0
  967. package/docs/design/templates/choice-chips-dark.svg +1 -0
  968. package/docs/design/templates/choice-chips.svg +1 -0
  969. package/docs/design/templates/color-field/compact-dark.svg +1 -0
  970. package/docs/design/templates/color-field/compact.svg +1 -0
  971. package/docs/design/templates/color-field/error-dark.svg +1 -0
  972. package/docs/design/templates/color-field/error.svg +1 -0
  973. package/docs/design/templates/color-field/hint-dark.svg +1 -0
  974. package/docs/design/templates/color-field/hint.svg +1 -0
  975. package/docs/design/templates/color-field-dark.svg +1 -0
  976. package/docs/design/templates/color-field.svg +1 -0
  977. package/docs/design/templates/color-picker/gray-dark.svg +1 -0
  978. package/docs/design/templates/color-picker/gray.svg +1 -0
  979. package/docs/design/templates/color-picker/hsb-dark.svg +1 -0
  980. package/docs/design/templates/color-picker/hsb.svg +1 -0
  981. package/docs/design/templates/color-picker/rgb-dark.svg +1 -0
  982. package/docs/design/templates/color-picker/rgb.svg +1 -0
  983. package/docs/design/templates/color-picker-dark.svg +1 -0
  984. package/docs/design/templates/color-picker.svg +1 -0
  985. package/docs/design/templates/color-swatches/palette-dark.svg +1 -0
  986. package/docs/design/templates/color-swatches/palette.svg +1 -0
  987. package/docs/design/templates/color-swatches-dark.svg +1 -0
  988. package/docs/design/templates/color-swatches.svg +1 -0
  989. package/docs/design/templates/disclosure/embedded-dark.svg +1 -0
  990. package/docs/design/templates/disclosure/embedded.svg +1 -0
  991. package/docs/design/templates/disclosure/framed-sunken-dark.svg +1 -0
  992. package/docs/design/templates/disclosure/framed-sunken.svg +1 -0
  993. package/docs/design/templates/disclosure/plain-dark.svg +1 -0
  994. package/docs/design/templates/disclosure/plain.svg +1 -0
  995. package/docs/design/templates/disclosure-dark.svg +1 -0
  996. package/docs/design/templates/disclosure.svg +1 -0
  997. package/docs/design/templates/empty-state/filtered-dark.svg +1 -1
  998. package/docs/design/templates/empty-state/filtered.svg +1 -1
  999. package/docs/design/templates/empty-state/with-action-dark.svg +1 -1
  1000. package/docs/design/templates/empty-state/with-action.svg +1 -1
  1001. package/docs/design/templates/empty-state-dark.svg +1 -7
  1002. package/docs/design/templates/empty-state.svg +1 -7
  1003. package/docs/design/templates/list/compact-dark.svg +1 -0
  1004. package/docs/design/templates/list/compact.svg +1 -0
  1005. package/docs/design/templates/list/stack-dark.svg +1 -0
  1006. package/docs/design/templates/list/stack.svg +1 -0
  1007. package/docs/design/templates/list-action-row/default-dark.svg +1 -1
  1008. package/docs/design/templates/list-action-row/default.svg +1 -1
  1009. package/docs/design/templates/list-action-row/icon-tile-dark.svg +1 -0
  1010. package/docs/design/templates/list-action-row/icon-tile.svg +1 -0
  1011. package/docs/design/templates/list-action-row/selected-dark.svg +1 -1
  1012. package/docs/design/templates/list-action-row/selected.svg +1 -1
  1013. package/docs/design/templates/list-action-row/trailing-menu-dark.svg +1 -0
  1014. package/docs/design/templates/list-action-row/trailing-menu.svg +1 -0
  1015. package/docs/design/templates/list-action-row-dark.svg +1 -7
  1016. package/docs/design/templates/list-action-row.svg +1 -7
  1017. package/docs/design/templates/list-dark.svg +1 -0
  1018. package/docs/design/templates/list-header/action-dark.svg +1 -1
  1019. package/docs/design/templates/list-header/action.svg +1 -1
  1020. package/docs/design/templates/list-header/count-dark.svg +1 -1
  1021. package/docs/design/templates/list-header/count.svg +1 -1
  1022. package/docs/design/templates/list-header/inline-action-dark.svg +1 -0
  1023. package/docs/design/templates/list-header/inline-action.svg +1 -0
  1024. package/docs/design/templates/list-header/size-l-dark.svg +1 -0
  1025. package/docs/design/templates/list-header/size-l.svg +1 -0
  1026. package/docs/design/templates/list-header/size-m-dark.svg +1 -0
  1027. package/docs/design/templates/list-header/size-m.svg +1 -0
  1028. package/docs/design/templates/list-header/size-xl-dark.svg +1 -0
  1029. package/docs/design/templates/list-header/size-xl.svg +1 -0
  1030. package/docs/design/templates/list-header/size-xs-dark.svg +1 -0
  1031. package/docs/design/templates/list-header/size-xs.svg +1 -0
  1032. package/docs/design/templates/list-header/toggle-collapsed-dark.svg +1 -1
  1033. package/docs/design/templates/list-header/toggle-collapsed.svg +1 -1
  1034. package/docs/design/templates/list-header/toggle-expanded-dark.svg +1 -1
  1035. package/docs/design/templates/list-header/toggle-expanded.svg +1 -1
  1036. package/docs/design/templates/list-header-dark.svg +1 -11
  1037. package/docs/design/templates/list-header.svg +1 -11
  1038. package/docs/design/templates/list-item/default-dark.svg +1 -1
  1039. package/docs/design/templates/list-item/default.svg +1 -1
  1040. package/docs/design/templates/list-item/icon-tile-dark.svg +1 -0
  1041. package/docs/design/templates/list-item/icon-tile.svg +1 -0
  1042. package/docs/design/templates/list-item/multiline-dark.svg +1 -1
  1043. package/docs/design/templates/list-item/multiline.svg +1 -1
  1044. package/docs/design/templates/list-item/selected-dark.svg +1 -1
  1045. package/docs/design/templates/list-item/selected.svg +1 -1
  1046. package/docs/design/templates/list-item/trailing-dark.svg +1 -1
  1047. package/docs/design/templates/list-item/trailing.svg +1 -1
  1048. package/docs/design/templates/list-item-dark.svg +1 -11
  1049. package/docs/design/templates/list-item.svg +1 -11
  1050. package/docs/design/templates/list.svg +1 -0
  1051. package/docs/design/templates/message-composer/chat-dark.svg +1 -0
  1052. package/docs/design/templates/message-composer/chat.svg +1 -0
  1053. package/docs/design/templates/message-composer/prompt-dark.svg +1 -0
  1054. package/docs/design/templates/message-composer/prompt.svg +1 -0
  1055. package/docs/design/templates/message-composer-dark.svg +1 -0
  1056. package/docs/design/templates/message-composer.svg +1 -0
  1057. package/docs/design/templates/progress-bar/determinate-dark.svg +1 -0
  1058. package/docs/design/templates/progress-bar/determinate.svg +1 -0
  1059. package/docs/design/templates/progress-bar/tones-dark.svg +1 -0
  1060. package/docs/design/templates/progress-bar/tones.svg +1 -0
  1061. package/docs/design/templates/progress-bar-dark.svg +1 -0
  1062. package/docs/design/templates/progress-bar.svg +1 -0
  1063. package/docs/design/templates/progress-ring/sizes-dark.svg +1 -0
  1064. package/docs/design/templates/progress-ring/sizes.svg +1 -0
  1065. package/docs/design/templates/progress-ring/tones-dark.svg +1 -0
  1066. package/docs/design/templates/progress-ring/tones.svg +1 -0
  1067. package/docs/design/templates/progress-ring-dark.svg +1 -0
  1068. package/docs/design/templates/progress-ring.svg +1 -0
  1069. package/docs/design/templates/radio-group/horizontal-dark.svg +1 -0
  1070. package/docs/design/templates/radio-group/horizontal.svg +1 -0
  1071. package/docs/design/templates/radio-group/vertical-dark.svg +1 -0
  1072. package/docs/design/templates/radio-group/vertical.svg +1 -0
  1073. package/docs/design/templates/radio-group-dark.svg +1 -0
  1074. package/docs/design/templates/radio-group.svg +1 -0
  1075. package/docs/design/templates/search-field/empty-dark.svg +1 -0
  1076. package/docs/design/templates/search-field/empty.svg +1 -0
  1077. package/docs/design/templates/search-field/tokens-dark.svg +1 -0
  1078. package/docs/design/templates/search-field/tokens.svg +1 -0
  1079. package/docs/design/templates/search-field-dark.svg +1 -0
  1080. package/docs/design/templates/search-field.svg +1 -0
  1081. package/docs/design/templates/segmented-control/equal-dark.svg +1 -1
  1082. package/docs/design/templates/segmented-control/equal.svg +1 -1
  1083. package/docs/design/templates/segmented-control/pill-small-dark.svg +1 -1
  1084. package/docs/design/templates/segmented-control/pill-small.svg +1 -1
  1085. package/docs/design/templates/segmented-control-dark.svg +1 -7
  1086. package/docs/design/templates/segmented-control.svg +1 -7
  1087. package/docs/design/templates/select/compact-dark.svg +1 -0
  1088. package/docs/design/templates/select/compact.svg +1 -0
  1089. package/docs/design/templates/select/form-dark.svg +1 -0
  1090. package/docs/design/templates/select/form.svg +1 -0
  1091. package/docs/design/templates/select/icons-dark.svg +1 -0
  1092. package/docs/design/templates/select/icons.svg +1 -0
  1093. package/docs/design/templates/select-dark.svg +1 -0
  1094. package/docs/design/templates/select.svg +1 -0
  1095. package/docs/design/templates/skeleton-dark.svg +1 -9
  1096. package/docs/design/templates/skeleton.svg +1 -9
  1097. package/docs/design/templates/slider/compact-dark.svg +1 -0
  1098. package/docs/design/templates/slider/compact.svg +1 -0
  1099. package/docs/design/templates/slider/readout-dark.svg +1 -0
  1100. package/docs/design/templates/slider/readout.svg +1 -0
  1101. package/docs/design/templates/slider/ticks-dark.svg +1 -0
  1102. package/docs/design/templates/slider/ticks.svg +1 -0
  1103. package/docs/design/templates/slider-dark.svg +1 -0
  1104. package/docs/design/templates/slider.svg +1 -0
  1105. package/docs/design/templates/split-button/full-width-dark.svg +1 -0
  1106. package/docs/design/templates/split-button/full-width.svg +1 -0
  1107. package/docs/design/templates/split-button/pill-dark.svg +1 -0
  1108. package/docs/design/templates/split-button/pill.svg +1 -0
  1109. package/docs/design/templates/split-button/states-dark.svg +1 -0
  1110. package/docs/design/templates/split-button/states.svg +1 -0
  1111. package/docs/design/templates/split-button/tones-dark.svg +1 -0
  1112. package/docs/design/templates/split-button/tones.svg +1 -0
  1113. package/docs/design/templates/split-button-dark.svg +1 -0
  1114. package/docs/design/templates/split-button.svg +1 -0
  1115. package/docs/design/templates/state-banner/danger-dark.svg +1 -1
  1116. package/docs/design/templates/state-banner/danger.svg +1 -1
  1117. package/docs/design/templates/state-banner/info-badge-dark.svg +1 -0
  1118. package/docs/design/templates/state-banner/info-badge.svg +1 -0
  1119. package/docs/design/templates/state-banner/info-dark.svg +1 -1
  1120. package/docs/design/templates/state-banner/info.svg +1 -1
  1121. package/docs/design/templates/state-banner/strip-dark.svg +1 -0
  1122. package/docs/design/templates/state-banner/strip.svg +1 -0
  1123. package/docs/design/templates/state-banner/success-dark.svg +1 -1
  1124. package/docs/design/templates/state-banner/success.svg +1 -1
  1125. package/docs/design/templates/state-banner/warning-dark.svg +1 -1
  1126. package/docs/design/templates/state-banner/warning.svg +1 -1
  1127. package/docs/design/templates/state-banner-dark.svg +1 -11
  1128. package/docs/design/templates/state-banner.svg +1 -11
  1129. package/docs/design/templates/switch/compact-dark.svg +1 -0
  1130. package/docs/design/templates/switch/compact.svg +1 -0
  1131. package/docs/design/templates/switch/states-dark.svg +1 -0
  1132. package/docs/design/templates/switch/states.svg +1 -0
  1133. package/docs/design/templates/switch-dark.svg +1 -0
  1134. package/docs/design/templates/switch.svg +1 -0
  1135. package/docs/design/templates/tab-bar/workspace-tabs-dark.svg +1 -1
  1136. package/docs/design/templates/tab-bar/workspace-tabs.svg +1 -1
  1137. package/docs/design/templates/tab-bar-dark.svg +1 -5
  1138. package/docs/design/templates/tab-bar.svg +1 -5
  1139. package/docs/design/templates/tag-field/error-dark.svg +1 -0
  1140. package/docs/design/templates/tag-field/error.svg +1 -0
  1141. package/docs/design/templates/tag-field/tags-dark.svg +1 -0
  1142. package/docs/design/templates/tag-field/tags.svg +1 -0
  1143. package/docs/design/templates/tag-field-dark.svg +1 -0
  1144. package/docs/design/templates/tag-field.svg +1 -0
  1145. package/docs/design/templates/text-field/compact-dark.svg +1 -0
  1146. package/docs/design/templates/text-field/compact.svg +1 -0
  1147. package/docs/design/templates/text-field/error-dark.svg +1 -0
  1148. package/docs/design/templates/text-field/error.svg +1 -0
  1149. package/docs/design/templates/text-field/labeled-dark.svg +1 -0
  1150. package/docs/design/templates/text-field/labeled.svg +1 -0
  1151. package/docs/design/templates/text-field/multiline-dark.svg +1 -0
  1152. package/docs/design/templates/text-field/multiline.svg +1 -0
  1153. package/docs/design/templates/text-field/number-dark.svg +1 -0
  1154. package/docs/design/templates/text-field/number.svg +1 -0
  1155. package/docs/design/templates/text-field/search-dark.svg +1 -0
  1156. package/docs/design/templates/text-field/search.svg +1 -0
  1157. package/docs/design/templates/text-field-dark.svg +1 -0
  1158. package/docs/design/templates/text-field.svg +1 -0
  1159. package/docs/design/templates/toolbar/title-and-actions-dark.svg +1 -1
  1160. package/docs/design/templates/toolbar/title-and-actions.svg +1 -1
  1161. package/docs/design/templates/toolbar/width-visibility-320-dark.svg +1 -0
  1162. package/docs/design/templates/toolbar/width-visibility-320.svg +1 -0
  1163. package/docs/design/templates/toolbar/width-visibility-600-dark.svg +1 -0
  1164. package/docs/design/templates/toolbar/width-visibility-600.svg +1 -0
  1165. package/docs/design/templates/toolbar-control-group/borderless-single-dark.svg +1 -1
  1166. package/docs/design/templates/toolbar-control-group/borderless-single.svg +1 -1
  1167. package/docs/design/templates/toolbar-control-group/glass-dark.svg +1 -0
  1168. package/docs/design/templates/toolbar-control-group/glass.svg +1 -0
  1169. package/docs/design/templates/toolbar-control-group/icon-buttons-dark.svg +1 -1
  1170. package/docs/design/templates/toolbar-control-group/icon-buttons.svg +1 -1
  1171. package/docs/design/templates/toolbar-control-group/icon-tile-brand-dark.svg +1 -0
  1172. package/docs/design/templates/toolbar-control-group/icon-tile-brand.svg +1 -0
  1173. package/docs/design/templates/toolbar-control-group/icon-tile-danger-dark.svg +1 -0
  1174. package/docs/design/templates/toolbar-control-group/icon-tile-danger.svg +1 -0
  1175. package/docs/design/templates/toolbar-control-group/icon-tile-neutral-dark.svg +1 -0
  1176. package/docs/design/templates/toolbar-control-group/icon-tile-neutral.svg +1 -0
  1177. package/docs/design/templates/toolbar-control-group/icon-tile-success-dark.svg +1 -0
  1178. package/docs/design/templates/toolbar-control-group/icon-tile-success.svg +1 -0
  1179. package/docs/design/templates/toolbar-control-group/icon-tile-warning-dark.svg +1 -0
  1180. package/docs/design/templates/toolbar-control-group/icon-tile-warning.svg +1 -0
  1181. package/docs/design/templates/toolbar-control-group/push-buttons-dark.svg +1 -1
  1182. package/docs/design/templates/toolbar-control-group/push-buttons.svg +1 -1
  1183. package/docs/design/templates/toolbar-control-group/with-text-dark.svg +1 -1
  1184. package/docs/design/templates/toolbar-control-group/with-text.svg +1 -1
  1185. package/docs/design/templates/toolbar-control-group-dark.svg +1 -11
  1186. package/docs/design/templates/toolbar-control-group.svg +1 -11
  1187. package/docs/design/templates/toolbar-dark.svg +1 -5
  1188. package/docs/design/templates/toolbar-text/dark-tone-dark.svg +1 -0
  1189. package/docs/design/templates/toolbar-text/dark-tone.svg +1 -0
  1190. package/docs/design/templates/toolbar-text/default-dark.svg +1 -1
  1191. package/docs/design/templates/toolbar-text/default.svg +1 -1
  1192. package/docs/design/templates/toolbar-text/large-dark.svg +1 -1
  1193. package/docs/design/templates/toolbar-text/large.svg +1 -1
  1194. package/docs/design/templates/toolbar-text/small-dark.svg +1 -1
  1195. package/docs/design/templates/toolbar-text/small.svg +1 -1
  1196. package/docs/design/templates/toolbar-text-dark.svg +1 -9
  1197. package/docs/design/templates/toolbar-text.svg +1 -9
  1198. package/docs/design/templates/toolbar.svg +1 -5
  1199. package/docs/design/templates/value-table/details-dark.svg +1 -1
  1200. package/docs/design/templates/value-table/details.svg +1 -1
  1201. package/docs/design/templates/value-table-dark.svg +1 -5
  1202. package/docs/design/templates/value-table.svg +1 -5
  1203. package/docs/design/templates.md +89 -33
  1204. package/docs/design-philosophy.md +65 -20
  1205. package/docs/device-class.md +10 -9
  1206. package/docs/disclosure.md +97 -0
  1207. package/docs/document-baseline.md +93 -0
  1208. package/docs/examples/application-ui-profile.json +60 -0
  1209. package/docs/examples/command-palette-adapter.tsx +69 -17
  1210. package/docs/examples/component-catalog-extension.json +52 -0
  1211. package/docs/examples/component-composition-extension.json +80 -0
  1212. package/docs/layout.md +971 -53
  1213. package/docs/list-detail-dialog.md +100 -0
  1214. package/docs/manual-test-plan.md +55 -0
  1215. package/docs/message-composer.md +156 -0
  1216. package/docs/nav-stack.md +327 -14
  1217. package/docs/overlay-toast.md +62 -0
  1218. package/docs/overlay-tooltip.md +53 -0
  1219. package/docs/progress.md +62 -0
  1220. package/docs/recipes.md +156 -73
  1221. package/docs/slider.md +64 -0
  1222. package/docs/split-view.md +96 -7
  1223. package/docs/sunken-panel.md +106 -0
  1224. package/docs/surface-scaffold.md +490 -0
  1225. package/docs/tab-navigator.md +291 -0
  1226. package/docs/tag-field.md +66 -0
  1227. package/docs/type-contracts.md +137 -0
  1228. package/docs/ui-analyzer.md +406 -0
  1229. package/docs/ui-doctor.md +298 -0
  1230. package/docs/ui-evaluator.md +139 -0
  1231. package/docs/ux-demo.md +58 -17
  1232. package/docs/webawesome-migration.md +82 -0
  1233. package/docs/webawesome-theme.md +306 -47
  1234. package/docs/workbench-dialog.md +88 -0
  1235. package/docs/workbench.md +637 -12
  1236. package/docs/writing.md +154 -0
  1237. package/doctor/cli.mjs +120 -0
  1238. package/doctor/component-style-checks.mjs +457 -0
  1239. package/doctor/config.schema.json +94 -0
  1240. package/doctor/copy-capitalization-checks.mjs +603 -0
  1241. package/doctor/eslint-diagnostics.d.mts +24 -0
  1242. package/doctor/eslint-diagnostics.mjs +24 -0
  1243. package/doctor/index.d.mts +122 -0
  1244. package/doctor/index.mjs +1424 -0
  1245. package/doctor/report.schema.json +118 -0
  1246. package/evaluator/cli.mjs +89 -0
  1247. package/evaluator/index.d.mts +90 -0
  1248. package/evaluator/index.mjs +1203 -0
  1249. package/evaluator/report.schema.json +152 -0
  1250. package/llms.txt +943 -54
  1251. package/package.json +488 -43
  1252. package/scripts/component-catalog-extension-validation.mjs +28 -0
  1253. package/traversal-exclusions.mjs +86 -0
  1254. package/ux-demo/recipes/app-shell.tsx +204 -16
  1255. package/ux-demo/recipes/collapsible-sidebar.tsx +206 -45
  1256. package/ux-demo/recipes/compact-toolbar.tsx +135 -14
  1257. package/ux-demo/recipes/composer-form.tsx +135 -24
  1258. package/ux-demo/recipes/list-detail-dialog.tsx +155 -21
  1259. package/ux-demo/recipes/list-workspace-states.tsx +183 -11
  1260. package/ux-demo/recipes/loaders.ts +11 -3
  1261. package/ux-demo/recipes/loading-inspector.tsx +162 -39
  1262. package/ux-demo/recipes/media-detail.tsx +272 -0
  1263. package/ux-demo/recipes/mount-recipe.ts +28 -11
  1264. package/ux-demo/recipes/navigation-sidebar.tsx +137 -11
  1265. package/ux-demo/recipes/navigation-stack.tsx +79 -24
  1266. package/ux-demo/recipes/types.ts +18 -2
  1267. package/ux-demo/recipes/workspace-header.tsx +86 -5
  1268. package/vite-ux-review.d.mts +83 -0
  1269. package/vite-ux-review.mjs +120 -0
  1270. package/dist/app-tab.d.ts +0 -30
  1271. package/dist/app-tab.js +0 -5
  1272. package/dist/app-tab.js.map +0 -1
  1273. package/dist/browser/app-tab.js +0 -4
  1274. package/dist/browser/panel-header.js +0 -7
  1275. package/dist/browser/token-search-field.js +0 -4
  1276. package/dist/chunk-2Z5TWHKQ.js +0 -34
  1277. package/dist/chunk-2Z5TWHKQ.js.map +0 -1
  1278. package/dist/chunk-37T3VNIZ.js +0 -19
  1279. package/dist/chunk-37T3VNIZ.js.map +0 -1
  1280. package/dist/chunk-55DATV3A.js +0 -10
  1281. package/dist/chunk-55DATV3A.js.map +0 -1
  1282. package/dist/chunk-56RJXPHG.js.map +0 -1
  1283. package/dist/chunk-5ATCDSQS.js +0 -42
  1284. package/dist/chunk-5ATCDSQS.js.map +0 -1
  1285. package/dist/chunk-5E2HVJ33.js +0 -10
  1286. package/dist/chunk-5E2HVJ33.js.map +0 -1
  1287. package/dist/chunk-7BR3DO2A.js +0 -31
  1288. package/dist/chunk-7BR3DO2A.js.map +0 -1
  1289. package/dist/chunk-7JB7VPRI.js +0 -34
  1290. package/dist/chunk-7JB7VPRI.js.map +0 -1
  1291. package/dist/chunk-7LDCTU7D.js +0 -134
  1292. package/dist/chunk-7LDCTU7D.js.map +0 -1
  1293. package/dist/chunk-AQNKJRFH.js +0 -79
  1294. package/dist/chunk-AQNKJRFH.js.map +0 -1
  1295. package/dist/chunk-AVZHJN6C.js +0 -14
  1296. package/dist/chunk-AVZHJN6C.js.map +0 -1
  1297. package/dist/chunk-B24C4A6T.js +0 -22
  1298. package/dist/chunk-B24C4A6T.js.map +0 -1
  1299. package/dist/chunk-BLK3UEEI.js +0 -23
  1300. package/dist/chunk-BLK3UEEI.js.map +0 -1
  1301. package/dist/chunk-CH4SQ6H5.js +0 -39
  1302. package/dist/chunk-CH4SQ6H5.js.map +0 -1
  1303. package/dist/chunk-DAFFDO33.js +0 -14
  1304. package/dist/chunk-DAFFDO33.js.map +0 -1
  1305. package/dist/chunk-I7INRJO4.js +0 -17
  1306. package/dist/chunk-I7INRJO4.js.map +0 -1
  1307. package/dist/chunk-L4OKFDJY.js +0 -24
  1308. package/dist/chunk-L4OKFDJY.js.map +0 -1
  1309. package/dist/chunk-LCOBDOCC.js +0 -265
  1310. package/dist/chunk-LCOBDOCC.js.map +0 -1
  1311. package/dist/chunk-M5JRI6MN.js +0 -27
  1312. package/dist/chunk-M5JRI6MN.js.map +0 -1
  1313. package/dist/chunk-RNPGFQ33.js +0 -10
  1314. package/dist/chunk-RNPGFQ33.js.map +0 -1
  1315. package/dist/chunk-RUNWEPR4.js +0 -10
  1316. package/dist/chunk-RUNWEPR4.js.map +0 -1
  1317. package/dist/chunk-W2FK7ZNY.js +0 -26
  1318. package/dist/chunk-W2FK7ZNY.js.map +0 -1
  1319. package/dist/chunk-WVPYVDXY.js +0 -15
  1320. package/dist/chunk-WVPYVDXY.js.map +0 -1
  1321. package/dist/chunk-XE5ZLPCC.js +0 -20
  1322. package/dist/chunk-XE5ZLPCC.js.map +0 -1
  1323. package/dist/chunk-XXMOARTH.js +0 -229
  1324. package/dist/chunk-XXMOARTH.js.map +0 -1
  1325. package/dist/chunk-YGN7OMLT.js.map +0 -1
  1326. package/dist/panel-header.d.ts +0 -36
  1327. package/dist/panel-header.js +0 -7
  1328. package/dist/panel-header.js.map +0 -1
  1329. package/dist/styles/app-tab.css +0 -152
  1330. package/dist/styles/panel-header.css +0 -64
  1331. package/dist/styles/tab-scaffold.css +0 -84
  1332. package/dist/styles/token-search-field.css +0 -289
  1333. package/dist/tab-scaffold.d.ts +0 -30
  1334. package/dist/tab-scaffold.js +0 -16
  1335. package/dist/tab-scaffold.js.map +0 -1
  1336. package/dist/token-search-field.d.ts +0 -43
  1337. package/dist/token-search-field.js +0 -4
  1338. package/dist/token-search-field.js.map +0 -1
  1339. package/dist/wire-tab-scaffold.d.ts +0 -11
  1340. package/dist/wire-tab-scaffold.js +0 -16
  1341. package/dist/wire-tab-scaffold.js.map +0 -1
  1342. package/dist/wire-token-search-fields.js +0 -5
  1343. package/docs/design/templates/panel-header/icon-actions-dark.svg +0 -1
  1344. package/docs/design/templates/panel-header/icon-actions.svg +0 -1
  1345. package/docs/design/templates/panel-header/icon-summary-actions-dark.svg +0 -1
  1346. package/docs/design/templates/panel-header/icon-summary-actions.svg +0 -1
  1347. package/docs/design/templates/panel-header/no-icon-dark.svg +0 -1
  1348. package/docs/design/templates/panel-header/no-icon.svg +0 -1
  1349. package/docs/design/templates/panel-header/page-heading-dark.svg +0 -1
  1350. package/docs/design/templates/panel-header/page-heading.svg +0 -1
  1351. package/docs/design/templates/panel-header/title-only-dark.svg +0 -1
  1352. package/docs/design/templates/panel-header/title-only.svg +0 -1
  1353. package/docs/design/templates/panel-header-dark.svg +0 -13
  1354. package/docs/design/templates/panel-header.svg +0 -13
  1355. package/docs/design/templates/token-search-field/empty-dark.svg +0 -1
  1356. package/docs/design/templates/token-search-field/empty.svg +0 -1
  1357. package/docs/design/templates/token-search-field/tokens-dark.svg +0 -1
  1358. package/docs/design/templates/token-search-field/tokens.svg +0 -1
  1359. package/docs/design/templates/token-search-field-dark.svg +0 -7
  1360. package/docs/design/templates/token-search-field.svg +0 -7
  1361. package/docs/tab-scaffold.md +0 -41
  1362. package/ux-demo/recipes/recipes.css +0 -448
package/llms.txt CHANGED
@@ -6,64 +6,605 @@
6
6
  > generate correct, good-looking kerf UI — it is not a catalog to browse.
7
7
 
8
8
  ```bash
9
- npm install kerfjs @kerfjs/ui # kerfjs is a peer; Web Awesome is an optional peer
9
+ npm install kerfjs @kerfjs/ui # kerfjs is a peer; Web Awesome is an optional peer
10
10
  ```
11
11
 
12
12
  Import each component from its own subpath (`@kerfjs/ui/list-item`, `@kerfjs/ui/toolbar`,
13
13
  …); the browser build pulls that component's reachable CSS automatically, so do not
14
14
  maintain a central style list. Configure JSX with `"jsxImportSource": "kerfjs"`.
15
15
 
16
+ The sunken/lowered background is semi-transparent: Web Awesome's
17
+ `--wa-color-surface-lowered` is mirrored by `--kui-color-surface-lowered` and
18
+ used by `--kui-color-neutral-fill-quiet`. `SunkenPanel`, sunken
19
+ `Pane`/`Workbench`/`TabNavigator` surfaces, and Web Awesome
20
+ `appearance="sunken"` use that tint by default through their optional
21
+ `--kui-sunken-panel-background` / `--kui-wa-sunken-background` override tokens.
22
+ Each layer composites over its backdrop. Intentional nested layers create
23
+ depth; avoid a wrapper or extra background that paints the same visual surface
24
+ twice. Check contrast in both color schemes over the actual backdrop. See
25
+ [contextual transparency](./docs/webawesome-theme.md#contextual-transparency).
26
+
27
+ For chrome laid over imagery, use the `clear` presentation (Pane
28
+ `headerPresentation`, NavStack `chromePresentation` /
29
+ `bottomToolbarPresentation`, TabNavigator `barPresentation`) with glass
30
+ control groups, and `scrollEdge="material"` (or `"surface"`) to fade a
31
+ backing in gradually over `scrollEdgeDistance` (default 60px) as content
32
+ scrolls beneath (a first `BackdropImage` with `underChrome` runs its artwork beneath the header); see [Clear header](./docs/layout.md#clear-header).
33
+
34
+ For a `kerfjs/overlay` dialog with `presentation: 'bottom-sheet'`, import
35
+ `@kerfjs/ui/overlay-sheet.css` once (and pass `exitClass: 'kui-overlay-sheet-exit'`
36
+ for the slide out; add the `kui-overlay-sheet-resizable` class and call
37
+ `wireOverlaySheets()` for a resize grabber); see [Core dialogs as bottom sheets](./docs/surface-scaffold.md#core-dialogs-as-bottom-sheets).
38
+
39
+ For an app-chosen surface color, set the typed `background` prop (a
40
+ `@kerfjs/ui/css-values` color) on `Pane` (also `PaneConfig`), `NavStack`,
41
+ `TabNavigator`, or a `TabNavigatorTab` instead of styling the component. It
42
+ replaces the default or sunken fill; overlay chrome keeps its material; forced
43
+ colors paint `Canvas`. Keep content at AA over the color. See
44
+ [Background colors](./docs/layout.md#background-colors).
45
+ For a region that takes on a color with text kept at AA automatically, set
46
+ `tint={{ color, scheme }}` (the app declares the scheme; no color detection; an optional `accent` re-derives the brand ramp at AA);
47
+ see [Tinted surfaces](./docs/layout.md#tinted-surfaces).
48
+
49
+ For arbitrary interactive help or popup content, use `openAnchoredSurface` or
50
+ `openAnchoredSurfaceAt` from `@kerfjs/ui/anchored-surface`; see
51
+ [AnchoredSurface](./docs/anchored-surface.md). The app owns content and actions.
52
+ Inside a native `<dialog>`, `wa-dialog`, or `wa-drawer`, the surface stays
53
+ interactive and closes with the dialog. It keeps an 8px viewport gutter
54
+ (`viewportMargin`) and fits its height to the room beside the anchor, scrolling
55
+ its content, so do not add media queries or `max-height` overrides.
56
+ `tone: 'dark'` gives a popup anchored to dark media chrome the inverse tone of a
57
+ `ToolbarControlGroup tone="dark"`; its content inherits the matching colors.
58
+ For a public subpath containing several visual components, use a folder with one
59
+ component per source file and one owned stylesheet per visual component. Keep its
60
+ compatibility entrypoints implementation-free: JavaScript/TypeScript only re-exports
61
+ the folder modules, and CSS only imports their owner stylesheets.
62
+
63
+ ### Shared semantic tones
64
+
65
+ Use `ToolbarText tone="dark"` on a loud-filled toolbar surface (the inverse
66
+ `--kui-color-neutral-fill-loud`) to match dark control groups; it inverts with
67
+ the color scheme. Over a dark photo or scrim keep the default tone inside a
68
+ `BackdropImage` overlay, which takes the dark scheme under its `scrim`. It applies to read-only headings and actionable
69
+ titles at every size; default tone retains existing identity and heading colors.
70
+
71
+ `SemanticTone` is the shared color-role type for `Badge`, `Chip`, `StateBanner`,
72
+ and semantic `ContentItem` appearances: `neutral`, `info`, `pop`, `success`,
73
+ `warning`, and `danger`. Import it as a type from `@kerfjs/ui`,
74
+ `@kerfjs/ui/badge`, `@kerfjs/ui/state-banner`, or `@kerfjs/ui/content-item`.
75
+ Use `info` for the role backed by the existing `--kui-color-brand-*` tokens.
76
+ Migrate Badge/Chip `tone="brand"` to `tone="info"`; `BadgeTone` and
77
+ `StateBannerTone` remain deprecated aliases of `SemanticTone`.
78
+
79
+ ## The rule: components own their styles
80
+
81
+ Configure components through their typed props (size, density, inset,
82
+ presentation, `ToolbarConfig`, `PaneConfig`, …); never restyle one from outside.
83
+ No application or parent CSS may select a `.kui-*` class, a `[data-component]`
84
+ root, a `wa-*` element a Kerf component renders, or its `::part()`s, and no
85
+ writing another component's `--_kui-*` / `--kui-*` variables where a prop
86
+ exists. When a component adapts inside another, it styles itself in that
87
+ context in its own stylesheet. A missing prop is a component gap to report,
88
+ not a reason to override — and your own components follow the same rule.
89
+
16
90
  ## How to build a screen (retrieval order)
17
91
 
92
+ First make the design decision: state what the user must read or do, find the
93
+ Kerf or consuming-app component whose purpose and interaction match, and
94
+ configure it. Compose `Toolbar`, `List`, `Row`, `Grid`, `ContentItem`, and the
95
+ other primitives before creating markup or CSS. A local component should own a
96
+ real domain behavior or new structure; a wrapper made only to re-space or
97
+ re-skin an existing component is the wrong choice. Ask what each `div`, `span`,
98
+ fragment, class, and CSS rule contributes. Remove it if a component already
99
+ owns the semantics, surface, inset, scrollport, or gap. Use the spacing scale
100
+ to show relationships, keep useful negative space, and align neighboring text
101
+ and control edges. Check the result against adjacent screens at wide and narrow
102
+ widths. The concrete [decision pass](./docs/component-selection.md#decision-pass-before-jsx-or-css)
103
+ explains when to reuse, compose, extend, or use native HTML.
104
+
18
105
  1. **Pick the component from the interface need**, not by appearance — read
19
106
  [component-selection.md](./docs/component-selection.md) (the problem→component
20
107
  matrix, with imports, wiring, ownership, and alternatives).
21
108
  2. **Get exact signatures before emitting code** — read
22
109
  [public-api-signatures-v1.md](./ai/public-api-signatures-v1.md) (real prop names,
23
110
  callback shapes, disposer return types).
24
- 3. **For exhaustive, structured facts** (ids, exports, variants, `publicClasses`,
25
- relationships, side effects) load the
26
- [Machine-readable component catalog](./ai/component-catalog.json) — the
27
- canonical checked-in source; its schema is alongside it.
28
- 4. **Apply the rules below and in** [skill.md](./ai/skill.md).
111
+ 3. **Look up each component you use** in the
112
+ [component reference index](./ai/components/README.md) — one line per
113
+ entry — then read only those `ai/components/<id>.md` pages (1–7 KB each):
114
+ use/avoid, imports and side effects, a link to exact props, legal parents,
115
+ zones with their JSX prop and child count, app- and wiring-owned state,
116
+ geometry, accessibility, the styling boundary (configure through props;
117
+ never override internals), and `KUI-C###` diagnostics. Do not load the
118
+ large JSON catalogs just to choose or compose components; the pages are
119
+ generated from them.
120
+ **Tools and mechanical checks** use the JSON sources instead: the
121
+ [Machine-readable component catalog](./ai/component-catalog.json) (ids,
122
+ exports, variants, `publicClasses`, relationships, side effects, and
123
+ geometry ownership) — the canonical checked-in source; its schema is
124
+ alongside it. Also load the
125
+ consuming application's catalog extension when present; generate one from the
126
+ [Consumer catalog extension schema](./ai/component-catalog-extension.schema.json)
127
+ when app-owned components must participate in selection or alignment.
128
+ A tool loads the [Composition catalog](./ai/component-composition.json) — a
129
+ generated composition layer beside the component catalog, not a replacement
130
+ for it — to mechanically evaluate parents, contexts, zones/cardinality,
131
+ children, state, wiring (including the wiring-owned `stateAttributes` an app
132
+ must never render or remove), responsive/layout/accessibility rules, and
133
+ public boundaries. The component catalog stays the selection and delivery
134
+ surface; the composition layer joins catalogs by `package:id`. Consumer
135
+ composition catalogs use
136
+ [the composition extension schema](./ai/component-composition-extension.schema.json).
137
+ Load [compile-time contracts](./ai/compile-time-contracts-v1.json) for stable
138
+ `KUI-T###` ids, exact declaration symbols, and the boundary between rejected
139
+ source states and relationships that still require runtime/catalog checks.
140
+ Before generating application UI, discover `.kerf-ui-profile.json` with the
141
+ shipped [application profile API](./ai/application-ui-profile.mjs). Merge
142
+ package defaults, workspace policy, then parent-to-child directory policy;
143
+ honor its package-qualified preferences, approved theme/density, semantic
144
+ tokens, layout conventions, and narrow source-located exceptions. Validation
145
+ is catalog-aware per layer, including parent values later overridden by a
146
+ child; synchronous hosts use [application-ui-profile-sync.cjs](./ai/application-ui-profile-sync.cjs).
147
+ See the
148
+ [workspace profile example](./docs/examples/application-ui-profile.json).
149
+ A zone's optional `jsx.prop` is its only authoritative JSX binding; never
150
+ infer one from the zone id. Use `children` for one homogeneous primary
151
+ region and explicit named content prop slots for semantic positions or
152
+ replacement content. These slots use the recursive `KerfUiContent` type:
153
+ `SafeHtml`, runtime-empty boolean/nullish values, and readonly nested arrays.
154
+ Put conditionals and mapped component arrays directly in them; do not add a
155
+ `Fragment` only to satisfy types. Arbitrary strings, numbers, and signals are
156
+ rejected unless a component explicitly exposes a text position such as
157
+ `ListInsetText`. These are typed props, not native `<slot>` elements,
158
+ wrapper slot components, or a generic `slots` object. Leave unresolved
159
+ dynamic expressions unknown.
160
+ Stable single-root Kerf UI components separately accept the explicit native
161
+ `slot="name"` prop for light-DOM composition inside a custom element and
162
+ preserve it across rerenders. Do not infer arbitrary native-attribute
163
+ spreading from this narrow interop contract. `ResizableRegion` and
164
+ `CollapsiblePanel` remain excluded because their optional restore controls
165
+ make their output multi-root; `CollapsiblePanelToggle` remains slot-capable.
166
+ 4. **When authoring a component gallery**, load
167
+ [catalog-authoring.json](./ai/catalog-authoring.json), then follow its
168
+ authoritative [Catalog demo authoring contract](./docs/catalog.md#catalog-demo-authoring-contract).
169
+ Use its component/composition/recipe taxonomy and functional-group,
170
+ importance, alphabetical-tie, and recipes-last ordering policy. Focused
171
+ demos and recipes use public components plus `CatalogExample.viewport`,
172
+ never local stylesheets, inline styles, or styling-only classes. A frame
173
+ that a top-layer specimen anchors to takes `viewport.anchorName`, and a
174
+ centered column takes `viewport.contentWidth` + `contentAlign`.
175
+ 5. **Apply the rules below and in** [skill.md](./ai/skill.md).
176
+ 6. **Before calling an integration complete**, run
177
+ [`kerf-ui-doctor`](./docs/ui-doctor.md). Its portable JSON report merges
178
+ profile/catalog, TypeScript, Kerf ESLint, and static analyzer diagnostics;
179
+ CSS-adjacent component props are checked from catalog `cssValueProps`, so
180
+ prefer its canonical shorthand or typed helper over raw CSS strings; a
181
+ `--wa-color-{tone}-fill-loud` override without a governing `on-loud` (same
182
+ or ancestor scope, possibly in a co-loaded stylesheet), or whose literal
183
+ pair measures below 4.5:1, is review finding `KUI-L018` (set both); CSS that restyles a component
184
+ (`KUI-L019`), touches its private `--_*` variables (`KUI-L020`), overrides a token a typed prop sets
185
+ (`KUI-L021`), or styles it through a hook class on its root (`KUI-L022`) is an error: configure the
186
+ component instead, and report a component gap when no prop exists; application-component imports may use TypeScript `paths` aliases; use `"ownership": "component"` with catalog `styleSources` to apply this boundary between an app's own components; repair source-located errors until exit 0. Use full mode for release gates;
187
+ generated `dist`/`coverage`, dependency, cache, evidence, and nested-worktree
188
+ directories are excluded consistently from every static stage.
189
+ [`kerf-ui-analyze`](./docs/ui-analyzer.md) remains available when only static
190
+ layout diagnostics are wanted; its review findings are a bounded human/AI
191
+ review queue rather than an objective aesthetic score.
192
+ 7. **Evaluate the running application** by explicitly enabling the doctor's
193
+ browser stage or directly invoking
194
+ [`kerf-ui-evaluate`](./docs/ui-evaluator.md). Preserve its `KUI-B###`
195
+ browser evidence and screenshots; record hierarchy/rhythm/density/aesthetic
196
+ ratings separately with a named reviewer rather than presenting them as
197
+ objective assertions.
198
+
199
+ ## Application interaction choices
200
+
201
+ For ordinary server-backed freshness, prefer event-driven updates, subscriptions,
202
+ or explicit user refresh when they meet the product need. Use fixed-interval
203
+ polling when periodic sampling is genuinely required or no suitable update
204
+ channel exists; choose the interval deliberately and cancel the timer when its
205
+ owning view is disposed.
206
+
207
+ Make cursor cues match enabled behavior: use a pointer for actionable targets,
208
+ grab/grabbing or resize cues for actual drag and resize affordances, and a
209
+ default or disabled cue when an action is unavailable. Keep the semantic
210
+ control, keyboard behavior, focus treatment, and disabled state aligned with
211
+ the cursor; the cursor alone cannot explain an interaction. See
212
+ [accessibility contracts](./docs/accessibility.md) and
213
+ [interaction principles](./docs/apple-hig.md#interaction).
214
+
215
+ ## Interface copy capitalization
216
+
217
+ Follow Apple's split, the package default: **names are title style;
218
+ descriptions are sentence style.** Title style: buttons, menu items and menu
219
+ headings, popup-menu triggers, segments, `Select` choices, tabs,
220
+ page/view/pane/dialog/toolbar titles, back labels, `ListHeader` and column
221
+ headings, field labels, icon-only control names, and fragment
222
+ `EmptyState`/`StateBanner` titles ("Save Draft", "Back to Inbox"). Sentence
223
+ style: body copy, descriptions, details, messages, tooltips, placeholders,
224
+ checkbox/switch/radio option text, and status lines ("Saved just now"). Title
225
+ style capitalizes the first and last word and phrasal-verb particles ("Log
226
+ In"); it lowercases articles, coordinating conjunctions, `to` in infinitives,
227
+ `as`, and prepositions of four letters or fewer elsewhere. Keep brand spellings
228
+ and user data as written. `kerf-ui-doctor` reports violations in known
229
+ title-style labels as `KUI-D040`. See
230
+ [Writing interface copy](./docs/writing.md#capitalization).
29
231
 
30
232
  ## Core rules (do the right thing)
31
233
 
234
+ - **Prefer a Kerf UI component, then a native HTML element**, using each for
235
+ what it is good at. Kerf UI needs no Web Awesome; it is an optional
236
+ integration. Never render a `Discouraged` Web Awesome element (`wa-button`,
237
+ `wa-input`, `wa-checkbox`, `wa-select`, `wa-dropdown`, `wa-dialog`,
238
+ `wa-tab-group`, `wa-icon`, …); use the Kerf component that replaces it
239
+ (`Button`, `TextField`, `Checkbox`, `Select`, `PopupMenu`, `DialogSurface`,
240
+ `TabBar`, `LucideIcon`; see
241
+ [webawesome-migration.md](./docs/webawesome-migration.md)), and file a
242
+ component gap rather than dropping to the raw tag.
32
243
  - **Reach for the primitive, not for CSS.** The package is built to look right
33
- *unstyled*. Before adding `padding`, `margin`, `width`, `height`, `border`,
34
- `background`, a wrapper card, or a decoration, check whether the component, the
35
- pane, or the content-item already owns it — it almost always does. Prefer a
36
- component prop or a `--kui-*` token; write CSS only for genuinely new structure,
37
- and then only join a component's documented `publicClasses` (never reach in by
38
- tag/id/attribute or an unlisted class).
244
+ without an application customization layer. Before adding `padding`, `margin`,
245
+ `width`, `height`, `border`, `background`, a wrapper card, or a decoration,
246
+ check whether the component, pane, or content-item already owns it. Prefer a
247
+ component prop — `FloatingToolbar inset`, `DisclosureArrow size`, `ListHeader
248
+ headingLevel`, `SearchField clearIcon`, `ContentItem frame="framed"` for a
249
+ visibly bounded content item — over overriding its `--kui-*` token. CSS for genuinely new structure
250
+ belongs to the application-owned component that renders it and must not select
251
+ nested Kerf or Web Awesome components.
39
252
  - **Never double-inset.** A `.kui-pane` has no padding; its `.kui-content` children
40
- own the geometry (8px inline margin + 1px border + 8px padding). Do not add a
253
+ own the geometry (8px inline margin + 1px border + 8px padding). Render an
254
+ ordinary surface-like child as `ContentItem` (`@kerfjs/ui/content-item`) with
255
+ typed `frame` (`none`/`framed`) and `shape` (`rounded`/`pill`) props instead
256
+ of hand-writing `<div class="kui-content-item">`. For a chat transcript, set
257
+ `bubble="start"` (other participants) or `bubble="end"` with
258
+ `appearance="brand-loud"` (the person's own messages): the item fits its
259
+ message up to 80% of the row. Do not add a
41
260
  container padding on top of a content-item's own margin — pick one owner. Use
42
261
  `.kui-content` for 24px major vertical rhythm.
262
+ - **Opt into document globals explicitly.** Import `@kerfjs/ui/document.css`
263
+ once for border-box sizing, token-backed body/link presentation, inherited
264
+ native table-cell and form-control font metrics, zero body margin, and
265
+ zero-specificity semantic cursors for native controls (pointer, not-allowed
266
+ when disabled, text on text inputs). Put `.kui-app-root` on the one direct mount container only when a
267
+ percentage-height shell needs the provided `html` → `body` → app-root height
268
+ chain. Add `data-viewport="locked"` to that body-child root for a
269
+ full-viewport shell whose document never scrolls (`100dvh` and
270
+ `overflow: clip` on `html`, `body`, and the root). The baseline is not part of `styles.css` or component browser imports.
271
+ - **Use compact layout options where needed.** `Text flush lineHeight="tight"`
272
+ fits short dialog copy, and `Text align="center"` centers wrapping status
273
+ copy; `ValueTable density="compact"` reduces row spacing,
274
+ with public row column, padding, and gap tokens for specific metadata layouts.
275
+ `ToolbarText size="xsmall"` suits a dense rail heading. The
276
+ `SearchField` editor shrinks in narrow groups; its minimum width can be
277
+ set with `--kui-search-field-editor-min-width`.
278
+ - **Label read-only field previews.** Use `FieldLabel` from `@kerfjs/ui/text`
279
+ in `ListInsetControl sides="trl"` above a `ContentItem` value. Connect its
280
+ id to the preview group's `aria-labelledby`; use the live control's own
281
+ `label` while editing.
282
+ - **Use Toolbar zone options.** `responsive="trailing-priority"` moves an
283
+ expanded trailing control to a full second row at `responsiveAt`; the leading
284
+ title remains above it. Public leading-min-width, trailing-gap/justify, and
285
+ per-zone inline-padding tokens cover app-specific toolbar geometry.
286
+ In a stacked Toolbar, `ToolbarControlGroup placement="end"` places a collapsed
287
+ search at its row's trailing edge; `sizing="fill"` gives its expanded state a
288
+ full row and a reduced-motion-aware downward entrance.
289
+ `--kui-toolbar-inset: 0px` removes an embedded Toolbar's outer padding and
290
+ corresponding minimum-height allowance while preserving its zone gap and
291
+ safe-area compensation. For a shorter header embedded in a panel or card,
292
+ pass `density="compact"` (40px: a 34px control band and 3px block insets)
293
+ and give its groups `size="compact"`; never shrink a Toolbar with CSS.
294
+ Composites forward `density` from their `ToolbarConfig` (Workbench panel,
295
+ main, and bottom toolbars, CollapsiblePanel, NavStack, SplitView) and size
296
+ the groups they compose (panel toggles, the back button) to match; pass
297
+ `density` to `CollapsiblePanelRelocated` when its toolbar is compact.
298
+ - **Name panel toggles in title style.** A panel toolbar's
299
+ `toggle: { action, name }` uses `name` as the toggle group's accessible name
300
+ and in the default "Show …" / "Hide …" label, so pass a title-style panel
301
+ name (`name: "Navigator"` gives "Show Navigator"); it is never recapitalized.
302
+ - **Position region restore controls declaratively.** A ResizableRegion has a
303
+ background token, `contentOverflow="visible"` for an anchored popup,
304
+ top/bottom `restorePosition`, typed `restoreInset`, and
305
+ `restorePlacement="inline"` for normal flow. FloatingToolbar also has
306
+ `placement="inline"`, per-edge inset tokens, and `safeAreaInsets`.
307
+ - **Configure list rows through their APIs.** `ListItem density="spacious"`
308
+ gives option rows more room. `multiline` wraps labels, with
309
+ `multilineIconAlign="center"` when the icon should center on the whole copy.
310
+ `divider` owns row separators and `state="drag-target"` paints the drop
311
+ target. For lines only between rows, give every row but the last
312
+ `divider="after"` (the last `"none"`); a row's corners are flat wherever a
313
+ divider line meets them, so the group rounds only its outer corners on
314
+ hover and selection. For a reorderable list, set `draggable` + `itemId` on `ListItem`,
315
+ `ListItemLink`, or `ListActionRow` rows and call `wireListReorder` (from
316
+ `@kerfjs/ui/wire-list-reorder`) once; it paints the dimmed dragging rows and
317
+ the before/after insertion line, supports Alt+Shift+ArrowUp/ArrowDown, and
318
+ reports `{ listId, sourceIds, target: { id, position }, source }` for
319
+ `reorderListItems`. The `dragging` / `dropPosition` props render the same
320
+ states from app-owned drag state. For keyboard row navigation in a
321
+ `scrollable` List, call `wireListFocusScroll` (from
322
+ `@kerfjs/ui/wire-list-focus-scroll`) once: it scrolls a keyboard-focused row
323
+ whose focus ring crosses the clip into view in Firefox and Safari too.
324
+ Public ListItem tokens set row, icon, label, and trailing geometry;
325
+ ListHeader `size="xs|sm|m|l|xl"` sets label scale independently of
326
+ `headingLevel` (`sm` keeps the current FieldLabel-sized uppercase style;
327
+ `m`/`l`/`xl` match themed h5/h4/h3). The label is one ellipsized line;
328
+ set `wrap` where the whole label must stay readable in a narrow column
329
+ (it wraps instead of truncating). Its height, title padding, and border
330
+ tokens tune section density. A semantic `count` requires `countLabel` and
331
+ excludes other indicators; `badge` and `status` may render together, and
332
+ either may be explicitly `undefined` in conditional app state.
333
+ For a filled command list, scope `--kui-list-item-background`,
334
+ `--kui-list-item-color`, `--kui-list-item-border`,
335
+ `--kui-list-item-hover-background`, `--kui-list-item-hover-border`,
336
+ `--kui-list-item-selected-background`, `--kui-list-item-selected-color`,
337
+ and `--kui-list-item-selected-border` at the list or row boundary.
338
+ To align `ListItem` and `ListActionRow` rows in one list on a custom
339
+ leading inset, set `--kui-list-row-padding-inline` on the `List` (never
340
+ `--kui-list-item-padding-inline`, which moves only `ListItem` rows). Both
341
+ row kinds draw an 18px untiled leading icon by default, so their labels
342
+ align; resize both with `--kui-list-row-icon-size` on the `List` (never
343
+ `--kui-list-item-icon-size`, which resizes only `ListItem` icons).
344
+ - **Use `Row` for horizontal and `List` for vertical layout.** Both expose
345
+ physical `hAlign`/`vAlign` props and typed gaps. Row defaults to left/full,
346
+ an `xs` gap, and no wrapping; List retains full/top and zero-gap defaults.
347
+ Use canonical physical `textInsets` or `controlInsets` sides in
348
+ `t`/`r`/`b`/`l` order; text geometry wins on overlapping sides.
349
+ `ListInsetText` and `ListInsetControl` inset every side by default and accept
350
+ the same `sides` grammar for selective edges.
351
+ List additionally supplies
352
+ optional typed `gap`, `flex`, vertical scrolling, and canonical
353
+ `dividerSides` (`t`/`r`/`b`/`l` order). It adds no list semantics; children own
354
+ those, and only one bounded region should own scrolling. Pass a finite spacing
355
+ shorthand (`gap="xs"`, `gap="m"`) or a complete `CssLength` from the CSS-free
356
+ `@kerfjs/ui/css-values` builders; raw CSS strings are rejected. Use `flex()`
357
+ for List flex, typed lengths for Skeleton geometry, and
358
+ foreground colors for choice icons and `LucideIcon.color`: `uiColor()` with an `*-on-*`/text token,
359
+ `foregroundColorVar()`, or `foregroundColor()` for a custom CSS color; fill tokens such as `uiColor('success-fill-quiet')` do not
360
+ type-check. Fills (a `ChoiceChips` swatch, a row `iconTile` color) take a
361
+ plain `CssColor`: `fillColor('#3b82f6')` for a custom CSS color, `uiColor()`,
362
+ or `colorVar()`; never `foregroundColor()` for a fill. These brands are intentionally
363
+ not interchangeable; rows use classes/tokens/props rather than raw `style`.
364
+ Set `LucideIcon.inline` for an icon in `Text` or prose; it changes the SVG
365
+ from block to inline-block without changing its inherited 1em size.
366
+ - **Use `Grid` for equal-width columns.** Set a fixed positive `columns` count
367
+ or typed `minColumnWidth` for automatic container-width collapse, never both.
368
+ The app owns the outer width and child semantics; use custom CSS grid for
369
+ asymmetric/intrinsic tracks and `ResizableRegion` for adjustable boundaries.
370
+ `Grid.gap` and `Grid.flex` use the same typed grammars as Row.
371
+ `Grid.textInsets` and `Grid.controlInsets` select physical sides for the
372
+ standard 17px text and 8px control inset; text wins on overlap.
373
+ For selectable document tiles, use `selectionMode="multiple"` and a required
374
+ `ariaLabel`, with `ContentItem selectionMode="multiple"` children. Wire
375
+ `wireContentItems` for spatial arrow navigation, Enter/Space activation, and
376
+ one roving Tab stop per grid; a non-selectable row between them is a
377
+ `ContentItem gridRow` (row + gridcell, no selection).
378
+ Resolve each activation with `applySelection` and `selectionGesture` from
379
+ `@kerfjs/ui/selection` (plain replaces, Cmd/Ctrl toggles, Shift extends).
380
+ - **Give a layout root `fill`, not a frame `Pane`.** A Row, List, or Grid that
381
+ is the sole layout root of a definite-height parent takes its full height
382
+ with `fill` and carries safe `data-*` markers through `rootAttributes`.
383
+ Inside a flex layout use `flex` instead.
384
+ - **Keep Web Awesome on the shared inset tiers.** `webawesome.css` uses
385
+ `--kui-wa-control-inset` (8px controls/items) and
386
+ `--kui-wa-surface-margin` / `--kui-wa-surface-inset` (8px around/inside
387
+ Accordion, Card, Details, Callout, and Include), while
388
+ plain Details keep their body flush while plain Accordion items inset both
389
+ trigger and body, framed Details use the 16px container inset only on the
390
+ trigger, and framed Accordion items use it on both regions;
391
+ `--kui-wa-container-inset` keeps Tab Panel at 16px. Dialog body and footer use
392
+ the surface (8px) and container (16px) tiers respectively, independent of the
393
+ dialog's shared `--spacing`. Override the tier at the narrowest useful scope
394
+ instead of restyling individual shadow parts.
395
+ Filled badges use each semantic variant's quiet fill with normal text for
396
+ WCAG-AA compact-copy contrast. Override
397
+ `--kui-wa-badge-filled-background` and
398
+ `--kui-wa-badge-filled-foreground` as a contrast-safe pair instead of adding
399
+ host selectors.
400
+ When a dialog provides another dismissal affordance, add `hide-actions` to
401
+ the `wa-dialog` host; the theme hides its directly exported `header-actions`
402
+ part without an unsupported chained `::part()` selector.
403
+ Checkbox and Radio Group option regions and the Color Picker trigger stay
404
+ flush, so each box, circle, or swatch sits on the host's inline-start edge
405
+ like Kerf's `Checkbox`, `RadioGroup`, and `ColorField`, with the label and
406
+ hint on the 9px text column. Bordered fields and Switch draw their border or
407
+ track on that same edge like `TextField`, `Select`, and `Switch`, so place a
408
+ Web Awesome field exactly where the Kerf field would go.
409
+ Stacked radios sit 8px apart (`0.25em` block margins) for the same 28px
410
+ pitch as `RadioGroup`.
411
+ Slider's complete interactive region uses the shared 8px logical inline outer
412
+ inset without shifting its already-aligned label.
413
+ Known Date's Month/Day/Year captions and bordered text-like field hints align
414
+ with field values at the shared 9px border-plus-padding inset. OTP Input's
415
+ label uses the same uppercase xs/650 treatment and its label and hint share
416
+ that 9px alignment.
417
+ - `Select` requires a visible `label` or an `ariaLabel` for a visually hidden
418
+ accessible name. Set `multiple` with an array `value` for any number of
419
+ choices: the popup stays open while choices toggle and closes on an outside
420
+ press or Escape, and the closed control summarizes the chosen labels. A
421
+ toolbar filter menu adds `selectedPresentation="icon-only"` and a fixed
422
+ `triggerIcon`: the trigger shows that icon plus a count badge while any
423
+ choice is chosen, and its accessible name ends with the chosen labels.
424
+ Set `caret={false}` on an icon-only toolbar Select to make a round trigger;
425
+ a custom `renderSelected` icon stays centered, and the default keeps the
426
+ visible caret.
427
+ `SelectChoice.disabled` keeps an unavailable option visible but unselectable;
428
+ `disabledReason` adds its tooltip. For multiple selects, opt in to
429
+ `selectAllLabel` and `clearLabel` footer buttons to select enabled choices
430
+ or clear the value through ordinary change events. The app owns the updated
431
+ controlled value and localized action labels.
432
+ Icon-only Selects (single or multiple) and icon-only `PopupMenu`s show an
433
+ `aria-hidden` help tag repeating that name (and a Select's
434
+ choice) on hover and keyboard focus, hidden while the popup is open; the
435
+ register import installs it, so do not add a `title` or tooltip of your own.
436
+ The same installer tags an icon-only `<button>` or link inside a
437
+ `ToolbarControlGroup` named by `aria-label` (no visible text or `title`);
438
+ import `@kerfjs/ui/help-tags/register` once when a toolbar has such buttons
439
+ but no registered Select or PopupMenu.
440
+ The package names the internal combobox, including custom
441
+ selected content; consumers do not need shadow-DOM naming workarounds.
442
+ Import `select/register` once for the canonical animation lifecycle: stale
443
+ close/show completions cannot override a later request. Consumers must not
444
+ repair popup timing or anchor placement; raw Web Awesome selects stay native.
445
+ Use `hint` for supporting text below the control and `placeholderText` only
446
+ for the empty value inside it; loading placeholders retain the visible hint.
43
447
  - **Trust the defaults.** Render a control at its natural size and color (a
44
448
  `LucideIcon` is 24px); if it looks wrong, fix the surrounding layout, not the
45
449
  control. Never force a component's width/height to size it — that leaves a halo
46
450
  or a stretched oval.
451
+ - **Make room for an expanded search instead of growing it past what fits.** A
452
+ collapsible search group grows into the space beside its sibling groups; if
453
+ that space is too small, the siblings wrap onto a new row while it opens.
454
+ Size the expanded search to what fits (`--kui-search-field-expanded-width`,
455
+ or `sizing="grow"` with a `growBasis` that fits), and if a useful search
456
+ cannot fit beside the other controls, set aside those controls while the
457
+ search is open: mark them `visibility="yield-to-expanded-sibling"` (they
458
+ leave a 480px-or-narrower toolbar while a sibling is expanded), or, in a
459
+ `responsive="trailing-priority"` Toolbar, `visibility="yield-to-priority-row"`
460
+ (they leave exactly while the expanded control has its own row, from the
461
+ Toolbar's `responsiveAt`; never restate that breakpoint with `hideBelow`,
462
+ whose strict "below" is one pixel off the Toolbar's inclusive width), or
463
+ gather them behind a "…" `PopupMenu` overflow group. The app decides which
464
+ controls yield.
465
+ - **Change the brand with `--kui-color-brand`.** Set it once on `:root` (any
466
+ color): Kerf derives the brand fill, brand text and links, text on brand
467
+ fills, and the focus ring at WCAG AA, and Web Awesome's brand tokens follow.
468
+ Overriding `--kui-color-brand-fill-loud` alone leaves brand text and the
469
+ focus ring blue.
47
470
  - **Toolbars hold only `ToolbarText` and `ToolbarControlGroup`.** Never put a bare
48
471
  button, input, link, or loose markup in a `leading`/`center`/`trailing` zone.
49
472
  Wrap every control — `SegmentedControl`, `Select`, a collapsible
50
- `TokenSearchField`, Web Awesome controls — inside a `ToolbarControlGroup`. A
51
- toolbar popup menu is a `single` `ToolbarControlGroup` around a `wa-dropdown`
52
- (its `slot="trigger"` `wa-button` is the toolbar button, kept under
53
- `data-morph-skip-children`).
54
- - **`PanelHeader` is *the* panel/dialog/page heading.** A plain toolbar with an
55
- optional bordered icon group, an extra-large `ToolbarText` title, the trailing
56
- controls you pass, and an optional subtitle below — do not hand-build a heading
57
- row or restyle a toolbar into one.
473
+ `SearchField`, Web Awesome controls — inside a `ToolbarControlGroup`. For an
474
+ ordinary icon/action control inside the group use a **plain `<button>`** (the
475
+ group styles it fully) — that is the default; a standalone `Button` belongs
476
+ outside a group. A toolbar popup menu is a `PopupMenu`
477
+ (`@kerfjs/ui/popup-menu`, registered once via `@kerfjs/ui/popup-menu/register`)
478
+ in a `single` `ToolbarControlGroup` with `nestedDropdown`; never hand-write
479
+ `wa-dropdown` markup for a menu. Let the group size the trigger from its icon,
480
+ localized text, and caret. Set `overflow="wrap"` for independent action links
481
+ that must remain fully visible at narrow widths; whole links move to a second
482
+ row, as in the catalog resource footer. `PopupMenu` items also support nested `submenu`
483
+ actions, headings, dividers, checked or trailing choice marks, danger tone,
484
+ and disabled reasons; nested headings/dividers stay out of keyboard choices;
485
+ a choice dispatches its `data-action` plus a bubbling `kui-menu-select` event whose
486
+ `detail.checked` is the state a checkbox choice asks for (the app owns and
487
+ renders that state);
488
+ use `context` with `anchor` + `openPopupMenu` (or `openPopupMenuAt`) and
489
+ `closePopupMenu` for pointer-anchored row menus, whose `placement` applies
490
+ at the point (`top-start` opens above it); the menu owns its
491
+ zero-footprint anchor host, so add no wrapper or CSS. `openPopupMenuAt`
492
+ also opens a button-triggered menu at the pointer for one opening
493
+ (`bottom-start`, or `openPopupMenuAt(menu, x, y, { placement: 'top-start' })`
494
+ to open above the point). A row's
495
+ trailing "…" overflow menu is `ListActionRow`'s `trailingMenu` (`label`,
496
+ `icon`, `items`, optional `placement` and `disabled`), which renders a
497
+ `PopupMenu` as the row's sibling trailing control. Do not force a dropdown or button width. Nothing
498
+ wraps inside a group: an icon sits beside its label on one row, and a
499
+ `ToolbarText` is one ellipsized line unless you opt into `wrap`/`maxLines`. A
500
+ Select or PopupMenu trigger drops its focus ring while its popup is open and
501
+ the ring follows the control's shape; never add ring CSS. Compact
502
+ mixed groups keep standard item padding and raised selected chrome without an
503
+ internal separator; the selected item paints over the outer border. For an
504
+ avatar control, set `content="avatar"` and `avatarImage` on the group instead of
505
+ inserting an `img`; a lone control paints the group and a multi-button group
506
+ paints only its pressed highlight. Dividers earn their place: a `Toolbar`
507
+ draws none by default and pinned chrome gets its line from scroll state (see
508
+ the scroll-divider rule below); never fake one with a border or pad below a
509
+ divider to make it look right.
510
+ - **Use one direct toolbar composition for panel/dialog/page headings.** Put an
511
+ optional icon in a `ToolbarControlGroup`, an extra-large `ToolbarText` directly
512
+ in the leading zone, and actions in a trailing group. A short supporting
513
+ line ("Changes save automatically.") is the `ToolbarText` `description`:
514
+ quiet, one truncating line under the title, aligned with its text, with
515
+ `descriptionId` for `aria-describedby`. Longer copy is app-owned content
516
+ below. Do not create a private heading wrapper or restyle the
517
+ toolbar. A narrow peripheral rail or drawer, where extra-large would truncate
518
+ at its minimum size, names itself with the default `ToolbarText` size.
519
+ `ToolbarText size="xlarge-fixed"` keeps the 20px `--kui-font-l` heading step;
520
+ `xlarge` retains the responsive page-title clamp.
521
+ - **Use `Text` for ordinary semantic headings, paragraphs, and inline secondary
522
+ text outside toolbar title zones.** Omit `variant` for the default `p`, pass
523
+ `h1`–`h6` based on the document outline, or use `variant="span"` inside a row,
524
+ label, or table cell without adding box geometry. Independently compose `tone="quiet|danger"`,
525
+ `size="compact|large|xlarge"`, and `font="monospace"` for supporting, error,
526
+ compact, prominent, display, and code roles instead of global utility classes. It passes native attributes
527
+ through; block variants own the standard transparent border plus item padding, while `span` owns none. Keep
528
+ toolbar titles on `ToolbarText` and list-aligned bare prose on `ListInsetText`.
529
+ Text supports `controlMargins` with canonical physical Sides for an exterior 8px control gutter; it preserves border/padding and avoids an isolated Row wrapper. Avoid stacking it with parent insets. Inline spans retain native inline margin behavior.
530
+
531
+ `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.
532
+ `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.
533
+ `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.
534
+ Toolbar zones accept `KerfUiContent` directly. Use `ToolbarText` for identity and `ToolbarControlGroup` for related controls that need its shared chrome; a bare control keeps its own styling and accessibility responsibilities.
535
+ Expanded search groups accept `expandedOverflow="visible"` to anchor app-owned suggestion/date/help surfaces below their relative root; collapsed/default groups retain existing clipping. Apps own surface placement/dismissal and use `data-search-field-keep-open` or `collapsible.keepOpenOn` for focus.
536
+
58
537
  - **Space by the five-step scale, by relationship not by eye.** `0`
59
538
  `--kui-space-none`, `4px` `--kui-space-2xs`, `8px` `--kui-space-xs` (inside a
60
539
  group), `16px` `--kui-space-m`, `24px` `--kui-space-l` (between major differing
61
- regions). 12px/32px are off-scale exceptions.
540
+ regions). 12px/32px are off-scale exceptions. Prefer direct `Row.gap`/`List.gap`
541
+ shorthands for repeated rhythm; use `Spacer` for one typed empty width/height
542
+ or flexible main-axis gap. Use `space`, `px`, `rem`, `em`, `pct`, `lengthVar`, and
543
+ `calc(plus(...))` for typed runtime composition. `remify()` is source-CSS only.
544
+ - **Keep nested highlight corners concentric.** Inset hover and selection surfaces
545
+ follow the owning control's pill or rounded shape; their radius is the outer
546
+ radius minus `--kui-layout-highlight-inset`. Do not give an inner highlight an
547
+ unrelated radius.
62
548
  - **Panes share one child-owned geometry.** Sidebars, main areas, inspectors, and
63
- dialogs all use an unpadded `.kui-pane` (optional `.kui-pane__toolbar`, one
64
- scrolling `.kui-pane__content`, optional `.kui-pane__footer`). A visible pane owns
65
- its collapse control; a hidden pane's restore moves to the adjacent main
66
- toolbar's matching edge — no icon-only rail. Keep one scroll owner per region.
549
+ dialogs all render `Pane`: an unpadded `.kui-pane` (optional header, one
550
+ scrolling `.kui-pane__content`, optional footer). Use `tabIndex={0}` for a
551
+ whole-surface Tab stop or `-1` for programmatic
552
+ focus on Pane, SunkenPanel, static ContentItem, or a plain TabNavigator scene;
553
+ `outlined` holds its standard focus ring for an app state such as a drop target.
554
+ Workbench uses `mainTabIndex`/`mainOutlined` for the center and
555
+ `tabIndex`/`outlined` per rail or drawer. Hidden scenes and collapsed panels
556
+ suppress those states. Never write a component's anatomy classes onto your
557
+ own element to recreate it (`KUI-L103`); only the catalog's `placeableClasses`
558
+ (layout utilities, `.kui-app-root`,
559
+ `.kui-content-item` on a non-div carrier) belong there. A visible pane owns
560
+ its collapse control (the last control of its last group); a hidden pane's
561
+ restore moves to the adjacent main toolbar's matching edge — no icon-only
562
+ rail — and a collapsed drawer's restore sits in the bottom toolbar or a
563
+ `FloatingToolbar` beside the drawer, near where its effect appears. Align
564
+ text to text and icons to icons across a pane; a border is decoration, never
565
+ the alignment anchor. Keep one scroll owner per region.
566
+ - **Dividers between pinned chrome and scrolling content are scroll state.**
567
+ Toolbars draw no divider by default. Call `wireScrollDividers(appRoot)`
568
+ (`@kerfjs/ui/wire-scroll-dividers`) once and keep its disposer: every `Pane`
569
+ with `chromeDividers="scroll"` then draws the line under its header only while content is scrolled beneath
570
+ it and the line over its footer only while more content lies below (never
571
+ when the content fits), every `NavStack`'s top chrome and bottom toolbar and
572
+ every `TabNavigator` bar do the same around the active view or scene, and
573
+ every `TabBar` marks each side of its strip with tabs scrolled out of view. Configure a pane with `chromeDividers`
574
+ (`scroll` for a plain pane by default, `always` for a sunken pane by default,
575
+ or explicit `scroll`, `always`, `none`), and a `NavStack` or `TabNavigator`
576
+ with its own `chromeDividers` (same values; a `SplitView` forwards it through
577
+ `compactStack`); name app-owned chrome in `targets`.
578
+ A `TabNavigator` also takes `separator="auto" | "hidden"`: auto draws the
579
+ bar's top edge beside a sunken active scene or nested Pane even when content
580
+ fits; hidden suppresses that edge, including scroll dividers.
581
+ Never add a border, or a permanent `dividerSides`, to fake one.
582
+ For a header that floats over its scrolling content, set
583
+ `headerPresentation="overlay"` on the `Pane` (or in `PaneConfig`). It paints
584
+ the translucent chrome material (`--kui-chrome-material`, opaque under
585
+ reduced transparency, increased contrast, forced colors, a slow-updating
586
+ display, and the app-set `data-kui-effects="static"` root switch). The same
587
+ `wireScrollDividers` call measures the header and publishes its height as
588
+ block-start scroll clearance, which the content clears automatically. Keep
589
+ overlay-header text in the normal text color.
590
+ For a translucent stack bar laid over the active view, set
591
+ `chromePresentation="overlay"` on the `NavStack`. `wireNavStack` measures
592
+ the top chrome and hands its height (top safe area included) to the views
593
+ as their block-start inset, so a plain view or a sole `Pane` clears it
594
+ automatically. Keep its text in the normal text color. For a translucent
595
+ bottom toolbar, set `bottomToolbarPresentation="overlay"` (separate from
596
+ `chromePresentation`); `wireNavStack` hands its height (bottom safe area
597
+ included) to the views as their block-end inset, so the last item rests
598
+ just above it. Its `ToolbarText` and default-tone `ToolbarControlGroup`
599
+ controls lift themselves to AA. For a translucent tab bar, set
600
+ `barPresentation="overlay"` on the `TabNavigator`; `wireTabNavigator`
601
+ measures the bar and the scenes hand its height to their content as the
602
+ block-end inset. Its tab labels lift themselves to AA.
603
+ While a side overlay is open (a Workbench rail overlay, a `wireSidebar` compact
604
+ overlay, an overlay `CollapsiblePanel` or horizontal `ResizableRegion`), the
605
+ layout hides the covered work area's `FloatingToolbar`s and restore corners
606
+ itself (unfocusable, out of the accessibility tree) until it closes — do not
607
+ hide them from overlay state yourself.
67
608
  - **State and behavior live in the app.** Components take semantic `data-action`
68
609
  strings and controlled values; wire them once with `delegate()`/`delegateActions()`
69
610
  or the disposer-returning `wire…` helpers, and own domain copy, transport, and
@@ -72,60 +613,408 @@ maintain a central style list. Configure JSX with `"jsxImportSource": "kerfjs"`.
72
613
  - **App state is domain/persisted; helpers own only ephemeral mechanics.** Keep
73
614
  navigation stacks, tab selection and order, pane sizes, and `collapsed`/`expanded`
74
615
  disclosure flags in the app — they are data or persisted layout, and the app reads
75
- them to render. The `wire…` helpers own the *ephemeral* parts: `wireNavStack` the
76
- push/pop animation, `wireTabBars` the overflow autoscroll and drag preview,
77
- `wireResizableRegions` the live drag preview; they report committed changes via
78
- callbacks. The one richer case is `wireTokenSearchFields`, which manages the
616
+ them to render. The `wire…` helpers own the _ephemeral_ parts: `wireNavStack` the
617
+ content-slide, per-view top/bottom chrome cross-fade, and focus move/restore
618
+ (mark a preferred new-view target with `data-nav-focus`), `wireTabBars` the
619
+ overflow autoscroll, drag preview, and
620
+ replacement focus after controlled automatic tab activation,
621
+ `wireResizableRegions` the live drag preview, `wireScrollDividers` the
622
+ scroll-state attributes from which a `Pane` draws its chrome dividers and a
623
+ `TabBar` its overflow dividers; they report committed changes via
624
+ callbacks. For a tab-local action plus a separate far-edge action, set
625
+ `TabBar trailingPlacement="adjacent"`, put the local action in `trailing`, and
626
+ the workspace action in `end`; the component keeps both visible while its tab
627
+ list shrinks and scrolls, without application descendant CSS. Each action
628
+ zone accepts one ToolbarControlGroup, standalone Kerf `Button`, or exceptional
629
+ Web Awesome `wa-button` for its own chrome. Managed
630
+ SearchField clear also preserves open state and replacement
631
+ editor focus before the next input task, so shortcut-letter typing stays in search.
632
+ Select All deletion does the same; deletion
633
+ restoration finishes before the next keystroke rather than on a delayed frame.
634
+ Persist both query and remaining tokens read from an edited field; change
635
+ `revision` to replace unmanaged DOM-owned text programmatically, or call
636
+ `model.replace({ query, tokens })` for a model-managed field. In grammar-assisted
637
+ search, a model rule's `suggest(input, state)` receives current committed tokens
638
+ so suggestions can omit selected values; one-argument callbacks still work.
639
+ A sibling helper can call `model.commit(value)` for the active `name:` prefix
640
+ even when that value is not suggested; invalid values and missing prefixes
641
+ leave state unchanged.
642
+ A managed field subscribes the host render only to `model.structure`
643
+ (committed tokens, empty or non-empty text, editor revision), so typing plain
644
+ text never re-runs it; in the host's own render read `model.state.peek()` and
645
+ bind `model.result` as a signal hole instead of reading `model.state.value`.
646
+ The one richer case is `wireSearchFields`, which manages the
79
647
  collapsible field's expand/collapse/focus by default (on, per-behavior opt-out) and
80
648
  exposes the `expanded` signal on its handle — bind it in render or hand in your own
81
649
  via `collapsible.signals`. Do not hand-roll open/collapse/focus that helper
82
650
  provides; but do keep a plain disclosure toggle (a one-line boolean the app already
83
651
  renders from) in the app. For real-app composition it also offers a focusout
84
- keep-open exception (`data-token-search-keep-open` regions or `collapsible.keepOpenOn`,
652
+ keep-open exception (`data-search-field-keep-open` regions or `collapsible.keepOpenOn`,
85
653
  so a sibling suggestions/date popover does not collapse an empty field), opt-in
86
654
  atomic-chip keyboard (`keyboard`: Backspace/Delete remove the adjacent chip via
87
655
  `onRemoveToken`, ArrowRight moves the caret past a trailing chip), and an
88
656
  `onEdit({id, editor, event})` input callback (the `InputEvent` lets you gate on `inputType`/`data`) — so the app can drop its own keydown/input
89
657
  boilerplate while still owning parsing and controlled token state.
658
+ When `onEdit` or `onRemoveToken` changes tokens and the controlled render
659
+ replaces the focused editor, the helper hands focus and caret to the new
660
+ editor in the same task (end stays at end), so do not add a refocus
661
+ `MutationObserver` or `requestAnimationFrame`.
90
662
  - **Placeholder loading state, don't rebuild it.** For a value or component that is
91
663
  still loading, set `placeholder` on the component (`Select`, `ListHeader`,
92
- `ListItem`, `ValueTableRow`, `PanelHeader`, `SegmentedControl`, `StateBanner`,
93
- `AppTab`, `ToolbarText`, `ListActionRow`): it renders its real chrome with value
94
- slots as subtle **unanimated** skeleton blocks and interactivity disabled, so a
95
- parent composes a faithful loading view (e.g. an inspector) without hand-rebuilding
96
- markup. Use the standalone `Skeleton` for a custom slot. Prefer it over `wa-skeleton`
97
- (the pure-Kerf primitives avoid Web Awesome), and never animate it — use
98
- `LoadingSpinner` for known busy activity instead.
664
+ `ListItem`, `ValueTableRow`, `SegmentedControl`, `StateBanner`,
665
+ `TabBarItem`, `ToolbarText`, `ListActionRow`): it renders its real chrome with value
666
+ slots as subtle **unanimated** skeleton blocks and interactivity disabled. Only
667
+ unknown values change: a placeholder is never dimmed or styled as disabled (a
668
+ control you disabled keeps its live disabled tone), so a parent composes a
669
+ faithful loading view (e.g. an inspector) without hand-rebuilding markup.
670
+ Component-drawn chrome stays live: a `ListItem` or `ListActionRow` keeps its
671
+ `busy` spinner while its `status` (and a `ListItem`'s `trailing`) content
672
+ become skeletons. Use the standalone `Skeleton` for a custom slot. Prefer it over `wa-skeleton`,
673
+ and never animate it — use
674
+ `LoadingSpinner` for known busy activity instead. Set its `size` prop to a
675
+ named icon step or positive pixel number when the inherited 1em is unsuitable.
676
+ - **Keep ListItem content inside the row.** The rounded `ListItem` root clips
677
+ overflowing label, status, and dormant trailing content. Set `multiline` when
678
+ the primary label should wrap; use `ListActionRow` instead when trailing content
679
+ must be interactive.
680
+ - **Dialog bodies are lists by default.** Compose rows and sections in `List`,
681
+ use `DialogSurface bodyInset="none"` when those children own their geometry,
682
+ and wrap bare prose in `ListInsetText` so it shares the standard list gutter
683
+ without stacking a second body inset.
684
+ - **Use a StateBanner badge only for compact supporting status.** Pass the
685
+ optional string `badge` for a terse count or status beside the title. It
686
+ inherits the banner tone and is announced with the banner, so keep its text
687
+ meaningful and never rely on color alone.
688
+ - **Configure StateBanner copy and action placement.** `copyLayout="stacked"`
689
+ puts detail below the title and badge; `actionPlacement="below"` always
690
+ gives the action a separate trailing row. The default trailing action stays
691
+ beside the copy while it has room and wraps onto its own trailing row on a
692
+ narrow banner, so do not switch placement per breakpoint.
693
+ `presentation="strip"` renders a flush, square, full-width band for a
694
+ layout edge with tone-colored `dividerSides` (bottom by default) instead of
695
+ the inset rounded card; never restyle a card into a strip.
696
+ - **Use `SplitButton` for a primary action with options.** One loud semantic
697
+ fill with a native primary button and an options trigger (`aria-expanded`,
698
+ `aria-haspopup`); `tone`, `fill`, `shape` (`rounded` or `pill`, as on
699
+ `Button`), `busy`, and `disabled` are props. Never build one from
700
+ `wa-button-group` or app CSS on native buttons.
701
+ - **Keep a Button's focus ring inside a clipping ancestor with
702
+ `focusRingInset`.** `Button` and `SplitButton` draw the ring 1px outside the
703
+ box; inside a container that clips overflow, set `focusRingInset` and the
704
+ ring moves inside the box with a surface-colored line inside it, so it keeps
705
+ 3:1 contrast even on a loud fill of its own hue. The line follows the
706
+ surface context sunken, quiet, raised, and highlighted surfaces, app
707
+ `background` colors, and glass chrome publish
708
+ (`--kui-color-surface-current`, `-region`, `-tint`), so it never reads as a
709
+ halo there. Never re-offset the outline from app CSS.
710
+ - **Span a full-width primary action with `fill`.** `<Button tone="brand" fill action="create">Create Project</Button>`
711
+ spans the parent's available inline width instead of shrinking to its
712
+ label, with the label centered and ellipsized once it no longer fits; a
713
+ link (`href`) fills the same way. It is the same `fill` `SplitButton`
714
+ takes. Never set `width: 100%` on a Button from app CSS.
715
+ - **Make any `Button` a toggle with `pressed`.** In content or a pane footer,
716
+ `<Button icon={…} ariaLabel="Show Conversation" emphasis="plain" pressed={open} action="toggle-chat" />`
717
+ renders a native `aria-pressed` button whose pressed look draws on top of
718
+ its tone and emphasis; the app flips the state. Never wrap a
719
+ `ToolbarControlGroup` outside a toolbar or restyle a button to fake it.
720
+ - **Mark a current setup step with `Button.currentStep`.** It emits
721
+ `aria-current="step"` on a button or link, including a disabled current step.
722
+ The app owns the step label and which step is current. See `docs/button.md`.
723
+ - **Let an icon-state toggle skip selected chrome.** When a pressed toggle's
724
+ glyph already shows its state (an empty or filled star), set
725
+ `data-selected-chrome="none"` on that button, or `selectedChrome="none"` on
726
+ its `ToolbarControlGroup`; never override the group's pressed-button styles.
727
+ - **Lay out a `ValueTable` through its props.** `labelWidth` sets a minimum
728
+ label column, `presentation="stacked"` puts values under labels, and
729
+ `stackBelow="compact" | "narrow"` stacks only while the table is narrower
730
+ than 512px/576px; do not override `--kui-value-table-row-columns`.
731
+ - **Show selectable item summaries with `SummaryRow`.** One `role="option"`
732
+ per item as a list `row` or board `card`, with a state `rail`, a clamped
733
+ `title`, `trailingMeta`, a `metadata` line, `selected`, `dimmed`, and
734
+ `listEdge` rounding; the app owns the listbox and keyboard movement. Never
735
+ hand-roll ticket-row chrome.
736
+ - **Group settings rows in `FramedList`.** For rows of arbitrary content in
737
+ one rounded frame with dividers between them (settings, account cards,
738
+ shortcut lists), compose `FramedListRow`s; `ValueTable` is the same frame for
739
+ label/value facts. Never hand-roll a `ul` with borders and row padding.
740
+ - **Bound a result picker with a framed `List`.** For a bordered, scrolling
741
+ list of `ListItem` rows (search results, duplicate candidates), use
742
+ `<List scrollable frame maxHeight={rem(14)} minHeight={rem(4.25)}>`:
743
+ `frame` draws a 1px neutral border, the control radius, and a 4px inset
744
+ that keeps the first and last rows' focus rings inside the clip, and the
745
+ typed `CssLength` bounds need no flex-column ancestor. Never wrap a List in
746
+ an app div with `max-height`, `overflow`, and a border.
747
+ - **Use `Button` for every standalone action, icon-only included.**
748
+ `Button` (`@kerfjs/ui/button`) is a native button in a `tone` (`neutral`,
749
+ `brand`, `success`, `danger`) and an `emphasis` (`primary`, `secondary`, `plain`), at
750
+ the 44px control height or `size="compact"`, with an optional `icon`,
751
+ `loading`, `href`, form `type`, `shape` (`rounded` or `pill`), and `pressed`
752
+ for a toggle. With an `icon` and `ariaLabel` but no label it is an icon-only
753
+ square (a circle as a pill). Brand secondary/plain labels darken the brand
754
+ token in light mode to stay legible on a quiet hover fill. Inside a `ToolbarControlGroup`
755
+ keep a native `button`; the group owns its geometry.
756
+ - **Paint a strip's surface with `List surface`.** `surface="base"` or
757
+ `"raised"` fills a List and its insets with a solid surface (a banner strip
758
+ above a sunken work area); never wrap it in app CSS that sets a background.
759
+ - **Use `TextField` for free text.** `@kerfjs/ui/text-field` is a native
760
+ input in one labeled box: `label` (or `ariaLabel`), `hint`, and `error` (its
761
+ description; an error marks it invalid), an optional `icon` and `clearable`
762
+ button, `multiline` with `rows` and a growing `maxRows`, and `maxLength` with
763
+ `showCount`, at the 44px height or `size="compact"`. Call
764
+ `wireTextFields(root)` (`@kerfjs/ui/wire-text-fields`) once for clearing and
765
+ counting. For `type="number"`, pass native `min`, `max`, and `step` as numbers
766
+ or strings (`step="any"` accepts arbitrary decimals). For `type="date"`,
767
+ pass an ISO date string and use the browser's native picker. `autofocus`
768
+ forwards to the native input or textarea for insertion and dialog open.
769
+ Never render `wa-input`
770
+ or `wa-textarea` for a form field.
771
+ - **Use `Checkbox`, `CheckboxGroup`, `RadioGroup`, and `Switch` for native
772
+ toggles.** `@kerfjs/ui/checkbox` (with `indeterminate` and
773
+ `wireCheckboxes(root)` from `@kerfjs/ui/wire-checkboxes`),
774
+ `@kerfjs/ui/checkbox-group` (`label`, `name`, `choices`, an array `value`;
775
+ a labeled set laid out like RadioGroup), `@kerfjs/ui/radio-group` (`label`,
776
+ `name`, `choices`, `value`; one Tab stop, arrow keys), and
777
+ `@kerfjs/ui/switch` (`role="switch"`, only for a setting that applies
778
+ immediately) draw Kerf boxes over native inputs with hint and error text.
779
+ Stack standalone Checkboxes in a `List gap="xs"`: 8px apart, the same 28px
780
+ pitch as `RadioGroup` and `CheckboxGroup` choices. Never render
781
+ `wa-checkbox`, `wa-checkbox-group`, `wa-radio-group`, or `wa-switch`.
782
+ - **Use `Combobox` to pick or create a value by typing.** A themed native
783
+ input on the ARIA combobox pattern with filtered suggestions and an optional
784
+ create option; `wireComboboxes(root, { onCommit })` reports `{ id, value,
785
+ created, input }`. Never use a hand-styled `<input list>` + `<datalist>`.
786
+ - **Pick or drop files with `FilePickerTrigger` / `FileDropZone`.** Both wrap
787
+ a real, visually hidden file input; `wireFilePickers(root, { onFiles })`
788
+ reports browsed and dropped files and highlights the zone while dragging.
789
+ Never hand-style a file input, its label, or a dashed drop target.
790
+ - **Swap content in place with `ContentSwap`.** Two sides share one cell;
791
+ `active`, `transition` (`push`, `crossfade`, `none`), and `direction` drive
792
+ Kerf-owned motion with an inert, hidden inactive side and reduced-motion
793
+ fallback. Use `NavStack` for full views with toolbars.
794
+ - **Lay out a kanban board with `ColumnTrack`.** Equal columns that never
795
+ narrow below `minColumnWidth` scroll sideways; `layout="paged"` pages one
796
+ column at a time with a peek and snapping. Never re-track a `Grid` or
797
+ hand-roll scroll-snap CSS.
798
+ - **Show ambient activity with `EdgeActivityIndicator`.** A layout-free,
799
+ pointer-inert top-edge strip whose bars ripple while `busy`, with an optional
800
+ polite `message` pill; Kerf owns the wave and reduced motion. Never hand-roll
801
+ fixed bars, keyframes, or a hanging pill in app CSS.
802
+ - **Host app-level progress in `CornerStatus`.** For a non-dismissible
803
+ "Loading…" or "Updating… N of M" with no home beside the affected work, put
804
+ a `StateBanner` (`urgency="status"`) inside `CornerStatus` and call
805
+ `wireCornerStatus` once: a top-layer manual popover at a safe-area-aware
806
+ corner, with no close button, light dismiss, Escape, or focus change. Never
807
+ position a banner with fixed-position CSS or hide a toast's close part.
808
+ - **Style transient toasts with `@kerfjs/ui/overlay-toast.css`.** Import it
809
+ once and call `toast()` from `kerfjs/overlay` with `exitClass:
810
+ 'kui-toast-exit'` and `exitDuration: 200`: a bottom-edge, safe-area-aware
811
+ stack on the raised surface, `variant` tones, a `StateBanner` as the only
812
+ content, and reduced-motion-aware motion. Never use `wa-toast`.
813
+ - **Style hover tooltips with `@kerfjs/ui/overlay-tooltip.css`.** Import it
814
+ once and call `tooltip(anchor, content)` from `kerfjs/overlay` with
815
+ `exitClass: 'kui-tooltip-exit'` and `exitDuration: 100`: the help tag's look,
816
+ wrapping at 40 characters. Icon-only Kerf controls already get help tags.
817
+ Never use `wa-tooltip`.
818
+ - **Show and hide content with `Disclosure`** (`@kerfjs/ui/disclosure`): a
819
+ native details element with a DisclosureArrow on content-item geometry,
820
+ `plain` / `framed` / `sunken`, or `embedded` inside a `ContentItem` (no
821
+ margin, border, or padding of its own, a compact summary, `flush` `Text`
822
+ content); Disclosures sharing a `name` form an accordion. Never use `wa-details` or `wa-accordion`.
823
+ - **Show progress with `ProgressBar` or `ProgressRing`** (`@kerfjs/ui/progress-bar`,
824
+ `@kerfjs/ui/progress-ring`): `value` of `max` (omit `value` for
825
+ indeterminate), a `label`, `valueText`, tones. Never use `wa-progress-bar` or
826
+ `wa-progress-ring`.
827
+ - **Pick a value on a range with `Slider`** (`@kerfjs/ui/slider`): a native
828
+ range input drawn as a track, fill, and thumb, with `showValue`/`unit`,
829
+ `ticks`, and `hint`; call `wireSliders(root)` once. Never use `wa-slider`.
830
+ - **Collect tags with `TagField`** (`@kerfjs/ui/tag-field`): SearchField's
831
+ token editor as a form field, a hidden input per tag; call
832
+ `wireTagFields(root, { onChange })` and re-render. Never use `wa-tag-input`.
833
+ - **Pick from a fixed palette with `ColorSwatches`** (`@kerfjs/ui/color-swatches`):
834
+ a native radio group of named round swatches, one Tab stop, a ring that
835
+ does not depend on hue, and a `'transparent'` no-color swatch.
836
+ - **Choose any color with `ColorPicker`** (`@kerfjs/ui/color-picker`): an area,
837
+ channel sliders that follow the color model (R/G/B, H/S/L, H/S/B, or gray)
838
+ plus opacity, RGB/HSL/HSB/Grayscale fields, hex, presets, and
839
+ samples; call `wireColorPickers(root, { onChange })` and re-render.
840
+ - **Put a color in a form with `ColorField`** (`@kerfjs/ui/color-field`): a
841
+ swatch-and-hex trigger that opens a ColorPicker below it; call
842
+ `wireColorFields(root, { onChange, pickers })` and re-render. Never use
843
+ `wa-color-picker`.
844
+ - **Size a Select through its API.** `triggerWidth` chooses `fit-content`,
845
+ `max-content`, or `fill`; `maxTriggerWidth`/`minTriggerWidth` bound it under any
846
+ presentation, ellipsizing even `renderSelected` content. For custom
847
+ selected text, use the public color, font-size, and font-weight tokens; the
848
+ closed value ellipsizes when space runs out. `presentation="title"` gives a
849
+ rail view heading a 36px bold, flush-start trigger and adjacent caret;
850
+ `focusRingInset` keeps its ring inside clipping ancestors.
851
+ - **Configure application tabs at their owners.** TabBarItem's `icon-only`
852
+ presentation keeps `name` accessible, `labelMaxWidth` ellipsizes a long name,
853
+ `nameOverflow="visible"` shows the full name during inline loading, and
854
+ `dropTarget` highlights a drag-over without changing selection. `attention`
855
+ uses `--kui-tab-bar-item-attention-color`. TabBar's public
856
+ `--kui-tab-bar-strip-*` tokens set compact strip geometry.
857
+ An inspector TabBar uses the shared rounded rectangle radius on its strip
858
+ and inset segmented tabs; an ordinary segmented TabBar keeps pill ends and
859
+ smaller interior tab corners. Configure the presentation instead of
860
+ restyling TabBarItem.
861
+ Set `pinned` on the first TabBarItem to keep it visible within a scrolling
862
+ tablist; it remains in keyboard order. Use `--kui-tab-bar-item-pinned-background`
863
+ for the surrounding surface and keep that backdrop opaque.
864
+ - **Use `Badge` for compact non-interactive metadata.** Configure its semantic
865
+ tone, appearance, shape, and size instead of creating badge CSS in an app or
866
+ consuming component. Use a real button or link for interactive content.
867
+ For new content without a count, use the text-free `size="dot"` form: it
868
+ takes no children, and needs a `label` (announced as an image) or
869
+ `ariaHidden` when its owner announces it. A `TabNavigator` tab shows the dot
870
+ with `badge: true` plus its required `badgeLabel`. A text badge takes a
871
+ decorative leading `icon`, a `title` tooltip, and `data-*` `rootAttributes`
872
+ for app identity; never wrap a Badge or nest a `Row` in it for those.
873
+ For app-supplied text that can run long (a tag or category name), set
874
+ `maxWidth` (a `CssLength`, such as `px(160)`): the label truncates with an
875
+ ellipsis and string or number content becomes the hover `title`.
876
+ - **Use `Chip` for removable tags.** Give the native remove button a delegated
877
+ `removeAction` and a specific `removeLabel`; the application updates the tag
878
+ list. `itemId` identifies the chip to the action handler. `size="compact"`
879
+ gives a 20px chip and 16px remove button; `disabled` disables removal.
880
+ - **Use a link `Chip` for downloadable files and short links.** `href` renders a
881
+ native `<a>` with chip geometry; `download` (`true` or a file name) and
882
+ `external` (new tab, safe rel, announced) are optional, and a link chip has
883
+ no remove button. Inside a ContentItem bubble set `tone="inherit"` so it
884
+ follows the bubble's foreground instead of styling an anchor yourself.
885
+ - **Use an action `Chip` for a value the user activates once.** `action` (with
886
+ `itemId`) renders the whole chip as a native
887
+ `<button type="button" data-action data-item-id>` for a delegated handler,
888
+ such as a search help filter token that inserts itself into the query, with
889
+ hover, press, focus-ring, and `disabled` states. `actionLabel` is an optional
890
+ accessible name that contains the visible label. It cannot also take `href`
891
+ or `removeAction`. A compact rounded action chip keeps a compact `Badge`'s row
892
+ height in a compact `ValueTable` cell; never make a `Badge` clickable.
893
+ - **Use `ChoiceChips` for a wrapping exclusive choice.** When one value comes
894
+ from a visible set too large for a `SegmentedControl` track (a nine-color
895
+ palette in a 560px dialog), render separate pills backed by native radios:
896
+ one Tab stop, arrow-key selection, and a real form value under `name`. Name
897
+ the group with `label` or `labelledBy`, lead choices with a `swatch`
898
+ (`CssColor` such as `fillColor('#3b82f6')`, or `'transparent'` for the struck-through no-color dot) or an
899
+ `icon`, and handle the delegated `action` on `change`. Never wrap a
900
+ `SegmentedControl` or a joined button group instead. Set
901
+ `multiple: 'toggle'` (with a `readonly Value[]` `value`) when any number may
902
+ be on and each pill toggles alone: native checkboxes in a `role="group"`,
903
+ each a Tab stop that Space toggles. Set `multiple: true` for the desktop
904
+ multi-select: a listbox where a click selects one, Cmd/Ctrl toggles, Shift
905
+ extends, and hidden inputs submit under `name`; wire it with
906
+ `wireChoiceChips` (`@kerfjs/ui/wire-choice-chips`) and read the set with
907
+ `readChoiceChips`. On dark
908
+ inverse chrome, place the chips in a dark appearance scope (`.wa-dark`)
909
+ instead of restyling them.
910
+
911
+ - **Open a scrolling view with `BackdropImage`.** Place it first in a Pane or
912
+ NavStack view's scrolling content: `parallax` (`subtle` or a 0 to 1 factor)
913
+ lags the image on a compositor-only scroll timeline, `blur` (`radius`,
914
+ `blurredSrc`, `dim`) cross-fades in a once-blurred copy as it scrolls away
915
+ (only opacity animates, never the filter), `fadeTo` (a `CssColor`)
916
+ dissolves it into a color that keeps painting under its `children`, and
917
+ `overlay` content sits over its block end with an optional `scrim`. Pass
918
+ `alt=""` for a decorative image. It is static under reduced motion,
919
+ `data-kui-effects="static"`, or without scroll-driven animations, and ends on
920
+ a hard edge (overlay on a solid `fadeTo` band) under reduced transparency. Never hand-roll scroll listeners or
921
+ `background-attachment: fixed`.
922
+
923
+ - **Use `MessageComposer` for a chat or prompt composer.** `@kerfjs/ui/message-composer`
924
+ renders a raised frame (standard border, large radius, `shadow-l`) whose
925
+ border turns brand while focus is within, a borderless textarea that grows
926
+ between `minRows` (default 1) and `maxRows` (default 8) lines and then
927
+ scrolls, and a compact `Toolbar` action row: optional `leading` controls
928
+ (attach, a model `Select`), an optional quiet `hint`, and `trailing` actions
929
+ (a brand Send `Button`). Name it with a title-style `label`; give it
930
+ an `id` so the hint describes the field. Pass it as a `DialogSurface`'s
931
+ floating `footer` (`footerInset="none"`) over a transcript. Never rebuild
932
+ composer chrome around a `wa-textarea` with app CSS. For Enter-to-send, set
933
+ `submitOnEnter` and call `wireMessageComposers(root)` from
934
+ `@kerfjs/ui/wire-message-composers` once: Enter or Cmd/Ctrl+Enter clicks the first
935
+ trailing action, Shift+Enter inserts a newline, and an IME composition
936
+ commit or an empty message never sends. Never hand-roll that handler.
99
937
 
100
938
  ## Public exports
101
939
 
102
- `LucideIcon`, `DisclosureArrow`, `Toolbar`, `ToolbarControlGroup`, `FloatingToolbar`, `ToolbarText`,
103
- `PanelHeader`, `ListItem`, `ListActionRow`, `ListHeader`, `SegmentedControl`,
104
- `Select`, `TokenSearchField` (+ `readTokenSearchField`, `placeTokenSearchCaret`,
105
- `wireTokenSearchFields`), `AppTab`, `TabBar` (+ `wireTabBars`, `reorderTabs`),
940
+ `Badge`, `LucideIcon`, `DisclosureArrow`, `Toolbar`, `ToolbarControlGroup`, `ToolbarActionLink`, `FloatingToolbar`, `ToolbarText`, `Text`,
941
+ `ListItem`, `ListActionRow` (+ `wireListReorder`, `reorderListItems`), `wireListFocusScroll`, `ListHeader`, `ListInsetControl`,
942
+ `ListInsetText`, `SegmentedControl`, `ChoiceChips`, `MessageComposer`,
943
+ `Select`, `SearchField` (+ `readSearchField`, `placeSearchFieldCaret`,
944
+ `wireSearchFields`), `TabBarItem`, `TabBar` (+ `wireTabBars`, `reorderTabs`),
945
+ `wireScrollDividers` (scroll-state dividers for every `Pane`, `NavStack`,
946
+ `TabNavigator`, and `TabBar`),
106
947
  `ResizableRegion` (+ `wireResizableRegions`), `StateBanner`, `EmptyState`,
107
948
  `LoadingSpinner`, `Skeleton`, `ValueTable`, `ValueTableRow`. Whole-screen layouts (opt-in,
108
- tree-shakeable, declarative with `wire…` helpers, each with a companion CSS import):
109
- `NavStack`, `SplitView`, `Workbench`, `TabScaffold`, driven by `deviceClass()` from
949
+ tree-shakeable, declarative with `wire…` helpers; the browser build of each layout
950
+ subpath loads its CSS and that of the components it renders, and a companion
951
+ CSS subpath remains for pipelines without the `browser` condition):
952
+ `NavStack`, `SplitView`, `Workbench`, `TabNavigator`, driven by `deviceClass()` from
110
953
  `@kerfjs/ui/device-class`. For a standalone collapsible rail/drawer outside a full
111
954
  shell, `@kerfjs/ui/collapsible-panel` (`CollapsiblePanel`, `CollapsiblePanelToggle`)
112
- + `@kerfjs/ui/wire-sidebar` (`wireSidebar`: toggle, focus, compact overlay, persistence).
113
- `@kerfjs/ui/catalog` is another opt-in shell — a
114
- `Catalog` component + `wireCatalog` helper for building a component-gallery catalog
115
- (collapsible category sidebar + preview stage + resources footer) from your own
116
- entries; controlled/stateless like the layouts. `@kerfjs/ui/webawesome` is a
117
- type-only boundary for `wa-*` JSX; `@kerfjs/ui/select/register` and the CSS are the
118
- declared side effects.
955
+
956
+ - `@kerfjs/ui/wire-sidebar` (`wireSidebar`: toggle, focus, compact overlay, persistence; a compact overlay starts closed and opens only on a user action, and `inlineCollapsed` declares a panel's inline default).
957
+ `@kerfjs/ui/catalog` is another opt-in shell — a
958
+ `Catalog` component + `wireCatalog` helper for building a component-gallery catalog
959
+ (collapsible category sidebar + preview stage + resources footer, with
960
+ focus-preserving active-row reveal for long desktop sidebars) from your own
961
+ entries; controlled/stateless like the layouts. Its optional contrast, reduced
962
+ motion, theme, and preview-background controls are built in; pass state and
963
+ `wireCatalog` callbacks instead of recreating their toolbar markup, while your
964
+ app owns applying and persisting preferences. For any Catalog demo, follow
965
+ the [authoritative authoring contract](./docs/catalog.md#catalog-demo-authoring-contract)
966
+ rather than inferring structure from the shell or private CSS. The shipped
967
+ Catalog stage fills the preview scroller for short specimens and grows with
968
+ tall ones in every consumer; do not add a demo-specific height or backdrop
969
+ override.
970
+ `@kerfjs/ui/webawesome` is a
971
+ type-only boundary for `wa-*` JSX; `@kerfjs/ui/select/register` and the CSS are the
972
+ declared side effects.
119
973
 
120
974
  ## Reference
121
975
 
122
976
  - [skill.md](./ai/skill.md): the full rule set + a common-mistakes table (the shipped AI skill).
123
977
  - [design-philosophy.md](./docs/design-philosophy.md): why kerf UI is shaped this way — the decision principles behind the rules above.
978
+ - [writing.md](./docs/writing.md): interface copy — the title-style vs. sentence-style capitalization rule per element, from Apple's guidance.
124
979
  - [layout.md](./docs/layout.md): the pane/content-item geometry, public roles/tokens, and the spacing scale.
125
980
  - [component-contract.md](./docs/component-contract.md): what a component owns vs. what the app owns.
126
981
  - [accessibility.md](./docs/accessibility.md): keyboard and ARIA contracts per component.
127
982
  - [recipes.md](./docs/recipes.md): production compositions (app shell, list-detail dialog, composer form, …) as copyable references.
128
- - [app-layouts.md](./docs/app-layouts.md): choosing `NavStack`/`SplitView`/`Workbench`/`TabScaffold` by data + interaction + device, and dialog presentation.
129
- - [webawesome-theme.md](./docs/webawesome-theme.md): the optional Web Awesome theme; catalog coverage means themed-and-supported, not preferred (prefer the Kerf primitive when one exists).
130
- - [component-catalog.json](./ai/component-catalog.json) + [public-api-signatures-v1.md](./ai/public-api-signatures-v1.md) + [webawesome-jsx-signatures-v1.md](./ai/webawesome-jsx-signatures-v1.md): machine-readable facts and exact signatures.
983
+ - [workbench.md](./docs/workbench.md): the `Workbench` multi-panel shell, its collapse policies, and opt-in `resizable` panels driven by `wireWorkbench` (`@kerfjs/ui/wire-workbench`: drag, keyboard, min/max, persistence, compact suspension), the `mainMinSize` / `mainMinHeight` work-area minimums (default 320px wide beside any inline rail, 120px tall above the drawer) that resizable panels stop at and inline panels shrink around, and a panel's `responsiveOverlayAt` (`narrow` / `compact`, rails and the bottom drawer) that presents it as an overlay below a Workbench container breakpoint without a device-class check; a panel given its `collapsed` signal is a transient overlay (collapsed on entering the breakpoint, takes focus and keeps Tab inside while open, closed by Escape or an outside press, focus returned; `dismissOverlays`), and overlays are exclusive by default (opening one closes the others; `exclusiveOverlays: false` opts out).
984
+ - [workbench-dialog.md](./docs/workbench-dialog.md): `WorkbenchDialog`, the modal workbench dialog type: the title, actions, and close control in the work area's toolbar, full-height rails with their own toolbars, and overlay rails on compact devices.
985
+ - [list-detail-dialog.md](./docs/list-detail-dialog.md): `ListDetailDialog`, the modal list-detail dialog type: full-height list and detail columns, the title and close control in the detail column, and a compact full-screen `NavStack` drill-down.
986
+ - [app-layouts.md](./docs/app-layouts.md): choosing `NavStack`/`SplitView`/`Workbench`/`TabNavigator` by data + interaction + device, and dialog presentation, plus the safe-area model (surfaces paint through unsafe areas; content pads only the edges it reaches; `Pane.safeAreaEdges` for app-owned arrangements, `Toolbar.safeAreaEdges` for an app bar or bottom bar at a screen edge).
987
+ - [webawesome-theme.md](./docs/webawesome-theme.md): the optional Web Awesome integration theme; catalog coverage means themed-and-supported for integration applications, not preferred. The UX sidebar tags every element a Kerf component replaces as `Discouraged`; Popup remains an available conditional positioning primitive.
988
+ - [webawesome-migration.md](./docs/webawesome-migration.md): moving an application from Web Awesome elements to their Kerf replacements, then removing Web Awesome.
989
+ - [ai/components/README.md](./ai/components/README.md): the generated per-component markdown reference — the assistant entry point over both JSON catalogs.
990
+ - [component-catalog.json](./ai/component-catalog.json) + [component-catalog-extension.schema.json](./ai/component-catalog-extension.schema.json) + [catalog-authoring.json](./ai/catalog-authoring.json) + [public-api-signatures-v1.md](./ai/public-api-signatures-v1.md) + [webawesome-jsx-signatures-v1.md](./ai/webawesome-jsx-signatures-v1.md): machine-readable selection facts, a reusable app-component extension contract, Catalog authoring discovery, and exact signatures.
991
+ - [compile-time-contracts-v1.json](./ai/compile-time-contracts-v1.json) + [type-contracts.md](./docs/type-contracts.md): stable compile diagnostics, packed-declaration proof, migrations, and explicit non-goals.
131
992
  - [README.md](./README.md): package overview and the component subpath table.
993
+
994
+ Neutral lowered surfaces and decorative neutral fills/borders are translucent theme colors; compose nested public components directly. Default/raised canvases, foregrounds, focus indicators, and loud contrast-bearing fills remain opaque. Do not assign depth-specific component tokens in demo wrappers.
995
+
996
+ Navigation transition continuity: `wireNavStack` slides the incoming view over the preserved previous view on push and the outgoing view off on pop, cross-fades both live chrome surfaces with inert snapshots, and settles/cancels an interrupted transition before starting the next. Reduced motion and duration zero settle immediately.
997
+
998
+ For a tab scene with drill-down, put a `NavStack` directly in `TabNavigatorTab.content`, configure each view's top `toolbar` and `pane`, and omit `bottomToolbar` at both levels so the scaffold bar remains the only bottom chrome. Wire both components on their own roots. The catalog's **NavStack inside a tab** example exercises push and tab switching.
999
+
1000
+ `Pane.deepInset` (and `PaneConfig.deepInset`) or `TabNavigatorTab.deepInset` on a plain scene adds 8px on all four sides of the scroll content, so ordinary 8px item margins land 16px from the inline edge. Nested Row/List/Grid spacing stays at its default. Set a nested scene's Pane option instead of insetting its entire NavStack or toolbar.
1001
+ For a child table whose decoration spans the Pane while its text stays aligned, use the Pane content slot's inherited `--kui-pane-content-inset-inline-start` and `--kui-pane-content-inset-inline-end`: negate them for the child's logical margins and add them to cell padding. They include safe areas and `deepInset`; see `docs/app-layouts.md#edge-to-edge-content-inside-a-pane`.
1002
+
1003
+ `ToolbarText` and `ToolbarControlGroup` accept typed `hideBelow`/`showBelow`
1004
+ lengths (for example `px(416)`). Wire `wireToolbarVisibility(root)` from
1005
+ `@kerfjs/ui/wire-toolbar-visibility` and dispose on unmount. Thresholds use the
1006
+ nearest Toolbar content-box width: hideBelow hides strictly below, showBelow
1007
+ shows strictly below, with complementary behavior at equality. Percentages use
1008
+ that content width; em and custom properties use the item's own context. Invalid,
1009
+ negative, unresolved, or contradictory values leave the item visible under this
1010
+ width policy. Keep primary actions visible and offer a complementary overflow
1011
+ group. See `docs/component-contract.md` "Toolbar width visibility" for lifecycle
1012
+ details.
1013
+
1014
+ 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.
1015
+
1016
+ Key sibling `DialogSurface`s that render conditionally with `rootAttributes={{ "data-key": "…" }}` so a re-render morphs each dialog into itself; never wrap one in a keyed app `div`. Modal `DialogSurface` bounds use typed `viewportGutter` and `maxHeight` (`CssLength` or `"viewport"`); explicit caps stay within the dynamic viewport minus both gutters. Omitted props keep the default caps (20px clear of each edge, 80% of the viewport height at 420px wide or narrower). Application render state chooses responsive values, and preview layout remains application-owned. `height` sets a definite bounded modal size and `bodyLayout="fill"` lets one child fill the body; `bodyLayout="fill-last"` keeps leading rows at their height above one filling last child, and `footerPresentation="floating"` (with a typed `footerOffset`) floats a chat composer over the body while the body reserves its measured height; give the transcript `scrollClearance="block-end"` (a `scrollable` `List` or a `Pane`) to let it scroll beneath the composer, with the last message still resting above it, through the published `--kui-scroll-clearance-block-end` context (overlaying chrome publishes `--kui-scroll-clearance-block-start` / `-end`; one scroller per covered edge opts in; a composed Pane opts in through `PaneConfig.scrollClearance` on a Workbench `mainPane` or panel `pane`, a `CollapsiblePanel` `pane`, or a `NavStack` view's `pane`). `headerPresentation="floating"` lays the title bar over the body on the translucent `--kui-chrome-material-raised` (opaque under reduced transparency, increased contrast, and forced colors); the register measures it and the body reserves it, and a `fill` body's only child with `scrollClearance="both"` scrolls beneath both the title bar and a floating composer through the published `--kui-scroll-clearance-block-start`. `presentation="bottom-sheet"` attaches the dialog to the bottom edge with square bottom corners, safe-area and virtual-keyboard clearance behind the panel, and a slide in/out (`enterMotion` / `exitMotion`); `resizable` adds a top grabber separator bounded by `minHeight` and `maxHeight`. `PopoverDialogSurface` is the non-modal, light-dismiss counterpart on the native Popover API, with the same size props and an `embedded` in-flow presentation; `describedBy` sets its `aria-describedby` (usually a title `ToolbarText`'s `descriptionId`).
1017
+
1018
+ Render a modal dialog as `DialogSurface` itself, a native `<dialog>` (`alert` renders `role="alertdialog"` for a destructive confirmation; pair it with `describedBy` on the message): `label` (or `labelledBy` with a `heading`, such as an xl `ToolbarText` with a description) names it, `describedBy` (the heading ToolbarText's `descriptionId`, or app-owned summary copy) describes it as `aria-describedby`, `children` is its body, `footer` holds its buttons, and `headerActions` sit before its close button (`withoutHeader` drops the header for content that owns its heading and close control). Open it with `openDialog(dialog)` and close it with `closeDialog(dialog)` from `@kerfjs/ui/surface-scaffold`; never toggle its `open` attribute. The close button, any `data-dialog-close` element inside (a Cancel button), Escape, and, with `lightDismiss`, a backdrop press dispatch a cancelable `kui-request-close` (`detail.source`: `close-button`, `escape`, or `backdrop`); cancel it to keep the dialog open (the panel pulses). The native `close` event fires once it closes. `openDialog` installs the listeners and, while the dialog is open, measures its floating header/footer, follows a bottom sheet's keyboard and grabber, and keeps that state across re-renders; import `@kerfjs/ui/surface-scaffold/register` only when a dialog may open some other way. Do not write `wa-dialog` inside a `DialogSurface`.
1019
+
1020
+ Toolbar visibility measurement probes and invisible state children are helper-owned and survive Kerf rerenders through `data-morph-preserve`. Actual CSS visibility stays stable while rendering removes transient parent markers, preventing geometry-driven render feedback and repeated probe recreation. Toolbar replacement, explicit internal-node removal and disposal retain their existing behavior.