@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
@@ -160,7 +160,8 @@
160
160
  },
161
161
  "accessibility": {
162
162
  "obligations": [
163
- "Decorative icons are aria-hidden; meaningful icons require a label."
163
+ "Decorative icons are aria-hidden; meaningful icons require a label.",
164
+ "title adds an SVG <title> as hover text over the whole icon box (a transparent hit box fills the 24-unit view box); with label, the label stays the name, and alone the title names the icon."
164
165
  ]
165
166
  },
166
167
  "cssValueProps": [],
@@ -410,6 +411,7 @@
410
411
  "--kui-color-danger-on-fill",
411
412
  "--kui-focus-ring",
412
413
  "--kui-shadow-s",
414
+ "--kui-shadow-m",
413
415
  "--kui-shadow-l"
414
416
  ]
415
417
  },
@@ -671,7 +673,7 @@
671
673
  ],
672
674
  "wiring": {
673
675
  "required": false,
674
- "helpers": ["wireScrollDividers"],
676
+ "helpers": ["wireScrollDividers", "wirePaneChrome"],
675
677
  "obligations": [],
676
678
  "stateAttributes": [
677
679
  {
@@ -1909,7 +1911,7 @@
1909
1911
  "obligations": [
1910
1912
  "Name the group when its relationship is not evident from context.",
1911
1913
  "A disabled native button (disabled, or aria-disabled=\"true\" when it must stay focusable) dims to half opacity with the not-allowed cursor and no hover surface; a disabled raw wa-button paints no hover surface either. Do not add disabled styling yourself.",
1912
- "Name an icon-only button or link with aria-label, not title. Once any help-tag installer is imported (select/register, popup-menu/register, or help-tags/register), it shows an aria-hidden Web Awesome help tag repeating that name after a 500ms hover and at once on keyboard focus, hidden on a press and on Escape, and never joins aria-labelledby. A native title keeps the browser tooltip and gets no second tag.",
1914
+ "Name an icon-only button or link with aria-label, not title. Once any help-tag installer is imported (select/register, popup-menu/register, or help-tags/register), it shows an aria-hidden help tag repeating that name after a 500ms hover and at once on keyboard focus, hidden on a press and on Escape, and never joins aria-labelledby. A native title keeps the browser tooltip and gets no second tag.",
1913
1915
  "In an overlay Pane header (headerPresentation=\"overlay\"), overlay NavStack chrome (chromePresentation=\"overlay\") or bottom toolbar (bottomToolbarPresentation=\"overlay\"), or a DialogSurface floating header's header-actions (headerPresentation=\"floating\"), a default-tone group (not dark-toned, not an avatar scrim) takes --kui-color-text for its controls, so they keep WCAG AA over content passing beneath the translucent chrome material.",
1914
1916
  "A dark-toned group's hover paints a 14% surface wash over its loud fill, on one control of a group or across a lone control's whole group, so the on-loud icon keeps at least 3:1 over a light page and well above it in dark."
1915
1917
  ]
@@ -2011,10 +2013,26 @@
2011
2013
  "zones": [],
2012
2014
  "children": { "mode": "any", "concepts": [], "requiredConcepts": [] },
2013
2015
  "state": [
2014
- { "id": "open state", "owner": "application", "required": false },
2015
- { "id": "focus lifecycle", "owner": "application", "required": false },
2016
- { "id": "dismissal policy", "owner": "application", "required": false },
2017
- { "id": "content", "owner": "application", "required": false },
2016
+ {
2017
+ "id": "open state (openDialog and closeDialog)",
2018
+ "owner": "application",
2019
+ "required": false
2020
+ },
2021
+ {
2022
+ "id": "whether a close request may proceed (cancel kui-request-close to keep the dialog open; the panel pulses)",
2023
+ "owner": "application",
2024
+ "required": false
2025
+ },
2026
+ {
2027
+ "id": "dismissal policy (lightDismiss)",
2028
+ "owner": "application",
2029
+ "required": false
2030
+ },
2031
+ {
2032
+ "id": "content, heading, header actions, and footer",
2033
+ "owner": "application",
2034
+ "required": false
2035
+ },
2018
2036
  { "id": "outer placement", "owner": "application", "required": false },
2019
2037
  {
2020
2038
  "id": "whether core kerfjs/overlay dialogs presented as bottom sheets take this package's geometry and slide (import @kerfjs/ui/overlay-sheet.css; exitClass 'kui-overlay-sheet-exit' for the slide out; the kui-overlay-sheet-resizable class plus wireOverlaySheets for a resize grabber)",
@@ -2035,10 +2053,11 @@
2035
2053
  },
2036
2054
  "accessibility": {
2037
2055
  "obligations": [
2038
- "Supply the wrapped wa-dialog label and retain Web Awesome's native modal and focus behavior.",
2056
+ "DialogSurface is a native <dialog> opened modally (showModal): it is in the top layer, the rest of the page is inert, focus stays inside, and it returns to the opener on close. Focus starts on an autofocus element, otherwise on the panel.",
2057
+ "Name it with label (also its title text) or labelledBy (the id of a heading, such as a ToolbarText). The close button is named Close (closeLabel) and Escape asks to close; the cancelable kui-request-close event reports source close-button, escape, or backdrop.",
2039
2058
  "Name a PopoverDialogSurface with label or labelledBy, and describe it with describedBy (rendered as aria-describedby), usually a title ToolbarText descriptionId.",
2040
2059
  "A floating header's title uses the normal text color, which keeps WCAG AA over the 80% raised chrome material on any content; the material turns opaque under prefers-reduced-transparency, prefers-contrast: more, forced colors, or without backdrop-filter.",
2041
- "A resizable bottom sheet's grabber is a focusable horizontal separator (\"Resize sheet\") with aria-valuemin, aria-valuenow, and aria-valuemax in visible px; the arrow keys, Page Up/Down, Home, and End resize it, and its slide motion falls back to Web Awesome's under prefers-reduced-motion.",
2060
+ "A resizable bottom sheet's grabber is a focusable horizontal separator (\"Resize sheet\") with aria-valuemin, aria-valuenow, and aria-valuemax in visible px; the arrow keys, Page Up/Down, Home, and End resize it, and its slide motion is skipped under prefers-reduced-motion.",
2042
2061
  "Use popup surfaces only for real dropdown menus with named triggers."
2043
2062
  ]
2044
2063
  },
@@ -2148,6 +2167,12 @@
2148
2167
  "rootClass": "kui-dialog-surface",
2149
2168
  "publicClasses": [
2150
2169
  "kui-dialog-surface",
2170
+ "kui-dialog-surface__body",
2171
+ "kui-dialog-surface__close",
2172
+ "kui-dialog-surface__footer",
2173
+ "kui-dialog-surface__header",
2174
+ "kui-dialog-surface__header-actions",
2175
+ "kui-dialog-surface__title",
2151
2176
  "kui-popover-dialog-surface",
2152
2177
  "kui-popup-surface"
2153
2178
  ],
@@ -2169,6 +2194,216 @@
2169
2194
  "composition": "generated-permissive-default"
2170
2195
  }
2171
2196
  },
2197
+ {
2198
+ "key": "@kerfjs/ui:list-detail-dialog",
2199
+ "package": "@kerfjs/ui",
2200
+ "id": "list-detail-dialog",
2201
+ "name": "ListDetailDialog",
2202
+ "kind": "component",
2203
+ "source": "kerf",
2204
+ "parents": { "mode": "any", "entries": [] },
2205
+ "contexts": ["application-ui"],
2206
+ "zones": [],
2207
+ "children": { "mode": "any", "concepts": [], "requiredConcepts": [] },
2208
+ "state": [
2209
+ {
2210
+ "id": "open state (openDialog and closeDialog)",
2211
+ "owner": "application",
2212
+ "required": false
2213
+ },
2214
+ {
2215
+ "id": "device-class policy (compact)",
2216
+ "owner": "application",
2217
+ "required": false
2218
+ },
2219
+ {
2220
+ "id": "selected item and, on compact devices, detailActive and the back action (nav-back)",
2221
+ "owner": "application",
2222
+ "required": false
2223
+ },
2224
+ {
2225
+ "id": "list and detail content, their titles, toolbar controls, and footers",
2226
+ "owner": "application",
2227
+ "required": false
2228
+ },
2229
+ {
2230
+ "id": "dismissal policy (lightDismiss)",
2231
+ "owner": "application",
2232
+ "required": false
2233
+ }
2234
+ ],
2235
+ "wiring": {
2236
+ "required": false,
2237
+ "helpers": ["wireNavStack"],
2238
+ "obligations": [],
2239
+ "stateAttributes": [
2240
+ {
2241
+ "name": "data-nav-chrome-transition",
2242
+ "on": "kui-nav-stack",
2243
+ "helper": "wireNavStack",
2244
+ "meaning": "\"true\" while the chrome cross-fades between the outgoing and incoming view."
2245
+ },
2246
+ {
2247
+ "name": "data-nav-chrome-copy",
2248
+ "on": "kui-nav-stack__chrome-copy",
2249
+ "helper": "wireNavStack",
2250
+ "meaning": "Marks the inert, aria-hidden snapshot of the outgoing chrome shown during the cross-fade."
2251
+ },
2252
+ {
2253
+ "name": "data-nav-revealed",
2254
+ "on": "kui-nav-stack__view",
2255
+ "helper": "wireNavStack",
2256
+ "meaning": "\"true\" on the preserved, aria-hidden previous view while an incoming view slides over it."
2257
+ },
2258
+ {
2259
+ "name": "data-nav-exiting",
2260
+ "on": "kui-nav-stack__view",
2261
+ "helper": "wireNavStack",
2262
+ "meaning": "\"true\" on a popped view the helper briefly re-inserts to slide it out."
2263
+ },
2264
+ {
2265
+ "name": "data-chrome-overlay",
2266
+ "on": "kui-nav-stack",
2267
+ "helper": "wireNavStack",
2268
+ "meaning": "measured once the helper has measured the compact stack's overlay chrome (compactStack.chromePresentation: overlay) and published its border-box height on the stack root. Re-applied if a re-render drops it."
2269
+ },
2270
+ {
2271
+ "name": "data-bottom-toolbar-overlay",
2272
+ "on": "kui-nav-stack",
2273
+ "helper": "wireNavStack",
2274
+ "meaning": "measured once the helper has measured the compact stack's overlay bottom toolbar (compactStack.bottomToolbarPresentation: overlay) and published its border-box height on the stack root. Re-applied if a re-render drops it."
2275
+ }
2276
+ ]
2277
+ },
2278
+ "responsive": { "owner": "not-applicable", "behaviors": [] },
2279
+ "layout": {
2280
+ "roles": ["structure"],
2281
+ "geometry": {
2282
+ "margin": "parent",
2283
+ "border": "self",
2284
+ "padding": "child",
2285
+ "notes": [
2286
+ "The dialog draws no header and no body inset; each column is a Pane that owns its chrome and content insets, and the column divider runs the dialog's full height."
2287
+ ]
2288
+ }
2289
+ },
2290
+ "accessibility": {
2291
+ "obligations": [
2292
+ "It is a native modal <dialog> named by label: the page is inert, focus stays inside, Escape asks to close, and focus returns to the opener on close.",
2293
+ "On roomy devices the detail title is a level-2 heading; every presentation keeps a close control named Close (closeLabel), and the compact back control is named by backLabel."
2294
+ ]
2295
+ },
2296
+ "cssValueProps": [],
2297
+ "boundaries": {
2298
+ "rootClass": null,
2299
+ "publicClasses": [],
2300
+ "publicTokens": []
2301
+ },
2302
+ "diagnostics": [],
2303
+ "provenance": {
2304
+ "selection": "ai/component-catalog.json",
2305
+ "composition": "generated-permissive-default"
2306
+ }
2307
+ },
2308
+ {
2309
+ "key": "@kerfjs/ui:workbench-dialog",
2310
+ "package": "@kerfjs/ui",
2311
+ "id": "workbench-dialog",
2312
+ "name": "WorkbenchDialog",
2313
+ "kind": "component",
2314
+ "source": "kerf",
2315
+ "parents": { "mode": "any", "entries": [] },
2316
+ "contexts": ["application-ui"],
2317
+ "zones": [],
2318
+ "children": { "mode": "any", "concepts": [], "requiredConcepts": [] },
2319
+ "state": [
2320
+ {
2321
+ "id": "open state (openDialog and closeDialog)",
2322
+ "owner": "application",
2323
+ "required": false
2324
+ },
2325
+ {
2326
+ "id": "device-class policy (compact), and starting the rails collapsed on compact devices",
2327
+ "owner": "application",
2328
+ "required": false
2329
+ },
2330
+ {
2331
+ "id": "each rail's collapsed state and toggle actions (wireWorkbench closes an overlay rail on Escape or an outside press)",
2332
+ "owner": "application",
2333
+ "required": false
2334
+ },
2335
+ {
2336
+ "id": "the work area, rail content, actions, and bottom toolbar",
2337
+ "owner": "application",
2338
+ "required": false
2339
+ },
2340
+ {
2341
+ "id": "dismissal policy (lightDismiss)",
2342
+ "owner": "application",
2343
+ "required": false
2344
+ }
2345
+ ],
2346
+ "wiring": {
2347
+ "required": false,
2348
+ "helpers": ["wireWorkbench"],
2349
+ "obligations": [],
2350
+ "stateAttributes": [
2351
+ {
2352
+ "name": "data-responsive-overlay-active",
2353
+ "on": "kui-workbench__rail and kui-workbench__drawer",
2354
+ "helper": "wireWorkbench",
2355
+ "meaning": "Present while a panel's numeric responsiveOverlayAt threshold applies to the Workbench width; the same measurement drives overlay layout and collapsed-state transitions."
2356
+ },
2357
+ {
2358
+ "name": "data-numeric-overlays",
2359
+ "on": "kui-workbench",
2360
+ "helper": "wireWorkbench",
2361
+ "meaning": "Space-separated left, right, drawer, rail-open, and open tokens mirror numeric overlay state for local CSS invalidation. Absent when no numeric overlay is active."
2362
+ },
2363
+ {
2364
+ "name": "data-handle-inset",
2365
+ "on": "kui-workbench__rail",
2366
+ "helper": "wireWorkbench",
2367
+ "meaning": "Written by the shared resize wiring when the work-area minimum or a parent clamp holds a rail's maximum near its size. It carries no Workbench styling; the Workbench handle stays at the rail's inner edge."
2368
+ },
2369
+ {
2370
+ "name": "data-resizing",
2371
+ "on": "kui-workbench__rail",
2372
+ "helper": "wireWorkbench",
2373
+ "meaning": "Present on a resizable rail or the drawer while a pointer drag resizes it."
2374
+ }
2375
+ ]
2376
+ },
2377
+ "responsive": { "owner": "not-applicable", "behaviors": [] },
2378
+ "layout": {
2379
+ "roles": ["structure"],
2380
+ "geometry": {
2381
+ "margin": "parent",
2382
+ "border": "self",
2383
+ "padding": "child",
2384
+ "notes": [
2385
+ "The dialog draws no header and no body inset; the Workbench's work area and rails own their chrome and content insets, and the rail dividers run the dialog's full height."
2386
+ ]
2387
+ }
2388
+ },
2389
+ "accessibility": {
2390
+ "obligations": [
2391
+ "It is a native modal <dialog> named by label: the page is inert, focus stays inside, Escape asks to close, and focus returns to the opener on close.",
2392
+ "The title is a level-2 heading; the close control is named Close (closeLabel) and stays the outermost trailing control. An open overlay rail takes focus, keeps Tab inside it, and closes on Escape before the dialog does."
2393
+ ]
2394
+ },
2395
+ "cssValueProps": [],
2396
+ "boundaries": {
2397
+ "rootClass": null,
2398
+ "publicClasses": [],
2399
+ "publicTokens": []
2400
+ },
2401
+ "diagnostics": [],
2402
+ "provenance": {
2403
+ "selection": "ai/component-catalog.json",
2404
+ "composition": "generated-permissive-default"
2405
+ }
2406
+ },
2172
2407
  {
2173
2408
  "key": "@kerfjs/ui:floating-toolbar",
2174
2409
  "package": "@kerfjs/ui",
@@ -3836,7 +4071,8 @@
3836
4071
  "An ordinary item adds no role or name; pass ariaLabel only when the item is a distinct named region (it then renders role=\"region\").",
3837
4072
  "focusTarget makes the item a programmatic focus target (tabindex=\"-1\", never a tab stop), such as a NavStack view's data-nav-focus target.",
3838
4073
  "The frame is decorative and never the only signal of state.",
3839
- "selectionMode=\"multiple\" renders a focusable row with aria-selected and a gridcell for nested controls; place it in a labeled List selectionMode=\"multiple\" grid. wireContentItems moves focus among rows with Up/Down and Home/End while nested controls retain those keys. Guard the app's delegated card action with isContentItemActivation so a nested control does not select the row."
4074
+ "selectionMode=\"multiple\" renders a focusable row with aria-selected and a gridcell for nested controls; place it in a labeled List selectionMode=\"multiple\" grid. wireContentItems moves focus among rows with Up/Down and Home/End while nested controls retain those keys. Enter and Space activate the card with a click that carries the key's Shift, Ctrl, and Cmd state, so one delegated click handler implements range and toggle selection for pointer and keyboard alike. Guard the app's delegated card action with isContentItemActivation so a nested control does not select the row.",
4075
+ "In a multi-select List or Grid, wireContentItems keeps one roving Tab stop (the last focused row, else the first selected, else the first enabled) across re-renders. A gridRow item is a row with a gridcell and no aria-selected or Tab stop; arrow keys skip it and its controls stay reachable by Tab."
3840
4076
  ]
3841
4077
  },
3842
4078
  "cssValueProps": [],
@@ -3866,27 +4102,34 @@
3866
4102
  }
