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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1358) hide show
  1. package/README.md +707 -160
  2. package/ai/application-ui-diagnostic-ids-v1.json +115 -0
  3. package/ai/application-ui-profile-sync.cjs +548 -0
  4. package/ai/application-ui-profile.d.mts +1 -0
  5. package/ai/application-ui-profile.d.ts +106 -0
  6. package/ai/application-ui-profile.defaults.json +222 -0
  7. package/ai/application-ui-profile.mjs +653 -0
  8. package/ai/application-ui-profile.schema.json +140 -0
  9. package/ai/catalog-authoring.json +34 -0
  10. package/ai/catalog-authoring.schema.json +105 -0
  11. package/ai/compile-time-contracts-v1.json +149 -0
  12. package/ai/compile-time-contracts-v1.schema.json +52 -0
  13. package/ai/component-catalog-extension.schema.json +104 -0
  14. package/ai/component-catalog.json +9111 -1376
  15. package/ai/component-catalog.schema.json +94 -1
  16. package/ai/component-class-owners.cjs +83 -0
  17. package/ai/component-composition-extension.d.ts +7 -0
  18. package/ai/component-composition-extension.schema.json +7 -0
  19. package/ai/component-composition-rules.json +570 -0
  20. package/ai/component-composition.d.ts +143 -0
  21. package/ai/component-composition.json +10437 -0
  22. package/ai/component-composition.schema.json +444 -0
  23. package/ai/components/README.md +206 -0
  24. package/ai/components/anchored-surface.md +99 -0
  25. package/ai/components/application-tabs.md +65 -0
  26. package/ai/components/backdrop-image.md +84 -0
  27. package/ai/components/badge.md +77 -0
  28. package/ai/components/button.md +94 -0
  29. package/ai/components/checkbox-group.md +89 -0
  30. package/ai/components/checkbox.md +90 -0
  31. package/ai/components/chip.md +80 -0
  32. package/ai/components/choice-chips.md +93 -0
  33. package/ai/components/collapsible-panel.md +103 -0
  34. package/ai/components/color-field.md +92 -0
  35. package/ai/components/color-picker.md +93 -0
  36. package/ai/components/color-swatches.md +82 -0
  37. package/ai/components/column-track.md +78 -0
  38. package/ai/components/combobox.md +90 -0
  39. package/ai/components/content-item.md +101 -0
  40. package/ai/components/content-swap.md +78 -0
  41. package/ai/components/corner-status.md +88 -0
  42. package/ai/components/disclosure-arrow.md +77 -0
  43. package/ai/components/disclosure.md +88 -0
  44. package/ai/components/document-baseline.md +77 -0
  45. package/ai/components/edge-activity-indicator.md +81 -0
  46. package/ai/components/empty-state.md +80 -0
  47. package/ai/components/feedback.md +71 -0
  48. package/ai/components/file-picker.md +89 -0
  49. package/ai/components/floating-toolbar.md +82 -0
  50. package/ai/components/foundation.md +65 -0
  51. package/ai/components/framed-list.md +80 -0
  52. package/ai/components/grid.md +101 -0
  53. package/ai/components/headers.md +63 -0
  54. package/ai/components/layout.md +75 -0
  55. package/ai/components/list-action-row.md +108 -0
  56. package/ai/components/list-detail-dialog.md +90 -0
  57. package/ai/components/list-header.md +91 -0
  58. package/ai/components/list-inset-control.md +74 -0
  59. package/ai/components/list-inset-text.md +72 -0
  60. package/ai/components/list-item.md +108 -0
  61. package/ai/components/list.md +127 -0
  62. package/ai/components/loading-spinner.md +73 -0
  63. package/ai/components/lucide-icon.md +99 -0
  64. package/ai/components/message-composer.md +85 -0
  65. package/ai/components/nav-stack.md +120 -0
  66. package/ai/components/pane.md +127 -0
  67. package/ai/components/popup-menu.md +174 -0
  68. package/ai/components/progress-bar.md +82 -0
  69. package/ai/components/progress-ring.md +80 -0
  70. package/ai/components/radio-group.md +89 -0
  71. package/ai/components/recipe-app-shell.md +57 -0
  72. package/ai/components/recipe-collapsible-sidebar.md +57 -0
  73. package/ai/components/recipe-compact-toolbar.md +57 -0
  74. package/ai/components/recipe-composer-form.md +57 -0
  75. package/ai/components/recipe-list-detail-dialog.md +57 -0
  76. package/ai/components/recipe-list-workspace-states.md +57 -0
  77. package/ai/components/recipe-loading-inspector.md +57 -0
  78. package/ai/components/recipe-media-detail.md +57 -0
  79. package/ai/components/recipe-navigation-sidebar.md +57 -0
  80. package/ai/components/recipe-navigation-stack.md +57 -0
  81. package/ai/components/recipe-workspace-header.md +57 -0
  82. package/ai/components/resize.md +106 -0
  83. package/ai/components/row.md +96 -0
  84. package/ai/components/search-field.md +108 -0
  85. package/ai/components/segmented-control.md +83 -0
  86. package/ai/components/select.md +118 -0
  87. package/ai/components/skeleton.md +84 -0
  88. package/ai/components/slider.md +84 -0
  89. package/ai/components/spacer.md +86 -0
  90. package/ai/components/split-button.md +83 -0
  91. package/ai/components/split-view.md +105 -0
  92. package/ai/components/state-banner.md +96 -0
  93. package/ai/components/summary-row.md +85 -0
  94. package/ai/components/sunken-panel.md +79 -0
  95. package/ai/components/surface-scaffold.md +117 -0
  96. package/ai/components/switch.md +81 -0
  97. package/ai/components/tab-bar.md +114 -0
  98. package/ai/components/tab-navigator.md +105 -0
  99. package/ai/components/tabs.md +95 -0
  100. package/ai/components/tag-field.md +86 -0
  101. package/ai/components/text-field.md +102 -0
  102. package/ai/components/text.md +93 -0
  103. package/ai/components/toast.md +85 -0
  104. package/ai/components/toolbar-control-group.md +127 -0
  105. package/ai/components/toolbar-text.md +100 -0
  106. package/ai/components/toolbar.md +103 -0
  107. package/ai/components/tooltip.md +81 -0
  108. package/ai/components/value-table.md +80 -0
  109. package/ai/components/wa-accordion-item.md +61 -0
  110. package/ai/components/wa-accordion.md +71 -0
  111. package/ai/components/wa-animated-image.md +56 -0
  112. package/ai/components/wa-animation.md +56 -0
  113. package/ai/components/wa-avatar.md +56 -0
  114. package/ai/components/wa-badge.md +62 -0
  115. package/ai/components/wa-breadcrumb-item.md +54 -0
  116. package/ai/components/wa-breadcrumb.md +56 -0
  117. package/ai/components/wa-button-group.md +62 -0
  118. package/ai/components/wa-button.md +61 -0
  119. package/ai/components/wa-callout.md +60 -0
  120. package/ai/components/wa-card.md +67 -0
  121. package/ai/components/wa-carousel-item.md +54 -0
  122. package/ai/components/wa-carousel.md +56 -0
  123. package/ai/components/wa-checkbox-group.md +62 -0
  124. package/ai/components/wa-checkbox.md +61 -0
  125. package/ai/components/wa-color-picker.md +63 -0
  126. package/ai/components/wa-comparison.md +56 -0
  127. package/ai/components/wa-copy-button.md +56 -0
  128. package/ai/components/wa-details.md +67 -0
  129. package/ai/components/wa-dialog.md +65 -0
  130. package/ai/components/wa-divider.md +54 -0
  131. package/ai/components/wa-drawer.md +62 -0
  132. package/ai/components/wa-dropdown-item.md +62 -0
  133. package/ai/components/wa-dropdown.md +62 -0
  134. package/ai/components/wa-format-bytes.md +54 -0
  135. package/ai/components/wa-format-date.md +54 -0
  136. package/ai/components/wa-format-number.md +54 -0
  137. package/ai/components/wa-icon.md +59 -0
  138. package/ai/components/wa-include.md +55 -0
  139. package/ai/components/wa-input.md +62 -0
  140. package/ai/components/wa-intersection-observer.md +54 -0
  141. package/ai/components/wa-known-date.md +54 -0
  142. package/ai/components/wa-markdown.md +54 -0
  143. package/ai/components/wa-mutation-observer.md +54 -0
  144. package/ai/components/wa-number-input.md +56 -0
  145. package/ai/components/wa-option.md +61 -0
  146. package/ai/components/wa-otp-input.md +54 -0
  147. package/ai/components/wa-page.md +62 -0
  148. package/ai/components/wa-pagination.md +56 -0
  149. package/ai/components/wa-popover.md +61 -0
  150. package/ai/components/wa-popup.md +60 -0
  151. package/ai/components/wa-progress-bar.md +60 -0
  152. package/ai/components/wa-progress-ring.md +60 -0
  153. package/ai/components/wa-qr-code.md +54 -0
  154. package/ai/components/wa-radio-group.md +67 -0
  155. package/ai/components/wa-radio.md +61 -0
  156. package/ai/components/wa-random-content.md +54 -0
  157. package/ai/components/wa-rating.md +56 -0
  158. package/ai/components/wa-relative-time.md +54 -0
  159. package/ai/components/wa-resize-observer.md +54 -0
  160. package/ai/components/wa-scroller.md +61 -0
  161. package/ai/components/wa-select.md +65 -0
  162. package/ai/components/wa-skeleton.md +60 -0
  163. package/ai/components/wa-slider.md +61 -0
  164. package/ai/components/wa-spinner.md +60 -0
  165. package/ai/components/wa-split-panel.md +60 -0
  166. package/ai/components/wa-step.md +56 -0
  167. package/ai/components/wa-stepper.md +56 -0
  168. package/ai/components/wa-switch.md +60 -0
  169. package/ai/components/wa-tab-group.md +71 -0
  170. package/ai/components/wa-tab-panel.md +62 -0
  171. package/ai/components/wa-tab.md +61 -0
  172. package/ai/components/wa-tag-input.md +62 -0
  173. package/ai/components/wa-tag.md +62 -0
  174. package/ai/components/wa-textarea.md +60 -0
  175. package/ai/components/wa-time-input.md +56 -0
  176. package/ai/components/wa-toast-item.md +62 -0
  177. package/ai/components/wa-toast.md +62 -0
  178. package/ai/components/wa-tooltip.md +61 -0
  179. package/ai/components/wa-tree-item.md +56 -0
  180. package/ai/components/wa-tree.md +56 -0
  181. package/ai/components/wa-zoomable-frame.md +56 -0
  182. package/ai/components/workbench-dialog.md +90 -0
  183. package/ai/components/workbench.md +120 -0
  184. package/ai/public-api-signatures-v1.md +6114 -445
  185. package/ai/skill.md +545 -65
  186. package/ai/webawesome-jsx-signatures-v1.md +12 -2
  187. package/analyzer/cli.mjs +49 -0
  188. package/analyzer/component-ownership.d.mts +72 -0
  189. package/analyzer/component-ownership.mjs +429 -0
  190. package/analyzer/index.d.mts +53 -0
  191. package/analyzer/index.mjs +2375 -0
  192. package/analyzer/loud-pairs.d.mts +49 -0
  193. package/analyzer/loud-pairs.mjs +357 -0
  194. package/analyzer/report.schema.json +66 -0
  195. package/analyzer/selectors.d.mts +21 -0
  196. package/analyzer/selectors.mjs +212 -0
  197. package/catalog-projection-cli.mjs +96 -0
  198. package/catalog-projection.d.mts +55 -0
  199. package/catalog-projection.mjs +62 -0
  200. package/dist/anchored-surface.d.ts +69 -0
  201. package/dist/anchored-surface.js +3 -0
  202. package/dist/anchored-surface.js.map +1 -0
  203. package/dist/backdrop-image.d.ts +132 -0
  204. package/dist/backdrop-image.js +5 -0
  205. package/dist/backdrop-image.js.map +1 -0
  206. package/dist/badge.d.ts +91 -0
  207. package/dist/badge.js +4 -0
  208. package/dist/badge.js.map +1 -0
  209. package/dist/browser/anchored-surface.js +3 -0
  210. package/dist/browser/backdrop-image.js +3 -0
  211. package/dist/browser/badge.js +3 -0
  212. package/dist/browser/button.js +5 -0
  213. package/dist/browser/catalog.js +29 -0
  214. package/dist/browser/checkbox-group.js +5 -0
  215. package/dist/browser/checkbox.js +4 -0
  216. package/dist/browser/chip.js +3 -0
  217. package/dist/browser/choice-chips.js +3 -0
  218. package/dist/browser/collapsible-panel.js +9 -0
  219. package/dist/browser/color-field.js +4 -0
  220. package/dist/browser/color-picker.js +5 -0
  221. package/dist/browser/color-swatches.js +3 -0
  222. package/dist/browser/column-track.js +3 -0
  223. package/dist/browser/combobox.js +3 -0
  224. package/dist/browser/content-item.js +3 -0
  225. package/dist/browser/content-swap.js +3 -0
  226. package/dist/browser/corner-status.js +3 -0
  227. package/dist/browser/disclosure.js +5 -0
  228. package/dist/browser/edge-activity-indicator.js +3 -0
  229. package/dist/browser/file-picker.js +3 -0
  230. package/dist/browser/framed-list.js +3 -0
  231. package/dist/browser/grid.js +3 -0
  232. package/dist/browser/list-action-row.js +3 -0
  233. package/dist/browser/list-detail-dialog.js +14 -0
  234. package/dist/browser/list-header.js +3 -1
  235. package/dist/browser/list-inset-control.js +3 -0
  236. package/dist/browser/list-inset-text.js +3 -0
  237. package/dist/browser/list-item.js +1 -0
  238. package/dist/browser/list.js +3 -0
  239. package/dist/browser/message-composer.js +5 -0
  240. package/dist/browser/nav-stack.js +11 -0
  241. package/dist/browser/pane.js +3 -0
  242. package/dist/browser/popup-menu.js +4 -0
  243. package/dist/browser/progress-bar.js +3 -0
  244. package/dist/browser/progress-ring.js +3 -0
  245. package/dist/browser/radio-group.js +3 -0
  246. package/dist/browser/row.js +3 -0
  247. package/dist/browser/search-field.js +4 -0
  248. package/dist/browser/segmented-control.js +0 -1
  249. package/dist/browser/select.js +2 -1
  250. package/dist/browser/slider.js +3 -0
  251. package/dist/browser/spacer.js +3 -0
  252. package/dist/browser/split-button.js +5 -0
  253. package/dist/browser/split-view.js +13 -0
  254. package/dist/browser/state-banner.js +1 -0
  255. package/dist/browser/summary-row.js +3 -0
  256. package/dist/browser/sunken-panel.js +3 -0
  257. package/dist/browser/surface-scaffold.js +4 -0
  258. package/dist/browser/switch.js +3 -0
  259. package/dist/browser/tab-bar-item.js +4 -0
  260. package/dist/browser/tab-navigator.js +4 -0
  261. package/dist/browser/tag-field.js +5 -0
  262. package/dist/browser/text-field.js +4 -0
  263. package/dist/browser/text.js +3 -0
  264. package/dist/browser/toolbar-control-group.js +1 -0
  265. package/dist/browser/workbench-dialog.js +15 -0
  266. package/dist/browser/workbench.js +14 -0
  267. package/dist/button.d.ts +121 -0
  268. package/dist/button.js +7 -0
  269. package/dist/button.js.map +1 -0
  270. package/dist/catalog-resources.d.ts +50 -0
  271. package/dist/catalog-resources.js +22 -0
  272. package/dist/catalog-resources.js.map +1 -0
  273. package/dist/catalog.d.ts +134 -101
  274. package/dist/catalog.js +700 -108
  275. package/dist/catalog.js.map +1 -1
  276. package/dist/checkbox-group.d.ts +70 -0
  277. package/dist/checkbox-group.js +7 -0
  278. package/dist/checkbox-group.js.map +1 -0
  279. package/dist/checkbox.d.ts +45 -0
  280. package/dist/checkbox.js +6 -0
  281. package/dist/checkbox.js.map +1 -0
  282. package/dist/chip.d.ts +117 -0
  283. package/dist/chip.js +4 -0
  284. package/dist/chip.js.map +1 -0
  285. package/dist/choice-chips.d.ts +116 -0
  286. package/dist/choice-chips.js +3 -0
  287. package/dist/choice-chips.js.map +1 -0
  288. package/dist/chunk-2FW7D4IG.js +52 -0
  289. package/dist/chunk-2FW7D4IG.js.map +1 -0
  290. package/dist/chunk-2GOCOLQL.js +270 -0
  291. package/dist/chunk-2GOCOLQL.js.map +1 -0
  292. package/dist/chunk-2LM3PYHA.js +300 -0
  293. package/dist/chunk-2LM3PYHA.js.map +1 -0
  294. package/dist/chunk-36HVQ72F.js +123 -0
  295. package/dist/chunk-36HVQ72F.js.map +1 -0
  296. package/dist/chunk-3GLYIIFR.js +230 -0
  297. package/dist/chunk-3GLYIIFR.js.map +1 -0
  298. package/dist/chunk-3VZ6SFD4.js +8 -0
  299. package/dist/chunk-3VZ6SFD4.js.map +1 -0
  300. package/dist/chunk-3WYREXW4.js +120 -0
  301. package/dist/chunk-3WYREXW4.js.map +1 -0
  302. package/dist/chunk-3Z7N2NAZ.js +385 -0
  303. package/dist/chunk-3Z7N2NAZ.js.map +1 -0
  304. package/dist/chunk-4OV272LF.js +93 -0
  305. package/dist/chunk-4OV272LF.js.map +1 -0
  306. package/dist/chunk-4RECPEHI.js +67 -0
  307. package/dist/chunk-4RECPEHI.js.map +1 -0
  308. package/dist/chunk-4UB5Z3ZZ.js +68 -0
  309. package/dist/chunk-4UB5Z3ZZ.js.map +1 -0
  310. package/dist/chunk-5J6Z4BWY.js +141 -0
  311. package/dist/chunk-5J6Z4BWY.js.map +1 -0
  312. package/dist/chunk-5USKCWGL.js +113 -0
  313. package/dist/chunk-5USKCWGL.js.map +1 -0
  314. package/dist/chunk-6C6DLP3W.js +31 -0
  315. package/dist/chunk-6C6DLP3W.js.map +1 -0
  316. package/dist/chunk-6CDILXF4.js +204 -0
  317. package/dist/chunk-6CDILXF4.js.map +1 -0
  318. package/dist/chunk-6VVIW7VB.js +69 -0
  319. package/dist/chunk-6VVIW7VB.js.map +1 -0
  320. package/dist/chunk-7AK5I7U7.js +55 -0
  321. package/dist/chunk-7AK5I7U7.js.map +1 -0
  322. package/dist/chunk-7K6U6FCN.js +122 -0
  323. package/dist/chunk-7K6U6FCN.js.map +1 -0
  324. package/dist/chunk-AMIHGFLP.js +59 -0
  325. package/dist/chunk-AMIHGFLP.js.map +1 -0
  326. package/dist/chunk-AN5IWMTM.js +24 -0
  327. package/dist/chunk-AN5IWMTM.js.map +1 -0
  328. package/dist/chunk-ATGAJVZ6.js +268 -0
  329. package/dist/chunk-ATGAJVZ6.js.map +1 -0
  330. package/dist/chunk-AYPGXR2E.js +20 -0
  331. package/dist/chunk-AYPGXR2E.js.map +1 -0
  332. package/dist/chunk-B53PS2LE.js +34 -0
  333. package/dist/chunk-B53PS2LE.js.map +1 -0
  334. package/dist/chunk-BKUMG2KB.js +95 -0
  335. package/dist/chunk-BKUMG2KB.js.map +1 -0
  336. package/dist/chunk-C26Q6P4Q.js +76 -0
  337. package/dist/chunk-C26Q6P4Q.js.map +1 -0
  338. package/dist/chunk-CEJ5FK6G.js +288 -0
  339. package/dist/chunk-CEJ5FK6G.js.map +1 -0
  340. package/dist/chunk-CIAUILRR.js +222 -0
  341. package/dist/chunk-CIAUILRR.js.map +1 -0
  342. package/dist/chunk-CNM6ZWP2.js +38 -0
  343. package/dist/chunk-CNM6ZWP2.js.map +1 -0
  344. package/dist/chunk-CPSGUGAY.js +527 -0
  345. package/dist/chunk-CPSGUGAY.js.map +1 -0
  346. package/dist/chunk-CTQUDCY5.js +26 -0
  347. package/dist/chunk-CTQUDCY5.js.map +1 -0
  348. package/dist/chunk-CVD5IZGB.js +66 -0
  349. package/dist/chunk-CVD5IZGB.js.map +1 -0
  350. package/dist/chunk-D4MXSAMI.js +50 -0
  351. package/dist/chunk-D4MXSAMI.js.map +1 -0
  352. package/dist/chunk-D5RGM3XA.js +38 -0
  353. package/dist/chunk-D5RGM3XA.js.map +1 -0
  354. package/dist/chunk-DZJ4GBSP.js +59 -0
  355. package/dist/chunk-DZJ4GBSP.js.map +1 -0
  356. package/dist/chunk-EIET4QLK.js +51 -0
  357. package/dist/chunk-EIET4QLK.js.map +1 -0
  358. package/dist/chunk-EKHDLBRP.js +86 -0
  359. package/dist/chunk-EKHDLBRP.js.map +1 -0
  360. package/dist/chunk-EYDXFOSH.js +457 -0
  361. package/dist/chunk-EYDXFOSH.js.map +1 -0
  362. package/dist/chunk-G3J7JDP6.js +29 -0
  363. package/dist/chunk-G3J7JDP6.js.map +1 -0
  364. package/dist/chunk-GS2QD3N7.js +14 -0
  365. package/dist/chunk-GS2QD3N7.js.map +1 -0
  366. package/dist/chunk-GXSX6Q6O.js +42 -0
  367. package/dist/chunk-GXSX6Q6O.js.map +1 -0
  368. package/dist/chunk-HDXUHLTQ.js +90 -0
  369. package/dist/chunk-HDXUHLTQ.js.map +1 -0
  370. package/dist/chunk-HJXVVFBT.js +108 -0
  371. package/dist/chunk-HJXVVFBT.js.map +1 -0
  372. package/dist/chunk-HQZG3OFL.js +158 -0
  373. package/dist/chunk-HQZG3OFL.js.map +1 -0
  374. package/dist/chunk-HTERKONR.js +49 -0
  375. package/dist/chunk-HTERKONR.js.map +1 -0
  376. package/dist/chunk-HU5IHXCI.js +73 -0
  377. package/dist/chunk-HU5IHXCI.js.map +1 -0
  378. package/dist/chunk-IKS72C6P.js +53 -0
  379. package/dist/chunk-IKS72C6P.js.map +1 -0
  380. package/dist/chunk-IO27YTL3.js +73 -0
  381. package/dist/chunk-IO27YTL3.js.map +1 -0
  382. package/dist/chunk-IQSRHXZR.js +164 -0
  383. package/dist/chunk-IQSRHXZR.js.map +1 -0
  384. package/dist/chunk-ITUQC4FW.js +163 -0
  385. package/dist/chunk-ITUQC4FW.js.map +1 -0
  386. package/dist/chunk-JCCN3U6X.js +176 -0
  387. package/dist/chunk-JCCN3U6X.js.map +1 -0
  388. package/dist/chunk-K57NINLH.js +137 -0
  389. package/dist/chunk-K57NINLH.js.map +1 -0
  390. package/dist/chunk-KC6WUSNS.js +34 -0
  391. package/dist/chunk-KC6WUSNS.js.map +1 -0
  392. package/dist/chunk-KCS6NJ3O.js +82 -0
  393. package/dist/chunk-KCS6NJ3O.js.map +1 -0
  394. package/dist/chunk-KDQZ3E5C.js +75 -0
  395. package/dist/chunk-KDQZ3E5C.js.map +1 -0
  396. package/dist/chunk-KH4KEMSP.js +71 -0
  397. package/dist/chunk-KH4KEMSP.js.map +1 -0
  398. package/dist/chunk-KK3S5OTW.js +98 -0
  399. package/dist/chunk-KK3S5OTW.js.map +1 -0
  400. package/dist/chunk-KPINJHIC.js +122 -0
  401. package/dist/chunk-KPINJHIC.js.map +1 -0
  402. package/dist/chunk-LMHN2TJL.js +167 -0
  403. package/dist/chunk-LMHN2TJL.js.map +1 -0
  404. package/dist/chunk-LTBVP6VN.js +59 -0
  405. package/dist/chunk-LTBVP6VN.js.map +1 -0
  406. package/dist/{chunk-YGN7OMLT.js → chunk-LZUUUHNH.js} +13 -6
  407. package/dist/chunk-LZUUUHNH.js.map +1 -0
  408. package/dist/chunk-MHMWQ7RB.js +19 -0
  409. package/dist/chunk-MHMWQ7RB.js.map +1 -0
  410. package/dist/chunk-MJ5RU6XT.js +173 -0
  411. package/dist/chunk-MJ5RU6XT.js.map +1 -0
  412. package/dist/chunk-MVKHSAKE.js +169 -0
  413. package/dist/chunk-MVKHSAKE.js.map +1 -0
  414. package/dist/chunk-NB6POCFH.js +103 -0
  415. package/dist/chunk-NB6POCFH.js.map +1 -0
  416. package/dist/chunk-NR6O74ST.js +169 -0
  417. package/dist/chunk-NR6O74ST.js.map +1 -0
  418. package/dist/chunk-OHPYT2BH.js +82 -0
  419. package/dist/chunk-OHPYT2BH.js.map +1 -0
  420. package/dist/chunk-OQP3PFKQ.js +341 -0
  421. package/dist/chunk-OQP3PFKQ.js.map +1 -0
  422. package/dist/chunk-OZ6X76G5.js +547 -0
  423. package/dist/chunk-OZ6X76G5.js.map +1 -0
  424. package/dist/chunk-P7EJ4CAD.js +147 -0
  425. package/dist/chunk-P7EJ4CAD.js.map +1 -0
  426. package/dist/chunk-QDSZTQXL.js +28 -0
  427. package/dist/chunk-QDSZTQXL.js.map +1 -0
  428. package/dist/chunk-QH5KOFNS.js +39 -0
  429. package/dist/chunk-QH5KOFNS.js.map +1 -0
  430. package/dist/chunk-QPTJ5DOO.js +87 -0
  431. package/dist/chunk-QPTJ5DOO.js.map +1 -0
  432. package/dist/chunk-QYMJHS4K.js +36 -0
  433. package/dist/chunk-QYMJHS4K.js.map +1 -0
  434. package/dist/chunk-RMWNO6BA.js +89 -0
  435. package/dist/chunk-RMWNO6BA.js.map +1 -0
  436. package/dist/chunk-S2XULQEK.js +52 -0
  437. package/dist/chunk-S2XULQEK.js.map +1 -0
  438. package/dist/chunk-S3ECMF23.js +33 -0
  439. package/dist/chunk-S3ECMF23.js.map +1 -0
  440. package/dist/chunk-S4Y3YTAI.js +35 -0
  441. package/dist/chunk-S4Y3YTAI.js.map +1 -0
  442. package/dist/chunk-S4ZGTDSG.js +18 -0
  443. package/dist/chunk-S4ZGTDSG.js.map +1 -0
  444. package/dist/chunk-SCDWURBO.js +136 -0
  445. package/dist/chunk-SCDWURBO.js.map +1 -0
  446. package/dist/chunk-SOFPUW3O.js +196 -0
  447. package/dist/chunk-SOFPUW3O.js.map +1 -0
  448. package/dist/chunk-SQ5DH66U.js +37 -0
  449. package/dist/chunk-SQ5DH66U.js.map +1 -0
  450. package/dist/chunk-T74YB76U.js +547 -0
  451. package/dist/chunk-T74YB76U.js.map +1 -0
  452. package/dist/chunk-TI2GV36S.js +90 -0
  453. package/dist/chunk-TI2GV36S.js.map +1 -0
  454. package/dist/{chunk-56RJXPHG.js → chunk-TKNVL53O.js} +7 -4
  455. package/dist/chunk-TKNVL53O.js.map +1 -0
  456. package/dist/chunk-TNJLNLVE.js +115 -0
  457. package/dist/chunk-TNJLNLVE.js.map +1 -0
  458. package/dist/chunk-TUID42UE.js +15 -0
  459. package/dist/chunk-TUID42UE.js.map +1 -0
  460. package/dist/chunk-UMNHJSIO.js +848 -0
  461. package/dist/chunk-UMNHJSIO.js.map +1 -0
  462. package/dist/chunk-VEME3D7K.js +298 -0
  463. package/dist/chunk-VEME3D7K.js.map +1 -0
  464. package/dist/chunk-WPNIKZMJ.js +507 -0
  465. package/dist/chunk-WPNIKZMJ.js.map +1 -0
  466. package/dist/chunk-WSEJ2FDE.js +162 -0
  467. package/dist/chunk-WSEJ2FDE.js.map +1 -0
  468. package/dist/chunk-WVS6CUCT.js +48 -0
  469. package/dist/chunk-WVS6CUCT.js.map +1 -0
  470. package/dist/chunk-XWNXGFX3.js +381 -0
  471. package/dist/chunk-XWNXGFX3.js.map +1 -0
  472. package/dist/chunk-Y6KT7ZTR.js +109 -0
  473. package/dist/chunk-Y6KT7ZTR.js.map +1 -0
  474. package/dist/chunk-YMUIQRWK.js +44 -0
  475. package/dist/chunk-YMUIQRWK.js.map +1 -0
  476. package/dist/chunk-ZCDRLN3B.js +138 -0
  477. package/dist/chunk-ZCDRLN3B.js.map +1 -0
  478. package/dist/chunk-ZKKO4MHC.js +25 -0
  479. package/dist/chunk-ZKKO4MHC.js.map +1 -0
  480. package/dist/chunk-ZN7KUMPY.js +48 -0
  481. package/dist/chunk-ZN7KUMPY.js.map +1 -0
  482. package/dist/chunk-ZNROKDSZ.js +54 -0
  483. package/dist/chunk-ZNROKDSZ.js.map +1 -0
  484. package/dist/chunk-ZX2QQJXD.js +249 -0
  485. package/dist/chunk-ZX2QQJXD.js.map +1 -0
  486. package/dist/collapsible-panel.d.ts +96 -17
  487. package/dist/collapsible-panel.js +133 -14
  488. package/dist/collapsible-panel.js.map +1 -1
  489. package/dist/color-field.d.ts +51 -0
  490. package/dist/color-field.js +92 -0
  491. package/dist/color-field.js.map +1 -0
  492. package/dist/color-picker.d.ts +113 -0
  493. package/dist/color-picker.js +8 -0
  494. package/dist/color-picker.js.map +1 -0
  495. package/dist/color-swatches.d.ts +56 -0
  496. package/dist/color-swatches.js +4 -0
  497. package/dist/color-swatches.js.map +1 -0
  498. package/dist/column-track.d.ts +41 -0
  499. package/dist/column-track.js +4 -0
  500. package/dist/column-track.js.map +1 -0
  501. package/dist/combobox.d.ts +40 -0
  502. package/dist/combobox.js +3 -0
  503. package/dist/combobox.js.map +1 -0
  504. package/dist/content-item.d.ts +128 -0
  505. package/dist/content-item.js +4 -0
  506. package/dist/content-item.js.map +1 -0
  507. package/dist/content-swap.d.ts +34 -0
  508. package/dist/content-swap.js +3 -0
  509. package/dist/content-swap.js.map +1 -0
  510. package/dist/corner-status.d.ts +36 -0
  511. package/dist/corner-status.js +3 -0
  512. package/dist/corner-status.js.map +1 -0
  513. package/dist/css-values.d.ts +127 -0
  514. package/dist/css-values.js +3 -0
  515. package/dist/css-values.js.map +1 -0
  516. package/dist/device-class.js +34 -6
  517. package/dist/device-class.js.map +1 -1
  518. package/dist/disclosure-arrow.d.ts +6 -1
  519. package/dist/disclosure-arrow.js +2 -1
  520. package/dist/disclosure.d.ts +66 -0
  521. package/dist/disclosure.js +51 -0
  522. package/dist/disclosure.js.map +1 -0
  523. package/dist/edge-activity-indicator.d.ts +28 -0
  524. package/dist/edge-activity-indicator.js +3 -0
  525. package/dist/edge-activity-indicator.js.map +1 -0
  526. package/dist/empty-state.d.ts +5 -2
  527. package/dist/empty-state.js +2 -1
  528. package/dist/extension-attributes-mu8MFUl0.d.ts +13 -0
  529. package/dist/file-picker.d.ts +54 -0
  530. package/dist/file-picker.js +3 -0
  531. package/dist/file-picker.js.map +1 -0
  532. package/dist/flex-alignment-4ms8ZbV8.d.ts +5 -0
  533. package/dist/floating-toolbar.d.ts +29 -6
  534. package/dist/floating-toolbar.js +1 -1
  535. package/dist/framed-list.d.ts +47 -0
  536. package/dist/framed-list.js +4 -0
  537. package/dist/framed-list.js.map +1 -0
  538. package/dist/grid.d.ts +58 -0
  539. package/dist/grid.js +6 -0
  540. package/dist/grid.js.map +1 -0
  541. package/dist/help-tags-register.d.ts +13 -0
  542. package/dist/help-tags-register.js +10 -0
  543. package/dist/help-tags-register.js.map +1 -0
  544. package/dist/index.d.ts +72 -17
  545. package/dist/index.js +84 -25
  546. package/dist/list-action-row.d.ts +69 -12
  547. package/dist/list-action-row.js +8 -1
  548. package/dist/list-detail-dialog.d.ts +123 -0
  549. package/dist/list-detail-dialog.js +167 -0
  550. package/dist/list-detail-dialog.js.map +1 -0
  551. package/dist/list-header.d.ts +72 -10
  552. package/dist/list-header.js +4 -1
  553. package/dist/list-icon-tile-B8dr97OW.d.ts +18 -0
  554. package/dist/list-inset-control.d.ts +22 -0
  555. package/dist/list-inset-control.js +3 -0
  556. package/dist/list-inset-control.js.map +1 -0
  557. package/dist/list-inset-text.d.ts +30 -0
  558. package/dist/list-inset-text.js +4 -0
  559. package/dist/list-inset-text.js.map +1 -0
  560. package/dist/list-item.d.ts +49 -5
  561. package/dist/list-item.js +4 -1
  562. package/dist/list.d.ts +149 -0
  563. package/dist/list.js +7 -0
  564. package/dist/list.js.map +1 -0
  565. package/dist/loading-spinner.d.ts +12 -2
  566. package/dist/loading-spinner.js +2 -1
  567. package/dist/lucide-icon.d.ts +23 -3
  568. package/dist/lucide-icon.js +2 -1
  569. package/dist/message-composer.d.ts +70 -0
  570. package/dist/message-composer.js +6 -0
  571. package/dist/message-composer.js.map +1 -0
  572. package/dist/nav-stack-CU_0dKtI.d.ts +194 -0
  573. package/dist/nav-stack.d.ts +15 -38
  574. package/dist/nav-stack.js +14 -1
  575. package/dist/pane.d.ts +258 -0
  576. package/dist/pane.js +6 -0
  577. package/dist/pane.js.map +1 -0
  578. package/dist/panel-toolbar-vg6Ir5Dy.d.ts +77 -0
  579. package/dist/popup-menu-register.d.ts +11 -0
  580. package/dist/popup-menu-register.js +13 -0
  581. package/dist/popup-menu-register.js.map +1 -0
  582. package/dist/popup-menu.d.ts +153 -0
  583. package/dist/popup-menu.js +7 -0
  584. package/dist/popup-menu.js.map +1 -0
  585. package/dist/progress-bar.d.ts +52 -0
  586. package/dist/progress-bar.js +68 -0
  587. package/dist/progress-bar.js.map +1 -0
  588. package/dist/progress-ring.d.ts +44 -0
  589. package/dist/progress-ring.js +73 -0
  590. package/dist/progress-ring.js.map +1 -0
  591. package/dist/radio-group.d.ts +62 -0
  592. package/dist/radio-group.js +4 -0
  593. package/dist/radio-group.js.map +1 -0
  594. package/dist/resizable-region.d.ts +32 -3
  595. package/dist/resizable-region.js +1 -1
  596. package/dist/row.d.ts +53 -0
  597. package/dist/row.js +7 -0
  598. package/dist/row.js.map +1 -0
  599. package/dist/scroll-clearance-BikHljTc.d.ts +14 -0
  600. package/dist/search-field-CrGTN5sa.d.ts +208 -0
  601. package/dist/search-field-model.d.ts +3 -0
  602. package/dist/search-field-model.js +3 -0
  603. package/dist/search-field-model.js.map +1 -0
  604. package/dist/search-field.d.ts +3 -0
  605. package/dist/search-field.js +5 -0
  606. package/dist/search-field.js.map +1 -0
  607. package/dist/segmented-control.d.ts +14 -9
  608. package/dist/segmented-control.js +1 -2
  609. package/dist/select-register.d.ts +6 -3
  610. package/dist/select-register.js +402 -8
  611. package/dist/select-register.js.map +1 -1
  612. package/dist/select.d.ts +128 -9
  613. package/dist/select.js +6 -1
  614. package/dist/selection.d.ts +54 -0
  615. package/dist/selection.js +3 -0
  616. package/dist/selection.js.map +1 -0
  617. package/dist/semantic-content-BbzjvSu9.d.ts +14 -0
  618. package/dist/semantic-tone-CdW013KF.d.ts +4 -0
  619. package/dist/sides-BPSWde0A.d.ts +4 -0
  620. package/dist/skeleton.d.ts +14 -7
  621. package/dist/skeleton.js +2 -1
  622. package/dist/slider.d.ts +74 -0
  623. package/dist/slider.js +103 -0
  624. package/dist/slider.js.map +1 -0
  625. package/dist/spacer.d.ts +18 -0
  626. package/dist/spacer.js +4 -0
  627. package/dist/spacer.js.map +1 -0
  628. package/dist/split-button.d.ts +69 -0
  629. package/dist/split-button.js +7 -0
  630. package/dist/split-button.js.map +1 -0
  631. package/dist/split-view.d.ts +66 -6
  632. package/dist/split-view.js +14 -15
  633. package/dist/split-view.js.map +1 -1
  634. package/dist/state-banner.d.ts +41 -7
  635. package/dist/state-banner.js +4 -1
  636. package/dist/styles/anchored-surface.css +44 -0
  637. package/dist/styles/backdrop-image.css +241 -0
  638. package/dist/styles/badge.css +157 -0
  639. package/dist/styles/button.css +293 -0
  640. package/dist/styles/catalog/components/catalog-example-stack.css +14 -0
  641. package/dist/styles/catalog/components/catalog-example.css +250 -0
  642. package/dist/styles/catalog/components/catalog-stage.css +61 -0
  643. package/dist/styles/catalog/components/catalog.css +26 -0
  644. package/dist/styles/catalog.css +5 -522
  645. package/dist/styles/checkbox-group.css +63 -0
  646. package/dist/styles/checkbox.css +122 -0
  647. package/dist/styles/chip.css +234 -0
  648. package/dist/styles/choice-chips.css +205 -0
  649. package/dist/styles/collapsible-panel.css +450 -16
  650. package/dist/styles/color-field.css +125 -0
  651. package/dist/styles/color-picker.css +366 -0
  652. package/dist/styles/color-swatches.css +122 -0
  653. package/dist/styles/column-track.css +57 -0
  654. package/dist/styles/combobox.css +115 -0
  655. package/dist/styles/components/actions/button/button.css +293 -0
  656. package/dist/styles/components/actions/floating-toolbar/floating-toolbar.css +119 -0
  657. package/dist/styles/components/actions/popup-menu/popup-menu.css +498 -0
  658. package/dist/styles/components/actions/split-button/split-button.css +141 -0
  659. package/dist/styles/components/actions/toolbar/toolbar.css +483 -0
  660. package/dist/styles/components/actions/toolbar-control-group/toolbar-control-group.css +1188 -0
  661. package/dist/styles/components/actions/toolbar-text/toolbar-text.css +256 -0
  662. package/dist/styles/components/collections/framed-list/framed-list.css +53 -0
  663. package/dist/styles/components/collections/list/list.css +293 -0
  664. package/dist/styles/components/collections/list-action-row/list-action-row.css +466 -0
  665. package/dist/styles/components/collections/list-header/list-header.css +236 -0
  666. package/dist/styles/components/collections/list-inset-control/list-inset-control.css +30 -0
  667. package/dist/styles/components/collections/list-inset-text/list-inset-text.css +29 -0
  668. package/dist/styles/components/collections/list-item/list-item.css +461 -0
  669. package/dist/styles/components/collections/summary-row/summary-row.css +161 -0
  670. package/dist/styles/components/data-display/value-table/value-table.css +183 -0
  671. package/dist/styles/components/feedback/anchored-surface/anchored-surface.css +44 -0
  672. package/dist/styles/components/feedback/badge/badge.css +157 -0
  673. package/dist/styles/components/feedback/chip/chip.css +234 -0
  674. package/dist/styles/components/feedback/corner-status/corner-status.css +60 -0
  675. package/dist/styles/components/feedback/edge-activity-indicator/edge-activity-indicator.css +127 -0
  676. package/dist/styles/components/feedback/empty-state/empty-state.css +47 -0
  677. package/dist/styles/components/feedback/loading-spinner/loading-spinner.css +25 -0
  678. package/dist/styles/components/feedback/progress-bar/progress-bar.css +168 -0
  679. package/dist/styles/components/feedback/progress-ring/progress-ring.css +91 -0
  680. package/dist/styles/components/feedback/skeleton/skeleton.css +92 -0
  681. package/dist/styles/components/feedback/state-banner/state-banner.css +312 -0
  682. package/dist/styles/components/forms/checkbox/checkbox.css +122 -0
  683. package/dist/styles/components/forms/checkbox-group/checkbox-group.css +63 -0
  684. package/dist/styles/components/forms/choice-chips/choice-chips.css +205 -0
  685. package/dist/styles/components/forms/color-field/color-field.css +125 -0
  686. package/dist/styles/components/forms/color-picker/color-picker.css +366 -0
  687. package/dist/styles/components/forms/color-swatches/color-swatches.css +122 -0
  688. package/dist/styles/components/forms/combobox/combobox.css +115 -0
  689. package/dist/styles/components/forms/file-picker/file-picker.css +81 -0
  690. package/dist/styles/components/forms/message-composer/message-composer.css +84 -0
  691. package/dist/styles/components/forms/radio-group/radio-group.css +158 -0
  692. package/dist/styles/components/forms/search-field/search-field.css +441 -0
  693. package/dist/styles/components/forms/segmented-control/segmented-control.css +196 -0
  694. package/dist/styles/components/forms/select/select.css +580 -0
  695. package/dist/styles/components/forms/slider/slider.css +241 -0
  696. package/dist/styles/components/forms/switch/switch.css +132 -0
  697. package/dist/styles/components/forms/tag-field/tag-field.css +8 -0
  698. package/dist/styles/components/forms/text-field/text-field.css +193 -0
  699. package/dist/styles/components/layout/collapsible-panel/collapsible-panel.css +580 -0
  700. package/dist/styles/components/layout/column-track/column-track.css +57 -0
  701. package/dist/styles/components/layout/content-swap/content-swap.css +154 -0
  702. package/dist/styles/components/layout/grid/grid.css +88 -0
  703. package/dist/styles/components/layout/pane/pane.css +780 -0
  704. package/dist/styles/components/layout/resizable-region/resizable-region.css +546 -0
  705. package/dist/styles/components/layout/row/row.css +125 -0
  706. package/dist/styles/components/layout/spacer/spacer.css +11 -0
  707. package/dist/styles/components/layout/split-view/split-view.css +171 -0
  708. package/dist/styles/components/layout/workbench/workbench.css +1098 -0
  709. package/dist/styles/components/media/lucide-icon/lucide-icon.css +15 -0
  710. package/dist/styles/components/navigation/disclosure-arrow/disclosure-arrow.css +43 -0
  711. package/dist/styles/components/navigation/nav-stack/nav-stack.css +619 -0
  712. package/dist/styles/components/navigation/tab-bar/tab-bar.css +203 -0
  713. package/dist/styles/components/navigation/tab-bar-item/tab-bar-item.css +389 -0
  714. package/dist/styles/components/navigation/tab-navigator/tab-navigator.css +460 -0
  715. package/dist/styles/components/surfaces/backdrop-image/backdrop-image.css +241 -0
  716. package/dist/styles/components/surfaces/content-item/content-item.css +168 -0
  717. package/dist/styles/components/surfaces/disclosure/disclosure.css +136 -0
  718. package/dist/styles/components/surfaces/sunken-panel/sunken-panel.css +34 -0
  719. package/dist/styles/components/surfaces/surface-scaffold/surface-scaffold.css +744 -0
  720. package/dist/styles/components/typography/text/text.css +232 -0
  721. package/dist/styles/content-item.css +168 -0
  722. package/dist/styles/content-swap.css +154 -0
  723. package/dist/styles/corner-status.css +60 -0
  724. package/dist/styles/disclosure-arrow.css +20 -0
  725. package/dist/styles/disclosure.css +136 -0
  726. package/dist/styles/document.css +98 -0
  727. package/dist/styles/edge-activity-indicator.css +127 -0
  728. package/dist/styles/file-picker.css +81 -0
  729. package/dist/styles/floating-toolbar.css +87 -6
  730. package/dist/styles/foundation.css +490 -50
  731. package/dist/styles/framed-list.css +53 -0
  732. package/dist/styles/grid.css +88 -0
  733. package/dist/styles/layout.css +3 -41
  734. package/dist/styles/list-action-row.css +324 -18
  735. package/dist/styles/list-detail-dialog.css +11 -0
  736. package/dist/styles/list-header.css +135 -59
  737. package/dist/styles/list-inset-control.css +30 -0
  738. package/dist/styles/list-inset-text.css +29 -0
  739. package/dist/styles/list-item.css +371 -33
  740. package/dist/styles/list.css +293 -0
  741. package/dist/styles/loading-spinner.css +4 -0
  742. package/dist/styles/lucide-icon.css +9 -0
  743. package/dist/styles/message-composer.css +84 -0
  744. package/dist/styles/nav-stack.css +555 -47
  745. package/dist/styles/overlay-sheet.css +211 -0
  746. package/dist/styles/overlay-toast.css +149 -0
  747. package/dist/styles/overlay-tooltip.css +55 -0
  748. package/dist/styles/pane.css +780 -0
  749. package/dist/styles/popup-menu.css +498 -0
  750. package/dist/styles/progress-bar.css +168 -0
  751. package/dist/styles/progress-ring.css +91 -0
  752. package/dist/styles/radio-group.css +158 -0
  753. package/dist/styles/resizable-region.css +439 -4
  754. package/dist/styles/row.css +125 -0
  755. package/dist/styles/search-field.css +441 -0
  756. package/dist/styles/segmented-control.css +36 -9
  757. package/dist/styles/select.css +516 -74
  758. package/dist/styles/skeleton.css +64 -3
  759. package/dist/styles/slider.css +241 -0
  760. package/dist/styles/spacer.css +11 -0
  761. package/dist/styles/split-button.css +141 -0
  762. package/dist/styles/split-view.css +139 -3
  763. package/dist/styles/state-banner.css +164 -25
  764. package/dist/styles/styles.css +38 -3
  765. package/dist/styles/summary-row.css +161 -0
  766. package/dist/styles/sunken-panel.css +34 -0
  767. package/dist/styles/surface-scaffold.css +744 -0
  768. package/dist/styles/switch.css +132 -0
  769. package/dist/styles/tab-bar-item.css +389 -0
  770. package/dist/styles/tab-bar.css +167 -9
  771. package/dist/styles/tab-navigator.css +460 -0
  772. package/dist/styles/tag-field.css +8 -0
  773. package/dist/styles/text-field.css +193 -0
  774. package/dist/styles/text.css +232 -0
  775. package/dist/styles/toolbar-control-group.css +1000 -37
  776. package/dist/styles/toolbar-text.css +223 -7
  777. package/dist/styles/toolbar.css +433 -11
  778. package/dist/styles/value-table.css +115 -7
  779. package/dist/styles/webawesome.css +474 -18
  780. package/dist/styles/workbench-dialog.css +10 -0
  781. package/dist/styles/workbench.css +1011 -7
  782. package/dist/summary-row.d.ts +56 -0
  783. package/dist/summary-row.js +4 -0
  784. package/dist/summary-row.js.map +1 -0
  785. package/dist/sunken-panel.d.ts +38 -0
  786. package/dist/sunken-panel.js +4 -0
  787. package/dist/sunken-panel.js.map +1 -0
  788. package/dist/surface-scaffold-register.d.ts +12 -0
  789. package/dist/surface-scaffold-register.js +10 -0
  790. package/dist/surface-scaffold-register.js.map +1 -0
  791. package/dist/surface-scaffold.d.ts +280 -0
  792. package/dist/surface-scaffold.js +8 -0
  793. package/dist/surface-scaffold.js.map +1 -0
  794. package/dist/switch.d.ts +38 -0
  795. package/dist/switch.js +4 -0
  796. package/dist/switch.js.map +1 -0
  797. package/dist/tab-bar-item.d.ts +65 -0
  798. package/dist/tab-bar-item.js +6 -0
  799. package/dist/tab-bar-item.js.map +1 -0
  800. package/dist/tab-bar.d.ts +33 -7
  801. package/dist/tab-bar.js +1 -1
  802. package/dist/tab-navigator.d.ts +154 -0
  803. package/dist/tab-navigator.js +131 -0
  804. package/dist/tab-navigator.js.map +1 -0
  805. package/dist/tag-field.d.ts +52 -0
  806. package/dist/tag-field.js +6 -0
  807. package/dist/tag-field.js.map +1 -0
  808. package/dist/text-field.d.ts +91 -0
  809. package/dist/text-field.js +6 -0
  810. package/dist/text-field.js.map +1 -0
  811. package/dist/text.d.ts +103 -0
  812. package/dist/text.js +3 -0
  813. package/dist/text.js.map +1 -0
  814. package/dist/toolbar-control-group.d.ts +112 -8
  815. package/dist/toolbar-control-group.js +3 -1
  816. package/dist/toolbar-text.d.ts +63 -9
  817. package/dist/toolbar-text.js +2 -1
  818. package/dist/toolbar.d.ts +77 -7
  819. package/dist/toolbar.js +1 -1
  820. package/dist/types-DmHWkSd6.d.ts +207 -0
  821. package/dist/value-table.d.ts +30 -4
  822. package/dist/value-table.js +2 -1
  823. package/dist/webawesome.d.ts +11 -1
  824. package/dist/wire-catalog.d.ts +117 -5
  825. package/dist/wire-catalog.js +314 -14
  826. package/dist/wire-catalog.js.map +1 -1
  827. package/dist/wire-checkboxes.d.ts +10 -0
  828. package/dist/wire-checkboxes.js +3 -0
  829. package/dist/{wire-token-search-fields.js.map → wire-checkboxes.js.map} +1 -1
  830. package/dist/wire-choice-chips.d.ts +17 -0
  831. package/dist/wire-choice-chips.js +4 -0
  832. package/dist/wire-choice-chips.js.map +1 -0
  833. package/dist/wire-color-fields.d.ts +33 -0
  834. package/dist/wire-color-fields.js +82 -0
  835. package/dist/wire-color-fields.js.map +1 -0
  836. package/dist/wire-color-pickers.d.ts +35 -0
  837. package/dist/wire-color-pickers.js +9 -0
  838. package/dist/wire-color-pickers.js.map +1 -0
  839. package/dist/wire-comboboxes.d.ts +26 -0
  840. package/dist/wire-comboboxes.js +4 -0
  841. package/dist/wire-comboboxes.js.map +1 -0
  842. package/dist/wire-content-items.d.ts +15 -0
  843. package/dist/wire-content-items.js +208 -0
  844. package/dist/wire-content-items.js.map +1 -0
  845. package/dist/wire-corner-status.d.ts +11 -0
  846. package/dist/wire-corner-status.js +3 -0
  847. package/dist/wire-corner-status.js.map +1 -0
  848. package/dist/wire-file-pickers.d.ts +27 -0
  849. package/dist/wire-file-pickers.js +3 -0
  850. package/dist/wire-file-pickers.js.map +1 -0
  851. package/dist/wire-list-focus-scroll.d.ts +16 -0
  852. package/dist/wire-list-focus-scroll.js +3 -0
  853. package/dist/wire-list-focus-scroll.js.map +1 -0
  854. package/dist/wire-list-reorder.d.ts +41 -0
  855. package/dist/wire-list-reorder.js +3 -0
  856. package/dist/wire-list-reorder.js.map +1 -0
  857. package/dist/wire-message-composers.d.ts +17 -0
  858. package/dist/wire-message-composers.js +3 -0
  859. package/dist/wire-message-composers.js.map +1 -0
  860. package/dist/wire-nav-stack.d.ts +4 -1
  861. package/dist/wire-nav-stack.js +352 -15
  862. package/dist/wire-nav-stack.js.map +1 -1
  863. package/dist/wire-overlay-sheets.d.ts +20 -0
  864. package/dist/wire-overlay-sheets.js +4 -0
  865. package/dist/wire-overlay-sheets.js.map +1 -0
  866. package/dist/wire-pane-chrome.d.ts +21 -0
  867. package/dist/wire-pane-chrome.js +67 -0
  868. package/dist/wire-pane-chrome.js.map +1 -0
  869. package/dist/wire-resizable-regions.d.ts +2 -1
  870. package/dist/wire-resizable-regions.js +2 -1
  871. package/dist/wire-scroll-dividers.d.ts +87 -0
  872. package/dist/wire-scroll-dividers.js +3 -0
  873. package/dist/wire-scroll-dividers.js.map +1 -0
  874. package/dist/{wire-token-search-fields.d.ts → wire-search-fields.d.ts} +34 -25
  875. package/dist/wire-search-fields.js +6 -0
  876. package/dist/wire-search-fields.js.map +1 -0
  877. package/dist/wire-sidebar.d.ts +24 -4
  878. package/dist/wire-sidebar.js +159 -45
  879. package/dist/wire-sidebar.js.map +1 -1
  880. package/dist/wire-sliders.d.ts +12 -0
  881. package/dist/wire-sliders.js +31 -0
  882. package/dist/wire-sliders.js.map +1 -0
  883. package/dist/wire-tab-bars.d.ts +6 -2
  884. package/dist/wire-tab-bars.js +1 -1
  885. package/dist/wire-tab-navigator.d.ts +13 -0
  886. package/dist/wire-tab-navigator.js +153 -0
  887. package/dist/wire-tab-navigator.js.map +1 -0
  888. package/dist/wire-tag-fields.d.ts +41 -0
  889. package/dist/wire-tag-fields.js +258 -0
  890. package/dist/wire-tag-fields.js.map +1 -0
  891. package/dist/wire-text-fields.d.ts +12 -0
  892. package/dist/wire-text-fields.js +3 -0
  893. package/dist/wire-text-fields.js.map +1 -0
  894. package/dist/wire-toolbar-visibility.d.ts +13 -0
  895. package/dist/wire-toolbar-visibility.js +3 -0
  896. package/dist/wire-toolbar-visibility.js.map +1 -0
  897. package/dist/wire-workbench.d.ts +116 -0
  898. package/dist/wire-workbench.js +6 -0
  899. package/dist/wire-workbench.js.map +1 -0
  900. package/dist/workbench-dialog.d.ts +106 -0
  901. package/dist/workbench-dialog.js +127 -0
  902. package/dist/workbench-dialog.js.map +1 -0
  903. package/dist/workbench.d.ts +258 -10
  904. package/dist/workbench.js +21 -15
  905. package/dist/workbench.js.map +1 -1
  906. package/docs/accessibility.md +829 -41
  907. package/docs/anchored-surface.md +107 -0
  908. package/docs/app-layouts.md +200 -10
  909. package/docs/apple-hig.md +2 -0
  910. package/docs/backdrop-image.md +128 -0
  911. package/docs/catalog.md +599 -63
  912. package/docs/collapsible-panel.md +308 -25
  913. package/docs/color-field.md +65 -0
  914. package/docs/color-picker.md +102 -0
  915. package/docs/color-swatches.md +46 -0
  916. package/docs/component-contract.md +865 -57
  917. package/docs/component-integration.md +75 -0
  918. package/docs/component-selection.md +1124 -108
  919. package/docs/design/templates/button/emphasis-dark.svg +1 -0
  920. package/docs/design/templates/button/emphasis.svg +1 -0
  921. package/docs/design/templates/button/full-width-dark.svg +1 -0
  922. package/docs/design/templates/button/full-width.svg +1 -0
  923. package/docs/design/templates/button/icons-dark.svg +1 -0
  924. package/docs/design/templates/button/icons.svg +1 -0
  925. package/docs/design/templates/button/pill-dark.svg +1 -0
  926. package/docs/design/templates/button/pill.svg +1 -0
  927. package/docs/design/templates/button/states-dark.svg +1 -0
  928. package/docs/design/templates/button/states.svg +1 -0
  929. package/docs/design/templates/button/toggles-dark.svg +1 -0
  930. package/docs/design/templates/button/toggles.svg +1 -0
  931. package/docs/design/templates/button/tones-dark.svg +1 -0
  932. package/docs/design/templates/button/tones.svg +1 -0
  933. package/docs/design/templates/button-dark.svg +1 -0
  934. package/docs/design/templates/button.svg +1 -0
  935. package/docs/design/templates/checkbox/compact-dark.svg +1 -0
  936. package/docs/design/templates/checkbox/compact.svg +1 -0
  937. package/docs/design/templates/checkbox/error-dark.svg +1 -0
  938. package/docs/design/templates/checkbox/error.svg +1 -0
  939. package/docs/design/templates/checkbox/mixed-dark.svg +1 -0
  940. package/docs/design/templates/checkbox/mixed.svg +1 -0
  941. package/docs/design/templates/checkbox/states-dark.svg +1 -0
  942. package/docs/design/templates/checkbox/states.svg +1 -0
  943. package/docs/design/templates/checkbox-dark.svg +1 -0
  944. package/docs/design/templates/checkbox-group/horizontal-dark.svg +1 -0
  945. package/docs/design/templates/checkbox-group/horizontal.svg +1 -0
  946. package/docs/design/templates/checkbox-group/vertical-dark.svg +1 -0
  947. package/docs/design/templates/checkbox-group/vertical.svg +1 -0
  948. package/docs/design/templates/checkbox-group-dark.svg +1 -0
  949. package/docs/design/templates/checkbox-group.svg +1 -0
  950. package/docs/design/templates/checkbox.svg +1 -0
  951. package/docs/design/templates/chip/action-filters-dark.svg +1 -0
  952. package/docs/design/templates/chip/action-filters.svg +1 -0
  953. package/docs/design/templates/chip/tags-dark.svg +1 -0
  954. package/docs/design/templates/chip/tags.svg +1 -0
  955. package/docs/design/templates/chip-dark.svg +1 -0
  956. package/docs/design/templates/chip.svg +1 -0
  957. package/docs/design/templates/choice-chips/color-palette-dark.svg +1 -0
  958. package/docs/design/templates/choice-chips/color-palette.svg +1 -0
  959. package/docs/design/templates/choice-chips/compact-icons-dark.svg +1 -0
  960. package/docs/design/templates/choice-chips/compact-icons.svg +1 -0
  961. package/docs/design/templates/choice-chips/multiple-dark.svg +1 -0
  962. package/docs/design/templates/choice-chips/multiple.svg +1 -0
  963. package/docs/design/templates/choice-chips-dark.svg +1 -0
  964. package/docs/design/templates/choice-chips.svg +1 -0
  965. package/docs/design/templates/color-field/compact-dark.svg +1 -0
  966. package/docs/design/templates/color-field/compact.svg +1 -0
  967. package/docs/design/templates/color-field/error-dark.svg +1 -0
  968. package/docs/design/templates/color-field/error.svg +1 -0
  969. package/docs/design/templates/color-field/hint-dark.svg +1 -0
  970. package/docs/design/templates/color-field/hint.svg +1 -0
  971. package/docs/design/templates/color-field-dark.svg +1 -0
  972. package/docs/design/templates/color-field.svg +1 -0
  973. package/docs/design/templates/color-picker/gray-dark.svg +1 -0
  974. package/docs/design/templates/color-picker/gray.svg +1 -0
  975. package/docs/design/templates/color-picker/hsb-dark.svg +1 -0
  976. package/docs/design/templates/color-picker/hsb.svg +1 -0
  977. package/docs/design/templates/color-picker/rgb-dark.svg +1 -0
  978. package/docs/design/templates/color-picker/rgb.svg +1 -0
  979. package/docs/design/templates/color-picker-dark.svg +1 -0
  980. package/docs/design/templates/color-picker.svg +1 -0
  981. package/docs/design/templates/color-swatches/palette-dark.svg +1 -0
  982. package/docs/design/templates/color-swatches/palette.svg +1 -0
  983. package/docs/design/templates/color-swatches-dark.svg +1 -0
  984. package/docs/design/templates/color-swatches.svg +1 -0
  985. package/docs/design/templates/disclosure/embedded-dark.svg +1 -0
  986. package/docs/design/templates/disclosure/embedded.svg +1 -0
  987. package/docs/design/templates/disclosure/framed-sunken-dark.svg +1 -0
  988. package/docs/design/templates/disclosure/framed-sunken.svg +1 -0
  989. package/docs/design/templates/disclosure/plain-dark.svg +1 -0
  990. package/docs/design/templates/disclosure/plain.svg +1 -0
  991. package/docs/design/templates/disclosure-dark.svg +1 -0
  992. package/docs/design/templates/disclosure.svg +1 -0
  993. package/docs/design/templates/empty-state/filtered-dark.svg +1 -1
  994. package/docs/design/templates/empty-state/filtered.svg +1 -1
  995. package/docs/design/templates/empty-state/with-action-dark.svg +1 -1
  996. package/docs/design/templates/empty-state/with-action.svg +1 -1
  997. package/docs/design/templates/empty-state-dark.svg +1 -7
  998. package/docs/design/templates/empty-state.svg +1 -7
  999. package/docs/design/templates/list/compact-dark.svg +1 -0
  1000. package/docs/design/templates/list/compact.svg +1 -0
  1001. package/docs/design/templates/list/stack-dark.svg +1 -0
  1002. package/docs/design/templates/list/stack.svg +1 -0
  1003. package/docs/design/templates/list-action-row/default-dark.svg +1 -1
  1004. package/docs/design/templates/list-action-row/default.svg +1 -1
  1005. package/docs/design/templates/list-action-row/icon-tile-dark.svg +1 -0
  1006. package/docs/design/templates/list-action-row/icon-tile.svg +1 -0
  1007. package/docs/design/templates/list-action-row/selected-dark.svg +1 -1
  1008. package/docs/design/templates/list-action-row/selected.svg +1 -1
  1009. package/docs/design/templates/list-action-row/trailing-menu-dark.svg +1 -0
  1010. package/docs/design/templates/list-action-row/trailing-menu.svg +1 -0
  1011. package/docs/design/templates/list-action-row-dark.svg +1 -7
  1012. package/docs/design/templates/list-action-row.svg +1 -7
  1013. package/docs/design/templates/list-dark.svg +1 -0
  1014. package/docs/design/templates/list-header/action-dark.svg +1 -1
  1015. package/docs/design/templates/list-header/action.svg +1 -1
  1016. package/docs/design/templates/list-header/count-dark.svg +1 -1
  1017. package/docs/design/templates/list-header/count.svg +1 -1
  1018. package/docs/design/templates/list-header/inline-action-dark.svg +1 -0
  1019. package/docs/design/templates/list-header/inline-action.svg +1 -0
  1020. package/docs/design/templates/list-header/size-l-dark.svg +1 -0
  1021. package/docs/design/templates/list-header/size-l.svg +1 -0
  1022. package/docs/design/templates/list-header/size-m-dark.svg +1 -0
  1023. package/docs/design/templates/list-header/size-m.svg +1 -0
  1024. package/docs/design/templates/list-header/size-xl-dark.svg +1 -0
  1025. package/docs/design/templates/list-header/size-xl.svg +1 -0
  1026. package/docs/design/templates/list-header/size-xs-dark.svg +1 -0
  1027. package/docs/design/templates/list-header/size-xs.svg +1 -0
  1028. package/docs/design/templates/list-header/toggle-collapsed-dark.svg +1 -1
  1029. package/docs/design/templates/list-header/toggle-collapsed.svg +1 -1
  1030. package/docs/design/templates/list-header/toggle-expanded-dark.svg +1 -1
  1031. package/docs/design/templates/list-header/toggle-expanded.svg +1 -1
  1032. package/docs/design/templates/list-header-dark.svg +1 -11
  1033. package/docs/design/templates/list-header.svg +1 -11
  1034. package/docs/design/templates/list-item/default-dark.svg +1 -1
  1035. package/docs/design/templates/list-item/default.svg +1 -1
  1036. package/docs/design/templates/list-item/icon-tile-dark.svg +1 -0
  1037. package/docs/design/templates/list-item/icon-tile.svg +1 -0
  1038. package/docs/design/templates/list-item/multiline-dark.svg +1 -1
  1039. package/docs/design/templates/list-item/multiline.svg +1 -1
  1040. package/docs/design/templates/list-item/selected-dark.svg +1 -1
  1041. package/docs/design/templates/list-item/selected.svg +1 -1
  1042. package/docs/design/templates/list-item/trailing-dark.svg +1 -1
  1043. package/docs/design/templates/list-item/trailing.svg +1 -1
  1044. package/docs/design/templates/list-item-dark.svg +1 -11
  1045. package/docs/design/templates/list-item.svg +1 -11
  1046. package/docs/design/templates/list.svg +1 -0
  1047. package/docs/design/templates/message-composer/chat-dark.svg +1 -0
  1048. package/docs/design/templates/message-composer/chat.svg +1 -0
  1049. package/docs/design/templates/message-composer/prompt-dark.svg +1 -0
  1050. package/docs/design/templates/message-composer/prompt.svg +1 -0
  1051. package/docs/design/templates/message-composer-dark.svg +1 -0
  1052. package/docs/design/templates/message-composer.svg +1 -0
  1053. package/docs/design/templates/progress-bar/determinate-dark.svg +1 -0
  1054. package/docs/design/templates/progress-bar/determinate.svg +1 -0
  1055. package/docs/design/templates/progress-bar/tones-dark.svg +1 -0
  1056. package/docs/design/templates/progress-bar/tones.svg +1 -0
  1057. package/docs/design/templates/progress-bar-dark.svg +1 -0
  1058. package/docs/design/templates/progress-bar.svg +1 -0
  1059. package/docs/design/templates/progress-ring/sizes-dark.svg +1 -0
  1060. package/docs/design/templates/progress-ring/sizes.svg +1 -0
  1061. package/docs/design/templates/progress-ring/tones-dark.svg +1 -0
  1062. package/docs/design/templates/progress-ring/tones.svg +1 -0
  1063. package/docs/design/templates/progress-ring-dark.svg +1 -0
  1064. package/docs/design/templates/progress-ring.svg +1 -0
  1065. package/docs/design/templates/radio-group/horizontal-dark.svg +1 -0
  1066. package/docs/design/templates/radio-group/horizontal.svg +1 -0
  1067. package/docs/design/templates/radio-group/vertical-dark.svg +1 -0
  1068. package/docs/design/templates/radio-group/vertical.svg +1 -0
  1069. package/docs/design/templates/radio-group-dark.svg +1 -0
  1070. package/docs/design/templates/radio-group.svg +1 -0
  1071. package/docs/design/templates/search-field/empty-dark.svg +1 -0
  1072. package/docs/design/templates/search-field/empty.svg +1 -0
  1073. package/docs/design/templates/search-field/tokens-dark.svg +1 -0
  1074. package/docs/design/templates/search-field/tokens.svg +1 -0
  1075. package/docs/design/templates/search-field-dark.svg +1 -0
  1076. package/docs/design/templates/search-field.svg +1 -0
  1077. package/docs/design/templates/segmented-control/equal-dark.svg +1 -1
  1078. package/docs/design/templates/segmented-control/equal.svg +1 -1
  1079. package/docs/design/templates/segmented-control/pill-small-dark.svg +1 -1
  1080. package/docs/design/templates/segmented-control/pill-small.svg +1 -1
  1081. package/docs/design/templates/segmented-control-dark.svg +1 -7
  1082. package/docs/design/templates/segmented-control.svg +1 -7
  1083. package/docs/design/templates/select/compact-dark.svg +1 -0
  1084. package/docs/design/templates/select/compact.svg +1 -0
  1085. package/docs/design/templates/select/form-dark.svg +1 -0
  1086. package/docs/design/templates/select/form.svg +1 -0
  1087. package/docs/design/templates/select/icons-dark.svg +1 -0
  1088. package/docs/design/templates/select/icons.svg +1 -0
  1089. package/docs/design/templates/select-dark.svg +1 -0
  1090. package/docs/design/templates/select.svg +1 -0
  1091. package/docs/design/templates/skeleton-dark.svg +1 -9
  1092. package/docs/design/templates/skeleton.svg +1 -9
  1093. package/docs/design/templates/slider/compact-dark.svg +1 -0
  1094. package/docs/design/templates/slider/compact.svg +1 -0
  1095. package/docs/design/templates/slider/readout-dark.svg +1 -0
  1096. package/docs/design/templates/slider/readout.svg +1 -0
  1097. package/docs/design/templates/slider/ticks-dark.svg +1 -0
  1098. package/docs/design/templates/slider/ticks.svg +1 -0
  1099. package/docs/design/templates/slider-dark.svg +1 -0
  1100. package/docs/design/templates/slider.svg +1 -0
  1101. package/docs/design/templates/split-button/full-width-dark.svg +1 -0
  1102. package/docs/design/templates/split-button/full-width.svg +1 -0
  1103. package/docs/design/templates/split-button/pill-dark.svg +1 -0
  1104. package/docs/design/templates/split-button/pill.svg +1 -0
  1105. package/docs/design/templates/split-button/states-dark.svg +1 -0
  1106. package/docs/design/templates/split-button/states.svg +1 -0
  1107. package/docs/design/templates/split-button/tones-dark.svg +1 -0
  1108. package/docs/design/templates/split-button/tones.svg +1 -0
  1109. package/docs/design/templates/split-button-dark.svg +1 -0
  1110. package/docs/design/templates/split-button.svg +1 -0
  1111. package/docs/design/templates/state-banner/danger-dark.svg +1 -1
  1112. package/docs/design/templates/state-banner/danger.svg +1 -1
  1113. package/docs/design/templates/state-banner/info-badge-dark.svg +1 -0
  1114. package/docs/design/templates/state-banner/info-badge.svg +1 -0
  1115. package/docs/design/templates/state-banner/info-dark.svg +1 -1
  1116. package/docs/design/templates/state-banner/info.svg +1 -1
  1117. package/docs/design/templates/state-banner/strip-dark.svg +1 -0
  1118. package/docs/design/templates/state-banner/strip.svg +1 -0
  1119. package/docs/design/templates/state-banner/success-dark.svg +1 -1
  1120. package/docs/design/templates/state-banner/success.svg +1 -1
  1121. package/docs/design/templates/state-banner/warning-dark.svg +1 -1
  1122. package/docs/design/templates/state-banner/warning.svg +1 -1
  1123. package/docs/design/templates/state-banner-dark.svg +1 -11
  1124. package/docs/design/templates/state-banner.svg +1 -11
  1125. package/docs/design/templates/switch/compact-dark.svg +1 -0
  1126. package/docs/design/templates/switch/compact.svg +1 -0
  1127. package/docs/design/templates/switch/states-dark.svg +1 -0
  1128. package/docs/design/templates/switch/states.svg +1 -0
  1129. package/docs/design/templates/switch-dark.svg +1 -0
  1130. package/docs/design/templates/switch.svg +1 -0
  1131. package/docs/design/templates/tab-bar/workspace-tabs-dark.svg +1 -1
  1132. package/docs/design/templates/tab-bar/workspace-tabs.svg +1 -1
  1133. package/docs/design/templates/tab-bar-dark.svg +1 -5
  1134. package/docs/design/templates/tab-bar.svg +1 -5
  1135. package/docs/design/templates/tag-field/error-dark.svg +1 -0
  1136. package/docs/design/templates/tag-field/error.svg +1 -0
  1137. package/docs/design/templates/tag-field/tags-dark.svg +1 -0
  1138. package/docs/design/templates/tag-field/tags.svg +1 -0
  1139. package/docs/design/templates/tag-field-dark.svg +1 -0
  1140. package/docs/design/templates/tag-field.svg +1 -0
  1141. package/docs/design/templates/text-field/compact-dark.svg +1 -0
  1142. package/docs/design/templates/text-field/compact.svg +1 -0
  1143. package/docs/design/templates/text-field/error-dark.svg +1 -0
  1144. package/docs/design/templates/text-field/error.svg +1 -0
  1145. package/docs/design/templates/text-field/labeled-dark.svg +1 -0
  1146. package/docs/design/templates/text-field/labeled.svg +1 -0
  1147. package/docs/design/templates/text-field/multiline-dark.svg +1 -0
  1148. package/docs/design/templates/text-field/multiline.svg +1 -0
  1149. package/docs/design/templates/text-field/number-dark.svg +1 -0
  1150. package/docs/design/templates/text-field/number.svg +1 -0
  1151. package/docs/design/templates/text-field/search-dark.svg +1 -0
  1152. package/docs/design/templates/text-field/search.svg +1 -0
  1153. package/docs/design/templates/text-field-dark.svg +1 -0
  1154. package/docs/design/templates/text-field.svg +1 -0
  1155. package/docs/design/templates/toolbar/title-and-actions-dark.svg +1 -1
  1156. package/docs/design/templates/toolbar/title-and-actions.svg +1 -1
  1157. package/docs/design/templates/toolbar/width-visibility-320-dark.svg +1 -0
  1158. package/docs/design/templates/toolbar/width-visibility-320.svg +1 -0
  1159. package/docs/design/templates/toolbar/width-visibility-600-dark.svg +1 -0
  1160. package/docs/design/templates/toolbar/width-visibility-600.svg +1 -0
  1161. package/docs/design/templates/toolbar-control-group/borderless-single-dark.svg +1 -1
  1162. package/docs/design/templates/toolbar-control-group/borderless-single.svg +1 -1
  1163. package/docs/design/templates/toolbar-control-group/glass-dark.svg +1 -0
  1164. package/docs/design/templates/toolbar-control-group/glass.svg +1 -0
  1165. package/docs/design/templates/toolbar-control-group/icon-buttons-dark.svg +1 -1
  1166. package/docs/design/templates/toolbar-control-group/icon-buttons.svg +1 -1
  1167. package/docs/design/templates/toolbar-control-group/icon-tile-brand-dark.svg +1 -0
  1168. package/docs/design/templates/toolbar-control-group/icon-tile-brand.svg +1 -0
  1169. package/docs/design/templates/toolbar-control-group/icon-tile-danger-dark.svg +1 -0
  1170. package/docs/design/templates/toolbar-control-group/icon-tile-danger.svg +1 -0
  1171. package/docs/design/templates/toolbar-control-group/icon-tile-neutral-dark.svg +1 -0
  1172. package/docs/design/templates/toolbar-control-group/icon-tile-neutral.svg +1 -0
  1173. package/docs/design/templates/toolbar-control-group/icon-tile-success-dark.svg +1 -0
  1174. package/docs/design/templates/toolbar-control-group/icon-tile-success.svg +1 -0
  1175. package/docs/design/templates/toolbar-control-group/icon-tile-warning-dark.svg +1 -0
  1176. package/docs/design/templates/toolbar-control-group/icon-tile-warning.svg +1 -0
  1177. package/docs/design/templates/toolbar-control-group/push-buttons-dark.svg +1 -1
  1178. package/docs/design/templates/toolbar-control-group/push-buttons.svg +1 -1
  1179. package/docs/design/templates/toolbar-control-group/with-text-dark.svg +1 -1
  1180. package/docs/design/templates/toolbar-control-group/with-text.svg +1 -1
  1181. package/docs/design/templates/toolbar-control-group-dark.svg +1 -11
  1182. package/docs/design/templates/toolbar-control-group.svg +1 -11
  1183. package/docs/design/templates/toolbar-dark.svg +1 -5
  1184. package/docs/design/templates/toolbar-text/dark-tone-dark.svg +1 -0
  1185. package/docs/design/templates/toolbar-text/dark-tone.svg +1 -0
  1186. package/docs/design/templates/toolbar-text/default-dark.svg +1 -1
  1187. package/docs/design/templates/toolbar-text/default.svg +1 -1
  1188. package/docs/design/templates/toolbar-text/large-dark.svg +1 -1
  1189. package/docs/design/templates/toolbar-text/large.svg +1 -1
  1190. package/docs/design/templates/toolbar-text/small-dark.svg +1 -1
  1191. package/docs/design/templates/toolbar-text/small.svg +1 -1
  1192. package/docs/design/templates/toolbar-text-dark.svg +1 -9
  1193. package/docs/design/templates/toolbar-text.svg +1 -9
  1194. package/docs/design/templates/toolbar.svg +1 -5
  1195. package/docs/design/templates/value-table/details-dark.svg +1 -1
  1196. package/docs/design/templates/value-table/details.svg +1 -1
  1197. package/docs/design/templates/value-table-dark.svg +1 -5
  1198. package/docs/design/templates/value-table.svg +1 -5
  1199. package/docs/design/templates.md +87 -33
  1200. package/docs/design-philosophy.md +65 -20
  1201. package/docs/device-class.md +10 -9
  1202. package/docs/disclosure.md +97 -0
  1203. package/docs/document-baseline.md +93 -0
  1204. package/docs/examples/application-ui-profile.json +60 -0
  1205. package/docs/examples/command-palette-adapter.tsx +69 -17
  1206. package/docs/examples/component-catalog-extension.json +52 -0
  1207. package/docs/examples/component-composition-extension.json +80 -0
  1208. package/docs/layout.md +946 -53
  1209. package/docs/list-detail-dialog.md +100 -0
  1210. package/docs/manual-test-plan.md +29 -0
  1211. package/docs/message-composer.md +156 -0
  1212. package/docs/nav-stack.md +327 -14
  1213. package/docs/overlay-toast.md +62 -0
  1214. package/docs/overlay-tooltip.md +53 -0
  1215. package/docs/progress.md +62 -0
  1216. package/docs/recipes.md +147 -73
  1217. package/docs/slider.md +64 -0
  1218. package/docs/split-view.md +96 -7
  1219. package/docs/sunken-panel.md +106 -0
  1220. package/docs/surface-scaffold.md +487 -0
  1221. package/docs/tab-navigator.md +291 -0
  1222. package/docs/tag-field.md +66 -0
  1223. package/docs/type-contracts.md +137 -0
  1224. package/docs/ui-analyzer.md +406 -0
  1225. package/docs/ui-doctor.md +298 -0
  1226. package/docs/ui-evaluator.md +139 -0
  1227. package/docs/ux-demo.md +58 -17
  1228. package/docs/webawesome-migration.md +82 -0
  1229. package/docs/webawesome-theme.md +306 -47
  1230. package/docs/workbench-dialog.md +88 -0
  1231. package/docs/workbench.md +637 -12
  1232. package/docs/writing.md +154 -0
  1233. package/doctor/cli.mjs +120 -0
  1234. package/doctor/component-style-checks.mjs +457 -0
  1235. package/doctor/config.schema.json +94 -0
  1236. package/doctor/copy-capitalization-checks.mjs +603 -0
  1237. package/doctor/eslint-diagnostics.d.mts +24 -0
  1238. package/doctor/eslint-diagnostics.mjs +24 -0
  1239. package/doctor/index.d.mts +122 -0
  1240. package/doctor/index.mjs +1424 -0
  1241. package/doctor/report.schema.json +118 -0
  1242. package/evaluator/cli.mjs +89 -0
  1243. package/evaluator/index.d.mts +90 -0
  1244. package/evaluator/index.mjs +1203 -0
  1245. package/evaluator/report.schema.json +152 -0
  1246. package/llms.txt +940 -54
  1247. package/package.json +488 -43
  1248. package/scripts/component-catalog-extension-validation.mjs +28 -0
  1249. package/traversal-exclusions.mjs +86 -0
  1250. package/ux-demo/recipes/app-shell.tsx +204 -16
  1251. package/ux-demo/recipes/collapsible-sidebar.tsx +206 -45
  1252. package/ux-demo/recipes/compact-toolbar.tsx +135 -14
  1253. package/ux-demo/recipes/composer-form.tsx +135 -24
  1254. package/ux-demo/recipes/list-detail-dialog.tsx +155 -21
  1255. package/ux-demo/recipes/list-workspace-states.tsx +183 -11
  1256. package/ux-demo/recipes/loaders.ts +11 -3
  1257. package/ux-demo/recipes/loading-inspector.tsx +162 -39
  1258. package/ux-demo/recipes/media-detail.tsx +272 -0
  1259. package/ux-demo/recipes/mount-recipe.ts +28 -11
  1260. package/ux-demo/recipes/navigation-sidebar.tsx +137 -11
  1261. package/ux-demo/recipes/navigation-stack.tsx +79 -24
  1262. package/ux-demo/recipes/types.ts +18 -2
  1263. package/ux-demo/recipes/workspace-header.tsx +86 -5
  1264. package/vite-ux-review.d.mts +83 -0
  1265. package/vite-ux-review.mjs +120 -0
  1266. package/dist/app-tab.d.ts +0 -30
  1267. package/dist/app-tab.js +0 -5
  1268. package/dist/app-tab.js.map +0 -1
  1269. package/dist/browser/app-tab.js +0 -4
  1270. package/dist/browser/panel-header.js +0 -7
  1271. package/dist/browser/token-search-field.js +0 -4
  1272. package/dist/chunk-2Z5TWHKQ.js +0 -34
  1273. package/dist/chunk-2Z5TWHKQ.js.map +0 -1
  1274. package/dist/chunk-37T3VNIZ.js +0 -19
  1275. package/dist/chunk-37T3VNIZ.js.map +0 -1
  1276. package/dist/chunk-55DATV3A.js +0 -10
  1277. package/dist/chunk-55DATV3A.js.map +0 -1
  1278. package/dist/chunk-56RJXPHG.js.map +0 -1
  1279. package/dist/chunk-5ATCDSQS.js +0 -42
  1280. package/dist/chunk-5ATCDSQS.js.map +0 -1
  1281. package/dist/chunk-5E2HVJ33.js +0 -10
  1282. package/dist/chunk-5E2HVJ33.js.map +0 -1
  1283. package/dist/chunk-7BR3DO2A.js +0 -31
  1284. package/dist/chunk-7BR3DO2A.js.map +0 -1
  1285. package/dist/chunk-7JB7VPRI.js +0 -34
  1286. package/dist/chunk-7JB7VPRI.js.map +0 -1
  1287. package/dist/chunk-7LDCTU7D.js +0 -134
  1288. package/dist/chunk-7LDCTU7D.js.map +0 -1
  1289. package/dist/chunk-AQNKJRFH.js +0 -79
  1290. package/dist/chunk-AQNKJRFH.js.map +0 -1
  1291. package/dist/chunk-AVZHJN6C.js +0 -14
  1292. package/dist/chunk-AVZHJN6C.js.map +0 -1
  1293. package/dist/chunk-B24C4A6T.js +0 -22
  1294. package/dist/chunk-B24C4A6T.js.map +0 -1
  1295. package/dist/chunk-BLK3UEEI.js +0 -23
  1296. package/dist/chunk-BLK3UEEI.js.map +0 -1
  1297. package/dist/chunk-CH4SQ6H5.js +0 -39
  1298. package/dist/chunk-CH4SQ6H5.js.map +0 -1
  1299. package/dist/chunk-DAFFDO33.js +0 -14
  1300. package/dist/chunk-DAFFDO33.js.map +0 -1
  1301. package/dist/chunk-I7INRJO4.js +0 -17
  1302. package/dist/chunk-I7INRJO4.js.map +0 -1
  1303. package/dist/chunk-L4OKFDJY.js +0 -24
  1304. package/dist/chunk-L4OKFDJY.js.map +0 -1
  1305. package/dist/chunk-LCOBDOCC.js +0 -265
  1306. package/dist/chunk-LCOBDOCC.js.map +0 -1
  1307. package/dist/chunk-M5JRI6MN.js +0 -27
  1308. package/dist/chunk-M5JRI6MN.js.map +0 -1
  1309. package/dist/chunk-RNPGFQ33.js +0 -10
  1310. package/dist/chunk-RNPGFQ33.js.map +0 -1
  1311. package/dist/chunk-RUNWEPR4.js +0 -10
  1312. package/dist/chunk-RUNWEPR4.js.map +0 -1
  1313. package/dist/chunk-W2FK7ZNY.js +0 -26
  1314. package/dist/chunk-W2FK7ZNY.js.map +0 -1
  1315. package/dist/chunk-WVPYVDXY.js +0 -15
  1316. package/dist/chunk-WVPYVDXY.js.map +0 -1
  1317. package/dist/chunk-XE5ZLPCC.js +0 -20
  1318. package/dist/chunk-XE5ZLPCC.js.map +0 -1
  1319. package/dist/chunk-XXMOARTH.js +0 -229
  1320. package/dist/chunk-XXMOARTH.js.map +0 -1
  1321. package/dist/chunk-YGN7OMLT.js.map +0 -1
  1322. package/dist/panel-header.d.ts +0 -36
  1323. package/dist/panel-header.js +0 -7
  1324. package/dist/panel-header.js.map +0 -1
  1325. package/dist/styles/app-tab.css +0 -152
  1326. package/dist/styles/panel-header.css +0 -64
  1327. package/dist/styles/tab-scaffold.css +0 -84
  1328. package/dist/styles/token-search-field.css +0 -289
  1329. package/dist/tab-scaffold.d.ts +0 -30
  1330. package/dist/tab-scaffold.js +0 -16
  1331. package/dist/tab-scaffold.js.map +0 -1
  1332. package/dist/token-search-field.d.ts +0 -43
  1333. package/dist/token-search-field.js +0 -4
  1334. package/dist/token-search-field.js.map +0 -1
  1335. package/dist/wire-tab-scaffold.d.ts +0 -11
  1336. package/dist/wire-tab-scaffold.js +0 -16
  1337. package/dist/wire-tab-scaffold.js.map +0 -1
  1338. package/dist/wire-token-search-fields.js +0 -5
  1339. package/docs/design/templates/panel-header/icon-actions-dark.svg +0 -1
  1340. package/docs/design/templates/panel-header/icon-actions.svg +0 -1
  1341. package/docs/design/templates/panel-header/icon-summary-actions-dark.svg +0 -1
  1342. package/docs/design/templates/panel-header/icon-summary-actions.svg +0 -1
  1343. package/docs/design/templates/panel-header/no-icon-dark.svg +0 -1
  1344. package/docs/design/templates/panel-header/no-icon.svg +0 -1
  1345. package/docs/design/templates/panel-header/page-heading-dark.svg +0 -1
  1346. package/docs/design/templates/panel-header/page-heading.svg +0 -1
  1347. package/docs/design/templates/panel-header/title-only-dark.svg +0 -1
  1348. package/docs/design/templates/panel-header/title-only.svg +0 -1
  1349. package/docs/design/templates/panel-header-dark.svg +0 -13
  1350. package/docs/design/templates/panel-header.svg +0 -13
  1351. package/docs/design/templates/token-search-field/empty-dark.svg +0 -1
  1352. package/docs/design/templates/token-search-field/empty.svg +0 -1
  1353. package/docs/design/templates/token-search-field/tokens-dark.svg +0 -1
  1354. package/docs/design/templates/token-search-field/tokens.svg +0 -1
  1355. package/docs/design/templates/token-search-field-dark.svg +0 -7
  1356. package/docs/design/templates/token-search-field.svg +0 -7
  1357. package/docs/tab-scaffold.md +0 -41
  1358. package/ux-demo/recipes/recipes.css +0 -448
