@vielzeug/refine 1.8.0 → 2.0.0

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 (809) hide show
  1. package/README.md +5 -12
  2. package/dist/_dev.cjs +1 -1
  3. package/dist/_dev.cjs.map +1 -1
  4. package/dist/_dev.js +2 -5
  5. package/dist/_dev.js.map +1 -1
  6. package/dist/_virtual/_rolldown/runtime.cjs +1 -1
  7. package/dist/accordion-item.cjs +26 -24
  8. package/dist/accordion-item.cjs.map +1 -1
  9. package/dist/accordion-item.js +53 -51
  10. package/dist/accordion-item.js.map +1 -1
  11. package/dist/accordion.cjs +3 -1
  12. package/dist/accordion.cjs.map +1 -1
  13. package/dist/accordion.js +5 -3
  14. package/dist/accordion.js.map +1 -1
  15. package/dist/alert.cjs +1 -1
  16. package/dist/alert.cjs.map +1 -1
  17. package/dist/alert.js +1 -1
  18. package/dist/alert.js.map +1 -1
  19. package/dist/async.cjs +4 -2
  20. package/dist/async.cjs.map +1 -1
  21. package/dist/async.js +4 -2
  22. package/dist/async.js.map +1 -1
  23. package/dist/avatar-group.cjs +7 -0
  24. package/dist/avatar-group.cjs.map +1 -0
  25. package/dist/avatar-group.js +34 -0
  26. package/dist/avatar-group.js.map +1 -0
  27. package/dist/avatar.cjs +21 -16
  28. package/dist/avatar.cjs.map +1 -1
  29. package/dist/avatar.js +38 -54
  30. package/dist/avatar.js.map +1 -1
  31. package/dist/badge.cjs +4 -2
  32. package/dist/badge.cjs.map +1 -1
  33. package/dist/badge.js +6 -4
  34. package/dist/badge.js.map +1 -1
  35. package/dist/box.cjs +3 -1
  36. package/dist/box.cjs.map +1 -1
  37. package/dist/box.js +24 -18
  38. package/dist/box.js.map +1 -1
  39. package/dist/breadcrumb.cjs +4 -4
  40. package/dist/breadcrumb.cjs.map +1 -1
  41. package/dist/breadcrumb.js +4 -4
  42. package/dist/breadcrumb.js.map +1 -1
  43. package/dist/button-group.cjs +3 -3
  44. package/dist/button-group.cjs.map +1 -1
  45. package/dist/button-group.js +18 -16
  46. package/dist/button-group.js.map +1 -1
  47. package/dist/button.cjs +16 -12
  48. package/dist/button.cjs.map +1 -1
  49. package/dist/button.js +31 -28
  50. package/dist/button.js.map +1 -1
  51. package/dist/calendar.cjs +94 -69
  52. package/dist/calendar.cjs.map +1 -1
  53. package/dist/calendar.js +131 -98
  54. package/dist/calendar.js.map +1 -1
  55. package/dist/card.cjs +7 -7
  56. package/dist/card.cjs.map +1 -1
  57. package/dist/card.js +53 -49
  58. package/dist/card.js.map +1 -1
  59. package/dist/carousel.cjs +65 -57
  60. package/dist/carousel.cjs.map +1 -1
  61. package/dist/carousel.js +157 -201
  62. package/dist/carousel.js.map +1 -1
  63. package/dist/chat-message.cjs +21 -19
  64. package/dist/chat-message.cjs.map +1 -1
  65. package/dist/chat-message.js +18 -15
  66. package/dist/chat-message.js.map +1 -1
  67. package/dist/checkbox-group.cjs +12 -10
  68. package/dist/checkbox-group.cjs.map +1 -1
  69. package/dist/checkbox-group.js +75 -76
  70. package/dist/checkbox-group.js.map +1 -1
  71. package/dist/checkbox.cjs +4 -4
  72. package/dist/checkbox.cjs.map +1 -1
  73. package/dist/checkbox.js +55 -55
  74. package/dist/checkbox.js.map +1 -1
  75. package/dist/chip.cjs +22 -20
  76. package/dist/chip.cjs.map +1 -1
  77. package/dist/chip.js +15 -12
  78. package/dist/chip.js.map +1 -1
  79. package/dist/code-window.cjs +8 -2
  80. package/dist/code-window.cjs.map +1 -1
  81. package/dist/code-window.js +8 -2
  82. package/dist/code-window.js.map +1 -1
  83. package/dist/combobox.cjs +63 -58
  84. package/dist/combobox.cjs.map +1 -1
  85. package/dist/combobox.js +199 -197
  86. package/dist/combobox.js.map +1 -1
  87. package/dist/command-palette.cjs +49 -29
  88. package/dist/command-palette.cjs.map +1 -1
  89. package/dist/command-palette.js +150 -118
  90. package/dist/command-palette.js.map +1 -1
  91. package/dist/content/avatar/avatar-group.d.ts +33 -0
  92. package/dist/content/avatar/avatar-group.d.ts.map +1 -0
  93. package/dist/content/avatar/avatar.d.ts +0 -32
  94. package/dist/content/avatar/avatar.d.ts.map +1 -1
  95. package/dist/content/card/card.css.cjs +1 -1
  96. package/dist/content/card/card.css.cjs.map +1 -1
  97. package/dist/content/card/card.css.js +1 -1
  98. package/dist/content/card/card.css.js.map +1 -1
  99. package/dist/content/card/card.d.ts.map +1 -1
  100. package/dist/content/carousel/carousel-slide.cjs +3 -1
  101. package/dist/content/carousel/carousel-slide.cjs.map +1 -1
  102. package/dist/content/carousel/carousel-slide.css.cjs +1 -1
  103. package/dist/content/carousel/carousel-slide.css.cjs.map +1 -1
  104. package/dist/content/carousel/carousel-slide.css.js +1 -1
  105. package/dist/content/carousel/carousel-slide.css.js.map +1 -1
  106. package/dist/content/carousel/carousel-slide.js +3 -1
  107. package/dist/content/carousel/carousel-slide.js.map +1 -1
  108. package/dist/content/carousel/carousel.css.cjs +1 -1
  109. package/dist/content/carousel/carousel.css.cjs.map +1 -1
  110. package/dist/content/carousel/carousel.css.js +1 -1
  111. package/dist/content/carousel/carousel.css.js.map +1 -1
  112. package/dist/content/carousel/carousel.d.ts +5 -19
  113. package/dist/content/carousel/carousel.d.ts.map +1 -1
  114. package/dist/content/chat-message/chat-message.d.ts.map +1 -1
  115. package/dist/content/index.d.ts +10 -2
  116. package/dist/content/index.d.ts.map +1 -1
  117. package/dist/content/list/_list-item-reveal.cjs +1 -1
  118. package/dist/content/list/_list-item-reveal.cjs.map +1 -1
  119. package/dist/content/list/_list-item-reveal.d.ts +2 -2
  120. package/dist/content/list/_list-item-reveal.d.ts.map +1 -1
  121. package/dist/content/list/_list-item-reveal.js +2 -2
  122. package/dist/content/list/_list-item-reveal.js.map +1 -1
  123. package/dist/content/list/list.d.ts.map +1 -1
  124. package/dist/content/marquee/index.d.ts +2 -0
  125. package/dist/content/marquee/index.d.ts.map +1 -0
  126. package/dist/content/marquee/marquee.css.cjs +2 -0
  127. package/dist/content/marquee/marquee.css.cjs.map +1 -0
  128. package/dist/content/marquee/marquee.css.js +6 -0
  129. package/dist/content/marquee/marquee.css.js.map +1 -0
  130. package/dist/content/marquee/marquee.d.ts +44 -0
  131. package/dist/content/marquee/marquee.d.ts.map +1 -0
  132. package/dist/content/stepper/_is-step-navigable.cjs +2 -0
  133. package/dist/content/stepper/_is-step-navigable.cjs.map +1 -0
  134. package/dist/content/stepper/_is-step-navigable.d.ts +14 -0
  135. package/dist/content/stepper/_is-step-navigable.d.ts.map +1 -0
  136. package/dist/content/stepper/_is-step-navigable.js +8 -0
  137. package/dist/content/stepper/_is-step-navigable.js.map +1 -0
  138. package/dist/content/stepper/step.css.cjs +2 -0
  139. package/dist/content/stepper/step.css.cjs.map +1 -0
  140. package/dist/content/stepper/step.css.js +6 -0
  141. package/dist/content/stepper/step.css.js.map +1 -0
  142. package/dist/content/stepper/step.d.ts +63 -0
  143. package/dist/content/stepper/step.d.ts.map +1 -0
  144. package/dist/content/stepper/stepper.css.cjs +2 -0
  145. package/dist/content/stepper/stepper.css.cjs.map +1 -0
  146. package/dist/content/stepper/stepper.css.js +6 -0
  147. package/dist/content/stepper/stepper.css.js.map +1 -0
  148. package/dist/content/stepper/stepper.d.ts +88 -0
  149. package/dist/content/stepper/stepper.d.ts.map +1 -0
  150. package/dist/copy-command.cjs +9 -3
  151. package/dist/copy-command.cjs.map +1 -1
  152. package/dist/copy-command.js +9 -3
  153. package/dist/copy-command.js.map +1 -1
  154. package/dist/{headless → core}/_internal.d.ts +3 -5
  155. package/dist/core/_internal.d.ts.map +1 -0
  156. package/dist/core/announcer.cjs.map +1 -0
  157. package/dist/core/announcer.d.ts.map +1 -0
  158. package/dist/{headless → core}/announcer.js +1 -1
  159. package/dist/core/announcer.js.map +1 -0
  160. package/dist/core/aria-reflection.cjs.map +1 -0
  161. package/dist/core/aria-reflection.d.ts.map +1 -0
  162. package/dist/{headless → core}/aria-reflection.js +1 -1
  163. package/dist/core/aria-reflection.js.map +1 -0
  164. package/dist/core/auto-resize.cjs.map +1 -0
  165. package/dist/core/auto-resize.d.ts.map +1 -0
  166. package/dist/{headless → core}/auto-resize.js +1 -1
  167. package/dist/core/auto-resize.js.map +1 -0
  168. package/dist/core/checkable.cjs.map +1 -0
  169. package/dist/core/checkable.d.ts.map +1 -0
  170. package/dist/{headless → core}/checkable.js +1 -1
  171. package/dist/core/checkable.js.map +1 -0
  172. package/dist/core/choice-field.cjs +2 -0
  173. package/dist/core/choice-field.cjs.map +1 -0
  174. package/dist/core/choice-field.d.ts.map +1 -0
  175. package/dist/{headless → core}/choice-field.js +3 -2
  176. package/dist/core/choice-field.js.map +1 -0
  177. package/dist/core/composer.cjs.map +1 -0
  178. package/dist/core/composer.d.ts.map +1 -0
  179. package/dist/{headless → core}/composer.js +1 -1
  180. package/dist/core/composer.js.map +1 -0
  181. package/dist/{headless → core}/date-picker.cjs +1 -1
  182. package/dist/core/date-picker.cjs.map +1 -0
  183. package/dist/core/date-picker.d.ts.map +1 -0
  184. package/dist/{headless → core}/date-picker.js +3 -3
  185. package/dist/core/date-picker.js.map +1 -0
  186. package/dist/core/direction.cjs.map +1 -0
  187. package/dist/core/direction.d.ts.map +1 -0
  188. package/dist/{headless → core}/direction.js +1 -1
  189. package/dist/core/direction.js.map +1 -0
  190. package/dist/core/field-base.cjs +2 -0
  191. package/dist/core/field-base.cjs.map +1 -0
  192. package/dist/{headless → core}/field-base.d.ts +3 -3
  193. package/dist/core/field-base.d.ts.map +1 -0
  194. package/dist/core/field-base.js +66 -0
  195. package/dist/core/field-base.js.map +1 -0
  196. package/dist/core/focus.cjs.map +1 -0
  197. package/dist/core/focus.d.ts.map +1 -0
  198. package/dist/{headless → core}/focus.js +1 -1
  199. package/dist/core/focus.js.map +1 -0
  200. package/dist/{headless → core}/index.d.ts +7 -6
  201. package/dist/core/index.d.ts.map +1 -0
  202. package/dist/{headless → core}/keyboard.cjs +1 -1
  203. package/dist/core/keyboard.cjs.map +1 -0
  204. package/dist/core/keyboard.d.ts.map +1 -0
  205. package/dist/{headless → core}/keyboard.js +2 -2
  206. package/dist/core/keyboard.js.map +1 -0
  207. package/dist/core/light-dom.cjs.map +1 -0
  208. package/dist/core/light-dom.d.ts.map +1 -0
  209. package/dist/{headless → core}/light-dom.js +1 -1
  210. package/dist/core/light-dom.js.map +1 -0
  211. package/dist/core/nav.cjs.map +1 -0
  212. package/dist/core/nav.d.ts.map +1 -0
  213. package/dist/{headless → core}/nav.js +1 -1
  214. package/dist/core/nav.js.map +1 -0
  215. package/dist/core/numbers.cjs.map +1 -0
  216. package/dist/core/numbers.d.ts.map +1 -0
  217. package/dist/{headless → core}/numbers.js +1 -1
  218. package/dist/core/numbers.js.map +1 -0
  219. package/dist/core/option-list.cjs +2 -0
  220. package/dist/core/option-list.cjs.map +1 -0
  221. package/dist/core/option-list.d.ts +49 -0
  222. package/dist/core/option-list.d.ts.map +1 -0
  223. package/dist/core/option-list.js +65 -0
  224. package/dist/core/option-list.js.map +1 -0
  225. package/dist/core/ore.cjs.map +1 -0
  226. package/dist/{headless → core}/ore.d.ts +2 -2
  227. package/dist/core/ore.d.ts.map +1 -0
  228. package/dist/{headless → core}/ore.js +1 -1
  229. package/dist/core/ore.js.map +1 -0
  230. package/dist/core/overlay.cjs +2 -0
  231. package/dist/core/overlay.cjs.map +1 -0
  232. package/dist/core/overlay.d.ts +41 -0
  233. package/dist/core/overlay.d.ts.map +1 -0
  234. package/dist/core/overlay.js +17 -0
  235. package/dist/core/overlay.js.map +1 -0
  236. package/dist/core/paginated-list.d.ts.map +1 -0
  237. package/dist/core/parse.cjs.map +1 -0
  238. package/dist/core/parse.d.ts.map +1 -0
  239. package/dist/{headless → core}/parse.js +1 -1
  240. package/dist/core/parse.js.map +1 -0
  241. package/dist/core/positioner.cjs +2 -0
  242. package/dist/core/positioner.cjs.map +1 -0
  243. package/dist/core/positioner.d.ts.map +1 -0
  244. package/dist/{headless → core}/positioner.js +7 -7
  245. package/dist/core/positioner.js.map +1 -0
  246. package/dist/core/ref-callback.cjs +2 -0
  247. package/dist/core/ref-callback.cjs.map +1 -0
  248. package/dist/core/ref-callback.d.ts.map +1 -0
  249. package/dist/{headless → core}/ref-callback.js +2 -2
  250. package/dist/core/ref-callback.js.map +1 -0
  251. package/dist/core/signals.cjs +2 -0
  252. package/dist/core/signals.cjs.map +1 -0
  253. package/dist/core/signals.d.ts.map +1 -0
  254. package/dist/{headless → core}/signals.js +3 -2
  255. package/dist/core/signals.js.map +1 -0
  256. package/dist/core/slider.cjs +2 -0
  257. package/dist/core/slider.cjs.map +1 -0
  258. package/dist/core/slider.d.ts.map +1 -0
  259. package/dist/{headless → core}/slider.js +3 -3
  260. package/dist/{headless/slider.cjs.map → core/slider.js.map} +1 -1
  261. package/dist/core/spinner.cjs +2 -0
  262. package/dist/core/spinner.cjs.map +1 -0
  263. package/dist/core/spinner.d.ts.map +1 -0
  264. package/dist/{headless → core}/spinner.js +3 -3
  265. package/dist/{headless/spinner.cjs.map → core/spinner.js.map} +1 -1
  266. package/dist/core/swipe.cjs.map +1 -0
  267. package/dist/core/swipe.d.ts.map +1 -0
  268. package/dist/{headless → core}/swipe.js +1 -1
  269. package/dist/core/swipe.js.map +1 -0
  270. package/dist/core/text-field.cjs.map +1 -0
  271. package/dist/core/text-field.d.ts.map +1 -0
  272. package/dist/{headless → core}/text-field.js +1 -1
  273. package/dist/core/text-field.js.map +1 -0
  274. package/dist/core/typeahead.cjs.map +1 -0
  275. package/dist/core/typeahead.d.ts.map +1 -0
  276. package/dist/{headless → core}/typeahead.js +1 -1
  277. package/dist/core/typeahead.js.map +1 -0
  278. package/dist/custom-elements.json +5079 -4595
  279. package/dist/datagrid.cjs +320 -271
  280. package/dist/datagrid.cjs.map +1 -1
  281. package/dist/datagrid.js +483 -429
  282. package/dist/datagrid.js.map +1 -1
  283. package/dist/date-picker.cjs +77 -62
  284. package/dist/date-picker.cjs.map +1 -1
  285. package/dist/date-picker.js +169 -146
  286. package/dist/date-picker.js.map +1 -1
  287. package/dist/dialog.cjs +3 -3
  288. package/dist/dialog.cjs.map +1 -1
  289. package/dist/dialog.js +18 -7
  290. package/dist/dialog.js.map +1 -1
  291. package/dist/disclosure/tabs/tabs.d.ts.map +1 -1
  292. package/dist/drawer.cjs +5 -5
  293. package/dist/drawer.cjs.map +1 -1
  294. package/dist/drawer.js +52 -47
  295. package/dist/drawer.js.map +1 -1
  296. package/dist/errors.cjs.map +1 -1
  297. package/dist/errors.js.map +1 -1
  298. package/dist/feedback/chip/chip.d.ts.map +1 -1
  299. package/dist/feedback/skeleton/skeleton.d.ts.map +1 -1
  300. package/dist/feedback/toast/index.d.ts +1 -1
  301. package/dist/feedback/toast/index.d.ts.map +1 -1
  302. package/dist/feedback/toast/toast.d.ts +16 -68
  303. package/dist/feedback/toast/toast.d.ts.map +1 -1
  304. package/dist/feedback/typing-indicator/typing-indicator.d.ts +1 -1
  305. package/dist/file-input.cjs +111 -78
  306. package/dist/file-input.cjs.map +1 -1
  307. package/dist/file-input.js +220 -183
  308. package/dist/file-input.js.map +1 -1
  309. package/dist/grid-item.cjs +3 -1
  310. package/dist/grid-item.cjs.map +1 -1
  311. package/dist/grid-item.js +3 -1
  312. package/dist/grid-item.js.map +1 -1
  313. package/dist/grid.cjs +3 -1
  314. package/dist/grid.cjs.map +1 -1
  315. package/dist/grid.js +6 -5
  316. package/dist/grid.js.map +1 -1
  317. package/dist/icon.cjs +5 -1
  318. package/dist/icon.cjs.map +1 -1
  319. package/dist/icon.js +50 -46
  320. package/dist/icon.js.map +1 -1
  321. package/dist/index.cjs +1 -1
  322. package/dist/index.d.ts +7 -8
  323. package/dist/index.d.ts.map +1 -1
  324. package/dist/index.js +2 -67
  325. package/dist/input.cjs +44 -40
  326. package/dist/input.cjs.map +1 -1
  327. package/dist/input.js +132 -130
  328. package/dist/input.js.map +1 -1
  329. package/dist/inputs/button-group/button-group.css.cjs +1 -1
  330. package/dist/inputs/button-group/button-group.css.cjs.map +1 -1
  331. package/dist/inputs/button-group/button-group.css.js +1 -1
  332. package/dist/inputs/button-group/button-group.css.js.map +1 -1
  333. package/dist/inputs/button-group/button-group.d.ts +6 -3
  334. package/dist/inputs/button-group/button-group.d.ts.map +1 -1
  335. package/dist/inputs/checkbox/checkbox.d.ts +6 -5
  336. package/dist/inputs/checkbox/checkbox.d.ts.map +1 -1
  337. package/dist/inputs/checkbox-group/checkbox-group.d.ts +1 -1
  338. package/dist/inputs/checkbox-group/checkbox-group.d.ts.map +1 -1
  339. package/dist/inputs/combobox/combobox.d.ts +4 -2
  340. package/dist/inputs/combobox/combobox.d.ts.map +1 -1
  341. package/dist/inputs/combobox/combobox.types.d.ts +5 -7
  342. package/dist/inputs/combobox/combobox.types.d.ts.map +1 -1
  343. package/dist/inputs/datagrid/datagrid-column.cjs +1 -1
  344. package/dist/inputs/datagrid/datagrid-column.cjs.map +1 -1
  345. package/dist/inputs/datagrid/datagrid-column.d.ts +1 -1
  346. package/dist/inputs/datagrid/datagrid-column.d.ts.map +1 -1
  347. package/dist/inputs/datagrid/datagrid-column.js +5 -5
  348. package/dist/inputs/datagrid/datagrid-column.js.map +1 -1
  349. package/dist/inputs/datagrid/datagrid-model.cjs +2 -0
  350. package/dist/inputs/datagrid/datagrid-model.cjs.map +1 -0
  351. package/dist/inputs/datagrid/datagrid-model.d.ts +101 -0
  352. package/dist/inputs/datagrid/datagrid-model.d.ts.map +1 -0
  353. package/dist/inputs/datagrid/datagrid-model.js +202 -0
  354. package/dist/inputs/datagrid/datagrid-model.js.map +1 -0
  355. package/dist/inputs/datagrid/datagrid-nav.cjs.map +1 -1
  356. package/dist/inputs/datagrid/datagrid.d.ts +44 -45
  357. package/dist/inputs/datagrid/datagrid.d.ts.map +1 -1
  358. package/dist/inputs/date-picker/date-picker.d.ts +4 -4
  359. package/dist/inputs/date-picker/date-picker.d.ts.map +1 -1
  360. package/dist/inputs/file-input/file-input-upload.cjs +1 -1
  361. package/dist/inputs/file-input/file-input-upload.cjs.map +1 -1
  362. package/dist/inputs/file-input/file-input-upload.d.ts.map +1 -1
  363. package/dist/inputs/file-input/file-input-upload.js +6 -3
  364. package/dist/inputs/file-input/file-input-upload.js.map +1 -1
  365. package/dist/inputs/file-input/file-input.d.ts.map +1 -1
  366. package/dist/inputs/index.d.ts +0 -4
  367. package/dist/inputs/index.d.ts.map +1 -1
  368. package/dist/inputs/input/input.d.ts +4 -10
  369. package/dist/inputs/input/input.d.ts.map +1 -1
  370. package/dist/inputs/message-composer/message-composer.d.ts +6 -10
  371. package/dist/inputs/message-composer/message-composer.d.ts.map +1 -1
  372. package/dist/inputs/number-input/number-input.d.ts +4 -10
  373. package/dist/inputs/number-input/number-input.d.ts.map +1 -1
  374. package/dist/inputs/otp-input/otp-input.d.ts +4 -6
  375. package/dist/inputs/otp-input/otp-input.d.ts.map +1 -1
  376. package/dist/inputs/radio/radio.d.ts +4 -3
  377. package/dist/inputs/radio/radio.d.ts.map +1 -1
  378. package/dist/inputs/radio-group/radio-group.d.ts +1 -1
  379. package/dist/inputs/radio-group/radio-group.d.ts.map +1 -1
  380. package/dist/inputs/rating/rating.d.ts +4 -5
  381. package/dist/inputs/rating/rating.d.ts.map +1 -1
  382. package/dist/inputs/select/select.d.ts +7 -9
  383. package/dist/inputs/select/select.d.ts.map +1 -1
  384. package/dist/inputs/shared/field-binding.cjs.map +1 -1
  385. package/dist/inputs/shared/field-binding.d.ts +1 -1
  386. package/dist/inputs/shared/field-binding.js.map +1 -1
  387. package/dist/inputs/shared/index.d.ts +0 -1
  388. package/dist/inputs/shared/index.d.ts.map +1 -1
  389. package/dist/inputs/shared/native-field-event.cjs +2 -0
  390. package/dist/inputs/shared/native-field-event.cjs.map +1 -0
  391. package/dist/inputs/shared/native-field-event.d.ts +6 -0
  392. package/dist/inputs/shared/native-field-event.d.ts.map +1 -0
  393. package/dist/inputs/shared/native-field-event.js +29 -0
  394. package/dist/inputs/shared/native-field-event.js.map +1 -0
  395. package/dist/inputs/shared/templates.cjs +18 -12
  396. package/dist/inputs/shared/templates.cjs.map +1 -1
  397. package/dist/inputs/shared/templates.d.ts +1 -1
  398. package/dist/inputs/shared/templates.d.ts.map +1 -1
  399. package/dist/inputs/shared/templates.js +19 -13
  400. package/dist/inputs/shared/templates.js.map +1 -1
  401. package/dist/inputs/slider/slider.css.cjs +1 -1
  402. package/dist/inputs/slider/slider.css.cjs.map +1 -1
  403. package/dist/inputs/slider/slider.css.js +1 -1
  404. package/dist/inputs/slider/slider.css.js.map +1 -1
  405. package/dist/inputs/slider/slider.d.ts +7 -10
  406. package/dist/inputs/slider/slider.d.ts.map +1 -1
  407. package/dist/inputs/switch/switch.d.ts +4 -3
  408. package/dist/inputs/switch/switch.d.ts.map +1 -1
  409. package/dist/inputs/textarea/textarea.d.ts +4 -10
  410. package/dist/inputs/textarea/textarea.d.ts.map +1 -1
  411. package/dist/inputs/time-picker/time-picker.d.ts +4 -4
  412. package/dist/inputs/time-picker/time-picker.d.ts.map +1 -1
  413. package/dist/layout/box/box.d.ts.map +1 -1
  414. package/dist/layout/navbar/navbar.css.cjs +1 -1
  415. package/dist/layout/navbar/navbar.css.cjs.map +1 -1
  416. package/dist/layout/navbar/navbar.css.js +1 -1
  417. package/dist/layout/navbar/navbar.css.js.map +1 -1
  418. package/dist/layout/navbar/navbar.d.ts +10 -0
  419. package/dist/layout/navbar/navbar.d.ts.map +1 -1
  420. package/dist/layout/sidebar/sidebar-item.css.cjs +1 -1
  421. package/dist/layout/sidebar/sidebar-item.css.cjs.map +1 -1
  422. package/dist/layout/sidebar/sidebar-item.css.js +1 -1
  423. package/dist/layout/sidebar/sidebar-item.css.js.map +1 -1
  424. package/dist/layout/sidebar/sidebar.css.cjs +1 -1
  425. package/dist/layout/sidebar/sidebar.css.cjs.map +1 -1
  426. package/dist/layout/sidebar/sidebar.css.js +1 -1
  427. package/dist/layout/sidebar/sidebar.css.js.map +1 -1
  428. package/dist/layout/sidebar/sidebar.d.ts.map +1 -1
  429. package/dist/list-item.cjs +2 -2
  430. package/dist/list-item.cjs.map +1 -1
  431. package/dist/list-item.js +4 -4
  432. package/dist/list-item.js.map +1 -1
  433. package/dist/list.cjs +3 -1
  434. package/dist/list.cjs.map +1 -1
  435. package/dist/list.js +28 -25
  436. package/dist/list.js.map +1 -1
  437. package/dist/marquee.cjs +32 -0
  438. package/dist/marquee.cjs.map +1 -0
  439. package/dist/marquee.js +93 -0
  440. package/dist/marquee.js.map +1 -0
  441. package/dist/menu.cjs +7 -7
  442. package/dist/menu.cjs.map +1 -1
  443. package/dist/menu.js +135 -103
  444. package/dist/menu.js.map +1 -1
  445. package/dist/message-composer.cjs +33 -31
  446. package/dist/message-composer.cjs.map +1 -1
  447. package/dist/message-composer.js +123 -123
  448. package/dist/message-composer.js.map +1 -1
  449. package/dist/navbar.cjs +17 -15
  450. package/dist/navbar.cjs.map +1 -1
  451. package/dist/navbar.js +108 -89
  452. package/dist/navbar.js.map +1 -1
  453. package/dist/number-input.cjs +19 -19
  454. package/dist/number-input.cjs.map +1 -1
  455. package/dist/number-input.js +94 -97
  456. package/dist/number-input.js.map +1 -1
  457. package/dist/otp-input.cjs +15 -13
  458. package/dist/otp-input.cjs.map +1 -1
  459. package/dist/otp-input.js +83 -82
  460. package/dist/otp-input.js.map +1 -1
  461. package/dist/overlay/command-palette/command-palette.d.ts +2 -2
  462. package/dist/overlay/command-palette/command-palette.d.ts.map +1 -1
  463. package/dist/overlay/command-palette/command-palette.types.d.ts +4 -5
  464. package/dist/overlay/command-palette/command-palette.types.d.ts.map +1 -1
  465. package/dist/overlay/dialog/dialog.d.ts +7 -6
  466. package/dist/overlay/dialog/dialog.d.ts.map +1 -1
  467. package/dist/overlay/drawer/drawer.d.ts +7 -10
  468. package/dist/overlay/drawer/drawer.d.ts.map +1 -1
  469. package/dist/overlay/index.d.ts +1 -1
  470. package/dist/overlay/index.d.ts.map +1 -1
  471. package/dist/overlay/menu/menu.d.ts +9 -7
  472. package/dist/overlay/menu/menu.d.ts.map +1 -1
  473. package/dist/overlay/popover/popover.d.ts +6 -11
  474. package/dist/overlay/popover/popover.d.ts.map +1 -1
  475. package/dist/overlay/shared/await-exit.cjs +1 -1
  476. package/dist/overlay/shared/await-exit.cjs.map +1 -1
  477. package/dist/overlay/shared/await-exit.js +1 -1
  478. package/dist/overlay/shared/await-exit.js.map +1 -1
  479. package/dist/overlay/shared/use-dialog.cjs +1 -1
  480. package/dist/overlay/shared/use-dialog.cjs.map +1 -1
  481. package/dist/overlay/shared/use-dialog.d.ts +13 -3
  482. package/dist/overlay/shared/use-dialog.d.ts.map +1 -1
  483. package/dist/overlay/shared/use-dialog.js +80 -72
  484. package/dist/overlay/shared/use-dialog.js.map +1 -1
  485. package/dist/overlay/shared/use-floating-trigger.cjs +1 -1
  486. package/dist/overlay/shared/use-floating-trigger.cjs.map +1 -1
  487. package/dist/overlay/shared/use-floating-trigger.d.ts +3 -1
  488. package/dist/overlay/shared/use-floating-trigger.d.ts.map +1 -1
  489. package/dist/overlay/shared/use-floating-trigger.js +64 -70
  490. package/dist/overlay/shared/use-floating-trigger.js.map +1 -1
  491. package/dist/overlay/tooltip/tooltip.d.ts +9 -0
  492. package/dist/overlay/tooltip/tooltip.d.ts.map +1 -1
  493. package/dist/pagination.cjs +69 -55
  494. package/dist/pagination.cjs.map +1 -1
  495. package/dist/pagination.js +70 -56
  496. package/dist/pagination.js.map +1 -1
  497. package/dist/password-strength.cjs +6 -4
  498. package/dist/password-strength.cjs.map +1 -1
  499. package/dist/password-strength.js +6 -4
  500. package/dist/password-strength.js.map +1 -1
  501. package/dist/popover.cjs +4 -4
  502. package/dist/popover.cjs.map +1 -1
  503. package/dist/popover.js +28 -17
  504. package/dist/popover.js.map +1 -1
  505. package/dist/progress.cjs +25 -17
  506. package/dist/progress.cjs.map +1 -1
  507. package/dist/progress.js +26 -18
  508. package/dist/progress.js.map +1 -1
  509. package/dist/radio-group.cjs +14 -12
  510. package/dist/radio-group.cjs.map +1 -1
  511. package/dist/radio-group.js +88 -89
  512. package/dist/radio-group.js.map +1 -1
  513. package/dist/radio.cjs +4 -4
  514. package/dist/radio.cjs.map +1 -1
  515. package/dist/radio.js +90 -90
  516. package/dist/radio.js.map +1 -1
  517. package/dist/rating.cjs +18 -16
  518. package/dist/rating.cjs.map +1 -1
  519. package/dist/rating.js +69 -69
  520. package/dist/rating.js.map +1 -1
  521. package/dist/refine.cjs +1669 -1324
  522. package/dist/refine.cjs.map +1 -1
  523. package/dist/refine.iife.js +1656 -1311
  524. package/dist/refine.iife.js.map +1 -1
  525. package/dist/refine.js +1759 -1414
  526. package/dist/refine.js.map +1 -1
  527. package/dist/register.d.ts +21 -0
  528. package/dist/register.d.ts.map +1 -0
  529. package/dist/select.cjs +59 -51
  530. package/dist/select.cjs.map +1 -1
  531. package/dist/select.js +189 -182
  532. package/dist/select.js.map +1 -1
  533. package/dist/separator.cjs +9 -9
  534. package/dist/separator.cjs.map +1 -1
  535. package/dist/separator.js +9 -9
  536. package/dist/separator.js.map +1 -1
  537. package/dist/shared/index.d.ts +1 -1
  538. package/dist/shared/prop-bundles.cjs +1 -1
  539. package/dist/shared/prop-bundles.cjs.map +1 -1
  540. package/dist/shared/prop-bundles.js +4 -2
  541. package/dist/shared/prop-bundles.js.map +1 -1
  542. package/dist/shared/size-presets.cjs +1 -1
  543. package/dist/shared/size-presets.cjs.map +1 -1
  544. package/dist/shared/size-presets.d.ts +3 -0
  545. package/dist/shared/size-presets.d.ts.map +1 -1
  546. package/dist/shared/size-presets.js +4 -1
  547. package/dist/shared/size-presets.js.map +1 -1
  548. package/dist/sidebar.cjs +8 -8
  549. package/dist/sidebar.cjs.map +1 -1
  550. package/dist/sidebar.js +25 -25
  551. package/dist/sidebar.js.map +1 -1
  552. package/dist/skeleton.cjs +4 -6
  553. package/dist/skeleton.cjs.map +1 -1
  554. package/dist/skeleton.js +21 -22
  555. package/dist/skeleton.js.map +1 -1
  556. package/dist/slider.cjs +14 -14
  557. package/dist/slider.cjs.map +1 -1
  558. package/dist/slider.js +160 -168
  559. package/dist/slider.js.map +1 -1
  560. package/dist/step.cjs +47 -0
  561. package/dist/step.cjs.map +1 -0
  562. package/dist/step.js +127 -0
  563. package/dist/step.js.map +1 -0
  564. package/dist/stepper.cjs +8 -0
  565. package/dist/stepper.cjs.map +1 -0
  566. package/dist/stepper.js +101 -0
  567. package/dist/stepper.js.map +1 -0
  568. package/dist/styles/index.d.ts +0 -28
  569. package/dist/styles/index.d.ts.map +1 -1
  570. package/dist/styles/mixins/shape.css.cjs +2 -2
  571. package/dist/styles/mixins/shape.css.cjs.map +1 -1
  572. package/dist/styles/mixins/shape.css.js +6 -6
  573. package/dist/styles/mixins/shape.css.js.map +1 -1
  574. package/dist/styles/tokens.css +4 -0
  575. package/dist/switch.cjs +4 -4
  576. package/dist/switch.cjs.map +1 -1
  577. package/dist/switch.js +44 -44
  578. package/dist/switch.js.map +1 -1
  579. package/dist/tab-item.cjs +3 -3
  580. package/dist/tab-item.cjs.map +1 -1
  581. package/dist/tab-item.js +24 -24
  582. package/dist/tab-item.js.map +1 -1
  583. package/dist/tab-panel.cjs +7 -5
  584. package/dist/tab-panel.cjs.map +1 -1
  585. package/dist/tab-panel.js +14 -12
  586. package/dist/tab-panel.js.map +1 -1
  587. package/dist/table.cjs +3 -1
  588. package/dist/table.cjs.map +1 -1
  589. package/dist/table.js +3 -1
  590. package/dist/table.js.map +1 -1
  591. package/dist/tabs.cjs +6 -6
  592. package/dist/tabs.cjs.map +1 -1
  593. package/dist/tabs.js +30 -29
  594. package/dist/tabs.js.map +1 -1
  595. package/dist/text.cjs +3 -1
  596. package/dist/text.cjs.map +1 -1
  597. package/dist/text.js +3 -1
  598. package/dist/text.js.map +1 -1
  599. package/dist/textarea.cjs +22 -22
  600. package/dist/textarea.cjs.map +1 -1
  601. package/dist/textarea.js +110 -112
  602. package/dist/textarea.js.map +1 -1
  603. package/dist/time-picker.cjs +69 -61
  604. package/dist/time-picker.cjs.map +1 -1
  605. package/dist/time-picker.js +146 -132
  606. package/dist/time-picker.js.map +1 -1
  607. package/dist/toast.cjs +22 -22
  608. package/dist/toast.cjs.map +1 -1
  609. package/dist/toast.js +280 -173
  610. package/dist/toast.js.map +1 -1
  611. package/dist/tooltip.cjs +5 -5
  612. package/dist/tooltip.cjs.map +1 -1
  613. package/dist/tooltip.js +61 -51
  614. package/dist/tooltip.js.map +1 -1
  615. package/dist/typing-indicator.cjs +1 -1
  616. package/dist/typing-indicator.cjs.map +1 -1
  617. package/dist/typing-indicator.js +5 -5
  618. package/dist/typing-indicator.js.map +1 -1
  619. package/dist/utils/link.cjs.map +1 -1
  620. package/dist/utils/link.d.ts +2 -2
  621. package/package.json +35 -117
  622. package/dist/form.cjs +0 -11
  623. package/dist/form.cjs.map +0 -1
  624. package/dist/form.js +0 -59
  625. package/dist/form.js.map +0 -1
  626. package/dist/headless/_internal.d.ts.map +0 -1
  627. package/dist/headless/announcer.cjs.map +0 -1
  628. package/dist/headless/announcer.d.ts.map +0 -1
  629. package/dist/headless/announcer.js.map +0 -1
  630. package/dist/headless/aria-reflection.cjs.map +0 -1
  631. package/dist/headless/aria-reflection.d.ts.map +0 -1
  632. package/dist/headless/aria-reflection.js.map +0 -1
  633. package/dist/headless/auto-resize.cjs.map +0 -1
  634. package/dist/headless/auto-resize.d.ts.map +0 -1
  635. package/dist/headless/auto-resize.js.map +0 -1
  636. package/dist/headless/checkable.cjs.map +0 -1
  637. package/dist/headless/checkable.d.ts.map +0 -1
  638. package/dist/headless/checkable.js.map +0 -1
  639. package/dist/headless/choice-field.cjs +0 -2
  640. package/dist/headless/choice-field.cjs.map +0 -1
  641. package/dist/headless/choice-field.d.ts.map +0 -1
  642. package/dist/headless/choice-field.js.map +0 -1
  643. package/dist/headless/composer.cjs.map +0 -1
  644. package/dist/headless/composer.d.ts.map +0 -1
  645. package/dist/headless/composer.js.map +0 -1
  646. package/dist/headless/datagrid.cjs +0 -2
  647. package/dist/headless/datagrid.cjs.map +0 -1
  648. package/dist/headless/datagrid.d.ts +0 -158
  649. package/dist/headless/datagrid.d.ts.map +0 -1
  650. package/dist/headless/datagrid.js +0 -55
  651. package/dist/headless/datagrid.js.map +0 -1
  652. package/dist/headless/date-picker.cjs.map +0 -1
  653. package/dist/headless/date-picker.d.ts.map +0 -1
  654. package/dist/headless/date-picker.js.map +0 -1
  655. package/dist/headless/direction.cjs.map +0 -1
  656. package/dist/headless/direction.d.ts.map +0 -1
  657. package/dist/headless/direction.js.map +0 -1
  658. package/dist/headless/field-base.cjs +0 -2
  659. package/dist/headless/field-base.cjs.map +0 -1
  660. package/dist/headless/field-base.d.ts.map +0 -1
  661. package/dist/headless/field-base.js +0 -72
  662. package/dist/headless/field-base.js.map +0 -1
  663. package/dist/headless/focus.cjs.map +0 -1
  664. package/dist/headless/focus.d.ts.map +0 -1
  665. package/dist/headless/focus.js.map +0 -1
  666. package/dist/headless/index.d.ts.map +0 -1
  667. package/dist/headless/keyboard.cjs.map +0 -1
  668. package/dist/headless/keyboard.d.ts.map +0 -1
  669. package/dist/headless/keyboard.js.map +0 -1
  670. package/dist/headless/light-dom.cjs.map +0 -1
  671. package/dist/headless/light-dom.d.ts.map +0 -1
  672. package/dist/headless/light-dom.js.map +0 -1
  673. package/dist/headless/nav.cjs.map +0 -1
  674. package/dist/headless/nav.d.ts.map +0 -1
  675. package/dist/headless/nav.js.map +0 -1
  676. package/dist/headless/numbers.cjs.map +0 -1
  677. package/dist/headless/numbers.d.ts.map +0 -1
  678. package/dist/headless/numbers.js.map +0 -1
  679. package/dist/headless/option-list.cjs +0 -2
  680. package/dist/headless/option-list.cjs.map +0 -1
  681. package/dist/headless/option-list.d.ts +0 -107
  682. package/dist/headless/option-list.d.ts.map +0 -1
  683. package/dist/headless/option-list.js +0 -66
  684. package/dist/headless/option-list.js.map +0 -1
  685. package/dist/headless/ore.cjs.map +0 -1
  686. package/dist/headless/ore.d.ts.map +0 -1
  687. package/dist/headless/ore.js.map +0 -1
  688. package/dist/headless/overlay.cjs +0 -2
  689. package/dist/headless/overlay.cjs.map +0 -1
  690. package/dist/headless/overlay.d.ts +0 -64
  691. package/dist/headless/overlay.d.ts.map +0 -1
  692. package/dist/headless/overlay.js +0 -32
  693. package/dist/headless/overlay.js.map +0 -1
  694. package/dist/headless/paginated-list.cjs +0 -2
  695. package/dist/headless/paginated-list.cjs.map +0 -1
  696. package/dist/headless/paginated-list.d.ts.map +0 -1
  697. package/dist/headless/paginated-list.js +0 -34
  698. package/dist/headless/paginated-list.js.map +0 -1
  699. package/dist/headless/parse.cjs.map +0 -1
  700. package/dist/headless/parse.d.ts.map +0 -1
  701. package/dist/headless/parse.js.map +0 -1
  702. package/dist/headless/positioner.cjs +0 -2
  703. package/dist/headless/positioner.cjs.map +0 -1
  704. package/dist/headless/positioner.d.ts.map +0 -1
  705. package/dist/headless/positioner.js.map +0 -1
  706. package/dist/headless/ref-callback.cjs +0 -2
  707. package/dist/headless/ref-callback.cjs.map +0 -1
  708. package/dist/headless/ref-callback.d.ts.map +0 -1
  709. package/dist/headless/ref-callback.js.map +0 -1
  710. package/dist/headless/selection-control.cjs +0 -2
  711. package/dist/headless/selection-control.cjs.map +0 -1
  712. package/dist/headless/selection-control.d.ts +0 -30
  713. package/dist/headless/selection-control.d.ts.map +0 -1
  714. package/dist/headless/selection-control.js +0 -44
  715. package/dist/headless/selection-control.js.map +0 -1
  716. package/dist/headless/signals.cjs +0 -2
  717. package/dist/headless/signals.cjs.map +0 -1
  718. package/dist/headless/signals.d.ts.map +0 -1
  719. package/dist/headless/signals.js.map +0 -1
  720. package/dist/headless/slider.cjs +0 -2
  721. package/dist/headless/slider.d.ts.map +0 -1
  722. package/dist/headless/slider.js.map +0 -1
  723. package/dist/headless/sort-control.cjs +0 -2
  724. package/dist/headless/sort-control.cjs.map +0 -1
  725. package/dist/headless/sort-control.d.ts +0 -22
  726. package/dist/headless/sort-control.d.ts.map +0 -1
  727. package/dist/headless/sort-control.js +0 -36
  728. package/dist/headless/sort-control.js.map +0 -1
  729. package/dist/headless/spinner.cjs +0 -2
  730. package/dist/headless/spinner.d.ts.map +0 -1
  731. package/dist/headless/spinner.js.map +0 -1
  732. package/dist/headless/swipe.cjs.map +0 -1
  733. package/dist/headless/swipe.d.ts.map +0 -1
  734. package/dist/headless/swipe.js.map +0 -1
  735. package/dist/headless/text-field.cjs.map +0 -1
  736. package/dist/headless/text-field.d.ts.map +0 -1
  737. package/dist/headless/text-field.js.map +0 -1
  738. package/dist/headless/typeahead.cjs.map +0 -1
  739. package/dist/headless/typeahead.d.ts.map +0 -1
  740. package/dist/headless/typeahead.js.map +0 -1
  741. package/dist/headless.cjs +0 -1
  742. package/dist/headless.js +0 -30
  743. package/dist/inputs/datagrid/datagrid-controls.cjs +0 -2
  744. package/dist/inputs/datagrid/datagrid-controls.cjs.map +0 -1
  745. package/dist/inputs/datagrid/datagrid-controls.d.ts +0 -98
  746. package/dist/inputs/datagrid/datagrid-controls.d.ts.map +0 -1
  747. package/dist/inputs/datagrid/datagrid-controls.js +0 -147
  748. package/dist/inputs/datagrid/datagrid-controls.js.map +0 -1
  749. package/dist/inputs/form/form.css.cjs +0 -2
  750. package/dist/inputs/form/form.css.cjs.map +0 -1
  751. package/dist/inputs/form/form.css.js +0 -6
  752. package/dist/inputs/form/form.css.js.map +0 -1
  753. package/dist/inputs/form/form.d.ts +0 -59
  754. package/dist/inputs/form/form.d.ts.map +0 -1
  755. package/dist/inputs/shared/form-context.cjs +0 -2
  756. package/dist/inputs/shared/form-context.cjs.map +0 -1
  757. package/dist/inputs/shared/form-context.d.ts +0 -55
  758. package/dist/inputs/shared/form-context.d.ts.map +0 -1
  759. package/dist/inputs/shared/form-context.js +0 -15
  760. package/dist/inputs/shared/form-context.js.map +0 -1
  761. package/dist/styles/index.cjs +0 -2
  762. package/dist/styles/index.cjs.map +0 -1
  763. package/dist/styles/index.js +0 -25
  764. package/dist/styles/index.js.map +0 -1
  765. package/dist/styles/styles.css +0 -5
  766. package/dist/testing/index.d.ts +0 -188
  767. package/dist/testing/index.d.ts.map +0 -1
  768. package/dist/testing.cjs +0 -2
  769. package/dist/testing.cjs.map +0 -1
  770. package/dist/testing.js +0 -26
  771. package/dist/testing.js.map +0 -1
  772. /package/dist/{headless → core}/announcer.cjs +0 -0
  773. /package/dist/{headless → core}/announcer.d.ts +0 -0
  774. /package/dist/{headless → core}/aria-reflection.cjs +0 -0
  775. /package/dist/{headless → core}/aria-reflection.d.ts +0 -0
  776. /package/dist/{headless → core}/auto-resize.cjs +0 -0
  777. /package/dist/{headless → core}/auto-resize.d.ts +0 -0
  778. /package/dist/{headless → core}/checkable.cjs +0 -0
  779. /package/dist/{headless → core}/checkable.d.ts +0 -0
  780. /package/dist/{headless → core}/choice-field.d.ts +0 -0
  781. /package/dist/{headless → core}/composer.cjs +0 -0
  782. /package/dist/{headless → core}/composer.d.ts +0 -0
  783. /package/dist/{headless → core}/date-picker.d.ts +0 -0
  784. /package/dist/{headless → core}/direction.cjs +0 -0
  785. /package/dist/{headless → core}/direction.d.ts +0 -0
  786. /package/dist/{headless → core}/focus.cjs +0 -0
  787. /package/dist/{headless → core}/focus.d.ts +0 -0
  788. /package/dist/{headless → core}/keyboard.d.ts +0 -0
  789. /package/dist/{headless → core}/light-dom.cjs +0 -0
  790. /package/dist/{headless → core}/light-dom.d.ts +0 -0
  791. /package/dist/{headless → core}/nav.cjs +0 -0
  792. /package/dist/{headless → core}/nav.d.ts +0 -0
  793. /package/dist/{headless → core}/numbers.cjs +0 -0
  794. /package/dist/{headless → core}/numbers.d.ts +0 -0
  795. /package/dist/{headless → core}/ore.cjs +0 -0
  796. /package/dist/{headless → core}/paginated-list.d.ts +0 -0
  797. /package/dist/{headless → core}/parse.cjs +0 -0
  798. /package/dist/{headless → core}/parse.d.ts +0 -0
  799. /package/dist/{headless → core}/positioner.d.ts +0 -0
  800. /package/dist/{headless → core}/ref-callback.d.ts +0 -0
  801. /package/dist/{headless → core}/signals.d.ts +0 -0
  802. /package/dist/{headless → core}/slider.d.ts +0 -0
  803. /package/dist/{headless → core}/spinner.d.ts +0 -0
  804. /package/dist/{headless → core}/swipe.cjs +0 -0
  805. /package/dist/{headless → core}/swipe.d.ts +0 -0
  806. /package/dist/{headless → core}/text-field.cjs +0 -0
  807. /package/dist/{headless → core}/text-field.d.ts +0 -0
  808. /package/dist/{headless → core}/typeahead.cjs +0 -0
  809. /package/dist/{headless → core}/typeahead.d.ts +0 -0