3867
4103
  },
3868
4104
  {
3869
- "key": "@kerfjs/ui:application-tabs",
4105
+ "key": "@kerfjs/ui:disclosure",
3870
4106
  "package": "@kerfjs/ui",
3871
- "id": "application-tabs",
3872
- "name": "Application Tabs",
3873
- "kind": "composition",
4107
+ "id": "disclosure",
4108
+ "name": "Disclosure",
4109
+ "kind": "component",
3874
4110
  "source": "kerf",
3875
4111
  "parents": { "mode": "any", "entries": [] },
3876
4112
  "contexts": ["application-ui"],
3877
4113
  "zones": [],
3878
4114
  "children": { "mode": "any", "concepts": [], "requiredConcepts": [] },
3879
4115
  "state": [
3880
- { "id": "ordered tabs", "owner": "application", "required": false },
3881
- { "id": "selected tab", "owner": "application", "required": false },
3882
- { "id": "tabpanels", "owner": "application", "required": false },
3883
4116
  {
3884
- "id": "add and close policy",
4117
+ "id": "the title, detail, and content",
3885
4118
  "owner": "application",
3886
4119
  "required": false
3887
4120
  },
3888
4121
  {
3889
- "id": "routing and persistence",
4122
+ "id": "the initial open state, and closing it from code (element.open = false)",
4123
+ "owner": "application",
4124
+ "required": false
4125
+ },
4126
+ {
4127
+ "id": "the exclusive group name",
4128
+ "owner": "application",
4129
+ "required": false
4130
+ },
4131
+ {
4132
+ "id": "reacting to the native toggle event (captured, through toggleAction)",
3890
4133
  "owner": "application",
3891
4134
  "required": false
3892
4135
  }
@@ -3899,19 +4142,33 @@
3899
4142
  },
3900
4143
  "responsive": { "owner": "not-applicable", "behaviors": [] },
3901
4144
  "layout": {
3902
- "roles": ["navigation"],
3903
- "geometry": { "margin": "child", "border": "child", "padding": "child" }
4145
+ "roles": ["structure"],
4146
+ "geometry": {
4147
+ "margin": "self",
4148
+ "border": "self",
4149
+ "padding": "self",
4150
+ "notes": [
4151
+ "The root takes the content-item geometry (8px inline margin, a 1px border, 8px padding); the content starts on the title's text column."
4152
+ ]
4153
+ }
3904
4154
  },
3905
4155
  "accessibility": {
3906
4156
  "obligations": [
3907
- "Keep one selected tab synchronized with one named tabpanel and retain the wireTabBars disposer."
4157
+ "The native summary is a button that Enter and Space toggle and that reports its expanded state; the DisclosureArrow is decorative.",
4158
+ "Keep the title a short, meaningful name for the hidden content; the open state survives re-renders because the platform owns it."
3908
4159
  ]
3909
4160
  },
3910
4161
  "cssValueProps": [],
3911
4162
  "boundaries": {
3912
- "rootClass": null,
3913
- "publicClasses": [],
3914
- "publicTokens": []
4163
+ "rootClass": "kui-disclosure",
4164
+ "publicClasses": [
4165
+ "kui-disclosure",
4166
+ "kui-disclosure__summary",
4167
+ "kui-disclosure__title",
4168
+ "kui-disclosure__detail",
4169
+ "kui-disclosure__content"
4170
+ ],
4171
+ "publicTokens": ["--kui-disclosure-arrow-size"]
3915
4172
  },
3916
4173
  "diagnostics": [],
3917
4174
  "provenance": {
@@ -3920,18 +4177,72 @@
3920
4177
  }
3921
4178
  },