@@ -5,15 +5,267 @@ These are normative contracts for package components and consuming applications.
5
5
  ## Shared rules
6
6
 
7
7
  - All controls have accessible names and visible `:focus-visible` treatment.
8
- - Decorative `LucideIcon` output is `aria-hidden`; pass `label` only when the SVG itself conveys meaning.
9
- - `ListItem` uses native button Enter/Space behavior. `selected` maps to `aria-current="page"`; `pressed` maps to `aria-pressed`. Its `trailing` content is dormant and must not contain controls. Its `rootAttributes` slot accepts only application `data-*` metadata and deliberately cannot emit `role="menuitem"` in isolation—a true ARIA menu must own arrow, Home/End, Escape, and focus behavior as one widget.
10
- - `ListHeader` owns action naming, disabled state, and disclosure `aria-expanded`. Toggle mode supplies one decorative 18px `DisclosureArrow` when `actionIcon` is omitted; it mirrors `expanded` while the native button's accessible name stays stable. The application must update that controlled state and reveal or hide real content. A valid `count` is visually rendered in an `aria-hidden` neutral pill while the required localized `countLabel` becomes part of the owning heading or disclosure button's accessible name; zero remains a real count. Its narrow `triggerAttributes` slot may describe a native popover or controlled-content relationship with `popoverTarget`, `popoverTargetAction`, `aria-controls`, and `aria-haspopup`; the application owns the target surface and its focus/dismissal behavior.
11
- - In any `.kui-pane`, menu rows, `ListHeader` actions, and toolbar groups keep a minimum 44px target in both dimensions. A `ListHeader` fills the available inline width and keeps that action at the logical end, including in RTL. Its action visual defaults to 18px through `--kui-list-header-action-icon-size`; do not reduce the target to the visible icon.
8
+ - Decorative `LucideIcon` output is `aria-hidden`; pass `label` only when the SVG itself conveys meaning. `size="xs|s|m|l|xl"` selects the 12/16/20/24/32px root-scaled icon steps, and a positive numeric `size` converts pixels to rem; omitting `size` keeps 1em. Size changes the visual only, never the owning control's hit target or accessible name.
9
+ - `ListItem` uses native button Enter/Space behavior. `selected` maps to `aria-current="page"`; `pressed` maps to `aria-pressed`. Selected rows keep the normal foreground over their brand-tinted fill so text retains WCAG AA contrast in light and dark themes. Its leading icon visual is 18px while the row retains its 44px minimum target; multiline icons align to the first text line. Its `trailing` content is dormant and must not contain controls. Its `rootAttributes` slot accepts only application `data-*` metadata and deliberately cannot emit `role="menuitem"` in isolation—a true ARIA menu must own arrow, Home/End, Escape, and focus behavior as one widget.
10
+ - `ListItemLink` shares that row content and geometry but uses native anchor Enter behavior and requires `href`. It has no `action` or `pressed` state. `external` opens a new tab with `rel="noopener noreferrer"`; the default accessible name announces the new tab for a string label, so an explicit `accessibleLabel` should do the same. Disabled and loading links omit `href`, expose `aria-disabled`, and leave the tab order. Its trailing content remains dormant.
11
+ - `ListHeader` owns action naming, disabled state, and disclosure `aria-expanded`. Toggle mode supplies one decorative 18px `DisclosureArrow` when `actionIcon` is omitted; it mirrors `expanded` while the native button's accessible name stays stable. The application must update that controlled state and reveal or hide real content. A valid `count` is visually rendered in an `aria-hidden` neutral pill while the required localized `countLabel` becomes part of the owning heading or disclosure button's accessible name; zero remains a real count. Optional `badge` and `status` content can appear together and should each carry meaningful text. Its narrow `triggerAttributes` slot may describe a native popover or controlled-content relationship with `popoverTarget`, `popoverTargetAction`, `aria-controls`, and `aria-haspopup`; the application owns the target surface and its focus/dismissal behavior.
12
+ - Dispose `wireTabBars` and `wireSearchFields` with their owning view. Disposal cancels queued controlled-render focus restoration, so a torn-down view cannot reclaim focus from its successor.
13
+ - `wireNavStack` moves focus into every newly active top view and remembers the last focused descendant of each mounted view for pop restoration. Mark a preferred initial heading or control with `data-nav-focus` (and `tabindex="-1"` when it is not normally tabbable); otherwise the helper uses the first enabled focusable descendant, then a programmatically focusable view-container fallback.
14
+ - In any `.kui-pane`, menu rows, `ListHeader` actions, and toolbar groups keep a minimum 44px target in both dimensions. A `ListHeader` fills the available inline width and keeps that action at the logical end, including in RTL. Its action visual defaults to 18px through `--kui-list-header-action-icon-size` inside a fitted 36px hover square; a transparent hit layer extends the pointer target to at least 44 × 44 around that square without moving layout or enlarging the painted surface. Compact headers are 36px tall like the rest of the compact List family, so their action target is 44px wide and clamped to the 36px header height instead of reaching into a neighboring row. Do not reduce the target to the visible icon, and do not force the button itself to 44px.
12
15
  - `LoadingSpinner` is either labeled (`role="img"`) or hidden. Its rotation stops for reduced motion.