@@ -1,47 +1,49 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./styles/mixins/accessibility.css.cjs"),t=require("./headless/announcer.cjs"),n=require("./content/chat-message/chat-message.css.cjs");let r=require("@vielzeug/ore"),i=require("@vielzeug/ripple");var a={assistant:`Assistant`,system:`System`,user:`You`},o=`ore-chat-message`;(0,r.define)(o,{props:{error:r.prop.string(),name:r.prop.string(),sender:r.prop.oneOf([`user`,`assistant`,`system`],`assistant`),status:r.prop.string(),streaming:r.prop.bool(!1),timestamp:r.prop.string()},setup(e){let n=(0,r.useEmit)(),o=(0,r.useSlots)(),s=()=>a[e.sender.value??`assistant`],c=(0,i.computed)(()=>`Message from ${e.name.value||s()}`),l=(0,i.computed)(()=>{let t=e.timestamp.value;if(!t)return``;let n=new Date(t);return Number.isNaN(n.getTime())?``:new Intl.DateTimeFormat(void 0,{hour:`numeric`,minute:`2-digit`}).format(n)}),u=(0,i.computed)(()=>!!l.value||!!e.status.value||!!e.error.value);(0,i.watch)(()=>e.status.value===`error`?e.error.value??``:null,e=>{e!==null&&t.announce(`Message failed to send${e?`: ${e}`:``}`,{politeness:`assertive`})});function d(e){n(`retry`,{originalEvent:e})}let f=(0,r.ref)();function p(){let e=f.value?.assignedNodes({flatten:!0});if(!(!e||e.length===0)){for(let t of e){if(t.nodeType!==Node.TEXT_NODE)break;let e=(t.textContent??``).replace(/^\s+/,``);if(t.textContent=e,e!==``)break}for(let t=e.length-1;t>=0;t--){let n=e[t];if(n.nodeType!==Node.TEXT_NODE)break;let r=(n.textContent??``).replace(/\s+$/,``);if(n.textContent=r,r!==``)break}}}return(0,r.onMounted)(()=>{p();let e=f.value;e&&(0,r.onEvent)(e,`slotchange`,p)}),r.html`
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./styles/mixins/accessibility.css.cjs"),t=require("./core/announcer.cjs"),n=require("./content/chat-message/chat-message.css.cjs");let r=require("@vielzeug/ore"),i=require("@vielzeug/ripple"),a=require("@vielzeug/ripple/watch");var o={assistant:`Assistant`,system:`System`,user:`You`},s=`ore-chat-message`;(0,r.define)(s,{props:{error:r.prop.string(),name:r.prop.string(),sender:r.prop.oneOf([`user`,`assistant`,`system`],`assistant`),status:r.prop.string(),streaming:r.prop.bool(!1),timestamp:r.prop.string()},setup(e){let n=(0,r.useEmit)(),s=(0,r.useSlots)(),c=()=>o[e.sender.value??`assistant`],l=(0,i.computed)(()=>`Message from ${e.name.value||c()}`),u=(0,i.computed)(()=>{let t=e.timestamp.value;if(!t)return``;let n=new Date(t);return Number.isNaN(n.getTime())?``:new Intl.DateTimeFormat(void 0,{hour:`numeric`,minute:`2-digit`}).format(n)}),d=(0,i.computed)(()=>!!u.value||!!e.status.value||!!e.error.value);(0,a.watch)(()=>e.status.value===`error`?e.error.value??``:null,e=>{e!==null&&t.announce(`Message failed to send${e?`: ${e}`:``}`,{politeness:`assertive`})});function f(e){n(`retry`,{originalEvent:e})}let p=(0,r.ref)();function m(){let e=p.value?.assignedNodes({flatten:!0});if(!(!e||e.length===0)){for(let t of e){if(t.nodeType!==Node.TEXT_NODE)break;let e=(t.textContent??``).replace(/^\s+/,``);if(t.textContent=e,e!==``)break}for(let t=e.length-1;t>=0;t--){let n=e[t];if(n.nodeType!==Node.TEXT_NODE)break;let r=(n.textContent??``).replace(/\s+$/,``);if(n.textContent=r,r!==``)break}}}return(0,r.onMounted)(()=>{m();let e=p.value;e&&(0,r.onEvent)(e,`slotchange`,m)}),r.html`
2
2
  <div class="row" part="row">