3922
4179
  {
3923
- "key": "@kerfjs/ui:tabs",
4180
+ "key": "@kerfjs/ui:application-tabs",
3924
4181
  "package": "@kerfjs/ui",
3925
- "id": "tabs",
3926
- "name": "AppTab",
3927
- "kind": "component",
4182
+ "id": "application-tabs",
4183
+ "name": "Application Tabs",
4184
+ "kind": "composition",
3928
4185
  "source": "kerf",
3929
- "parents": { "mode": "listed", "entries": ["@kerfjs/ui:tab-bar"] },
3930
- "contexts": ["tabpanel-navigation"],
3931
- "zones": [
4186
+ "parents": { "mode": "any", "entries": [] },
4187
+ "contexts": ["application-ui"],
4188
+ "zones": [],
4189
+ "children": { "mode": "any", "concepts": [], "requiredConcepts": [] },
4190
+ "state": [
4191
+ { "id": "ordered tabs", "owner": "application", "required": false },
4192
+ { "id": "selected tab", "owner": "application", "required": false },
4193
+ { "id": "tabpanels", "owner": "application", "required": false },
3932
4194
  {
3933
- "id": "leading-decoration",
3934
- "jsx": { "prop": "leading" },
4195
+ "id": "add and close policy",
4196
+ "owner": "application",
4197
+ "required": false
4198
+ },
4199
+ {
4200
+ "id": "routing and persistence",
4201
+ "owner": "application",
4202
+ "required": false
4203
+ }
4204
+ ],
4205
+ "wiring": {
4206
+ "required": false,
4207
+ "helpers": [],
4208
+ "obligations": [],
4209
+ "stateAttributes": []
4210
+ },
4211
+ "responsive": { "owner": "not-applicable", "behaviors": [] },
4212
+ "layout": {
4213
+ "roles": ["navigation"],
4214
+ "geometry": { "margin": "child", "border": "child", "padding": "child" }
4215
+ },
4216
+ "accessibility": {
4217
+ "obligations": [
4218
+ "Keep one selected tab synchronized with one named tabpanel and retain the wireTabBars disposer."
4219
+ ]
4220
+ },
4221
+ "cssValueProps": [],
4222
+ "boundaries": {
4223
+ "rootClass": null,
4224
+ "publicClasses": [],
4225
+ "publicTokens": []
4226
+ },
4227
+ "diagnostics": [],
4228
+ "provenance": {
4229
+ "selection": "ai/component-catalog.json",
4230
+ "composition": "generated-permissive-default"
4231
+ }
4232
+ },
4233
+ {
4234
+ "key": "@kerfjs/ui:tabs",
4235
+ "package": "@kerfjs/ui",
4236
+ "id": "tabs",
4237
+ "name": "TabBarItem",
4238
+ "kind": "component",
4239
+ "source": "kerf",
4240
+ "parents": { "mode": "listed", "entries": ["@kerfjs/ui:tab-bar"] },
4241
+ "contexts": ["tabpanel-navigation"],
4242
+ "zones": [
4243
+ {
4244
+ "id": "leading-decoration",
4245
+ "jsx": { "prop": "leading" },
3935
4246
  "accepts": ["dormant-decoration"],
3936
4247
  "cardinality": { "min": 0, "max": 1 },
3937
4248
  "exclusiveWith": []
@@ -3989,28 +4300,28 @@
3989
4300
  },
3990
4301
  "cssValueProps": [],
3991
4302
  "boundaries": {
3992
- "rootClass": "kui-app-tab",
4303
+ "rootClass": "kui-tab-bar-item",
3993
4304
  "publicClasses": [
3994
- "kui-app-tab",
3995
- "kui-app-tab__close",
3996
- "kui-app-tab__close-icon",
3997
- "kui-app-tab__name",
3998
- "kui-app-tab__select",
3999
- "kui-app-tab__trailing"
4305
+ "kui-tab-bar-item",
4306
+ "kui-tab-bar-item__close",
4307
+ "kui-tab-bar-item__close-icon",
4308
+ "kui-tab-bar-item__name",
4309
+ "kui-tab-bar-item__select",
4310
+ "kui-tab-bar-item__trailing"
4000
4311
  ],
4001
4312
  "publicTokens": [
4002
- "--kui-app-tab-attention-color",
4003
- "--kui-app-tab-color",
4004
- "--kui-app-tab-drop-indicator",
4005
- "--kui-app-tab-drop-target-background",
4006
- "--kui-app-tab-drop-target-color",
4007
- "--kui-app-tab-drop-target-ring",
4008
- "--kui-app-tab-hover-background",
4009
- "--kui-app-tab-pinned-background",
4010
- "--kui-app-tab-pinned-hover-background",
4011
- "--kui-app-tab-selected-background",
4012
- "--kui-app-tab-selected-border",
4013
- "--kui-app-tab-selected-color",
4313
+ "--kui-tab-bar-item-attention-color",
4314
+ "--kui-tab-bar-item-color",
4315
+ "--kui-tab-bar-item-drop-indicator",
4316
+ "--kui-tab-bar-item-drop-target-background",
4317
+ "--kui-tab-bar-item-drop-target-color",
4318
+ "--kui-tab-bar-item-drop-target-ring",
4319
+ "--kui-tab-bar-item-hover-background",
4320
+ "--kui-tab-bar-item-pinned-background",
4321
+ "--kui-tab-bar-item-pinned-hover-background",
4322
+ "--kui-tab-bar-item-selected-background",
4323
+ "--kui-tab-bar-item-selected-border",
4324
+ "--kui-tab-bar-item-selected-color",
4014
4325
  "--kui-color-brand-border-normal",
4015
4326
  "--kui-color-brand-on-quiet",
4016
4327
  "--kui-color-neutral-border-normal",
@@ -4072,8 +4383,8 @@
4072
4383
  ],
4073
4384
  "children": {
4074
4385
  "mode": "listed",
4075
- "concepts": ["app-tab"],
4076
- "requiredConcepts": ["app-tab"]
4386
+ "concepts": ["tab-bar-item"],
4387
+ "requiredConcepts": ["tab-bar-item"]
4077
4388
  },
4078
4389
  "state": [
4079
4390
  { "id": "selected-tab", "owner": "controlled", "required": true }
@@ -4088,13 +4399,13 @@
4088
4399
  "stateAttributes": [
4089
4400
  {
4090
4401
  "name": "data-tab-dragging",
4091
- "on": "AppTab (data-component=\"app-tab\")",
4402
+ "on": "TabBarItem (data-component=\"tab-bar-item\")",
4092
4403
  "helper": "wireTabBars",
4093
4404
  "meaning": "\"true\" on the tab being dragged."
4094
4405
  },
4095
4406
  {
4096
4407
  "name": "data-tab-drop-position",
4097
- "on": "AppTab (data-component=\"app-tab\")",
4408
+ "on": "TabBarItem (data-component=\"tab-bar-item\")",
4098
4409
  "helper": "wireTabBars",
4099
4410
  "meaning": "\"before\" or \"after\" on the tab under the pointer: where the dragged tab would land."
4100
4411
  },
@@ -4265,9 +4576,11 @@
4265
4576
  "children": { "mode": "any", "concepts": [], "requiredConcepts": [] },
4266
4577
  "state": [{ "id": "value", "owner": "controlled", "required": false }],
4267
4578
  "wiring": {
4268
- "required": false,
4269
- "helpers": [],
4270
- "obligations": [],
4579
+ "required": true,
4580
+ "helpers": ["wireChoiceChips"],
4581
+ "obligations": [
4582
+ "Gives a multiple: true group its listbox selection: pointer and keyboard gestures, roving focus, aria-selected, hidden form inputs, and a change event on the group. Radio and toggle groups use native inputs and need no wiring."
4583
+ ],
4271
4584
  "stateAttributes": []
4272
4585
  },
4273
4586
  "responsive": { "owner": "not-applicable", "behaviors": [] },
@@ -4309,10 +4622,262 @@
4309
4622
  }
4310
4623
  },
4311
4624
  {
4312
- "key": "@kerfjs/ui:composer",
4625
+ "key": "@kerfjs/ui:color-swatches",
4626
+ "package": "@kerfjs/ui",
4627
+ "id": "color-swatches",
4628
+ "name": "ColorSwatches",
4629
+ "kind": "component",
4630
+ "source": "kerf",
4631
+ "parents": { "mode": "any", "entries": [] },
4632
+ "contexts": ["application-ui"],
4633
+ "zones": [],
4634
+ "children": { "mode": "any", "concepts": [], "requiredConcepts": [] },
4635
+ "state": [
4636
+ {
4637
+ "id": "the palette and its color names",
4638
+ "owner": "application",
4639
+ "required": false
4640
+ },
4641
+ {
4642
+ "id": "the chosen value (read it on change through action)",
4643
+ "owner": "application",
4644
+ "required": false
4645
+ },
4646
+ {
4647
+ "id": "the field name and form association",
4648
+ "owner": "application",
4649
+ "required": false
4650
+ }
4651
+ ],
4652
+ "wiring": {
4653
+ "required": false,
4654
+ "helpers": [],
4655
+ "obligations": [],
4656
+ "stateAttributes": []
4657
+ },
4658
+ "responsive": { "owner": "not-applicable", "behaviors": [] },
4659
+ "layout": {
4660
+ "roles": ["controls"],
4661
+ "geometry": {
4662
+ "margin": "none",
4663
+ "border": "self",
4664
+ "padding": "self",
4665
+ "notes": [
4666
+ "The group takes the shared block-content inset (a transparent 1px border and 8px padding), so its label sits on the text column; each swatch keeps 4px of room for its ring, pulled back at the row's edges."
4667
+ ]
4668
+ }
4669
+ },
4670
+ "accessibility": {
4671
+ "obligations": [
4672
+ "It is a native radio group: Tab reaches it once and the arrow keys move the choice; each radio is named by its color label, also shown as the swatch's hover hint.",
4673
+ "The chosen swatch wears a ring in the text color set off by a gap, so the choice never depends on hue; forced colors draw it in Highlight."
4674
+ ]
4675
+ },
4676
+ "cssValueProps": [],
4677
+ "boundaries": {
4678
+ "rootClass": "kui-color-swatches",
4679
+ "publicClasses": [
4680
+ "kui-color-swatches",
4681
+ "kui-color-swatches__label",
4682
+ "kui-color-swatches__list",
4683
+ "kui-color-swatches__swatch",
4684
+ "kui-color-swatches__input",
4685
+ "kui-color-swatches__dot"
4686
+ ],
4687
+ "publicTokens": []
4688
+ },
4689
+ "diagnostics": [],
4690
+ "provenance": {
4691
+ "selection": "ai/component-catalog.json",
4692
+ "composition": "generated-permissive-default"
4693
+ }
4694
+ },
4695
+ {
4696
+ "key": "@kerfjs/ui:color-picker",
4697
+ "package": "@kerfjs/ui",
4698
+ "id": "color-picker",
4699
+ "name": "ColorPicker",
4700
+ "kind": "component",
4701
+ "source": "kerf",
4702
+ "parents": { "mode": "any", "entries": [] },
4703
+ "contexts": ["application-ui"],
4704
+ "zones": [],
4705
+ "children": { "mode": "any", "concepts": [], "requiredConcepts": [] },
4706
+ "state": [
4707
+ {
4708
+ "id": "the value and mode (update them from onChange and re-render)",
4709
+ "owner": "application",
4710
+ "required": false
4711
+ },
4712
+ {
4713
+ "id": "presets and samples, and adding to samples on addSampleAction",
4714
+ "owner": "application",
4715
+ "required": false
4716
+ },
4717
+ {
4718
+ "id": "the field name and form association",
4719
+ "owner": "application",
4720
+ "required": false
4721
+ }
4722
+ ],
4723
+ "wiring": {
4724
+ "required": true,
4725
+ "helpers": ["wireColorPickers"],
4726
+ "obligations": ["Use wireColorPickers as documented."],
4727
+ "stateAttributes": [
4728
+ {
4729
+ "name": "data-shown",
4730
+ "on": "kui-color-picker__channel",
4731
+ "helper": "wireColorPickers",
4732
+ "meaning": "The text a channel, hex, or opacity field last showed, so leaving an unedited field commits nothing."
4733
+ },
4734
+ {
4735
+ "name": "data-count",
4736
+ "on": "kui-color-picker__channels",
4737
+ "helper": "wireColorPickers",
4738
+ "meaning": "How many channel fields the current model shows (1 for Grayscale, 3 otherwise)."
4739
+ }
4740
+ ]
4741
+ },
4742
+ "responsive": { "owner": "not-applicable", "behaviors": [] },
4743
+ "layout": {
4744
+ "roles": ["controls"],
4745
+ "geometry": {
4746
+ "margin": "none",
4747
+ "border": "self",
4748
+ "padding": "self",
4749
+ "notes": [
4750
+ "The panel takes the shared block-content inset and a 320px maximum width; its rows are 12px apart."
4751
+ ]
4752
+ }
4753
+ },
4754
+ "accessibility": {
4755
+ "obligations": [
4756
+ "The area is a slider named Saturation and Brightness with a spoken value; the arrow keys move it (Shift for 10% steps), Page Up and Down change brightness, Home and End saturation.",
4757
+ "Hue and opacity are native range inputs; every field is named (Red, Hue, Hex Color, Opacity); the picker is a named group."
4758
+ ]
4759
+ },
4760
+ "cssValueProps": [],
4761
+ "boundaries": {
4762
+ "rootClass": "kui-color-picker",
4763
+ "publicClasses": [
4764
+ "kui-color-picker",
4765
+ "kui-color-picker__surface",
4766
+ "kui-color-picker__area",
4767
+ "kui-color-picker__area-thumb",
4768
+ "kui-color-picker__hue",
4769
+ "kui-color-picker__opacity",
4770
+ "kui-color-picker__controls",
4771
+ "kui-color-picker__mode-wrap",
4772
+ "kui-color-picker__mode-icon",
4773
+ "kui-color-picker__mode",
4774
+ "kui-color-picker__tool",
4775
+ "kui-color-picker__channels",
4776
+ "kui-color-picker__hex-row",
4777
+ "kui-color-picker__field",
4778
+ "kui-color-picker__field-label",
4779
+ "kui-color-picker__field--hex"
4780
+ ],
4781
+ "publicTokens": []
4782
+ },
4783
+ "diagnostics": [],
4784
+ "provenance": {
4785
+ "selection": "ai/component-catalog.json",
4786
+ "composition": "generated-permissive-default"
4787
+ }
4788
+ },
4789
+ {
4790
+ "key": "@kerfjs/ui:color-field",
4791
+ "package": "@kerfjs/ui",
4792
+ "id": "color-field",
4793
+ "name": "ColorField",
4794
+ "kind": "component",
4795
+ "source": "kerf",
4796
+ "parents": { "mode": "any", "entries": [] },
4797
+ "contexts": ["application-ui"],
4798
+ "zones": [],
4799
+ "children": { "mode": "any", "concepts": [], "requiredConcepts": [] },
4800
+ "state": [
4801
+ {
4802
+ "id": "the value and model (update them from onChange and re-render)",
4803
+ "owner": "application",
4804
+ "required": false
4805
+ },
4806
+ {
4807
+ "id": "per-field picker presets and samples (wireColorFields pickers)",
4808
+ "owner": "application",
4809
+ "required": false
4810
+ },
4811
+ {
4812
+ "id": "the field name and form association",
4813
+ "owner": "application",
4814
+ "required": false
4815
+ }
4816
+ ],
4817
+ "wiring": {
4818
+ "required": true,
4819
+ "helpers": ["wireColorFields"],
4820
+ "obligations": ["Use wireColorFields as documented."],
4821
+ "stateAttributes": [
4822
+ {
4823
+ "name": "data-value",
4824
+ "on": "kui-color-field",
4825
+ "helper": "wireColorFields",
4826
+ "meaning": "The committed color, updated by the wiring until the app re-renders, so reopening the picker starts from the last edit."
4827
+ },
4828
+ {
4829
+ "name": "data-mode",
4830
+ "on": "kui-color-field",
4831
+ "helper": "wireColorFields",
4832
+ "meaning": "The committed color model, updated the same way as data-value."
4833
+ }
4834
+ ]
4835
+ },
4836
+ "responsive": { "owner": "not-applicable", "behaviors": [] },
4837
+ "layout": {
4838
+ "roles": ["controls"],
4839
+ "geometry": {
4840
+ "margin": "none",
4841
+ "border": "self",
4842
+ "padding": "self",
4843
+ "notes": [
4844
+ "The trigger matches TextField's box, label, hint, and error geometry."
4845
+ ]
4846
+ }
4847
+ },
4848
+ "accessibility": {
4849
+ "obligations": [
4850
+ "The trigger is a button named by the label and the current hex value, with aria-haspopup dialog and aria-expanded; the hint and error describe it.",
4851
+ "The picker opens in a non-modal AnchoredSurface named by the label; Escape or a press outside closes it and focus returns to the trigger."
4852
+ ]
4853
+ },
4854
+ "cssValueProps": [],
4855
+ "boundaries": {
4856
+ "rootClass": "kui-color-field",
4857
+ "publicClasses": [
4858
+ "kui-color-field",
4859
+ "kui-color-field__label",
4860
+ "kui-color-field__required",
4861
+ "kui-color-field__trigger",
4862
+ "kui-color-field__swatch",
4863
+ "kui-color-field__hex",
4864
+ "kui-color-field__chevron",
4865
+ "kui-color-field__hint",
4866
+ "kui-color-field__error"
4867
+ ],
4868
+ "publicTokens": []
4869
+ },
4870
+ "diagnostics": [],
4871
+ "provenance": {
4872
+ "selection": "ai/component-catalog.json",
4873
+ "composition": "generated-permissive-default"
4874
+ }
4875
+ },
4876
+ {
4877
+ "key": "@kerfjs/ui:message-composer",
4313
4878
  "package": "@kerfjs/ui",
4314
- "id": "composer",
4315
- "name": "Composer",
4879
+ "id": "message-composer",
4880
+ "name": "MessageComposer",
4316
4881
  "kind": "component",
4317
4882
  "source": "kerf",
4318
4883
  "parents": { "mode": "any", "entries": [] },
@@ -4330,7 +4895,7 @@
4330
4895
  "state": [{ "id": "value", "owner": "controlled", "required": false }],
4331
4896
  "wiring": {
4332
4897
  "required": false,
4333
- "helpers": ["wireComposers"],
4898
+ "helpers": ["wireMessageComposers"],
4334
4899
  "obligations": [],
4335
4900
  "stateAttributes": []
4336
4901
  },
@@ -4347,21 +4912,21 @@
4347
4912
  },
4348
4913
  "cssValueProps": [],
4349
4914
  "boundaries": {
4350
- "rootClass": "kui-composer",
4351
- "publicClasses": ["kui-composer"],
4915
+ "rootClass": "kui-message-composer",
4916
+ "publicClasses": ["kui-message-composer"],
4352
4917
  "publicTokens": []
4353
4918
  },
4354
4919
  "diagnostics": [],
4355
4920
  "provenance": {
4356
4921
  "selection": "ai/component-catalog.json",
4357
- "composition": "docs/accessibility.md#composer"
4922
+ "composition": "docs/accessibility.md#messagecomposer"
4358
4923
  }
4359
4924
  },
4360
4925
  {
4361
- "key": "@kerfjs/ui:token-search-field",
4926
+ "key": "@kerfjs/ui:search-field",
4362
4927
  "package": "@kerfjs/ui",
4363
- "id": "token-search-field",
4364
- "name": "TokenSearchField",
4928
+ "id": "search-field",
4929
+ "name": "SearchField",
4365
4930
  "kind": "component",
4366
4931
  "source": "kerf",
4367
4932
  "parents": { "mode": "any", "entries": [] },
@@ -4390,28 +4955,29 @@
4390
4955
  ],
4391
4956
  "wiring": {
4392
4957
  "required": true,
4393
- "helpers": ["wireTokenSearchFields"],
4958
+ "helpers": ["wireSearchFields"],
4394
4959
  "obligations": [
4395
4960
  "Retain and invoke the disposer.",
4396
- "Use readTokenSearchField for DOM-owned text."
4961
+ "Use readSearchField for DOM-owned text.",
4962
+ "With a managed model, read model.state.peek() (never model.state.value) in the host render and bind model.result as a signal hole; the field itself re-renders only when model.structure changes, not per keystroke."
4397
4963
  ],
4398
4964
  "stateAttributes": [
4399
4965
  {
4400
- "name": "data-token-search-text",
4401
- "on": "the text span inside kui-token-search__editor",
4402
- "helper": "wireTokenSearchFields",
4966
+ "name": "data-search-field-text",
4967
+ "on": "the text span inside kui-search-field__editor",
4968
+ "helper": "wireSearchFields",
4403
4969
  "meaning": "Marks the plain-text span the helper inserts when the editor is emptied."
4404
4970
  },
4405
4971
  {
4406
4972
  "name": "data-empty",
4407
- "on": "the text span inside kui-token-search__editor",
4408
- "helper": "wireTokenSearchFields",
4973
+ "on": "the text span inside kui-search-field__editor",
4974
+ "helper": "wireSearchFields",
4409
4975
  "meaning": "\"true\" on that span while it holds no text."
4410
4976
  },
4411
4977
  {
4412
4978
  "name": "data-placeholder-visible",
4413
- "on": "the kui-token-search root",
4414
- "helper": "wireTokenSearchFields",
4979
+ "on": "the kui-search-field root",
4980
+ "helper": "wireSearchFields",
4415
4981
  "meaning": "Tracks whether the DOM-owned editor is empty so its placeholder stays outside the editable area."
4416
4982
  }
4417
4983
  ]
@@ -4426,25 +4992,25 @@
4426
4992
  "Announce result changes when useful and keep tokens atomic during editing.",
4427
4993
  "Keep leading and trailing controls aligned to the first text line while content wraps. Managed Clear restores replacement focus before the next input task, preserving immediate typing and later focus handoffs without a frame delay.",
4428
4994
  "Wire Enter to submit without inserting a contenteditable line break and preserve focus plus the text-relative caret across controlled keyboard chip deletion before the next keystroke. Select All deletion preserves managed open state and replacement focus; persist both edited query and tokens. Visual wrapping remains available.",
4429
- "In collapsible mode, wireTokenSearchFields manages this by default: activating the trigger reveals the searchbox and moves focus into it, Escape on an empty field collapses and returns focus to the trigger, and focus leaving an empty field collapses it; each behavior is individually opt-out.",
4430
- "The form-field presentation associates its visible label and optional hint with the searchbox, exposes aria-required when required, and lets wireTokenSearchFields focus the editor from a label click. The app validates required input."
4995
+ "In collapsible mode, wireSearchFields manages this by default: activating the trigger reveals the searchbox and moves focus into it, Escape on an empty field collapses and returns focus to the trigger, and focus leaving an empty field collapses it; each behavior is individually opt-out.",
4996
+ "The form-field presentation associates its visible label and optional hint with the searchbox, exposes aria-required when required, and lets wireSearchFields focus the editor from a label click. The app validates required input."
4431
4997
  ]
4432
4998
  },
4433
4999
  "cssValueProps": [],
4434
5000
  "boundaries": {
4435
- "rootClass": "kui-token-search",
5001
+ "rootClass": "kui-search-field",
4436
5002
  "publicClasses": [
4437
- "kui-token-search",
4438
- "kui-token-search__clear",
4439
- "kui-token-search__editor",
4440
- "kui-token-search__expand",
4441
- "kui-token-search__leading",
4442
- "kui-token-search__token",
4443
- "kui-token-search__token-edit",
4444
- "kui-token-search__token-remove",
4445
- "kui-token-search__suggestions",
4446
- "kui-token-search__suggestion",
4447
- "kui-token-search__trailing"
5003
+ "kui-search-field",
5004
+ "kui-search-field__clear",
5005
+ "kui-search-field__editor",
5006
+ "kui-search-field__expand",
5007
+ "kui-search-field__leading",
5008
+ "kui-search-field__token",
5009
+ "kui-search-field__token-edit",
5010
+ "kui-search-field__token-remove",
5011
+ "kui-search-field__suggestions",
5012
+ "kui-search-field__suggestion",
5013
+ "kui-search-field__trailing"
4448
5014
  ],
4449
5015
  "publicTokens": [
4450
5016
  "--kui-color-brand-fill-normal",
@@ -4458,50 +5024,114 @@
4458
5024
  "--kui-font-s",
4459
5025
  "--kui-font-xs",
4460
5026
  "--kui-radius-pill",
4461
- "--kui-token-search-background",
4462
- "--kui-token-search-border",
4463
- "--kui-token-search-editor-min-width",
4464
- "--kui-token-search-line-size",
4465
- "--kui-token-search-token-background",
4466
- "--kui-token-search-token-foreground",
4467
- "--kui-token-search-expanded-width"
5027
+ "--kui-search-field-background",
5028
+ "--kui-search-field-border",
5029
+ "--kui-search-field-editor-min-width",
5030
+ "--kui-search-field-line-size",
5031
+ "--kui-search-field-token-background",
5032
+ "--kui-search-field-token-foreground",
5033
+ "--kui-search-field-expanded-width"
4468
5034
  ]
4469
5035
  },
4470
5036
  "diagnostics": [
4471
5037
  {
4472
5038
  "id": "KUI-C105",
4473
5039
  "severity": "error",
4474
- "when": "wireTokenSearchFields is absent",
4475
- "message": "TokenSearchField requires its public wiring helper for keyboard and collapsible behavior."
5040
+ "when": "wireSearchFields is absent",
5041
+ "message": "SearchField requires its public wiring helper for keyboard and collapsible behavior."
4476
5042
  }
4477
5043
  ],
4478
5044
  "provenance": {
4479
5045
  "selection": "ai/component-catalog.json",
4480
- "composition": "docs/accessibility.md#tokensearchfield"
5046
+ "composition": "docs/accessibility.md#searchfield"
4481
5047
  }
4482
5048
  },
4483
5049
  {
4484
- "key": "@kerfjs/ui:resize",
5050
+ "key": "@kerfjs/ui:tag-field",
4485
5051
  "package": "@kerfjs/ui",
4486
- "id": "resize",
4487
- "name": "ResizableRegion",
5052
+ "id": "tag-field",
5053
+ "name": "TagField",
4488
5054
  "kind": "component",
4489
5055
  "source": "kerf",
4490
5056
  "parents": { "mode": "any", "entries": [] },
4491
- "contexts": ["adjustable-pane-boundary"],
5057
+ "contexts": ["application-ui"],
4492
5058
  "zones": [],
4493
5059
  "children": { "mode": "any", "concepts": [], "requiredConcepts": [] },
4494
- "state": [{ "id": "size", "owner": "controlled", "required": true }],
5060
+ "state": [
5061
+ {
5062
+ "id": "the tag list (update it from onChange and re-render)",
5063
+ "owner": "application",
5064
+ "required": false
5065
+ },
5066
+ {
5067
+ "id": "validation and normalization (normalize) and showing refusals (onReject, error)",
5068
+ "owner": "application",
5069
+ "required": false
5070
+ },
5071
+ {
5072
+ "id": "the field name and form association",
5073
+ "owner": "application",
5074
+ "required": false
5075
+ }
5076
+ ],
4495
5077
  "wiring": {
4496
5078
  "required": true,
4497
- "helpers": ["wireResizableRegions"],
4498
- "obligations": [
4499
- "Retain and invoke the disposer.",
4500
- "Persist committed size in the application when persistence is required."
4501
- ],
4502
- "stateAttributes": [
4503
- {
4504
- "name": "data-handle-inset",
5079
+ "helpers": ["wireTagFields"],
5080
+ "obligations": ["Use wireTagFields as documented."],
5081
+ "stateAttributes": []
5082
+ },
5083
+ "responsive": { "owner": "not-applicable", "behaviors": [] },
5084
+ "layout": {
5085
+ "roles": ["controls"],
5086
+ "geometry": {
5087
+ "margin": "child",
5088
+ "border": "child",
5089
+ "padding": "child",
5090
+ "notes": [
5091
+ "The SearchField form-field presentation draws the label, frame, chips, and hint; TagField adds no geometry of its own."
5092
+ ]
5093
+ }
5094
+ },
5095
+ "accessibility": {
5096
+ "obligations": [
5097
+ "The editor is named by the visible label and described by the hint or error; each chip has an edit button (its label) and a remove button named for the tag.",
5098
+ "Enter or a delimiter adds the typed text, Backspace at the start removes the last tag, ArrowLeft and ArrowRight move between chips and the editor, and Backspace or Delete on a focused chip removes it."
5099
+ ]
5100
+ },
5101
+ "cssValueProps": [],
5102
+ "boundaries": {
5103
+ "rootClass": "kui-tag-field",
5104
+ "publicClasses": ["kui-tag-field"],
5105
+ "publicTokens": []
5106
+ },
5107
+ "diagnostics": [],
5108
+ "provenance": {
5109
+ "selection": "ai/component-catalog.json",
5110
+ "composition": "generated-permissive-default"
5111
+ }
5112
+ },
5113
+ {
5114
+ "key": "@kerfjs/ui:resize",
5115
+ "package": "@kerfjs/ui",
5116
+ "id": "resize",
5117
+ "name": "ResizableRegion",
5118
+ "kind": "component",
5119
+ "source": "kerf",
5120
+ "parents": { "mode": "any", "entries": [] },
5121
+ "contexts": ["adjustable-pane-boundary"],
5122
+ "zones": [],
5123
+ "children": { "mode": "any", "concepts": [], "requiredConcepts": [] },
5124
+ "state": [{ "id": "size", "owner": "controlled", "required": true }],
5125
+ "wiring": {
5126
+ "required": true,
5127
+ "helpers": ["wireResizableRegions"],
5128
+ "obligations": [
5129
+ "Retain and invoke the disposer.",
5130
+ "Persist committed size in the application when persistence is required."
5131
+ ],
5132
+ "stateAttributes": [
5133
+ {
5134
+ "name": "data-handle-inset",
4505
5135
  "on": "kui-resizable-region",
4506
5136
  "helper": "wireResizableRegions",
4507
5137
  "meaning": "Present while a clipping edge clamps the region: the handle and its focus ring sit inside the region instead of overhanging that edge."
@@ -4596,91 +5226,539 @@
4596
5226
  "contexts": ["controlled-value-selection"],
4597
5227
  "zones": [],
4598
5228
  "children": { "mode": "any", "concepts": [], "requiredConcepts": [] },
4599
- "state": [{ "id": "value", "owner": "controlled", "required": true }],
5229
+ "state": [{ "id": "value", "owner": "controlled", "required": true }],
5230
+ "wiring": {
5231
+ "required": true,
5232
+ "helpers": ["@kerfjs/ui/select/register"],
5233
+ "obligations": [
5234
+ "Import the registration module once in the application."
5235
+ ],
5236
+ "stateAttributes": []
5237
+ },
5238
+ "responsive": { "owner": "not-applicable", "behaviors": [] },
5239
+ "layout": {
5240
+ "roles": ["controls"],
5241
+ "geometry": { "margin": "none", "border": "self", "padding": "self" }
5242
+ },
5243
+ "accessibility": {
5244
+ "obligations": [
5245
+ "Verify the live value, standard events, focus, and rendered output.",
5246
+ "The trigger is a native button with role=\"combobox\", aria-haspopup=\"listbox\", and aria-expanded. A nonempty label names it (the visible label is aria-hidden text beside it); otherwise ariaLabel names it without adding control height, including custom selected content.",
5247
+ "Hint text is visible below the control and is the trigger's aria-description; placeholderText remains the empty value inside the closed control.",
5248
+ "Import select/register once: it defines the form-associated kui-select root (value, name, form submission, and form reset) and wires every Select in the document. The listbox opens below the trigger in the top layer, flipping above when short and capped at the viewport edges. Do not add consumer popup timing or position repairs.",
5249
+ "Keyboard: Enter, Space, ArrowDown, or ArrowUp on the trigger opens on the chosen option (Home/End on the first/last), and typing opens on a matching label; in the listbox the arrows move and wrap, Home/End jump, typing a label's first letters moves to it, Enter or Space chooses, Escape closes and returns focus to the trigger, and Tab closes and continues from the trigger.",
5250
+ "With multiple, the listbox (aria-multiselectable) stays open while choices toggle (pointer, Enter, or Space) and closes on an outside press, Escape, or Tab; each chosen option shows a check, and the closed control summarizes the chosen labels in choice order.",
5251
+ "Disabled choices stay visible with aria-disabled but cannot be chosen; disabledReason is their title. A multiple Select can opt in to localized select-all and clear buttons below the listbox, which skip disabled choices and publish ordinary change events for changed values.",
5252
+ "A multiple icon-only trigger shows its fixed triggerIcon and, while any choice is chosen, an aria-hidden count Badge; the trigger's accessible name ends with the chosen labels in choice order, and its value text stays empty.",
5253
+ "Once registered, an icon-only trigger (single or multiple) shows an aria-hidden help tag repeating its accessible name (a single Select adds its current choice) after a 500ms hover and at once on keyboard focus; it hides while the listbox is open, on a press, and on Escape, and never joins aria-labelledby. Do not add a title or another tooltip."
5254
+ ]
5255
+ },
5256
+ "cssValueProps": [
5257
+ {
5258
+ "path": "choices[].color",
5259
+ "grammar": "color",
5260
+ "helpers": ["uiColor", "foregroundColorVar", "foregroundColor"],
5261
+ "shorthands": [],
5262
+ "canonicalShorthands": [],
5263
+ "exceptionalShorthands": [],
5264
+ "rawPolicy": "forbid",
5265
+ "examples": [
5266
+ "color: uiColor(\"success-on-quiet\")",
5267
+ "color: foregroundColorVar(\"--app-choice-color\")",
5268
+ "color: foregroundColor(\"rebeccapurple\")"
5269
+ ]
5270
+ }
5271
+ ],
5272
+ "boundaries": {
5273
+ "rootClass": "kui-select",
5274
+ "publicClasses": [
5275
+ "kui-select",
5276
+ "kui-select--custom-selected",
5277
+ "kui-select--fit-menu",
5278
+ "kui-select__custom-selected",
5279
+ "kui-select__custom-selected-content",
5280
+ "kui-select__group",
5281
+ "kui-select__group--separated",
5282
+ "kui-select__group-title",
5283
+ "kui-select__icon",
5284
+ "kui-select__listbox",
5285
+ "kui-select__option",
5286
+ "kui-select__popup",
5287
+ "kui-select__trigger",
5288
+ "kui-select__value"
5289
+ ],
5290
+ "publicTokens": [
5291
+ "--kui-color-neutral-border-quiet",
5292
+ "--kui-color-neutral-on-quiet",
5293
+ "--kui-disclosure-icon-scale",
5294
+ "--kui-font-2xs",
5295
+ "--kui-select-selected-color",
5296
+ "--kui-select-selected-font-size",
5297
+ "--kui-select-selected-font-weight",
5298
+ "--kui-select-trigger-max-width"
5299
+ ]
5300
+ },
5301
+ "diagnostics": [
5302
+ {
5303
+ "id": "KUI-C107",
5304
+ "severity": "error",
5305
+ "when": "the registration import is absent",
5306
+ "message": "Select requires @kerfjs/ui/select/register once per application."
5307
+ }
5308
+ ],
5309
+ "provenance": {
5310
+ "selection": "ai/component-catalog.json",
5311
+ "composition": "README.md#web-awesome-theme"
5312
+ }
5313
+ },
5314
+ {
5315
+ "key": "@kerfjs/ui:combobox",
5316
+ "package": "@kerfjs/ui",
5317
+ "id": "combobox",
5318
+ "name": "Combobox",
5319
+ "kind": "component",
5320
+ "source": "kerf",
5321
+ "parents": { "mode": "any", "entries": [] },
5322
+ "contexts": ["application-ui"],
5323
+ "zones": [],
5324
+ "children": { "mode": "any", "concepts": [], "requiredConcepts": [] },
5325
+ "state": [
5326
+ {
5327
+ "id": "the suggestions and the committed values",
5328
+ "owner": "application",
5329
+ "required": false
5330
+ },
5331
+ {
5332
+ "id": "normalizing and validating created values",
5333
+ "owner": "application",
5334
+ "required": false
5335
+ },
5336
+ {
5337
+ "id": "clearing the field after a commit",
5338
+ "owner": "application",
5339
+ "required": false
5340
+ }
5341
+ ],
5342
+ "wiring": {
5343
+ "required": true,
5344
+ "helpers": ["wireComboboxes"],
5345
+ "obligations": [
5346
+ "Filters suggestions, moves the active option, and reports commits; without it the list never opens."
5347
+ ],
5348
+ "stateAttributes": [
5349
+ {
5350
+ "name": "data-value",
5351
+ "on": "the create option (kui-combobox__option[data-create])",
5352
+ "helper": "wireComboboxes",
5353
+ "meaning": "The typed text the create option would commit; rewritten as the person types."
5354
+ },
5355
+ {
5356
+ "name": "data-placement",
5357
+ "on": "kui-combobox__listbox",
5358
+ "helper": "wireComboboxes",
5359
+ "meaning": "The side the open listbox was placed on (bottom-start, or top-start after a flip when the field is near the viewport's bottom)."
5360
+ }
5361
+ ]
5362
+ },
5363
+ "responsive": { "owner": "not-applicable", "behaviors": [] },
5364
+ "layout": {
5365
+ "roles": ["controls"],
5366
+ "geometry": {
5367
+ "margin": "none",
5368
+ "border": "self",
5369
+ "padding": "self",
5370
+ "notes": [
5371
+ "Label and hint sit on the value's text column (1px border + 8px padding); the 44px field matches a themed wa-input."
5372
+ ]
5373
+ }
5374
+ },
5375
+ "accessibility": {
5376
+ "obligations": [
5377
+ "Native input with role=combobox, aria-autocomplete=list, aria-expanded, aria-controls, and aria-activedescendant; options are role=option in a listbox. The visible label is a real label; the hint is aria-describedby.",
5378
+ "The suggestion listbox is a manual popover in the top layer, placed below the field at its width and flipped when short, so a clipping or scrolling ancestor (an AnchoredSurface, a dialog, a scrolling List) never cuts it off."
5379
+ ]
5380
+ },
5381
+ "cssValueProps": [],
5382
+ "boundaries": {
5383
+ "rootClass": "kui-combobox",
5384
+ "publicClasses": [
5385
+ "kui-combobox",
5386
+ "kui-combobox__label",
5387
+ "kui-combobox__hint",
5388
+ "kui-combobox__control",
5389
+ "kui-combobox__input",
5390
+ "kui-combobox__listbox",
5391
+ "kui-combobox__option"
5392
+ ],
5393
+ "rootElement": "div",
5394
+ "publicTokens": [
5395
+ "--kui-color-neutral-on-quiet",
5396
+ "--kui-color-text-quiet",
5397
+ "--kui-color-neutral-border-normal",
5398
+ "--kui-color-text",
5399
+ "--kui-color-surface",
5400
+ "--kui-color-surface-raised",
5401
+ "--kui-color-text-link",
5402
+ "--kui-color-brand-fill-quiet",
5403
+ "--kui-font-xs",
5404
+ "--kui-font-s",
5405
+ "--kui-layout-item-padding",
5406
+ "--kui-layout-rounded-radius",
5407
+ "--kui-shadow-l",
5408
+ "--kui-space-2xs",
5409
+ "--kui-space-xs"
5410
+ ]
5411
+ },
5412
+ "diagnostics": [],
5413
+ "provenance": {
5414
+ "selection": "ai/component-catalog.json",
5415
+ "composition": "generated-permissive-default"
5416
+ }
5417
+ },
5418
+ {
5419
+ "key": "@kerfjs/ui:text-field",
5420
+ "package": "@kerfjs/ui",
5421
+ "id": "text-field",
5422
+ "name": "TextField",
5423
+ "kind": "component",
5424
+ "source": "kerf",
5425
+ "parents": { "mode": "any", "entries": [] },
5426
+ "contexts": ["application-ui"],
5427
+ "zones": [],
5428
+ "children": { "mode": "any", "concepts": [], "requiredConcepts": [] },
5429
+ "state": [
5430
+ { "id": "value", "owner": "application", "required": false },
5431
+ {
5432
+ "id": "validation and error copy",
5433
+ "owner": "application",
5434
+ "required": false
5435
+ },
5436
+ { "id": "hint copy", "owner": "application", "required": false },
5437
+ {
5438
+ "id": "what a cleared field means",
5439
+ "owner": "application",
5440
+ "required": false
5441
+ }
5442
+ ],
5443
+ "wiring": {
5444
+ "required": false,
5445
+ "helpers": ["wireTextFields"],
5446
+ "obligations": [],
5447
+ "stateAttributes": []
5448
+ },
5449
+ "responsive": { "owner": "not-applicable", "behaviors": [] },
5450
+ "layout": {
5451
+ "roles": ["controls"],
5452
+ "geometry": {
5453
+ "margin": "none",
5454
+ "border": "self",
5455
+ "padding": "self",
5456
+ "notes": [
5457
+ "Label, hint, and error sit on the value's text column (1px border + 8px padding); the 44px box matches Button and Select, and compact matches their compact 33px."
5458
+ ]
5459
+ }
5460
+ },
5461
+ "accessibility": {
5462
+ "obligations": [
5463
+ "The whole field is a <label> around a native <input> or <textarea>, so clicking anywhere on it focuses the field; the input is named by label (aria-label, with the visible label text hidden from assistive technology so the clear button and count stay out of the name) or by ariaLabel. Focus shows the standard focus ring around the box.",
5464
+ "The hint and error are visible below the field and form the input's aria-description; an error also sets aria-invalid=\"true\". The clear button is a native button named by clearLabel (default Clear), hidden while the field is empty, and returns focus to the field.",
5465
+ "Compact text grows to 16px on coarse-pointer touch screens so iOS does not zoom on focus."
5466
+ ]
5467
+ },
5468
+ "cssValueProps": [],
5469
+ "boundaries": {
5470
+ "rootClass": "kui-text-field",
5471
+ "publicClasses": [
5472
+ "kui-text-field",
5473
+ "kui-text-field__label",
5474
+ "kui-text-field__required",
5475
+ "kui-text-field__box",
5476
+ "kui-text-field__icon",
5477
+ "kui-text-field__input",
5478
+ "kui-text-field__clear",
5479
+ "kui-text-field__hint",
5480
+ "kui-text-field__error",
5481
+ "kui-text-field__footer",
5482
+ "kui-text-field__count"
5483
+ ],
5484
+ "rootElement": "label",
5485
+ "publicTokens": [
5486
+ "--kui-color-neutral-on-quiet",
5487
+ "--kui-color-neutral-border-normal",
5488
+ "--kui-color-danger-border-loud",
5489
+ "--kui-color-danger-on-quiet",
5490
+ "--kui-color-text",
5491
+ "--kui-color-text-quiet",
5492
+ "--kui-color-surface",
5493
+ "--kui-focus-ring",
5494
+ "--kui-font-m",
5495
+ "--kui-font-s",
5496
+ "--kui-font-xs",
5497
+ "--kui-layout-item-padding",
5498
+ "--kui-layout-rounded-radius",
5499
+ "--kui-radius-circle"
5500
+ ]
5501
+ },
5502
+ "diagnostics": [],
5503
+ "provenance": {
5504
+ "selection": "ai/component-catalog.json",
5505
+ "composition": "generated-permissive-default"
5506
+ }
5507
+ },
5508
+ {
5509
+ "key": "@kerfjs/ui:checkbox",
5510
+ "package": "@kerfjs/ui",
5511
+ "id": "checkbox",
5512
+ "name": "Checkbox",
5513
+ "kind": "component",
5514
+ "source": "kerf",
5515
+ "parents": { "mode": "any", "entries": [] },
5516
+ "contexts": ["application-ui"],
5517
+ "zones": [],
5518
+ "children": { "mode": "any", "concepts": [], "requiredConcepts": [] },
5519
+ "state": [
5520
+ {
5521
+ "id": "checked and indeterminate state",
5522
+ "owner": "application",
5523
+ "required": false
5524
+ },
5525
+ {
5526
+ "id": "validation and error copy",
5527
+ "owner": "application",
5528
+ "required": false
5529
+ },
5530
+ {
5531
+ "id": "what a change does",
5532
+ "owner": "application",
5533
+ "required": false
5534
+ }
5535
+ ],
5536
+ "wiring": {
5537
+ "required": false,
5538
+ "helpers": ["wireCheckboxes"],
5539
+ "obligations": [],
5540
+ "stateAttributes": []
5541
+ },
5542
+ "responsive": { "owner": "not-applicable", "behaviors": [] },
5543
+ "layout": {
5544
+ "roles": ["controls"],
5545
+ "geometry": {
5546
+ "margin": "none",
5547
+ "border": "self",
5548
+ "padding": "none",
5549
+ "notes": [
5550
+ "A 20px box (18px compact) 8px (7px) before its label; hint and error align with the label text."
5551
+ ]
5552
+ }
5553
+ },
5554
+ "accessibility": {
5555
+ "obligations": [
5556
+ "A native <input type=\"checkbox\"> inside its <label>, invisibly over the drawn box, so the label names it and pointer, keyboard, touch exploration, and forms reach the real control; Space toggles it and focus shows the focus ring on the box.",
5557
+ "The hint and error form the input's aria-description; an error sets aria-invalid=\"true\" and the danger border. indeterminate sets the native indeterminate property through wireCheckboxes, so assistive technology reports a mixed state."
5558
+ ]
5559
+ },
5560
+ "cssValueProps": [],
5561
+ "boundaries": {
5562
+ "rootClass": "kui-checkbox",
5563
+ "publicClasses": [
5564
+ "kui-checkbox",
5565
+ "kui-checkbox__row",
5566
+ "kui-checkbox__control",
5567
+ "kui-checkbox__input",
5568
+ "kui-checkbox__box",
5569
+ "kui-checkbox__label",
5570
+ "kui-checkbox__hint",
5571
+ "kui-checkbox__error"
5572
+ ],
5573
+ "rootElement": "div",
5574
+ "publicTokens": [
5575
+ "--kui-color-brand-fill-loud",
5576
+ "--kui-color-brand-on-loud",
5577
+ "--kui-color-neutral-border-normal",
5578
+ "--kui-color-surface",
5579
+ "--kui-color-text",
5580
+ "--kui-color-text-quiet",
5581
+ "--kui-color-danger-border-loud",
5582
+ "--kui-color-danger-on-quiet",
5583
+ "--kui-focus-ring",
5584
+ "--kui-font-m",
5585
+ "--kui-font-s",
5586
+ "--kui-font-xs"
5587
+ ]
5588
+ },
5589
+ "diagnostics": [],
5590
+ "provenance": {
5591
+ "selection": "ai/component-catalog.json",
5592
+ "composition": "generated-permissive-default"
5593
+ }
5594
+ },
5595
+ {
5596
+ "key": "@kerfjs/ui:radio-group",
5597
+ "package": "@kerfjs/ui",
5598
+ "id": "radio-group",
5599
+ "name": "RadioGroup",
5600
+ "kind": "component",
5601
+ "source": "kerf",
5602
+ "parents": { "mode": "any", "entries": [] },
5603
+ "contexts": ["application-ui"],
5604
+ "zones": [],
5605
+ "children": { "mode": "any", "concepts": [], "requiredConcepts": [] },
5606
+ "state": [
5607
+ { "id": "value", "owner": "application", "required": false },
5608
+ {
5609
+ "id": "choices and their copy",
5610
+ "owner": "application",
5611
+ "required": false
5612
+ },
5613
+ {
5614
+ "id": "validation and error copy",
5615
+ "owner": "application",
5616
+ "required": false
5617
+ }
5618
+ ],
5619
+ "wiring": {
5620
+ "required": false,
5621
+ "helpers": [],
5622
+ "obligations": [],
5623
+ "stateAttributes": []
5624
+ },
5625
+ "responsive": { "owner": "not-applicable", "behaviors": [] },
5626
+ "layout": {
5627
+ "roles": ["controls"],
5628
+ "geometry": {
5629
+ "margin": "none",
5630
+ "border": "none",
5631
+ "padding": "self",
5632
+ "notes": [
5633
+ "The label and hint sit on the text column (1px + 8px); the choices sit on the 8px control column, 12px apart."
5634
+ ]
5635
+ }
5636
+ },
5637
+ "accessibility": {
5638
+ "obligations": [
5639
+ "A native <fieldset role=\"radiogroup\"> named by its legend (label) or ariaLabel; each choice is a native radio inside its <label>, invisibly over the drawn circle. The browser owns the interaction: one Tab stop, arrow keys move and select, and the checked radio submits its value under name.",
5640
+ "The group's hint and error form its aria-description; an error sets aria-invalid on the group and the danger border on each circle. required sets each radio's native required and aria-required on the group. A choice's hint is that radio's aria-description."
5641
+ ]
5642
+ },
5643
+ "cssValueProps": [],
5644
+ "boundaries": {
5645
+ "rootClass": "kui-radio-group",
5646
+ "publicClasses": [
5647
+ "kui-radio-group",
5648
+ "kui-radio-group__label",
5649
+ "kui-radio-group__choices",
5650
+ "kui-radio-group__choice",
5651
+ "kui-radio-group__row",
5652
+ "kui-radio-group__control",
5653
+ "kui-radio-group__input",
5654
+ "kui-radio-group__circle",
5655
+ "kui-radio-group__choice-label",
5656
+ "kui-radio-group__choice-hint",
5657
+ "kui-radio-group__hint",
5658
+ "kui-radio-group__error"
5659
+ ],
5660
+ "rootElement": "fieldset",
5661
+ "publicTokens": [
5662
+ "--kui-color-brand-fill-loud",
5663
+ "--kui-color-neutral-border-normal",
5664
+ "--kui-color-surface",
5665
+ "--kui-color-text",
5666
+ "--kui-color-text-quiet",
5667
+ "--kui-color-danger-border-loud",
5668
+ "--kui-color-danger-on-quiet",
5669
+ "--kui-focus-ring",
5670
+ "--kui-font-m",
5671
+ "--kui-font-s",
5672
+ "--kui-font-xs",
5673
+ "--kui-color-neutral-on-quiet",
5674
+ "--kui-layout-item-padding"
5675
+ ]
5676
+ },
5677
+ "diagnostics": [],
5678
+ "provenance": {
5679
+ "selection": "ai/component-catalog.json",
5680
+ "composition": "generated-permissive-default"
5681
+ }
5682
+ },
5683
+ {
5684
+ "key": "@kerfjs/ui:switch",
5685
+ "package": "@kerfjs/ui",
5686
+ "id": "switch",
5687
+ "name": "Switch",
5688
+ "kind": "component",
5689
+ "source": "kerf",
5690
+ "parents": { "mode": "any", "entries": [] },
5691
+ "contexts": ["application-ui"],
5692
+ "zones": [],
5693
+ "children": { "mode": "any", "concepts": [], "requiredConcepts": [] },
5694
+ "state": [
5695
+ { "id": "checked state", "owner": "application", "required": false },
5696
+ {
5697
+ "id": "applying the setting",
5698
+ "owner": "application",
5699
+ "required": false
5700
+ }
5701
+ ],
4600
5702
  "wiring": {
4601
- "required": true,
4602
- "helpers": ["@kerfjs/ui/select/register"],
4603
- "obligations": [
4604
- "Import the registration module once in the application."
4605
- ],
5703
+ "required": false,
5704
+ "helpers": [],
5705
+ "obligations": [],
4606
5706
  "stateAttributes": []
4607
5707
  },
4608
5708
  "responsive": { "owner": "not-applicable", "behaviors": [] },
4609
5709
  "layout": {
4610
5710
  "roles": ["controls"],
4611
- "geometry": { "margin": "none", "border": "self", "padding": "self" }
5711
+ "geometry": {
5712
+ "margin": "none",
5713
+ "border": "self",
5714
+ "padding": "none",
5715
+ "notes": [
5716
+ "A 35×20 track (31.5×18 compact) 8px (7px) before its label; the hint aligns with the label text."
5717
+ ]
5718
+ }
4612
5719
  },
4613
5720
  "accessibility": {
4614
5721
  "obligations": [
4615
- "Verify the live value, standard events, focus, and rendered output.",
4616
- "A nonempty label names the internal combobox; otherwise ariaLabel supplies a visually hidden label without adding control height, including custom selected content.",
4617
- "Hint text is visible below the control through Web Awesome's native hint relationship; placeholderText remains the empty value inside the closed control.",
4618
- "Import select/register once; its scoped lifecycle adapter keeps the latest open/close request authoritative across animation reversals, canceled transitions, and removal. Do not add consumer popup timing or position repairs.",
4619
- "With multiple, the popup stays open while choices toggle (pointer, Enter, or Space) and closes on an outside press, Escape, or focus leaving; each chosen option shows a check, and the closed control summarizes the chosen labels in choice order.",
4620
- "Disabled choices stay visible but cannot be selected; disabledReason exposes a tooltip. A multiple Select can opt in to localized select-all and clear buttons, which skip disabled choices and publish ordinary input/change events for changed values.",
4621
- "A multiple icon-only trigger shows its fixed triggerIcon and, while any choice is chosen, an aria-hidden count Badge; the combobox's accessible name ends with the chosen labels in choice order, and its hidden value stays empty.",
4622
- "Once registered, an icon-only trigger (single or multiple) shows an aria-hidden Web Awesome help tag repeating its accessible name (a single Select adds its current choice) after a 500ms hover and at once on keyboard focus; it hides while the popup is open, on a press, and on Escape, and never joins aria-labelledby. Do not add a title or another tooltip."
5722
+ "A native <input type=\"checkbox\" role=\"switch\"> inside its <label>, invisibly over the drawn track, so the label names it and assistive technology announces on or off; Space toggles it and focus shows the focus ring on the track. The hint is its aria-description. The thumb's slide is skipped when reduced motion is preferred."
4623
5723
  ]
4624
5724
  },
4625
- "cssValueProps": [
4626
- {
4627
- "path": "choices[].color",
4628
- "grammar": "color",
4629
- "helpers": ["uiColor", "foregroundColorVar", "foregroundColor"],
4630
- "shorthands": [],
4631
- "canonicalShorthands": [],
4632
- "exceptionalShorthands": [],
4633
- "rawPolicy": "forbid",
4634
- "examples": [
4635
- "color: uiColor(\"success-on-quiet\")",
4636
- "color: foregroundColorVar(\"--app-choice-color\")",
4637
- "color: foregroundColor(\"rebeccapurple\")"
4638
- ]
4639
- }
4640
- ],
5725
+ "cssValueProps": [],
4641
5726
  "boundaries": {
4642
- "rootClass": "kui-select",
5727
+ "rootClass": "kui-switch",
4643
5728
  "publicClasses": [
4644
- "kui-select",
4645
- "kui-select--custom-selected",
4646
- "kui-select--fit-menu",
4647
- "kui-select--label-hidden",
4648
- "kui-select__custom-selected",
4649
- "kui-select__custom-selected-content",
4650
- "kui-select__group",
4651
- "kui-select__group--separated",
4652
- "kui-select__group-title",
4653
- "kui-select__icon"
5729
+ "kui-switch",
5730
+ "kui-switch__row",
5731
+ "kui-switch__control",
5732
+ "kui-switch__input",
5733
+ "kui-switch__track",
5734
+ "kui-switch__thumb",
5735
+ "kui-switch__label",
5736
+ "kui-switch__hint"
4654
5737
  ],
5738
+ "rootElement": "div",
4655
5739
  "publicTokens": [
4656
- "--kui-color-neutral-border-quiet",
4657
- "--kui-color-neutral-on-quiet",
4658
- "--kui-disclosure-icon-scale",
4659
- "--kui-font-2xs",
4660
- "--kui-select-selected-color",
4661
- "--kui-select-selected-font-size",
4662
- "--kui-select-selected-font-weight",
4663
- "--kui-select-trigger-max-width"
5740
+ "--kui-color-brand-fill-loud",
5741
+ "--kui-color-neutral-border-normal",
5742
+ "--kui-color-surface",
5743
+ "--kui-color-text",
5744
+ "--kui-color-text-quiet",
5745
+ "--kui-focus-ring",
5746
+ "--kui-font-m",
5747
+ "--kui-font-s",
5748
+ "--kui-font-xs"
4664
5749
  ]
4665
5750
  },
4666
- "diagnostics": [
4667
- {
4668
- "id": "KUI-C107",
4669
- "severity": "error",
4670
- "when": "the registration import is absent",
4671
- "message": "Select requires @kerfjs/ui/select/register once per application."
4672
- }
4673
- ],
5751
+ "diagnostics": [],
4674
5752
  "provenance": {
4675
5753
  "selection": "ai/component-catalog.json",
4676
- "composition": "README.md#web-awesome-theme"
5754
+ "composition": "generated-permissive-default"
4677
5755
  }
4678
5756
  },
4679
5757
  {
4680
- "key": "@kerfjs/ui:combobox",
5758
+ "key": "@kerfjs/ui:slider",
4681
5759
  "package": "@kerfjs/ui",
4682
- "id": "combobox",
4683
- "name": "Combobox",
5760
+ "id": "slider",
5761
+ "name": "Slider",
4684
5762
  "kind": "component",
4685
5763
  "source": "kerf",
4686
5764
  "parents": { "mode": "any", "entries": [] },
@@ -4689,35 +5767,26 @@
4689
5767
  "children": { "mode": "any", "concepts": [], "requiredConcepts": [] },
4690
5768
  "state": [
4691
5769
  {
4692
- "id": "the suggestions and the committed values",
5770
+ "id": "the value (read it on input or change through action) and re-rendering with it",
4693
5771
  "owner": "application",
4694
5772
  "required": false
4695
5773
  },
4696
5774
  {
4697
- "id": "normalizing and validating created values",
5775
+ "id": "min, max, step, and ticks",
4698
5776
  "owner": "application",
4699
5777
  "required": false
4700
5778
  },
4701
5779
  {
4702
- "id": "clearing the field after a commit",
5780
+ "id": "the label, hint, and unit",
4703
5781
  "owner": "application",
4704
5782
  "required": false
4705
5783
  }
4706
5784
  ],
4707
5785
  "wiring": {
4708
- "required": true,
4709
- "helpers": ["wireComboboxes"],
4710
- "obligations": [
4711
- "Filters suggestions, moves the active option, and reports commits; without it the list never opens."
4712
- ],
4713
- "stateAttributes": [
4714
- {
4715
- "name": "data-value",
4716
- "on": "the create option (kui-combobox__option[data-create])",
4717
- "helper": "wireComboboxes",
4718
- "meaning": "The typed text the create option would commit; rewritten as the person types."
4719
- }
4720
- ]
5786
+ "required": false,
5787
+ "helpers": ["wireSliders"],
5788
+ "obligations": [],
5789
+ "stateAttributes": []
4721
5790
  },
4722
5791
  "responsive": { "owner": "not-applicable", "behaviors": [] },
4723
5792
  "layout": {
@@ -4727,46 +5796,30 @@
4727
5796
  "border": "self",
4728
5797
  "padding": "self",
4729
5798
  "notes": [
4730
- "Label and hint sit on the value's text column (1px border + 8px padding); the 44px field matches a themed wa-input."
5799
+ "It fills the available width with the shared block-content inset (a transparent 1px border and 8px padding), so its label sits on the text column."
4731
5800
  ]
4732
5801
  }
4733
5802
  },
4734
5803
  "accessibility": {
4735
5804
  "obligations": [
4736
- "Native input with role=combobox, aria-autocomplete=list, aria-expanded, aria-controls, and aria-activedescendant; options are role=option in a listbox. The visible label is a real label; the hint is aria-describedby."
5805
+ "It is a native range input: arrow keys, Page Up and Down, Home, and End step it, and the platform announces its value (with a unit, as aria-valuetext).",
5806
+ "The label names it, the hint describes it, and the readout is hidden from assistive technology because the input already reports its value; forced colors draw a Highlight fill on a GrayText track."
4737
5807
  ]
4738
5808
  },
4739
5809
  "cssValueProps": [],
4740
5810
  "boundaries": {
4741
- "rootClass": "kui-combobox",
5811
+ "rootClass": "kui-slider",
4742
5812
  "publicClasses": [
4743
- "kui-combobox",
4744
- "kui-combobox__label",
4745
- "kui-combobox__hint",
4746
- "kui-combobox__control",
4747
- "kui-combobox__input",
4748
- "kui-combobox__listbox",
4749
- "kui-combobox__option"
5813
+ "kui-slider",
5814
+ "kui-slider__header",
5815
+ "kui-slider__label",
5816
+ "kui-slider__value",
5817
+ "kui-slider__input",
5818
+ "kui-slider__ticks",
5819
+ "kui-slider__tick",
5820
+ "kui-slider__hint"
4750
5821
  ],
4751
- "rootElement": "div",
4752
- "publicTokens": [
4753
- "--kui-combobox-z-index",
4754
- "--kui-color-neutral-on-quiet",
4755
- "--kui-color-text-quiet",
4756
- "--kui-color-neutral-border-normal",
4757
- "--kui-color-text",
4758
- "--kui-color-surface",
4759
- "--kui-color-surface-raised",
4760
- "--kui-color-text-link",
4761
- "--kui-color-brand-fill-quiet",
4762
- "--kui-font-xs",
4763
- "--kui-font-s",
4764
- "--kui-layout-item-padding",
4765
- "--kui-layout-rounded-radius",
4766
- "--kui-shadow-l",
4767
- "--kui-space-2xs",
4768
- "--kui-space-xs"
4769
- ]
5822
+ "publicTokens": []
4770
5823
  },
4771
5824
  "diagnostics": [],
4772
5825
  "provenance": {
@@ -4851,6 +5904,11 @@
4851
5904
  "owner": "application",
4852
5905
  "required": false
4853
5906
  },
5907
+ {
5908
+ "id": "the checked state of checkbox choices, which the menu reports as requested in its kui-menu-select event",
5909
+ "owner": "application",
5910
+ "required": false
5911
+ },
4854
5912
  {
4855
5913
  "id": "reactions to the menu opening or closing",
4856
5914
  "owner": "application",
@@ -4875,8 +5933,9 @@
4875
5933
  },
4876
5934
  "accessibility": {
4877
5935
  "obligations": [
4878
- "An icon-only trigger requires label, rendered as visually hidden slotted text because a Web Awesome button takes its accessible name from its content; a trigger with visible text is named by that text. The context anchor stays out of the accessibility tree. The open menu takes the trigger's name (the context or icon-only label, or the visible text), and each submenu takes its parent item's label, so a screen reader announces a named menu and getByRole('menu', { name }) finds it. Web Awesome provides menu roles, nested arrow-key navigation, typeahead, and Escape.",
4879
- "Once registered, an icon-only trigger shows its label as an aria-hidden Web Awesome help tag after a 500ms hover and at once on keyboard focus; it hides while the menu is open, on a press, and on Escape, and never joins aria-labelledby. Do not add a title or another tooltip."
5936
+ "The trigger is a native button with aria-haspopup=\"menu\" and aria-expanded; an icon-only trigger requires label, rendered as visually hidden text inside the button, and a trigger with visible text is named by that text. The context anchor stays out of the accessibility tree. The open menu (role=\"menu\") takes the trigger's name, each submenu takes its parent item's label, and a heading names the role=\"group\" that holds its items, so a screen reader announces named menus and getByRole('menu', { name }) finds them. Items are menuitem or menuitemcheckbox buttons with aria-checked and aria-disabled.",
5937
+ "Keyboard: Enter, Space, or ArrowDown on the trigger opens on the first item (ArrowUp on the last); ArrowUp/ArrowDown move and wrap past disabled items, Home/End jump, and typing a label's first letters moves to it; Enter or Space chooses; ArrowRight opens a submenu on its first item and ArrowLeft returns to the parent item (mirrored right to left); Escape closes the current level and returns focus to its opener; Tab closes the menu and continues from the trigger.",
5938
+ "Once registered, an icon-only trigger shows its label as an aria-hidden help tag after a 500ms hover and at once on keyboard focus; it hides while the menu is open, on a press, and on Escape, and never joins aria-labelledby. Do not add a title or another tooltip."
4880
5939
  ]
4881
5940
  },
4882
5941
  "cssValueProps": [],
@@ -4884,7 +5943,10 @@
4884
5943
  "rootClass": "kui-popup-menu",
4885
5944
  "publicClasses": [
4886
5945
  "kui-popup-menu",
5946
+ "kui-popup-menu__trigger",
4887
5947
  "kui-popup-menu__label",
5948
+ "kui-popup-menu__menu",
5949
+ "kui-popup-menu__item",
4888
5950
  "kui-popup-menu__details",
4889
5951
  "kui-popup-menu__context-anchor"
4890
5952
  ],
@@ -4897,10 +5959,10 @@
4897
5959
  }
4898
5960
  },
4899
5961
  {
4900
- "key": "@kerfjs/ui:icon-button",
5962
+ "key": "@kerfjs/ui:button",
4901
5963
  "package": "@kerfjs/ui",
4902
- "id": "icon-button",
4903
- "name": "IconButton",
5964
+ "id": "button",
5965
+ "name": "Button",
4904
5966
  "kind": "component",
4905
5967
  "source": "kerf",
4906
5968
  "parents": { "mode": "any", "entries": [] },
@@ -4909,72 +5971,16 @@
4909
5971
  "children": { "mode": "any", "concepts": [], "requiredConcepts": [] },
4910
5972
  "state": [
4911
5973
  {
4912
- "id": "the delegated action",
4913
- "owner": "application",
4914
- "required": false
4915
- },
4916
- {
4917
- "id": "the accessible name",
5974
+ "id": "the label and its delegated action",
4918
5975
  "owner": "application",
4919
5976
  "required": false
4920
5977
  },
4921
5978
  {
4922
- "id": "appearance, variant, and size choice",
4923
- "owner": "application",
4924
- "required": false
4925
- }
4926
- ],
4927
- "wiring": {
4928
- "required": false,
4929
- "helpers": [],
4930
- "obligations": [],
4931
- "stateAttributes": []
4932
- },
4933
- "responsive": { "owner": "not-applicable", "behaviors": [] },
4934
- "layout": {
4935
- "roles": ["controls"],
4936
- "geometry": { "margin": "none", "border": "self", "padding": "self" }
4937
- },
4938
- "accessibility": {
4939
- "obligations": [
4940
- "label is required and names the button through its LucideIcon (role img), since the button shows no text."
4941
- ]
4942
- },
4943
- "cssValueProps": [],
4944
- "boundaries": {
4945
- "rootClass": "kui-icon-button",
4946
- "publicClasses": ["kui-icon-button"],
4947
- "rootElement": "wa-button",
4948
- "publicTokens": []
4949
- },
4950
- "diagnostics": [],
4951
- "provenance": {
4952
- "selection": "ai/component-catalog.json",
4953
- "composition": "generated-permissive-default"
4954
- }
4955
- },
4956
- {
4957
- "key": "@kerfjs/ui:icon-toggle-button",
4958
- "package": "@kerfjs/ui",
4959
- "id": "icon-toggle-button",
4960
- "name": "IconToggleButton",
4961
- "kind": "component",
4962
- "source": "kerf",
4963
- "parents": { "mode": "any", "entries": [] },
4964
- "contexts": ["application-ui"],
4965
- "zones": [],
4966
- "children": { "mode": "any", "concepts": [], "requiredConcepts": [] },
4967
- "state": [
4968
- {
4969
- "id": "the pressed state and its delegated action",
5979
+ "id": "what a press does while loading",
4970
5980
  "owner": "application",
4971
5981
  "required": false
4972
5982
  },
4973
- {
4974
- "id": "the accessible name",
4975
- "owner": "application",
4976
- "required": false
4977
- }
5983
+ { "id": "form ownership", "owner": "application", "required": false }
4978
5984
  ],
4979
5985
  "wiring": {
4980
5986
  "required": false,
@@ -4989,28 +5995,41 @@
4989
5995
  },
4990
5996
  "accessibility": {
4991
5997
  "obligations": [
4992
- "Native button with aria-pressed and a required aria-label; with help tags registered it shows that label on hover and keyboard focus."
5998
+ "A native <button> (type=\"button\" unless set) or, with href, an <a>; its label names it, or ariaLabel when the label is not enough. Focus shows the standard focus ring.",
5999
+ "Loading shows a spinner in place of the label, which still names the button, and sets aria-busy=\"true\". A disabled link drops its href and reports aria-disabled=\"true\".",
6000
+ "With pressed, it is a toggle: aria-pressed reports the state, and the pressed look adds a doubled outline (secondary and plain) or a darkened fill with an inset ring (primary), so the state never relies on hue alone; forced-colors mode paints it Highlight. An icon-only Button is named by ariaLabel, and help tags show that name on hover and keyboard focus. A title gives native hover text that says more than the name and replaces the help tag."
4993
6001
  ]
4994
6002
  },
4995
6003
  "cssValueProps": [],
4996
6004
  "boundaries": {
4997
- "rootClass": "kui-icon-toggle-button",
6005
+ "rootClass": "kui-button",
4998
6006
  "publicClasses": [
4999
- "kui-icon-toggle-button",
5000
- "kui-icon-toggle-button__face"
6007
+ "kui-button",
6008
+ "kui-button__icon",
6009
+ "kui-button__label",
6010
+ "kui-button__spinner"
5001
6011
  ],
5002
6012
  "rootElement": "button",
5003
6013
  "publicTokens": [
5004
- "--kui-color-neutral-border-normal",
5005
- "--kui-color-neutral-fill-normal",
6014
+ "--kui-color-neutral-fill-loud",
6015
+ "--kui-color-neutral-on-loud",
6016
+ "--kui-color-neutral-fill-quiet",
5006
6017
  "--kui-color-neutral-on-quiet",
5007
- "--kui-color-surface",
6018
+ "--kui-color-neutral-border-loud",
6019
+ "--kui-color-brand-fill-loud",
6020
+ "--kui-color-brand-on-loud",
6021
+ "--kui-color-brand-fill-quiet",
5008
6022
  "--kui-color-brand-on-quiet",
5009
- "--kui-shadow-s",
6023
+ "--kui-color-brand-border-loud",
6024
+ "--kui-color-danger-fill-loud",
6025
+ "--kui-color-danger-on-loud",
6026
+ "--kui-color-danger-fill-quiet",
6027
+ "--kui-color-danger-on-quiet",
6028
+ "--kui-color-danger-border-loud",
5010
6029
  "--kui-focus-ring",
5011
- "--kui-layout-pill-radius",
5012
- "--kui-layout-rounded-radius",
5013
- "--kui-layout-highlight-inset"
6030
+ "--kui-font-m",
6031
+ "--kui-font-s",
6032
+ "--kui-layout-rounded-radius"
5014
6033
  ]
5015
6034
  },
5016
6035
  "diagnostics": [],
@@ -5353,7 +6372,143 @@
5353
6372
  "diagnostics": [],
5354
6373
  "provenance": {
5355
6374
  "selection": "ai/component-catalog.json",
5356
- "composition": "docs/component-selection.md#problem-to-component-matrix"
6375
+ "composition": "docs/component-selection.md#problem-to-component-matrix"
6376
+ }
6377
+ },
6378
+ {
6379
+ "key": "@kerfjs/ui:toast",
6380
+ "package": "@kerfjs/ui",
6381
+ "id": "toast",
6382
+ "name": "Toast",
6383
+ "kind": "composition",
6384
+ "source": "kerf",
6385
+ "parents": { "mode": "any", "entries": [] },
6386
+ "contexts": ["application-ui"],
6387
+ "zones": [],
6388
+ "children": { "mode": "any", "concepts": [], "requiredConcepts": [] },
6389
+ "state": [
6390
+ {
6391
+ "id": "when to show a toast and its message",
6392
+ "owner": "application",
6393
+ "required": false
6394
+ },
6395
+ {
6396
+ "id": "duration, variant, and replace mode",
6397
+ "owner": "application",
6398
+ "required": false
6399
+ },
6400
+ {
6401
+ "id": "an app-owned container with data-placement=\"top\" for top-edge stacking",
6402
+ "owner": "application",
6403
+ "required": false
6404
+ },
6405
+ {
6406
+ "id": "dismissing a persistent (duration 0) toast",
6407
+ "owner": "application",
6408
+ "required": false
6409
+ }
6410
+ ],
6411
+ "wiring": {
6412
+ "required": false,
6413
+ "helpers": [],
6414
+ "obligations": [],
6415
+ "stateAttributes": []
6416
+ },
6417
+ "responsive": { "owner": "not-applicable", "behaviors": [] },
6418
+ "layout": {
6419
+ "roles": ["feedback"],
6420
+ "geometry": {
6421
+ "margin": "self",
6422
+ "border": "self",
6423
+ "padding": "self",
6424
+ "notes": [
6425
+ "The region insets 16px from the viewport edge plus the safe area and caps its width at 480px; toasts stack with an 8px gap."
6426
+ ]
6427
+ }
6428
+ },
6429
+ "accessibility": {
6430
+ "obligations": [
6431
+ "The core region is an aria-live polite region and each toast is role status, so assistive technology announces it without moving focus.",
6432
+ "Toasts dismiss themselves after four seconds by default; give longer messages a longer duration, and never rely on a toast for the only path to an action.",
6433
+ "The entrance and exit only fade under prefers-reduced-motion or the static-effects switch, and forced colors draw a CanvasText border on Canvas."
6434
+ ]
6435
+ },
6436
+ "cssValueProps": [],
6437
+ "boundaries": {
6438
+ "rootClass": "kerf-toasts",
6439
+ "publicClasses": ["kerf-toasts", "kerf-toast", "kui-toast-exit"],
6440
+ "placeableClasses": ["kerf-toasts", "kerf-toast", "kui-toast-exit"],
6441
+ "publicTokens": ["--kui-overlay-toast-z-index"]
6442
+ },
6443
+ "diagnostics": [],
6444
+ "provenance": {
6445
+ "selection": "ai/component-catalog.json",
6446
+ "composition": "generated-permissive-default"
6447
+ }
6448
+ },
6449
+ {
6450
+ "key": "@kerfjs/ui:tooltip",
6451
+ "package": "@kerfjs/ui",
6452
+ "id": "tooltip",
6453
+ "name": "Tooltip",
6454
+ "kind": "composition",
6455
+ "source": "kerf",
6456
+ "parents": { "mode": "any", "entries": [] },
6457
+ "contexts": ["application-ui"],
6458
+ "zones": [],
6459
+ "children": { "mode": "any", "concepts": [], "requiredConcepts": [] },
6460
+ "state": [
6461
+ {
6462
+ "id": "which elements get a tooltip and its content",
6463
+ "owner": "application",
6464
+ "required": false
6465
+ },
6466
+ {
6467
+ "id": "placement, delay, and native top-layer hosting",
6468
+ "owner": "application",
6469
+ "required": false
6470
+ },
6471
+ {
6472
+ "id": "the disposer that removes a tooltip's listeners",
6473
+ "owner": "application",
6474
+ "required": false
6475
+ }
6476
+ ],
6477
+ "wiring": {
6478
+ "required": false,
6479
+ "helpers": [],
6480
+ "obligations": [],
6481
+ "stateAttributes": []
6482
+ },
6483
+ "responsive": { "owner": "not-applicable", "behaviors": [] },
6484
+ "layout": {
6485
+ "roles": ["feedback"],
6486
+ "geometry": {
6487
+ "margin": "self",
6488
+ "border": "self",
6489
+ "padding": "self",
6490
+ "notes": [
6491
+ "tooltip() positions the wrapper beside its anchor; the stylesheet caps its width at 40 characters within the viewport."
6492
+ ]
6493
+ }
6494
+ },
6495
+ "accessibility": {
6496
+ "obligations": [
6497
+ "tooltip() shows on hover and on keyboard focus, gives the wrapper role tooltip, and hides on leave or blur; keep the anchor's accessible name complete without it.",
6498
+ "The loud neutral fill with on-loud text meets WCAG AA; forced colors draw CanvasText on Canvas, and the entrance is skipped under prefers-reduced-motion or the static-effects switch."
6499
+ ]
6500
+ },
6501
+ "cssValueProps": [],
6502
+ "boundaries": {
6503
+ "rootClass": "kerf-tooltip",
6504
+ "publicClasses": ["kerf-tooltip", "kui-tooltip-exit"],
6505
+ "placeableClasses": ["kerf-tooltip", "kui-tooltip-exit"],
6506
+ "publicTokens": ["--kui-overlay-tooltip-z-index"]
6507
+ },
6508
+ "diagnostics": [],
6509
+ "provenance": {
6510
+ "selection": "ai/component-catalog.json",
6511
+ "composition": "generated-permissive-default"
5357
6512
  }
5358
6513
  },
5359
6514
  {
@@ -5635,6 +6790,132 @@
5635
6790
  "composition": "generated-permissive-default"
5636
6791
  }
5637
6792
  },
6793
+ {
6794
+ "key": "@kerfjs/ui:progress-bar",
6795
+ "package": "@kerfjs/ui",
6796
+ "id": "progress-bar",
6797
+ "name": "ProgressBar",
6798
+ "kind": "component",
6799
+ "source": "kerf",
6800
+ "parents": { "mode": "any", "entries": [] },
6801
+ "contexts": ["application-ui"],
6802
+ "zones": [],
6803
+ "children": { "mode": "any", "concepts": [], "requiredConcepts": [] },
6804
+ "state": [
6805
+ {
6806
+ "id": "the value, max, and valueText",
6807
+ "owner": "application",
6808
+ "required": false
6809
+ },
6810
+ {
6811
+ "id": "the label or ariaLabel",
6812
+ "owner": "application",
6813
+ "required": false
6814
+ },
6815
+ { "id": "the tone and size", "owner": "application", "required": false }
6816
+ ],
6817
+ "wiring": {
6818
+ "required": false,
6819
+ "helpers": [],
6820
+ "obligations": [],
6821
+ "stateAttributes": []
6822
+ },
6823
+ "responsive": { "owner": "not-applicable", "behaviors": [] },
6824
+ "layout": {
6825
+ "roles": ["feedback"],
6826
+ "geometry": {
6827
+ "margin": "none",
6828
+ "border": "self",
6829
+ "padding": "self",
6830
+ "notes": [
6831
+ "It fills the available width with the shared block-content inset (a transparent 1px border and 8px padding); the label row sits 4px above the track."
6832
+ ]
6833
+ }
6834
+ },
6835
+ "accessibility": {
6836
+ "obligations": [
6837
+ "The native progress element is the progressbar: a visible label names it through aria-labelledby (or ariaLabel without one), and valueText replaces the spoken percentage.",
6838
+ "The indeterminate sweep holds still under prefers-reduced-motion or the static-effects switch; forced colors draw a CanvasText-bordered track with a Highlight fill."
6839
+ ]
6840
+ },
6841
+ "cssValueProps": [],
6842
+ "boundaries": {
6843
+ "rootClass": "kui-progress-bar",
6844
+ "publicClasses": [
6845
+ "kui-progress-bar",
6846
+ "kui-progress-bar__header",
6847
+ "kui-progress-bar__label",
6848
+ "kui-progress-bar__value",
6849
+ "kui-progress-bar__track"
6850
+ ],
6851
+ "publicTokens": []
6852
+ },
6853
+ "diagnostics": [],
6854
+ "provenance": {
6855
+ "selection": "ai/component-catalog.json",
6856
+ "composition": "generated-permissive-default"
6857
+ }
6858
+ },
6859
+ {
6860
+ "key": "@kerfjs/ui:progress-ring",
6861
+ "package": "@kerfjs/ui",
6862
+ "id": "progress-ring",
6863
+ "name": "ProgressRing",
6864
+ "kind": "component",
6865
+ "source": "kerf",
6866
+ "parents": { "mode": "any", "entries": [] },
6867
+ "contexts": ["application-ui"],
6868
+ "zones": [],
6869
+ "children": { "mode": "any", "concepts": [], "requiredConcepts": [] },
6870
+ "state": [
6871
+ {
6872
+ "id": "the value, max, and valueText",
6873
+ "owner": "application",
6874
+ "required": false
6875
+ },
6876
+ { "id": "the label", "owner": "application", "required": false },
6877
+ { "id": "the tone and size", "owner": "application", "required": false }
6878
+ ],
6879
+ "wiring": {
6880
+ "required": false,
6881
+ "helpers": [],
6882
+ "obligations": [],
6883
+ "stateAttributes": []
6884
+ },
6885
+ "responsive": { "owner": "not-applicable", "behaviors": [] },
6886
+ "layout": {
6887
+ "roles": ["feedback"],
6888
+ "geometry": {
6889
+ "margin": "none",
6890
+ "border": "none",
6891
+ "padding": "none",
6892
+ "notes": [
6893
+ "Its box is exactly its diameter, so it aligns with icons of the same size."
6894
+ ]
6895
+ }
6896
+ },
6897
+ "accessibility": {
6898
+ "obligations": [
6899
+ "It is role progressbar named by label, with aria-valuenow as a percentage (or valueText); the SVG is decorative.",
6900
+ "The spin holds still under prefers-reduced-motion or the static-effects switch; forced colors draw a GrayText track and a Highlight arc."
6901
+ ]
6902
+ },
6903
+ "cssValueProps": [],
6904
+ "boundaries": {
6905
+ "rootClass": "kui-progress-ring",
6906
+ "publicClasses": [
6907
+ "kui-progress-ring",
6908
+ "kui-progress-ring__track",
6909
+ "kui-progress-ring__arc"
6910
+ ],
6911
+ "publicTokens": []
6912
+ },
6913
+ "diagnostics": [],
6914
+ "provenance": {
6915
+ "selection": "ai/component-catalog.json",
6916
+ "composition": "generated-permissive-default"
6917
+ }
6918
+ },
5638
6919
  {
5639
6920
  "key": "@kerfjs/ui:skeleton",
5640
6921
  "package": "@kerfjs/ui",
@@ -6513,6 +7794,42 @@
6513
7794
  "composition": "generated-permissive-default"
6514
7795
  }
6515
7796
  },
7797
+ {
7798
+ "key": "@kerfjs/ui:wa-tag-input",
7799
+ "package": "@kerfjs/ui",
7800
+ "id": "wa-tag-input",
7801
+ "name": "Tag Input",
7802
+ "kind": "component",
7803
+ "source": "webawesome",
7804
+ "parents": { "mode": "any", "entries": [] },
7805
+ "contexts": ["application-ui"],
7806
+ "zones": [],
7807
+ "children": { "mode": "any", "concepts": [], "requiredConcepts": [] },
7808
+ "state": [],
7809
+ "wiring": {
7810
+ "required": false,
7811
+ "helpers": [],
7812
+ "obligations": [],
7813
+ "stateAttributes": []
7814
+ },
7815
+ "responsive": { "owner": "not-applicable", "behaviors": [] },
7816
+ "layout": {
7817
+ "roles": ["forms"],
7818
+ "geometry": { "margin": "none", "border": "self", "padding": "self" }
7819
+ },
7820
+ "accessibility": { "obligations": [] },
7821
+ "cssValueProps": [],
7822
+ "boundaries": {
7823
+ "rootClass": null,
7824
+ "publicClasses": [],
7825
+ "publicTokens": []
7826
+ },
7827
+ "diagnostics": [],
7828
+ "provenance": {
7829
+ "selection": "ai/component-catalog.json",
7830
+ "composition": "generated-permissive-default"
7831
+ }
7832
+ },
6516
7833
  {
6517
7834
  "key": "@kerfjs/ui:wa-accordion",
6518
7835
  "package": "@kerfjs/ui",
@@ -7008,6 +8325,78 @@
7008
8325
  "composition": "generated-permissive-default"
7009
8326
  }
7010
8327
  },
8328
+ {
8329
+ "key": "@kerfjs/ui:wa-stepper",
8330
+ "package": "@kerfjs/ui",
8331
+ "id": "wa-stepper",
8332
+ "name": "Stepper",
8333
+ "kind": "component",
8334
+ "source": "webawesome",
8335
+ "parents": { "mode": "any", "entries": [] },
8336
+ "contexts": ["application-ui"],
8337
+ "zones": [],
8338
+ "children": { "mode": "any", "concepts": [], "requiredConcepts": [] },
8339
+ "state": [],
8340
+ "wiring": {
8341
+ "required": false,
8342
+ "helpers": [],
8343
+ "obligations": [],
8344
+ "stateAttributes": []
8345
+ },
8346
+ "responsive": { "owner": "not-applicable", "behaviors": [] },
8347
+ "layout": {
8348
+ "roles": ["navigation"],
8349
+ "geometry": { "margin": "none", "border": "none", "padding": "none" }
8350
+ },
8351
+ "accessibility": { "obligations": [] },
8352
+ "cssValueProps": [],
8353
+ "boundaries": {
8354
+ "rootClass": null,
8355
+ "publicClasses": [],
8356
+ "publicTokens": []
8357
+ },
8358
+ "diagnostics": [],
8359
+ "provenance": {
8360
+ "selection": "ai/component-catalog.json",
8361
+ "composition": "generated-permissive-default"
8362
+ }
8363
+ },
8364
+ {
8365
+ "key": "@kerfjs/ui:wa-step",
8366
+ "package": "@kerfjs/ui",
8367
+ "id": "wa-step",
8368
+ "name": "Step",
8369
+ "kind": "component",
8370
+ "source": "webawesome",
8371
+ "parents": { "mode": "any", "entries": [] },
8372
+ "contexts": ["application-ui"],
8373
+ "zones": [],
8374
+ "children": { "mode": "any", "concepts": [], "requiredConcepts": [] },
8375
+ "state": [],
8376
+ "wiring": {
8377
+ "required": false,
8378
+ "helpers": [],
8379
+ "obligations": [],
8380
+ "stateAttributes": []
8381
+ },
8382
+ "responsive": { "owner": "not-applicable", "behaviors": [] },
8383
+ "layout": {
8384
+ "roles": ["navigation"],
8385
+ "geometry": { "margin": "none", "border": "none", "padding": "none" }
8386
+ },
8387
+ "accessibility": { "obligations": [] },
8388
+ "cssValueProps": [],
8389
+ "boundaries": {
8390
+ "rootClass": null,
8391
+ "publicClasses": [],
8392
+ "publicTokens": []
8393
+ },
8394
+ "diagnostics": [],
8395
+ "provenance": {
8396
+ "selection": "ai/component-catalog.json",
8397
+ "composition": "generated-permissive-default"
8398
+ }
8399
+ },
7011
8400
  {
7012
8401
  "key": "@kerfjs/ui:wa-tab",
7013
8402
  "package": "@kerfjs/ui",
@@ -8533,7 +9922,7 @@
8533
9922
  },
8534
9923
  "accessibility": {
8535
9924
  "obligations": [
8536
- "Web Awesome owns modal focus, Escape, and the labeled header with its close control; the application adapter restores the invoking control after hide, and the compact NavStack back control returns to the list."
9925
+ "ListDetailDialog's native modal dialog owns focus, Escape, and inertness, and returns focus to the opener on close; the close control sits in the detail column (or each compact view), and the compact NavStack back control returns to the list."
8537
9926
  ]
8538
9927
  },
8539
9928
  "cssValueProps": [],