13
- - `StateBanner` defaults to polite `role="status"`; use `urgency="alert"` only for an attention-requiring failure.
16
+ - A busy `ToolbarControlGroup` makes its controls inert and exposes `aria-busy`; its `busyLabel` is announced by an adjacent status node outside the inert group. Clear `busy` when the operation finishes so the controls rejoin the focus order.
17
+ - A bottom `Toolbar` uses `position="footer"` for footer semantics; top toolbars keep the default `header`. Workbench's main bottom toolbar sets this automatically.
18
+ - Interactive `ContentItem` cards are keyboard reachable. Set `selectionMode="toggle"` for a pressed button, `selectionMode="single"` for an option inside a listbox, or `selectionMode="multiple"` for a selectable row with a gridcell that can contain native controls. Place multiple-mode rows inside a labeled `List` or `Grid` with `selectionMode="multiple"`; the app owns the selection set and range gestures. Wire `wireContentItems` once so Enter and Space on the card activate its delegated action without activating it from a nested control. The activation click mirrors the key's Shift, Ctrl, and Cmd state, so Shift+Enter or Shift+Space can extend a range and Cmd/Ctrl+Enter or Cmd/Ctrl+Space can toggle one item through the same click handler a pointer uses. Disabled cards expose `aria-disabled` and leave the Tab order.
19
+ - An unlabeled `Skeleton` (including the value slots a component's `placeholder` prop renders) is decorative loading chrome: it is `aria-hidden`, conveys no information a user needs to act on, and is deliberately exempt from the WCAG 3:1 non-text-contrast target. Inside a solid `Badge` it stays subtle (about 2.1–4.4:1 in light, 2.4–2.8:1 in dark, depending on tone); `tests/browser/tone-contrast.spec.ts` holds those values as a regression floor rather than an accessibility threshold. Announce loading through a labeled `Skeleton`, `LoadingSpinner`, or `aria-busy` on the owning region, never through the skeleton's visibility.
20
+ - `StateBanner` defaults to polite `role="status"`; use `urgency="alert"` only for an attention-requiring failure. Its optional `badge` is persistent inline status/count content beside the title and is announced as part of the banner; keep it terse and do not rely on color alone for its meaning.
21
+ - A removable `Chip` has a native button with a specific `removeLabel`, such as "Remove Urgent tag". The button is absent for a plain chip and disabled for a disabled chip. Its leading `icon` is decorative; the visible label names the tag. `truncate` retains the full plain-text label as a native tooltip. Tag text remains visible because tone does not convey meaning alone. A link `Chip` (`href`) is a native anchor named by its visible label, with no remove button; `external` adds `target="_blank"`, `rel="noopener noreferrer"`, and an "(opens in new tab)" name suffix for a text label, and a disabled link chip drops `href`, sets `aria-disabled`, and leaves the tab order. `tone="inherit"` paints no fill, so its label keeps the surrounding text's contrast (a brand-loud bubble's white text included), and its focus ring is drawn in the surrounding foreground so it stays visible on a brand-colored surface. An action `Chip` (`action`) is one native `<button type="button">` with no nested control: its visible label names it unless `actionLabel` supplies a fuller name, which should contain that label ("Insert filter is:mine"). Enter and Space activate it, keyboard focus draws the focus ring (in the surrounding foreground for `tone="inherit"`), and a disabled action chip is a disabled button that leaves the tab order.
14
22
  - `EmptyState` reports busy state through `aria-busy` and never relies on an illustration as its label.