3
- <span class="avatar" part="avatar" ?hidden="${()=>!o.has(`avatar`).value}">
3
+ <span class="avatar" part="avatar" ?hidden="${()=>!s.has(`avatar`).value}">
4
4
  <slot name="avatar"></slot>
5
5
  </span>
6
6
  <div class="column" part="column">
7
7
  <span class="name" part="name" ?hidden="${()=>!e.name.value}">${e.name}</span>
8
- <div class="bubble" part="bubble" role="article" aria-label="${c}">
8
+ <div class="bubble" part="bubble" role="article" aria-label="${l}">
9
9
  <div class="content" part="content">
10
- <slot class="content-slot" ref="${f}"></slot>
10
+ <slot class="content-slot" ref="${p}"></slot>
11
11
  <span class="cursor" part="cursor" aria-hidden="true" ?hidden="${()=>!e.streaming.value}"></span>
12
12
  </div>
13
13
  </div>
14
- <div class="meta" part="meta" ?hidden="${()=>!u.value}">
14
+ <div class="meta" part="meta" ?hidden="${()=>!d.value}">
15
15
  <time
16
16
  class="timestamp"
17
17
  part="timestamp"
18
18
  datetime="${e.timestamp}"
19
- ?hidden="${()=>!l.value}"
20
- >${l}</time
21
- >
19
+ ?hidden="${()=>!u.value}">
20
+ ${u}
21
+ </time>
22
22
  <span class="status" part="status" data-status="${e.status}" ?hidden="${()=>!e.status.value}">
