@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
@@ -0,0 +1,73 @@
1
+ import { filterDataAttributes } from './chunk-KH4KEMSP.js';
2
+ import { jsxs, jsx } from 'kerfjs/jsx-runtime';
3
+
4
+ var COLOR_SWATCHES_PROTECTED = /* @__PURE__ */ new Set(["data-component", "data-size"]);
5
+ var unsafeColor = /[;{}<>"'\\]|\p{Cc}/u;
6
+ function swatchStyle(color) {
7
+ if (color === "transparent") return void 0;
8
+ const value = color.trim();
9
+ if (!value || unsafeColor.test(value))
10
+ throw new TypeError("A ColorSwatches color must be one CSS color value.");
11
+ return `--_kui-color-swatches-color:${value}`;
12
+ }
13
+ function ColorSwatches({
14
+ name,
15
+ swatches,
16
+ value,
17
+ label,
18
+ ariaLabel,
19
+ size = "default",
20
+ disabled = false,
21
+ action,
22
+ form,
23
+ id,
24
+ className = "",
25
+ rootAttributes = {},
26
+ slot
27
+ }) {
28
+ const legend = label === void 0 ? null : /* @__PURE__ */ jsx("legend", { class: "kui-color-swatches__label", children: label });
29
+ return /* @__PURE__ */ jsxs(
30
+ "fieldset",
31
+ {
32
+ ...filterDataAttributes(rootAttributes, COLOR_SWATCHES_PROTECTED),
33
+ id,
34
+ class: `kui-color-swatches ${className}`.trim(),
35
+ "data-component": "color-swatches",
36
+ "data-size": size,
37
+ "aria-label": ariaLabel,
38
+ disabled,
39
+ slot,
40
+ children: [
41
+ legend,
42
+ /* @__PURE__ */ jsx("div", { class: "kui-color-swatches__list", children: swatches.map((swatch) => /* @__PURE__ */ jsxs("label", { class: "kui-color-swatches__swatch", title: swatch.label, children: [
43
+ /* @__PURE__ */ jsx(
44
+ "input",
45
+ {
46
+ class: "kui-color-swatches__input",
47
+ type: "radio",
48
+ name,
49
+ value: swatch.value,
50
+ checked: swatch.value === value,
51
+ form,
52
+ "data-action": action,
53
+ "aria-label": swatch.label
54
+ }
55
+ ),
56
+ /* @__PURE__ */ jsx(
57
+ "span",
58
+ {
59
+ class: "kui-color-swatches__dot",
60
+ "data-swatch": swatch.color === "transparent" ? "transparent" : "color",
61
+ style: swatchStyle(swatch.color),
62
+ "aria-hidden": "true"
63
+ }
64
+ )
65
+ ] })) })
66
+ ]
67
+ }
68
+ );
69
+ }
70
+
71
+ export { ColorSwatches };
72
+
73
+ //# sourceMappingURL=chunk-IO27YTL3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/forms/color-swatches/color-swatches.tsx"],"names":[],"mappings":";;;AAyBA,IAAM,2CAA2B,IAAI,GAAA,CAAI,CAAC,gBAAA,EAAkB,WAAW,CAAC,CAAA;AAwBxE,IAAM,WAAA,GAAc,qBAAA;AAEpB,SAAS,YAAY,KAAA,EAAiD;AACpE,EAAA,IAAI,KAAA,KAAU,eAAe,OAAO,MAAA;AACpC,EAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,EAAK;AACzB,EAAA,IAAI,CAAC,KAAA,IAAS,WAAA,CAAY,IAAA,CAAK,KAAK,CAAA;AAClC,IAAA,MAAM,IAAI,UAAU,oDAAoD,CAAA;AAC1E,EAAA,OAAO,+BAA+B,KAAK,CAAA,CAAA;AAC7C;AAUO,SAAS,aAAA,CAAc;AAAA,EAC5B,IAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA,GAAO,SAAA;AAAA,EACP,QAAA,GAAW,KAAA;AAAA,EACX,MAAA;AAAA,EACA,IAAA;AAAA,EACA,EAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,iBAAiB,EAAC;AAAA,EAClB;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,MAAA,GACJ,UAAU,MAAA,GAAY,IAAA,uBACnB,QAAA,EAAA,EAAO,KAAA,EAAM,6BAA6B,QAAA,EAAA,KAAA,EAAM,CAAA;AAErD,EAAA,uBACE,IAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACE,GAAG,oBAAA,CAAqB,cAAA,EAAgB,wBAAwB,CAAA;AAAA,MACjE,EAAA;AAAA,MACA,KAAA,EAAO,CAAA,mBAAA,EAAsB,SAAS,CAAA,CAAA,CAAG,IAAA,EAAK;AAAA,MAC9C,gBAAA,EAAe,gBAAA;AAAA,MACf,WAAA,EAAW,IAAA;AAAA,MACX,YAAA,EAAY,SAAA;AAAA,MACZ,QAAA;AAAA,MACA,IAAA;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,MAAA;AAAA,wBACD,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,0BAAA,EACR,mBAAS,GAAA,CAAI,CAAC,MAAA,qBACb,IAAA,CAAC,OAAA,EAAA,EAAM,KAAA,EAAM,4BAAA,EAA6B,KAAA,EAAO,OAAO,KAAA,EACtD,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,2BAAA;AAAA,cACN,IAAA,EAAK,OAAA;AAAA,cACL,IAAA;AAAA,cACA,OAAO,MAAA,CAAO,KAAA;AAAA,cACd,OAAA,EAAS,OAAO,KAAA,KAAU,KAAA;AAAA,cAC1B,IAAA;AAAA,cACA,aAAA,EAAa,MAAA;AAAA,cACb,cAAY,MAAA,CAAO;AAAA;AAAA,WACrB;AAAA,0BACA,GAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,yBAAA;AAAA,cACN,aAAA,EACE,MAAA,CAAO,KAAA,KAAU,aAAA,GAAgB,aAAA,GAAgB,OAAA;AAAA,cAEnD,KAAA,EAAO,WAAA,CAAY,MAAA,CAAO,KAAK,CAAA;AAAA,cAC/B,aAAA,EAAY;AAAA;AAAA;AACd,SAAA,EACF,CACD,CAAA,EACH;AAAA;AAAA;AAAA,GACF;AAEJ","file":"chunk-IO27YTL3.js","sourcesContent":["import { filterDataAttributes } from '../../../shared/dom/extension-attributes.js';\nimport type { CssColor } from '../../../shared/styles/css-values.js';\n\n/** `default` is a 24px swatch; `compact` is 20px. */\nexport type ColorSwatchesSize = 'default' | 'compact';\n\n/** One color in the palette. */\nexport interface ColorSwatch {\n /** The submitted value, such as `#0a84ff` or `blue`. */\n value: string;\n /** The color's name: the swatch's accessible name and its hover hint. */\n label: string;\n /**\n * The swatch's paint: a `CssColor` from `uiColor()`, `colorVar()`, or\n * `fillColor()` (`@kerfjs/ui/css-values`), or `'transparent'` for the\n * no-color swatch, drawn outlined and struck through.\n */\n color: CssColor | 'transparent';\n}\n\n/** Application `data-*` metadata; the group's own markers stay protected. */\nexport type ColorSwatchesRootAttributes = Readonly<\n Record<`data-${string}`, string | undefined>\n>;\n\nconst COLOR_SWATCHES_PROTECTED = new Set(['data-component', 'data-size']);\n\nexport type ColorSwatchesProps = {\n /** The radio group name the chosen value submits under. */\n name: string;\n swatches: readonly ColorSwatch[];\n /** The chosen swatch's value. */\n value?: string;\n size?: ColorSwatchesSize;\n disabled?: boolean;\n /** Delegated `data-action` on each radio; listen for `change`. */\n action?: string;\n /** Associate the radios with a form outside their ancestor chain. */\n form?: string;\n /** The group's id. */\n id?: string;\n className?: string;\n rootAttributes?: ColorSwatchesRootAttributes;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n} & (\n { label: string; ariaLabel?: never } | { label?: never; ariaLabel: string }\n);\n\nconst unsafeColor = /[;{}<>\"'\\\\]|\\p{Cc}/u;\n\nfunction swatchStyle(color: ColorSwatch['color']): string | undefined {\n if (color === 'transparent') return undefined;\n const value = color.trim();\n if (!value || unsafeColor.test(value))\n throw new TypeError('A ColorSwatches color must be one CSS color value.');\n return `--_kui-color-swatches-color:${value}`;\n}\n\n/**\n * A fixed palette: a group of round color swatches with no visible text, one\n * of which is chosen. It is a native radio group, so arrow keys move the\n * choice, Tab reaches it once, and the chosen value submits under `name`.\n * Each swatch is named by its color's label (also its hover hint), and the\n * chosen one wears a ring that does not rely on its hue. A `'transparent'`\n * swatch offers \"no color\".\n */\nexport function ColorSwatches({\n name,\n swatches,\n value,\n label,\n ariaLabel,\n size = 'default',\n disabled = false,\n action,\n form,\n id,\n className = '',\n rootAttributes = {},\n slot,\n}: ColorSwatchesProps) {\n const legend =\n label === undefined ? null : (\n <legend class=\"kui-color-swatches__label\">{label}</legend>\n );\n return (\n <fieldset\n {...filterDataAttributes(rootAttributes, COLOR_SWATCHES_PROTECTED)}\n id={id}\n class={`kui-color-swatches ${className}`.trim()}\n data-component=\"color-swatches\"\n data-size={size}\n aria-label={ariaLabel}\n disabled={disabled}\n slot={slot}\n >\n {legend}\n <div class=\"kui-color-swatches__list\">\n {swatches.map((swatch) => (\n <label class=\"kui-color-swatches__swatch\" title={swatch.label}>\n <input\n class=\"kui-color-swatches__input\"\n type=\"radio\"\n name={name}\n value={swatch.value}\n checked={swatch.value === value}\n form={form}\n data-action={action}\n aria-label={swatch.label}\n />\n <span\n class=\"kui-color-swatches__dot\"\n data-swatch={\n swatch.color === 'transparent' ? 'transparent' : 'color'\n }\n style={swatchStyle(swatch.color)}\n aria-hidden=\"true\"\n />\n </label>\n ))}\n </div>\n </fieldset>\n );\n}\n"]}
@@ -0,0 +1,163 @@
1
+ import { jsxs, jsx, Fragment } from 'kerfjs/jsx-runtime';
2
+
3
+ // src/components/forms/choice-chips/choice-chips.tsx
4
+ var unsafeSwatch = /[;{}<>"'\\]|\p{Cc}/u;
5
+ function swatchStyle(swatch) {
6
+ if (swatch === "transparent") return void 0;
7
+ const color = swatch.trim();
8
+ if (!color || unsafeSwatch.test(color))
9
+ throw new TypeError("ChoiceChips swatch requires one CSS color value.");
10
+ return `--_kui-choice-chips-swatch: ${color}`;
11
+ }
12
+ function ChoiceChips(props) {
13
+ const {
14
+ name,
15
+ choices,
16
+ action,
17
+ size = "default",
18
+ presentation = "chips",
19
+ maxHeight,
20
+ disabled = false,
21
+ form,
22
+ id,
23
+ className = "",
24
+ slot,
25
+ label,
26
+ labelledBy
27
+ } = props;
28
+ const icons = presentation === "icons";
29
+ if (icons && choices.some((choice) => choice.icon === void 0))
30
+ throw new TypeError("An icons ChoiceChips choice needs an icon.");
31
+ const shape = {
32
+ "data-presentation": icons ? "icons" : void 0,
33
+ "data-scrollable": maxHeight === void 0 ? void 0 : "",
34
+ style: maxHeight === void 0 ? void 0 : `--_kui-choice-chips-max-height:${maxHeight}`
35
+ };
36
+ const titleOf = (choice) => choice.title ?? (icons ? choice.label : void 0);
37
+ if (choices.some((choice) => choice.swatch !== void 0 && choice.icon))
38
+ throw new TypeError("A ChoiceChips choice takes a swatch or an icon.");
39
+ const mode = props.multiple === true ? "multiple" : props.multiple === "toggle" ? "toggle" : "single";
40
+ const required = mode === "single" && props.required === true;
41
+ const checked = props.multiple === true || props.multiple === "toggle" ? props.value ?? [] : props.value === void 0 ? [] : [props.value];
42
+ const content = (choice) => /* @__PURE__ */ jsxs(Fragment, { children: [
43
+ choice.swatch === void 0 ? null : /* @__PURE__ */ jsx(
44
+ "span",
45
+ {
46
+ class: "kui-choice-chips__swatch",
47
+ "data-swatch": choice.swatch === "transparent" ? "transparent" : "color",
48
+ style: swatchStyle(choice.swatch),
49
+ "aria-hidden": "true"
50
+ }
51
+ ),
52
+ choice.icon === void 0 ? null : /* @__PURE__ */ jsx("span", { class: "kui-choice-chips__icon", "aria-hidden": "true", children: choice.icon }),
53
+ /* @__PURE__ */ jsx("span", { class: "kui-choice-chips__label", children: choice.label })
54
+ ] });
55
+ if (mode === "multiple") {
56
+ const enabled = disabled ? [] : choices.filter((choice) => choice.disabled !== true);
57
+ const tabStop = enabled.find((choice) => checked.includes(choice.value)) ?? enabled[0];
58
+ return /* @__PURE__ */ jsxs(
59
+ "div",
60
+ {
61
+ id,
62
+ class: `kui-choice-chips ${className}`.trim(),
63
+ "data-component": "choice-chips",
64
+ "data-selection-mode": "multiple",
65
+ "data-size": size,
66
+ ...shape,
67
+ "data-disabled": disabled ? "" : void 0,
68
+ "data-action": action,
69
+ "data-name": name,
70
+ "data-form": form,
71
+ role: "listbox",
72
+ "aria-multiselectable": "true",
73
+ "aria-orientation": "horizontal",
74
+ "aria-label": label,
75
+ "aria-labelledby": labelledBy,
76
+ "aria-disabled": disabled ? "true" : void 0,
77
+ slot,
78
+ children: [
79
+ choices.map((choice) => {
80
+ const unavailable = disabled || choice.disabled === true;
81
+ return /* @__PURE__ */ jsx(
82
+ "span",
83
+ {
84
+ class: "kui-choice-chips__chip",
85
+ role: "option",
86
+ tabindex: choice === tabStop ? "0" : "-1",
87
+ "aria-selected": checked.includes(choice.value) ? "true" : "false",
88
+ "aria-disabled": unavailable ? "true" : void 0,
89
+ "data-choice-value": choice.value,
90
+ "data-disabled": unavailable ? "" : void 0,
91
+ title: titleOf(choice),
92
+ children: content(choice)
93
+ }
94
+ );
95
+ }),
96
+ choices.filter((choice) => checked.includes(choice.value)).map((choice) => /* @__PURE__ */ jsx(
97
+ "input",
98
+ {
99
+ class: "kui-choice-chips__value",
100
+ type: "hidden",
101
+ name,
102
+ value: choice.value,
103
+ form,
104
+ disabled
105
+ }
106
+ ))
107
+ ]
108
+ }
109
+ );
110
+ }
111
+ const multiple = mode === "toggle";
112
+ return /* @__PURE__ */ jsx(
113
+ "div",
114
+ {
115
+ id,
116
+ class: `kui-choice-chips ${className}`.trim(),
117
+ "data-component": "choice-chips",
118
+ "data-selection-mode": mode,
119
+ "data-size": size,
120
+ ...shape,
121
+ "data-disabled": disabled ? "" : void 0,
122
+ role: multiple ? "group" : "radiogroup",
123
+ "aria-label": label,
124
+ "aria-labelledby": labelledBy,
125
+ "aria-required": required ? "true" : void 0,
126
+ "aria-disabled": disabled ? "true" : void 0,
127
+ slot,
128
+ children: choices.map((choice) => {
129
+ const unavailable = disabled || choice.disabled === true;
130
+ return /* @__PURE__ */ jsxs(
131
+ "label",
132
+ {
133
+ class: "kui-choice-chips__chip",
134
+ "data-choice-value": choice.value,
135
+ "data-disabled": unavailable ? "" : void 0,
136
+ title: titleOf(choice),
137
+ children: [
138
+ /* @__PURE__ */ jsx(
139
+ "input",
140
+ {
141
+ class: "kui-choice-chips__input",
142
+ type: multiple ? "checkbox" : "radio",
143
+ name,
144
+ value: choice.value,
145
+ checked: checked.includes(choice.value),
146
+ disabled: unavailable,
147
+ required,
148
+ form,
149
+ "data-action": action
150
+ }
151
+ ),
152
+ content(choice)
153
+ ]
154
+ }
155
+ );
156
+ })
157
+ }
158
+ );
159
+ }
160
+
161
+ export { ChoiceChips };
162
+
163
+ //# sourceMappingURL=chunk-ITUQC4FW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/forms/choice-chips/choice-chips.tsx"],"names":[],"mappings":"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","file":"chunk-ITUQC4FW.js","sourcesContent":["import type { SafeHtml } from 'kerfjs';\n\nimport type { CssLength } from '../../../shared/styles/css-values.js';\nimport type { CssColor } from '../../../shared/styles/css-values.js';\n\nexport type ChoiceChipsSize = 'default' | 'compact';\n\n/**\n * `chips` (default) are labeled pills; `icons` are square 36px icon-only\n * choices (an icon picker), each named by its hidden label, which is also\n * its hover title.\n */\nexport type ChoiceChipsPresentation = 'chips' | 'icons';\n\n/**\n * A leading color dot: a {@link CssColor} from `uiColor()`, `colorVar()`, or\n * `fillColor()`, or `'transparent'` for the no-color swatch (an outlined\n * dot struck through by a diagonal line).\n */\nexport type ChoiceChipsSwatch = CssColor | 'transparent';\n\nexport interface ChoiceChipsChoice<Value extends string = string> {\n value: Value;\n /** Visible label; it is also the radio's accessible name. */\n label: string;\n /** Leading color dot. Mutually exclusive with `icon`. */\n swatch?: ChoiceChipsSwatch;\n /** Decorative leading icon, normally an unsized LucideIcon. */\n icon?: SafeHtml;\n /** Supplementary tooltip; never the only place a choice is described. */\n title?: string;\n disabled?: boolean;\n}\n\ninterface ChoiceChipsCommonProps<Value extends string> {\n /**\n * Form field name: the selected value (or, with `multiple`, every selected\n * value) submits under it.\n */\n name: string;\n choices: readonly ChoiceChipsChoice<Value>[];\n /**\n * Delegated `data-action`; listen for `change`. It sits on every native\n * input, or for `multiple: true` on the group, which `wireChoiceChips`\n * fires `change` on.\n */\n action?: string;\n size?: ChoiceChipsSize;\n presentation?: ChoiceChipsPresentation;\n /**\n * Cap the group's height; past it the group scrolls (a long icon grid).\n */\n maxHeight?: CssLength;\n /** Disable the whole group. */\n disabled?: boolean;\n /** Associate the inputs with a form outside their ancestor chain. */\n form?: string;\n id?: string;\n className?: string;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\n/** One exclusive value (the default), backed by native radios. */\nexport interface ChoiceChipsSingleProps<Value extends string = string> {\n multiple?: false;\n /** The selected value. Omit (or pass `undefined`) for no selection. */\n value?: NoInfer<Value>;\n /** Require a selection for native form validation. */\n required?: boolean;\n}\n\n/**\n * Any number of values, backed by native checkboxes: each pill is its own Tab\n * stop, a click or Space toggles it alone, and every checked value submits\n * under `name`.\n */\nexport interface ChoiceChipsToggleProps<Value extends string = string> {\n multiple: 'toggle';\n /** The checked values. Omit (or pass `[]`) for none. */\n value?: readonly NoInfer<Value>[];\n /**\n * Native `required` on a checkbox demands that one box, so a toggle group\n * has no \"at least one\" requirement; validate the checked set in the app.\n */\n required?: never;\n}\n\n/**\n * Any number of values with the conventional desktop selection model, as an\n * ARIA multi-select listbox: a click selects one chip, Cmd (Apple) or Ctrl\n * (elsewhere) toggles one, and Shift extends a range. The group is one Tab\n * stop; arrows move the selection, Shift+arrows extend it, Cmd/Ctrl+arrows\n * move focus alone, Space toggles, and Cmd/Ctrl+A selects all. Hidden inputs\n * submit every selected value under `name`. Requires `wireChoiceChips`.\n */\nexport interface ChoiceChipsMultipleProps<Value extends string = string> {\n multiple: true;\n /** The selected values. Omit (or pass `[]`) for none. */\n value?: readonly NoInfer<Value>[];\n /** Validate the selected set in the app; a listbox has no native `required`. */\n required?: never;\n}\n\n/** A group is named either by a string or by a visible heading's id. */\nexport type ChoiceChipsNaming =\n { label: string; labelledBy?: never } | { labelledBy: string; label?: never };\n\nexport type ChoiceChipsProps<Value extends string = string> =\n ChoiceChipsCommonProps<Value> &\n (\n | ChoiceChipsSingleProps<Value>\n | ChoiceChipsToggleProps<Value>\n | ChoiceChipsMultipleProps<Value>\n ) &\n ChoiceChipsNaming;\n\nconst unsafeSwatch = /[;{}<>\"'\\\\]|\\p{Cc}/u;\n\nfunction swatchStyle(swatch: ChoiceChipsSwatch): string | undefined {\n if (swatch === 'transparent') return undefined;\n const color = swatch.trim();\n if (!color || unsafeSwatch.test(color))\n throw new TypeError('ChoiceChips swatch requires one CSS color value.');\n return `--_kui-choice-chips-swatch: ${color}`;\n}\n\n/** Which selection model a ChoiceChips group renders. */\nexport type ChoiceChipsSelectionMode = 'single' | 'toggle' | 'multiple';\n\n/**\n * A wrapping set of pill chips. By default it is an exclusive radio group:\n * one Tab stop, arrow-key selection, and a real form value. With\n * `multiple: 'toggle'` it is a checkbox group: each pill toggles on its own.\n * With `multiple: true` it is a multi-select listbox with modifier-key\n * selection (wire it with `wireChoiceChips`). Each choice may lead with a\n * color swatch (including a struck-through transparent swatch) or an icon.\n */\nexport function ChoiceChips<Value extends string>(\n props: ChoiceChipsProps<Value>,\n) {\n const {\n name,\n choices,\n action,\n size = 'default',\n presentation = 'chips',\n maxHeight,\n disabled = false,\n form,\n id,\n className = '',\n slot,\n label,\n labelledBy,\n } = props;\n const icons = presentation === 'icons';\n if (icons && choices.some((choice) => choice.icon === undefined))\n throw new TypeError('An icons ChoiceChips choice needs an icon.');\n const shape = {\n 'data-presentation': icons ? 'icons' : undefined,\n 'data-scrollable': maxHeight === undefined ? undefined : '',\n style:\n maxHeight === undefined\n ? undefined\n : `--_kui-choice-chips-max-height:${maxHeight}`,\n };\n const titleOf = (choice: ChoiceChipsChoice<Value>) =>\n choice.title ?? (icons ? choice.label : undefined);\n if (choices.some((choice) => choice.swatch !== undefined && choice.icon))\n throw new TypeError('A ChoiceChips choice takes a swatch or an icon.');\n const mode: ChoiceChipsSelectionMode =\n props.multiple === true\n ? 'multiple'\n : props.multiple === 'toggle'\n ? 'toggle'\n : 'single';\n const required = mode === 'single' && props.required === true;\n const checked: readonly Value[] =\n props.multiple === true || props.multiple === 'toggle'\n ? (props.value ?? [])\n : props.value === undefined\n ? []\n : [props.value];\n const content = (choice: ChoiceChipsChoice<Value>) => (\n <>\n {choice.swatch === undefined ? null : (\n <span\n class=\"kui-choice-chips__swatch\"\n data-swatch={\n choice.swatch === 'transparent' ? 'transparent' : 'color'\n }\n style={swatchStyle(choice.swatch)}\n aria-hidden=\"true\"\n />\n )}\n {choice.icon === undefined ? null : (\n <span class=\"kui-choice-chips__icon\" aria-hidden=\"true\">\n {choice.icon}\n </span>\n )}\n <span class=\"kui-choice-chips__label\">{choice.label}</span>\n </>\n );\n if (mode === 'multiple') {\n // One Tab stop: the first selected enabled chip, else the first enabled.\n const enabled = disabled\n ? []\n : choices.filter((choice) => choice.disabled !== true);\n const tabStop =\n enabled.find((choice) => checked.includes(choice.value)) ?? enabled[0];\n return (\n <div\n id={id}\n class={`kui-choice-chips ${className}`.trim()}\n data-component=\"choice-chips\"\n data-selection-mode=\"multiple\"\n data-size={size}\n {...shape}\n data-disabled={disabled ? '' : undefined}\n data-action={action}\n data-name={name}\n data-form={form}\n role=\"listbox\"\n aria-multiselectable=\"true\"\n aria-orientation=\"horizontal\"\n aria-label={label}\n aria-labelledby={labelledBy}\n aria-disabled={disabled ? 'true' : undefined}\n slot={slot}\n >\n {choices.map((choice) => {\n const unavailable = disabled || choice.disabled === true;\n return (\n <span\n class=\"kui-choice-chips__chip\"\n role=\"option\"\n tabindex={choice === tabStop ? '0' : '-1'}\n aria-selected={checked.includes(choice.value) ? 'true' : 'false'}\n aria-disabled={unavailable ? 'true' : undefined}\n data-choice-value={choice.value}\n data-disabled={unavailable ? '' : undefined}\n title={titleOf(choice)}\n >\n {content(choice)}\n </span>\n );\n })}\n {choices\n .filter((choice) => checked.includes(choice.value))\n .map((choice) => (\n <input\n class=\"kui-choice-chips__value\"\n type=\"hidden\"\n name={name}\n value={choice.value}\n form={form}\n disabled={disabled}\n />\n ))}\n </div>\n );\n }\n const multiple = mode === 'toggle';\n return (\n <div\n id={id}\n class={`kui-choice-chips ${className}`.trim()}\n data-component=\"choice-chips\"\n data-selection-mode={mode}\n data-size={size}\n {...shape}\n data-disabled={disabled ? '' : undefined}\n role={multiple ? 'group' : 'radiogroup'}\n aria-label={label}\n aria-labelledby={labelledBy}\n aria-required={required ? 'true' : undefined}\n aria-disabled={disabled ? 'true' : undefined}\n slot={slot}\n >\n {choices.map((choice) => {\n const unavailable = disabled || choice.disabled === true;\n return (\n <label\n class=\"kui-choice-chips__chip\"\n data-choice-value={choice.value}\n data-disabled={unavailable ? '' : undefined}\n title={titleOf(choice)}\n >\n <input\n class=\"kui-choice-chips__input\"\n type={multiple ? 'checkbox' : 'radio'}\n name={name}\n value={choice.value}\n checked={checked.includes(choice.value)}\n disabled={unavailable}\n required={required}\n form={form}\n data-action={action}\n />\n {content(choice)}\n </label>\n );\n })}\n </div>\n );\n}\n"]}
@@ -0,0 +1,137 @@
1
+ import { isApplePlatform, selectionGesture, applySelection } from './chunk-GXSX6Q6O.js';
2
+
3
+ // src/components/forms/choice-chips/wiring/wire-choice-chips.ts
4
+ var GROUP = '[data-component="choice-chips"][data-selection-mode="multiple"]';
5
+ var OPTION = '.kui-choice-chips__chip[role="option"]';
6
+ function optionsOf(group) {
7
+ return Array.from(group.querySelectorAll(OPTION)).filter(
8
+ (option) => option.closest(GROUP) === group
9
+ );
10
+ }
11
+ var valueOf = (option) => option.dataset.choiceValue;
12
+ var isEnabled = (option) => option.getAttribute("aria-disabled") !== "true";
13
+ function readChoiceChips(group) {
14
+ return optionsOf(group).filter((option) => option.getAttribute("aria-selected") === "true").map(valueOf);
15
+ }
16
+ function wireChoiceChips(root) {
17
+ const anchors = /* @__PURE__ */ new WeakMap();
18
+ const apple = isApplePlatform();
19
+ const moveFocus = (group, target) => {
20
+ for (const option of optionsOf(group))
21
+ option.tabIndex = option === target ? 0 : -1;
22
+ target.focus();
23
+ };
24
+ const commit = (group, next) => {
25
+ const before = readChoiceChips(group);
26
+ const options = optionsOf(group);
27
+ const keep = new Set(next);
28
+ for (const option of options)
29
+ if (!isEnabled(option) && before.includes(valueOf(option)))
30
+ keep.add(valueOf(option));
31
+ for (const option of options)
32
+ option.setAttribute(
33
+ "aria-selected",
34
+ keep.has(valueOf(option)) ? "true" : "false"
35
+ );
36
+ const after = readChoiceChips(group);
37
+ if (after.join("\0") === before.join("\0")) return;
38
+ for (const input of group.querySelectorAll(
39
+ ":scope > input.kui-choice-chips__value"
40
+ ))
41
+ input.remove();
42
+ for (const value of after) {
43
+ const input = group.ownerDocument.createElement("input");
44
+ input.className = "kui-choice-chips__value";
45
+ input.type = "hidden";
46
+ input.name = group.dataset.name ?? "";
47
+ input.value = value;
48
+ if (group.dataset.form) input.setAttribute("form", group.dataset.form);
49
+ group.append(input);
50
+ }
51
+ group.dispatchEvent(new Event("change", { bubbles: true }));
52
+ };
53
+ const select = (group, target, gesture) => {
54
+ const value = valueOf(target);
55
+ const result = applySelection({
56
+ items: optionsOf(group).filter(isEnabled).map(valueOf),
57
+ selected: readChoiceChips(group),
58
+ anchor: anchors.get(group),
59
+ target: value,
60
+ gesture
61
+ });
62
+ anchors.set(group, result.anchor);
63
+ commit(group, result.selected);
64
+ };
65
+ const locate = (event) => {
66
+ const option = event.target instanceof Element ? event.target.closest(OPTION) : null;
67
+ const group = option?.closest(GROUP);
68
+ if (!option || !group || group.getAttribute("aria-disabled") === "true")
69
+ return null;
70
+ return { option, group };
71
+ };
72
+ const click = (event) => {
73
+ const hit = locate(event);
74
+ if (!hit || !isEnabled(hit.option)) return;
75
+ moveFocus(hit.group, hit.option);
76
+ select(hit.group, hit.option, selectionGesture(event, apple));
77
+ };
78
+ const keydown = (event) => {
79
+ if (event.defaultPrevented || event.altKey) return;
80
+ const hit = locate(event);
81
+ if (!hit) return;
82
+ const { option, group } = hit;
83
+ const toggleKey = apple ? event.metaKey : event.ctrlKey;
84
+ const enabled = optionsOf(group).filter(isEnabled);
85
+ if (toggleKey && !event.shiftKey && event.key.toLowerCase() === "a") {
86
+ event.preventDefault();
87
+ commit(group, enabled.map(valueOf));
88
+ return;
89
+ }
90
+ if (event.key === " " || event.key === "Spacebar") {
91
+ event.preventDefault();
92
+ if (!isEnabled(option)) return;
93
+ select(group, option, event.shiftKey ? "extend" : "toggle");
94
+ return;
95
+ }
96
+ const rtl = group.ownerDocument.defaultView?.getComputedStyle(group).direction === "rtl";
97
+ const index = enabled.indexOf(option);
98
+ let next;
99
+ switch (event.key) {
100
+ case "ArrowDown":
101
+ next = enabled[index + 1];
102
+ break;
103
+ case "ArrowUp":
104
+ next = enabled[index - 1];
105
+ break;
106
+ case "ArrowRight":
107
+ next = enabled[index + (rtl ? -1 : 1)];
108
+ break;
109
+ case "ArrowLeft":
110
+ next = enabled[index + (rtl ? 1 : -1)];
111
+ break;
112
+ case "Home":
113
+ next = enabled[0];
114
+ break;
115
+ case "End":
116
+ next = enabled[enabled.length - 1];
117
+ break;
118
+ default:
119
+ return;
120
+ }
121
+ event.preventDefault();
122
+ if (!next) return;
123
+ moveFocus(group, next);
124
+ if (toggleKey && !event.shiftKey) return;
125
+ select(group, next, event.shiftKey ? "extend" : "replace");
126
+ };
127
+ root.addEventListener("click", click);
128
+ root.addEventListener("keydown", keydown);
129
+ return () => {
130
+ root.removeEventListener("click", click);
131
+ root.removeEventListener("keydown", keydown);
132
+ };
133
+ }
134
+
135
+ export { readChoiceChips, wireChoiceChips };
136
+
137
+ //# sourceMappingURL=chunk-K57NINLH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/forms/choice-chips/wiring/wire-choice-chips.ts"],"names":[],"mappings":"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","file":"chunk-K57NINLH.js","sourcesContent":["import {\n applySelection,\n isApplePlatform,\n type SelectionGesture,\n selectionGesture,\n} from '../../../../shared/selection/selection.js';\n\nconst GROUP = '[data-component=\"choice-chips\"][data-selection-mode=\"multiple\"]';\nconst OPTION = '.kui-choice-chips__chip[role=\"option\"]';\n\nfunction optionsOf(group: Element): HTMLElement[] {\n return Array.from(group.querySelectorAll<HTMLElement>(OPTION)).filter(\n (option) => option.closest(GROUP) === group,\n );\n}\n\nconst valueOf = (option: HTMLElement) => option.dataset.choiceValue!;\nconst isEnabled = (option: HTMLElement) =>\n option.getAttribute('aria-disabled') !== 'true';\n\n/** The selected values of a `multiple: true` ChoiceChips group, in choice order. */\nexport function readChoiceChips(group: Element): string[] {\n return optionsOf(group)\n .filter((option) => option.getAttribute('aria-selected') === 'true')\n .map(valueOf);\n}\n\n/**\n * Give every `multiple: true` ChoiceChips group under `root` its listbox\n * behavior: a click selects one chip, Cmd (Apple platforms) or Ctrl\n * (elsewhere) toggles one, and Shift extends a range from the last plain or\n * toggled chip. On the keyboard the group is one Tab stop: arrows, Home, and\n * End move the selection, Shift with them extends it, Cmd/Ctrl with them\n * moves focus alone, Space toggles the focused chip (Shift+Space extends to\n * it), and Cmd/Ctrl+A selects every chip. Disabled chips keep their state.\n * Each change updates `aria-selected` and the hidden form inputs, then fires\n * a bubbling `change` on the group, whose `data-action` is the group's\n * `action`; read the new set with `readChoiceChips`. Returns a disposer.\n */\nexport function wireChoiceChips(root: HTMLElement | Document): () => void {\n const anchors = new WeakMap<Element, string>();\n const apple = isApplePlatform();\n\n const moveFocus = (group: Element, target: HTMLElement) => {\n for (const option of optionsOf(group))\n option.tabIndex = option === target ? 0 : -1;\n target.focus();\n };\n\n const commit = (group: HTMLElement, next: readonly string[]) => {\n const before = readChoiceChips(group);\n const options = optionsOf(group);\n const keep = new Set(next);\n // A disabled chip cannot be changed by the user: it keeps its state.\n for (const option of options)\n if (!isEnabled(option) && before.includes(valueOf(option)))\n keep.add(valueOf(option));\n for (const option of options)\n option.setAttribute(\n 'aria-selected',\n keep.has(valueOf(option)) ? 'true' : 'false',\n );\n const after = readChoiceChips(group);\n if (after.join('\\u0000') === before.join('\\u0000')) return;\n for (const input of group.querySelectorAll(\n ':scope > input.kui-choice-chips__value',\n ))\n input.remove();\n for (const value of after) {\n const input = group.ownerDocument.createElement('input');\n input.className = 'kui-choice-chips__value';\n input.type = 'hidden';\n input.name = group.dataset.name ?? '';\n input.value = value;\n if (group.dataset.form) input.setAttribute('form', group.dataset.form);\n group.append(input);\n }\n group.dispatchEvent(new Event('change', { bubbles: true }));\n };\n\n const select = (\n group: HTMLElement,\n target: HTMLElement,\n gesture: SelectionGesture,\n ) => {\n const value = valueOf(target);\n const result = applySelection({\n items: optionsOf(group).filter(isEnabled).map(valueOf),\n selected: readChoiceChips(group),\n anchor: anchors.get(group),\n target: value,\n gesture,\n });\n anchors.set(group, result.anchor);\n commit(group, result.selected);\n };\n\n const locate = (event: Event) => {\n const option =\n event.target instanceof Element\n ? event.target.closest<HTMLElement>(OPTION)\n : null;\n const group = option?.closest<HTMLElement>(GROUP);\n if (!option || !group || group.getAttribute('aria-disabled') === 'true')\n return null;\n return { option, group };\n };\n\n const click = (event: Event) => {\n const hit = locate(event);\n if (!hit || !isEnabled(hit.option)) return;\n moveFocus(hit.group, hit.option);\n select(hit.group, hit.option, selectionGesture(event as MouseEvent, apple));\n };\n\n const keydown = (event: KeyboardEvent) => {\n if (event.defaultPrevented || event.altKey) return;\n const hit = locate(event);\n if (!hit) return;\n const { option, group } = hit;\n const toggleKey = apple ? event.metaKey : event.ctrlKey;\n const enabled = optionsOf(group).filter(isEnabled);\n if (toggleKey && !event.shiftKey && event.key.toLowerCase() === 'a') {\n event.preventDefault();\n commit(group, enabled.map(valueOf));\n return;\n }\n if (event.key === ' ' || event.key === 'Spacebar') {\n event.preventDefault();\n if (!isEnabled(option)) return;\n select(group, option, event.shiftKey ? 'extend' : 'toggle');\n return;\n }\n const rtl =\n group.ownerDocument.defaultView?.getComputedStyle(group).direction ===\n 'rtl';\n const index = enabled.indexOf(option);\n let next: HTMLElement | undefined;\n switch (event.key) {\n case 'ArrowDown':\n next = enabled[index + 1];\n break;\n case 'ArrowUp':\n next = enabled[index - 1];\n break;\n case 'ArrowRight':\n next = enabled[index + (rtl ? -1 : 1)];\n break;\n case 'ArrowLeft':\n next = enabled[index + (rtl ? 1 : -1)];\n break;\n case 'Home':\n next = enabled[0];\n break;\n case 'End':\n next = enabled[enabled.length - 1];\n break;\n default:\n return;\n }\n event.preventDefault();\n if (!next) return;\n moveFocus(group, next);\n if (toggleKey && !event.shiftKey) return;\n select(group, next, event.shiftKey ? 'extend' : 'replace');\n };\n\n root.addEventListener('click', click);\n root.addEventListener('keydown', keydown as EventListener);\n return () => {\n root.removeEventListener('click', click);\n root.removeEventListener('keydown', keydown as EventListener);\n };\n}\n"]}
@@ -0,0 +1,34 @@
1
+ // src/components/forms/text-field/wiring/wire-text-fields.ts
2
+ var CLEAR = "[data-text-field-clear]";
3
+ var FIELD = '[data-component="text-field"]';
4
+ var INPUT = ".kui-text-field__input";
5
+ function wireTextFields(root) {
6
+ const onClick = (event) => {
7
+ const button = event.target instanceof Element ? event.target.closest(CLEAR) : null;
8
+ const input = button?.closest(FIELD)?.querySelector(INPUT);
9
+ if (!input || input.disabled || input.readOnly) return;
10
+ event.preventDefault();
11
+ input.value = "";
12
+ input.dispatchEvent(new Event("input", { bubbles: true }));
13
+ input.dispatchEvent(new Event("change", { bubbles: true }));
14
+ input.focus();
15
+ };
16
+ const onInput = (event) => {
17
+ const input = event.target;
18
+ if (!(input instanceof HTMLInputElement || input instanceof HTMLTextAreaElement))
19
+ return;
20
+ const count = input.closest(FIELD)?.querySelector("[data-text-field-count]");
21
+ if (!count || !input.matches(INPUT)) return;
22
+ count.textContent = `${String(input.value.length)} / ${String(input.maxLength)}`;
23
+ };
24
+ root.addEventListener("click", onClick);
25
+ root.addEventListener("input", onInput);
26
+ return () => {
27
+ root.removeEventListener("click", onClick);
28
+ root.removeEventListener("input", onInput);
29
+ };
30
+ }
31
+
32
+ export { wireTextFields };
33
+
34
+ //# sourceMappingURL=chunk-KC6WUSNS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/forms/text-field/wiring/wire-text-fields.ts"],"names":[],"mappings":";AAEA,IAAM,KAAA,GAAQ,yBAAA;AACd,IAAM,KAAA,GAAQ,+BAAA;AACd,IAAM,KAAA,GAAQ,wBAAA;AAUP,SAAS,eAAe,IAAA,EAAwB;AACrD,EAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KAAiB;AAChC,IAAA,MAAM,MAAA,GACJ,MAAM,MAAA,YAAkB,OAAA,GACpB,MAAM,MAAA,CAAO,OAAA,CAA2B,KAAK,CAAA,GAC7C,IAAA;AACN,IAAA,MAAM,QAAQ,MAAA,EACV,OAAA,CAAQ,KAAK,CAAA,EACb,cAAgC,KAAK,CAAA;AACzC,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,QAAA,IAAY,MAAM,QAAA,EAAU;AAChD,IAAA,KAAA,CAAM,cAAA,EAAe;AACrB,IAAA,KAAA,CAAM,KAAA,GAAQ,EAAA;AACd,IAAA,KAAA,CAAM,aAAA,CAAc,IAAI,KAAA,CAAM,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AACzD,IAAA,KAAA,CAAM,aAAA,CAAc,IAAI,KAAA,CAAM,QAAA,EAAU,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAC1D,IAAA,KAAA,CAAM,KAAA,EAAM;AAAA,EACd,CAAA;AACA,EAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KAAiB;AAChC,IAAA,MAAM,QAAQ,KAAA,CAAM,MAAA;AACpB,IAAA,IAAI,EACF,KAAA,YAAiB,gBAAA,IAAoB,KAAA,YAAiB,mBAAA,CAAA;AAEtD,MAAA;AACF,IAAA,MAAM,QAAQ,KAAA,CACX,OAAA,CAAQ,KAAK,CAAA,EACZ,cAA2B,yBAAyB,CAAA;AACxD,IAAA,IAAI,CAAC,KAAA,IAAS,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACrC,IAAA,KAAA,CAAM,WAAA,GAAc,CAAA,EAAG,MAAA,CAAO,KAAA,CAAM,KAAA,CAAM,MAAM,CAAC,CAAA,GAAA,EAAM,MAAA,CAAO,KAAA,CAAM,SAAS,CAAC,CAAA,CAAA;AAAA,EAChF,CAAA;AACA,EAAA,IAAA,CAAK,gBAAA,CAAiB,SAAS,OAAO,CAAA;AACtC,EAAA,IAAA,CAAK,gBAAA,CAAiB,SAAS,OAAO,CAAA;AACtC,EAAA,OAAO,MAAM;AACX,IAAA,IAAA,CAAK,mBAAA,CAAoB,SAAS,OAAO,CAAA;AACzC,IAAA,IAAA,CAAK,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAAA,EAC3C,CAAA;AACF","file":"chunk-KC6WUSNS.js","sourcesContent":["type Root = HTMLElement | Document;\n\nconst CLEAR = '[data-text-field-clear]';\nconst FIELD = '[data-component=\"text-field\"]';\nconst INPUT = '.kui-text-field__input';\n\n/**\n * Make every clearable `TextField` below root clear itself: its clear button\n * empties the field, announces the change with bubbling `input` and `change`\n * events (as typing would), and returns focus to the field. The button hides\n * itself while the field is empty. A field with `showCount` keeps its\n * `count / maxLength` current as people type. Dispose with the owning\n * application.\n */\nexport function wireTextFields(root: Root): () => void {\n const onClick = (event: Event) => {\n const button =\n event.target instanceof Element\n ? event.target.closest<HTMLButtonElement>(CLEAR)\n : null;\n const input = button\n ?.closest(FIELD)\n ?.querySelector<HTMLInputElement>(INPUT);\n if (!input || input.disabled || input.readOnly) return;\n event.preventDefault();\n input.value = '';\n input.dispatchEvent(new Event('input', { bubbles: true }));\n input.dispatchEvent(new Event('change', { bubbles: true }));\n input.focus();\n };\n const onInput = (event: Event) => {\n const input = event.target;\n if (!(\n input instanceof HTMLInputElement || input instanceof HTMLTextAreaElement\n ))\n return;\n const count = input\n .closest(FIELD)\n ?.querySelector<HTMLElement>('[data-text-field-count]');\n if (!count || !input.matches(INPUT)) return;\n count.textContent = `${String(input.value.length)} / ${String(input.maxLength)}`;\n };\n root.addEventListener('click', onClick);\n root.addEventListener('input', onInput);\n return () => {\n root.removeEventListener('click', onClick);\n root.removeEventListener('input', onInput);\n };\n}\n"]}
@@ -48,6 +48,7 @@ function FileDropZone(props) {
48
48
  accessibleLabel,
49
49
  pickerId,
50
50
  disabled,
51
+ dropScope,
51
52
  className = ""
52
53
  } = props;
53
54
  return /* @__PURE__ */ jsxs(
@@ -55,6 +56,7 @@ function FileDropZone(props) {
55
56
  {
56
57
  class: `kui-file-picker ${className}`.trim(),
57
58
  "data-component": "file-drop-zone",
59
+ "data-drop-scope": dropScope,
58
60
  "data-presentation": "drop-zone",
59
61
  "data-file-picker-id": pickerId,
60
62
  "data-disabled": disabled ? "true" : void 0,
@@ -70,4 +72,4 @@ function FileDropZone(props) {
70
72
 
71
73
  export { FileDropZone, FilePickerTrigger };
72
74
 
73
- //# sourceMappingURL=chunk-W4IK7AWD.js.map
75
+ //# sourceMappingURL=chunk-KDQZ3E5C.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/forms/file-picker/file-picker.tsx"],"names":[],"mappings":";;;AA0CA,SAAS,SAAA,CAAU,OAAuB,KAAA,EAA2B;AACnE,EAAA,uBACE,GAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,MAAA;AAAA,MACL,KAAA,EAAM,wBAAA;AAAA,MACN,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,YAAA,EAAY,KAAA;AAAA,MACZ,UAAU,KAAA,CAAM;AAAA;AAAA,GAClB;AAEJ;AAQO,SAAS,kBAAkB,KAAA,EAA+B;AAC/D,EAAA,MAAM;AAAA,IACJ,KAAA;AAAA,IACA,eAAA;AAAA,IACA,IAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA,GAAY;AAAA,GACd,GAAI,KAAA;AACJ,EAAA,uBACE,IAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,CAAA,gBAAA,EAAmB,SAAS,CAAA,CAAA,CAAG,IAAA,EAAK;AAAA,MAC3C,gBAAA,EAAe,qBAAA;AAAA,MACf,mBAAA,EAAkB,SAAA;AAAA,MAClB,qBAAA,EAAqB,QAAA;AAAA,MACrB,eAAA,EAAe,WAAW,MAAA,GAAS,MAAA;AAAA,MAElC,QAAA,EAAA;AAAA,QAAA,IAAA,wBACE,MAAA,EAAA,EAAK,KAAA,EAAM,uBAAA,EAAwB,aAAA,EAAY,QAC7C,QAAA,EAAA,IAAA,EACH,CAAA;AAAA,wBAEF,GAAA,CAAC,UAAM,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,QACZ,SAAA,CAAU,OAAO,eAAe;AAAA;AAAA;AAAA,GACnC;AAEJ;AAOO,SAAS,aAAa,KAAA,EAA0B;AACrD,EAAA,MAAM;AAAA,IACJ,KAAA;AAAA,IACA,MAAA;AAAA,IACA,IAAA;AAAA,IACA,eAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA,GAAY;AAAA,GACd,GAAI,KAAA;AACJ,EAAA,uBACE,IAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,CAAA,gBAAA,EAAmB,SAAS,CAAA,CAAA,CAAG,IAAA,EAAK;AAAA,MAC3C,gBAAA,EAAe,gBAAA;AAAA,MACf,iBAAA,EAAiB,SAAA;AAAA,MACjB,mBAAA,EAAkB,WAAA;AAAA,MAClB,qBAAA,EAAqB,QAAA;AAAA,MACrB,eAAA,EAAe,WAAW,MAAA,GAAS,MAAA;AAAA,MAElC,QAAA,EAAA;AAAA,QAAA,IAAA,wBACE,MAAA,EAAA,EAAK,KAAA,EAAM,uBAAA,EAAwB,aAAA,EAAY,QAC7C,QAAA,EAAA,IAAA,EACH,CAAA;AAAA,wBAEF,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAM,wBAAA,EAA0B,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,QAC3C,MAAA,oBAAU,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAM,2BAA2B,QAAA,EAAA,MAAA,EAAO,CAAA;AAAA,QACxD,SAAA,CAAU,OAAO,eAAe;AAAA;AAAA;AAAA,GACnC;AAEJ","file":"chunk-KDQZ3E5C.js","sourcesContent":["import type { SafeHtml } from 'kerfjs';\n\ninterface FileInputProps {\n /** Accepted types, as the native `accept` attribute (`.png,image/*`). */\n accept?: string;\n /** Allow several files at once. */\n multiple?: boolean;\n /** Form field name of the native file input. */\n name?: string;\n /** Identifies this picker in `wireFilePickers` reports. */\n pickerId?: string;\n disabled?: boolean;\n className?: string;\n}\n\nexport interface FilePickerTriggerProps extends FileInputProps {\n /** Visible trigger text, such as \"Add\". */\n label: string;\n /** Accessible name of the file input when it should say more than `label`. */\n accessibleLabel?: string;\n /** Optional decorative leading icon, normally an unsized LucideIcon. */\n icon?: SafeHtml;\n}\n\nexport interface FileDropZoneProps extends FileInputProps {\n /** Primary copy, such as \"Drop attachments here or browse\". */\n title: string;\n /** Optional secondary copy, such as accepted types or a size limit. */\n detail?: string;\n /** Optional decorative icon above the copy, normally an unsized LucideIcon. */\n icon?: SafeHtml;\n /** Accessible name of the file input when it should say more than `title`. */\n accessibleLabel?: string;\n /**\n * A selector for an enclosing element (the zone's ancestor) that also\n * takes drops, such as an attachments panel: while files are dragged over\n * any part of it the zone is highlighted, and files dropped there are\n * reported for this zone (`via: 'drop'`).\n */\n dropScope?: string;\n}\n\nfunction fileInput(props: FileInputProps, label: string | undefined) {\n return (\n <input\n type=\"file\"\n class=\"kui-file-picker__input\"\n accept={props.accept}\n multiple={props.multiple}\n name={props.name}\n aria-label={label}\n disabled={props.disabled}\n />\n );\n}\n\n/**\n * A compact, link-toned trigger that opens the native file chooser: a label\n * around a visually hidden `<input type=\"file\">`, so a click or keyboard\n * activation reaches the input without script. Report choices with\n * `wireFilePickers`.\n */\nexport function FilePickerTrigger(props: FilePickerTriggerProps) {\n const {\n label,\n accessibleLabel,\n icon,\n pickerId,\n disabled,\n className = '',\n } = props;\n return (\n <label\n class={`kui-file-picker ${className}`.trim()}\n data-component=\"file-picker-trigger\"\n data-presentation=\"trigger\"\n data-file-picker-id={pickerId}\n data-disabled={disabled ? 'true' : undefined}\n >\n {icon && (\n <span class=\"kui-file-picker__icon\" aria-hidden=\"true\">\n {icon}\n </span>\n )}\n <span>{label}</span>\n {fileInput(props, accessibleLabel)}\n </label>\n );\n}\n\n/**\n * A dashed drop target that also opens the file chooser when clicked. While\n * files are dragged over it, `wireFilePickers` sets `data-dragging` and Kerf\n * highlights it; dropped and chosen files are reported the same way.\n */\nexport function FileDropZone(props: FileDropZoneProps) {\n const {\n title,\n detail,\n icon,\n accessibleLabel,\n pickerId,\n disabled,\n dropScope,\n className = '',\n } = props;\n return (\n <label\n class={`kui-file-picker ${className}`.trim()}\n data-component=\"file-drop-zone\"\n data-drop-scope={dropScope}\n data-presentation=\"drop-zone\"\n data-file-picker-id={pickerId}\n data-disabled={disabled ? 'true' : undefined}\n >\n {icon && (\n <span class=\"kui-file-picker__icon\" aria-hidden=\"true\">\n {icon}\n </span>\n )}\n <span class=\"kui-file-picker__title\">{title}</span>\n {detail && <span class=\"kui-file-picker__detail\">{detail}</span>}\n {fileInput(props, accessibleLabel)}\n </label>\n );\n}\n"]}
@@ -32,28 +32,44 @@ function wireFilePickers(root, { onFiles }) {
32
32
  input.value = "";
33
33
  };
34
34
  const zoneOf = (event) => {
35
- const zone = event.target instanceof Element ? event.target.closest(DROP_ZONE) : null;
36
- return zone && zone.dataset.disabled !== "true" ? zone : null;
35
+ const target = event.target instanceof Element ? event.target : null;
36
+ if (!target) return null;
37
+ const direct = target.closest(DROP_ZONE);
38
+ if (direct)
39
+ return direct.dataset.disabled === "true" ? null : { zone: direct, area: areaOf(direct) };
40
+ for (const zone of root.querySelectorAll(
41
+ `${DROP_ZONE}[data-drop-scope]`
42
+ )) {
43
+ const area = areaOf(zone);
44
+ if (area !== zone && area.contains(target))
45
+ return zone.dataset.disabled === "true" ? null : { zone, area };
46
+ }
47
+ return null;
48
+ };
49
+ const areaOf = (zone) => {
50
+ const scope = zone.dataset.dropScope;
51
+ return scope && zone.parentElement?.closest(scope) || zone;
37
52
  };
38
53
  const carriesFiles = (event) => [...event.dataTransfer?.types ?? []].includes("Files");
39
54
  const onDragOver = (event) => {
40
55
  const drag = event;
41
- const zone = zoneOf(drag);
42
- if (!zone || !carriesFiles(drag)) return;
56
+ const over = zoneOf(drag);
57
+ if (!over || !carriesFiles(drag)) return;
43
58
  drag.preventDefault();
44
59
  drag.dataTransfer.dropEffect = "copy";
45
- zone.dataset.dragging = "true";
60
+ over.zone.dataset.dragging = "true";
46
61
  };
47
62
  const onDragLeave = (event) => {
48
- const zone = zoneOf(event);
63
+ const over = zoneOf(event);
49
64
  const related = event.relatedTarget;
50
- if (zone && !(related instanceof Node && zone.contains(related)))
51
- delete zone.dataset.dragging;
65
+ if (over && !(related instanceof Node && over.area.contains(related)))
66
+ delete over.zone.dataset.dragging;
52
67
  };
53
68
  const onDrop = (event) => {
54
69
  const drag = event;
55
- const zone = zoneOf(drag);
56
- if (!zone) return;
70
+ const over = zoneOf(drag);
71
+ if (!over) return;
72
+ const { zone } = over;
57
73
  drag.preventDefault();
58
74
  delete zone.dataset.dragging;
59
75
  const input = inputOf(zone);
@@ -79,4 +95,4 @@ function wireFilePickers(root, { onFiles }) {
79
95
 
80
96
  export { fileMatchesAccept, wireFilePickers };
81
97
 
82
- //# sourceMappingURL=chunk-2MSPNRWJ.js.map
98
+ //# sourceMappingURL=chunk-KK3S5OTW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/forms/file-picker/wiring/wire-file-pickers.ts"],"names":[],"mappings":"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","file":"chunk-KK3S5OTW.js","sourcesContent":["type Root = HTMLElement | Document;\n\nconst PICKER =\n '[data-component=\"file-picker-trigger\"], [data-component=\"file-drop-zone\"]';\nconst DROP_ZONE = '[data-component=\"file-drop-zone\"]';\n\n/** Files a picker reported, and how they arrived. */\nexport interface FilePickerSelection {\n /** The trigger or drop zone element. */\n picker: HTMLElement;\n /** Its `pickerId`, when set. */\n id?: string;\n files: File[];\n via: 'browse' | 'drop';\n}\n\nexport interface WireFilePickersOptions {\n onFiles: (selection: FilePickerSelection) => void;\n}\n\n/** Whether a file matches a native `accept` list (`.png, image/*, text/plain`). */\nexport function fileMatchesAccept(file: File, accept: string): boolean {\n const tokens = accept\n .split(',')\n .map((token) => token.trim().toLowerCase())\n .filter(Boolean);\n if (tokens.length === 0) return true;\n const name = file.name.toLowerCase();\n const type = file.type.toLowerCase();\n return tokens.some((token) => {\n if (token.startsWith('.')) return name.endsWith(token);\n if (token.endsWith('/*')) return type.startsWith(token.slice(0, -1));\n return type === token;\n });\n}\n\nfunction pickerOf(input: HTMLInputElement): HTMLElement | null {\n return input.closest<HTMLElement>(PICKER);\n}\n\nfunction inputOf(picker: HTMLElement): HTMLInputElement | null {\n return picker.querySelector<HTMLInputElement>('input[type=\"file\"]');\n}\n\n/**\n * Report files chosen through any `FilePickerTrigger` or `FileDropZone` below\n * root, or dropped on a `FileDropZone` (or anywhere in the enclosing element\n * its `dropScope` names), and mark a zone `data-dragging` while files are\n * dragged over it or its scope. Dropped files are filtered by the input's\n * `accept` (and to one when it is not `multiple`); a disabled picker ignores\n * drops. The input is reset after each report, so choosing the same file again\n * reports again. Dispose with the owning application.\n */\nexport function wireFilePickers(\n root: Root,\n { onFiles }: WireFilePickersOptions,\n): () => void {\n const report = (\n picker: HTMLElement,\n files: File[],\n via: FilePickerSelection['via'],\n ) => {\n if (files.length === 0) return;\n onFiles({ picker, id: picker.dataset.filePickerId, files, via });\n };\n const onChange = (event: Event) => {\n const input = event.target;\n if (!(input instanceof HTMLInputElement) || input.type !== 'file') return;\n const picker = pickerOf(input);\n if (!picker) return;\n // A file input always has a FileList.\n report(picker, [...input.files!], 'browse');\n input.value = '';\n };\n // The zone a drag event targets, and the area that counts as over it: the\n // zone itself, or the enclosing element its `dropScope` names.\n const zoneOf = (\n event: Event,\n ): { zone: HTMLElement; area: HTMLElement } | null => {\n const target = event.target instanceof Element ? event.target : null;\n if (!target) return null;\n const direct = target.closest<HTMLElement>(DROP_ZONE);\n if (direct)\n return direct.dataset.disabled === 'true'\n ? null\n : { zone: direct, area: areaOf(direct) };\n for (const zone of root.querySelectorAll<HTMLElement>(\n `${DROP_ZONE}[data-drop-scope]`,\n )) {\n const area = areaOf(zone);\n if (area !== zone && area.contains(target))\n return zone.dataset.disabled === 'true' ? null : { zone, area };\n }\n return null;\n };\n const areaOf = (zone: HTMLElement): HTMLElement => {\n const scope = zone.dataset.dropScope;\n return (scope && zone.parentElement?.closest<HTMLElement>(scope)) || zone;\n };\n const carriesFiles = (event: DragEvent) =>\n [...(event.dataTransfer?.types ?? [])].includes('Files');\n const onDragOver = (event: Event) => {\n const drag = event as DragEvent;\n const over = zoneOf(drag);\n if (!over || !carriesFiles(drag)) return;\n drag.preventDefault();\n // carriesFiles guarantees a DataTransfer.\n drag.dataTransfer!.dropEffect = 'copy';\n over.zone.dataset.dragging = 'true';\n };\n const onDragLeave = (event: Event) => {\n const over = zoneOf(event);\n const related = (event as DragEvent).relatedTarget;\n if (over && !(related instanceof Node && over.area.contains(related)))\n delete over.zone.dataset.dragging;\n };\n const onDrop = (event: Event) => {\n const drag = event as DragEvent;\n const over = zoneOf(drag);\n if (!over) return;\n const { zone } = over;\n drag.preventDefault();\n delete zone.dataset.dragging;\n const input = inputOf(zone);\n let files = [...(drag.dataTransfer?.files ?? [])];\n if (input?.accept)\n files = files.filter((file) => fileMatchesAccept(file, input.accept));\n if (input && !input.multiple) files = files.slice(0, 1);\n report(zone, files, 'drop');\n };\n root.addEventListener('change', onChange);\n root.addEventListener('dragenter', onDragOver);\n root.addEventListener('dragover', onDragOver);\n root.addEventListener('dragleave', onDragLeave);\n root.addEventListener('drop', onDrop);\n return () => {\n root.removeEventListener('change', onChange);\n root.removeEventListener('dragenter', onDragOver);\n root.removeEventListener('dragover', onDragOver);\n root.removeEventListener('dragleave', onDragLeave);\n root.removeEventListener('drop', onDrop);\n };\n}\n"]}