15
23
  - `Select` follows the Web Awesome host's standard `input`/`change` events. Application tests verify the live `value`, focus, and events—not attributes alone. Its decorative option icons and value-dependent selected content remain present after controlled rerenders, so the visible choice does not silently lose its non-text cue.
16
- - `DisclosureArrow` is an 18px root-scaled decorative visual by default, not an interaction target. Its owning native control supplies a stable accessible name, pointer and keyboard interaction, and `aria-expanded`; multiple arrows keep independently controlled state. Consumers may override `--kui-disclosure-arrow-size` without changing that ownership. Configured directions animate over the shortest path; a 180-degree closed-to-open tie uses counterclockwise rotation.
24
+ - `DisclosureArrow` is an 18px root-scaled decorative visual by default, not an interaction target. Its owning native control supplies a stable accessible name, pointer and keyboard interaction, and `aria-expanded`; multiple arrows keep independently controlled state. Consumers may resize it with the typed `size` prop without changing that ownership. Configured directions animate over the shortest path; a 180-degree closed-to-open tie uses counterclockwise rotation.
25
+ - `List` is layout-only by default and adds no `list` role. With `selectionMode="multiple"` and a required `ariaLabel`, it becomes a multi-select grid for `ContentItem` rows. With `wireContentItems` the grid is one Tab stop (roving `tabindex` on the last focused row, else the first selected, else the first enabled), kept across re-renders. Content that sits between rows but is not selectable (an activity group, a "messages skipped" divider) is a `ContentItem gridRow`: a `role="row"` with a `gridcell`, no `aria-selected`, and no Tab stop of its own; arrow keys skip it and its controls stay reachable by Tab. Give a scrollable List a bounded block size, avoid nested scroll owners, and keep focused children visible while scrolling.
26
+ - `Grid` is layout-only by default. With `selectionMode="multiple"` and a required `ariaLabel`, it becomes a multi-select grid for `ContentItem` tiles; each tile remains a row with a gridcell, including when the CSS grid wraps.
27
+
28
+ In a multi-select ContentItem grid, `wireContentItems` moves focus between
29
+ enabled rows on Up/Down and to the first/last enabled row on Home/End. Native
30
+ controls inside a row retain those keys. In a `Grid`, Left/Right moves between
31
+ tiles on the same rendered line and Up/Down moves to the nearest tile in the
32
+ adjacent rendered line; Home/End reaches the first/last enabled tile. The
33
+ navigation reads live geometry, so responsive column changes need no rewiring.
34
+ The application changes selection
35
+ on card activation; `applySelection` and `selectionGesture` from
36
+ `@kerfjs/ui/selection` give it the platform-normalized replace,
37
+ Cmd/Ctrl-toggle, and Shift-range model.
38
+ With delegated click actions, use `isContentItemActivation(event, card)` in the
39
+ card's selection handler so a nested menu trigger or other control does not
40
+ also select the card.
41
+
42
+ ## Select
43
+
44
+ Supply a visible `label`, or `ariaLabel` when the surrounding interface already
45
+ provides visual context. A nonempty `label` takes precedence when both are
46
+ supplied. Kerf forwards that name through Web Awesome's internal label contract;
47
+ an `aria-label` on the custom-element host alone cannot name its shadow
48
+ combobox. With `ariaLabel` alone, Kerf visually hides the internal label without
49
+ adding height or spacing. This also applies to `renderSelected`: selected content
50
+ stays separate from the control's stable accessible name. Applications do not
51
+ need shadow-DOM patches or extra label styling.
52
+
53
+ Set `multiple` (with an array `value`) to let the person choose any number
54
+ of choices. The popup stays open while they toggle choices with the pointer,
55
+ Enter, or Space, and closes on an outside press, Escape, or focus leaving,
56
+ returning focus to the combobox. The listbox is `aria-multiselectable`, each
57
+ chosen option shows its check, and the closed control reads the chosen labels
58
+ in choice order as one short localized list (the `placeholderText` when none
59
+ are chosen) instead of a removable tag per choice. `change` and `input` report
60
+ the value array; in a form, every chosen value is submitted under `name`.
61
+ Disabled choices remain visible with `aria-disabled` and cannot be selected;
62
+ `disabledReason` adds a native tooltip. For a multiple Select, opt-in
63
+ `selectAllLabel` and `clearLabel` render named footer buttons. They keep the
64
+ popup open, select only enabled choices or clear the selection, and emit the
65
+ ordinary `input` and `change` events only when the value changes. Their labels
66
+ come from the application so they can be localized.
67
+
68
+ A toolbar filter menu (a "Filter by label" funnel) is a multiple Select with
69
+ `selectedPresentation="icon-only"` and a fixed `triggerIcon`; the types accept
70
+ `triggerIcon` only there, and require it there, because no single chosen
71
+ choice has an icon to show. The trigger keeps the icon-only pill geometry
72
+ below: the fixed icon, then, while any choice is chosen, a compact brand
73
+ `Badge` with the count 4px after it, then the caret. The badge is hidden from
74
+ assistive technology; instead the combobox's accessible name ends with the
75
+ chosen labels in choice order ("Filter by label: Bug, Docs", just "Filter by
76
+ label" when none are chosen), and its hidden value text stays empty so screen
77
+ readers do not announce the list twice. With a visible `label` the same summary
78
+ reads in the label, standing in for the hidden value.
79
+
80
+ Use `presentation="toolbar-borderless"` inside a `ToolbarControlGroup`, with
81
+ `size="compact"` in a compact group; set `focusRingOwner="group"` when that
82
+ parent paints the composed focus ring. `selectedPresentation="icon-only"` hides
83
+ only the visible selected label—the required `label` or `ariaLabel` still names
84
+ the combobox. An icon-only trigger keeps its disclosure caret: the selected icon
85
+ and caret form one pill with the same geometry as a `PopupMenu`
86
+ trigger (8px inline padding on both sides, 12px from the icon to the caret, a
87
+ 40px default or 32px compact control height), so the caret still signals a
88
+ choice list. Inside a group the trigger is inset evenly on every side (2px in a
89
+ default group, 1px in a compact one) with a concentric radius; the group grows
90
+ to the trigger's width, so a single group is wider than it is tall and its
91
+ focus ring follows the pill while focused. While the listbox is open the
92
+ trigger drops its ring, as a `PopupMenu` trigger does: the open popup and its
93
+ current option show where focus is, and the ring returns when the listbox
94
+ closes with focus still on the control. A group that owns the ring
95
+ (`focusRing="outline"` or `"halo"`) drops it the same way while a Select
96
+ listbox or `PopupMenu` inside the group is open.
97
+ Beside other controls in one group, the icon-only trigger is one more segment:
98
+ it keeps the group's gap and its siblings' block inset, height, item radius,
99
+ and hover pill. In a group with per-control rings (`focusRing="control"`, the
100
+ default) it paints the same ring as its sibling buttons, even when
101
+ `focusRingOwner="group"` was set, because no group ring would show focus.
102
+ Navigation selects can use intrinsic `presentation="navigation"` plus
103
+ `labelMaxWidth` for component-owned ellipsis. These props own the control's
104
+ appearance; its parent continues to own outer placement.
105
+
106
+ Use `presentation="inline"` with a single-value `renderSelected` when the
107
+ selected content, such as a `Badge`, already provides the trigger chrome. The
108
+ closed combobox has no minimum height, inline padding, or border width, so the
109
+ rendered content defines its box. The Select still owns the focus ring,
110
+ accessible combobox name, and listbox interaction; keep `label` or `ariaLabel`
111
+ even when the selected content shows its own short text.
112
+
113
+ Use `hint` for persistent supporting text below the control; use
114
+ `placeholderText` only for the empty value shown inside the closed control.
115
+ The hint renders below the control and is the trigger's `aria-description`. The
116
+ accessible control is the light-DOM trigger button (`role="combobox"`), not the
117
+ `kui-select` root; inspect or test the element returned by the `combobox` role.
118
+ Loading placeholders keep the same visible hint while replacing the interactive
119
+ control with inert chrome.
120
+
121
+ `tests/unit/components.test.tsx` covers name projection and visible/hidden label
122
+ variants. `tests/browser/select-accessibility.spec.ts` verifies actual accessible
123
+ names, unchanged unlabeled geometry, keyboard selection, controlled rerenders,
124
+ hint wiring, and wide/narrow presentation in Chromium, Firefox, and WebKit.
125
+
126
+ The explicit `@kerfjs/ui/select/register` import defines the form-associated
127
+ `kui-select` root and wires every Select in the document. The trigger opens the
128
+ listbox (`role="listbox"`, `aria-multiselectable` when `multiple`) as a manual
129
+ popover in the top layer, below the trigger and flipping above when short, with
130
+ focus on the chosen option. In the listbox the arrow keys move and wrap,
131
+ Home/End jump, typing a label's first letters moves to it, and Enter or Space
132
+ chooses; a single Select then closes and returns focus to the trigger, while a
133
+ multiple Select stays open. Escape closes and returns focus to the trigger; Tab
134
+ and an outside press close it. Options are `role="option"` elements with
135
+ `aria-selected` and, for a disabled choice, `aria-disabled`; the template
136
+ renders them, so a re-render keeps them. `tests/unit/select-controller.test.tsx`
137
+ covers the keyboard, choice, and form contracts;
138
+ `tests/browser/select-lifecycle.spec.ts` repeats open/close/resize/reopen
139
+ sequences at wide and narrow widths in Chromium, Firefox, and WebKit.
140
+
141
+ ### Help tags on icon-only triggers
142
+
143
+ An icon-only control has no visible title, so sighted pointer and keyboard users
144
+ would otherwise see only its icon (and a filter's count). Following the Apple
145
+ HIG convention for toolbar items, three kinds of icon-only control show a help
146
+ tag: a Web Awesome `wa-tooltip` in the theme's tooltip palette, below the
147
+ control.
148
+
149
+ - an icon-only `Select` (`selectedPresentation="icon-only"`, single or
150
+ `multiple`);
151
+ - an icon-only `PopupMenu` (named by `label` rather than visible `text`);
152
+ - an icon-only `<button>` or link (`<a href>`) inside a `ToolbarControlGroup`,
153
+ named by a non-empty `aria-label`, with no visible text, no native `title`,
154
+ and no Web Awesome tooltip `for` it.
155
+
156
+ Tags are on by default and take no props. One document-level installer covers
157
+ all three kinds, and any of `@kerfjs/ui/select/register`,
158
+ `@kerfjs/ui/popup-menu/register`, or `@kerfjs/ui/help-tags/register` installs
159
+ it (once per document, however many are imported). An application whose
160
+ toolbars have icon-only buttons but no registered `Select` or `PopupMenu`
161
+ imports `@kerfjs/ui/help-tags/register`, which installs only the help tags.
162
+ The tag is Kerf's own element (no Web Awesome): one `aria-hidden`,
163
+ `popover="manual"` element in the top layer, placed 8px below its trigger
164
+ (flipping above when short, kept 8px clear of the viewport edge), styled by a
165
+ zero-specificity stylesheet the installer adopts so a theme can restyle it.
166
+ Pure `SafeHtml` rendering stays zero-JS: without an installer, nothing shows a
167
+ tag.
168
+
169
+ - **Text.** The tag says what the accessible name says: a filter's name and
170
+ chosen labels ("Filter by label: Bug, Docs", or "Filter by label" when none
171
+ are chosen), a single Select's name and current choice ("Rendering balance:
172
+ Balanced"), a menu's `label` ("Sort tickets"), or a toolbar button's
173
+ `aria-label` ("Pin view"). It updates with the selection.
174
+ - **Showing.** It appears after the pointer rests on the control for 500ms, at
175
+ once when a neighboring tag closed moments ago (so scanning along a toolbar
176
+ stays quick, across buttons, Selects, and menus alike), and immediately on
177
+ keyboard focus (`:focus-visible`). A pointer press that focuses the control
178
+ and touch input never show it.
179
+ - **Hiding.** It hides when the pointer and keyboard focus have both left the
180
+ control, on a press, on Escape, and whenever a popup opens. It does not come
181
+ back when the popup closes and focus returns to the trigger, or while the
182
+ pointer stays on a pressed button; it returns after the pointer moves onto
183
+ something else or focus leaves and comes back.
184
+ - **Assistive technology.** The tag is `aria-hidden` and never joins the
185
+ control's `aria-labelledby` or `aria-describedby` (kerf anchors it directly
186
+ rather than through `for`), so the accessible name is unchanged and announced
187
+ once; the accessibility tree is identical with the tag open or closed.
188
+ - **Isolation.** A Select's or PopupMenu's tag lives in the control's own
189
+ shadow root, so the morph never touches it and light-DOM `:has([open])`
190
+ selectors do not see it. A plain button cannot host a shadow root, so its tag
191
+ lives in one `aria-hidden`, `data-morph-skip` layer at the end of `<body>`
192
+ (fixed and zero-sized, so it never joins a grid or flex body's flow, and
193
+ re-attached if a body re-render drops it) and leaves that layer once hidden.
194
+ It copies the button's `color-scheme`, so it matches a subtree theme, and its
195
+ popup renders in the browser's top layer, so it shows above a modal dialog
196
+ that holds the button. Tags' `wa-show` / `wa-hide` lifecycle events stop at
197
+ the tag, so a listener on the control (or a delegated one above it) hears only
198
+ the popup; a document capture-phase listener still observes them. A long tag
199
+ wraps at the tooltip's maximum width and keeps 8px clear of the viewport
200
+ edge.
201
+
202
+ A labeled Select, a `PopupMenu` with visible `text`, and a toolbar button with
203
+ visible text get no tag: their visible text already names them. A button that
204
+ carries a native `title`, or that the application has already given a
205
+ `wa-tooltip` `for` its `id`, keeps that and gets no second tag, so nothing is
206
+ shown twice. Zero-JS components that name an icon control with a native `title`
207
+ (the `ListHeader` action, the `TabBarItem` close button, the `SearchField`
208
+ reveal and clear buttons, and `SegmentedControl` choice titles) keep the
209
+ browser's own tooltip, which needs no script; the installer deliberately skips
210
+ them rather than stacking a second tag on the first. Icon-only buttons outside
211
+ a `ToolbarControlGroup` are application markup and keep whatever naming the
212
+ application gives them.
213
+ `tests/unit/help-tag.test.ts` walks the hover, focus, press, Escape, popup, and
214
+ warm-window transitions for every kind; `tests/browser/select-help-tag.spec.ts`
215
+ and `tests/browser/toolbar-help-tag.spec.ts` check the real elements in
216
+ Chromium.
217
+
218
+ ## PopupMenu
219
+
220
+ `PopupMenu` is Kerf's own menu: a native trigger `<button>` and a `role="menu"`
221
+ panel that opens as a manual popover in the top layer, wired by
222
+ `@kerfjs/ui/popup-menu/register`. The trigger carries `aria-haspopup="menu"`
223
+ and an `aria-expanded` that follows the menu. An icon-only trigger requires
224
+ `label`, which renders as visually hidden text inside the button; a trigger
225
+ with visible `text` is named by that text. An icon-only trigger also shows its
226
+ `label` as an `aria-hidden` help tag on hover and keyboard focus (see
227
+ [Help tags on icon-only triggers](#help-tags-on-icon-only-triggers)).
228
+ The open menu carries that same name as its `aria-label` (a context or
229
+ icon-only `label`, or the visible `text`), and each submenu panel is named by
230
+ its parent item's label, so it is announced as, for example, "More Actions,
231
+ menu". `tests/browser/popup-menu-accessible-name.spec.ts` finds each panel with
232
+ `getByRole('menu', { name })` in Chromium, Firefox, and WebKit.
233
+
234
+ Items are `menuitem` (or `menuitemcheckbox`, with `aria-checked`) buttons;
235
+ a disabled item keeps `aria-disabled="true"`, stays in the menu, is skipped by
236
+ the arrow keys, and cannot be chosen (its click never reaches the
237
+ application's `data-action`). Disable the whole trigger only when every command
238
+ is unavailable. A heading names the `role="group"` that holds the items under
239
+ it and is itself hidden from assistive technology, so its words are announced
240
+ once; dividers are `role="separator"`. A keyboard-focused item is the menu's
241
+ current row, painted with the Select's current-option fill rather than a second
242
+ focus ring inside the open popup.
243
+
244
+ The keyboard follows the menu-button pattern. Enter, Space, or ArrowDown on the
245
+ trigger opens the menu on its first item, and ArrowUp on its last. ArrowUp and
246
+ ArrowDown move and wrap, Home and End jump, and typing the first letters of a
247
+ label moves to it. Enter or Space chooses the current item; a choice closes the
248
+ menu and returns focus to the trigger. ArrowRight opens a submenu on its first
249
+ item and ArrowLeft returns to the parent item (mirrored right to left); a key
250
+ pressed while a submenu is still fading in lands on the item it names. Escape
251
+ closes the current level and returns focus to its opener, so an enclosing
252
+ dialog stays open; Tab closes the menu and continues from the trigger. A press
253
+ anywhere outside an open menu closes it, including a context menu opened by
254
+ that same press.
255
+
256
+ Hovering an item that has a submenu opens it. While a pointer-opened submenu
257
+ is showing, a "safe triangle" from the pointer to the submenu's near edge keeps
258
+ a diagonal move toward the submenu from closing it as the pointer crosses the
259
+ parent's other rows; moving onto another item of the parent closes it after a
260
+ short grace period. Set `checked` to `true` or `false` for checkbox menu
261
+ semantics; omit it for a plain command. The application owns that state: a
262
+ choice reports the state it asks for in the root's `kui-menu-select` event, and the
263
+ menu shows the new state once the application renders it. `details` supplies
264
+ optional trailing visual content without changing a command's accessible
265
+ label. A `context` menu's invisible anchor is outside the accessibility tree
266
+ and normal Tab order; opening the menu moves focus into its commands and Escape
267
+ dismisses it. Keep a separate visible row action named even when it is
268
+ disabled.
17
269
 
18
270
  ## ListActionRow
19
271
 
@@ -25,37 +277,119 @@ the row's item id for application delegation, while the root deliberately has
25
277
  no action or role. `label`, `icon`, and `trailingActionIcon` are dormant visual
26
278
  content and must not contain buttons, links, interactive roles, or other
27
279
  controls. A trailing click, double click, context menu, Enter, or Space
28
- must never activate the primary control. The application owns controlled
280
+ must never activate the primary control. Selected rows keep the normal
281
+ foreground over their brand-tinted fill so text retains WCAG AA contrast in
282
+ light and dark themes. The application owns controlled
29
283
  selection and the lifecycle, focus, and dismissal policy of any related
30
284
  popover or context menu.
31
285
 
286
+ With `trailingMenu`, the trailing control is a `PopupMenu` trigger instead of
287
+ the native trailing button: an icon-only Web Awesome button named by
288
+ `trailingMenu.label`, announced with `aria-haspopup="menu"` and
289
+ `aria-expanded`, in the same primary-then-trailing order. Opening it moves
290
+ focus to the first command; Escape or a choice closes the menu and returns
291
+ focus to the trigger. An interaction-revealed trigger stays visible while its
292
+ menu is open. A pointer opening through `openPopupMenuAt` (for example from
293
+ the row's `contextmenu`) keeps the same keyboard and dismissal behavior.
294
+
295
+ ## Reorderable list rows
296
+
297
+ A `draggable` `ListItem`, `ListItemLink`, or `ListActionRow` is a native HTML
298
+ drag source (a `ListActionRow` is dragged by its noninteractive root, so its two
299
+ buttons keep their own activation). Pointer dragging is never the only way to
300
+ reorder: `wireListReorder()` moves the focused row (or, when it is selected or
301
+ pressed, every selected row of its list) with Alt+Shift+ArrowUp and
302
+ Alt+Shift+ArrowDown, and returns focus to the moved row's focusable control
303
+ after the application re-renders. The dragged rows dim and the drop target
304
+ draws a 2px brand insertion line (system `Highlight` in forced colors), so the
305
+ landing position never relies on color alone. A loading placeholder is never
306
+ draggable. The application owns order, selection, and any announcement of the
307
+ completed move.
308
+
32
309
  ## ResizableRegion
33
310
 
311
+ Set `responsiveFillAt="narrow"` or `"compact"` when a responsive composition
312
+ shows the region as its only inline track. The component then owns its
313
+ full-width geometry and removes its dormant separator at that container
314
+ breakpoint; the application owns which pane is visible.
315
+
34
316
  The handle exposes separator role, orientation, name, minimum, maximum, and current values. `wireResizableRegions()` adds:
35
317
 
36
318
  - the axis arrow keys in 16 px steps by default;
37
319
  - Shift+Arrow in 64 px steps;
38
320
  - Home and End for minimum and maximum;
39
321
  - primary-pointer drag with clamping;
40
- - preview callbacks while dragging and one commit callback on release.
322
+ - a visible maximum: when a parent clamps the track below the requested size
323
+ (a `max-width` stage, a narrow container), pointer and keyboard resizing stop
324
+ at the size actually shown, and the handle announces that size in
325
+ `aria-valuenow` and that bound in `aria-valuemax`. Focusing the handle
326
+ reports a stale larger committed size as the shown size without committing
327
+ it, so the first key press moves the visible separator. The reported values
328
+ also stay current at rest: a `ResizeObserver` on each region and its parent
329
+ re-clamps them when the space changes, and a `MutationObserver` re-clamps
330
+ them after a re-render writes the rendered props back, so assistive
331
+ technology never reads an unclamped size between interactions (the
332
+ disposer disconnects both observers);
333
+ - a truthful value below the minimum: when the container shows the track at
334
+ less than `min` (a narrowing `Workbench` squeezes its resizable rails), the
335
+ handle reports that shown size in `aria-valuenow` and pins `aria-valuemin`
336
+ and `aria-valuemax` to it — WAI-ARIA requires the value to lie inside the
337
+ range, and the separator cannot move a track its container holds. A pinned
338
+ separator — squeezed, or with a reachable range collapsed to one size —
339
+ commits nothing: arrow keys, Home/End, and drags leave the app's size (and
340
+ its storage) as it was, so the track returns to it, with the rendered range,
341
+ once it has room;
342
+ - a whole hit target and focus ring at a clamped edge: when the separator has
343
+ less room past it than the handle's 10px overhang (a parent clamps the track
344
+ to its own edge), the region carries `data-handle-inset` and the handle sits
345
+ wholly inside it, so a clipping ancestor cannot cut off half the handle or
346
+ its focus ring. The ring is drawn inside the handle's box, so the region's
347
+ ends meeting a clipping edge never shave it either;
348
+ - preview callbacks while dragging and one commit callback on release;
349
+ - a live size that also resizes slide-motion content, so the content tracks the
350
+ separator during a drag or key press instead of waiting for the app to
351
+ re-render the committed size.
41
352
 
42
353
  The application owns persistence and collapsed/expanded policy. Keep the last expanded size outside the component and restore it when reopening. An optional `handleIcon` replaces only decorative dormant content; it must not contain controls or interactive roles because the separator remains the sole focus and interaction owner.
43
354
 
44
- ## PanelHeader
355
+ ## Toolbar headings
356
+
357
+ For headings and paragraphs outside toolbar identity/title zones, use `Text`.
358
+ It renders the selected native `h1`–`h6` or `p` element, so heading navigation
359
+ follows the variant directly; choose a level that preserves the document
360
+ outline. Native global, `data-*`, and `aria-*` attributes pass through.
45
361
 
46
- `PanelHeader` is a plain `Toolbar` heading. Its leading zone holds an optional
47
- icon (a normal bordered `ToolbarControlGroup`) and the title as extra-large
48
- `ToolbarText`, and the app's trailing controls go straight into the trailing
49
- zone. By default the title carries no native heading role, so for a **dialog or
50
- panel** the application connects `titleId` and an optional `summaryId` to the
51
- owning host through `aria-labelledby` and `aria-describedby`. For a **page or
52
- view** title, pass `headingLevel` (usually `1`): the title then exposes
362
+ Compose panel, dialog, and page headings as a plain `Toolbar`. Its leading zone
363
+ holds an optional icon `ToolbarControlGroup` and a direct extra-large
364
+ `ToolbarText`; controls belong in a trailing `ToolbarControlGroup`. By default
365
+ the title carries no native heading role, so for a **dialog or panel** the
366
+ application connects the title id and optional supporting-copy id to the owning
367
+ host through `aria-labelledby` and `aria-describedby`. `DialogSurface` and
368
+ `PopoverDialogSurface` take these as `labelledBy` and `describedBy`, so the
369
+ supporting line (or app-owned summary copy in the body) is the dialog's
370
+ accessible description; `WorkbenchDialog` wires its title `description`
371
+ automatically (`<id>-description`), and `ListDetailDialog` takes an explicit
372
+ `describedBy`, since its detail description describes the selection, not the
373
+ dialog. A `DialogSurface` that asks before a destructive action ("Delete this
374
+ topic?") sets `alert`, which renders `role="alertdialog"` on the native
375
+ `<dialog>`; pair it with `describedBy` on the message so it is announced, and
376
+ leave `lightDismiss` off so the person answers it. For a **page or view**
377
+ title, pass `headingLevel` (usually `1`) to `ToolbarText`: it then exposes
53
378
  `role="heading"` with a matching `aria-level`, giving the view a heading landmark
54
379
  so screen-reader heading navigation and "main heading" semantics work — the same
55
- role/level pair `ToolbarText` exposes when it is given `headingLevel` directly.
56
- Keep the levels meaningful and non-skipping within a view. Pass the trailing
380
+ role/level pair used throughout Kerf UI. Keep the levels meaningful and
381
+ non-skipping within a view. Pass trailing
57
382
  controls as a labeled `ToolbarControlGroup` when that group needs an accessible
58
- name.
383
+ name. A short supporting line belongs in the title's `description`: with it,
384
+ `id` and `headingLevel` move to the title span, so `aria-labelledby` names only
385
+ the title, and `descriptionId` gives the description its own id for
386
+ `aria-describedby`. Keep longer supporting copy as app-owned content below the
387
+ toolbar.
388
+ An editable title can use `ToolbarText action="edit-title"`; it renders a native
389
+ button whose full text remains its accessible name even when visually truncated.
390
+ Click, Enter, and Space activate the delegated action. The app owns the input
391
+ shown while editing and its focus lifecycle. Because the button cannot also be
392
+ a heading landmark, expose a heading elsewhere when the view needs one.
59
393
 
60
394
  ## FloatingToolbar
61
395
 
@@ -65,26 +399,70 @@ forced to a dark color scheme, but it is **not** in the top layer, so it never
65
399
  covers dialogs, popovers, or other overlays. Its children are the app's controls
66
400
  (normally `ToolbarControlGroup`s), which keep their own names, focus, and
67
401
  keyboard behavior; the application owns their actions, the toolbar's visibility,
68
- and — via `position` and `--kui-floating-toolbar-inset` — where it sits.
402
+ and — via `position` and the typed `inset` prop — where it sits. Inside a `Workbench`, `CollapsiblePanel`, or
403
+ `ResizableRegion` `restoreControl` the restore corner owns the inset, so the
404
+ toolbar floats from that corner. While one of those layouts has a side overlay
405
+ open over the toolbar's region (a Workbench rail overlay, a `wireSidebar`
406
+ compact overlay, an overlay `CollapsiblePanel` or horizontal
407
+ `ResizableRegion`), the toolbar is hidden (`visibility: hidden`), so it is
408
+ unfocusable and out of the accessibility tree rather than a control stranded
409
+ behind the overlay's focus trap; it returns when the overlay closes. The
410
+ overlay's own floating toolbars stay.
69
411
 
70
412
  ## Tabs
71
413
 
72
- `AppTab` renders one controlled tab. `TabBar` supplies the containing tab list,
73
- fixed leading/trailing regions, and a horizontally scrollable strip.
74
- `AppTab.rootAttributes` accepts application `data-*` metadata only; runtime
414
+ `TabBarItem` renders one controlled tab. `TabBar` supplies the containing tab list,
415
+ fixed leading/trailing/end regions, and a horizontally scrollable strip.
416
+ Use `TabBar.presentation` for rail, segmented, or inspector chrome,
417
+ `allocation="fill"` when peers should divide the strip, and
418
+ `trailingPlacement="adjacent"` when an action belongs beside the final tab.
419
+ When that local action must coexist with a workspace-level action, put the
420
+ workspace action in `end`; TabBar keeps the adjacent action immediately after
421
+ the shrinkable/scrolling tabs and pins `end` at the far edge. Leading,
422
+ trailing, and end actions remain visible and do not shrink. The component owns
423
+ that geometry; applications must not override its anatomy to create the split.
424
+ `trailing` and `end` each accept one `ToolbarControlGroup` for grouped controls,
425
+ one standalone Kerf `Button` for an action with its own chrome, or one standalone
426
+ Web Awesome `wa-button` for an exceptional ecosystem use. Do not add a wrapper
427
+ or flex margins to position the action.
428
+ `TabBarItem` provides compact 32px, segmented, truncating-label, and icon-only
429
+ presentations. Icon-only tabs keep the required `name` as the tab button's
430
+ accessible name while visually hiding the duplicate label. The default name
431
+ overflow is an ellipsis; `nameOverflow="visible"` lets an inline loading
432
+ treatment show the whole name, without changing the accessible name. The app
433
+ sets `dropTarget` during a content drag-over to paint a brand highlight;
434
+ selection and tab focus stay independent of that visual state. A `pending` tab (known,
435
+ still opening) keeps its visible name as the tab button's accessible name, so a
436
+ trailing spinner's own label is not folded into it. It is `aria-busy` and stays
437
+ selectable (in the roving tab order like a live tab), so the application can
438
+ show placeholder content in its panel until loading completes; its close
439
+ button is disabled and hidden and it is not draggable. A `placeholder` tab
440
+ (unknown) is instead disabled, out of the tab order, and not draggable. These props own
441
+ component appearance only; the application still owns the bar's outer placement.
442
+ `TabBarItem.rootAttributes` accepts application `data-*` metadata only; runtime
75
443
  filtering rejects roles plus case variants of component- or wiring-owned
76
444
  action, identity, selection, drag, drop, and component attributes. An optional
77
445
  `closeIcon` is decorative dormant content inside the already named close button
78
446
  and must not contain interactive descendants.
447
+ The first `TabBarItem` can set `pinned` to stay at the inline start while its peers
448
+ scroll. It remains a normal tab within the same tablist and roving-focus order;
449
+ focus and controlled selection reveal peers beyond the pinned tab. Pin only the
450
+ leading tab of a strip.
451
+ WebKit currently moves a pinned tab outside an RTL strip as it scrolls;
452
+ `KF-MYFQAS` tracks the browser correction.
79
453
  `wireTabBars()` adds Left/Right wrapping, Home/End, Delete/Backspace close
80
454
  activation, same-bar pointer reordering, `Alt+Shift+ArrowLeft/ArrowRight`
81
455
  reordering, focus restoration, scroll-into-view, and pointer-proximity
82
456
  autoscroll at either horizontal edge. Edge autoscroll is direct manipulation,
83
- stops on drop/drag end/disposal, and does not change keyboard behavior. It
84
- returns a disposer.
457
+ stops on drop/drag end/disposal, and does not change keyboard behavior. When
458
+ the application changes a bar's selected tab without focus (adding and
459
+ selecting a tab), the wiring scrolls that tab's strip — never the page — so
460
+ the new selection is fully visible; a re-render that keeps the same selection
461
+ leaves a strip the user scrolled where it is. It returns a disposer.
85
462
 
86
463
  Arrow / Home / End follow the ARIA Tabs **automatic-activation** pattern by
87
- default: they move roving focus and select the focused tab. Pass
464
+ default: they move roving focus and select the focused tab. If selection synchronously
465
+ replaces the strip, focus returns to the replacement with the same bar and tab IDs. Pass
88
466
  `activation: 'manual'` (or set `data-tab-activation="manual"` on a strip via the
89
467
  `TabBar` `activation` prop, which overrides the option per bar) for
90
468
  **manual activation**: arrow keys move roving focus only and the user selects
@@ -105,37 +483,259 @@ stays in sequential Tab order, matching Hot Sheet 2's compact view and inspector
105
483
  controls; Enter and Space use native button activation. The application handles
106
484
  the supplied `data-action`, reads `data-segment-value`, updates `value`, and
107
485
  re-renders. Keep labels unique and meaningful even when `content` shows only an
108
- icon. Use tabs—not a segmented control—when choices switch page regions that
486
+ icon. The filled track uses the normal neutral text role for readable unselected
487
+ labels in light and dark themes. A whole-control `disabled` disables every
488
+ native button and marks the group `aria-disabled` while `aria-pressed` still
489
+ reports the current choice. Use tabs—not a segmented control—when choices switch page regions that
109
490
  need `tab`/`tabpanel` semantics.
110
491
 
111
- ## TokenSearchField
492
+ ## ChoiceChips
493
+
494
+ `ChoiceChips` renders `role="radiogroup"`, named by `label` (`aria-label`) or
495
+ by `labelledBy` (`aria-labelledby`, typically a visible `FieldLabel`). Each
496
+ choice is a native `<input type="radio">` inside its pill `<label>`, so the
497
+ browser owns the interaction: the group is a single Tab stop on the checked
498
+ radio (or the first enabled one when nothing is selected), arrow keys move and
499
+ select, Space selects, and the checked radio submits its value under `name`.
500
+ `required` makes an unselected group fail native form validation, and
501
+ `disabled` (group) or a choice's `disabled` removes it from interaction. The
502
+ radio's accessible name is the visible label; a `swatch` or `icon` is
503
+ `aria-hidden` decoration. The focus ring is drawn on the pill around the
504
+ focused radio, and the checked pill adds a second pixel of border so the
505
+ selection does not rely on hue alone; forced-colors mode paints it with
506
+ `Highlight`.
507
+
508
+ With `multiple: 'toggle'`, the group renders `role="group"` with the same
509
+ naming, and each choice is a native `<input type="checkbox">` inside its pill.
510
+ Every pill is its own Tab stop, Space toggles it, assistive technology reads
511
+ its native checked state, and every checked box submits its value under
512
+ `name` (`FormData.getAll(name)`). Native `required` on a checkbox demands that
513
+ one box, so a multiple group takes no `required`; validate an "at least one"
514
+ rule in the application.
515
+
516
+ With `multiple: true`, the group is a named `role="listbox"` with
517
+ `aria-multiselectable="true"` and `aria-orientation="horizontal"`, and each
518
+ pill is a `role="option"` whose `aria-selected` reports its state and whose
519
+ visible label is its name; a disabled chip is `aria-disabled`. The listbox is
520
+ one Tab stop (roving `tabindex` on the first selected enabled chip). With
521
+ `wireChoiceChips`: Left/Right (mirrored in right-to-left text), Up/Down,
522
+ Home, and End move focus and select only that chip; Shift with them extends
523
+ the range from the anchor; Cmd on Apple platforms or Ctrl elsewhere with them
524
+ moves focus without changing the selection; Space toggles the focused chip
525
+ and Shift+Space extends to it; Cmd/Ctrl+A selects every enabled chip. A
526
+ click selects one chip, Cmd/Ctrl-click toggles one, and Shift-click extends.
527
+ Hidden inputs submit each selected value under `name`. The focus ring follows
528
+ `:focus-visible` on the option. Every chip color is a theme token resolved through
529
+ `light-dark()`, so inside a dark appearance scope (`.wa-dark`, `.wa-invert`,
530
+ or any `color-scheme: dark` ancestor) the pills, labels, checked tint, and
531
+ focus ring read on inverse chrome without overrides.
532
+
533
+ ## TextField
534
+
535
+ `TextField` renders a native `<input>` (or, with `multiline`, a `<textarea>`)
536
+ inside one `<label>`, so a click anywhere on the field focuses it. The input is
537
+ named explicitly — `aria-label` from `label`, whose visible text is
538
+ `aria-hidden`, or from `ariaLabel` — so the clear button and the character
539
+ count inside the label never join its name. `hint` and `error` are visible
540
+ below the field and together form its `aria-description`; `error` also sets
541
+ `aria-invalid="true"`, draws the box border in the danger color, and shows the
542
+ message in the danger text color, so validity never relies on hue alone.
543
+ `required`, `disabled`, `readOnly`, `maxLength`, `type`, and `autocomplete`
544
+ are native attributes. A required field shows an `aria-hidden` asterisk after
545
+ its label; the input itself reports `required`. The focus ring is drawn on the
546
+ box around the input (`:focus-within`), 3px with a 1px offset like every Kerf
547
+ control.
548
+
549
+ `autofocus` forwards to the native input or textarea. It requests initial focus
550
+ when a field is inserted or its containing native dialog opens. Applications
551
+ still direct focus themselves when it must move from an already focused control.
112
552
 
113
- `TokenSearchField` exposes the editable surface as a named `searchbox`. Each
553
+ For `type="number"`, `min`, `max`, and `step` pass through to the native input.
554
+ Each accepts a number or string; `step="any"` allows arbitrary decimals.
555
+ They are omitted for other input types and `multiline` textareas. Native
556
+ constraint validation (`rangeUnderflow`, `rangeOverflow`, and `stepMismatch`)
557
+ then applies without custom field wiring.
558
+
559
+ For `type="date"`, TextField renders a native date input. The browser owns its
560
+ picker, localized display, keyboard interaction, and `input`/`change` events;
561
+ the `value` remains an ISO date string (`YYYY-MM-DD`). The same `name`, label,
562
+ required, disabled, read-only, and focus behavior as other single-line fields
563
+ applies. Numeric `min`, `max`, and `step` props do not pass to date inputs.
564
+
565
+ `clearable` adds a native `<button>` named by `clearLabel` (default "Clear")
566
+ after the input. It is hidden while the field is empty, is a normal Tab stop,
567
+ and with `wireTextFields(root)` empties the field, dispatches bubbling `input`
568
+ and `change` events as typing would, and returns focus to the field. A
569
+ disabled or read-only field's clear button is disabled. `showCount` (with
570
+ `maxLength`) shows a live `count / maxLength` beside the hint that
571
+ `wireTextFields` keeps current. Compact text grows to 16px on coarse-pointer
572
+ touch screens so focusing a field never zooms the page in iOS.
573
+
574
+ ## Button and SplitButton focus
575
+
576
+ A brand `Button` with `secondary` or `plain` emphasis clamps its
577
+ `brand-on-quiet` label to a darker light-theme value. Its quiet hover fill can
578
+ be stronger than the page background, so the unclamped token may be too light
579
+ for the button label. The same label color applies to pressed and focused
580
+ states; the focus ring remains visible around the control.
581
+
582
+ `Button` and each `SplitButton` half draw the 3px focus ring 1px outside the
583
+ box, against the surrounding surface, because a loud fill can share the ring's
584
+ hue (the brand fill matches the focus color in both schemes). An ancestor that
585
+ clips overflow would crop that ring, so `focusRingInset` draws it inside the
586
+ box instead, the name and meaning `Select` uses. An inset ring alone would
587
+ touch the fill (1.0:1 on brand, at most 2.3:1 on any loud fill), so the inset
588
+ ring is two-tone: the ring color on the outer 3px and a 3px surface-colored
589
+ line inside it. The ring then meets a surface color on both edges and clears
590
+ 3:1 against each on every tone (about 4.0:1 in light, 9.9:1 in dark against
591
+ the line), whatever the fill. Forced-colors mode drops the line and keeps the
592
+ system ring.
593
+
594
+ The line paints the surface the control sits on, not always the base surface:
595
+ a surface that changes the background behind its children publishes the
596
+ surface context (`--kui-color-surface-current`, `-region`, and `-tint`; see
597
+ `docs/component-contract.md`), and the line layers it the same way the page
598
+ does. On a sunken panel, a quiet `ContentItem`, a lowered `FramedList`, a
599
+ raised `List`, popup, or dialog, a highlighted `FramedList` row, a sunken
600
+ Pane, Workbench area, or TabNavigator scene, or a Pane or TabNavigator app
601
+ `background`, the line matches the pixels outside the box, so it reads as a
602
+ cut through the fill instead of a light halo. On a doubly sunken surface the
603
+ brand ring still clears 3:1 against the line (about 3.2:1 in light, 6.9:1 in
604
+ dark). A sunken surface's grain is not part of the line. Translucent glass
605
+ chrome (an overlay header, bar, or bottom toolbar, a dialog's floating
606
+ header) has no single color over scrolling content, so the line paints the
607
+ material over the surface beneath it: exact at rest, an approximation while
608
+ content scrolls under the bar.
609
+
610
+ ## Checkbox, RadioGroup, and Switch
611
+
612
+ Each control is a native input inside its `<label>`, positioned invisibly over
613
+ an `aria-hidden` drawn box, circle, or track. The label names it, and pointer,
614
+ keyboard, touch exploration, and form submission all reach the real input.
615
+ Keyboard focus draws the 3px focus ring with a 1px offset on the drawn shape;
616
+ forced-colors mode paints checked state with `Highlight`.
617
+
618
+ - `Checkbox` is an `<input type="checkbox">`; Space toggles it. `hint` and
619
+ `error` form its `aria-description`, and `error` sets `aria-invalid="true"`
620
+ and a danger border. `indeterminate` renders a `data-indeterminate` marker
621
+ that `wireCheckboxes(root)` turns into the native `indeterminate` property
622
+ (the only way to set it), so assistive technology reports a mixed state; a
623
+ click clears it natively and the app's next render decides it again.
624
+ - `RadioGroup` is a `<fieldset role="radiogroup">` named by its `<legend>`
625
+ (`label`) or `ariaLabel`. The browser owns the interaction: one Tab stop,
626
+ arrow keys move and select (skipping disabled choices), and the checked
627
+ radio submits its value under `name`. The group's `hint` and `error` form
628
+ its `aria-description`; `error` sets `aria-invalid` on the group, `required`
629
+ sets native `required` on each radio plus `aria-required` on the group, and a
630
+ choice's `hint` is that radio's `aria-description`.
631
+ - `CheckboxGroup` is a `<fieldset>` (natively a group) of `Checkbox`es, named
632
+ by its `<legend>` (`label`), `ariaLabel`, or `labelledBy`. Each checkbox
633
+ is its own Tab stop and Space toggles it; every checked value submits under
634
+ `name`. The group's `hint` and `error` form its `aria-description`; `error`
635
+ sets `aria-invalid` on the group and the danger border on each box, and a
636
+ choice's `hint` is that checkbox's `aria-description`. `disabled` disables
637
+ the fieldset and so, natively, every checkbox in it.
638
+ - `Switch` is an `<input type="checkbox" role="switch">`, so assistive
639
+ technology announces on and off; Space toggles it. Its `hint` is its
640
+ `aria-description`. The thumb's slide is skipped when reduced motion is
641
+ preferred. Use it only for a setting that applies immediately.
642
+
643
+ Hints sit on the label's text column, not under the drawn shape. Safari's
644
+ default Tab order skips checkboxes and radios as it does buttons; the
645
+ controls keep that platform setting.
646
+
647
+ ## MessageComposer
648
+
649
+ `MessageComposer`'s message field is a native `<textarea>` named by `label`
650
+ (`aria-label`, title style). With an `id`, the `hint` renders with the id
651
+ `<id>-hint` and becomes the field's `aria-describedby`; without an `id`, the
652
+ hint is visible only. The field draws no border or outline of its own: the
653
+ frame is its boundary, and while focus is anywhere within the composer the
654
+ frame's border turns brand (`Highlight` in forced-colors mode, with a 2px
655
+ outline). Each trailing action keeps its own name and focus ring. `disabled`
656
+ disables the field only; the app disables its actions. Sending and
657
+ announcing a sent message stay with the app.
658
+
659
+ With `submitOnEnter` and `wireMessageComposers`, the field carries
660
+ `aria-keyshortcuts="Enter"`, so assistive technology announces the shortcut.
661
+ Enter and Cmd/Ctrl+Enter activate the first trailing action, the same control
662
+ a pointer or Tab-and-Space user reaches; Shift+Enter inserts a newline. An
663
+ Enter that commits an IME composition (`isComposing`, keyCode 229, or between
664
+ `compositionstart` and `compositionend`) is left to the input method, so
665
+ people composing Japanese, Chinese, or Korean text never send a half-written
666
+ message. An empty or whitespace-only message, an auto-repeating key, a
667
+ disabled field, or a disabled, loading, or `aria-disabled` action sends
668
+ nothing. A visible hint may also state the shortcut when the audience may not
669
+ expect it.
670
+
671
+ ## SearchField
672
+
673
+ Use `presentation="form-field"` when a structured search query sits beside
674
+ Web Awesome form controls. It renders the visible `label` with the same inset
675
+ and typography, an optional `hint`, and an optional `required` marker. The
676
+ searchbox references the label and hint with `aria-labelledby` and
677
+ `aria-describedby`, and `required` sets `aria-required`; the application
678
+ validates the value before submission. `wireSearchFields()` also moves
679
+ focus to the editor when the visible label is clicked. The field stands outside
680
+ a Toolbar and fills the same inline space as a neighboring `TextField`.
681
+ Its control radius follows the shared `--kui-layout-rounded-radius`, so the two
682
+ controls read as one form.
683
+
684
+ `SearchField` exposes the editable surface as a named `searchbox`. Each
114
685
  chip is atomic (`contenteditable="false"`) and contains separately named edit