23
- ${()=>{switch(e.status.value){case`error`:return r.html`<ore-icon
24
- name="alert-circle"
25
- size="12"
26
- stroke-width="2.5"
27
- aria-hidden="true"></ore-icon>`;case`sending`:return r.html`<span class="spinner" aria-hidden="true"></span>`;case`sent`:return r.html`<ore-icon name="check" size="12" stroke-width="2.5" aria-hidden="true"></ore-icon>`;default:return``}}}
23
+ ${()=>{switch(e.status.value){case`error`:return r.html`
24
+ <ore-icon name="alert-circle" size="12" stroke-width="2.5" aria-hidden="true"></ore-icon>
25
+ `;case`sending`:return r.html`
26
+ <span class="spinner" aria-hidden="true"></span>
27
+ `;case`sent`:return r.html`
28
+ <ore-icon name="check" size="12" stroke-width="2.5" aria-hidden="true"></ore-icon>
29
+ `;default:return``}}}
30
+ </span>
31
+ <span class="error-text" part="error" role="alert" ?hidden="${()=>!e.error.value}">
32
+ ${e.error}
28
33
  </span>
29
- <span class="error-text" part="error" role="alert" ?hidden="${()=>!e.error.value}"
30
- >${e.error}</span
31
- >
32
34
  <button
33
35
  class="retry"
34
36
  part="retry"
35
37
  type="button"
36
38
  ?hidden="${()=>e.status.value!==`error`}"
37
- @click="${d}">
39
+ @click="${f}">
38
40
  Retry
39
41
  </button>
40
42
  </div>
41
- <div class="actions" part="actions" ?hidden="${()=>!o.has(`actions`).value}">
43
+ <div class="actions" part="actions" ?hidden="${()=>!s.has(`actions`).value}">
42
44
  <slot name="actions"></slot>
43
45
  </div>
44
46
  </div>
45
47
  </div>
46
- `},styles:[e.reducedMotionMixin,n.default]}),exports.CHAT_MESSAGE_TAG=o;
48
+ `},styles:[e.reducedMotionMixin,n.default]}),exports.CHAT_MESSAGE_TAG=s;
47
49
  //# sourceMappingURL=chat-message.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"chat-message.cjs","names":[],"sources":["../src/content/chat-message/chat-message.ts"],"sourcesContent":["import { define, html, onEvent, onMounted, prop, ref, useEmit, useSlots } from '@vielzeug/ore';\nimport { computed, watch } from '@vielzeug/ripple';\n\nimport { announce } from '../../headless';\nimport { reducedMotionMixin } from '../../styles';\nimport '../icon/icon';\nimport componentStyles from './chat-message.css?inline';\n\nexport type ChatMessageSender = 'assistant' | 'system' | 'user';\nexport type ChatMessageStatus = 'error' | 'sending' | 'sent';\n\nconst SENDER_LABELS: Record<ChatMessageSender, string> = {\n assistant: 'Assistant',\n system: 'System',\n user: 'You',\n};\n\n/** Events emitted by the chat-message component */\nexport type OreChatMessageEvents = {\n /** Fired when the retry action is activated on a `status=\"error\"` message */\n retry: { originalEvent?: Event };\n};\n\n/** Chat message component properties */\nexport type OreChatMessageProps = {\n /** Error detail shown beneath the bubble; only visible when `status=\"error\"` */\n error?: string;\n /** Display name shown above the bubble (falls back to a generic label per `sender`) */\n name?: string;\n /** Who sent the message — controls alignment and bubble styling */\n sender?: ChatMessageSender;\n /** Delivery status for outgoing messages — shows an inline indicator and, for `\"error\"`, a retry action */\n status?: ChatMessageStatus;\n /** Append a blinking cursor after the content, for a message still streaming in */\n streaming?: boolean;\n /** ISO 8601 timestamp; rendered as a localized short time in a semantic `<time>` element */\n timestamp?: string;\n};\n\n/**\n * A single message bubble for chat/conversation UIs — sender-aware alignment, an optional\n * avatar slot, delivery status (sending/sent/error with retry), and a streaming cursor for\n * assistant messages still generating. Content is provided via the default slot, so any\n * markdown-to-HTML rendering stays the consumer's choice.\n *\n * The default slot's leading/trailing whitespace-only text nodes are trimmed in place once\n * per slot assignment (mount, and again on `slotchange`) — pretty-printed HTML's\n * indentation would otherwise render as blank lines, since the bubble preserves line breaks\n * (`white-space: pre-wrap`) for genuine multi-paragraph replies. This mutates those specific\n * text nodes' `textContent` directly; it never touches nodes appended afterward (e.g. by\n * `el.textContent += token` while streaming), only the ones present at assignment time.\n *\n * @element ore-chat-message\n *\n * @attr {string} sender - Who sent the message: 'user' | 'assistant' | 'system' (default 'assistant')\n * @attr {string} name - Display name shown above the bubble\n * @attr {string} timestamp - ISO 8601 timestamp, rendered as a localized short time\n * @attr {string} status - Delivery status: 'sending' | 'sent' | 'error'\n * @attr {string} error - Error detail shown beneath the bubble when status=\"error\"\n * @attr {boolean} streaming - Append a blinking cursor after the content\n *\n * @fires retry - Fired when the retry action is activated. detail: { originalEvent }\n *\n * @slot - Message content\n * @slot avatar - Avatar element (e.g. `<ore-avatar>`)\n * @slot actions - Action buttons shown beneath the message (copy, regenerate, feedback, …)\n *\n * @cssprop --chat-message-bg - Bubble background color (assistant/system)\n * @cssprop --chat-message-color - Bubble text color (assistant/system)\n * @cssprop --chat-message-user-bg - Bubble background color (user)\n * @cssprop --chat-message-user-color - Bubble text color (user)\n * @cssprop --chat-message-radius - Bubble border radius\n * @cssprop --chat-message-max-width - Maximum bubble width\n *\n * @part row - Root row container (avatar + column)\n * @part avatar - Avatar slot container\n * @part column - Column containing name, bubble, meta, and actions\n * @part name - Sender display name\n * @part bubble - Message bubble container\n * @part content - Content container inside the bubble\n * @part cursor - Blinking streaming cursor\n * @part meta - Row of timestamp, status, and error text below the bubble\n * @part timestamp - Timestamp `<time>` element\n * @part status - Status indicator\n * @part error - Error text\n * @part retry - Retry button (status=\"error\" only)\n * @part actions - Actions slot container\n *\n * @example\n * ```html\n * <ore-chat-message sender=\"user\" timestamp=\"2024-01-01T12:00:00Z\" status=\"sent\">\n * What's the weather like today?\n * </ore-chat-message>\n *\n * <ore-chat-message sender=\"assistant\" name=\"Assistant\" streaming>\n * Let me check that for you\n * </ore-chat-message>\n * ```\n */\nexport const CHAT_MESSAGE_TAG = 'ore-chat-message' as const;\ndefine<OreChatMessageProps>(CHAT_MESSAGE_TAG, {\n props: {\n error: prop.string(),\n name: prop.string(),\n sender: prop.oneOf(['user', 'assistant', 'system'] as const, 'assistant'),\n status: prop.string<ChatMessageStatus>(),\n streaming: prop.bool(false),\n timestamp: prop.string(),\n },\n setup(props) {\n const emit = useEmit<OreChatMessageEvents>();\n const slots = useSlots();\n\n const senderLabel = () => SENDER_LABELS[props.sender.value ?? 'assistant'];\n\n const bubbleLabel = computed(() => `Message from ${props.name.value || senderLabel()}`);\n\n const formattedTime = computed(() => {\n const raw = props.timestamp.value;\n\n if (!raw) return '';\n\n const date = new Date(raw);\n\n if (Number.isNaN(date.getTime())) return '';\n\n return new Intl.DateTimeFormat(undefined, { hour: 'numeric', minute: '2-digit' }).format(date);\n });\n\n const hasMeta = computed(\n () => Boolean(formattedTime.value) || Boolean(props.status.value) || Boolean(props.error.value),\n );\n\n // Announce delivery failures — the visible retry button and error text are always present\n // for sighted users, but a failed send is exactly the kind of state change a screen\n // reader user could otherwise miss entirely. Keyed on `error` text too (not just\n // `status`) so a retry that fails again with a *different* reason re-announces even\n // though `status` never left `\"error\"` in between; a second failure with the identical\n // message doesn't re-fire, since the source value hasn't actually changed.\n watch(\n () => (props.status.value === 'error' ? (props.error.value ?? '') : null),\n (errorText) => {\n if (errorText !== null) {\n announce(`Message failed to send${errorText ? `: ${errorText}` : ''}`, { politeness: 'assertive' });\n }\n },\n );\n\n function handleRetry(e: Event): void {\n emit('retry', { originalEvent: e });\n }\n\n // ── Trim author-time indentation whitespace from the default slot ──\n // `.content` uses `white-space: pre-wrap` so genuine multi-paragraph replies keep their\n // line breaks — but that also preserves the leading/trailing newline + indentation from\n // pretty-printed HTML (`<ore-chat-message>\\n Hello\\n</ore-chat-message>`), rendering as\n // visible blank lines around the text. Trim only the outermost edges once per slot\n // assignment; appending tokens to an existing text node for streaming doesn't re-fire\n // `slotchange`, so this never interferes with in-progress streaming updates.\n //\n // A named-slotted sibling (e.g. `<ore-avatar slot=\"avatar\">` between the opening tag and\n // the message text) splits the default slot's light-DOM text into *multiple* text nodes\n // — text nodes can't target a named slot, so each run on either side of the element is\n // assigned separately. The \"real\" content can start on a later node than index 0 (it's\n // still preceded by its own leading indentation), so this walks inward from each end,\n // fully clearing whitespace-only nodes and stopping at the first node with real content\n // on each side — rather than only touching the very first/last assigned node.\n const contentSlotRef = ref<HTMLSlotElement>();\n\n function trimSlotEdgeWhitespace(): void {\n const nodes = contentSlotRef.value?.assignedNodes({ flatten: true });\n\n if (!nodes || nodes.length === 0) return;\n\n for (const node of nodes) {\n if (node.nodeType !== Node.TEXT_NODE) break;\n\n const trimmed = (node.textContent ?? '').replace(/^\\s+/, '');\n\n node.textContent = trimmed;\n\n if (trimmed !== '') break;\n }\n\n for (let i = nodes.length - 1; i >= 0; i--) {\n const node = nodes[i];\n\n if (node.nodeType !== Node.TEXT_NODE) break;\n\n const trimmed = (node.textContent ?? '').replace(/\\s+$/, '');\n\n node.textContent = trimmed;\n\n if (trimmed !== '') break;\n }\n }\n\n onMounted(() => {\n trimSlotEdgeWhitespace();\n\n const slotEl = contentSlotRef.value;\n\n if (slotEl) onEvent(slotEl, 'slotchange', trimSlotEdgeWhitespace);\n });\n\n return html`\n <div class=\"row\" part=\"row\">\n <span class=\"avatar\" part=\"avatar\" ?hidden=\"${() => !slots.has('avatar').value}\">\n <slot name=\"avatar\"></slot>\n </span>\n <div class=\"column\" part=\"column\">\n <span class=\"name\" part=\"name\" ?hidden=\"${() => !props.name.value}\">${props.name}</span>\n <div class=\"bubble\" part=\"bubble\" role=\"article\" aria-label=\"${bubbleLabel}\">\n <div class=\"content\" part=\"content\">\n <slot class=\"content-slot\" ref=\"${contentSlotRef}\"></slot>\n <span class=\"cursor\" part=\"cursor\" aria-hidden=\"true\" ?hidden=\"${() => !props.streaming.value}\"></span>\n </div>\n </div>\n <div class=\"meta\" part=\"meta\" ?hidden=\"${() => !hasMeta.value}\">\n <time\n class=\"timestamp\"\n part=\"timestamp\"\n datetime=\"${props.timestamp}\"\n ?hidden=\"${() => !formattedTime.value}\"\n >${formattedTime}</time\n >\n <span class=\"status\" part=\"status\" data-status=\"${props.status}\" ?hidden=\"${() => !props.status.value}\">\n ${() => {\n switch (props.status.value) {\n case 'error':\n return html`<ore-icon\n name=\"alert-circle\"\n size=\"12\"\n stroke-width=\"2.5\"\n aria-hidden=\"true\"></ore-icon>`;\n case 'sending':\n return html`<span class=\"spinner\" aria-hidden=\"true\"></span>`;\n case 'sent':\n return html`<ore-icon name=\"check\" size=\"12\" stroke-width=\"2.5\" aria-hidden=\"true\"></ore-icon>`;\n default:\n return '';\n }\n }}\n </span>\n <span class=\"error-text\" part=\"error\" role=\"alert\" ?hidden=\"${() => !props.error.value}\"\n >${props.error}</span\n >\n <button\n class=\"retry\"\n part=\"retry\"\n type=\"button\"\n ?hidden=\"${() => props.status.value !== 'error'}\"\n @click=\"${handleRetry}\">\n Retry\n </button>\n </div>\n <div class=\"actions\" part=\"actions\" ?hidden=\"${() => !slots.has('actions').value}\">\n <slot name=\"actions\"></slot>\n </div>\n </div>\n </div>\n `;\n },\n styles: [reducedMotionMixin, componentStyles],\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"chat-message.cjs","names":[],"sources":["../src/content/chat-message/chat-message.ts"],"sourcesContent":["import { define, html, onEvent, onMounted, prop, ref, useEmit, useSlots } from '@vielzeug/ore';\nimport { computed } from '@vielzeug/ripple';\nimport { watch } from '@vielzeug/ripple/watch';\n\nimport { announce } from '../../core';\nimport { reducedMotionMixin } from '../../styles';\nimport '../icon/icon';\nimport componentStyles from './chat-message.css?inline';\n\nexport type ChatMessageSender = 'assistant' | 'system' | 'user';\nexport type ChatMessageStatus = 'error' | 'sending' | 'sent';\n\nconst SENDER_LABELS: Record<ChatMessageSender, string> = {\n assistant: 'Assistant',\n system: 'System',\n user: 'You',\n};\n\n/** Events emitted by the chat-message component */\nexport type OreChatMessageEvents = {\n /** Fired when the retry action is activated on a `status=\"error\"` message */\n retry: { originalEvent?: Event };\n};\n\n/** Chat message component properties */\nexport type OreChatMessageProps = {\n /** Error detail shown beneath the bubble; only visible when `status=\"error\"` */\n error?: string;\n /** Display name shown above the bubble (falls back to a generic label per `sender`) */\n name?: string;\n /** Who sent the message — controls alignment and bubble styling */\n sender?: ChatMessageSender;\n /** Delivery status for outgoing messages — shows an inline indicator and, for `\"error\"`, a retry action */\n status?: ChatMessageStatus;\n /** Append a blinking cursor after the content, for a message still streaming in */\n streaming?: boolean;\n /** ISO 8601 timestamp; rendered as a localized short time in a semantic `<time>` element */\n timestamp?: string;\n};\n\n/**\n * A single message bubble for chat/conversation UIs — sender-aware alignment, an optional\n * avatar slot, delivery status (sending/sent/error with retry), and a streaming cursor for\n * assistant messages still generating. Content is provided via the default slot, so any\n * markdown-to-HTML rendering stays the consumer's choice.\n *\n * The default slot's leading/trailing whitespace-only text nodes are trimmed in place once\n * per slot assignment (mount, and again on `slotchange`) — pretty-printed HTML's\n * indentation would otherwise render as blank lines, since the bubble preserves line breaks\n * (`white-space: pre-wrap`) for genuine multi-paragraph replies. This mutates those specific\n * text nodes' `textContent` directly; it never touches nodes appended afterward (e.g. by\n * `el.textContent += token` while streaming), only the ones present at assignment time.\n *\n * @element ore-chat-message\n *\n * @attr {string} sender - Who sent the message: 'user' | 'assistant' | 'system' (default 'assistant')\n * @attr {string} name - Display name shown above the bubble\n * @attr {string} timestamp - ISO 8601 timestamp, rendered as a localized short time\n * @attr {string} status - Delivery status: 'sending' | 'sent' | 'error'\n * @attr {string} error - Error detail shown beneath the bubble when status=\"error\"\n * @attr {boolean} streaming - Append a blinking cursor after the content\n *\n * @fires retry - Fired when the retry action is activated. detail: { originalEvent }\n *\n * @slot - Message content\n * @slot avatar - Avatar element (e.g. `<ore-avatar>`)\n * @slot actions - Action buttons shown beneath the message (copy, regenerate, feedback, …)\n *\n * @cssprop --chat-message-bg - Bubble background color (assistant/system)\n * @cssprop --chat-message-color - Bubble text color (assistant/system)\n * @cssprop --chat-message-user-bg - Bubble background color (user)\n * @cssprop --chat-message-user-color - Bubble text color (user)\n * @cssprop --chat-message-radius - Bubble border radius\n * @cssprop --chat-message-max-width - Maximum bubble width\n *\n * @part row - Root row container (avatar + column)\n * @part avatar - Avatar slot container\n * @part column - Column containing name, bubble, meta, and actions\n * @part name - Sender display name\n * @part bubble - Message bubble container\n * @part content - Content container inside the bubble\n * @part cursor - Blinking streaming cursor\n * @part meta - Row of timestamp, status, and error text below the bubble\n * @part timestamp - Timestamp `<time>` element\n * @part status - Status indicator\n * @part error - Error text\n * @part retry - Retry button (status=\"error\" only)\n * @part actions - Actions slot container\n *\n * @example\n * ```html\n * <ore-chat-message sender=\"user\" timestamp=\"2024-01-01T12:00:00Z\" status=\"sent\">\n * What's the weather like today?\n * </ore-chat-message>\n *\n * <ore-chat-message sender=\"assistant\" name=\"Assistant\" streaming>\n * Let me check that for you\n * </ore-chat-message>\n * ```\n */\nexport const CHAT_MESSAGE_TAG = 'ore-chat-message' as const;\ndefine<OreChatMessageProps>(CHAT_MESSAGE_TAG, {\n props: {\n error: prop.string(),\n name: prop.string(),\n sender: prop.oneOf(['user', 'assistant', 'system'] as const, 'assistant'),\n status: prop.string<ChatMessageStatus>(),\n streaming: prop.bool(false),\n timestamp: prop.string(),\n },\n setup(props) {\n const emit = useEmit<OreChatMessageEvents>();\n const slots = useSlots();\n\n const senderLabel = () => SENDER_LABELS[props.sender.value ?? 'assistant'];\n\n const bubbleLabel = computed(() => `Message from ${props.name.value || senderLabel()}`);\n\n const formattedTime = computed(() => {\n const raw = props.timestamp.value;\n\n if (!raw) return '';\n\n const date = new Date(raw);\n\n if (Number.isNaN(date.getTime())) return '';\n\n return new Intl.DateTimeFormat(undefined, { hour: 'numeric', minute: '2-digit' }).format(date);\n });\n\n const hasMeta = computed(\n () => Boolean(formattedTime.value) || Boolean(props.status.value) || Boolean(props.error.value),\n );\n\n // Announce delivery failures — the visible retry button and error text are always present\n // for sighted users, but a failed send is exactly the kind of state change a screen\n // reader user could otherwise miss entirely. Keyed on `error` text too (not just\n // `status`) so a retry that fails again with a *different* reason re-announces even\n // though `status` never left `\"error\"` in between; a second failure with the identical\n // message doesn't re-fire, since the source value hasn't actually changed.\n watch(\n () => (props.status.value === 'error' ? (props.error.value ?? '') : null),\n (errorText) => {\n if (errorText !== null) {\n announce(`Message failed to send${errorText ? `: ${errorText}` : ''}`, { politeness: 'assertive' });\n }\n },\n );\n\n function handleRetry(e: Event): void {\n emit('retry', { originalEvent: e });\n }\n\n // ── Trim author-time indentation whitespace from the default slot ──\n // `.content` uses `white-space: pre-wrap` so genuine multi-paragraph replies keep their\n // line breaks — but that also preserves the leading/trailing newline + indentation from\n // pretty-printed HTML (`<ore-chat-message>\\n Hello\\n</ore-chat-message>`), rendering as\n // visible blank lines around the text. Trim only the outermost edges once per slot\n // assignment; appending tokens to an existing text node for streaming doesn't re-fire\n // `slotchange`, so this never interferes with in-progress streaming updates.\n //\n // A named-slotted sibling (e.g. `<ore-avatar slot=\"avatar\">` between the opening tag and\n // the message text) splits the default slot's light-DOM text into *multiple* text nodes\n // — text nodes can't target a named slot, so each run on either side of the element is\n // assigned separately. The \"real\" content can start on a later node than index 0 (it's\n // still preceded by its own leading indentation), so this walks inward from each end,\n // fully clearing whitespace-only nodes and stopping at the first node with real content\n // on each side — rather than only touching the very first/last assigned node.\n const contentSlotRef = ref<HTMLSlotElement>();\n\n function trimSlotEdgeWhitespace(): void {\n const nodes = contentSlotRef.value?.assignedNodes({ flatten: true });\n\n if (!nodes || nodes.length === 0) return;\n\n for (const node of nodes) {\n if (node.nodeType !== Node.TEXT_NODE) break;\n\n const trimmed = (node.textContent ?? '').replace(/^\\s+/, '');\n\n node.textContent = trimmed;\n\n if (trimmed !== '') break;\n }\n\n for (let i = nodes.length - 1; i >= 0; i--) {\n const node = nodes[i];\n\n if (node.nodeType !== Node.TEXT_NODE) break;\n\n const trimmed = (node.textContent ?? '').replace(/\\s+$/, '');\n\n node.textContent = trimmed;\n\n if (trimmed !== '') break;\n }\n }\n\n onMounted(() => {\n trimSlotEdgeWhitespace();\n\n const slotEl = contentSlotRef.value;\n\n if (slotEl) onEvent(slotEl, 'slotchange', trimSlotEdgeWhitespace);\n });\n\n return html`\n <div class=\"row\" part=\"row\">\n <span class=\"avatar\" part=\"avatar\" ?hidden=\"${() => !slots.has('avatar').value}\">\n <slot name=\"avatar\"></slot>\n </span>\n <div class=\"column\" part=\"column\">\n <span class=\"name\" part=\"name\" ?hidden=\"${() => !props.name.value}\">${props.name}</span>\n <div class=\"bubble\" part=\"bubble\" role=\"article\" aria-label=\"${bubbleLabel}\">\n <div class=\"content\" part=\"content\">\n <slot class=\"content-slot\" ref=\"${contentSlotRef}\"></slot>\n <span class=\"cursor\" part=\"cursor\" aria-hidden=\"true\" ?hidden=\"${() => !props.streaming.value}\"></span>\n </div>\n </div>\n <div class=\"meta\" part=\"meta\" ?hidden=\"${() => !hasMeta.value}\">\n <time\n class=\"timestamp\"\n part=\"timestamp\"\n datetime=\"${props.timestamp}\"\n ?hidden=\"${() => !formattedTime.value}\">\n ${formattedTime}\n </time>\n <span class=\"status\" part=\"status\" data-status=\"${props.status}\" ?hidden=\"${() => !props.status.value}\">\n ${() => {\n switch (props.status.value) {\n case 'error':\n return html`\n <ore-icon name=\"alert-circle\" size=\"12\" stroke-width=\"2.5\" aria-hidden=\"true\"></ore-icon>\n `;\n case 'sending':\n return html`\n <span class=\"spinner\" aria-hidden=\"true\"></span>\n `;\n case 'sent':\n return html`\n <ore-icon name=\"check\" size=\"12\" stroke-width=\"2.5\" aria-hidden=\"true\"></ore-icon>\n `;\n default:\n return '';\n }\n }}\n </span>\n <span class=\"error-text\" part=\"error\" role=\"alert\" ?hidden=\"${() => !props.error.value}\">\n ${props.error}\n </span>\n <button\n class=\"retry\"\n part=\"retry\"\n type=\"button\"\n ?hidden=\"${() => props.status.value !== 'error'}\"\n @click=\"${handleRetry}\">\n Retry\n </button>\n </div>\n <div class=\"actions\" part=\"actions\" ?hidden=\"${() => !slots.has('actions').value}\">\n <slot name=\"actions\"></slot>\n </div>\n </div>\n </div>\n `;\n },\n styles: [reducedMotionMixin, componentStyles],\n});\n"],"mappings":"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"}
