@kerfjs/ui 5.0.0-beta.103 → 5.0.0-beta.105

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 (759) hide show
  1. package/README.md +163 -116
  2. package/ai/application-ui-profile.defaults.json +125 -4
  3. package/ai/compile-time-contracts-v1.json +11 -11
  4. package/ai/component-catalog.json +2606 -627
  5. package/ai/component-composition-rules.json +11 -10
  6. package/ai/component-composition.json +1689 -300
  7. package/ai/components/README.md +66 -48
  8. package/ai/components/application-tabs.md +4 -4
  9. package/ai/components/badge.md +1 -0
  10. package/ai/components/button.md +91 -0
  11. package/ai/components/checkbox.md +89 -0
  12. package/ai/components/choice-chips.md +9 -3
  13. package/ai/components/color-field.md +92 -0
  14. package/ai/components/color-picker.md +90 -0
  15. package/ai/components/color-swatches.md +82 -0
  16. package/ai/components/combobox.md +6 -4
  17. package/ai/components/content-item.md +5 -2
  18. package/ai/components/disclosure.md +83 -0
  19. package/ai/components/file-picker.md +1 -0
  20. package/ai/components/foundation.md +1 -1
  21. package/ai/components/list-action-row.md +3 -3
  22. package/ai/components/list-detail-dialog.md +90 -0
  23. package/ai/components/list.md +2 -0
  24. package/ai/components/lucide-icon.md +2 -0
  25. package/ai/components/{composer.md → message-composer.md} +17 -16
  26. package/ai/components/pane.md +3 -1
  27. package/ai/components/popup-menu.md +12 -9
  28. package/ai/components/progress-bar.md +82 -0
  29. package/ai/components/progress-ring.md +80 -0
  30. package/ai/components/radio-group.md +88 -0
  31. package/ai/components/recipe-list-detail-dialog.md +5 -5
  32. package/ai/components/search-field.md +108 -0
  33. package/ai/components/select.md +15 -13
  34. package/ai/components/slider.md +84 -0
  35. package/ai/components/surface-scaffold.md +16 -13
  36. package/ai/components/switch.md +81 -0
  37. package/ai/components/tab-bar.md +6 -6
  38. package/ai/components/tab-navigator.md +2 -2
  39. package/ai/components/tabs.md +7 -7
  40. package/ai/components/tag-field.md +86 -0
  41. package/ai/components/text-field.md +98 -0
  42. package/ai/components/text.md +1 -0
  43. package/ai/components/toast.md +85 -0
  44. package/ai/components/toolbar-control-group.md +3 -3
  45. package/ai/components/tooltip.md +81 -0
  46. package/ai/components/wa-accordion-item.md +11 -5
  47. package/ai/components/wa-accordion.md +11 -5
  48. package/ai/components/wa-animated-image.md +2 -1
  49. package/ai/components/wa-animation.md +1 -0
  50. package/ai/components/wa-avatar.md +1 -0
  51. package/ai/components/wa-badge.md +10 -3
  52. package/ai/components/wa-breadcrumb-item.md +1 -0
  53. package/ai/components/wa-breadcrumb.md +1 -0
  54. package/ai/components/wa-button-group.md +6 -4
  55. package/ai/components/wa-button.md +7 -5
  56. package/ai/components/wa-callout.md +7 -5
  57. package/ai/components/wa-card.md +12 -4
  58. package/ai/components/wa-carousel-item.md +1 -0
  59. package/ai/components/wa-carousel.md +1 -0
  60. package/ai/components/wa-checkbox-group.md +11 -4
  61. package/ai/components/wa-checkbox.md +10 -4
  62. package/ai/components/wa-color-picker.md +13 -5
  63. package/ai/components/wa-comparison.md +2 -1
  64. package/ai/components/wa-copy-button.md +1 -0
  65. package/ai/components/wa-details.md +11 -5
  66. package/ai/components/wa-dialog.md +10 -4
  67. package/ai/components/wa-divider.md +1 -0
  68. package/ai/components/wa-drawer.md +12 -5
  69. package/ai/components/wa-dropdown-item.md +8 -6
  70. package/ai/components/wa-dropdown.md +8 -6
  71. package/ai/components/wa-format-bytes.md +1 -0
  72. package/ai/components/wa-format-date.md +1 -0
  73. package/ai/components/wa-format-number.md +1 -0
  74. package/ai/components/wa-icon.md +2 -1
  75. package/ai/components/wa-include.md +6 -4
  76. package/ai/components/wa-input.md +9 -6
  77. package/ai/components/wa-intersection-observer.md +1 -0
  78. package/ai/components/wa-known-date.md +1 -0
  79. package/ai/components/wa-markdown.md +1 -0
  80. package/ai/components/wa-mutation-observer.md +1 -0
  81. package/ai/components/wa-number-input.md +1 -0
  82. package/ai/components/wa-option.md +7 -5
  83. package/ai/components/wa-otp-input.md +1 -0
  84. package/ai/components/wa-page.md +13 -4
  85. package/ai/components/wa-pagination.md +1 -0
  86. package/ai/components/wa-popover.md +11 -5
  87. package/ai/components/wa-popup.md +11 -4
  88. package/ai/components/wa-progress-bar.md +11 -4
  89. package/ai/components/wa-progress-ring.md +11 -4
  90. package/ai/components/wa-qr-code.md +1 -0
  91. package/ai/components/wa-radio-group.md +12 -4
  92. package/ai/components/wa-radio.md +10 -4
  93. package/ai/components/wa-random-content.md +1 -0
  94. package/ai/components/wa-rating.md +1 -0
  95. package/ai/components/wa-relative-time.md +1 -0
  96. package/ai/components/wa-resize-observer.md +1 -0
  97. package/ai/components/wa-scroller.md +12 -4
  98. package/ai/components/wa-select.md +7 -5
  99. package/ai/components/wa-skeleton.md +10 -3
  100. package/ai/components/wa-slider.md +11 -5
  101. package/ai/components/wa-spinner.md +7 -5
  102. package/ai/components/wa-split-panel.md +7 -5
  103. package/ai/components/wa-step.md +56 -0
  104. package/ai/components/wa-stepper.md +56 -0
  105. package/ai/components/wa-switch.md +10 -3
  106. package/ai/components/wa-tab-group.md +8 -6
  107. package/ai/components/wa-tab-panel.md +7 -5
  108. package/ai/components/wa-tab.md +8 -6
  109. package/ai/components/wa-tag-input.md +62 -0
  110. package/ai/components/wa-tag.md +9 -6
  111. package/ai/components/wa-textarea.md +10 -3
  112. package/ai/components/wa-time-input.md +1 -0
  113. package/ai/components/wa-toast-item.md +9 -7
  114. package/ai/components/wa-toast.md +9 -7
  115. package/ai/components/wa-tooltip.md +11 -5
  116. package/ai/components/wa-tree-item.md +2 -1
  117. package/ai/components/wa-tree.md +2 -1
  118. package/ai/components/wa-zoomable-frame.md +2 -1
  119. package/ai/components/workbench-dialog.md +90 -0
  120. package/ai/public-api-signatures-v1.md +1577 -245
  121. package/ai/skill.md +83 -50
  122. package/ai/webawesome-jsx-signatures-v1.md +4 -1
  123. package/dist/badge.d.ts +9 -1
  124. package/dist/badge.js +1 -1
  125. package/dist/browser/button.js +5 -0
  126. package/dist/browser/catalog.js +3 -2
  127. package/dist/browser/{icon-button.js → checkbox.js} +2 -2
  128. package/dist/browser/color-field.js +4 -0
  129. package/dist/browser/color-picker.js +5 -0
  130. package/dist/browser/color-swatches.js +3 -0
  131. package/dist/browser/disclosure.js +5 -0
  132. package/dist/browser/list-action-row.js +1 -0
  133. package/dist/browser/list-detail-dialog.js +14 -0
  134. package/dist/browser/message-composer.js +5 -0
  135. package/dist/browser/popup-menu.js +1 -0
  136. package/dist/browser/progress-bar.js +3 -0
  137. package/dist/browser/progress-ring.js +3 -0
  138. package/dist/browser/radio-group.js +3 -0
  139. package/dist/browser/search-field.js +4 -0
  140. package/dist/browser/slider.js +3 -0
  141. package/dist/browser/surface-scaffold.js +1 -0
  142. package/dist/browser/switch.js +3 -0
  143. package/dist/browser/tab-bar-item.js +4 -0
  144. package/dist/browser/tag-field.js +5 -0
  145. package/dist/browser/text-field.js +4 -0
  146. package/dist/browser/workbench-dialog.js +15 -0
  147. package/dist/button.d.ts +108 -0
  148. package/dist/button.js +7 -0
  149. package/dist/button.js.map +1 -0
  150. package/dist/catalog-resources.d.ts +1 -1
  151. package/dist/catalog.d.ts +3 -3
  152. package/dist/catalog.js +57 -27
  153. package/dist/catalog.js.map +1 -1
  154. package/dist/checkbox.d.ts +45 -0
  155. package/dist/checkbox.js +6 -0
  156. package/dist/checkbox.js.map +1 -0
  157. package/dist/choice-chips.d.ts +49 -15
  158. package/dist/choice-chips.js +1 -1
  159. package/dist/chunk-23PPPNH6.js +93 -0
  160. package/dist/chunk-23PPPNH6.js.map +1 -0
  161. package/dist/{chunk-FNZQOUZ5.js → chunk-2FW7D4IG.js} +2 -2
  162. package/dist/{chunk-FNZQOUZ5.js.map → chunk-2FW7D4IG.js.map} +1 -1
  163. package/dist/{chunk-ZYU5WRC3.js → chunk-3GLYIIFR.js} +2 -2
  164. package/dist/{chunk-ZYU5WRC3.js.map → chunk-3GLYIIFR.js.map} +1 -1
  165. package/dist/{chunk-5NQF35VO.js → chunk-4RECPEHI.js} +2 -2
  166. package/dist/{chunk-5NQF35VO.js.map → chunk-4RECPEHI.js.map} +1 -1
  167. package/dist/{chunk-7IUEBNCO.js → chunk-5USKCWGL.js} +8 -3
  168. package/dist/chunk-5USKCWGL.js.map +1 -0
  169. package/dist/chunk-6VVIW7VB.js +69 -0
  170. package/dist/chunk-6VVIW7VB.js.map +1 -0
  171. package/dist/{chunk-LL45C7BB.js → chunk-7K6U6FCN.js} +1 -1
  172. package/dist/chunk-7K6U6FCN.js.map +1 -0
  173. package/dist/{chunk-HQZYKJ56.js → chunk-7W3GKMN4.js} +110 -74
  174. package/dist/chunk-7W3GKMN4.js.map +1 -0
  175. package/dist/chunk-ACUKTVS3.js +371 -0
  176. package/dist/chunk-ACUKTVS3.js.map +1 -0
  177. package/dist/{chunk-YQ2AC4E2.js → chunk-AMIHGFLP.js} +2 -2
  178. package/dist/{chunk-YQ2AC4E2.js.map → chunk-AMIHGFLP.js.map} +1 -1
  179. package/dist/chunk-ATGAJVZ6.js +268 -0
  180. package/dist/chunk-ATGAJVZ6.js.map +1 -0
  181. package/dist/chunk-AYPGXR2E.js +20 -0
  182. package/dist/chunk-AYPGXR2E.js.map +1 -0
  183. package/dist/{chunk-ETCWQLJV.js → chunk-BKUMG2KB.js} +38 -28
  184. package/dist/chunk-BKUMG2KB.js.map +1 -0
  185. package/dist/chunk-C26Q6P4Q.js +76 -0
  186. package/dist/chunk-C26Q6P4Q.js.map +1 -0
  187. package/dist/chunk-C3RLKKFQ.js +452 -0
  188. package/dist/chunk-C3RLKKFQ.js.map +1 -0
  189. package/dist/{chunk-IM3GKYOG.js → chunk-CIAUILRR.js} +52 -32
  190. package/dist/chunk-CIAUILRR.js.map +1 -0
  191. package/dist/chunk-CNM6ZWP2.js +38 -0
  192. package/dist/chunk-CNM6ZWP2.js.map +1 -0
  193. package/dist/{chunk-LPHU44S3.js → chunk-CTQUDCY5.js} +3 -1
  194. package/dist/chunk-CTQUDCY5.js.map +1 -0
  195. package/dist/{chunk-MXNIVEVL.js → chunk-D4MXSAMI.js} +5 -3
  196. package/dist/chunk-D4MXSAMI.js.map +1 -0
  197. package/dist/{chunk-YBWQR2OK.js → chunk-DDSCVEO5.js} +10 -9
  198. package/dist/chunk-DDSCVEO5.js.map +1 -0
  199. package/dist/{chunk-SIW64V65.js → chunk-DF2YKGIX.js} +3 -3
  200. package/dist/{chunk-SIW64V65.js.map → chunk-DF2YKGIX.js.map} +1 -1
  201. package/dist/{chunk-3SKAEPPZ.js → chunk-ECFCAKWE.js} +4 -4
  202. package/dist/{chunk-3SKAEPPZ.js.map → chunk-ECFCAKWE.js.map} +1 -1
  203. package/dist/chunk-EKBMUXFV.js +298 -0
  204. package/dist/chunk-EKBMUXFV.js.map +1 -0
  205. package/dist/{chunk-IXLUZHGT.js → chunk-FG6U7KQQ.js} +5 -5
  206. package/dist/{chunk-IXLUZHGT.js.map → chunk-FG6U7KQQ.js.map} +1 -1
  207. package/dist/chunk-FKKJHGN5.js +147 -0
  208. package/dist/chunk-FKKJHGN5.js.map +1 -0
  209. package/dist/{chunk-FDZNYD4C.js → chunk-GCAK23PU.js} +34 -3
  210. package/dist/chunk-GCAK23PU.js.map +1 -0
  211. package/dist/chunk-GXSX6Q6O.js +42 -0
  212. package/dist/chunk-GXSX6Q6O.js.map +1 -0
  213. package/dist/{chunk-LOSRXZAH.js → chunk-HJXVVFBT.js} +14 -6
  214. package/dist/chunk-HJXVVFBT.js.map +1 -0
  215. package/dist/{chunk-M5KZ26VV.js → chunk-HQZG3OFL.js} +11 -1
  216. package/dist/chunk-HQZG3OFL.js.map +1 -0
  217. package/dist/{chunk-ELCMSQNJ.js → chunk-HTERKONR.js} +8 -8
  218. package/dist/chunk-HTERKONR.js.map +1 -0
  219. package/dist/chunk-HYORKKYP.js +8 -0
  220. package/dist/chunk-HYORKKYP.js.map +1 -0
  221. package/dist/chunk-IO27YTL3.js +73 -0
  222. package/dist/chunk-IO27YTL3.js.map +1 -0
  223. package/dist/chunk-ITUQC4FW.js +163 -0
  224. package/dist/chunk-ITUQC4FW.js.map +1 -0
  225. package/dist/chunk-K57NINLH.js +137 -0
  226. package/dist/chunk-K57NINLH.js.map +1 -0
  227. package/dist/chunk-KC6WUSNS.js +34 -0
  228. package/dist/chunk-KC6WUSNS.js.map +1 -0
  229. package/dist/{chunk-W4IK7AWD.js → chunk-KDQZ3E5C.js} +3 -1
  230. package/dist/chunk-KDQZ3E5C.js.map +1 -0
  231. package/dist/{chunk-2MSPNRWJ.js → chunk-KK3S5OTW.js} +27 -11
  232. package/dist/chunk-KK3S5OTW.js.map +1 -0
  233. package/dist/chunk-LTBVP6VN.js +59 -0
  234. package/dist/chunk-LTBVP6VN.js.map +1 -0
  235. package/dist/chunk-OHPYT2BH.js +82 -0
  236. package/dist/chunk-OHPYT2BH.js.map +1 -0
  237. package/dist/{chunk-HZPHCSCS.js → chunk-OY2MXIBB.js} +8 -2
  238. package/dist/chunk-OY2MXIBB.js.map +1 -0
  239. package/dist/chunk-PE2KPZDW.js +85 -0
  240. package/dist/chunk-PE2KPZDW.js.map +1 -0
  241. package/dist/{chunk-QTSMHH5J.js → chunk-QPTJ5DOO.js} +5 -3
  242. package/dist/chunk-QPTJ5DOO.js.map +1 -0
  243. package/dist/{chunk-JOR5LGYE.js → chunk-RFLW4FPL.js} +1 -1
  244. package/dist/chunk-RFLW4FPL.js.map +1 -0
  245. package/dist/{chunk-U6QYTMDB.js → chunk-RMWNO6BA.js} +6 -2
  246. package/dist/chunk-RMWNO6BA.js.map +1 -0
  247. package/dist/{chunk-TDMHA7C3.js → chunk-SQ2Q3OQI.js} +112 -63
  248. package/dist/chunk-SQ2Q3OQI.js.map +1 -0
  249. package/dist/{chunk-K4AT3V3J.js → chunk-T74YB76U.js} +13 -11
  250. package/dist/chunk-T74YB76U.js.map +1 -0
  251. package/dist/{chunk-BYFTHA4I.js → chunk-TAHR457X.js} +53 -6
  252. package/dist/chunk-TAHR457X.js.map +1 -0
  253. package/dist/{chunk-3VXDSIBJ.js → chunk-TKNVL53O.js} +2 -2
  254. package/dist/{chunk-3VXDSIBJ.js.map → chunk-TKNVL53O.js.map} +1 -1
  255. package/dist/chunk-TNJLNLVE.js +115 -0
  256. package/dist/chunk-TNJLNLVE.js.map +1 -0
  257. package/dist/chunk-TUID42UE.js +15 -0
  258. package/dist/chunk-TUID42UE.js.map +1 -0
  259. package/dist/{chunk-PKL6QJKK.js → chunk-UMNHJSIO.js} +93 -80
  260. package/dist/chunk-UMNHJSIO.js.map +1 -0
  261. package/dist/chunk-UTCAOOXU.js +116 -0
  262. package/dist/chunk-UTCAOOXU.js.map +1 -0
  263. package/dist/{chunk-MF6ZUUJZ.js → chunk-VEME3D7K.js} +38 -40
  264. package/dist/chunk-VEME3D7K.js.map +1 -0
  265. package/dist/{chunk-HLDRH23D.js → chunk-WJKHLOP5.js} +2 -2
  266. package/dist/{chunk-HLDRH23D.js.map → chunk-WJKHLOP5.js.map} +1 -1
  267. package/dist/chunk-WU57BYYM.js +115 -0
  268. package/dist/chunk-WU57BYYM.js.map +1 -0
  269. package/dist/{chunk-TGLUDQP2.js → chunk-ZCDRLN3B.js} +11 -11
  270. package/dist/chunk-ZCDRLN3B.js.map +1 -0
  271. package/dist/chunk-ZX2QQJXD.js +249 -0
  272. package/dist/chunk-ZX2QQJXD.js.map +1 -0
  273. package/dist/{chunk-6E2H2E5A.js → chunk-ZXZAECHZ.js} +6 -6
  274. package/dist/{chunk-6E2H2E5A.js.map → chunk-ZXZAECHZ.js.map} +1 -1
  275. package/dist/collapsible-panel.js +3 -3
  276. package/dist/color-field.d.ts +51 -0
  277. package/dist/color-field.js +92 -0
  278. package/dist/color-field.js.map +1 -0
  279. package/dist/color-picker.d.ts +88 -0
  280. package/dist/color-picker.js +8 -0
  281. package/dist/color-picker.js.map +1 -0
  282. package/dist/color-swatches.d.ts +56 -0
  283. package/dist/color-swatches.js +4 -0
  284. package/dist/color-swatches.js.map +1 -0
  285. package/dist/combobox.js +1 -1
  286. package/dist/content-item.d.ts +13 -1
  287. package/dist/content-item.js +1 -1
  288. package/dist/disclosure-arrow.js +1 -1
  289. package/dist/disclosure.d.ts +57 -0
  290. package/dist/disclosure.js +51 -0
  291. package/dist/disclosure.js.map +1 -0
  292. package/dist/file-picker.d.ts +7 -0
  293. package/dist/file-picker.js +1 -1
  294. package/dist/help-tags-register.d.ts +8 -8
  295. package/dist/help-tags-register.js +3 -2
  296. package/dist/help-tags-register.js.map +1 -1
  297. package/dist/index.d.ts +16 -9
  298. package/dist/index.js +58 -46
  299. package/dist/list-action-row.js +4 -1
  300. package/dist/list-detail-dialog.d.ts +117 -0
  301. package/dist/list-detail-dialog.js +165 -0
  302. package/dist/list-detail-dialog.js.map +1 -0
  303. package/dist/list-header.js +1 -1
  304. package/dist/list-item.js +1 -1
  305. package/dist/list.d.ts +17 -2
  306. package/dist/list.js +1 -1
  307. package/dist/lucide-icon.d.ts +9 -1
  308. package/dist/lucide-icon.js +1 -1
  309. package/dist/{composer.d.ts → message-composer.d.ts} +20 -12
  310. package/dist/message-composer.js +6 -0
  311. package/dist/message-composer.js.map +1 -0
  312. package/dist/nav-stack.js +1 -1
  313. package/dist/pane.d.ts +36 -3
  314. package/dist/pane.js +1 -1
  315. package/dist/popup-menu-register.d.ts +6 -5
  316. package/dist/popup-menu-register.js +3 -326
  317. package/dist/popup-menu-register.js.map +1 -1
  318. package/dist/popup-menu.d.ts +41 -23
  319. package/dist/popup-menu.js +5 -1
  320. package/dist/progress-bar.d.ts +52 -0
  321. package/dist/progress-bar.js +68 -0
  322. package/dist/progress-bar.js.map +1 -0
  323. package/dist/progress-ring.d.ts +44 -0
  324. package/dist/progress-ring.js +73 -0
  325. package/dist/progress-ring.js.map +1 -0
  326. package/dist/radio-group.d.ts +62 -0
  327. package/dist/radio-group.js +4 -0
  328. package/dist/radio-group.js.map +1 -0
  329. package/dist/row.js +1 -1
  330. package/dist/{token-search-model-aYR0YAei.d.ts → search-field-CrGTN5sa.d.ts} +67 -43
  331. package/dist/search-field-model.d.ts +3 -0
  332. package/dist/search-field-model.js +3 -0
  333. package/dist/search-field-model.js.map +1 -0
  334. package/dist/search-field.d.ts +3 -0
  335. package/dist/search-field.js +5 -0
  336. package/dist/search-field.js.map +1 -0
  337. package/dist/select-register.d.ts +6 -3
  338. package/dist/select-register.js +383 -241
  339. package/dist/select-register.js.map +1 -1
  340. package/dist/select.d.ts +30 -6
  341. package/dist/select.js +3 -1
  342. package/dist/selection.d.ts +54 -0
  343. package/dist/selection.js +3 -0
  344. package/dist/selection.js.map +1 -0
  345. package/dist/slider.d.ts +74 -0
  346. package/dist/slider.js +103 -0
  347. package/dist/slider.js.map +1 -0
  348. package/dist/split-button.js +1 -1
  349. package/dist/split-view.d.ts +5 -2
  350. package/dist/split-view.js +18 -159
  351. package/dist/split-view.js.map +1 -1
  352. package/dist/state-banner.js +1 -1
  353. package/dist/styles/badge.css +18 -6
  354. package/dist/styles/button.css +230 -0
  355. package/dist/styles/catalog/components/catalog-example.css +13 -4
  356. package/dist/styles/checkbox.css +121 -0
  357. package/dist/styles/choice-chips.css +58 -7
  358. package/dist/styles/color-field.css +125 -0
  359. package/dist/styles/color-picker.css +331 -0
  360. package/dist/styles/color-swatches.css +122 -0
  361. package/dist/styles/combobox.css +7 -5
  362. package/dist/styles/components/actions/button/button.css +230 -0
  363. package/dist/styles/components/actions/popup-menu/popup-menu.css +326 -198
  364. package/dist/styles/components/actions/toolbar/toolbar.css +25 -3
  365. package/dist/styles/components/actions/toolbar-control-group/toolbar-control-group.css +67 -104
  366. package/dist/styles/components/actions/toolbar-text/toolbar-text.css +5 -18
  367. package/dist/styles/components/collections/list/list.css +37 -0
  368. package/dist/styles/components/feedback/badge/badge.css +18 -6
  369. package/dist/styles/components/feedback/progress-bar/progress-bar.css +168 -0
  370. package/dist/styles/components/feedback/progress-ring/progress-ring.css +91 -0
  371. package/dist/styles/components/feedback/state-banner/state-banner.css +18 -3
  372. package/dist/styles/components/forms/checkbox/checkbox.css +121 -0
  373. package/dist/styles/components/forms/choice-chips/choice-chips.css +58 -7
  374. package/dist/styles/components/forms/color-field/color-field.css +125 -0
  375. package/dist/styles/components/forms/color-picker/color-picker.css +331 -0
  376. package/dist/styles/components/forms/color-swatches/color-swatches.css +122 -0
  377. package/dist/styles/components/forms/combobox/combobox.css +7 -5
  378. package/dist/styles/components/forms/{composer/composer.css → message-composer/message-composer.css} +17 -33
  379. package/dist/styles/components/forms/radio-group/radio-group.css +156 -0
  380. package/dist/styles/{token-search-field.css → components/forms/search-field/search-field.css} +111 -102
  381. package/dist/styles/components/forms/select/select.css +370 -249
  382. package/dist/styles/components/forms/slider/slider.css +241 -0
  383. package/dist/styles/components/forms/switch/switch.css +132 -0
  384. package/dist/styles/components/forms/tag-field/tag-field.css +8 -0
  385. package/dist/styles/components/forms/text-field/text-field.css +193 -0
  386. package/dist/styles/components/layout/pane/pane.css +254 -0
  387. package/dist/styles/components/layout/resizable-region/resizable-region.css +3 -2
  388. package/dist/styles/components/layout/row/row.css +11 -0
  389. package/dist/styles/components/layout/split-view/split-view.css +25 -0
  390. package/dist/styles/components/layout/workbench/workbench.css +12 -4
  391. package/dist/styles/components/navigation/disclosure-arrow/disclosure-arrow.css +20 -0
  392. package/dist/styles/components/navigation/tab-bar/tab-bar.css +7 -7
  393. package/dist/styles/components/navigation/{app-tab/app-tab.css → tab-bar-item/tab-bar-item.css} +95 -90
  394. package/dist/styles/components/surfaces/disclosure/disclosure.css +98 -0
  395. package/dist/styles/components/surfaces/surface-scaffold/surface-scaffold.css +263 -116
  396. package/dist/styles/components/typography/text/text.css +14 -12
  397. package/dist/styles/disclosure-arrow.css +20 -0
  398. package/dist/styles/disclosure.css +98 -0
  399. package/dist/styles/foundation.css +6 -4
  400. package/dist/styles/list-detail-dialog.css +11 -0
  401. package/dist/styles/list.css +37 -0
  402. package/dist/styles/{composer.css → message-composer.css} +17 -33
  403. package/dist/styles/overlay-toast.css +149 -0
  404. package/dist/styles/overlay-tooltip.css +55 -0
  405. package/dist/styles/pane.css +254 -0
  406. package/dist/styles/popup-menu.css +326 -198
  407. package/dist/styles/progress-bar.css +168 -0
  408. package/dist/styles/progress-ring.css +91 -0
  409. package/dist/styles/radio-group.css +156 -0
  410. package/dist/styles/resizable-region.css +3 -2
  411. package/dist/styles/row.css +11 -0
  412. package/dist/styles/{components/forms/token-search-field/token-search-field.css → search-field.css} +111 -102
  413. package/dist/styles/select.css +370 -249
  414. package/dist/styles/slider.css +241 -0
  415. package/dist/styles/split-view.css +25 -0
  416. package/dist/styles/state-banner.css +18 -3
  417. package/dist/styles/styles.css +16 -5
  418. package/dist/styles/surface-scaffold.css +263 -116
  419. package/dist/styles/switch.css +132 -0
  420. package/dist/styles/{app-tab.css → tab-bar-item.css} +95 -90
  421. package/dist/styles/tab-bar.css +7 -7
  422. package/dist/styles/tag-field.css +8 -0
  423. package/dist/styles/text-field.css +193 -0
  424. package/dist/styles/text.css +14 -12
  425. package/dist/styles/toolbar-control-group.css +67 -104
  426. package/dist/styles/toolbar-text.css +5 -18
  427. package/dist/styles/toolbar.css +25 -3
  428. package/dist/styles/webawesome.css +9 -0
  429. package/dist/styles/workbench-dialog.css +10 -0
  430. package/dist/styles/workbench.css +12 -4
  431. package/dist/surface-scaffold-register.d.ts +7 -5
  432. package/dist/surface-scaffold-register.js +2 -246
  433. package/dist/surface-scaffold-register.js.map +1 -1
  434. package/dist/surface-scaffold.d.ts +70 -7
  435. package/dist/surface-scaffold.js +5 -1
  436. package/dist/switch.d.ts +38 -0
  437. package/dist/switch.js +4 -0
  438. package/dist/switch.js.map +1 -0
  439. package/dist/{app-tab.d.ts → tab-bar-item.d.ts} +11 -11
  440. package/dist/tab-bar-item.js +6 -0
  441. package/dist/tab-bar-item.js.map +1 -0
  442. package/dist/tab-bar.d.ts +3 -3
  443. package/dist/tab-bar.js +1 -1
  444. package/dist/tab-navigator.js +1 -1
  445. package/dist/tag-field.d.ts +52 -0
  446. package/dist/tag-field.js +6 -0
  447. package/dist/tag-field.js.map +1 -0
  448. package/dist/text-field.d.ts +83 -0
  449. package/dist/text-field.js +6 -0
  450. package/dist/text-field.js.map +1 -0
  451. package/dist/text.d.ts +6 -1
  452. package/dist/text.js +1 -1
  453. package/dist/{types-CVgIwSdq.d.ts → types-DmHWkSd6.d.ts} +19 -1
  454. package/dist/webawesome.d.ts +3 -0
  455. package/dist/wire-catalog.d.ts +8 -2
  456. package/dist/wire-catalog.js +16 -4
  457. package/dist/wire-catalog.js.map +1 -1
  458. package/dist/wire-checkboxes.d.ts +10 -0
  459. package/dist/wire-checkboxes.js +3 -0
  460. package/dist/{wire-composers.js.map → wire-checkboxes.js.map} +1 -1
  461. package/dist/wire-choice-chips.d.ts +17 -0
  462. package/dist/wire-choice-chips.js +4 -0
  463. package/dist/{wire-token-search-fields.js.map → wire-choice-chips.js.map} +1 -1
  464. package/dist/wire-color-fields.d.ts +33 -0
  465. package/dist/wire-color-fields.js +82 -0
  466. package/dist/wire-color-fields.js.map +1 -0
  467. package/dist/wire-color-pickers.d.ts +34 -0
  468. package/dist/wire-color-pickers.js +9 -0
  469. package/dist/wire-color-pickers.js.map +1 -0
  470. package/dist/wire-comboboxes.js +2 -1
  471. package/dist/wire-content-items.d.ts +5 -1
  472. package/dist/wire-content-items.js +84 -15
  473. package/dist/wire-content-items.js.map +1 -1
  474. package/dist/wire-file-pickers.d.ts +3 -2
  475. package/dist/wire-file-pickers.js +1 -1
  476. package/dist/{wire-composers.d.ts → wire-message-composers.d.ts} +5 -4
  477. package/dist/wire-message-composers.js +3 -0
  478. package/dist/wire-message-composers.js.map +1 -0
  479. package/dist/wire-overlay-sheets.js +1 -1
  480. package/dist/wire-pane-chrome.d.ts +21 -0
  481. package/dist/wire-pane-chrome.js +67 -0
  482. package/dist/wire-pane-chrome.js.map +1 -0
  483. package/dist/{wire-token-search-fields.d.ts → wire-search-fields.d.ts} +25 -25
  484. package/dist/wire-search-fields.js +6 -0
  485. package/dist/wire-search-fields.js.map +1 -0
  486. package/dist/wire-sliders.d.ts +12 -0
  487. package/dist/wire-sliders.js +31 -0
  488. package/dist/wire-sliders.js.map +1 -0
  489. package/dist/wire-tab-bars.js +1 -1
  490. package/dist/wire-tag-fields.d.ts +41 -0
  491. package/dist/wire-tag-fields.js +258 -0
  492. package/dist/wire-tag-fields.js.map +1 -0
  493. package/dist/wire-text-fields.d.ts +12 -0
  494. package/dist/wire-text-fields.js +3 -0
  495. package/dist/wire-text-fields.js.map +1 -0
  496. package/dist/workbench-dialog.d.ts +97 -0
  497. package/dist/workbench-dialog.js +124 -0
  498. package/dist/workbench-dialog.js.map +1 -0
  499. package/dist/workbench.d.ts +5 -0
  500. package/dist/workbench.js +1 -1
  501. package/docs/accessibility.md +181 -97
  502. package/docs/anchored-surface.md +8 -7
  503. package/docs/app-layouts.md +28 -0
  504. package/docs/catalog.md +14 -5
  505. package/docs/color-field.md +65 -0
  506. package/docs/color-picker.md +71 -0
  507. package/docs/color-swatches.md +46 -0
  508. package/docs/component-contract.md +31 -32
  509. package/docs/component-selection.md +232 -165
  510. package/docs/design/templates/button/emphasis-dark.svg +1 -0
  511. package/docs/design/templates/button/emphasis.svg +1 -0
  512. package/docs/design/templates/button/icons-dark.svg +1 -0
  513. package/docs/design/templates/button/icons.svg +1 -0
  514. package/docs/design/templates/button/pill-dark.svg +1 -0
  515. package/docs/design/templates/button/pill.svg +1 -0
  516. package/docs/design/templates/button/states-dark.svg +1 -0
  517. package/docs/design/templates/button/states.svg +1 -0
  518. package/docs/design/templates/button/toggles-dark.svg +1 -0
  519. package/docs/design/templates/button/toggles.svg +1 -0
  520. package/docs/design/templates/button/tones-dark.svg +1 -0
  521. package/docs/design/templates/button/tones.svg +1 -0
  522. package/docs/design/templates/button-dark.svg +1 -0
  523. package/docs/design/templates/button.svg +1 -0
  524. package/docs/design/templates/checkbox/compact-dark.svg +1 -0
  525. package/docs/design/templates/checkbox/compact.svg +1 -0
  526. package/docs/design/templates/checkbox/error-dark.svg +1 -0
  527. package/docs/design/templates/checkbox/error.svg +1 -0
  528. package/docs/design/templates/checkbox/mixed-dark.svg +1 -0
  529. package/docs/design/templates/checkbox/mixed.svg +1 -0
  530. package/docs/design/templates/checkbox/states-dark.svg +1 -0
  531. package/docs/design/templates/checkbox/states.svg +1 -0
  532. package/docs/design/templates/checkbox-dark.svg +1 -0
  533. package/docs/design/templates/checkbox.svg +1 -0
  534. package/docs/design/templates/choice-chips/color-palette-dark.svg +1 -1
  535. package/docs/design/templates/choice-chips/color-palette.svg +1 -1
  536. package/docs/design/templates/choice-chips/compact-icons-dark.svg +1 -1
  537. package/docs/design/templates/choice-chips/compact-icons.svg +1 -1
  538. package/docs/design/templates/choice-chips/multiple-dark.svg +1 -1
  539. package/docs/design/templates/choice-chips/multiple.svg +1 -1
  540. package/docs/design/templates/choice-chips-dark.svg +1 -1
  541. package/docs/design/templates/choice-chips.svg +1 -1
  542. package/docs/design/templates/color-field/compact-dark.svg +1 -0
  543. package/docs/design/templates/color-field/compact.svg +1 -0
  544. package/docs/design/templates/color-field/error-dark.svg +1 -0
  545. package/docs/design/templates/color-field/error.svg +1 -0
  546. package/docs/design/templates/color-field/hint-dark.svg +1 -0
  547. package/docs/design/templates/color-field/hint.svg +1 -0
  548. package/docs/design/templates/color-field-dark.svg +1 -0
  549. package/docs/design/templates/color-field.svg +1 -0
  550. package/docs/design/templates/color-picker/gray-dark.svg +1 -0
  551. package/docs/design/templates/color-picker/gray.svg +1 -0
  552. package/docs/design/templates/color-picker/rgb-dark.svg +1 -0
  553. package/docs/design/templates/color-picker/rgb.svg +1 -0
  554. package/docs/design/templates/color-picker-dark.svg +1 -0
  555. package/docs/design/templates/color-picker.svg +1 -0
  556. package/docs/design/templates/color-swatches/palette-dark.svg +1 -0
  557. package/docs/design/templates/color-swatches/palette.svg +1 -0
  558. package/docs/design/templates/color-swatches-dark.svg +1 -0
  559. package/docs/design/templates/color-swatches.svg +1 -0
  560. package/docs/design/templates/disclosure/framed-sunken-dark.svg +1 -0
  561. package/docs/design/templates/disclosure/framed-sunken.svg +1 -0
  562. package/docs/design/templates/disclosure/plain-dark.svg +1 -0
  563. package/docs/design/templates/disclosure/plain.svg +1 -0
  564. package/docs/design/templates/disclosure-dark.svg +1 -0
  565. package/docs/design/templates/disclosure.svg +1 -0
  566. package/docs/design/templates/list-header/size-l-dark.svg +1 -1
  567. package/docs/design/templates/list-header/size-l.svg +1 -1
  568. package/docs/design/templates/list-header/size-m-dark.svg +1 -1
  569. package/docs/design/templates/list-header/size-m.svg +1 -1
  570. package/docs/design/templates/list-header/size-xl-dark.svg +1 -1
  571. package/docs/design/templates/list-header/size-xl.svg +1 -1
  572. package/docs/design/templates/list-header-dark.svg +1 -1
  573. package/docs/design/templates/list-header.svg +1 -1
  574. package/docs/design/templates/message-composer/chat-dark.svg +1 -0
  575. package/docs/design/templates/message-composer/chat.svg +1 -0
  576. package/docs/design/templates/{composer → message-composer}/prompt-dark.svg +1 -1
  577. package/docs/design/templates/{composer → message-composer}/prompt.svg +1 -1
  578. package/docs/design/templates/message-composer-dark.svg +1 -0
  579. package/docs/design/templates/message-composer.svg +1 -0
  580. package/docs/design/templates/progress-bar/determinate-dark.svg +1 -0
  581. package/docs/design/templates/progress-bar/determinate.svg +1 -0
  582. package/docs/design/templates/progress-bar/tones-dark.svg +1 -0
  583. package/docs/design/templates/progress-bar/tones.svg +1 -0
  584. package/docs/design/templates/progress-bar-dark.svg +1 -0
  585. package/docs/design/templates/progress-bar.svg +1 -0
  586. package/docs/design/templates/progress-ring/sizes-dark.svg +1 -0
  587. package/docs/design/templates/progress-ring/sizes.svg +1 -0
  588. package/docs/design/templates/progress-ring/tones-dark.svg +1 -0
  589. package/docs/design/templates/progress-ring/tones.svg +1 -0
  590. package/docs/design/templates/progress-ring-dark.svg +1 -0
  591. package/docs/design/templates/progress-ring.svg +1 -0
  592. package/docs/design/templates/radio-group/horizontal-dark.svg +1 -0
  593. package/docs/design/templates/radio-group/horizontal.svg +1 -0
  594. package/docs/design/templates/radio-group/vertical-dark.svg +1 -0
  595. package/docs/design/templates/radio-group/vertical.svg +1 -0
  596. package/docs/design/templates/radio-group-dark.svg +1 -0
  597. package/docs/design/templates/radio-group.svg +1 -0
  598. package/docs/design/templates/segmented-control/equal-dark.svg +1 -1
  599. package/docs/design/templates/segmented-control/equal.svg +1 -1
  600. package/docs/design/templates/segmented-control/pill-small-dark.svg +1 -1
  601. package/docs/design/templates/segmented-control/pill-small.svg +1 -1
  602. package/docs/design/templates/segmented-control-dark.svg +1 -1
  603. package/docs/design/templates/segmented-control.svg +1 -1
  604. package/docs/design/templates/select/compact-dark.svg +1 -0
  605. package/docs/design/templates/select/compact.svg +1 -0
  606. package/docs/design/templates/select/form-dark.svg +1 -0
  607. package/docs/design/templates/select/form.svg +1 -0
  608. package/docs/design/templates/select/icons-dark.svg +1 -0
  609. package/docs/design/templates/select/icons.svg +1 -0
  610. package/docs/design/templates/select-dark.svg +1 -0
  611. package/docs/design/templates/select.svg +1 -0
  612. package/docs/design/templates/slider/compact-dark.svg +1 -0
  613. package/docs/design/templates/slider/compact.svg +1 -0
  614. package/docs/design/templates/slider/readout-dark.svg +1 -0
  615. package/docs/design/templates/slider/readout.svg +1 -0
  616. package/docs/design/templates/slider/ticks-dark.svg +1 -0
  617. package/docs/design/templates/slider/ticks.svg +1 -0
  618. package/docs/design/templates/slider-dark.svg +1 -0
  619. package/docs/design/templates/slider.svg +1 -0
  620. package/docs/design/templates/switch/compact-dark.svg +1 -0
  621. package/docs/design/templates/switch/compact.svg +1 -0
  622. package/docs/design/templates/switch/states-dark.svg +1 -0
  623. package/docs/design/templates/switch/states.svg +1 -0
  624. package/docs/design/templates/switch-dark.svg +1 -0
  625. package/docs/design/templates/switch.svg +1 -0
  626. package/docs/design/templates/tag-field/error-dark.svg +1 -0
  627. package/docs/design/templates/tag-field/error.svg +1 -0
  628. package/docs/design/templates/tag-field/tags-dark.svg +1 -0
  629. package/docs/design/templates/tag-field/tags.svg +1 -0
  630. package/docs/design/templates/tag-field-dark.svg +1 -0
  631. package/docs/design/templates/tag-field.svg +1 -0
  632. package/docs/design/templates/text-field/compact-dark.svg +1 -0
  633. package/docs/design/templates/text-field/compact.svg +1 -0
  634. package/docs/design/templates/text-field/error-dark.svg +1 -0
  635. package/docs/design/templates/text-field/error.svg +1 -0
  636. package/docs/design/templates/text-field/labeled-dark.svg +1 -0
  637. package/docs/design/templates/text-field/labeled.svg +1 -0
  638. package/docs/design/templates/text-field/multiline-dark.svg +1 -0
  639. package/docs/design/templates/text-field/multiline.svg +1 -0
  640. package/docs/design/templates/text-field/search-dark.svg +1 -0
  641. package/docs/design/templates/text-field/search.svg +1 -0
  642. package/docs/design/templates/text-field-dark.svg +1 -0
  643. package/docs/design/templates/text-field.svg +1 -0
  644. package/docs/design/templates/toolbar/title-and-actions-dark.svg +1 -1
  645. package/docs/design/templates/toolbar/title-and-actions.svg +1 -1
  646. package/docs/design/templates/toolbar/width-visibility-320-dark.svg +1 -1
  647. package/docs/design/templates/toolbar/width-visibility-320.svg +1 -1
  648. package/docs/design/templates/toolbar/width-visibility-600-dark.svg +1 -1
  649. package/docs/design/templates/toolbar/width-visibility-600.svg +1 -1
  650. package/docs/design/templates/toolbar-dark.svg +1 -1
  651. package/docs/design/templates/toolbar.svg +1 -1
  652. package/docs/design/templates/value-table/details-dark.svg +1 -1
  653. package/docs/design/templates/value-table/details.svg +1 -1
  654. package/docs/design/templates/value-table-dark.svg +1 -1
  655. package/docs/design/templates/value-table.svg +1 -1
  656. package/docs/design/templates.md +19 -6
  657. package/docs/design-philosophy.md +6 -6
  658. package/docs/disclosure.md +63 -0
  659. package/docs/examples/component-catalog-extension.json +2 -2
  660. package/docs/layout.md +16 -7
  661. package/docs/list-detail-dialog.md +96 -0
  662. package/docs/manual-test-plan.md +1 -1
  663. package/docs/{composer.md → message-composer.md} +41 -28
  664. package/docs/overlay-toast.md +62 -0
  665. package/docs/overlay-tooltip.md +53 -0
  666. package/docs/progress.md +62 -0
  667. package/docs/recipes.md +15 -21
  668. package/docs/slider.md +64 -0
  669. package/docs/surface-scaffold.md +155 -88
  670. package/docs/tag-field.md +66 -0
  671. package/docs/type-contracts.md +8 -8
  672. package/docs/ui-analyzer.md +1 -1
  673. package/docs/ui-doctor.md +11 -6
  674. package/docs/ux-demo.md +6 -6
  675. package/docs/webawesome-migration.md +80 -0
  676. package/docs/webawesome-theme.md +57 -35
  677. package/docs/workbench-dialog.md +85 -0
  678. package/docs/workbench.md +10 -6
  679. package/docs/writing.md +10 -8
  680. package/doctor/copy-capitalization-checks.mjs +18 -9
  681. package/llms.txt +131 -57
  682. package/package.json +156 -39
  683. package/ux-demo/recipes/composer-form.tsx +18 -19
  684. package/ux-demo/recipes/list-detail-dialog.tsx +55 -162
  685. package/ux-demo/recipes/mount-recipe.ts +7 -6
  686. package/ux-demo/recipes/types.ts +1 -0
  687. package/ai/components/icon-button.md +0 -82
  688. package/ai/components/icon-toggle-button.md +0 -80
  689. package/ai/components/token-search-field.md +0 -107
  690. package/dist/app-tab.js +0 -6
  691. package/dist/app-tab.js.map +0 -1
  692. package/dist/browser/app-tab.js +0 -4
  693. package/dist/browser/composer.js +0 -4
  694. package/dist/browser/icon-toggle-button.js +0 -4
  695. package/dist/browser/token-search-field.js +0 -4
  696. package/dist/chunk-2MSPNRWJ.js.map +0 -1
  697. package/dist/chunk-7IUEBNCO.js.map +0 -1
  698. package/dist/chunk-AV7CPAPT.js +0 -82
  699. package/dist/chunk-AV7CPAPT.js.map +0 -1
  700. package/dist/chunk-BYFTHA4I.js.map +0 -1
  701. package/dist/chunk-CA7LNX3J.js +0 -44
  702. package/dist/chunk-CA7LNX3J.js.map +0 -1
  703. package/dist/chunk-ELCMSQNJ.js.map +0 -1
  704. package/dist/chunk-ETCWQLJV.js.map +0 -1
  705. package/dist/chunk-FDZNYD4C.js.map +0 -1
  706. package/dist/chunk-FR76ZJQC.js +0 -90
  707. package/dist/chunk-FR76ZJQC.js.map +0 -1
  708. package/dist/chunk-HQZYKJ56.js.map +0 -1
  709. package/dist/chunk-HZPHCSCS.js.map +0 -1
  710. package/dist/chunk-IM3GKYOG.js.map +0 -1
  711. package/dist/chunk-JOR5LGYE.js.map +0 -1
  712. package/dist/chunk-K4AT3V3J.js.map +0 -1
  713. package/dist/chunk-LL45C7BB.js.map +0 -1
  714. package/dist/chunk-LOSRXZAH.js.map +0 -1
  715. package/dist/chunk-LPHU44S3.js.map +0 -1
  716. package/dist/chunk-M5KZ26VV.js.map +0 -1
  717. package/dist/chunk-MF6ZUUJZ.js.map +0 -1
  718. package/dist/chunk-MXNIVEVL.js.map +0 -1
  719. package/dist/chunk-NS762OVM.js +0 -222
  720. package/dist/chunk-NS762OVM.js.map +0 -1
  721. package/dist/chunk-PKL6QJKK.js.map +0 -1
  722. package/dist/chunk-QTSMHH5J.js.map +0 -1
  723. package/dist/chunk-TDMHA7C3.js.map +0 -1
  724. package/dist/chunk-TGLUDQP2.js.map +0 -1
  725. package/dist/chunk-U6QYTMDB.js.map +0 -1
  726. package/dist/chunk-VFYO3UGZ.js +0 -45
  727. package/dist/chunk-VFYO3UGZ.js.map +0 -1
  728. package/dist/chunk-W4IK7AWD.js.map +0 -1
  729. package/dist/chunk-YBWQR2OK.js.map +0 -1
  730. package/dist/composer.js +0 -5
  731. package/dist/composer.js.map +0 -1
  732. package/dist/icon-button.d.ts +0 -46
  733. package/dist/icon-button.js +0 -6
  734. package/dist/icon-button.js.map +0 -1
  735. package/dist/icon-toggle-button.d.ts +0 -42
  736. package/dist/icon-toggle-button.js +0 -6
  737. package/dist/icon-toggle-button.js.map +0 -1
  738. package/dist/styles/components/actions/icon-button/icon-button.css +0 -22
  739. package/dist/styles/components/actions/icon-toggle-button/icon-toggle-button.css +0 -83
  740. package/dist/styles/icon-button.css +0 -22
  741. package/dist/styles/icon-toggle-button.css +0 -83
  742. package/dist/token-search-field.d.ts +0 -3
  743. package/dist/token-search-field.js +0 -5
  744. package/dist/token-search-field.js.map +0 -1
  745. package/dist/token-search-model.d.ts +0 -3
  746. package/dist/token-search-model.js +0 -3
  747. package/dist/token-search-model.js.map +0 -1
  748. package/dist/wire-composers.js +0 -3
  749. package/dist/wire-token-search-fields.js +0 -6
  750. package/docs/design/templates/composer/chat-dark.svg +0 -1
  751. package/docs/design/templates/composer/chat.svg +0 -1
  752. package/docs/design/templates/composer-dark.svg +0 -1
  753. package/docs/design/templates/composer.svg +0 -1
  754. /package/docs/design/templates/{token-search-field → search-field}/empty-dark.svg +0 -0
  755. /package/docs/design/templates/{token-search-field → search-field}/empty.svg +0 -0
  756. /package/docs/design/templates/{token-search-field → search-field}/tokens-dark.svg +0 -0
  757. /package/docs/design/templates/{token-search-field → search-field}/tokens.svg +0 -0
  758. /package/docs/design/templates/{token-search-field-dark.svg → search-field-dark.svg} +0 -0
  759. /package/docs/design/templates/{token-search-field.svg → search-field.svg} +0 -0