115
- and remove buttons; the clear action is also named. Disabled fields publish
686
+ and remove buttons; the clear action is also named. A `trailingAction` is a
687
+ named button whose `label` is also its tooltip; a help toggle sets `expanded`
688
+ (`aria-expanded`, with `haspopup` and `controls` for the surface it opens) and
689
+ an on/off toggle sets `pressed` (`aria-pressed`). Disabled fields publish
116
690
  `aria-disabled` and stop editing without hiding the current expression. The
117
691
  application owns query parsing and must announce result-count or loading
118
- changes separately when that feedback is useful. Use `readTokenSearchField()`
692
+ changes separately when that feedback is useful. Use `readSearchField()`
119
693
  to ignore the chip buttons' visible text when reading browser-edited content,
120
- and `placeTokenSearchCaret()` to restore a text caret without landing inside a
121
- chip. Call `wireTokenSearchFields()` once at a stable root so Enter submits
694
+ and `placeSearchFieldCaret()` to restore a text caret without landing inside a
695
+ chip. Call `wireSearchFields()` once at a stable root so Enter submits
122
696
  without inserting a contenteditable line break and keyboard chip deletion
123
697
  restores focus plus the text-relative caret after controlled rendering replaces
124
- the editor; the editor still wraps text visually at its inline edge. Editable text is DOM-owned between token changes; a clear handler empties
698
+ the editor. Restoration finishes after synchronous input listeners and before
699
+ another keystroke; it does not wait for an animation frame that could overwrite
700
+ a later selection. Select All + Backspace/Delete shares that replacement path
701
+ and keeps the adopted expanded signal open while managed focus is enabled.
702
+ Real outside focus, empty Escape, disposal, and removed fields retain their usual
703
+ behavior. The editor still wraps text visually at its inline edge. Editable text is DOM-owned between token changes; a clear handler empties
125
704
  the editor's `textContent` before updating application state. Leading and