@@ -1,8 +1,9 @@
1
1
  import { reducedMotionMixin as e } from "./styles/mixins/accessibility.css.js";
2
- import { announce as t } from "./headless/announcer.js";
2
+ import { announce as t } from "./core/announcer.js";
3
3
  import n from "./content/chat-message/chat-message.css.js";
4
4
  import { define as r, html as i, onEvent as a, onMounted as o, prop as s, ref as c, useEmit as l, useSlots as u } from "@vielzeug/ore";
5
- import { computed as d, watch as f } from "@vielzeug/ripple";
5
+ import { computed as d } from "@vielzeug/ripple";
6
+ import { watch as f } from "@vielzeug/ripple/watch";
6
7
  //#region src/content/chat-message/chat-message.ts
7
8
  var p = {
8
9
  assistant: "Assistant",
@@ -77,26 +78,28 @@ r(m, {
77
78
  class="timestamp"
78
79
  part="timestamp"
79
80
  datetime="${e.timestamp}"
80
- ?hidden="${() => !h.value}"
81
- >${h}</time
82
- >
81
+ ?hidden="${() => !h.value}">
82
+ ${h}
83
+ </time>
83
84
  <span class="status" part="status" data-status="${e.status}" ?hidden="${() => !e.status.value}">
84
85
  ${() => {
85
86
  switch (e.status.value) {
86
- case "error": return i`<ore-icon
87
- name="alert-circle"
88
- size="12"
89
- stroke-width="2.5"
90
- aria-hidden="true"></ore-icon>`;
91
- case "sending": return i`<span class="spinner" aria-hidden="true"></span>`;
92
- case "sent": return i`<ore-icon name="check" size="12" stroke-width="2.5" aria-hidden="true"></ore-icon>`;
87
+ case "error": return i`
88
+ <ore-icon name="alert-circle" size="12" stroke-width="2.5" aria-hidden="true"></ore-icon>
89
+ `;
90
+ case "sending": return i`
91
+ <span class="spinner" aria-hidden="true"></span>
92
+ `;
93
+ case "sent": return i`
94
+ <ore-icon name="check" size="12" stroke-width="2.5" aria-hidden="true"></ore-icon>
95
+ `;
93
96
  default: return "";
94
97
  }
95
98
  }}
96
99
  </span>
97
- <span class="error-text" part="error" role="alert" ?hidden="${() => !e.error.value}"
98
- >${e.error}</span
99
- >
100
+ <span class="error-text" part="error" role="alert" ?hidden="${() => !e.error.value}">
101
+ ${e.error}
102
+ </span>
100
103
  <button
101
104
  class="retry"
102
105
  part="retry"
@@ -1 +1 @@
1
- {"version":3,"file":"chat-message.js","names":[],"sources":["../src/content/chat-message/chat-message.ts"],"sourcesContent":["import { define, html, onEvent, onMounted, prop, ref, useEmit, useSlots } from '@vielzeug/ore';\nimport { computed, watch } from '@vielzeug/ripple';\n\nimport { announce } from '../../headless';\nimport { reducedMotionMixin } from '../../styles';\nimport '../icon/icon';\nimport componentStyles from './chat-message.css?inline';\n\nexport type ChatMessageSender = 'assistant' | 'system' | 'user';\nexport type ChatMessageStatus = 'error' | 'sending' | 'sent';\n\nconst SENDER_LABELS: Record<ChatMessageSender, string> = {\n assistant: 'Assistant',\n system: 'System',\n user: 'You',\n};\n\n/** Events emitted by the chat-message component */\nexport type OreChatMessageEvents = {\n /** Fired when the retry action is activated on a `status=\"error\"` message */\n retry: { originalEvent?: Event };\n};\n\n/** Chat message component properties */\nexport type OreChatMessageProps = {\n /** Error detail shown beneath the bubble; only visible when `status=\"error\"` */\n error?: string;\n /** Display name shown above the bubble (falls back to a generic label per `sender`) */\n name?: string;\n /** Who sent the message — controls alignment and bubble styling */\n sender?: ChatMessageSender;\n /** Delivery status for outgoing messages — shows an inline indicator and, for `\"error\"`, a retry action */\n status?: ChatMessageStatus;\n /** Append a blinking cursor after the content, for a message still streaming in */\n streaming?: boolean;\n /** ISO 8601 timestamp; rendered as a localized short time in a semantic `<time>` element */\n timestamp?: string;\n};\n\n/**\n * A single message bubble for chat/conversation UIs — sender-aware alignment, an optional\n * avatar slot, delivery status (sending/sent/error with retry), and a streaming cursor for\n * assistant messages still generating. Content is provided via the default slot, so any\n * markdown-to-HTML rendering stays the consumer's choice.\n *\n * The default slot's leading/trailing whitespace-only text nodes are trimmed in place once\n * per slot assignment (mount, and again on `slotchange`) — pretty-printed HTML's\n * indentation would otherwise render as blank lines, since the bubble preserves line breaks\n * (`white-space: pre-wrap`) for genuine multi-paragraph replies. This mutates those specific\n * text nodes' `textContent` directly; it never touches nodes appended afterward (e.g. by\n * `el.textContent += token` while streaming), only the ones present at assignment time.\n *\n * @element ore-chat-message\n *\n * @attr {string} sender - Who sent the message: 'user' | 'assistant' | 'system' (default 'assistant')\n * @attr {string} name - Display name shown above the bubble\n * @attr {string} timestamp - ISO 8601 timestamp, rendered as a localized short time\n * @attr {string} status - Delivery status: 'sending' | 'sent' | 'error'\n * @attr {string} error - Error detail shown beneath the bubble when status=\"error\"\n * @attr {boolean} streaming - Append a blinking cursor after the content\n *\n * @fires retry - Fired when the retry action is activated. detail: { originalEvent }\n *\n * @slot - Message content\n * @slot avatar - Avatar element (e.g. `<ore-avatar>`)\n * @slot actions - Action buttons shown beneath the message (copy, regenerate, feedback, …)\n *\n * @cssprop --chat-message-bg - Bubble background color (assistant/system)\n * @cssprop --chat-message-color - Bubble text color (assistant/system)\n * @cssprop --chat-message-user-bg - Bubble background color (user)\n * @cssprop --chat-message-user-color - Bubble text color (user)\n * @cssprop --chat-message-radius - Bubble border radius\n * @cssprop --chat-message-max-width - Maximum bubble width\n *\n * @part row - Root row container (avatar + column)\n * @part avatar - Avatar slot container\n * @part column - Column containing name, bubble, meta, and actions\n * @part name - Sender display name\n * @part bubble - Message bubble container\n * @part content - Content container inside the bubble\n * @part cursor - Blinking streaming cursor\n * @part meta - Row of timestamp, status, and error text below the bubble\n * @part timestamp - Timestamp `<time>` element\n * @part status - Status indicator\n * @part error - Error text\n * @part retry - Retry button (status=\"error\" only)\n * @part actions - Actions slot container\n *\n * @example\n * ```html\n * <ore-chat-message sender=\"user\" timestamp=\"2024-01-01T12:00:00Z\" status=\"sent\">\n * What's the weather like today?\n * </ore-chat-message>\n *\n * <ore-chat-message sender=\"assistant\" name=\"Assistant\" streaming>\n * Let me check that for you\n * </ore-chat-message>\n * ```\n */\nexport const CHAT_MESSAGE_TAG = 'ore-chat-message' as const;\ndefine<OreChatMessageProps>(CHAT_MESSAGE_TAG, {\n props: {\n error: prop.string(),\n name: prop.string(),\n sender: prop.oneOf(['user', 'assistant', 'system'] as const, 'assistant'),\n status: prop.string<ChatMessageStatus>(),\n streaming: prop.bool(false),\n timestamp: prop.string(),\n },\n setup(props) {\n const emit = useEmit<OreChatMessageEvents>();\n const slots = useSlots();\n\n const senderLabel = () => SENDER_LABELS[props.sender.value ?? 'assistant'];\n\n const bubbleLabel = computed(() => `Message from ${props.name.value || senderLabel()}`);\n\n const formattedTime = computed(() => {\n const raw = props.timestamp.value;\n\n if (!raw) return '';\n\n const date = new Date(raw);\n\n if (Number.isNaN(date.getTime())) return '';\n\n return new Intl.DateTimeFormat(undefined, { hour: 'numeric', minute: '2-digit' }).format(date);\n });\n\n const hasMeta = computed(\n () => Boolean(formattedTime.value) || Boolean(props.status.value) || Boolean(props.error.value),\n );\n\n // Announce delivery failures — the visible retry button and error text are always present\n // for sighted users, but a failed send is exactly the kind of state change a screen\n // reader user could otherwise miss entirely. Keyed on `error` text too (not just\n // `status`) so a retry that fails again with a *different* reason re-announces even\n // though `status` never left `\"error\"` in between; a second failure with the identical\n // message doesn't re-fire, since the source value hasn't actually changed.\n watch(\n () => (props.status.value === 'error' ? (props.error.value ?? '') : null),\n (errorText) => {\n if (errorText !== null) {\n announce(`Message failed to send${errorText ? `: ${errorText}` : ''}`, { politeness: 'assertive' });\n }\n },\n );\n\n function handleRetry(e: Event): void {\n emit('retry', { originalEvent: e });\n }\n\n // ── Trim author-time indentation whitespace from the default slot ──\n // `.content` uses `white-space: pre-wrap` so genuine multi-paragraph replies keep their\n // line breaks — but that also preserves the leading/trailing newline + indentation from\n // pretty-printed HTML (`<ore-chat-message>\\n Hello\\n</ore-chat-message>`), rendering as\n // visible blank lines around the text. Trim only the outermost edges once per slot\n // assignment; appending tokens to an existing text node for streaming doesn't re-fire\n // `slotchange`, so this never interferes with in-progress streaming updates.\n //\n // A named-slotted sibling (e.g. `<ore-avatar slot=\"avatar\">` between the opening tag and\n // the message text) splits the default slot's light-DOM text into *multiple* text nodes\n // — text nodes can't target a named slot, so each run on either side of the element is\n // assigned separately. The \"real\" content can start on a later node than index 0 (it's\n // still preceded by its own leading indentation), so this walks inward from each end,\n // fully clearing whitespace-only nodes and stopping at the first node with real content\n // on each side — rather than only touching the very first/last assigned node.\n const contentSlotRef = ref<HTMLSlotElement>();\n\n function trimSlotEdgeWhitespace(): void {\n const nodes = contentSlotRef.value?.assignedNodes({ flatten: true });\n\n if (!nodes || nodes.length === 0) return;\n\n for (const node of nodes) {\n if (node.nodeType !== Node.TEXT_NODE) break;\n\n const trimmed = (node.textContent ?? '').replace(/^\\s+/, '');\n\n node.textContent = trimmed;\n\n if (trimmed !== '') break;\n }\n\n for (let i = nodes.length - 1; i >= 0; i--) {\n const node = nodes[i];\n\n if (node.nodeType !== Node.TEXT_NODE) break;\n\n const trimmed = (node.textContent ?? '').replace(/\\s+$/, '');\n\n node.textContent = trimmed;\n\n if (trimmed !== '') break;\n }\n }\n\n onMounted(() => {\n trimSlotEdgeWhitespace();\n\n const slotEl = contentSlotRef.value;\n\n if (slotEl) onEvent(slotEl, 'slotchange', trimSlotEdgeWhitespace);\n });\n\n return html`\n <div class=\"row\" part=\"row\">\n <span class=\"avatar\" part=\"avatar\" ?hidden=\"${() => !slots.has('avatar').value}\">\n <slot name=\"avatar\"></slot>\n </span>\n <div class=\"column\" part=\"column\">\n <span class=\"name\" part=\"name\" ?hidden=\"${() => !props.name.value}\">${props.name}</span>\n <div class=\"bubble\" part=\"bubble\" role=\"article\" aria-label=\"${bubbleLabel}\">\n <div class=\"content\" part=\"content\">\n <slot class=\"content-slot\" ref=\"${contentSlotRef}\"></slot>\n <span class=\"cursor\" part=\"cursor\" aria-hidden=\"true\" ?hidden=\"${() => !props.streaming.value}\"></span>\n </div>\n </div>\n <div class=\"meta\" part=\"meta\" ?hidden=\"${() => !hasMeta.value}\">\n <time\n class=\"timestamp\"\n part=\"timestamp\"\n datetime=\"${props.timestamp}\"\n ?hidden=\"${() => !formattedTime.value}\"\n >${formattedTime}</time\n >\n <span class=\"status\" part=\"status\" data-status=\"${props.status}\" ?hidden=\"${() => !props.status.value}\">\n ${() => {\n switch (props.status.value) {\n case 'error':\n return html`<ore-icon\n name=\"alert-circle\"\n size=\"12\"\n stroke-width=\"2.5\"\n aria-hidden=\"true\"></ore-icon>`;\n case 'sending':\n return html`<span class=\"spinner\" aria-hidden=\"true\"></span>`;\n case 'sent':\n return html`<ore-icon name=\"check\" size=\"12\" stroke-width=\"2.5\" aria-hidden=\"true\"></ore-icon>`;\n default:\n return '';\n }\n }}\n </span>\n <span class=\"error-text\" part=\"error\" role=\"alert\" ?hidden=\"${() => !props.error.value}\"\n >${props.error}</span\n >\n <button\n class=\"retry\"\n part=\"retry\"\n type=\"button\"\n ?hidden=\"${() => props.status.value !== 'error'}\"\n @click=\"${handleRetry}\">\n Retry\n </button>\n </div>\n <div class=\"actions\" part=\"actions\" ?hidden=\"${() => !slots.has('actions').value}\">\n <slot name=\"actions\"></slot>\n </div>\n </div>\n </div>\n `;\n },\n styles: [reducedMotionMixin, componentStyles],\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"chat-message.js","names":[],"sources":["../src/content/chat-message/chat-message.ts"],"sourcesContent":["import { define, html, onEvent, onMounted, prop, ref, useEmit, useSlots } from '@vielzeug/ore';\nimport { computed } from '@vielzeug/ripple';\nimport { watch } from '@vielzeug/ripple/watch';\n\nimport { announce } from '../../core';\nimport { reducedMotionMixin } from '../../styles';\nimport '../icon/icon';\nimport componentStyles from './chat-message.css?inline';\n\nexport type ChatMessageSender = 'assistant' | 'system' | 'user';\nexport type ChatMessageStatus = 'error' | 'sending' | 'sent';\n\nconst SENDER_LABELS: Record<ChatMessageSender, string> = {\n assistant: 'Assistant',\n system: 'System',\n user: 'You',\n};\n\n/** Events emitted by the chat-message component */\nexport type OreChatMessageEvents = {\n /** Fired when the retry action is activated on a `status=\"error\"` message */\n retry: { originalEvent?: Event };\n};\n\n/** Chat message component properties */\nexport type OreChatMessageProps = {\n /** Error detail shown beneath the bubble; only visible when `status=\"error\"` */\n error?: string;\n /** Display name shown above the bubble (falls back to a generic label per `sender`) */\n name?: string;\n /** Who sent the message — controls alignment and bubble styling */\n sender?: ChatMessageSender;\n /** Delivery status for outgoing messages — shows an inline indicator and, for `\"error\"`, a retry action */\n status?: ChatMessageStatus;\n /** Append a blinking cursor after the content, for a message still streaming in */\n streaming?: boolean;\n /** ISO 8601 timestamp; rendered as a localized short time in a semantic `<time>` element */\n timestamp?: string;\n};\n\n/**\n * A single message bubble for chat/conversation UIs — sender-aware alignment, an optional\n * avatar slot, delivery status (sending/sent/error with retry), and a streaming cursor for\n * assistant messages still generating. Content is provided via the default slot, so any\n * markdown-to-HTML rendering stays the consumer's choice.\n *\n * The default slot's leading/trailing whitespace-only text nodes are trimmed in place once\n * per slot assignment (mount, and again on `slotchange`) — pretty-printed HTML's\n * indentation would otherwise render as blank lines, since the bubble preserves line breaks\n * (`white-space: pre-wrap`) for genuine multi-paragraph replies. This mutates those specific\n * text nodes' `textContent` directly; it never touches nodes appended afterward (e.g. by\n * `el.textContent += token` while streaming), only the ones present at assignment time.\n *\n * @element ore-chat-message\n *\n * @attr {string} sender - Who sent the message: 'user' | 'assistant' | 'system' (default 'assistant')\n * @attr {string} name - Display name shown above the bubble\n * @attr {string} timestamp - ISO 8601 timestamp, rendered as a localized short time\n * @attr {string} status - Delivery status: 'sending' | 'sent' | 'error'\n * @attr {string} error - Error detail shown beneath the bubble when status=\"error\"\n * @attr {boolean} streaming - Append a blinking cursor after the content\n *\n * @fires retry - Fired when the retry action is activated. detail: { originalEvent }\n *\n * @slot - Message content\n * @slot avatar - Avatar element (e.g. `<ore-avatar>`)\n * @slot actions - Action buttons shown beneath the message (copy, regenerate, feedback, …)\n *\n * @cssprop --chat-message-bg - Bubble background color (assistant/system)\n * @cssprop --chat-message-color - Bubble text color (assistant/system)\n * @cssprop --chat-message-user-bg - Bubble background color (user)\n * @cssprop --chat-message-user-color - Bubble text color (user)\n * @cssprop --chat-message-radius - Bubble border radius\n * @cssprop --chat-message-max-width - Maximum bubble width\n *\n * @part row - Root row container (avatar + column)\n * @part avatar - Avatar slot container\n * @part column - Column containing name, bubble, meta, and actions\n * @part name - Sender display name\n * @part bubble - Message bubble container\n * @part content - Content container inside the bubble\n * @part cursor - Blinking streaming cursor\n * @part meta - Row of timestamp, status, and error text below the bubble\n * @part timestamp - Timestamp `<time>` element\n * @part status - Status indicator\n * @part error - Error text\n * @part retry - Retry button (status=\"error\" only)\n * @part actions - Actions slot container\n *\n * @example\n * ```html\n * <ore-chat-message sender=\"user\" timestamp=\"2024-01-01T12:00:00Z\" status=\"sent\">\n * What's the weather like today?\n * </ore-chat-message>\n *\n * <ore-chat-message sender=\"assistant\" name=\"Assistant\" streaming>\n * Let me check that for you\n * </ore-chat-message>\n * ```\n */\nexport const CHAT_MESSAGE_TAG = 'ore-chat-message' as const;\ndefine<OreChatMessageProps>(CHAT_MESSAGE_TAG, {\n props: {\n error: prop.string(),\n name: prop.string(),\n sender: prop.oneOf(['user', 'assistant', 'system'] as const, 'assistant'),\n status: prop.string<ChatMessageStatus>(),\n streaming: prop.bool(false),\n timestamp: prop.string(),\n },\n setup(props) {\n const emit = useEmit<OreChatMessageEvents>();\n const slots = useSlots();\n\n const senderLabel = () => SENDER_LABELS[props.sender.value ?? 'assistant'];\n\n const bubbleLabel = computed(() => `Message from ${props.name.value || senderLabel()}`);\n\n const formattedTime = computed(() => {\n const raw = props.timestamp.value;\n\n if (!raw) return '';\n\n const date = new Date(raw);\n\n if (Number.isNaN(date.getTime())) return '';\n\n return new Intl.DateTimeFormat(undefined, { hour: 'numeric', minute: '2-digit' }).format(date);\n });\n\n const hasMeta = computed(\n () => Boolean(formattedTime.value) || Boolean(props.status.value) || Boolean(props.error.value),\n );\n\n // Announce delivery failures — the visible retry button and error text are always present\n // for sighted users, but a failed send is exactly the kind of state change a screen\n // reader user could otherwise miss entirely. Keyed on `error` text too (not just\n // `status`) so a retry that fails again with a *different* reason re-announces even\n // though `status` never left `\"error\"` in between; a second failure with the identical\n // message doesn't re-fire, since the source value hasn't actually changed.\n watch(\n () => (props.status.value === 'error' ? (props.error.value ?? '') : null),\n (errorText) => {\n if (errorText !== null) {\n announce(`Message failed to send${errorText ? `: ${errorText}` : ''}`, { politeness: 'assertive' });\n }\n },\n );\n\n function handleRetry(e: Event): void {\n emit('retry', { originalEvent: e });\n }\n\n // ── Trim author-time indentation whitespace from the default slot ──\n // `.content` uses `white-space: pre-wrap` so genuine multi-paragraph replies keep their\n // line breaks — but that also preserves the leading/trailing newline + indentation from\n // pretty-printed HTML (`<ore-chat-message>\\n Hello\\n</ore-chat-message>`), rendering as\n // visible blank lines around the text. Trim only the outermost edges once per slot\n // assignment; appending tokens to an existing text node for streaming doesn't re-fire\n // `slotchange`, so this never interferes with in-progress streaming updates.\n //\n // A named-slotted sibling (e.g. `<ore-avatar slot=\"avatar\">` between the opening tag and\n // the message text) splits the default slot's light-DOM text into *multiple* text nodes\n // — text nodes can't target a named slot, so each run on either side of the element is\n // assigned separately. The \"real\" content can start on a later node than index 0 (it's\n // still preceded by its own leading indentation), so this walks inward from each end,\n // fully clearing whitespace-only nodes and stopping at the first node with real content\n // on each side — rather than only touching the very first/last assigned node.\n const contentSlotRef = ref<HTMLSlotElement>();\n\n function trimSlotEdgeWhitespace(): void {\n const nodes = contentSlotRef.value?.assignedNodes({ flatten: true });\n\n if (!nodes || nodes.length === 0) return;\n\n for (const node of nodes) {\n if (node.nodeType !== Node.TEXT_NODE) break;\n\n const trimmed = (node.textContent ?? '').replace(/^\\s+/, '');\n\n node.textContent = trimmed;\n\n if (trimmed !== '') break;\n }\n\n for (let i = nodes.length - 1; i >= 0; i--) {\n const node = nodes[i];\n\n if (node.nodeType !== Node.TEXT_NODE) break;\n\n const trimmed = (node.textContent ?? '').replace(/\\s+$/, '');\n\n node.textContent = trimmed;\n\n if (trimmed !== '') break;\n }\n }\n\n onMounted(() => {\n trimSlotEdgeWhitespace();\n\n const slotEl = contentSlotRef.value;\n\n if (slotEl) onEvent(slotEl, 'slotchange', trimSlotEdgeWhitespace);\n });\n\n return html`\n <div class=\"row\" part=\"row\">\n <span class=\"avatar\" part=\"avatar\" ?hidden=\"${() => !slots.has('avatar').value}\">\n <slot name=\"avatar\"></slot>\n </span>\n <div class=\"column\" part=\"column\">\n <span class=\"name\" part=\"name\" ?hidden=\"${() => !props.name.value}\">${props.name}</span>\n <div class=\"bubble\" part=\"bubble\" role=\"article\" aria-label=\"${bubbleLabel}\">\n <div class=\"content\" part=\"content\">\n <slot class=\"content-slot\" ref=\"${contentSlotRef}\"></slot>\n <span class=\"cursor\" part=\"cursor\" aria-hidden=\"true\" ?hidden=\"${() => !props.streaming.value}\"></span>\n </div>\n </div>\n <div class=\"meta\" part=\"meta\" ?hidden=\"${() => !hasMeta.value}\">\n <time\n class=\"timestamp\"\n part=\"timestamp\"\n datetime=\"${props.timestamp}\"\n ?hidden=\"${() => !formattedTime.value}\">\n ${formattedTime}\n </time>\n <span class=\"status\" part=\"status\" data-status=\"${props.status}\" ?hidden=\"${() => !props.status.value}\">\n ${() => {\n switch (props.status.value) {\n case 'error':\n return html`\n <ore-icon name=\"alert-circle\" size=\"12\" stroke-width=\"2.5\" aria-hidden=\"true\"></ore-icon>\n `;\n case 'sending':\n return html`\n <span class=\"spinner\" aria-hidden=\"true\"></span>\n `;\n case 'sent':\n return html`\n <ore-icon name=\"check\" size=\"12\" stroke-width=\"2.5\" aria-hidden=\"true\"></ore-icon>\n `;\n default:\n return '';\n }\n }}\n </span>\n <span class=\"error-text\" part=\"error\" role=\"alert\" ?hidden=\"${() => !props.error.value}\">\n ${props.error}\n </span>\n <button\n class=\"retry\"\n part=\"retry\"\n type=\"button\"\n ?hidden=\"${() => props.status.value !== 'error'}\"\n @click=\"${handleRetry}\">\n Retry\n </button>\n </div>\n <div class=\"actions\" part=\"actions\" ?hidden=\"${() => !slots.has('actions').value}\">\n <slot name=\"actions\"></slot>\n </div>\n </div>\n </div>\n `;\n },\n styles: [reducedMotionMixin, componentStyles],\n});\n"],"mappings":";;;;;;;AAYA,IAAM,IAAmD;CACvD,WAAW;CACX,QAAQ;CACR,MAAM;AACR,GAoFa,IAAmB;AAChC,EAA4B,GAAkB;CAC5C,OAAO;EACL,OAAO,EAAK,OAAO;EACnB,MAAM,EAAK,OAAO;EAClB,QAAQ,EAAK,MAAM;GAAC;GAAQ;GAAa;EAAQ,GAAY,WAAW;EACxE,QAAQ,EAAK,OAA0B;EACvC,WAAW,EAAK,KAAK,EAAK;EAC1B,WAAW,EAAK,OAAO;CACzB;CACA,MAAM,GAAO;EACX,IAAM,IAAO,EAA8B,GACrC,IAAQ,EAAS,GAEjB,UAAoB,EAAc,EAAM,OAAO,SAAS,cAExD,IAAc,QAAe,gBAAgB,EAAM,KAAK,SAAS,EAAY,GAAG,GAEhF,IAAgB,QAAe;GACnC,IAAM,IAAM,EAAM,UAAU;GAE5B,IAAI,CAAC,GAAK,OAAO;GAEjB,IAAM,IAAO,IAAI,KAAK,CAAG;GAIzB,OAFI,OAAO,MAAM,EAAK,QAAQ,CAAC,IAAU,KAElC,IAAI,KAAK,eAAe,KAAA,GAAW;IAAE,MAAM;IAAW,QAAQ;GAAU,CAAC,CAAC,CAAC,OAAO,CAAI;EAC/F,CAAC,GAEK,IAAU,QACR,EAAQ,EAAc,SAAU,EAAQ,EAAM,OAAO,SAAU,EAAQ,EAAM,MAAM,KAC3F;EAQA,QACS,EAAM,OAAO,UAAU,UAAW,EAAM,MAAM,SAAS,KAAM,OACnE,MAAc;GACb,AAAI,MAAc,QAChB,EAAS,yBAAyB,IAAY,KAAK,MAAc,MAAM,EAAE,YAAY,YAAY,CAAC;EAEtG,CACF;EAEA,SAAS,EAAY,GAAgB;GACnC,EAAK,SAAS,EAAE,eAAe,EAAE,CAAC;EACpC;EAiBA,IAAM,IAAiB,EAAqB;EAE5C,SAAS,IAA+B;GACtC,IAAM,IAAQ,EAAe,OAAO,cAAc,EAAE,SAAS,GAAK,CAAC;GAE/D,OAAC,KAAS,EAAM,WAAW,IAE/B;SAAK,IAAM,KAAQ,GAAO;KACxB,IAAI,EAAK,aAAa,KAAK,WAAW;KAEtC,IAAM,KAAW,EAAK,eAAe,GAAA,CAAI,QAAQ,QAAQ,EAAE;KAI3D,IAFA,EAAK,cAAc,GAEf,MAAY,IAAI;IACtB;IAEA,KAAK,IAAI,IAAI,EAAM,SAAS,GAAG,KAAK,GAAG,KAAK;KAC1C,IAAM,IAAO,EAAM;KAEnB,IAAI,EAAK,aAAa,KAAK,WAAW;KAEtC,IAAM,KAAW,EAAK,eAAe,GAAA,CAAI,QAAQ,QAAQ,EAAE;KAI3D,IAFA,EAAK,cAAc,GAEf,MAAY,IAAI;IACtB;GAZA;EAaF;EAUA,OARA,QAAgB;GACd,EAAuB;GAEvB,IAAM,IAAS,EAAe;GAE9B,AAAI,KAAQ,EAAQ,GAAQ,cAAc,CAAsB;EAClE,CAAC,GAEM,CAAI;;4DAE6C,CAAC,EAAM,IAAI,QAAQ,CAAC,CAAC,MAAM;;;;0DAI7B,CAAC,EAAM,KAAK,MAAM,IAAI,EAAM,KAAK;yEAClB,EAAY;;gDAErC,EAAe;qFACsB,CAAC,EAAM,UAAU,MAAM;;;yDAGnD,CAAC,EAAQ,MAAM;;;;0BAI9C,EAAM,UAAU;+BACX,CAAC,EAAc,MAAM;gBACpC,EAAc;;8DAEgC,EAAM,OAAO,mBAAmB,CAAC,EAAM,OAAO,MAAM;sBAC5F;GACN,QAAQ,EAAM,OAAO,OAArB;IACE,KAAK,SACH,OAAO,CAAI;;;IAGb,KAAK,WACH,OAAO,CAAI;;;IAGb,KAAK,QACH,OAAO,CAAI;;;IAGb,SACE,OAAO;GACX;EACF,EAAE;;gFAEgE,CAAC,EAAM,MAAM,MAAM;gBACnF,EAAM,MAAM;;;;;;+BAMG,EAAM,OAAO,UAAU,QAAQ;wBACtC,EAAY;;;;+DAI2B,CAAC,EAAM,IAAI,SAAS,CAAC,CAAC,MAAM;;;;;;CAMzF;CACA,QAAQ,CAAC,GAAoB,CAAe;AAC9C,CAAC"}
@@ -1,18 +1,20 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./styles/mixins/states.css.cjs"),t=require("./shared/prop-bundles.cjs"),n=require("./headless/ore.cjs"),r=require("./headless/choice-field.cjs"),i=require("./headless/light-dom.cjs"),a=require("./inputs/shared/form-context.cjs"),o=require("./inputs/checkbox-group/checkbox-group.css.cjs");let s=require("@vielzeug/ore"),c=require("@vielzeug/ripple"),l=require("@vielzeug/ore/forms");var u=(0,s.createContext)(`CheckboxGroupContext`),d=`ore-checkbox-group`;(0,s.define)(d,{formAssociated:!0,props:{...t.themableBundle,...t.sizableBundle,...t.disablableBundle,error:s.prop.string(),helper:s.prop.string(),label:s.prop.string(),name:s.prop.string(),orientation:s.prop.string(`vertical`),required:s.prop.bool(!1),values:{...s.prop.string(),reflect:!1}},setup(e){let t=(0,s.getHost)(),o=(0,s.useEmit)(),d=(0,s.useSlots)(),f=s.watchEffect,p=(0,s.inject)(a.FORM_CTX),m=a.useFormContext(e,p),h=r.createChoiceField({disabled:m.disabled,error:e.error,helper:e.helper,multiple:(0,c.signal)(!0),prefix:`checkbox-group`,required:e.required,signal:n.lifecycleSignal(s.onCleanup),validateOn:p?.validateOn,value:e.values});h.attachFormField((0,l.useField)({disabled:h.disabled,onReset:h.reset,toFormValue:e=>e,validationMessage:h.validationMessage,validity:h.validity,value:h.formValue}));let g=h.selectedValues,_=()=>i.getLightChildrenByTag(t,`ore-checkbox`),v=e=>i.getChoiceLabel(_(),e),y=e=>{let t=g.value,n=t.map(v);o(`change`,{labels:n,originalEvent:e,values:t})},b=(e,t)=>{h.toggleValue(e),h.triggerValidation(`change`),y(t)};(0,s.provide)(u,{color:e.color,disabled:(0,c.computed)(()=>!!e.disabled.value),size:e.size,toggle:b,values:g});let x=()=>{let t=g.value,n=e.color.value,r=e.size.value,i=e.disabled.value,a=_();for(let e of a){let a=e.getAttribute(`value`)??``;e.toggleAttribute(`checked`,t.includes(a)),n?e.setAttribute(`color`,n):e.removeAttribute(`color`),r?e.setAttribute(`size`,r):e.removeAttribute(`size`),e.toggleAttribute(`disabled`,!!i)}};f(()=>{d.elements().value,x()}),f(()=>{d.elements().value;let e=_().map(e=>{let t=t=>{t.stopPropagation();let n=(e.getAttribute(`value`)??``).trim();n&&b(n,t)};return e.addEventListener(`change`,t),()=>{e.removeEventListener(`change`,t)}});return()=>{for(let t of e)t()}});let S=(0,s.createStableId)(`checkbox-group-legend`),C=`${S}-error`,w=`${S}-helper`,T=()=>!!e.error.value,E=()=>!!e.helper.value&&!T();return(0,s.bind)({attr:{size:m.size,values:h.formValue}}),s.html`
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./core/ore.cjs"),t=require("./core/choice-field.cjs"),n=require("./styles/mixins/states.css.cjs"),r=require("./core/light-dom.cjs"),i=require("./shared/prop-bundles.cjs"),a=require("./inputs/checkbox-group/checkbox-group.css.cjs");let o=require("@vielzeug/ore"),s=require("@vielzeug/ripple");var c=(0,o.createContext)(`CheckboxGroupContext`),l=`ore-checkbox-group`;(0,o.define)(l,{formAssociated:!0,props:{...i.themableBundle,...i.sizableBundle,...i.disablableBundle,error:o.prop.string(),helper:o.prop.string(),label:o.prop.string(),name:o.prop.string(),orientation:o.prop.string(`vertical`),required:o.prop.bool(!1),values:{...o.prop.string(),reflect:!1}},setup(n){let i=(0,o.getHost)(),a=(0,o.useEmit)(),l=(0,o.useSlots)(),u=o.watchEffect,d=t.createChoiceField({disabled:n.disabled,error:n.error,helper:n.helper,multiple:(0,s.signal)(!0),prefix:`checkbox-group`,required:n.required,signal:e.lifecycleSignal(o.onCleanup),value:n.values});d.attachFormField((0,o.useField)({disabled:d.disabled,onReset:d.reset,toFormValue:e=>e,validationMessage:d.validationMessage,validity:d.validity,value:d.formValue}));let f=d.selectedValues,p=()=>r.getLightChildrenByTag(i,`ore-checkbox`),m=e=>r.getChoiceLabel(p(),e),h=e=>{let t=f.value,n=t.map(m);a(`change`,{labels:n,originalEvent:e,values:t})},g=(e,t)=>{d.toggleValue(e),d.triggerValidation(`change`),h(t)};(0,o.provide)(c,{color:n.color,disabled:(0,s.computed)(()=>!!n.disabled.value),size:n.size,toggle:g,values:f});let _=()=>{let e=f.value,t=n.color.value,r=n.size.value,i=n.disabled.value,a=p();for(let n of a){let a=n.getAttribute(`value`)??``;n.toggleAttribute(`checked`,e.includes(a)),t?n.setAttribute(`color`,t):n.removeAttribute(`color`),r?n.setAttribute(`size`,r):n.removeAttribute(`size`),n.toggleAttribute(`disabled`,!!i)}};u(()=>{l.elements().value,_()}),u(()=>{l.elements().value;let e=p().map(e=>{let t=t=>{t.stopPropagation();let n=(e.getAttribute(`value`)??``).trim();n&&g(n,t)};return e.addEventListener(`change`,t),()=>{e.removeEventListener(`change`,t)}});return()=>{for(let t of e)t()}});let v=(0,o.createStableId)(`checkbox-group-legend`),y=`${v}-error`,b=`${v}-helper`,x=()=>!!n.error.value,S=()=>!!n.helper.value&&!x();return(0,o.bind)({attr:{size:n.size,values:d.formValue}}),o.html`
2
2
  <fieldset
3
3
  role="group"
4
- aria-required="${()=>String(!!e.required.value)}"
5
- aria-invalid="${()=>String(T())}"
6
- aria-errormessage="${()=>T()?C:null}"
7
- aria-describedby="${()=>T()?C:E()?w:null}">
8
- <legend id="${S}" ?hidden=${()=>!e.label.value}>
9
- ${e.label}${(0,s.when)(()=>!!e.required.value,()=>s.html`<span aria-hidden="true"> *</span>`)}
4
+ aria-required="${()=>String(!!n.required.value)}"
5
+ aria-invalid="${()=>String(x())}"
6
+ aria-errormessage="${()=>x()?y:null}"
7
+ aria-describedby="${()=>x()?y:S()?b:null}">
8
+ <legend id="${v}" ?hidden=${()=>!n.label.value}>
9
+ ${n.label}${(0,o.when)(()=>!!n.required.value,()=>o.html`
10
+ <span aria-hidden="true">*</span>
11
+ `)}
10
12
  </legend>
11
13
  <div class="checkbox-group-items" part="items">
12
14
  <slot></slot>
13
15
  </div>
14
- <div class="error-text" id="${C}" role="alert" ?hidden=${()=>!T()}>${e.error}</div>
15
- <div class="helper-text" id="${w}" ?hidden=${()=>!E()}>${e.helper}</div>
16
+ <div class="error-text" id="${y}" role="alert" ?hidden=${()=>!x()}>${n.error}</div>
17
+ <div class="helper-text" id="${b}" ?hidden=${()=>!S()}>${n.helper}</div>
16
18
  </fieldset>
17
- `},styles:[e.disabledStateMixin,o.default]}),exports.CHECKBOX_GROUP_CTX=u,exports.CHECKBOX_GROUP_TAG=d;
19
+ `},styles:[n.disabledStateMixin,a.default]}),exports.CHECKBOX_GROUP_CTX=c,exports.CHECKBOX_GROUP_TAG=l;
18
20
  //# sourceMappingURL=checkbox-group.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"checkbox-group.cjs","names":[],"sources":["../src/inputs/checkbox-group/checkbox-group.ts"],"sourcesContent":["import {\n createContext,\n createStableId,\n define,\n html,\n inject,\n prop,\n bind,\n getHost,\n onCleanup,\n provide,\n useEmit,\n useSlots,\n watchEffect,\n when,\n} from '@vielzeug/ore';\nimport { useField } from '@vielzeug/ore/forms';\nimport { computed, type Readable, signal } from '@vielzeug/ripple';\n\nimport type { ComponentSize, ThemeColor } from '../../types';\n\nimport {\n type ChoiceChangeDetail,\n lifecycleSignal,\n createChoiceField,\n getChoiceLabel,\n getLightChildrenByTag,\n} from '../../headless';\nimport { disablableBundle, sizableBundle, themableBundle } from '../../shared';\nimport { disabledStateMixin } from '../../styles';\nimport { FORM_CTX, useFormContext } from '../shared/form-context';\nimport componentStyles from './checkbox-group.css?inline';\n\n// ─── Context ──────────────────────────────────────────────────────────────────\n\nexport type CheckboxGroupContext = {\n color: Readable<ThemeColor | undefined>;\n disabled: Readable<boolean>;\n size: Readable<ComponentSize | undefined>;\n toggle: (value: string, originalEvent?: Event) => void;\n values: Readable<string[]>;\n};\n\nexport const CHECKBOX_GROUP_CTX = createContext<CheckboxGroupContext>('CheckboxGroupContext');\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type OreCheckboxGroupProps = {\n /** Theme color — propagated to all child ore-checkbox elements */\n color?: ThemeColor;\n /** Disable all checkboxes in the group */\n disabled?: boolean;\n /** Error message shown below the group */\n error?: string;\n /** Helper text shown below the group */\n helper?: string;\n /** Legend / label for the fieldset. Required for accessibility. */\n label?: string;\n /** Form field name used during submission */\n name?: string;\n /** Layout direction of the checkbox options */\n orientation?: 'vertical' | 'horizontal';\n /** Mark the group as required */\n required?: boolean;\n /** Size — propagated to all child ore-checkbox elements */\n size?: ComponentSize;\n /** Comma-separated list of currently checked values */\n values?: string;\n};\n\nexport type OreCheckboxGroupEvents = {\n change: ChoiceChangeDetail;\n};\n\n/**\n * A fieldset wrapper that groups `ore-checkbox` elements, provides shared\n * `color` and `size` via context, and manages multi-value selection state.\n *\n * @element ore-checkbox-group\n *\n * @attr {string} label - Legend text (required for a11y)\n * @attr {string} values - Comma-separated list of checked values\n * @attr {boolean} disabled - Disable all checkboxes in the group\n * @attr {string} error - Error message\n * @attr {string} helper - Helper text\n * @attr {string} name - Form field name\n * @attr {string} color - Theme color: 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'\n * @attr {string} size - Component size: 'sm' | 'md' | 'lg'\n * @attr {string} orientation - Layout: 'vertical' | 'horizontal'\n * @attr {boolean} required - Required field\n *\n * @fires change - Emitted when selection changes. detail: { value: string, values: string[], labels: string[], originalEvent?: Event }\n *\n * @slot - Place `ore-checkbox` elements here\n *\n * @cssprop --checkbox-group-direction - Flex direction of the items list ('row' | 'column')\n * @cssprop --checkbox-group-gap - Gap between checkbox items\n * @part items - Items container.\n * @example\n * ```html\n * <ore-checkbox-group name=\"fruits\" label=\"Favourite fruits\" required>\n * <ore-checkbox value=\"apple\">Apple</ore-checkbox>\n * <ore-checkbox value=\"banana\">Banana</ore-checkbox>\n * <ore-checkbox value=\"cherry\">Cherry</ore-checkbox>\n * </ore-checkbox-group>\n * <ore-checkbox-group name=\"options\" orientation=\"horizontal\" color=\"primary\">\n * <ore-checkbox value=\"a\">Option A</ore-checkbox>\n * <ore-checkbox value=\"b\">Option B</ore-checkbox>\n * </ore-checkbox-group>\n * ```\n */\nexport const CHECKBOX_GROUP_TAG = 'ore-checkbox-group' as const;\ndefine<OreCheckboxGroupProps>(CHECKBOX_GROUP_TAG, {\n formAssociated: true,\n props: {\n ...themableBundle,\n ...sizableBundle,\n ...disablableBundle,\n error: prop.string(),\n helper: prop.string(),\n label: prop.string(),\n name: prop.string(),\n orientation: prop.string('vertical'),\n required: prop.bool(false),\n // Not auto-reflected (`reflect: false`) — the derived, interaction-updated selection\n // (`choice.formValue`) is the single writer for this attribute, via `bind()` below;\n // letting `prop.string()`'s own default reflection also write the raw incoming value\n // would leave two effects racing to set the same attribute from different sources.\n values: { ...prop.string(), reflect: false },\n },\n setup(props) {\n const el = getHost();\n const emit = useEmit<OreCheckboxGroupEvents>();\n const slots = useSlots();\n const watch = watchEffect;\n\n const formCtx = inject(FORM_CTX);\n const fCtxProps = useFormContext(props, formCtx);\n\n const choice = createChoiceField({\n disabled: fCtxProps.disabled,\n error: props.error,\n helper: props.helper,\n multiple: signal(true),\n prefix: 'checkbox-group',\n required: props.required,\n signal: lifecycleSignal(onCleanup),\n validateOn: formCtx?.validateOn,\n value: props.values,\n });\n\n choice.attachFormField(\n useField<string>({\n disabled: choice.disabled,\n onReset: choice.reset,\n toFormValue: (v) => v,\n validationMessage: choice.validationMessage,\n validity: choice.validity,\n value: choice.formValue,\n }),\n );\n\n const checkedValues = choice.selectedValues;\n\n const getCheckboxes = (): HTMLElement[] => getLightChildrenByTag(el, 'ore-checkbox');\n const getLabelForValue = (value: string): string => getChoiceLabel(getCheckboxes(), value);\n const emitChange = (originalEvent?: Event) => {\n const values = checkedValues.value;\n\n const labels = values.map(getLabelForValue);\n\n emit('change', { labels, originalEvent, values });\n };\n\n const toggleCheckbox = (val: string, originalEvent?: Event) => {\n choice.toggleValue(val);\n choice.triggerValidation('change');\n emitChange(originalEvent);\n };\n\n provide(CHECKBOX_GROUP_CTX, {\n color: props.color,\n disabled: computed(() => Boolean(props.disabled.value)),\n size: props.size,\n toggle: toggleCheckbox,\n values: checkedValues,\n });\n\n // Sync checked state + color/size/disabled onto slotted ore-checkbox children\n const syncChildren = () => {\n const values = checkedValues.value;\n const color = props.color.value;\n const size = props.size.value;\n const disabled = props.disabled.value;\n const checkboxes = getCheckboxes();\n\n for (const checkbox of checkboxes) {\n const val = checkbox.getAttribute('value') ?? '';\n\n checkbox.toggleAttribute('checked', values.includes(val));\n\n if (color) checkbox.setAttribute('color', color);\n else checkbox.removeAttribute('color');\n\n if (size) checkbox.setAttribute('size', size);\n else checkbox.removeAttribute('size');\n\n checkbox.toggleAttribute('disabled', Boolean(disabled));\n }\n };\n\n watch(() => {\n void slots.elements().value;\n syncChildren();\n });\n\n watch(() => {\n void slots.elements().value;\n\n const listeners = getCheckboxes().map((checkbox) => {\n const handler = (event: Event) => {\n event.stopPropagation();\n\n const val = (checkbox.getAttribute('value') ?? '').trim();\n\n if (!val) return;\n\n toggleCheckbox(val, event);\n };\n\n checkbox.addEventListener('change', handler);\n\n return () => {\n checkbox.removeEventListener('change', handler);\n };\n });\n\n return () => {\n for (const dispose of listeners) dispose();\n };\n });\n\n const legendId = createStableId('checkbox-group-legend');\n const errorId = `${legendId}-error`;\n const helperId = `${legendId}-helper`;\n const hasError = () => Boolean(props.error.value);\n const hasHelper = () => Boolean(props.helper.value) && !hasError();\n\n // Reactive, not a one-off `el.setAttribute()` inside the click handler: the host's `values`\n // attribute must stay in sync with the selection regardless of *why* it changed (a click,\n // or `reset()` on ancestor form reset — neither of which should need its own copy of this).\n bind({ attr: { size: fCtxProps.size, values: choice.formValue } });\n\n return html`\n <fieldset\n role=\"group\"\n aria-required=\"${() => String(Boolean(props.required.value))}\"\n aria-invalid=\"${() => String(hasError())}\"\n aria-errormessage=\"${() => (hasError() ? errorId : null)}\"\n aria-describedby=\"${() => (hasError() ? errorId : hasHelper() ? helperId : null)}\">\n <legend id=\"${legendId}\" ?hidden=${() => !props.label.value}>\n ${props.label}${when(\n () => Boolean(props.required.value),\n () => html`<span aria-hidden=\"true\"> *</span>`,\n )}\n </legend>\n <div class=\"checkbox-group-items\" part=\"items\">\n <slot></slot>\n </div>\n <div class=\"error-text\" id=\"${errorId}\" role=\"alert\" ?hidden=${() => !hasError()}>${props.error}</div>\n <div class=\"helper-text\" id=\"${helperId}\" ?hidden=${() => !hasHelper()}>${props.helper}</div>\n </fieldset>\n `;\n },\n styles: [disabledStateMixin, componentStyles],\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"checkbox-group.cjs","names":[],"sources":["../src/inputs/checkbox-group/checkbox-group.ts"],"sourcesContent":["import {\n createContext,\n createStableId,\n define,\n html,\n prop,\n bind,\n getHost,\n onCleanup,\n provide,\n useEmit,\n useSlots,\n watchEffect,\n when,\n} from '@vielzeug/ore';\nimport { useField } from '@vielzeug/ore';\nimport { computed, type Readable, signal } from '@vielzeug/ripple';\n\nimport type { ComponentSize, ThemeColor } from '../../types';\n\nimport {\n type ChoiceChangeDetail,\n lifecycleSignal,\n createChoiceField,\n getChoiceLabel,\n getLightChildrenByTag,\n} from '../../core';\nimport { disablableBundle, sizableBundle, themableBundle } from '../../shared';\nimport { disabledStateMixin } from '../../styles';\nimport componentStyles from './checkbox-group.css?inline';\n\n// ─── Context ──────────────────────────────────────────────────────────────────\n\nexport type CheckboxGroupContext = {\n color: Readable<ThemeColor | undefined>;\n disabled: Readable<boolean>;\n size: Readable<ComponentSize | undefined>;\n toggle: (value: string, originalEvent?: Event) => void;\n values: Readable<string[]>;\n};\n\nexport const CHECKBOX_GROUP_CTX = createContext<CheckboxGroupContext>('CheckboxGroupContext');\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type OreCheckboxGroupProps = {\n /** Theme color — propagated to all child ore-checkbox elements */\n color?: ThemeColor;\n /** Disable all checkboxes in the group */\n disabled?: boolean;\n /** Error message shown below the group */\n error?: string;\n /** Helper text shown below the group */\n helper?: string;\n /** Legend / label for the fieldset. Required for accessibility. */\n label?: string;\n /** Form field name used during submission */\n name?: string;\n /** Layout direction of the checkbox options */\n orientation?: 'vertical' | 'horizontal';\n /** Mark the group as required */\n required?: boolean;\n /** Size — propagated to all child ore-checkbox elements */\n size?: ComponentSize;\n /** Comma-separated list of currently checked values */\n values?: string;\n};\n\nexport type OreCheckboxGroupEvents = {\n change: ChoiceChangeDetail;\n};\n\n/**\n * A fieldset wrapper that groups `ore-checkbox` elements, provides shared\n * `color` and `size` via context, and manages multi-value selection state.\n *\n * @element ore-checkbox-group\n *\n * @attr {string} label - Legend text (required for a11y)\n * @attr {string} values - Comma-separated list of checked values\n * @attr {boolean} disabled - Disable all checkboxes in the group\n * @attr {string} error - Error message\n * @attr {string} helper - Helper text\n * @attr {string} name - Form field name\n * @attr {string} color - Theme color: 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'\n * @attr {string} size - Component size: 'sm' | 'md' | 'lg'\n * @attr {string} orientation - Layout: 'vertical' | 'horizontal'\n * @attr {boolean} required - Required field\n *\n * @fires change - Emitted when selection changes. detail: { value: string, values: string[], labels: string[], originalEvent?: Event }\n *\n * @slot - Place `ore-checkbox` elements here\n *\n * @cssprop --checkbox-group-direction - Flex direction of the items list ('row' | 'column')\n * @cssprop --checkbox-group-gap - Gap between checkbox items\n * @part items - Items container.\n * @example\n * ```html\n * <ore-checkbox-group name=\"fruits\" label=\"Favourite fruits\" required>\n * <ore-checkbox value=\"apple\">Apple</ore-checkbox>\n * <ore-checkbox value=\"banana\">Banana</ore-checkbox>\n * <ore-checkbox value=\"cherry\">Cherry</ore-checkbox>\n * </ore-checkbox-group>\n * <ore-checkbox-group name=\"options\" orientation=\"horizontal\" color=\"primary\">\n * <ore-checkbox value=\"a\">Option A</ore-checkbox>\n * <ore-checkbox value=\"b\">Option B</ore-checkbox>\n * </ore-checkbox-group>\n * ```\n */\nexport const CHECKBOX_GROUP_TAG = 'ore-checkbox-group' as const;\ndefine<OreCheckboxGroupProps>(CHECKBOX_GROUP_TAG, {\n formAssociated: true,\n props: {\n ...themableBundle,\n ...sizableBundle,\n ...disablableBundle,\n error: prop.string(),\n helper: prop.string(),\n label: prop.string(),\n name: prop.string(),\n orientation: prop.string('vertical'),\n required: prop.bool(false),\n // Not auto-reflected (`reflect: false`) — the derived, interaction-updated selection\n // (`choice.formValue`) is the single writer for this attribute, via `bind()` below;\n // letting `prop.string()`'s own default reflection also write the raw incoming value\n // would leave two effects racing to set the same attribute from different sources.\n values: { ...prop.string(), reflect: false },\n },\n setup(props) {\n const el = getHost();\n const emit = useEmit<OreCheckboxGroupEvents>();\n const slots = useSlots();\n const watch = watchEffect;\n\n const choice = createChoiceField({\n disabled: props.disabled,\n error: props.error,\n helper: props.helper,\n multiple: signal(true),\n prefix: 'checkbox-group',\n required: props.required,\n signal: lifecycleSignal(onCleanup),\n value: props.values,\n });\n\n choice.attachFormField(\n useField<string>({\n disabled: choice.disabled,\n onReset: choice.reset,\n toFormValue: (v) => v,\n validationMessage: choice.validationMessage,\n validity: choice.validity,\n value: choice.formValue,\n }),\n );\n\n const checkedValues = choice.selectedValues;\n\n const getCheckboxes = (): HTMLElement[] => getLightChildrenByTag(el, 'ore-checkbox');\n const getLabelForValue = (value: string): string => getChoiceLabel(getCheckboxes(), value);\n const emitChange = (originalEvent?: Event) => {\n const values = checkedValues.value;\n\n const labels = values.map(getLabelForValue);\n\n emit('change', { labels, originalEvent, values });\n };\n\n const toggleCheckbox = (val: string, originalEvent?: Event) => {\n choice.toggleValue(val);\n choice.triggerValidation('change');\n emitChange(originalEvent);\n };\n\n provide(CHECKBOX_GROUP_CTX, {\n color: props.color,\n disabled: computed(() => Boolean(props.disabled.value)),\n size: props.size,\n toggle: toggleCheckbox,\n values: checkedValues,\n });\n\n // Sync checked state + color/size/disabled onto slotted ore-checkbox children\n const syncChildren = () => {\n const values = checkedValues.value;\n const color = props.color.value;\n const size = props.size.value;\n const disabled = props.disabled.value;\n const checkboxes = getCheckboxes();\n\n for (const checkbox of checkboxes) {\n const val = checkbox.getAttribute('value') ?? '';\n\n checkbox.toggleAttribute('checked', values.includes(val));\n\n if (color) checkbox.setAttribute('color', color);\n else checkbox.removeAttribute('color');\n\n if (size) checkbox.setAttribute('size', size);\n else checkbox.removeAttribute('size');\n\n checkbox.toggleAttribute('disabled', Boolean(disabled));\n }\n };\n\n watch(() => {\n void slots.elements().value;\n syncChildren();\n });\n\n watch(() => {\n void slots.elements().value;\n\n const listeners = getCheckboxes().map((checkbox) => {\n const handler = (event: Event) => {\n event.stopPropagation();\n\n const val = (checkbox.getAttribute('value') ?? '').trim();\n\n if (!val) return;\n\n toggleCheckbox(val, event);\n };\n\n checkbox.addEventListener('change', handler);\n\n return () => {\n checkbox.removeEventListener('change', handler);\n };\n });\n\n return () => {\n for (const dispose of listeners) dispose();\n };\n });\n\n const legendId = createStableId('checkbox-group-legend');\n const errorId = `${legendId}-error`;\n const helperId = `${legendId}-helper`;\n const hasError = () => Boolean(props.error.value);\n const hasHelper = () => Boolean(props.helper.value) && !hasError();\n\n // Reactive, not a one-off `el.setAttribute()` inside the click handler: the host's `values`\n // attribute must stay in sync with the selection regardless of *why* it changed (a click,\n // or `reset()` on ancestor form reset — neither of which should need its own copy of this).\n bind({ attr: { size: props.size, values: choice.formValue } });\n\n return html`\n <fieldset\n role=\"group\"\n aria-required=\"${() => String(Boolean(props.required.value))}\"\n aria-invalid=\"${() => String(hasError())}\"\n aria-errormessage=\"${() => (hasError() ? errorId : null)}\"\n aria-describedby=\"${() => (hasError() ? errorId : hasHelper() ? helperId : null)}\">\n <legend id=\"${legendId}\" ?hidden=${() => !props.label.value}>\n ${props.label}${when(\n () => Boolean(props.required.value),\n () => html`\n <span aria-hidden=\"true\">*</span>\n `,\n )}\n </legend>\n <div class=\"checkbox-group-items\" part=\"items\">\n <slot></slot>\n </div>\n <div class=\"error-text\" id=\"${errorId}\" role=\"alert\" ?hidden=${() => !hasError()}>${props.error}</div>\n <div class=\"helper-text\" id=\"${helperId}\" ?hidden=${() => !hasHelper()}>${props.helper}</div>\n </fieldset>\n `;\n },\n styles: [disabledStateMixin, componentStyles],\n});\n"],"mappings":"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"}
@@ -1,85 +1,82 @@
1
- import { disabledStateMixin as e } from "./styles/mixins/states.css.js";
2
- import { disablableBundle as t, sizableBundle as n, themableBundle as r } from "./shared/prop-bundles.js";
3
- import { lifecycleSignal as i } from "./headless/ore.js";
4
- import { createChoiceField as a } from "./headless/choice-field.js";
5
- import { getChoiceLabel as o, getLightChildrenByTag as s } from "./headless/light-dom.js";
6
- import { FORM_CTX as c, useFormContext as l } from "./inputs/shared/form-context.js";
7
- import u from "./inputs/checkbox-group/checkbox-group.css.js";
8
- import { bind as d, createContext as f, createStableId as p, define as m, getHost as h, html as g, inject as _, onCleanup as v, prop as y, provide as b, useEmit as x, useSlots as S, watchEffect as C, when as w } from "@vielzeug/ore";
9
- import { computed as T, signal as E } from "@vielzeug/ripple";
10
- import { useField as D } from "@vielzeug/ore/forms";
1
+ import { lifecycleSignal as e } from "./core/ore.js";
2
+ import { createChoiceField as t } from "./core/choice-field.js";
3
+ import { disabledStateMixin as n } from "./styles/mixins/states.css.js";
4
+ import { getChoiceLabel as r, getLightChildrenByTag as i } from "./core/light-dom.js";
5
+ import { disablableBundle as a, sizableBundle as o, themableBundle as s } from "./shared/prop-bundles.js";
6
+ import c from "./inputs/checkbox-group/checkbox-group.css.js";
7
+ import { bind as l, createContext as u, createStableId as d, define as f, getHost as p, html as m, onCleanup as h, prop as g, provide as _, useEmit as v, useField as y, useSlots as b, watchEffect as x, when as S } from "@vielzeug/ore";
8
+ import { computed as C, signal as w } from "@vielzeug/ripple";
11
9
  //#region src/inputs/checkbox-group/checkbox-group.ts
12
- var O = f("CheckboxGroupContext"), k = "ore-checkbox-group";
13
- m(k, {
10
+ var T = u("CheckboxGroupContext"), E = "ore-checkbox-group";
11
+ f(E, {
14
12
  formAssociated: !0,
15
13
  props: {
16
- ...r,
17
- ...n,
18
- ...t,
19
- error: y.string(),
20
- helper: y.string(),
21
- label: y.string(),
22
- name: y.string(),
23
- orientation: y.string("vertical"),
24
- required: y.bool(!1),
14
+ ...s,
15
+ ...o,
16
+ ...a,
17
+ error: g.string(),
18
+ helper: g.string(),
19
+ label: g.string(),
20
+ name: g.string(),
21
+ orientation: g.string("vertical"),
22
+ required: g.bool(!1),
25
23
  values: {
26
- ...y.string(),
24
+ ...g.string(),
27
25
  reflect: !1
28
26
  }
29
27
  },
30
- setup(e) {
31
- let t = h(), n = x(), r = S(), u = C, f = _(c), m = l(e, f), y = a({
32
- disabled: m.disabled,
33
- error: e.error,
34
- helper: e.helper,
35
- multiple: E(!0),
28
+ setup(n) {
29
+ let a = p(), o = v(), s = b(), c = x, u = t({
30
+ disabled: n.disabled,
31
+ error: n.error,
32
+ helper: n.helper,
33
+ multiple: w(!0),
36
34
  prefix: "checkbox-group",
37
- required: e.required,
38
- signal: i(v),
39
- validateOn: f?.validateOn,
40
- value: e.values
35
+ required: n.required,
36
+ signal: e(h),
37
+ value: n.values
41
38
  });
42
- y.attachFormField(D({
43
- disabled: y.disabled,
44
- onReset: y.reset,
39
+ u.attachFormField(y({
40
+ disabled: u.disabled,
41
+ onReset: u.reset,
45
42
  toFormValue: (e) => e,
46
- validationMessage: y.validationMessage,
47
- validity: y.validity,
48
- value: y.formValue
43
+ validationMessage: u.validationMessage,
44
+ validity: u.validity,
45
+ value: u.formValue
49
46
  }));
50
- let k = y.selectedValues, A = () => s(t, "ore-checkbox"), j = (e) => o(A(), e), M = (e) => {
51
- let t = k.value, r = t.map(j);
52
- n("change", {
53
- labels: r,
47
+ let f = u.selectedValues, g = () => i(a, "ore-checkbox"), E = (e) => r(g(), e), D = (e) => {
48
+ let t = f.value, n = t.map(E);
49
+ o("change", {
50
+ labels: n,
54
51
  originalEvent: e,
55
52
  values: t
56
53
  });
57
- }, N = (e, t) => {
58
- y.toggleValue(e), y.triggerValidation("change"), M(t);
54
+ }, O = (e, t) => {
55
+ u.toggleValue(e), u.triggerValidation("change"), D(t);
59
56
  };
60
- b(O, {
61
- color: e.color,
62
- disabled: T(() => !!e.disabled.value),
63
- size: e.size,
64
- toggle: N,
65
- values: k
57
+ _(T, {
58
+ color: n.color,
59
+ disabled: C(() => !!n.disabled.value),
60
+ size: n.size,
61
+ toggle: O,
62
+ values: f
66
63
  });
67
- let P = () => {
68
- let t = k.value, n = e.color.value, r = e.size.value, i = e.disabled.value, a = A();
69
- for (let e of a) {
70
- let a = e.getAttribute("value") ?? "";
71
- e.toggleAttribute("checked", t.includes(a)), n ? e.setAttribute("color", n) : e.removeAttribute("color"), r ? e.setAttribute("size", r) : e.removeAttribute("size"), e.toggleAttribute("disabled", !!i);
64
+ let k = () => {
65
+ let e = f.value, t = n.color.value, r = n.size.value, i = n.disabled.value, a = g();
66
+ for (let n of a) {
67
+ let a = n.getAttribute("value") ?? "";
68
+ n.toggleAttribute("checked", e.includes(a)), t ? n.setAttribute("color", t) : n.removeAttribute("color"), r ? n.setAttribute("size", r) : n.removeAttribute("size"), n.toggleAttribute("disabled", !!i);
72
69
  }
73
70
  };
74
- u(() => {
75
- r.elements().value, P();
76
- }), u(() => {
77
- r.elements().value;
78
- let e = A().map((e) => {
71
+ c(() => {
72
+ s.elements().value, k();
73
+ }), c(() => {
74
+ s.elements().value;
75
+ let e = g().map((e) => {
79
76
  let t = (t) => {
80
77
  t.stopPropagation();
81
78
  let n = (e.getAttribute("value") ?? "").trim();
82
- n && N(n, t);
79
+ n && O(n, t);
83
80
  };
84
81
  return e.addEventListener("change", t), () => {
85
82
  e.removeEventListener("change", t);
@@ -89,31 +86,33 @@ m(k, {
89
86
  for (let t of e) t();
90
87
  };
91
88
  });
92
- let F = p("checkbox-group-legend"), I = `${F}-error`, L = `${F}-helper`, R = () => !!e.error.value, z = () => !!e.helper.value && !R();
93
- return d({ attr: {
94
- size: m.size,
95
- values: y.formValue
96
- } }), g`
89
+ let A = d("checkbox-group-legend"), j = `${A}-error`, M = `${A}-helper`, N = () => !!n.error.value, P = () => !!n.helper.value && !N();
90
+ return l({ attr: {
91
+ size: n.size,
92
+ values: u.formValue
93
+ } }), m`
97
94
  <fieldset
98
95
  role="group"
99
- aria-required="${() => String(!!e.required.value)}"
100
- aria-invalid="${() => String(R())}"
101
- aria-errormessage="${() => R() ? I : null}"
102
- aria-describedby="${() => R() ? I : z() ? L : null}">
103
- <legend id="${F}" ?hidden=${() => !e.label.value}>
104
- ${e.label}${w(() => !!e.required.value, () => g`<span aria-hidden="true"> *</span>`)}
96
+ aria-required="${() => String(!!n.required.value)}"
97
+ aria-invalid="${() => String(N())}"
98
+ aria-errormessage="${() => N() ? j : null}"
99
+ aria-describedby="${() => N() ? j : P() ? M : null}">
100
+ <legend id="${A}" ?hidden=${() => !n.label.value}>
101
+ ${n.label}${S(() => !!n.required.value, () => m`
102
+ <span aria-hidden="true">*</span>
103
+ `)}
105
104
  </legend>
106
105
  <div class="checkbox-group-items" part="items">
107
106
  <slot></slot>
108
107
  </div>
109
- <div class="error-text" id="${I}" role="alert" ?hidden=${() => !R()}>${e.error}</div>
110
- <div class="helper-text" id="${L}" ?hidden=${() => !z()}>${e.helper}</div>
108
+ <div class="error-text" id="${j}" role="alert" ?hidden=${() => !N()}>${n.error}</div>
109
+ <div class="helper-text" id="${M}" ?hidden=${() => !P()}>${n.helper}</div>
111
110
  </fieldset>
112
111
  `;
113
112
  },
114
- styles: [e, u]
113
+ styles: [n, c]
115
114
  });
116
115
  //#endregion
117
- export { O as CHECKBOX_GROUP_CTX, k as CHECKBOX_GROUP_TAG };
116
+ export { T as CHECKBOX_GROUP_CTX, E as CHECKBOX_GROUP_TAG };
118
117
 
119
118
  //# sourceMappingURL=checkbox-group.js.map