package/docs/ui-doctor.md CHANGED
@@ -146,7 +146,7 @@ capitalization rule in [Writing interface copy](./writing.md#capitalization).
146
146
  Names of commands, controls, views, and fields use title style, following
147
147
  Apple's guidance. `KUI-D040` (warning) reports a string or template literal
148
148
  passed to a known title-style prop that leaves a word lowercase where title style
149
- capitalizes it. For example, `<wa-button>Save draft</wa-button>` should be
149
+ capitalizes it. For example, `<Button>Save draft</Button>` should be
150
150
  "Save Draft", and `<ListHeader label="Needs attention" />` should be "Needs
151
151
  Attention". The action names the repaired label.
152
152
 
@@ -166,7 +166,8 @@ covers these string literals:
166
166
  declared in the same file;
167
167
  - `SegmentedControl`, `Select`, and `TabNavigator` choice and tab labels;
168
168
  - `NavStack` view titles and `backText`, and `SplitView` `backLabel`;
169
- - `FieldLabel` text and the static text of a `button` or `wa-button`;
169
+ - `FieldLabel` text and the static text of a `Button`, `button`, or
170
+ `wa-button`;
170
171
  - the `name` of a panel toolbar's `toggle: { action, name }` object literal
171
172
  (Workbench panels, `CollapsiblePanel`), which names the toggle group and
172
173
  completes its "Show …" / "Hide …" label;
@@ -180,11 +181,14 @@ covers these string literals:
180
181
  configuration declared in the same file; and the `aria-label` of a
181
182
  `section`, `nav`, `aside`, `main`, `header`, `footer`, `form`, or `search`
182
183
  element or an element with a landmark `role`;
183
- - the `label` of a raw `wa-input`, `wa-select`, `wa-textarea`, or
184
- `wa-radio-group`, which is a field or group label;
184
+ - field and group labels: the `label` and `ariaLabel` of `TextField`,
185
+ `Select`, and `RadioGroup`, and the `label` of a raw `wa-input`,
186
+ `wa-select`, `wa-textarea`, or `wa-radio-group` in an application using the
187
+ optional Web Awesome integration;
185
188
  - the accessible names of icon-only controls, which the rule also gives title
186
- style: `IconButton` and `IconToggleButton` `label`, `PopupMenu` `label`,
187
- `SplitButton` `optionsLabel`, `TokenSearchField` `clearLabel`, and the
189
+ style: an icon-only `Button`'s `ariaLabel`, `PopupMenu` `label`,
190
+ `SplitButton` `optionsLabel`, `SearchField` and `TextField`
191
+ `clearLabel`, and the
188
192
  `aria-label` of a `button` or `wa-button` whose only content is an icon. A
189
193
  button with visible text is judged by that text, never by its `aria-label`.
190
194
 
@@ -199,6 +203,7 @@ The check is deliberately one-directional, to keep false positives rare:
199
203
  is. A word joined to an interpolation (`` `${count}s` ``) is skipped.
200
204
  - It ignores other dynamic values and every sentence-style surface: descriptions,
201
205
  details, placeholders, tooltips, status text, and option text, including
206
+ `Checkbox` and `Switch` labels, `RadioGroup` choice labels, and
202
207
  `wa-checkbox`, `wa-switch`, and `wa-radio` labels. It does not read
203
208
  `LoadingSpinner` or `Skeleton` labels, which announce a status.
204
209
  - It skips tokens containing digits, code, paths, or URLs, and lowercase-led
package/docs/ux-demo.md CHANGED
@@ -33,12 +33,12 @@ deterministic state, and semantic layout owners from the [recipe guide](./recipe
33
33
  - It imports public component subpaths, exercising their browser-selected reachable CSS rather than a catalog-only style path.
34
34
  - The `ListActionRow` route's Run Tests row composes a trailing `PopupMenu` (`trailingMenu`) with Edit and Delete commands, revealed on interaction, that also opens at the pointer when the row's primary button is right-clicked.
35
35
  - The `ListActionRow` route demonstrates sibling primary/trailing native controls, independent disabled states, controlled selection, first-line leading-icon alignment for wrapped labels, and an application-owned native popover relationship without nesting controls. The `ListItem` route demonstrates the same multiline leading-icon anchor alongside its single-control navigation contract.
36
- - The `PopupMenu` route's context example opens one app-owned menu either at the row's right-click point or below its adjacent, keyboard-operable Demand Actions button. The Nested Decisions example shows the automatic phone-width submenu placement above or below its parent list, with native ArrowLeft return, Escape dismissal, and child selection.
37
- - The `AppTab` and `TabBar` routes are focused component specimens: AppTab shows its selected, compact, segmented, icon-only, truncation, placeholder, pending, metadata, and close-icon axes inside the required tablist context; TabBar shows its rail, segmented, inspector, allocation, placement, and accessory-zone axes, including an adjacent action plus a separately pinned end action whose tabs overflow at narrow widths, without application readouts. The pinned leading-tab specimen uses native strip scrolling so momentum and the final tab's end position remain natural; `snapTabs` stays an opt-in for applications that want whole-tab settling. The separate `Application tabs` composition route demonstrates controlled selection, matching panel content, overflow, adding (a new tab opens `pending` with a spinner and stays selectable while its panel shows a `Skeleton` heading until a simulated load completes), closing, keyboard/pointer reordering, and application-owned ordering. The `ResizableRegion` route likewise replaces only the decorative handle glyph while retaining separator semantics and shared wiring.
38
- - Every first-party visual component and every free Web Awesome 3.12 component has its own stable `?component=<id>` URL and focused demo. Composite header, menu, and feedback scenarios remain addressable alongside their subcomponents; the root opens the first Kerf component. The former aggregate Web Awesome theme specimen is intentionally omitted because its component families are covered by those focused routes.
36
+ - The `PopupMenu` route's context example opens one app-owned menu either at the row's right-click point or below its adjacent, keyboard-operable Demand Actions button. The Nested Decisions example shows the automatic phone-width submenu placement above or below its parent list, with ArrowLeft return, Escape dismissal, and child selection.
37
+ - The `TabBarItem` and `TabBar` routes are focused component specimens: TabBarItem shows its selected, compact, segmented, icon-only, truncation, placeholder, pending, metadata, and close-icon axes inside the required tablist context; TabBar shows its rail, segmented, inspector, allocation, placement, and accessory-zone axes, including an adjacent action plus a separately pinned end action whose tabs overflow at narrow widths, without application readouts. The pinned leading-tab specimen uses native strip scrolling so momentum and the final tab's end position remain natural; `snapTabs` stays an opt-in for applications that want whole-tab settling. The separate `Application tabs` composition route demonstrates controlled selection, matching panel content, overflow, adding (a new tab opens `pending` with a spinner and stays selectable while its panel shows a `Skeleton` heading until a simulated load completes), closing, keyboard/pointer reordering, and application-owned ordering. The `ResizableRegion` route likewise replaces only the decorative handle glyph while retaining separator semantics and shared wiring.
38
+ - Every first-party visual component and every free Web Awesome 3.14 component has its own stable `?component=<id>` URL and focused demo. Composite header, menu, and feedback scenarios remain addressable alongside their subcomponents; the root opens the first Kerf component. The former aggregate Web Awesome theme specimen is intentionally omitted because its component families are covered by those focused routes.
39
39
  - `ai/component-catalog.json` is the canonical catalog metadata. A deterministic checked-in projection supplies the demo's unique id, category, kind (`component`, `composition`, or `recipe`), source (`kerf` or `webawesome`), name, description, recommendation, direct `uses` dependencies, existing documentation path, and demo-source path; first-party, recipe, and Web Awesome renderer maps are exhaustively typed against its generated id unions. Functional groups follow their authored importance order; components precede compositions inside each group, equal-importance entries use alphabetical order, and the Recipes group comes last. Composition names stay concise and project a visible `Composition` sidebar tag. Non-supported Web Awesome recommendations project to a visible `Discouraged` tag, with Popup as the deliberate conditional exception. Demo paths resolve to the matching `ui/ux-demo/demos/<id>.tsx` or `ui/ux-demo/recipes/*.tsx` file, or to `ui/ux-demo/webawesome-demos.tsx` for Web Awesome entries. `ui/ux-demo/main.tsx` owns only the catalog shell, shared state, routing, and interaction wiring. First-party component entries additionally derive `ui/src/<public-subpath>.tsx` from their canonical `delivery.browserImport` or opt-in `delivery.moduleImport`.
40
40
  - Every detail footer groups compact `Demo Source` and `Guidance` actions; first-party component details also expose `Component Source`. Web Awesome details say `Integration Guidance` to distinguish the local integration contract from the upstream component implementation. Each button retains its repository-relative path in the DOM for verification and uses a deploy-safe absolute GitHub blob URL with a contextual new-tab name; the demo does not depend on a local source server or add a package runtime export. At phone widths, the resource group and related-component selector stack as full-width rows, with any resource overflow contained locally so labels cannot overlap the selector or widen the document.
41
- - The master/detail shell groups first-party routes by category with production `ListHeader` and `ListItem` components. Catalog entries can supply short reusable trailing tags; the Web Awesome projection uses them to label exactly the 15 discouraged choices. The 70 ecosystem components live in a separate `Web Awesome` disclosure with seven subgroups, so they remain discoverable without being presented as first-class `@kerfjs/ui` exports. Direct Web Awesome routes open the disclosure and reveal the selected row at wide sizes; narrow layouts keep the expanded list in document flow rather than introducing a competing nested scroller.
41
+ - The master/detail shell groups first-party routes by category with production `ListHeader` and `ListItem` components. Catalog entries can supply short reusable trailing tags; the Web Awesome projection uses them to label exactly the 47 discouraged choices, every element a Kerf component replaces. A `Show Discouraged` switch at the top of the open section lists them; it is off by default, so the section leads with the elements an integration application may still use, and a direct `?component=` route to a discouraged entry still lists that entry. The 73 optional-integration components live in a separate `Web Awesome Integration` disclosure with seven subgroups, so they remain discoverable without being presented as first-class `@kerfjs/ui` exports. Direct Web Awesome routes open the disclosure and reveal the selected row at wide sizes; narrow layouts keep the expanded list in document flow rather than introducing a competing nested scroller.
42
42
  - The shell itself uses `@kerfjs/ui/layout.css`: sidebars, details, previews, dialogs, and resize specimens share unpadded panes plus self-contained content items. Its sidebar identity uses the Kerf logo beside a vertically centered title, with supporting copy in its own aligned row; the current-view heading is also a toolbar. The shared Catalog sidebar includes a filter for entry and heading names that works across first-party and ecosystem sections, including collapsed sections. Collapsing the catalog removes the pane completely and moves its restore action to the main toolbar's leading edge instead of leaving an icon-only rail. The selected view description remains inset below the page toolbar. The preview stage sits directly in the sunken main Pane, with its canvas padded by the medium spacing token. The stage fills the preview scroller for short specimens and grows with taller ones; every background choice follows that same shared behavior in this demo and in consumers. The checkerboard belongs to that stage, rather than a viewport-height wrapper or nested card, and one explicitly repeated SVG tile keeps the pattern continuous through below-fold content. A lightly separated footer keeps live status above compact source, guidance, and relationship groups. The focused `ResizableRegion` specimen stretches its surface through the available stage height and reports committed width in that shared status footer; narrow layouts retain local horizontal access when the pane is resized wider than the stage, and the split remains readable at 200% root scaling. Geometry coverage checks wide, intermediate, narrow, and 200% zoom layouts.
43
43
  - The composer-form recipe demonstrates one coherent visible form surface with toolbar title/supporting-copy hierarchy, fields and actions on the shared 8px control gutter, and 24px major rhythm. Its conditional error or success `StateBanner` is the only nested semantic surface. Reset synchronizes the upgraded Web Awesome fields' live value properties with their empty controlled attributes and announces `Draft reset`; browser coverage preserves behavior and verifies wide, narrow, dark, validation, success, reset, 200% zoom, and forced-colors states.
44
44
  - The list-detail dialog recipe is laid out like a `Workbench` on roomy devices: a headerless `DialogSurface` modal whose `SplitView` holds a full-height list sidebar `Pane` with its own toolbar beside a full-height detail `Pane` that carries the primary xl title, the `data-dialog="close"` control, and the record actions in its footer. Compact devices get a full-screen sheet with its own labeled header, footer actions, and a list-to-detail drill-down. Browser geometry coverage protects those relationships at wide and narrow widths.
@@ -46,8 +46,8 @@ deterministic state, and semantic layout owners from the [recipe guide](./recipe
46
46
  - The menu composition route demonstrates toolbar/content/footer anatomy, 24px major gaps, 8/1/8 child geometry, the full-width `ListHeader` count-or-badge/action split, logical-end 44px action targets with 18px visuals, and 44px row/header/toolbar targets. Its one chevron is a production 18px `DisclosureArrow` inside a controlled Tools header that actually reveals and hides content; ordinary Projects navigation has no false disclosure affordance. Browser assertions cover stable naming, expanded/content transitions, visual rotation, node identity, reduced motion, RTL alignment and containment, and wide, narrow, dark, and 200% layouts. The focused ListHeader route separately shows the shared neutral count pill for Attachments, Notes (including zero), and Duplicates plus a non-count legacy badge, full-width logical-end actions, and no disclosure without content.
47
47
  - The `DisclosureArrow` route renders the production 18px root-scaled default without a catalog-only size override. Its two native buttons independently control the default right-to-down chevron and a recognizable right-facing replacement arrow with left-to-up custom directions; both use shortest-path rotation and their names stay stable while `aria-expanded` communicates state. Browser coverage verifies the custom clockwise path, pointer and native keyboard activation, focus, narrow and 200%-zoom stacking with contained labels, consumer sizing, and the independent `.5` Web Awesome glyph scale retained by Kerf `Select`.
48
48
  - A detail with relationships renders one content-fitted `Components` footer selector: `Uses` links to direct dependencies and `Used By` links to reverse dependents. Its popup owns the standard surface inset so headings and even long component names stay clear of the menu border. Choosing either navigates to that component's demo. The relationship group is absent when both sets are empty; no duplicate summary is rendered.
49
- - Focused demos ship no local stylesheets, inline styles, or styling-only class names. They compose Kerf components first, Web Awesome surfaces where Kerf has no equivalent, and ordinary semantic HTML for the remainder. The catalog-owned `CatalogExample.viewport` contract supplies the few specimen constraints needed to demonstrate layout behavior. Recipes follow the same rule: they ship no stylesheets, inline styles, or styling-only classes, and the catalog frames each one in the `CatalogExample` viewport its exported `presentation` declares (full-width application arrangements span the canvas measure; narrower recipes sit in the left-aligned example column). Demo-only CSS is limited to the document-shell `style.css`, which carries no recipe rules. Decorative chrome and Web Awesome controls share the same semantic system palette instead of carrying a separate demo identity.
50
- - Scenarios use deterministic data and cover real variants, long content, disabled state, selection, progress, feedback, overlays, media, helpers, and stateful interactions. Individual Web Awesome action, form, layout, navigation, feedback, media, and helper routes provide focused theme specimens without a redundant aggregate route; ListItem and ListHeader demonstrate typed domain metadata, protected native button/disclosure semantics, and a native popover trigger relationship without product props; the Headers composition demonstrates direct toolbar headings with an extra-large title, optional supporting copy, and grouped icon/actions; the Select route verifies that option icons survive unrelated Kerf rerenders and selected slot content follows value changes; the Animation route exposes preset, easing, duration, playback-rate, and transport controls with live lifecycle status; observer routes provide user-driven intersection, mutation, and resize events with live results; ToolbarControlGroup exposes all eight Hot Sheet 2 variants, loads the Web Awesome registrations needed by its popup specimen, and preserves the upgraded dropdown's managed light-DOM children across Kerf rerenders; the Toolbar route composes a collapsible TokenSearchField inside a group, animates between the empty iconic and complete field states, stays open while populated, and focuses the revealed editor; SegmentedControl covers toolbar, rounded-rectangle, pill, equal-width, and disabled presentations; TokenSearchField covers editable ordered chips, pointer and keyboard removal, caret-preserving controlled deletion, editing, clearing, free text, disabled state, and fixed first-line alignment while content wraps; StateBanner exposes every built-in tone with tone-tinted badges, a scoped override, and a placeholder with and without a badge, the badged placeholder in every tone so captures cover the solid badge skeleton; the Application tabs composition uses a Web Awesome card with semantic header/footer slots and Kerf `Text` while demonstrating overflow, edge autoscroll, and controlled pointer/keyboard reordering.
49
+ - Focused demos ship no local stylesheets, inline styles, or styling-only class names. They compose Kerf components first and ordinary semantic HTML for the remainder; a non-discouraged Web Awesome element appears only where neither fits. The catalog-owned `CatalogExample.viewport` contract supplies the few specimen constraints needed to demonstrate layout behavior. Recipes follow the same rule: they ship no stylesheets, inline styles, or styling-only classes, and the catalog frames each one in the `CatalogExample` viewport its exported `presentation` declares (full-width application arrangements span the canvas measure; narrower recipes sit in the left-aligned example column). Demo-only CSS is limited to the document-shell `style.css`, which carries no recipe rules. Decorative chrome and Web Awesome controls share the same semantic system palette instead of carrying a separate demo identity.
50
+ - Scenarios use deterministic data and cover real variants, long content, disabled state, selection, progress, feedback, overlays, media, helpers, and stateful interactions. Individual Web Awesome action, form, layout, navigation, feedback, media, and helper routes provide focused theme specimens without a redundant aggregate route; ListItem and ListHeader demonstrate typed domain metadata, protected native button/disclosure semantics, and a native popover trigger relationship without product props; the Headers composition demonstrates direct toolbar headings with an extra-large title, optional supporting copy, and grouped icon/actions; the Select route verifies that option icons survive unrelated Kerf rerenders and selected slot content follows value changes; the Animation route exposes preset, easing, duration, playback-rate, and transport controls with live lifecycle status; observer routes provide user-driven intersection, mutation, and resize events with live results; ToolbarControlGroup exposes all eight Hot Sheet 2 variants, loads the registrations needed by its popup specimen, and keeps an open PopupMenu's state across Kerf rerenders; the Toolbar route composes a collapsible SearchField inside a group, animates between the empty iconic and complete field states, stays open while populated, and focuses the revealed editor; SegmentedControl covers toolbar, rounded-rectangle, pill, equal-width, and disabled presentations; SearchField covers editable ordered chips, pointer and keyboard removal, caret-preserving controlled deletion, editing, clearing, free text, disabled state, and fixed first-line alignment while content wraps; StateBanner exposes every built-in tone with tone-tinted badges, a scoped override, and a placeholder with and without a badge, the badged placeholder in every tone so captures cover the solid badge skeleton; the Application tabs composition uses a Web Awesome card with semantic header/footer slots and Kerf `Text` while demonstrating overflow, edge autoscroll, and controlled pointer/keyboard reordering.
51
51
  - The ToolbarControlGroup route also demonstrates the public compact/tight,
52
52
  mixed-content, filled-selection, nested-dropdown, and avatar/scrim contracts
53
53
  added for consumers that previously restyled group descendants. The compact
@@ -0,0 +1,80 @@
1
+ # Moving an application off Web Awesome
2
+
3
+ Kerf UI no longer needs Web Awesome. Every Kerf component renders native
4
+ elements and reads only `--kui-*` tokens, so an application built only from
5
+ Kerf components installs nothing else. Web Awesome remains an optional
6
+ [integration](./component-selection.md#web-awesome-integration) for an
7
+ application that wants one of its specialized elements.
8
+
9
+ This guide moves an existing application from the Web Awesome elements Kerf
10
+ now replaces to the Kerf components, then, if nothing else needs it, removes
11
+ Web Awesome entirely.
12
+
13
+ ## 1. Replace each element
14
+
15
+ Work one element type at a time. Each Kerf component takes typed props, emits
16
+ standard DOM events, and keeps its state in native form controls, so a
17
+ delegated `input` / `change` / `click` handler usually keeps working once the
18
+ selector changes.
19
+
20
+ | Web Awesome markup | Kerf replacement | Notes |
21
+ | ------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
22
+ | `<wa-button variant="brand">Save</wa-button>` | `<Button tone="brand" action="save">Save</Button>` (`@kerfjs/ui/button`) | `tone` replaces `variant`; `emphasis` replaces `appearance`. Use `href` for a link button, `icon` with `ariaLabel` and no label for an icon-only one, and `pressed` for a toggle. |
23
+ | `<wa-input label="Name" hint="…" with-clear>` | `<TextField label="Name" hint="…" clearable />` (`@kerfjs/ui/text-field`) | Call `wireTextFields(root)` from `@kerfjs/ui/wire-text-fields` once for the clear button and a live `showCount`. Pass `error` for an invalid field. |
24
+ | `<wa-textarea rows="4" resize="auto">` | `<TextField multiline rows={4} maxRows={10} />` | `maxRows` grows the field with its content up to that height. |
25
+ | `<wa-checkbox>Email me</wa-checkbox>` | `<Checkbox label="Email me" action="toggle-email" />` (`@kerfjs/ui/checkbox`) | For a mixed parent, pass `indeterminate` and call `wireCheckboxes(root)` from `@kerfjs/ui/wire-checkboxes` once. |
26
+ | `<wa-checkbox-group>` | `Checkbox` rows in a `List`, or `ChoiceChips` with `multiple="toggle"` | |
27
+ | `<wa-radio-group label="Density"><wa-radio value="compact">…` | `<RadioGroup label="Density" name="density" value={density.value} choices={[{ value: 'compact', label: 'Compact' }]} />` | `@kerfjs/ui/radio-group`. Use `orientation="horizontal"` for a row. Use `SegmentedControl` for a view switch and `ChoiceChips` for wrapping pills. |
28
+ | `<wa-switch>Live updates</wa-switch>` | `<Switch label="Live updates" checked={live.value} action="toggle-live" />` (`@kerfjs/ui/switch`) | Only for a setting that applies immediately; use `Checkbox` for a submitted option. |
29
+ | `<wa-select>` with `<wa-option>` children | `<Select label="Status" name="status" value={status.value} choices={[…]} />` (`@kerfjs/ui/select`) | Import `@kerfjs/ui/select/register` once. It emits standard `input` and `change` events. |
30
+ | `<wa-dropdown>` with `<wa-dropdown-item>` commands | `<PopupMenu label="More Actions" icon={…} items={[{ label: 'Archive', action: 'archive' }]} />` (`@kerfjs/ui/popup-menu`) | Import `@kerfjs/ui/popup-menu/register` once. A dropdown that picks a value becomes a `Select`. |
31
+ | `<wa-dialog label="Edit">` and toggling `open` | `<DialogSurface id="edit" label="Edit" footer={…}>…</DialogSurface>` with `openDialog(dialog)` / `closeDialog(dialog)` | From `@kerfjs/ui/surface-scaffold`. The surface is a native `<dialog>`; listen for its native `close` event instead of `wa-after-hide`. Never toggle the `open` attribute. |
32
+ | `<wa-drawer>` | `<DialogSurface presentation="side-sheet" …>` (or `"bottom-sheet"`), or `CollapsiblePanel` for a collapsible rail | |
33
+ | `<wa-tab-group>`, `<wa-tab>`, `<wa-tab-panel>` | `TabBar` with `wireTabBars` (`@kerfjs/ui/tab-bar`), or `SegmentedControl` for compact local views | The application owns its panels. |
34
+ | `<wa-tag with-remove>` | `<Chip removeAction="remove-tag">Design</Chip>` (`@kerfjs/ui/chip`) | |
35
+ | `<wa-badge>`, `<wa-spinner>`, `<wa-skeleton>` | `Badge`, `LoadingSpinner`, `Skeleton` | |
36
+ | `<wa-icon name="…">` | `<LucideIcon icon={Star} name="star" />` (`@kerfjs/ui/lucide-icon`) | |
37
+ | `<wa-split-panel>` | `ResizableRegion` with `wireResizableRegions` | |
38
+ | `<wa-card>` | `<ContentItem appearance="surface" frame="framed">` (`@kerfjs/ui/content-item`), or `SunkenPanel` for a lowered region | |
39
+ | `<wa-page>` | `Workbench`, `SplitView`, `NavStack`, or `TabNavigator` | |
40
+ | `<wa-details>`, `<wa-accordion>`, `<wa-accordion-item>` | `<Disclosure title="…">` (`@kerfjs/ui/disclosure`) | Give Disclosures the same `name` for an accordion. The open state is native: set `element.open = false` to close one from code. |
41
+ | `<wa-slider>` | `<Slider id="…" label="…" value={…} />` (`@kerfjs/ui/slider`) | Add `showValue`/`unit` for a readout and `ticks` for stops; call `wireSliders(root)` once. |
42
+ | `<wa-tag-input>` | `<TagField id="…" label="…" tags={…} name="…" />` (`@kerfjs/ui/tag-field`) | Call `wireTagFields(root, { onChange })` once and re-render with the reported tags. |
43
+ | `<wa-color-picker>` | `<ColorField id="…" label="…" value={…} />` (`@kerfjs/ui/color-field`) |
44
+ | `<wa-include src="…">` | `resource()` from `kerfjs/async`, rendering the result as Kerf content | Never inject fetched markup; it bypasses kerf's `SafeHtml` escaping. |
45
+ | `<wa-scroller>` | A `Pane` (scroll edges via `wireScrollDividers`) or `ColumnTrack` for a horizontal track | |
46
+ | `<wa-button-group>` | `ToolbarControlGroup` or `SplitButton` for actions, `SegmentedControl` for a choice | |
47
+ | `<wa-progress-bar value="40">`, `<wa-progress-ring>` | `<ProgressBar label="…" value={0.4} />` (`@kerfjs/ui/progress-bar`) or `<ProgressRing label="…" value={0.4} />` (`@kerfjs/ui/progress-ring`) | Omit `value` for indeterminate progress; `valueText` replaces the spoken percentage. |
48
+ | `<wa-popover>`, `<wa-popup>` | `openAnchoredSurface(anchor, render, { label })` (`@kerfjs/ui/anchored-surface`); `positionAnchored()` or `autoReposition()` from `kerfjs/overlay` to place another element | `openAnchoredSurfaceAt` anchors to the pointer. |
49
+ | `<wa-tooltip>` | `tooltip()` from `kerfjs/overlay` with `@kerfjs/ui/overlay-tooltip.css` imported | Icon-only toolbar and popup controls already get Kerf help tags. Pass `exitClass: 'kui-tooltip-exit'` with `exitDuration: 100`. |
50
+ | `<wa-callout>` | `<StateBanner tone="warning" …>` (`@kerfjs/ui/state-banner`) | |
51
+ | `<wa-toast>`, `<wa-toast-item>` | `toast()` from `kerfjs/overlay` with `@kerfjs/ui/overlay-toast.css` imported | Pass `variant` for a tone, a `StateBanner` as the content for a title and detail, and `exitClass: 'kui-toast-exit'` with `exitDuration: 200`. A persistent status stays a `StateBanner` in place. |
52
+
53
+ Event and selector changes to look for:
54
+
55
+ - Replace listeners for Web Awesome events (`wa-change`, `wa-input`,
56
+ `wa-show`, `wa-after-hide`) with the standard events the native controls
57
+ emit (`change`, `input`, `toggle`, `close`).
58
+ - Replace selectors that name a `wa-*` tag with the component's `data-action`
59
+ or a stable application attribute passed through `rootAttributes`.
60
+ - Delete application CSS that styled `wa-*` parts with `::part()`; configure the
61
+ Kerf component through its props instead.
62
+
63
+ `npx kerf-ui-doctor` and the `eslint-plugin-kerfjs` `recommended-ui` rules flag
64
+ remaining `Discouraged` elements.
65
+
66
+ ## 2. Remove Web Awesome
67
+
68
+ Once no `wa-*` element remains in the application:
69
+
70
+ 1. Delete every `@awesome.me/webawesome/dist/components/…` registration import.
71
+ 2. Delete the `@kerfjs/ui/webawesome.css` import and any
72
+ `import type {} from "@kerfjs/ui/webawesome"` line.
73
+ 3. Remove `@awesome.me/webawesome` from `package.json`.
74
+ 4. Keep `@kerfjs/ui/foundation.css` (or your theme entry). Its tokens fall back
75
+ to the same values the Web Awesome theme gave them, so the application
76
+ renders identically.
77
+
78
+ If the application keeps a few specialized elements (Tree, Carousel, Rating,
79
+ and so on), keep steps 1–3 only for those elements; the integration's theme
80
+ bridge keeps them visually consistent with Kerf.
@@ -1,8 +1,32 @@
1
1
  # Web Awesome theme contract
2
2
 
3
- `@kerfjs/ui/webawesome.css` is the optional bridge between Web Awesome 3.12's
3
+ `@kerfjs/ui/webawesome.css` is the optional bridge between Web Awesome 3's
4
4
  free components and the Kerf/Hot Sheet 2 design system.
5
5
 
6
+ **Optional by design.** No Kerf component needs Web Awesome or this bridge.
7
+ `@awesome.me/webawesome` is an optional peer, and `@kerfjs/ui/webawesome.css`
8
+ (with the type-only `@kerfjs/ui/webawesome`) is the only entry that touches
9
+ it. `foundation.css` has no `wa-*` selectors; its tokens may read a Web
10
+ Awesome theme variable (`--kui-font-m: var(--wa-font-size-m, 16px)`), so an
11
+ app's Web Awesome theme also restyles Kerf, but every such read falls back to
12
+ the value this theme gives it. A Kerf-only application therefore renders
13
+ exactly like the catalog. Kerf component stylesheets read only `--kui-*`
14
+ tokens; the few rules that place a raw `wa-*` child inside a Kerf container
15
+ match nothing when Web Awesome is absent. The consumer-bundle tests and the
16
+ `webawesome-optional` browser spec enforce all of this.
17
+
18
+ **Supported versions.** `@kerfjs/ui` supports every Web Awesome 3.x release
19
+ from 3.14 (its optional peer range is `^3.14.0`). No Kerf component patches
20
+ Web Awesome's internals any more: `PopupMenu`, `Select`, and `DialogSurface`
21
+ draw their own native controls, so an upgrade within 3.x reaches only this
22
+ theme and the Web Awesome elements an application renders itself. The
23
+ package's own tests run against 3.14.0 (the lockfile), and CI's
24
+ `ui-webawesome-latest` job runs the ui unit and Chromium browser suites
25
+ against the newest 3.x (`npm run test:webawesome-latest`). That job reports,
26
+ rather than fails on, elements a newer Web Awesome adds that the catalog has
27
+ not reviewed yet, and a demo bundle over the budget recorded for the lockfile;
28
+ a cataloged element that disappears upstream still fails.
29
+
6
30
  ```ts
7
31
  import type {} from "@kerfjs/ui/webawesome";
8
32
  import "@kerfjs/ui/webawesome.css";
@@ -219,7 +243,7 @@ badge or containing scope when a product needs a different contrast-safe pair,
219
243
  or `--kui-wa-badge-accent-foreground` for a reviewed accent foreground.
220
244
  Breadcrumb has no bordered or filled container, and Scroller delegates item chrome
221
245
  to its slotted children, so both retain their upstream geometry. Web Awesome
222
- 3.12's free catalog has
246
+ 3.14's free catalog has
223
247
  `wa-dropdown-item`, but no `wa-menu-item`; the theme therefore styles the
224
248
  supported dropdown item rather than carrying a dead selector.
225
249
 
@@ -244,6 +268,11 @@ That scale applies to each Web Awesome component's intrinsic glyph and is
244
268
  independent of Kerf `DisclosureArrow`, whose default box is 18px relative to
245
269
  the root font size and whose consumer override is its typed `size` prop.
246
270
 
271
+ A loading step that is also the active `wa-stepper` step draws its spinner in
272
+ the marker's on-accent foreground. Upstream colors that spinner with the same
273
+ accent that fills an active marker, which would leave a blank disc; the theme
274
+ corrects it through the public `spinner` part.
275
+
247
276
  Tooltip and Popover use arrowless floating surfaces by default, matching Hot
248
277
  Sheet 2. The theme sets Web Awesome's public `--wa-tooltip-arrow-size` token to
249
278
  `0px` and maps each popover's public `--arrow-size` property from
@@ -318,36 +347,30 @@ static content and labels that constraint next to the rendered output.
318
347
 
319
348
  ## Component selection guidance
320
349
 
321
- The catalog lists every free Web Awesome component so support can be inspected;
322
- listing does not make each component the preferred Kerf application pattern.
323
- The [need-first decision matrix](./component-selection.md#web-awesome-overlap-policy)
324
- is the exhaustive Kerf/Web Awesome overlap index; the rules below explain the
325
- highest-risk choices.
326
-
327
- - Consider `wa-popup` for low-level anchored positioning when its flip, shift,
328
- or placement behavior avoids custom positioning code. Prefer the higher-level
329
- Tooltip or Popover when their interaction semantics already fit.
330
- - For ordinary app value selection, use Kerf `Select` instead of directly
331
- composing Web Awesome Dropdown, Dropdown Item, Select, or Option. Kerf Select
332
- owns the compact spacing and disclosure-arrow treatment while registering
333
- only its reachable Web Awesome dependencies. Use an action-menu pattern only
334
- when the choices truly perform commands rather than select a value.
335
- - Avoid Web Awesome Button Group as a general visual pattern. Use controlled
336
- `SegmentedControl` for a small exclusive choice set, including lightweight
337
- view selection inside an inspector. Reserve Button Group for an exceptional
338
- grouped-action requirement that is not a selection.
339
- - Prefer `TabBar` for reorderable or horizontally overflowing application tabs,
340
- and `SegmentedControl` for compact local views, instead of Web Awesome Tab,
341
- Tab Group, and Tab Panel.
350
+ The catalog lists every free Web Awesome component so an integration
351
+ application can inspect support; listing does not make any of them the
352
+ preferred Kerf pattern. Kerf components and native elements come first. The
353
+ [integration table](./component-selection.md#web-awesome-integration) names the
354
+ Kerf choice for every overlapping element, and the
355
+ [migration guide](./webawesome-migration.md) shows how to move an existing
356
+ application off them.
357
+
358
+ - Elements a Kerf component replaces are tagged `Discouraged` in the catalog:
359
+ Button, Dropdown, Dropdown Item, Button Group, Input, Textarea, Tag,
360
+ Checkbox, Checkbox Group, Radio, Radio Group, Switch, Select, Option,
361
+ Dialog, Drawer, Card, Page, Callout, Popover, Popup, Tab, Tab Group, Tab
362
+ Panel, Badge, Spinner, Skeleton, Toast, Toast Item, Tooltip, Details, Accordion,
363
+ Accordion Item, Progress Bar, Progress Ring, Slider, Tag Input, Color Picker,
364
+ Split Panel, Icon, Scroller, Include, and Zoomable Frame.
365
+ Never render them in application markup. Popover and Popup give way to
366
+ `AnchoredSurface` and `kerfjs/overlay`'s `positionAnchored()`; Tooltip,
367
+ Toast, and Toast Item give way to `kerfjs/overlay`'s `tooltip()` and
368
+ `toast()` with their Kerf stylesheets.
342
369
  - Use Web Awesome Tree, Tree Item, Animated Image, and Comparison only for a
343
370
  specific product requirement that needs their specialized behavior.
344
- - Avoid Web Awesome Zoomable Frame and Icon. Use application-owned media
345
- presentation and Kerf `LucideIcon`, respectively.
346
- - Prefer Kerf `ResizableRegion` over Web Awesome Split Panel for Hot Sheet-style
347
- application panes. It provides the persistent 1px separator, hover/focus
348
- grip, accessible keyboard and pointer resizing, controlled size, collapse
349
- support, and application-owned persistence. Use Split Panel only when its
350
- distinct Web Awesome API is itself required.
371
+ - Use the remaining supported elements (Carousel, Rating, and
372
+ the rest of the coverage list) when their native semantic contract matches
373
+ the product need and the application has adopted the integration.
351
374
 
352
375
  ## Customization
353
376
 
@@ -368,11 +391,10 @@ smallest subtree that needs a different identity:
368
391
  }
369
392
  ```
370
393
 
371
- `TokenSearchField` with `presentation="form-field"` uses
372
- `--wa-form-control-border-radius` for its control corners and
373
- `--wa-form-control-required-content-color` and
374
- `--wa-form-control-required-content-offset` for its required marker. These
375
- tokens keep it aligned with a neighboring `wa-input` when a form theme changes.
394
+ Kerf components read only `--kui-*` tokens. `SearchField` with
395
+ `presentation="form-field"` follows `--kui-layout-rounded-radius` for its
396
+ corners, as `TextField`, `Select`, and `Button` do, so the fields in a form
397
+ change together.
376
398
 
377
399
  The shipped theme pairs every `--wa-color-{variant}-fill-loud` with an
378
400
  `--wa-color-{variant}-on-loud` that clears WCAG AA (4.5:1) in both color
@@ -0,0 +1,85 @@
1
+ # Workbench dialog
2
+
3
+ `@kerfjs/ui/workbench-dialog` is the modal form of a `Workbench`: a work area
4
+ with side rails (layers, an inspector) inside a dialog. It is one of three
5
+ dialog types:
6
+
7
+ | Type | Use it for |
8
+ | ------------------------------------------------------------------- | -------------------------------------------------------- |
9
+ | `DialogSurface` ([surface-scaffold.md](surface-scaffold.md)) | One pane: a title, a body, and footer buttons. |
10
+ | `ListDetailDialog` ([list-detail-dialog.md](list-detail-dialog.md)) | Pick a record from a list and show its detail beside it. |
11
+ | `WorkbenchDialog` (this page) | An editing task with side panels. |
12
+
13
+ ```tsx
14
+ import { deviceClass } from "@kerfjs/ui/device-class";
15
+ import { openDialog, WorkbenchDialog } from "@kerfjs/ui/workbench-dialog";
16
+ import { wireWorkbench } from "@kerfjs/ui/wire-workbench";
17
+
18
+ const device = deviceClass();
19
+ const layersHidden = signal(false);
20
+
21
+ <WorkbenchDialog
22
+ id="edit-slide"
23
+ label="Edit Slide"
24
+ title="Edit Slide"
25
+ compact={device.value.compact}
26
+ main={<SlideCanvas />}
27
+ mainBottomToolbar={{ label: "Slide Actions", trailing: <SaveButtons /> }}
28
+ leftRail={{
29
+ label: "Layers",
30
+ collapsed: layersHidden.value,
31
+ toolbar: {
32
+ label: "Layers",
33
+ title: <ToolbarText text="Layers" />,
34
+ toggle: { action: "toggle-layers", name: "Layers" },
35
+ },
36
+ content: <LayerList />,
37
+ }}
38
+ />;
39
+
40
+ wireWorkbench(root, {
41
+ id: "edit-slide-workbench",
42
+ panels: { leftRail: { collapsed: layersHidden } },
43
+ });
44
+ openDialog(document.getElementById("edit-slide"));
45
+ ```
46
+
47
+ ## Layout
48
+
49
+ The dialog draws no surface header and no body inset. Its body is a
50
+ `Workbench` (`<id>-workbench`):
51
+
52
+ - **The work area's toolbar** carries the dialog's primary title (an xl
53
+ level-2 heading, id `<id>-title`) with an optional `description`, any
54
+ `leading` groups, the `actions`, and the close control. Close stays the
55
+ outermost trailing control, after a hidden right rail's toggle.
56
+ - **The rails** (`leftRail`, `rightRail`) keep their own toolbars, with
57
+ default-size titles, and run the dialog's full height. A hidden rail's
58
+ toggle relocates into the work area's toolbar.
59
+ - **The bottom** of the work area takes `mainFooter` and a
60
+ `mainBottomToolbar` for the dialog's buttons; `bottomDrawer` adds a drawer
61
+ under the work area.
62
+
63
+ ## Compact devices
64
+
65
+ Pass `compact` from `deviceClass().value.compact`. The dialog fills the
66
+ screen, and each rail presents as an overlay over the work area instead of
67
+ narrowing it. Start the rails collapsed on compact devices; their toolbar
68
+ toggles show them. With `wireWorkbench` and each rail's `collapsed` signal,
69
+ an open rail takes focus, keeps Tab inside it, and closes on Escape or a press
70
+ outside it. Escape closes an open rail before the dialog sees it; a second
71
+ Escape closes the dialog.
72
+
73
+ ## Props
74
+
75
+ - `id`, `label` (required): identity and the dialog's accessible name.
76
+ - `title` (required), `description`, `leading`, `actions`.
77
+ - `main` (required), `mainFooter`, `mainBottomToolbar`.
78
+ - `leftRail`, `rightRail`, `bottomDrawer`: `WorkbenchPanel`s.
79
+ - `compact`, `closeLabel` (default `Close`), `lightDismiss`.
80
+ - Roomy sizing: `size` (default `large`), `preferredWidth`, `height` (default
81
+ 560px), `maxHeight`, `viewportGutter`, and `mainMinSize`.
82
+ - `rootAttributes`, `className`, `slot`.
83
+
84
+ Open and close it like any dialog surface with `openDialog()` and
85
+ `closeDialog()`, which this module re-exports.
package/docs/workbench.md CHANGED
@@ -95,8 +95,9 @@ an optional `label`. Common shell behavior is configured rather than restyled:
95
95
  - `collapseMotion: "slide" | "fade-slide" | "none"` keeps the track change
96
96
  instant while choosing composited content motion;
97
97
  - `contentOverflow: "clip" | "auto" | "visible"` chooses the resting overflow
98
- policy. An open descendant `PopupMenu` or Web Awesome dropdown temporarily
99
- releases rail/drawer clipping and raises its popup layer automatically;
98
+ policy. A `PopupMenu` opens in the browser top layer, which no clipping
99
+ reaches; an open raw Web Awesome dropdown temporarily releases rail/drawer
100
+ clipping and raises its popup layer automatically;
100
101
  - `presentation: "inline" | "overlay" | "hidden"` supports compact overlays
101
102
  or a responsive replacement. An overlay rail spans the Workbench height at
102
103
  its side and an overlay drawer spans the work-area column at the bottom,
@@ -232,9 +233,12 @@ While a panel is closed, marked groups follow their open-panel zone order
232
233
  | Panel | Where they go |
233
234
  | ------------- | --------------------------------------------------------------------------------------------------------------- |
234
235
  | Left rail | The leading edge of `mainToolbar`, before its `title` |
235
- | Right rail | The trailing edge of `mainToolbar`, after its `trailing` groups, so the toggle is the toolbar's last group |
236
+ | Right rail | The trailing edge of `mainToolbar`, after its `trailing` groups and before any `end` groups |
236
237
  | Bottom drawer | The trailing edge of `mainBottomToolbar`; without one, a `FloatingToolbar` in the work area's bottom-end corner |
237
238
 
239
+ `mainToolbar.end` takes groups that stay outermost, after a closed right
240
+ rail's toggle, such as a dialog's close control (`WorkbenchDialog` uses it).
241
+
238
242
  A rail with no `mainToolbar` floats its groups in its corner the same way, so
239
243
  a closed panel can always be reopened. An open overlay panel carries its own
240
244
  toggle, so it never depends on a control it covers. An app's own
@@ -612,9 +616,9 @@ collapse slides it out at the resized width. A collapsed,
612
616
  overlay, or hidden region is not resizeable. Together these policies replace
613
617
  app CSS for separator suppression, instant-track/composited-content collapse,
614
618
  popup overflow, mobile overlay/hidden replacement, resize-transition guards,
615
- and safe-area restore placement. A descendant `PopupMenu` or Web Awesome
616
- dropdown with `open` releases clipping for its lifecycle, so menu events need
617
- not rerender the region. The app still owns the other signals and decides when
619
+ and safe-area restore placement. A descendant `PopupMenu` shows in the top
620
+ layer, and a raw Web Awesome dropdown with `open` releases clipping for its
621
+ lifecycle, so menu events need not rerender the region. The app still owns the other signals and decides when
618
622
  each policy applies.
619
623
 
620
624
  ## Public styling boundary
package/docs/writing.md CHANGED
@@ -105,7 +105,7 @@ interpolated value keeps its own spelling. The covered props are:
105
105
  - `PopupMenu` `text` and item and heading labels, including submenus;
106
106
  - `SegmentedControl`, `Select`, and `TabNavigator` choice and tab labels;
107
107
  - `NavStack` view titles and `backText`, and `SplitView` `backLabel`;
108
- - `FieldLabel` text and the text of a `button` or `wa-button`;
108
+ - `FieldLabel` text and the text of a `Button`, `button`, or `wa-button`;
109
109
  - the `name` of a panel toolbar's `toggle: { action, name }`;
110
110
  - region and landmark names: the `label` of `Pane`, `Workbench`, `Toolbar`,
111
111
  `ToolbarControlGroup`, `TabBar`, `NavStack`, `CollapsiblePanel`,
@@ -114,15 +114,17 @@ interpolated value keeps its own spelling. The covered props are:
114
114
  inside `Workbench`, `CollapsiblePanel`, and `NavStack` configuration, and
115
115
  the `aria-label` of a landmark element (`section`, `nav`, `aside`, `main`,
116
116
  `header`, `footer`, `form`, `search`) or landmark role;
117
- - the `label` of a raw `wa-input`, `wa-select`, `wa-textarea`, or
118
- `wa-radio-group`;
119
- - the accessible names of icon-only controls: `IconButton` and
120
- `IconToggleButton` `label`, `PopupMenu` `label`, `SplitButton`
121
- `optionsLabel`, `TokenSearchField` `clearLabel`, and the `aria-label` of a
117
+ - field and group labels: the `label` (or `ariaLabel`) of `TextField`,
118
+ `Select`, and `RadioGroup`, and, in an application using the optional Web
119
+ Awesome integration, the `label` of a raw `wa-input`, `wa-select`,
120
+ `wa-textarea`, or `wa-radio-group`;
121
+ - the accessible names of icon-only controls: an icon-only `Button`'s `ariaLabel`, `PopupMenu` `label`, `SplitButton`
122
+ `optionsLabel`, `SearchField` and `TextField` `clearLabel`, and the `aria-label` of a
122
123
  `button` or `wa-button` whose only content is an icon.
123
124
 
124
- The check never judges sentence-style surfaces (including `wa-checkbox`,
125
- `wa-switch`, and `wa-radio` option text and the `LoadingSpinner` and
125
+ The check never judges sentence-style surfaces (including `Checkbox` and
126
+ `Switch` labels, `RadioGroup` choice labels, `wa-checkbox`, `wa-switch`, and
127
+ `wa-radio` option text and the `LoadingSpinner` and
126
128
  `Skeleton` status labels), interpolated or other dynamic values, or text
127
129
  ending with `.`, `!`, or `?`. It skips a word joined to an interpolation, tokens containing digits, code, or paths, and
128
130
  lowercase-led brands such as iOS. It does not report capitalized short words,
@@ -14,7 +14,8 @@ import { isUiTraversalExcluded } from '../traversal-exclusions.mjs';
14
14
  // to known title-style props are read (a template literal's static words, never
15
15
  // its interpolated values), so prose, descriptions, placeholders, tooltips,
16
16
  // checkbox/switch option text, status lines, LoadingSpinner and Skeleton
17
- // labels, and dynamic data are never judged. The check reports lowercase words title style capitalizes; it
17
+ // labels, Checkbox/Switch labels and RadioGroup choice labels, and dynamic
18
+ // data are never judged. The check reports lowercase words title style capitalizes; it
18
19
  // does not report capitalized short words, because Apple capitalizes a
19
20
  // preposition of any length inside a phrasal verb ("Log In to the Server").
20
21
 
@@ -156,9 +157,9 @@ const titleStyleProps = new Map([
156
157
  ['StateBanner', { props: ['title'] }],
157
158
  ['SplitButton', { props: ['label', 'optionsLabel'] }],
158
159
  ['Combobox', { props: ['label'] }],
159
- ['IconButton', { props: ['label'] }],
160
- ['IconToggleButton', { props: ['label'] }],
161
- ['TokenSearchField', { props: ['clearLabel'] }],
160
+ // An icon-only Button is named by ariaLabel; its visible text is read below.
161
+ ['Button', { props: ['ariaLabel'] }],
162
+ ['SearchField', { props: ['clearLabel'] }],
162
163
  // NavStack view titles and backText, plus the stack's region name and each
163
164
  // view's toolbar and pane region names.
164
165
  [
@@ -174,7 +175,14 @@ const titleStyleProps = new Map([
174
175
  ['SplitView', { props: ['backLabel'] }],
175
176
  ['PopupMenu', { props: ['text', 'label'], entries: { items: ['label'] } }],
176
177
  ['SegmentedControl', { entries: { choices: ['label'] } }],
177
- ['Select', { entries: { choices: ['label'] } }],
178
+ [
179
+ 'Select',
180
+ { props: ['label', 'ariaLabel'], entries: { choices: ['label'] } },
181
+ ],
182
+ // Field and group labels. A Checkbox or Switch label and a RadioGroup
183
+ // choice label are option text, which is sentence style and not read.
184
+ ['TextField', { props: ['label', 'ariaLabel', 'clearLabel'] }],
185
+ ['RadioGroup', { props: ['label', 'ariaLabel'] }],
178
186
  ['TabNavigator', { entries: { tabs: ['label'] } }],
179
187
  // Region and landmark names: the accessible name of a pane, toolbar,
180
188
  // control group, list, tab bar, or layout region names it, so it is title
@@ -235,9 +243,10 @@ const landmarkRoles = new Set([
235
243
  'form',
236
244
  'search',
237
245
  ]);
238
- // A raw Web Awesome field's or radio group's `label` is a field label. The
239
- // option text of `wa-checkbox`, `wa-switch`, and `wa-radio` is sentence style
240
- // and is not read.
246
+ // A raw Web Awesome field's or radio group's `label` (in an application using
247
+ // the optional integration) is a field label. The option text of
248
+ // `wa-checkbox`, `wa-switch`, and `wa-radio` is sentence style and is not
249
+ // read.
241
250
  const fieldLabelTags = new Set([
242
251
  'wa-input',
243
252
  'wa-select',
@@ -245,7 +254,7 @@ const fieldLabelTags = new Set([
245
254
  'wa-radio-group',
246
255
  ]);
247
256
  const titleToolbarTextSizes = new Set(['xlarge', 'xlarge-fixed', 'large']);
248
- const buttonTags = new Set(['button', 'wa-button']);
257
+ const buttonTags = new Set(['button', 'wa-button', 'Button']);
249
258
  const titleSlots = new Set(['title', 'leading', 'header']);
250
259
  const statusToolbarTextSizes = new Set(['small', 'xsmall']);
251
260