126
705
  trailing controls share the first text line's fixed vertical center and remain
127
706
  there as the editor wraps. In `collapsible` mode, the closed state is one named
128
707
  iconic search button and the open state is the same named searchbox, whether
129
708
  the field stands alone or is composed inside `ToolbarControlGroup`.
709
+
710
+ On coarse touch devices, the editor's computed text size has a 16px floor. This
711
+ avoids iOS focus magnification of the small-text editor while preserving the
712
+ user's ability to pinch zoom; other field chrome and desktop density are unchanged.
713
+
714
+ For an app-driven query replacement with an unmanaged field, change its
715
+ `revision` along with `query` so the editor text rebuilds. For a model-managed
716
+ field, call `model.replace({ query, tokens })`: it parses the supplied state and
717
+ advances `editorRevision` even when the tokens did not change.
718
+
130
719
  Applications set `expanded` while the field is focused, move focus from the
131
720
  trigger into the revealed editor, and clear `expanded` only after focus leaves
132
721
  the complete component. Text or tokens keep the field expanded even when that
133
722
  transient state is false. Width animation is disabled under reduced motion.
723
+ Clearing with ✕ follows where focus was when it was pressed: from inside the
724
+ field (the editor, or ✕ reached by keyboard) the caret returns to the emptied
725
+ editor; with focus elsewhere, `wireSearchFields` leaves focus where it is
726
+ and collapses the emptied field, as it would on blur.
134
727
 
135
728
  When the field is composed with a caller-owned surface rendered outside it — a
136
729
  suggestions listbox, date picker, or help popover — mark that surface (or wrap
137
- it) with `data-token-search-keep-open`, or pass `collapsible.keepOpenOn(target)`,
138
- so focus moving into it does not collapse an empty field. `wireTokenSearchFields`
730
+ it) with `data-search-field-keep-open`, or pass `collapsible.keepOpenOn(target)`,
731
+ so focus or pointer activation moving into it does not collapse an empty field.
732
+ The helper preserves the pointer target when a browser omits
733
+ `focusout.relatedTarget`, preventing the field or target from disappearing
734
+ between pointerdown and click. For an empty field losing focus during a pointer
735
+ press, managed collapse waits until that press's click has dispatched (or the
736
+ press ends without a click), then rechecks focus and content before closing.
737
+ This keeps a shifting search row from moving the pressed control mid-click.
738
+ `wireSearchFields`
139
739
  can also, opt-in via `keyboard`, own atomic-chip editing keys: from a collapsed
140
740
  caret with no selection, Backspace removes the token before the caret and Delete
141
741
  the token after it (reported through `onRemoveToken` for the app to apply to its
@@ -143,23 +743,211 @@ controlled state), and ArrowRight moves the caret past a trailing chip so typed
143
743
  text lands after it. An optional `onEdit({ id, editor, event })` — with the
144
744
  originating `InputEvent` so a caller can gate on `inputType`/`data` — fires on every editor
145
745
  `input`, letting a caller drop its own `input` listener; the application still
146
- owns query parsing and result-count/loading announcements.
746
+ owns query parsing and result-count/loading announcements. When the app's `onEdit` or `onRemoveToken` changes tokens and the controlled render replaces the focused editor, `wireSearchFields` moves focus and caret to the replacement at the same mutation checkpoint (a caret at the end of the query stays at the end; any other caret keeps its place in the remaining text), so keys typed at full speed are not lost.
747
+
748
+ With a `createSearchFieldModel` passed to the field and registered in
749
+ `wireSearchFields(root, { models })`, grammar parsing, chips, clear/edit/
750
+ remove actions, and suggestions are managed. Arrow Down moves from the editor
751
+ to suggestions, arrow keys move between suggestions, Enter selects one, and
752
+ Escape returns focus to the editor. The application still announces results
753
+ when needed and can supply an `evaluate` callback to compute them. Omitting the
754
+ model leaves the manual behavior above intact. After a chip commit, suggestion
755
+ choice, chip edit, or Backspace/Delete chip removal, focus restoration runs at
756
+ the controlled render checkpoint and keeps the query-relative caret offset;
757
+ it leaves focus on a different control if the user moved there in the meantime.
758
+ Suggestions use Floating UI positioning, following the same viewport-aware
759
+ popup behavior as the Web Awesome controls behind Select and PopupMenu. They
760
+ follow the field while scrolling, flip above it at the bottom edge, and shift
761
+ within narrow viewports without growing its toolbar row. One
762
+ suggestion keeps a pill outline; lists with multiple choices use the standard
763
+ rounded surface and scroll once they reach 240px. The clear button's hover and focus
764
+ highlight follows the field's pill shape or its toolbar group's rounded shape.
765
+
766
+ Managed clear captures the action before application handlers run, keeps the adopted
767
+ expanded signal open for a collapsible field, and restores the editor focus for
768
+ both collapsible and plain model fields at the actual
769
+ mutation checkpoint before the next input task. It also returns keyboard activation
770
+ from the clear button to a surviving editor immediately. No animation frame owns
771
+ clear focus, so fast typing cannot escape to page shortcuts or lose its first letter. The app still owns clearing query/tokens and emptying
772
+ DOM-owned text. This focus step respects `manageFocus: false`, disposal, removed fields,
773
+ and focus deliberately moved to another control; no app-level reopen callback is needed.
147
774
 
148
775
  ## CollapsiblePanel / sidebar
149
776
 
150
- `CollapsiblePanel` is a labeled `aside` region that is `aria-hidden` while
151
- collapsed; its content slides via transform (disabled under reduced motion).
777
+ `CollapsiblePanel` is a labeled `aside` region that renders `inert` and
778
+ `aria-hidden` while collapsed, straight from the app's `collapsed` flag, so its
779
+ optional `tabIndex={0}` leaves the Tab order while closed. `tabIndex={-1}` permits
780
+ programmatic focus while open; `outlined` keeps the region's focus ring visible
781
+ only while expanded and visible. A toolbar panel's inner `Pane` can take the
782
+ same options through `pane` when that is the intended focus boundary. Its
783
+ controls leave the Tab order and the accessibility tree even while the content
784
+ is still sliding out, and focusing one can never scroll clipped content back into
785
+ view (`aria-hidden` alone left them focusable inside a hidden subtree). Its
786
+ content slides via transform (disabled under reduced motion); `inert` does not
787
+ affect rendering, so the slide still plays. A `restoreControl` renders outside
788
+ the panel and stays reachable. A collapsed `ResizableRegion` renders `inert` and
789
+ `aria-hidden` on the region itself the same way (its content wrapper is `inert`
790
+ too, and its separator is already hidden and not displayed), so no empty
791
+ labeled region landmark stays behind; its `restoreControl` stays outside the
792
+ region.
152
793
  `CollapsiblePanelToggle` is a named button carrying `aria-expanded` and the
153
794
  standard per-side collapse/expand glyph (`PanelLeft*` / `PanelRight*` /
154
795
  `PanelBottom*`); place a collapse toggle inside the panel and an expand toggle in
155
796
  an always-visible location so it is reachable while collapsed. `wireSidebar()`
156
797
  moves focus into the panel when it opens and restores it to the trigger when it
157
- closes. When a `deviceClass()` reports `compact`, an open panel becomes an overlay
798
+ closes; a trigger inside the now-inert panel hands focus to the panel's toggle
799
+ outside it instead (and focus stranded there by a wide → compact crossing is
800
+ rescued the same way), so an app may render the expand toggle only while the panel
801
+ is collapsed. When a `deviceClass()` reports `compact`, an open panel becomes an overlay
158
802
  with a dismissable backdrop, Escape and backdrop-click collapse it, and Tab is
159
- trapped within it (the ARIA dialog pattern). The application owns each `collapsed`
803
+ trapped within it (the ARIA dialog pattern). That modal state only ever begins
804
+ from a user action: at wire-up on a compact device and on a wide → compact
805
+ crossing, every panel starts collapsed, so no page load or resize traps focus. The application owns each `collapsed`
160
806
  signal, the panels, their sizes, and content; the wire may persist the collapsed
161
807
  state per panel.
162
808
 
809
+ ## Workbench
810
+
811
+ Each `Workbench` rail and drawer is a labeled region (`aside` for a rail, `section`
812
+ for the drawer). While a panel is collapsed the region itself renders `inert` and
813
+ `aria-hidden="true"`, and so does not linger as an empty landmark, and its content
814
+ wrapper is `inert`, all rendered from the app's `collapsed` flag, so its controls
815
+ leave the Tab order and the accessibility tree even while the content is still
816
+ sliding out, and focusing one can never scroll clipped content back into view. The panel's `restoreControl` renders
817
+ outside that content and stays reachable; a resizable panel's separator also leaves
818
+ the Tab order while collapsed or not inline. `wireWorkbench`, given a panel's
819
+ `collapsed` signal, returns focus stranded in a closing panel to the control that
820
+ opened it, else the restore control, else a control whose `aria-controls` names the
821
+ panel; an open overlay panel takes focus and keeps Tab inside it (the ARIA dialog
822
+ pattern), whether its own toggle or a persistent toggle outside the Workbench
823
+ opened it, as soon as the panel can take focus. See [`workbench.md`](workbench.md).
824
+
825
+ ## Chrome material
826
+
827
+ Translucent chrome, such as a `Pane` header with
828
+ `headerPresentation="overlay"`, a `NavStack` top bar with
829
+ `chromePresentation="overlay"`, or a `NavStack` bottom toolbar with
830
+ `bottomToolbarPresentation="overlay"`, or a `TabNavigator` tab bar with
831
+ `barPresentation="overlay"`, paints `--kui-chrome-material`: the surface at
832
+ 80% opacity behind a blur-and-saturate backdrop filter
833
+ (`--kui-chrome-material-filter`). Content scrolls visibly beneath it, so the
834
+ backdrop under its text is not a fixed color. The contrast rule measures the
835
+ worst case: the material composited over a solid black backdrop in the light
836
+ theme and a solid white backdrop in the dark theme. The blur only averages the
837
+ content, so it can never be darker or lighter than that.
838
+
839
+ Chrome on a raised surface, such as a `DialogSurface` title bar with
840
+ `headerPresentation="floating"`, paints `--kui-chrome-material-raised`
841
+ instead: the raised surface at the same 80%, so the bar matches the dialog
842
+ panel behind it. The same rule and fallbacks apply.
843
+
844
+ - **Normal text and icons pass AA over any content.** `--kui-color-text`
845
+ measures about 10.5:1 (light) and 8.3:1 (dark) on that worst case, and
846
+ about 10.5:1 (light) and 6.7:1 (dark) over the raised material. 80% is
847
+ above the minimum opacity that keeps 4.5:1 there (about 55% light and 60%
848
+ dark). A theme that overrides `--kui-chrome-material` or
849
+ `--kui-chrome-material-raised` must keep its text at 4.5:1 or better
850
+ against the same backdrops.
851
+ - **Quiet text does not, so `ToolbarText` lifts it.** `--kui-color-text-quiet`
852
+ falls to about 3.2:1 (light) and 4.1:1 (dark) over the worst case, and the
853
+ default-size title color to about 3.8:1 (light). Inside an overlay `Pane`
854
+ header or overlay `NavStack` chrome or bottom toolbar, or slotted as the `label` (or into
855
+ `header-actions`) of a `DialogSurface` floating header, an untoned
856
+ `ToolbarText` therefore takes
857
+ `--kui-color-text` for its title at every size, and its `description` mixes
858
+ the quiet color halfway toward the normal one, about 5.9:1 in both themes
859
+ (about 4.9:1 dark over the raised material). That keeps AA while the
860
+ description still reads as secondary. Controls lift the same way in an
861
+ overlay `Pane` header, overlay `NavStack` chrome or bottom toolbar, and a
862
+ `DialogSurface` floating header's `header-actions`: a default-tone
863
+ `ToolbarControlGroup`'s quiet control color over its own translucent fill
864
+ measures about 3.0:1 (light) and 3.5:1 (dark) over the worst case, so its
865
+ controls take `--kui-color-text` there. An overlay `TabNavigator` bar's
866
+ unselected labels lift halfway toward `--kui-color-text`, and its selected
867
+ label mixes 40% of it into the brand color: the plain brand color measured
868
+ about 3.2:1 (light) over the worst case. A `DialogSurface`'s close button is an
869
+ icon, held to the 3:1 non-text bar, and measures about 3.8:1 (light) and
870
+ 4.1:1 (dark) over the raised material. Any other quiet copy you place in
871
+ overlay chrome yourself has no such lift; keep it in the content.
872
+ - **The material turns opaque when transparency would hurt.** Under
873
+ `prefers-reduced-transparency: reduce` or `prefers-contrast: more`, and where
874
+ `backdrop-filter` is unsupported, it resolves to the opaque surface. In forced
875
+ colors, the header (or NavStack chrome) paints `Canvas` with a `CanvasText`
876
+ bottom edge, and an overlay NavStack bottom toolbar paints `Canvas` with a
877
+ `CanvasText` top edge, so content passing beneath it never shows through.
878
+ - **Clear chrome has no material of its own.** A `clear` Pane header,
879
+ NavStack bar, or TabNavigator bar is transparent, so nothing guarantees its
880
+ text over arbitrary content: keep its controls in glass control groups,
881
+ which carry the material and AA lift with them, and give a title over
882
+ imagery a scrim (or keep it in the content). `scrollEdge="material"` (or
883
+ `"surface"`) fades a backing in gradually as content scrolls beneath the
884
+ bar. Clear chrome turns
885
+ opaque under reduced transparency or increased contrast and paints
886
+ `Canvas` in forced colors, like the material.
887
+ - **An app can turn every effect static.** There is no reliable CSS signal
888
+ for a low-power device, so an app that detects one sets
889
+ `data-kui-effects="static"` on the root element
890
+ (`document.documentElement.dataset.kuiEffects = 'static'`). The material
891
+ then resolves to the opaque surface, and every scroll-driven animation a
892
+ component owns stops at its resting state. A display that cannot animate
893
+ smoothly (`@media (update: slow)`, such as e-ink) gets the same result on
894
+ its own. Removing the attribute restores the effects.
895
+ - **A glass `ToolbarControlGroup` (`material="glass"`) carries the material
896
+ with it.** A group floating over imagery or a clear toolbar paints
897
+ `--kui-chrome-material` behind its own controls. The same quiet-color shortfall
898
+ applies, so its controls always take `--kui-color-text`. A raised or outline
899
+ selection paints an opaque surface pill, so the brand selected color keeps AA:
900
+ over the bare 80% material it measured about 3.2:1 (light, over black). The
901
+ group's hover mixes a text-color tint into the material, so a lone control's
902
+ whole-group hover never drops the fill. The specular edge gives way to the
903
+ normal group border wherever the material turns opaque, including static
904
+ effects. A dark-toned glass group's loud fill turns opaque there too. In
905
+ forced colors the group paints `Canvas` with a `CanvasText` border and drops
906
+ its filter and shadow. `tests/browser/tone-contrast.spec.ts` measures rest,
907
+ hover, and selected controls on both worst-case backdrops in all three
908
+ engines, and checks the opaque and forced-color fallbacks in Chromium.
909
+
910
+ `tests/browser/overlay-header.spec.ts` (Pane),
911
+ `tests/browser/overlay-nav-stack.spec.ts` (NavStack top chrome),
912
+ `tests/browser/overlay-nav-stack-bottom.spec.ts` (NavStack bottom toolbar,
913
+ which also measures its description, a control, the top chrome's back
914
+ control, and increased contrast), and
915
+ `tests/browser/dialog-floating-header.spec.ts` (DialogSurface) measure the
916
+ title over the material on both worst-case backdrops in Chromium, Firefox, and
917
+ WebKit, and the Pane and DialogSurface specs also measure the description and
918
+ a header control group (DialogSurface also its close button). In
919
+ Chromium they also check the opaque fallbacks for reduced transparency and
920
+ forced colors, and the Pane and DialogSurface specs check increased contrast.
921
+
922
+ **Firefox and WebKit screenshots omit the blur.** In Playwright's Firefox and
923
+ WebKit, `page.screenshot()` (headless or headed) shows the content beneath the
924
+ material crisp, as if `backdrop-filter` did nothing. Stock Firefox's own
925
+ `--headless --screenshot` does the same. The filter is still applied: a
926
+ `recordVideo` frame of the same page in the same session, which records the
927
+ compositor's output, shows the content blurred. Firefox and WebKit draw
928
+ `backdrop-filter` only when compositing (WebRender in Firefox, Core Animation
929
+ in WebKit), and their snapshot paths repaint the page without it. Chromium's
930
+ screenshot shows the blur. Plain test pages with no kerf CSS behave the same
931
+ way, so no ancestor style in these components is blocking the filter. When
932
+ you review the blur in Firefox or WebKit, use a `recordVideo` frame, not a
933
+ screenshot. A crisp screenshot is not a defect, and contrast is unaffected
934
+ because the rule above already assumes no blur.
935
+
163
936
  ## Verification matrix
164
937
 
165
938
  For each changed component, inspect default, hover, focus, disabled, selected/pressed, busy/error, long-content, wide, narrow, light, dark, increased-contrast, reduced-motion, keyboard-only, and 200%-zoom states where applicable. DOM order must match reading and focus order, with no clipping or unreachable action.
939
+
940
+ Text contrast checks must measure the painted solid-color backdrop, compositing
941
+ translucent fills from the document canvas through every ancestor and the
942
+ component itself before comparing the foreground. Raw RGB channels from an
943
+ `rgba()` value are not the rendered background. The shared browser helper in
944
+ `tests/browser/painted-contrast.ts` resolves CSS color syntax through canvas and
945
+ uses the evaluator's WCAG ratio calculation; its browser regressions cover
946
+ nested fills, transparent foregrounds, shadow-host backdrops, theme changes,
947
+ and genuinely insufficient contrast. Background images (including the catalog
948
+ checkerboard), filters, and group opacity remain separate visual-review concerns;
949
+ this helper measures only the solid CSS color layers.
950
+
951
+ Separator checks resolve the documented semantic border token in the component's
952
+ context instead of pinning an old opaque palette value, while still verifying
953
+ that the line has its intended width and a visible color.