@vielzeug/refine 2.1.0 → 2.1.2

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 (487) hide show
  1. package/dist/accordion-item.cjs +1 -1
  2. package/dist/accordion-item.cjs.map +1 -1
  3. package/dist/accordion-item.js +1 -1
  4. package/dist/accordion-item.js.map +1 -1
  5. package/dist/accordion.cjs +1 -1
  6. package/dist/accordion.cjs.map +1 -1
  7. package/dist/accordion.js +1 -1
  8. package/dist/accordion.js.map +1 -1
  9. package/dist/alert.cjs.map +1 -1
  10. package/dist/alert.js.map +1 -1
  11. package/dist/async.cjs.map +1 -1
  12. package/dist/async.js.map +1 -1
  13. package/dist/avatar-group.cjs.map +1 -1
  14. package/dist/avatar-group.js.map +1 -1
  15. package/dist/avatar.cjs +6 -6
  16. package/dist/avatar.cjs.map +1 -1
  17. package/dist/avatar.js +1 -2
  18. package/dist/avatar.js.map +1 -1
  19. package/dist/badge.cjs.map +1 -1
  20. package/dist/badge.js.map +1 -1
  21. package/dist/box.cjs.map +1 -1
  22. package/dist/box.js.map +1 -1
  23. package/dist/breadcrumb.cjs +3 -3
  24. package/dist/breadcrumb.cjs.map +1 -1
  25. package/dist/breadcrumb.js +4 -4
  26. package/dist/breadcrumb.js.map +1 -1
  27. package/dist/button-group.cjs +1 -1
  28. package/dist/button-group.cjs.map +1 -1
  29. package/dist/button-group.js +0 -1
  30. package/dist/button-group.js.map +1 -1
  31. package/dist/button.cjs.map +1 -1
  32. package/dist/button.js.map +1 -1
  33. package/dist/calendar.cjs.map +1 -1
  34. package/dist/calendar.js.map +1 -1
  35. package/dist/card.cjs +7 -7
  36. package/dist/card.cjs.map +1 -1
  37. package/dist/card.js +27 -27
  38. package/dist/card.js.map +1 -1
  39. package/dist/carousel.cjs +20 -20
  40. package/dist/carousel.cjs.map +1 -1
  41. package/dist/carousel.js +7 -8
  42. package/dist/carousel.js.map +1 -1
  43. package/dist/chat-message.cjs +10 -10
  44. package/dist/chat-message.cjs.map +1 -1
  45. package/dist/chat-message.js +1 -2
  46. package/dist/chat-message.js.map +1 -1
  47. package/dist/checkbox-group.cjs +7 -7
  48. package/dist/checkbox-group.cjs.map +1 -1
  49. package/dist/checkbox-group.js +26 -26
  50. package/dist/checkbox-group.js.map +1 -1
  51. package/dist/checkbox.cjs +2 -2
  52. package/dist/checkbox.cjs.map +1 -1
  53. package/dist/checkbox.js +33 -33
  54. package/dist/checkbox.js.map +1 -1
  55. package/dist/chip.cjs +16 -16
  56. package/dist/chip.cjs.map +1 -1
  57. package/dist/chip.js +1 -2
  58. package/dist/chip.js.map +1 -1
  59. package/dist/combobox.cjs +28 -28
  60. package/dist/combobox.cjs.map +1 -1
  61. package/dist/combobox.js +211 -211
  62. package/dist/combobox.js.map +1 -1
  63. package/dist/command-palette.cjs +21 -21
  64. package/dist/command-palette.cjs.map +1 -1
  65. package/dist/command-palette.js +27 -28
  66. package/dist/command-palette.js.map +1 -1
  67. package/dist/content/avatar/avatar.css.cjs +1 -1
  68. package/dist/content/avatar/avatar.css.js +1 -1
  69. package/dist/content/avatar/avatar.d.ts.map +1 -1
  70. package/dist/content/breadcrumb/breadcrumb.d.ts.map +1 -1
  71. package/dist/content/card/card.css.cjs +1 -1
  72. package/dist/content/card/card.css.cjs.map +1 -1
  73. package/dist/content/card/card.css.js +1 -1
  74. package/dist/content/card/card.css.js.map +1 -1
  75. package/dist/content/card/card.d.ts.map +1 -1
  76. package/dist/content/carousel/carousel-slide.cjs.map +1 -1
  77. package/dist/content/carousel/carousel-slide.js.map +1 -1
  78. package/dist/content/carousel/carousel.css.cjs +1 -1
  79. package/dist/content/carousel/carousel.css.cjs.map +1 -1
  80. package/dist/content/carousel/carousel.css.js +1 -1
  81. package/dist/content/carousel/carousel.css.js.map +1 -1
  82. package/dist/content/carousel/carousel.d.ts.map +1 -1
  83. package/dist/content/carousel/index.d.ts +1 -1
  84. package/dist/content/carousel/index.d.ts.map +1 -1
  85. package/dist/content/chat-message/chat-message.css.cjs +1 -1
  86. package/dist/content/chat-message/chat-message.css.js +1 -1
  87. package/dist/content/chat-message/chat-message.d.ts.map +1 -1
  88. package/dist/content/code-window/code-window.css.cjs +1 -1
  89. package/dist/content/code-window/code-window.css.js +1 -1
  90. package/dist/content/copy-command/copy-command.css.cjs +1 -1
  91. package/dist/content/copy-command/copy-command.css.js +1 -1
  92. package/dist/content/copy-command/copy-command.d.ts.map +1 -1
  93. package/dist/content/index.d.ts +22 -22
  94. package/dist/content/index.d.ts.map +1 -1
  95. package/dist/content/list/_list-item-reveal.cjs.map +1 -1
  96. package/dist/content/list/_list-item-reveal.d.ts +1 -1
  97. package/dist/content/list/_list-item-reveal.d.ts.map +1 -1
  98. package/dist/content/list/_list-item-reveal.js.map +1 -1
  99. package/dist/content/list/list-item.css.cjs +1 -1
  100. package/dist/content/list/list-item.css.cjs.map +1 -1
  101. package/dist/content/list/list-item.css.js +1 -1
  102. package/dist/content/list/list-item.css.js.map +1 -1
  103. package/dist/content/list/list.d.ts.map +1 -1
  104. package/dist/content/marquee/marquee.css.cjs +1 -1
  105. package/dist/content/marquee/marquee.css.js +1 -1
  106. package/dist/content/pagination/pagination.css.cjs +1 -1
  107. package/dist/content/pagination/pagination.css.js +1 -1
  108. package/dist/content/pagination/pagination.d.ts.map +1 -1
  109. package/dist/content/separator/separator.css.cjs +1 -1
  110. package/dist/content/separator/separator.css.js +1 -1
  111. package/dist/content/separator/separator.d.ts.map +1 -1
  112. package/dist/content/stepper/step.css.cjs.map +1 -1
  113. package/dist/content/stepper/step.css.js.map +1 -1
  114. package/dist/content/stepper/stepper.d.ts.map +1 -1
  115. package/dist/content/table/table.css.cjs +1 -1
  116. package/dist/content/table/table.css.js +1 -1
  117. package/dist/content/text/text.css.cjs +1 -1
  118. package/dist/content/text/text.css.js +1 -1
  119. package/dist/copy-command.cjs.map +1 -1
  120. package/dist/copy-command.js.map +1 -1
  121. package/dist/core/checkable.cjs +1 -1
  122. package/dist/core/checkable.cjs.map +1 -1
  123. package/dist/core/checkable.d.ts.map +1 -1
  124. package/dist/core/checkable.js +4 -4
  125. package/dist/core/checkable.js.map +1 -1
  126. package/dist/core/choice-field.cjs +1 -1
  127. package/dist/core/choice-field.cjs.map +1 -1
  128. package/dist/core/choice-field.d.ts.map +1 -1
  129. package/dist/core/choice-field.js +1 -2
  130. package/dist/core/choice-field.js.map +1 -1
  131. package/dist/core/date-picker.cjs +1 -1
  132. package/dist/core/date-picker.cjs.map +1 -1
  133. package/dist/core/date-picker.d.ts.map +1 -1
  134. package/dist/core/date-picker.js +3 -3
  135. package/dist/core/date-picker.js.map +1 -1
  136. package/dist/core/index.d.ts +17 -17
  137. package/dist/core/index.d.ts.map +1 -1
  138. package/dist/core/option-list.cjs +1 -1
  139. package/dist/core/option-list.cjs.map +1 -1
  140. package/dist/core/option-list.d.ts.map +1 -1
  141. package/dist/core/option-list.js +4 -4
  142. package/dist/core/option-list.js.map +1 -1
  143. package/dist/core/ref-callback.cjs +1 -1
  144. package/dist/core/ref-callback.cjs.map +1 -1
  145. package/dist/core/ref-callback.d.ts.map +1 -1
  146. package/dist/core/ref-callback.js +1 -1
  147. package/dist/core/ref-callback.js.map +1 -1
  148. package/dist/core/signals.cjs +1 -1
  149. package/dist/core/signals.cjs.map +1 -1
  150. package/dist/core/signals.d.ts.map +1 -1
  151. package/dist/core/signals.js +1 -2
  152. package/dist/core/signals.js.map +1 -1
  153. package/dist/core/slider.cjs.map +1 -1
  154. package/dist/core/slider.d.ts.map +1 -1
  155. package/dist/core/slider.js.map +1 -1
  156. package/dist/core/spinner.cjs.map +1 -1
  157. package/dist/core/spinner.d.ts.map +1 -1
  158. package/dist/core/spinner.js.map +1 -1
  159. package/dist/core/text-field.cjs +1 -1
  160. package/dist/core/text-field.cjs.map +1 -1
  161. package/dist/core/text-field.js +1 -1
  162. package/dist/core/text-field.js.map +1 -1
  163. package/dist/custom-elements.json +6036 -6036
  164. package/dist/datagrid.cjs +114 -114
  165. package/dist/datagrid.cjs.map +1 -1
  166. package/dist/datagrid.js +42 -43
  167. package/dist/datagrid.js.map +1 -1
  168. package/dist/date-picker.cjs.map +1 -1
  169. package/dist/date-picker.js.map +1 -1
  170. package/dist/dialog.cjs.map +1 -1
  171. package/dist/dialog.js.map +1 -1
  172. package/dist/disclosure/accordion/accordion.d.ts.map +1 -1
  173. package/dist/disclosure/accordion-item/accordion-item.css.cjs +1 -1
  174. package/dist/disclosure/accordion-item/accordion-item.css.cjs.map +1 -1
  175. package/dist/disclosure/accordion-item/accordion-item.css.js +1 -1
  176. package/dist/disclosure/accordion-item/accordion-item.css.js.map +1 -1
  177. package/dist/disclosure/index.d.ts +6 -6
  178. package/dist/disclosure/index.d.ts.map +1 -1
  179. package/dist/disclosure/tab-item/tab-item.css.cjs.map +1 -1
  180. package/dist/disclosure/tab-item/tab-item.css.js.map +1 -1
  181. package/dist/disclosure/tab-item/tab-item.d.ts.map +1 -1
  182. package/dist/disclosure/tabs/tabs.css.cjs +1 -1
  183. package/dist/disclosure/tabs/tabs.css.cjs.map +1 -1
  184. package/dist/disclosure/tabs/tabs.css.js +1 -1
  185. package/dist/disclosure/tabs/tabs.css.js.map +1 -1
  186. package/dist/disclosure/tabs/tabs.d.ts.map +1 -1
  187. package/dist/drawer.cjs +5 -5
  188. package/dist/drawer.cjs.map +1 -1
  189. package/dist/drawer.js +26 -26
  190. package/dist/drawer.js.map +1 -1
  191. package/dist/feedback/alert/alert.css.cjs +1 -1
  192. package/dist/feedback/alert/alert.css.js +1 -1
  193. package/dist/feedback/async/async.d.ts +1 -1
  194. package/dist/feedback/async/async.d.ts.map +1 -1
  195. package/dist/feedback/badge/badge.css.cjs +1 -1
  196. package/dist/feedback/badge/badge.css.js +1 -1
  197. package/dist/feedback/badge/badge.d.ts.map +1 -1
  198. package/dist/feedback/chip/chip.css.cjs.map +1 -1
  199. package/dist/feedback/chip/chip.css.js.map +1 -1
  200. package/dist/feedback/chip/chip.d.ts.map +1 -1
  201. package/dist/feedback/index.d.ts +12 -12
  202. package/dist/feedback/index.d.ts.map +1 -1
  203. package/dist/feedback/progress/progress.d.ts.map +1 -1
  204. package/dist/feedback/skeleton/skeleton.d.ts.map +1 -1
  205. package/dist/feedback/toast/index.d.ts +1 -1
  206. package/dist/feedback/toast/index.d.ts.map +1 -1
  207. package/dist/feedback/toast/toast.css.cjs +1 -1
  208. package/dist/feedback/toast/toast.css.cjs.map +1 -1
  209. package/dist/feedback/toast/toast.css.js +1 -1
  210. package/dist/feedback/toast/toast.css.js.map +1 -1
  211. package/dist/feedback/toast/toast.d.ts +1 -1
  212. package/dist/feedback/toast/toast.d.ts.map +1 -1
  213. package/dist/feedback/typing-indicator/typing-indicator.d.ts.map +1 -1
  214. package/dist/file-input.cjs +67 -67
  215. package/dist/file-input.cjs.map +1 -1
  216. package/dist/file-input.js +129 -130
  217. package/dist/file-input.js.map +1 -1
  218. package/dist/grid.cjs.map +1 -1
  219. package/dist/grid.js.map +1 -1
  220. package/dist/icon.cjs.map +1 -1
  221. package/dist/icon.js.map +1 -1
  222. package/dist/input.cjs +21 -21
  223. package/dist/input.cjs.map +1 -1
  224. package/dist/input.js +58 -58
  225. package/dist/input.js.map +1 -1
  226. package/dist/inputs/button/button.css.cjs +1 -1
  227. package/dist/inputs/button/button.css.js +1 -1
  228. package/dist/inputs/button/button.d.ts.map +1 -1
  229. package/dist/inputs/button-group/button-group.css.cjs.map +1 -1
  230. package/dist/inputs/button-group/button-group.css.js.map +1 -1
  231. package/dist/inputs/button-group/button-group.d.ts +1 -1
  232. package/dist/inputs/button-group/button-group.d.ts.map +1 -1
  233. package/dist/inputs/calendar/calendar.css.cjs +1 -1
  234. package/dist/inputs/calendar/calendar.css.cjs.map +1 -1
  235. package/dist/inputs/calendar/calendar.css.js +1 -1
  236. package/dist/inputs/calendar/calendar.css.js.map +1 -1
  237. package/dist/inputs/calendar/calendar.d.ts.map +1 -1
  238. package/dist/inputs/checkbox/checkbox.css.cjs +1 -1
  239. package/dist/inputs/checkbox/checkbox.css.js +1 -1
  240. package/dist/inputs/checkbox/checkbox.d.ts.map +1 -1
  241. package/dist/inputs/checkbox-group/checkbox-group.d.ts +1 -1
  242. package/dist/inputs/checkbox-group/checkbox-group.d.ts.map +1 -1
  243. package/dist/inputs/combobox/combobox.css.cjs +1 -1
  244. package/dist/inputs/combobox/combobox.css.js +1 -1
  245. package/dist/inputs/combobox/combobox.d.ts.map +1 -1
  246. package/dist/inputs/datagrid/datagrid-column.cjs.map +1 -1
  247. package/dist/inputs/datagrid/datagrid-column.d.ts.map +1 -1
  248. package/dist/inputs/datagrid/datagrid-column.js.map +1 -1
  249. package/dist/inputs/datagrid/datagrid-model.cjs +1 -1
  250. package/dist/inputs/datagrid/datagrid-model.cjs.map +1 -1
  251. package/dist/inputs/datagrid/datagrid-model.d.ts.map +1 -1
  252. package/dist/inputs/datagrid/datagrid-model.js +1 -2
  253. package/dist/inputs/datagrid/datagrid-model.js.map +1 -1
  254. package/dist/inputs/datagrid/datagrid.css.cjs +1 -1
  255. package/dist/inputs/datagrid/datagrid.css.cjs.map +1 -1
  256. package/dist/inputs/datagrid/datagrid.css.js +1 -1
  257. package/dist/inputs/datagrid/datagrid.css.js.map +1 -1
  258. package/dist/inputs/datagrid/datagrid.d.ts +1 -1
  259. package/dist/inputs/datagrid/datagrid.d.ts.map +1 -1
  260. package/dist/inputs/date-picker/date-picker.css.cjs +1 -1
  261. package/dist/inputs/date-picker/date-picker.css.cjs.map +1 -1
  262. package/dist/inputs/date-picker/date-picker.css.js +1 -1
  263. package/dist/inputs/date-picker/date-picker.css.js.map +1 -1
  264. package/dist/inputs/date-picker/date-picker.d.ts.map +1 -1
  265. package/dist/inputs/file-input/file-input-upload.cjs +1 -1
  266. package/dist/inputs/file-input/file-input-upload.cjs.map +1 -1
  267. package/dist/inputs/file-input/file-input-upload.d.ts.map +1 -1
  268. package/dist/inputs/file-input/file-input-upload.js +2 -3
  269. package/dist/inputs/file-input/file-input-upload.js.map +1 -1
  270. package/dist/inputs/file-input/file-input.css.cjs +1 -1
  271. package/dist/inputs/file-input/file-input.css.js +1 -1
  272. package/dist/inputs/file-input/file-input.d.ts.map +1 -1
  273. package/dist/inputs/index.d.ts +28 -28
  274. package/dist/inputs/index.d.ts.map +1 -1
  275. package/dist/inputs/input/input.css.cjs +1 -1
  276. package/dist/inputs/input/input.css.js +1 -1
  277. package/dist/inputs/input/input.d.ts.map +1 -1
  278. package/dist/inputs/message-composer/message-composer.css.cjs +1 -1
  279. package/dist/inputs/message-composer/message-composer.css.js +1 -1
  280. package/dist/inputs/message-composer/message-composer.d.ts +1 -1
  281. package/dist/inputs/message-composer/message-composer.d.ts.map +1 -1
  282. package/dist/inputs/number-input/number-input.d.ts.map +1 -1
  283. package/dist/inputs/otp-input/otp-input.d.ts.map +1 -1
  284. package/dist/inputs/radio/radio.css.cjs +1 -1
  285. package/dist/inputs/radio/radio.css.js +1 -1
  286. package/dist/inputs/radio/radio.d.ts.map +1 -1
  287. package/dist/inputs/radio-group/radio-group.d.ts +2 -2
  288. package/dist/inputs/radio-group/radio-group.d.ts.map +1 -1
  289. package/dist/inputs/rating/rating.d.ts.map +1 -1
  290. package/dist/inputs/select/select.css.cjs +1 -1
  291. package/dist/inputs/select/select.css.js +1 -1
  292. package/dist/inputs/select/select.d.ts.map +1 -1
  293. package/dist/inputs/shared/field-binding.cjs.map +1 -1
  294. package/dist/inputs/shared/field-binding.d.ts.map +1 -1
  295. package/dist/inputs/shared/field-binding.js.map +1 -1
  296. package/dist/inputs/shared/templates.cjs.map +1 -1
  297. package/dist/inputs/shared/templates.d.ts.map +1 -1
  298. package/dist/inputs/shared/templates.js.map +1 -1
  299. package/dist/inputs/slider/slider.d.ts.map +1 -1
  300. package/dist/inputs/switch/switch.css.cjs +1 -1
  301. package/dist/inputs/switch/switch.css.js +1 -1
  302. package/dist/inputs/switch/switch.d.ts.map +1 -1
  303. package/dist/inputs/textarea/textarea.css.cjs +1 -1
  304. package/dist/inputs/textarea/textarea.css.js +1 -1
  305. package/dist/inputs/textarea/textarea.d.ts.map +1 -1
  306. package/dist/inputs/time-picker/time-picker.css.cjs +1 -1
  307. package/dist/inputs/time-picker/time-picker.css.cjs.map +1 -1
  308. package/dist/inputs/time-picker/time-picker.css.js +1 -1
  309. package/dist/inputs/time-picker/time-picker.css.js.map +1 -1
  310. package/dist/inputs/time-picker/time-picker.d.ts.map +1 -1
  311. package/dist/layout/box/box.d.ts.map +1 -1
  312. package/dist/layout/grid/grid.d.ts.map +1 -1
  313. package/dist/layout/index.d.ts +6 -6
  314. package/dist/layout/index.d.ts.map +1 -1
  315. package/dist/layout/navbar/navbar.css.cjs +1 -1
  316. package/dist/layout/navbar/navbar.css.js +1 -1
  317. package/dist/layout/navbar/navbar.d.ts.map +1 -1
  318. package/dist/layout/sidebar/sidebar-group.css.cjs +1 -1
  319. package/dist/layout/sidebar/sidebar-group.css.cjs.map +1 -1
  320. package/dist/layout/sidebar/sidebar-group.css.js +1 -1
  321. package/dist/layout/sidebar/sidebar-group.css.js.map +1 -1
  322. package/dist/layout/sidebar/sidebar.css.cjs +1 -1
  323. package/dist/layout/sidebar/sidebar.css.cjs.map +1 -1
  324. package/dist/layout/sidebar/sidebar.css.js +1 -1
  325. package/dist/layout/sidebar/sidebar.css.js.map +1 -1
  326. package/dist/layout/sidebar/sidebar.d.ts.map +1 -1
  327. package/dist/list-item.cjs.map +1 -1
  328. package/dist/list-item.js.map +1 -1
  329. package/dist/list.cjs +2 -2
  330. package/dist/list.cjs.map +1 -1
  331. package/dist/list.js +15 -16
  332. package/dist/list.js.map +1 -1
  333. package/dist/marquee.cjs +1 -1
  334. package/dist/marquee.cjs.map +1 -1
  335. package/dist/marquee.js +1 -1
  336. package/dist/marquee.js.map +1 -1
  337. package/dist/menu.cjs +5 -5
  338. package/dist/menu.cjs.map +1 -1
  339. package/dist/menu.js +38 -39
  340. package/dist/menu.js.map +1 -1
  341. package/dist/message-composer.cjs +16 -16
  342. package/dist/message-composer.cjs.map +1 -1
  343. package/dist/message-composer.js +61 -61
  344. package/dist/message-composer.js.map +1 -1
  345. package/dist/navbar.cjs +9 -9
  346. package/dist/navbar.cjs.map +1 -1
  347. package/dist/navbar.js +1 -2
  348. package/dist/navbar.js.map +1 -1
  349. package/dist/navigation-menu.cjs +5 -5
  350. package/dist/navigation-menu.cjs.map +1 -1
  351. package/dist/navigation-menu.js +33 -34
  352. package/dist/navigation-menu.js.map +1 -1
  353. package/dist/number-input.cjs +24 -24
  354. package/dist/number-input.cjs.map +1 -1
  355. package/dist/number-input.js +41 -42
  356. package/dist/number-input.js.map +1 -1
  357. package/dist/otp-input.cjs +13 -13
  358. package/dist/otp-input.cjs.map +1 -1
  359. package/dist/otp-input.js +32 -33
  360. package/dist/otp-input.js.map +1 -1
  361. package/dist/overlay/command-palette/command-palette-items.cjs.map +1 -1
  362. package/dist/overlay/command-palette/command-palette-items.d.ts.map +1 -1
  363. package/dist/overlay/command-palette/command-palette-items.js.map +1 -1
  364. package/dist/overlay/command-palette/command-palette.css.cjs +1 -1
  365. package/dist/overlay/command-palette/command-palette.css.cjs.map +1 -1
  366. package/dist/overlay/command-palette/command-palette.css.js +1 -1
  367. package/dist/overlay/command-palette/command-palette.css.js.map +1 -1
  368. package/dist/overlay/command-palette/command-palette.d.ts.map +1 -1
  369. package/dist/overlay/dialog/dialog.css.cjs +1 -1
  370. package/dist/overlay/dialog/dialog.css.js +1 -1
  371. package/dist/overlay/dialog/dialog.d.ts.map +1 -1
  372. package/dist/overlay/drawer/drawer.css.cjs +1 -1
  373. package/dist/overlay/drawer/drawer.css.js +1 -1
  374. package/dist/overlay/drawer/drawer.d.ts +2 -2
  375. package/dist/overlay/drawer/drawer.d.ts.map +1 -1
  376. package/dist/overlay/index.d.ts +6 -6
  377. package/dist/overlay/index.d.ts.map +1 -1
  378. package/dist/overlay/menu/menu.css.cjs +1 -1
  379. package/dist/overlay/menu/menu.css.js +1 -1
  380. package/dist/overlay/menu/menu.d.ts +2 -2
  381. package/dist/overlay/menu/menu.d.ts.map +1 -1
  382. package/dist/overlay/navigation-menu/navigation-menu.d.ts.map +1 -1
  383. package/dist/overlay/popover/popover.d.ts +1 -1
  384. package/dist/overlay/popover/popover.d.ts.map +1 -1
  385. package/dist/overlay/shared/use-dialog.cjs +1 -1
  386. package/dist/overlay/shared/use-dialog.cjs.map +1 -1
  387. package/dist/overlay/shared/use-dialog.d.ts.map +1 -1
  388. package/dist/overlay/shared/use-dialog.js +4 -5
  389. package/dist/overlay/shared/use-dialog.js.map +1 -1
  390. package/dist/overlay/shared/use-floating-trigger.cjs +1 -1
  391. package/dist/overlay/shared/use-floating-trigger.cjs.map +1 -1
  392. package/dist/overlay/shared/use-floating-trigger.d.ts.map +1 -1
  393. package/dist/overlay/shared/use-floating-trigger.js +1 -2
  394. package/dist/overlay/shared/use-floating-trigger.js.map +1 -1
  395. package/dist/overlay/tooltip/tooltip.d.ts +1 -1
  396. package/dist/overlay/tooltip/tooltip.d.ts.map +1 -1
  397. package/dist/pagination.cjs.map +1 -1
  398. package/dist/pagination.js.map +1 -1
  399. package/dist/popover.cjs +1 -1
  400. package/dist/popover.cjs.map +1 -1
  401. package/dist/popover.js +0 -1
  402. package/dist/popover.js.map +1 -1
  403. package/dist/progress.cjs.map +1 -1
  404. package/dist/progress.js.map +1 -1
  405. package/dist/radio-group.cjs +5 -5
  406. package/dist/radio-group.cjs.map +1 -1
  407. package/dist/radio-group.js +26 -27
  408. package/dist/radio-group.js.map +1 -1
  409. package/dist/radio.cjs +2 -2
  410. package/dist/radio.cjs.map +1 -1
  411. package/dist/radio.js +41 -41
  412. package/dist/radio.js.map +1 -1
  413. package/dist/rating.cjs +4 -4
  414. package/dist/rating.cjs.map +1 -1
  415. package/dist/rating.js +36 -36
  416. package/dist/rating.js.map +1 -1
  417. package/dist/refine.cjs +686 -686
  418. package/dist/refine.cjs.map +1 -1
  419. package/dist/refine.iife.js +686 -686
  420. package/dist/refine.iife.js.map +1 -1
  421. package/dist/refine.js +737 -737
  422. package/dist/refine.js.map +1 -1
  423. package/dist/select.cjs +42 -42
  424. package/dist/select.cjs.map +1 -1
  425. package/dist/select.js +146 -147
  426. package/dist/select.js.map +1 -1
  427. package/dist/separator.cjs.map +1 -1
  428. package/dist/separator.js.map +1 -1
  429. package/dist/sidebar.cjs +17 -17
  430. package/dist/sidebar.cjs.map +1 -1
  431. package/dist/sidebar.js +7 -8
  432. package/dist/sidebar.js.map +1 -1
  433. package/dist/skeleton.cjs +3 -3
  434. package/dist/skeleton.cjs.map +1 -1
  435. package/dist/skeleton.js +1 -2
  436. package/dist/skeleton.js.map +1 -1
  437. package/dist/slider.cjs +12 -12
  438. package/dist/slider.cjs.map +1 -1
  439. package/dist/slider.js +54 -55
  440. package/dist/slider.js.map +1 -1
  441. package/dist/step.cjs.map +1 -1
  442. package/dist/step.js.map +1 -1
  443. package/dist/stepper.cjs +2 -2
  444. package/dist/stepper.cjs.map +1 -1
  445. package/dist/stepper.js +8 -7
  446. package/dist/stepper.js.map +1 -1
  447. package/dist/styles/index.d.ts +2 -2
  448. package/dist/styles/index.d.ts.map +1 -1
  449. package/dist/styles/preflight.css +1 -1
  450. package/dist/styles/theme.css +15 -30
  451. package/dist/switch.cjs +3 -3
  452. package/dist/switch.cjs.map +1 -1
  453. package/dist/switch.js +28 -28
  454. package/dist/switch.js.map +1 -1
  455. package/dist/tab-item.cjs +2 -2
  456. package/dist/tab-item.cjs.map +1 -1
  457. package/dist/tab-item.js +21 -21
  458. package/dist/tab-item.js.map +1 -1
  459. package/dist/tab-panel.cjs +2 -2
  460. package/dist/tab-panel.cjs.map +1 -1
  461. package/dist/tab-panel.js +9 -9
  462. package/dist/tab-panel.js.map +1 -1
  463. package/dist/table.cjs +1 -1
  464. package/dist/table.cjs.map +1 -1
  465. package/dist/table.js +1 -1
  466. package/dist/table.js.map +1 -1
  467. package/dist/tabs.cjs +6 -6
  468. package/dist/tabs.cjs.map +1 -1
  469. package/dist/tabs.js +14 -15
  470. package/dist/tabs.js.map +1 -1
  471. package/dist/textarea.cjs +11 -11
  472. package/dist/textarea.cjs.map +1 -1
  473. package/dist/textarea.js +59 -59
  474. package/dist/textarea.js.map +1 -1
  475. package/dist/time-picker.cjs.map +1 -1
  476. package/dist/time-picker.js.map +1 -1
  477. package/dist/toast.cjs +16 -16
  478. package/dist/toast.cjs.map +1 -1
  479. package/dist/toast.js +20 -21
  480. package/dist/toast.js.map +1 -1
  481. package/dist/tooltip.cjs.map +1 -1
  482. package/dist/tooltip.js.map +1 -1
  483. package/dist/typing-indicator.cjs +1 -1
  484. package/dist/typing-indicator.cjs.map +1 -1
  485. package/dist/typing-indicator.js +1 -1
  486. package/dist/typing-indicator.js.map +1 -1
  487. package/package.json +96 -97
@@ -1 +1 @@
1
- {"version":3,"file":"avatar.cjs","names":[],"sources":["../src/content/avatar/avatar.ts"],"sourcesContent":["import { define, html, prop } from '@vielzeug/ore';\nimport { computed, signal } from '@vielzeug/ripple';\nimport { watch } from '@vielzeug/ripple/watch';\n\nimport type { ComponentSize, RoundedSize, ThemeColor } from '../../types';\n\nimport '../icon/icon';\nimport { roundableBundle, sizableBundle, themableBundle } from '../../shared';\nimport { colorThemeMixin, roundedVariantMixin, sizeVariantMixin } from '../../styles';\nimport componentStyles from './avatar.css?inline';\n\nexport type AvatarStatus = 'online' | 'offline' | 'busy' | 'away';\n\nconst STATUS_LABELS: Record<AvatarStatus, string> = {\n away: 'Away',\n busy: 'Busy',\n offline: 'Offline',\n online: 'Online',\n};\n\n/** Avatar component properties */\nexport type OreAvatarProps = {\n /** Alt text for the image; also used to derive initials when no `initials` prop is given */\n alt?: string;\n /** Theme color (used for initials background) */\n color?: ThemeColor;\n /** Explicit initials to display when no image is available (e.g. \"JD\") */\n initials?: string;\n /** Border radius */\n rounded?: RoundedSize | '';\n /** Component size */\n size?: ComponentSize;\n /** Image source URL */\n src?: string;\n /** Online presence indicator */\n status?: AvatarStatus;\n};\n\n/**\n * Displays a user avatar: image → initials → generic fallback icon, in that priority order.\n *\n * @element ore-avatar\n *\n * @attr {string} src - Image source URL\n * @attr {string} alt - Image alt text (also used to derive initials)\n * @attr {string} initials - Explicit initials (up to 2 chars)\n * @attr {string} color - Theme color for initials background: 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'\n * @attr {string} size - 'sm' | 'md' | 'lg'\n * @attr {string} rounded - Border radius: 'none' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | 'full'\n * @attr {string} status - 'online' | 'offline' | 'busy' | 'away'\n *\n * @slot - Fallback content shown when image and initials are unavailable.\n * @cssprop --avatar-size - Diameter of the avatar\n * @cssprop --avatar-bg - Background color\n * @cssprop --avatar-color - Text/icon color\n * @cssprop --avatar-radius - Border radius\n * @cssprop --avatar-border - Border shorthand\n * @cssprop --avatar-border-color - Border color (also controls status dot border)\n *\n * @part avatar - Avatar root container.\n * @part img - Image element.\n * @part initials - Initials fallback element.\n * @part fallback - Shadow part for the `fallback` element.\n * @part status - Status indicator element.\n * @part overflow - Overflow indicator element.\n * @example\n * ```html\n * <ore-avatar src=\"/jane.jpg\" alt=\"Jane Doe\"></ore-avatar>\n * <ore-avatar initials=\"JD\" color=\"primary\"></ore-avatar>\n * <ore-avatar alt=\"John Smith\" status=\"online\"></ore-avatar>\n * ```\n */\nexport const AVATAR_TAG = 'ore-avatar' as const;\ndefine<OreAvatarProps>(AVATAR_TAG, {\n props: {\n ...themableBundle,\n ...sizableBundle,\n ...roundableBundle,\n alt: prop.string(),\n initials: prop.string(),\n src: prop.string(),\n status: prop.string<AvatarStatus>(),\n },\n setup(props) {\n const imgFailed = signal(false);\n\n // Reset stale error state whenever src changes\n watch(props.src, () => {\n imgFailed.value = false;\n });\n\n // Attach load/error listeners reactively when the img element mounts\n const attachImgListeners = (el: HTMLImageElement | null) => {\n if (!el) return;\n\n el.addEventListener('error', () => {\n imgFailed.value = true;\n });\n el.addEventListener('load', () => {\n imgFailed.value = false;\n });\n };\n const derivedInitials = computed(() => {\n if (props.initials.value) return props.initials.value.slice(0, 2);\n\n const alt = props.alt.value;\n\n if (!alt) return '';\n\n const parts = alt.trim().split(/\\s+/);\n\n if (parts.length >= 2) return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n\n return parts[0].slice(0, 2).toUpperCase();\n });\n const showImage = computed(() => !!props.src.value && !imgFailed.value);\n const showInitials = computed(() => !showImage.value && !!derivedInitials.value);\n const showFallback = computed(() => !showImage.value && !showInitials.value);\n const avatarLabel = () => {\n const name = (props.alt.value as string | undefined) || null;\n const statusKey = props.status.value as AvatarStatus | undefined;\n const status = statusKey ? STATUS_LABELS[statusKey] : null;\n\n if (!name && !status) return null;\n\n if (!name) return `Status: ${status}`;\n\n if (!status) return name;\n\n return `${name}, ${status}`;\n };\n const avatarRole = () => (avatarLabel() ? 'img' : null);\n\n return html`\n <span class=\"avatar\" part=\"avatar\" aria-label=\"${avatarLabel}\" role=\"${avatarRole}\">\n ${() =>\n props.src.value\n ? html`\n <img\n ref=\"${attachImgListeners}\"\n part=\"img\"\n src=\"${props.src}\"\n alt=\"${props.alt}\"\n ?hidden=\"${() => !showImage.value}\"\n aria-hidden=\"true\" />\n `\n : ''}\n ${() =>\n showInitials.value\n ? html`\n <span class=\"initials\" part=\"initials\" aria-hidden=\"true\">${derivedInitials}</span>\n `\n : ''}\n ${() =>\n showFallback.value\n ? html`\n <ore-icon class=\"icon-fallback\" part=\"fallback\" name=\"user\" size=\"50%\"></ore-icon>\n `\n : ''}\n </span>\n ${() =>\n props.status.value\n ? html`\n <span class=\"status\" part=\"status\" data-status=\"${props.status}\" aria-hidden=\"true\"></span>\n `\n : ''}\n `;\n },\n styles: [\n colorThemeMixin,\n roundedVariantMixin,\n sizeVariantMixin({\n lg: { fontSize: 'var(--avatar-font-size, var(--text-base))', size: 'var(--avatar-size, var(--size-14))' },\n md: { fontSize: 'var(--avatar-font-size, var(--text-sm))', size: 'var(--avatar-size, var(--size-10))' },\n sm: { fontSize: 'var(--avatar-font-size, var(--text-xs))', size: 'var(--avatar-size, var(--size-7))' },\n }),\n componentStyles,\n ],\n});\n"],"mappings":"oVAaA,IAAM,EAA8C,CAClD,KAAM,OACN,KAAM,OACN,QAAS,UACT,OAAQ,QACV,EAsDa,EAAa,cAC1B,EAAA,EAAA,OAAA,CAAuB,EAAY,CACjC,MAAO,CACL,GAAG,EAAA,eACH,GAAG,EAAA,cACH,GAAG,EAAA,gBACH,IAAK,EAAA,KAAK,OAAO,EACjB,SAAU,EAAA,KAAK,OAAO,EACtB,IAAK,EAAA,KAAK,OAAO,EACjB,OAAQ,EAAA,KAAK,OAAqB,CACpC,EACA,MAAM,EAAO,CACX,IAAM,GAAA,EAAY,EAAA,OAAA,CAAO,EAAK,GAG9B,EAAA,EAAA,MAAA,CAAM,EAAM,QAAW,CACrB,EAAU,MAAQ,EACpB,CAAC,EAGD,IAAM,EAAsB,GAAgC,CACrD,IAEL,EAAG,iBAAiB,YAAe,CACjC,EAAU,MAAQ,EACpB,CAAC,EACD,EAAG,iBAAiB,WAAc,CAChC,EAAU,MAAQ,EACpB,CAAC,EACH,EACM,GAAA,EAAkB,EAAA,SAAA,KAAe,CACrC,GAAI,EAAM,SAAS,MAAO,OAAO,EAAM,SAAS,MAAM,MAAM,EAAG,CAAC,EAEhE,IAAM,EAAM,EAAM,IAAI,MAEtB,GAAI,CAAC,EAAK,MAAO,GAEjB,IAAM,EAAQ,EAAI,KAAK,CAAC,CAAC,MAAM,KAAK,EAIpC,OAFI,EAAM,QAAU,GAAW,EAAM,EAAE,CAAC,GAAK,EAAM,EAAM,OAAS,EAAE,CAAC,GAAA,CAAI,YAAY,EAE9E,EAAM,EAAE,CAAC,MAAM,EAAG,CAAC,CAAC,CAAC,YAAY,CAC1C,CAAC,EACK,GAAA,EAAY,EAAA,SAAA,KAAe,CAAC,CAAC,EAAM,IAAI,OAAS,CAAC,EAAU,KAAK,EAChE,GAAA,EAAe,EAAA,SAAA,KAAe,CAAC,EAAU,OAAS,CAAC,CAAC,EAAgB,KAAK,EACzE,GAAA,EAAe,EAAA,SAAA,KAAe,CAAC,EAAU,OAAS,CAAC,EAAa,KAAK,EACrE,MAAoB,CACxB,IAAM,EAAQ,EAAM,IAAI,OAAgC,KAClD,EAAY,EAAM,OAAO,MACzB,EAAS,EAAY,EAAc,GAAa,KAQtD,MANI,CAAC,GAAQ,CAAC,EAAe,KAExB,EAEA,EAEE,GAAG,EAAK,IAAI,IAFC,EAFF,WAAW,GAK/B,EAGA,MAAO,GAAA,IAAI;uDACwC,EAAY,cAHrC,EAAY,EAAI,MAAQ,KAGkC;cAE9E,EAAM,IAAI,MACN,EAAA,IAAI;;yBAEO,EAAmB;;yBAEnB,EAAM,IAAI;yBACV,EAAM,IAAI;iCACA,CAAC,EAAU,MAAM;;gBAGtC,GAAG;cAEP,EAAa,MACT,EAAA,IAAI;4EAC0D,EAAgB;gBAE9E,GAAG;cAEP,EAAa,MACT,EAAA,IAAI;;gBAGJ,GAAG;;YAGT,EAAM,OAAO,MACT,EAAA,IAAI;gEACgD,EAAM,OAAO;cAEjE,GAAG;KAEb,EACA,OAAQ,CACN,EAAA,gBACA,EAAA,oBACA,EAAA,iBAAiB,CACf,GAAI,CAAE,SAAU,4CAA6C,KAAM,oCAAqC,EACxG,GAAI,CAAE,SAAU,0CAA2C,KAAM,oCAAqC,EACtG,GAAI,CAAE,SAAU,0CAA2C,KAAM,mCAAoC,CACvG,CAAC,EACD,EAAA,OACF,CACF,CAAC"}
1
+ {"version":3,"file":"avatar.cjs","names":[],"sources":["../src/content/avatar/avatar.ts"],"sourcesContent":["import { define, html, prop } from '@vielzeug/ore';\nimport { computed, signal, watch } from '@vielzeug/ripple';\n\nimport type { ComponentSize, RoundedSize, ThemeColor } from '../../types';\n\nimport '../icon/icon';\nimport { roundableBundle, sizableBundle, themableBundle } from '../../shared';\nimport { colorThemeMixin, roundedVariantMixin, sizeVariantMixin } from '../../styles';\nimport componentStyles from './avatar.css?inline';\n\nexport type AvatarStatus = 'online' | 'offline' | 'busy' | 'away';\n\nconst STATUS_LABELS: Record<AvatarStatus, string> = {\n away: 'Away',\n busy: 'Busy',\n offline: 'Offline',\n online: 'Online',\n};\n\n/** Avatar component properties */\nexport type OreAvatarProps = {\n /** Alt text for the image; also used to derive initials when no `initials` prop is given */\n alt?: string;\n /** Theme color (used for initials background) */\n color?: ThemeColor;\n /** Explicit initials to display when no image is available (e.g. \"JD\") */\n initials?: string;\n /** Border radius */\n rounded?: RoundedSize | '';\n /** Component size */\n size?: ComponentSize;\n /** Image source URL */\n src?: string;\n /** Online presence indicator */\n status?: AvatarStatus;\n};\n\n/**\n * Displays a user avatar: image → initials → generic fallback icon, in that priority order.\n *\n * @element ore-avatar\n *\n * @attr {string} src - Image source URL\n * @attr {string} alt - Image alt text (also used to derive initials)\n * @attr {string} initials - Explicit initials (up to 2 chars)\n * @attr {string} color - Theme color for initials background: 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'\n * @attr {string} size - 'sm' | 'md' | 'lg'\n * @attr {string} rounded - Border radius: 'none' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | 'full'\n * @attr {string} status - 'online' | 'offline' | 'busy' | 'away'\n *\n * @slot - Fallback content shown when image and initials are unavailable.\n * @cssprop --avatar-size - Diameter of the avatar\n * @cssprop --avatar-bg - Background color\n * @cssprop --avatar-color - Text/icon color\n * @cssprop --avatar-radius - Border radius\n * @cssprop --avatar-border - Border shorthand\n * @cssprop --avatar-border-color - Border color (also controls status dot border)\n *\n * @part avatar - Avatar root container.\n * @part img - Image element.\n * @part initials - Initials fallback element.\n * @part fallback - Shadow part for the `fallback` element.\n * @part status - Status indicator element.\n * @part overflow - Overflow indicator element.\n * @example\n * ```html\n * <ore-avatar src=\"/jane.jpg\" alt=\"Jane Doe\"></ore-avatar>\n * <ore-avatar initials=\"JD\" color=\"primary\"></ore-avatar>\n * <ore-avatar alt=\"John Smith\" status=\"online\"></ore-avatar>\n * ```\n */\nexport const AVATAR_TAG = 'ore-avatar' as const;\ndefine<OreAvatarProps>(AVATAR_TAG, {\n props: {\n ...themableBundle,\n ...sizableBundle,\n ...roundableBundle,\n alt: prop.string(),\n initials: prop.string(),\n src: prop.string(),\n status: prop.string<AvatarStatus>(),\n },\n setup(props) {\n const imgFailed = signal(false);\n\n // Reset stale error state whenever src changes\n watch(props.src, () => {\n imgFailed.value = false;\n });\n\n // Attach load/error listeners reactively when the img element mounts\n const attachImgListeners = (el: HTMLImageElement | null) => {\n if (!el) return;\n\n el.addEventListener('error', () => {\n imgFailed.value = true;\n });\n el.addEventListener('load', () => {\n imgFailed.value = false;\n });\n };\n const derivedInitials = computed(() => {\n if (props.initials.value) return props.initials.value.slice(0, 2);\n\n const alt = props.alt.value;\n\n if (!alt) return '';\n\n const parts = alt.trim().split(/\\s+/);\n\n if (parts.length >= 2) return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n\n return parts[0].slice(0, 2).toUpperCase();\n });\n const showImage = computed(() => !!props.src.value && !imgFailed.value);\n const showInitials = computed(() => !showImage.value && !!derivedInitials.value);\n const showFallback = computed(() => !showImage.value && !showInitials.value);\n const avatarLabel = () => {\n const name = (props.alt.value as string | undefined) || null;\n const statusKey = props.status.value as AvatarStatus | undefined;\n const status = statusKey ? STATUS_LABELS[statusKey] : null;\n\n if (!name && !status) return null;\n\n if (!name) return `Status: ${status}`;\n\n if (!status) return name;\n\n return `${name}, ${status}`;\n };\n const avatarRole = () => (avatarLabel() ? 'img' : null);\n\n return html`\n <span class=\"avatar\" part=\"avatar\" aria-label=\"${avatarLabel}\" role=\"${avatarRole}\">\n ${() =>\n props.src.value\n ? html`\n <img\n ref=\"${attachImgListeners}\"\n part=\"img\"\n src=\"${props.src}\"\n alt=\"${props.alt}\"\n ?hidden=\"${() => !showImage.value}\"\n aria-hidden=\"true\" />\n `\n : ''}\n ${() =>\n showInitials.value\n ? html`\n <span class=\"initials\" part=\"initials\" aria-hidden=\"true\">${derivedInitials}</span>\n `\n : ''}\n ${() =>\n showFallback.value\n ? html`\n <ore-icon class=\"icon-fallback\" part=\"fallback\" name=\"user\" size=\"50%\"></ore-icon>\n `\n : ''}\n </span>\n ${() =>\n props.status.value\n ? html`\n <span class=\"status\" part=\"status\" data-status=\"${props.status}\" aria-hidden=\"true\"></span>\n `\n : ''}\n `;\n },\n styles: [\n colorThemeMixin,\n roundedVariantMixin,\n sizeVariantMixin({\n lg: { fontSize: 'var(--avatar-font-size, var(--text-base))', size: 'var(--avatar-size, var(--size-14))' },\n md: { fontSize: 'var(--avatar-font-size, var(--text-sm))', size: 'var(--avatar-size, var(--size-10))' },\n sm: { fontSize: 'var(--avatar-font-size, var(--text-xs))', size: 'var(--avatar-size, var(--size-7))' },\n }),\n componentStyles,\n ],\n});\n"],"mappings":"gTAYA,IAAM,EAA8C,CAClD,KAAM,OACN,KAAM,OACN,QAAS,UACT,OAAQ,QACV,EAsDa,EAAa,cAC1B,EAAA,EAAA,OAAA,CAAuB,EAAY,CACjC,MAAO,CACL,GAAG,EAAA,eACH,GAAG,EAAA,cACH,GAAG,EAAA,gBACH,IAAK,EAAA,KAAK,OAAO,EACjB,SAAU,EAAA,KAAK,OAAO,EACtB,IAAK,EAAA,KAAK,OAAO,EACjB,OAAQ,EAAA,KAAK,OAAqB,CACpC,EACA,MAAM,EAAO,CACX,IAAM,GAAA,EAAY,EAAA,OAAA,CAAO,EAAK,GAG9B,EAAA,EAAA,MAAA,CAAM,EAAM,QAAW,CACrB,EAAU,MAAQ,EACpB,CAAC,EAGD,IAAM,EAAsB,GAAgC,CACrD,IAEL,EAAG,iBAAiB,YAAe,CACjC,EAAU,MAAQ,EACpB,CAAC,EACD,EAAG,iBAAiB,WAAc,CAChC,EAAU,MAAQ,EACpB,CAAC,EACH,EACM,GAAA,EAAkB,EAAA,SAAA,KAAe,CACrC,GAAI,EAAM,SAAS,MAAO,OAAO,EAAM,SAAS,MAAM,MAAM,EAAG,CAAC,EAEhE,IAAM,EAAM,EAAM,IAAI,MAEtB,GAAI,CAAC,EAAK,MAAO,GAEjB,IAAM,EAAQ,EAAI,KAAK,CAAC,CAAC,MAAM,KAAK,EAIpC,OAFI,EAAM,QAAU,GAAW,EAAM,EAAE,CAAC,GAAK,EAAM,EAAM,OAAS,EAAE,CAAC,GAAA,CAAI,YAAY,EAE9E,EAAM,EAAE,CAAC,MAAM,EAAG,CAAC,CAAC,CAAC,YAAY,CAC1C,CAAC,EACK,GAAA,EAAY,EAAA,SAAA,KAAe,CAAC,CAAC,EAAM,IAAI,OAAS,CAAC,EAAU,KAAK,EAChE,GAAA,EAAe,EAAA,SAAA,KAAe,CAAC,EAAU,OAAS,CAAC,CAAC,EAAgB,KAAK,EACzE,GAAA,EAAe,EAAA,SAAA,KAAe,CAAC,EAAU,OAAS,CAAC,EAAa,KAAK,EACrE,MAAoB,CACxB,IAAM,EAAQ,EAAM,IAAI,OAAgC,KAClD,EAAY,EAAM,OAAO,MACzB,EAAS,EAAY,EAAc,GAAa,KAQtD,MANI,CAAC,GAAQ,CAAC,EAAe,KAExB,EAEA,EAEE,GAAG,EAAK,IAAI,IAFC,EAFF,WAAW,GAK/B,EAGA,MAAO,GAAA,IAAI;uDACwC,EAAY,cAHrC,EAAY,EAAI,MAAQ,KAGkC;cAE9E,EAAM,IAAI,MACN,EAAA,IAAI;;yBAEO,EAAmB;;yBAEnB,EAAM,IAAI;yBACV,EAAM,IAAI;iCACA,CAAC,EAAU,MAAM;;gBAGtC,GAAG;cAEP,EAAa,MACT,EAAA,IAAI;4EAC0D,EAAgB;gBAE9E,GAAG;cAEP,EAAa,MACT,EAAA,IAAI;;gBAGJ,GAAG;;YAGT,EAAM,OAAO,MACT,EAAA,IAAI;gEACgD,EAAM,OAAO;cAEjE,GAAG;KAEb,EACA,OAAQ,CACN,EAAA,gBACA,EAAA,oBACA,EAAA,iBAAiB,CACf,GAAI,CAAE,SAAU,4CAA6C,KAAM,oCAAqC,EACxG,GAAI,CAAE,SAAU,0CAA2C,KAAM,oCAAqC,EACtG,GAAI,CAAE,SAAU,0CAA2C,KAAM,mCAAoC,CACvG,CAAC,EACD,EAAA,OACF,CACF,CAAC"}
package/dist/avatar.js CHANGED
@@ -3,8 +3,7 @@ import { colorThemeMixin as n } from "./styles/mixins/theme.css.js";
3
3
  import { roundableBundle as r, sizableBundle as i, themableBundle as a } from "./shared/prop-bundles.js";
4
4
  import o from "./content/avatar/avatar.css.js";
5
5
  import { define as s, html as c, prop as l } from "@vielzeug/ore";
6
- import { computed as u, signal as d } from "@vielzeug/ripple";
7
- import { watch as f } from "@vielzeug/ripple/watch";
6
+ import { computed as u, signal as d, watch as f } from "@vielzeug/ripple";
8
7
  //#region src/content/avatar/avatar.ts
9
8
  var p = {
10
9
  away: "Away",
@@ -1 +1 @@
1
- {"version":3,"file":"avatar.js","names":[],"sources":["../src/content/avatar/avatar.ts"],"sourcesContent":["import { define, html, prop } from '@vielzeug/ore';\nimport { computed, signal } from '@vielzeug/ripple';\nimport { watch } from '@vielzeug/ripple/watch';\n\nimport type { ComponentSize, RoundedSize, ThemeColor } from '../../types';\n\nimport '../icon/icon';\nimport { roundableBundle, sizableBundle, themableBundle } from '../../shared';\nimport { colorThemeMixin, roundedVariantMixin, sizeVariantMixin } from '../../styles';\nimport componentStyles from './avatar.css?inline';\n\nexport type AvatarStatus = 'online' | 'offline' | 'busy' | 'away';\n\nconst STATUS_LABELS: Record<AvatarStatus, string> = {\n away: 'Away',\n busy: 'Busy',\n offline: 'Offline',\n online: 'Online',\n};\n\n/** Avatar component properties */\nexport type OreAvatarProps = {\n /** Alt text for the image; also used to derive initials when no `initials` prop is given */\n alt?: string;\n /** Theme color (used for initials background) */\n color?: ThemeColor;\n /** Explicit initials to display when no image is available (e.g. \"JD\") */\n initials?: string;\n /** Border radius */\n rounded?: RoundedSize | '';\n /** Component size */\n size?: ComponentSize;\n /** Image source URL */\n src?: string;\n /** Online presence indicator */\n status?: AvatarStatus;\n};\n\n/**\n * Displays a user avatar: image → initials → generic fallback icon, in that priority order.\n *\n * @element ore-avatar\n *\n * @attr {string} src - Image source URL\n * @attr {string} alt - Image alt text (also used to derive initials)\n * @attr {string} initials - Explicit initials (up to 2 chars)\n * @attr {string} color - Theme color for initials background: 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'\n * @attr {string} size - 'sm' | 'md' | 'lg'\n * @attr {string} rounded - Border radius: 'none' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | 'full'\n * @attr {string} status - 'online' | 'offline' | 'busy' | 'away'\n *\n * @slot - Fallback content shown when image and initials are unavailable.\n * @cssprop --avatar-size - Diameter of the avatar\n * @cssprop --avatar-bg - Background color\n * @cssprop --avatar-color - Text/icon color\n * @cssprop --avatar-radius - Border radius\n * @cssprop --avatar-border - Border shorthand\n * @cssprop --avatar-border-color - Border color (also controls status dot border)\n *\n * @part avatar - Avatar root container.\n * @part img - Image element.\n * @part initials - Initials fallback element.\n * @part fallback - Shadow part for the `fallback` element.\n * @part status - Status indicator element.\n * @part overflow - Overflow indicator element.\n * @example\n * ```html\n * <ore-avatar src=\"/jane.jpg\" alt=\"Jane Doe\"></ore-avatar>\n * <ore-avatar initials=\"JD\" color=\"primary\"></ore-avatar>\n * <ore-avatar alt=\"John Smith\" status=\"online\"></ore-avatar>\n * ```\n */\nexport const AVATAR_TAG = 'ore-avatar' as const;\ndefine<OreAvatarProps>(AVATAR_TAG, {\n props: {\n ...themableBundle,\n ...sizableBundle,\n ...roundableBundle,\n alt: prop.string(),\n initials: prop.string(),\n src: prop.string(),\n status: prop.string<AvatarStatus>(),\n },\n setup(props) {\n const imgFailed = signal(false);\n\n // Reset stale error state whenever src changes\n watch(props.src, () => {\n imgFailed.value = false;\n });\n\n // Attach load/error listeners reactively when the img element mounts\n const attachImgListeners = (el: HTMLImageElement | null) => {\n if (!el) return;\n\n el.addEventListener('error', () => {\n imgFailed.value = true;\n });\n el.addEventListener('load', () => {\n imgFailed.value = false;\n });\n };\n const derivedInitials = computed(() => {\n if (props.initials.value) return props.initials.value.slice(0, 2);\n\n const alt = props.alt.value;\n\n if (!alt) return '';\n\n const parts = alt.trim().split(/\\s+/);\n\n if (parts.length >= 2) return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n\n return parts[0].slice(0, 2).toUpperCase();\n });\n const showImage = computed(() => !!props.src.value && !imgFailed.value);\n const showInitials = computed(() => !showImage.value && !!derivedInitials.value);\n const showFallback = computed(() => !showImage.value && !showInitials.value);\n const avatarLabel = () => {\n const name = (props.alt.value as string | undefined) || null;\n const statusKey = props.status.value as AvatarStatus | undefined;\n const status = statusKey ? STATUS_LABELS[statusKey] : null;\n\n if (!name && !status) return null;\n\n if (!name) return `Status: ${status}`;\n\n if (!status) return name;\n\n return `${name}, ${status}`;\n };\n const avatarRole = () => (avatarLabel() ? 'img' : null);\n\n return html`\n <span class=\"avatar\" part=\"avatar\" aria-label=\"${avatarLabel}\" role=\"${avatarRole}\">\n ${() =>\n props.src.value\n ? html`\n <img\n ref=\"${attachImgListeners}\"\n part=\"img\"\n src=\"${props.src}\"\n alt=\"${props.alt}\"\n ?hidden=\"${() => !showImage.value}\"\n aria-hidden=\"true\" />\n `\n : ''}\n ${() =>\n showInitials.value\n ? html`\n <span class=\"initials\" part=\"initials\" aria-hidden=\"true\">${derivedInitials}</span>\n `\n : ''}\n ${() =>\n showFallback.value\n ? html`\n <ore-icon class=\"icon-fallback\" part=\"fallback\" name=\"user\" size=\"50%\"></ore-icon>\n `\n : ''}\n </span>\n ${() =>\n props.status.value\n ? html`\n <span class=\"status\" part=\"status\" data-status=\"${props.status}\" aria-hidden=\"true\"></span>\n `\n : ''}\n `;\n },\n styles: [\n colorThemeMixin,\n roundedVariantMixin,\n sizeVariantMixin({\n lg: { fontSize: 'var(--avatar-font-size, var(--text-base))', size: 'var(--avatar-size, var(--size-14))' },\n md: { fontSize: 'var(--avatar-font-size, var(--text-sm))', size: 'var(--avatar-size, var(--size-10))' },\n sm: { fontSize: 'var(--avatar-font-size, var(--text-xs))', size: 'var(--avatar-size, var(--size-7))' },\n }),\n componentStyles,\n ],\n});\n"],"mappings":";;;;;;;;AAaA,IAAM,IAA8C;CAClD,MAAM;CACN,MAAM;CACN,SAAS;CACT,QAAQ;AACV,GAsDa,IAAa;AAC1B,EAAuB,GAAY;CACjC,OAAO;EACL,GAAG;EACH,GAAG;EACH,GAAG;EACH,KAAK,EAAK,OAAO;EACjB,UAAU,EAAK,OAAO;EACtB,KAAK,EAAK,OAAO;EACjB,QAAQ,EAAK,OAAqB;CACpC;CACA,MAAM,GAAO;EACX,IAAM,IAAY,EAAO,EAAK;EAG9B,EAAM,EAAM,WAAW;GACrB,EAAU,QAAQ;EACpB,CAAC;EAGD,IAAM,KAAsB,MAAgC;GACrD,MAEL,EAAG,iBAAiB,eAAe;IACjC,EAAU,QAAQ;GACpB,CAAC,GACD,EAAG,iBAAiB,cAAc;IAChC,EAAU,QAAQ;GACpB,CAAC;EACH,GACM,IAAkB,QAAe;GACrC,IAAI,EAAM,SAAS,OAAO,OAAO,EAAM,SAAS,MAAM,MAAM,GAAG,CAAC;GAEhE,IAAM,IAAM,EAAM,IAAI;GAEtB,IAAI,CAAC,GAAK,OAAO;GAEjB,IAAM,IAAQ,EAAI,KAAK,CAAC,CAAC,MAAM,KAAK;GAIpC,OAFI,EAAM,UAAU,KAAW,EAAM,EAAE,CAAC,KAAK,EAAM,EAAM,SAAS,EAAE,CAAC,GAAA,CAAI,YAAY,IAE9E,EAAM,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,YAAY;EAC1C,CAAC,GACK,IAAY,QAAe,CAAC,CAAC,EAAM,IAAI,SAAS,CAAC,EAAU,KAAK,GAChE,IAAe,QAAe,CAAC,EAAU,SAAS,CAAC,CAAC,EAAgB,KAAK,GACzE,IAAe,QAAe,CAAC,EAAU,SAAS,CAAC,EAAa,KAAK,GACrE,UAAoB;GACxB,IAAM,IAAQ,EAAM,IAAI,SAAgC,MAClD,IAAY,EAAM,OAAO,OACzB,IAAS,IAAY,EAAc,KAAa;GAQtD,OANI,CAAC,KAAQ,CAAC,IAAe,OAExB,IAEA,IAEE,GAAG,EAAK,IAAI,MAFC,IAFF,WAAW;EAK/B;EAGA,OAAO,CAAI;uDACwC,EAAY,gBAHrC,EAAY,IAAI,QAAQ,KAGkC;gBAE9E,EAAM,IAAI,QACN,CAAI;;yBAEO,EAAmB;;yBAEnB,EAAM,IAAI;yBACV,EAAM,IAAI;mCACA,CAAC,EAAU,MAAM;;kBAGtC,GAAG;gBAEP,EAAa,QACT,CAAI;4EAC0D,EAAgB;kBAE9E,GAAG;gBAEP,EAAa,QACT,CAAI;;kBAGJ,GAAG;;cAGT,EAAM,OAAO,QACT,CAAI;gEACgD,EAAM,OAAO;gBAEjE,GAAG;;CAEb;CACA,QAAQ;EACN;EACA;EACA,EAAiB;GACf,IAAI;IAAE,UAAU;IAA6C,MAAM;GAAqC;GACxG,IAAI;IAAE,UAAU;IAA2C,MAAM;GAAqC;GACtG,IAAI;IAAE,UAAU;IAA2C,MAAM;GAAoC;EACvG,CAAC;EACD;CACF;AACF,CAAC"}
1
+ {"version":3,"file":"avatar.js","names":[],"sources":["../src/content/avatar/avatar.ts"],"sourcesContent":["import { define, html, prop } from '@vielzeug/ore';\nimport { computed, signal, watch } from '@vielzeug/ripple';\n\nimport type { ComponentSize, RoundedSize, ThemeColor } from '../../types';\n\nimport '../icon/icon';\nimport { roundableBundle, sizableBundle, themableBundle } from '../../shared';\nimport { colorThemeMixin, roundedVariantMixin, sizeVariantMixin } from '../../styles';\nimport componentStyles from './avatar.css?inline';\n\nexport type AvatarStatus = 'online' | 'offline' | 'busy' | 'away';\n\nconst STATUS_LABELS: Record<AvatarStatus, string> = {\n away: 'Away',\n busy: 'Busy',\n offline: 'Offline',\n online: 'Online',\n};\n\n/** Avatar component properties */\nexport type OreAvatarProps = {\n /** Alt text for the image; also used to derive initials when no `initials` prop is given */\n alt?: string;\n /** Theme color (used for initials background) */\n color?: ThemeColor;\n /** Explicit initials to display when no image is available (e.g. \"JD\") */\n initials?: string;\n /** Border radius */\n rounded?: RoundedSize | '';\n /** Component size */\n size?: ComponentSize;\n /** Image source URL */\n src?: string;\n /** Online presence indicator */\n status?: AvatarStatus;\n};\n\n/**\n * Displays a user avatar: image → initials → generic fallback icon, in that priority order.\n *\n * @element ore-avatar\n *\n * @attr {string} src - Image source URL\n * @attr {string} alt - Image alt text (also used to derive initials)\n * @attr {string} initials - Explicit initials (up to 2 chars)\n * @attr {string} color - Theme color for initials background: 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'\n * @attr {string} size - 'sm' | 'md' | 'lg'\n * @attr {string} rounded - Border radius: 'none' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | 'full'\n * @attr {string} status - 'online' | 'offline' | 'busy' | 'away'\n *\n * @slot - Fallback content shown when image and initials are unavailable.\n * @cssprop --avatar-size - Diameter of the avatar\n * @cssprop --avatar-bg - Background color\n * @cssprop --avatar-color - Text/icon color\n * @cssprop --avatar-radius - Border radius\n * @cssprop --avatar-border - Border shorthand\n * @cssprop --avatar-border-color - Border color (also controls status dot border)\n *\n * @part avatar - Avatar root container.\n * @part img - Image element.\n * @part initials - Initials fallback element.\n * @part fallback - Shadow part for the `fallback` element.\n * @part status - Status indicator element.\n * @part overflow - Overflow indicator element.\n * @example\n * ```html\n * <ore-avatar src=\"/jane.jpg\" alt=\"Jane Doe\"></ore-avatar>\n * <ore-avatar initials=\"JD\" color=\"primary\"></ore-avatar>\n * <ore-avatar alt=\"John Smith\" status=\"online\"></ore-avatar>\n * ```\n */\nexport const AVATAR_TAG = 'ore-avatar' as const;\ndefine<OreAvatarProps>(AVATAR_TAG, {\n props: {\n ...themableBundle,\n ...sizableBundle,\n ...roundableBundle,\n alt: prop.string(),\n initials: prop.string(),\n src: prop.string(),\n status: prop.string<AvatarStatus>(),\n },\n setup(props) {\n const imgFailed = signal(false);\n\n // Reset stale error state whenever src changes\n watch(props.src, () => {\n imgFailed.value = false;\n });\n\n // Attach load/error listeners reactively when the img element mounts\n const attachImgListeners = (el: HTMLImageElement | null) => {\n if (!el) return;\n\n el.addEventListener('error', () => {\n imgFailed.value = true;\n });\n el.addEventListener('load', () => {\n imgFailed.value = false;\n });\n };\n const derivedInitials = computed(() => {\n if (props.initials.value) return props.initials.value.slice(0, 2);\n\n const alt = props.alt.value;\n\n if (!alt) return '';\n\n const parts = alt.trim().split(/\\s+/);\n\n if (parts.length >= 2) return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n\n return parts[0].slice(0, 2).toUpperCase();\n });\n const showImage = computed(() => !!props.src.value && !imgFailed.value);\n const showInitials = computed(() => !showImage.value && !!derivedInitials.value);\n const showFallback = computed(() => !showImage.value && !showInitials.value);\n const avatarLabel = () => {\n const name = (props.alt.value as string | undefined) || null;\n const statusKey = props.status.value as AvatarStatus | undefined;\n const status = statusKey ? STATUS_LABELS[statusKey] : null;\n\n if (!name && !status) return null;\n\n if (!name) return `Status: ${status}`;\n\n if (!status) return name;\n\n return `${name}, ${status}`;\n };\n const avatarRole = () => (avatarLabel() ? 'img' : null);\n\n return html`\n <span class=\"avatar\" part=\"avatar\" aria-label=\"${avatarLabel}\" role=\"${avatarRole}\">\n ${() =>\n props.src.value\n ? html`\n <img\n ref=\"${attachImgListeners}\"\n part=\"img\"\n src=\"${props.src}\"\n alt=\"${props.alt}\"\n ?hidden=\"${() => !showImage.value}\"\n aria-hidden=\"true\" />\n `\n : ''}\n ${() =>\n showInitials.value\n ? html`\n <span class=\"initials\" part=\"initials\" aria-hidden=\"true\">${derivedInitials}</span>\n `\n : ''}\n ${() =>\n showFallback.value\n ? html`\n <ore-icon class=\"icon-fallback\" part=\"fallback\" name=\"user\" size=\"50%\"></ore-icon>\n `\n : ''}\n </span>\n ${() =>\n props.status.value\n ? html`\n <span class=\"status\" part=\"status\" data-status=\"${props.status}\" aria-hidden=\"true\"></span>\n `\n : ''}\n `;\n },\n styles: [\n colorThemeMixin,\n roundedVariantMixin,\n sizeVariantMixin({\n lg: { fontSize: 'var(--avatar-font-size, var(--text-base))', size: 'var(--avatar-size, var(--size-14))' },\n md: { fontSize: 'var(--avatar-font-size, var(--text-sm))', size: 'var(--avatar-size, var(--size-10))' },\n sm: { fontSize: 'var(--avatar-font-size, var(--text-xs))', size: 'var(--avatar-size, var(--size-7))' },\n }),\n componentStyles,\n ],\n});\n"],"mappings":";;;;;;;AAYA,IAAM,IAA8C;CAClD,MAAM;CACN,MAAM;CACN,SAAS;CACT,QAAQ;AACV,GAsDa,IAAa;AAC1B,EAAuB,GAAY;CACjC,OAAO;EACL,GAAG;EACH,GAAG;EACH,GAAG;EACH,KAAK,EAAK,OAAO;EACjB,UAAU,EAAK,OAAO;EACtB,KAAK,EAAK,OAAO;EACjB,QAAQ,EAAK,OAAqB;CACpC;CACA,MAAM,GAAO;EACX,IAAM,IAAY,EAAO,EAAK;EAG9B,EAAM,EAAM,WAAW;GACrB,EAAU,QAAQ;EACpB,CAAC;EAGD,IAAM,KAAsB,MAAgC;GACrD,MAEL,EAAG,iBAAiB,eAAe;IACjC,EAAU,QAAQ;GACpB,CAAC,GACD,EAAG,iBAAiB,cAAc;IAChC,EAAU,QAAQ;GACpB,CAAC;EACH,GACM,IAAkB,QAAe;GACrC,IAAI,EAAM,SAAS,OAAO,OAAO,EAAM,SAAS,MAAM,MAAM,GAAG,CAAC;GAEhE,IAAM,IAAM,EAAM,IAAI;GAEtB,IAAI,CAAC,GAAK,OAAO;GAEjB,IAAM,IAAQ,EAAI,KAAK,CAAC,CAAC,MAAM,KAAK;GAIpC,OAFI,EAAM,UAAU,KAAW,EAAM,EAAE,CAAC,KAAK,EAAM,EAAM,SAAS,EAAE,CAAC,GAAA,CAAI,YAAY,IAE9E,EAAM,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,YAAY;EAC1C,CAAC,GACK,IAAY,QAAe,CAAC,CAAC,EAAM,IAAI,SAAS,CAAC,EAAU,KAAK,GAChE,IAAe,QAAe,CAAC,EAAU,SAAS,CAAC,CAAC,EAAgB,KAAK,GACzE,IAAe,QAAe,CAAC,EAAU,SAAS,CAAC,EAAa,KAAK,GACrE,UAAoB;GACxB,IAAM,IAAQ,EAAM,IAAI,SAAgC,MAClD,IAAY,EAAM,OAAO,OACzB,IAAS,IAAY,EAAc,KAAa;GAQtD,OANI,CAAC,KAAQ,CAAC,IAAe,OAExB,IAEA,IAEE,GAAG,EAAK,IAAI,MAFC,IAFF,WAAW;EAK/B;EAGA,OAAO,CAAI;uDACwC,EAAY,gBAHrC,EAAY,IAAI,QAAQ,KAGkC;gBAE9E,EAAM,IAAI,QACN,CAAI;;yBAEO,EAAmB;;yBAEnB,EAAM,IAAI;yBACV,EAAM,IAAI;mCACA,CAAC,EAAU,MAAM;;kBAGtC,GAAG;gBAEP,EAAa,QACT,CAAI;4EAC0D,EAAgB;kBAE9E,GAAG;gBAEP,EAAa,QACT,CAAI;;kBAGJ,GAAG;;cAGT,EAAM,OAAO,QACT,CAAI;gEACgD,EAAM,OAAO;gBAEjE,GAAG;;CAEb;CACA,QAAQ;EACN;EACA;EACA,EAAiB;GACf,IAAI;IAAE,UAAU;IAA6C,MAAM;GAAqC;GACxG,IAAI;IAAE,UAAU;IAA2C,MAAM;GAAqC;GACtG,IAAI;IAAE,UAAU;IAA2C,MAAM;GAAoC;EACvG,CAAC;EACD;CACF;AACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"badge.cjs","names":[],"sources":["../src/feedback/badge/badge.ts"],"sourcesContent":["import { define, html, prop } from '@vielzeug/ore';\nimport { computed } from '@vielzeug/ripple';\n\nimport type { RoundedSize, ThemeColor, VisualVariant } from '../../types';\n\nimport { roundableBundle, themableBundle } from '../../shared';\nimport {\n colorThemeMixin,\n forcedColorsMixin,\n frostVariantMixin,\n roundedVariantMixin,\n sizeVariantMixin,\n} from '../../styles';\nimport componentStyles from './badge.css?inline';\n\ntype BadgeVariant = Extract<VisualVariant, 'solid' | 'flat' | 'bordered' | 'outline' | 'frost'>;\ntype BadgeSize = 'xs' | 'sm' | 'md' | 'lg';\n\n/** Badge component properties */\nexport type OreBadgeProps = {\n /**\n * When set, switches to overlay mode: the host becomes `position:relative`\n * and the badge pins to a corner over the slotted content.\n * Value controls which corner: 'top-end' (default) | 'top-start' | 'bottom-end' | 'bottom-start'\n */\n anchor?: 'top-end' | 'top-start' | 'bottom-end' | 'bottom-start';\n /** Theme color */\n color?: ThemeColor;\n /** Numeric count to display */\n count?: number;\n /** Render as a small dot with no label */\n dot?: boolean;\n /** Accessible label for assistive technology. Recommended for count-only and dot mode. */\n label?: string;\n /** Max count — displays \"<max>+\" when count exceeds this value */\n max?: number;\n /** Border radius override */\n rounded?: RoundedSize;\n /** Badge size */\n size?: BadgeSize;\n /** Visual style variant */\n variant?: BadgeVariant;\n};\n\n/**\n * A compact badge/chip for counts, statuses, and labels.\n * Supports numeric counts with overflow, dot mode, and icon slots.\n *\n * @element ore-badge\n *\n * @attr {string} color - Theme color: 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'\n * @attr {string} variant - Visual variant: 'solid' | 'flat' | 'bordered' | 'outline' | 'frost'\n * @attr {string} size - Component size: 'xs' | 'sm' | 'md' | 'lg'\n * @attr {number} count - Numeric count to display\n * @attr {number} max - Max count before showing \"<max>+\"\n * @attr {boolean} dot - Render as a dot indicator (no text)\n * @attr {string} rounded - Border radius: 'none' | 'sm' | 'md' | 'lg' | 'full' etc.\n *\n * @slot - Badge label text\n * @slot icon - Icon displayed before the label\n * @slot target - Element the badge is anchored to (used with the anchor attribute)\n *\n * @cssprop --badge-bg - Badge background color\n * @cssprop --badge-color - Badge text color\n * @cssprop --badge-border-color - Badge border color\n * @cssprop --badge-radius - Border radius\n * @cssprop --badge-font-size - Font size\n * @cssprop --badge-font-weight - Font weight\n * @cssprop --badge-padding-x - Horizontal padding\n * @cssprop --badge-padding-y - Vertical padding\n * @cssprop --badge-gap - Gap between icon and label\n *\n * @part badge - Shadow part for the `badge` element.\n * @example\n * ```html\n * <ore-badge color=\"primary\">New</ore-badge>\n * <ore-badge color=\"error\" count=\"5\"></ore-badge>\n * <ore-badge color=\"error\" count=\"120\" max=\"99\"></ore-badge>\n * <ore-badge color=\"success\" dot></ore-badge>\n * <ore-badge color=\"warning\" variant=\"flat\">Beta</ore-badge>\n * ```\n */\nexport const BADGE_TAG = 'ore-badge' as const;\ndefine<OreBadgeProps>(BADGE_TAG, {\n props: {\n ...themableBundle,\n size: prop.string<BadgeSize>(),\n ...roundableBundle,\n anchor: prop.string<'top-end' | 'top-start' | 'bottom-end' | 'bottom-start'>(),\n count: prop.number(),\n dot: prop.bool(false),\n label: prop.string(),\n max: prop.number(),\n variant: prop.string<BadgeVariant>(),\n },\n setup(props) {\n const label = computed(() => {\n const count = props.count.value != null ? Number(props.count.value) : undefined;\n const max = props.max.value != null ? Number(props.max.value) : undefined;\n\n if (count === undefined || Number.isNaN(count)) return undefined;\n\n if (max !== undefined && !Number.isNaN(max) && count > max) return `${max}+`;\n\n return String(count);\n });\n\n const ariaLabel = computed(() => {\n if (props.label.value) return props.label.value;\n\n if (props.dot.value) return undefined;\n\n if (label.value != null) return `${label.value} notifications`;\n\n return undefined;\n });\n\n return html`\n <span class=\"badge\" part=\"badge\" aria-label=\"${ariaLabel}\">\n <slot name=\"icon\"></slot>\n <span ?hidden=\"${() => label.value == null}\">${label}</span>\n <span class=\"badge-label\" ?hidden=\"${() => label.value != null}\"><slot></slot></span>\n </span>\n <slot name=\"target\"></slot>\n `;\n },\n styles: [\n colorThemeMixin,\n forcedColorsMixin,\n roundedVariantMixin,\n frostVariantMixin('.badge'),\n sizeVariantMixin({\n lg: { '--_padding-x': 'var(--size-2-5)', '--_padding-y': 'var(--size-1)', fontSize: 'var(--text-sm)' },\n md: { '--_padding-x': 'var(--size-2)', '--_padding-y': 'var(--size-0-5)', fontSize: 'var(--text-xs)' },\n sm: { '--_padding-x': 'var(--size-1-5)', '--_padding-y': 'var(--size-px)', fontSize: 'var(--text-xs)' },\n }),\n componentStyles,\n ],\n});\n"],"mappings":"6VAkFA,IAAa,EAAY,aACzB,EAAA,EAAA,OAAA,CAAsB,EAAW,CAC/B,MAAO,CACL,GAAG,EAAA,eACH,KAAM,EAAA,KAAK,OAAkB,EAC7B,GAAG,EAAA,gBACH,OAAQ,EAAA,KAAK,OAAgE,EAC7E,MAAO,EAAA,KAAK,OAAO,EACnB,IAAK,EAAA,KAAK,KAAK,EAAK,EACpB,MAAO,EAAA,KAAK,OAAO,EACnB,IAAK,EAAA,KAAK,OAAO,EACjB,QAAS,EAAA,KAAK,OAAqB,CACrC,EACA,MAAM,EAAO,CACX,IAAM,GAAA,EAAQ,EAAA,SAAA,KAAe,CAC3B,IAAM,EAAQ,EAAM,MAAM,OAAS,KAAmC,IAAA,GAA5B,OAAO,EAAM,MAAM,KAAK,EAC5D,EAAM,EAAM,IAAI,OAAS,KAAiC,IAAA,GAA1B,OAAO,EAAM,IAAI,KAAK,EAExD,SAAU,IAAA,IAAa,OAAO,MAAM,CAAK,GAI7C,OAFI,IAAQ,IAAA,IAAa,CAAC,OAAO,MAAM,CAAG,GAAK,EAAQ,EAAY,GAAG,EAAI,GAEnE,OAAO,CAAK,CACrB,CAAC,EAEK,GAAA,EAAY,EAAA,SAAA,KAAe,CAC/B,GAAI,EAAM,MAAM,MAAO,OAAO,EAAM,MAAM,MAEtC,MAAM,IAAI,OAEV,EAAM,OAAS,KAAM,MAAO,GAAG,EAAM,MAAM,eAGjD,CAAC,EAED,MAAO,GAAA,IAAI;qDACsC,EAAU;;6BAEhC,EAAM,OAAS,KAAK,IAAI,EAAM;iDACV,EAAM,OAAS,KAAK;;;KAIrE,EACA,OAAQ,CACN,EAAA,gBACA,EAAA,kBACA,EAAA,oBACA,EAAA,kBAAkB,QAAQ,EAC1B,EAAA,iBAAiB,CACf,GAAI,CAAE,eAAgB,kBAAmB,eAAgB,gBAAiB,SAAU,gBAAiB,EACrG,GAAI,CAAE,eAAgB,gBAAiB,eAAgB,kBAAmB,SAAU,gBAAiB,EACrG,GAAI,CAAE,eAAgB,kBAAmB,eAAgB,iBAAkB,SAAU,gBAAiB,CACxG,CAAC,EACD,EAAA,OACF,CACF,CAAC"}
1
+ {"version":3,"file":"badge.cjs","names":[],"sources":["../src/feedback/badge/badge.ts"],"sourcesContent":["import { define, html, prop } from '@vielzeug/ore';\nimport { computed } from '@vielzeug/ripple';\nimport { roundableBundle, themableBundle } from '../../shared';\nimport {\n colorThemeMixin,\n forcedColorsMixin,\n frostVariantMixin,\n roundedVariantMixin,\n sizeVariantMixin,\n} from '../../styles';\nimport type { RoundedSize, ThemeColor, VisualVariant } from '../../types';\nimport componentStyles from './badge.css?inline';\n\ntype BadgeVariant = Extract<VisualVariant, 'solid' | 'flat' | 'bordered' | 'outline' | 'frost'>;\ntype BadgeSize = 'xs' | 'sm' | 'md' | 'lg';\n\n/** Badge component properties */\nexport type OreBadgeProps = {\n /**\n * When set, switches to overlay mode: the host becomes `position:relative`\n * and the badge pins to a corner over the slotted content.\n * Value controls which corner: 'top-end' (default) | 'top-start' | 'bottom-end' | 'bottom-start'\n */\n anchor?: 'top-end' | 'top-start' | 'bottom-end' | 'bottom-start';\n /** Theme color */\n color?: ThemeColor;\n /** Numeric count to display */\n count?: number;\n /** Render as a small dot with no label */\n dot?: boolean;\n /** Accessible label for assistive technology. Recommended for count-only and dot mode. */\n label?: string;\n /** Max count — displays \"<max>+\" when count exceeds this value */\n max?: number;\n /** Border radius override */\n rounded?: RoundedSize;\n /** Badge size */\n size?: BadgeSize;\n /** Visual style variant */\n variant?: BadgeVariant;\n};\n\n/**\n * A compact badge/chip for counts, statuses, and labels.\n * Supports numeric counts with overflow, dot mode, and icon slots.\n *\n * @element ore-badge\n *\n * @attr {string} color - Theme color: 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'\n * @attr {string} variant - Visual variant: 'solid' | 'flat' | 'bordered' | 'outline' | 'frost'\n * @attr {string} size - Component size: 'xs' | 'sm' | 'md' | 'lg'\n * @attr {number} count - Numeric count to display\n * @attr {number} max - Max count before showing \"<max>+\"\n * @attr {boolean} dot - Render as a dot indicator (no text)\n * @attr {string} rounded - Border radius: 'none' | 'sm' | 'md' | 'lg' | 'full' etc.\n *\n * @slot - Badge label text\n * @slot icon - Icon displayed before the label\n * @slot target - Element the badge is anchored to (used with the anchor attribute)\n *\n * @cssprop --badge-bg - Badge background color\n * @cssprop --badge-color - Badge text color\n * @cssprop --badge-border-color - Badge border color\n * @cssprop --badge-radius - Border radius\n * @cssprop --badge-font-size - Font size\n * @cssprop --badge-font-weight - Font weight\n * @cssprop --badge-padding-x - Horizontal padding\n * @cssprop --badge-padding-y - Vertical padding\n * @cssprop --badge-gap - Gap between icon and label\n *\n * @part badge - Shadow part for the `badge` element.\n * @example\n * ```html\n * <ore-badge color=\"primary\">New</ore-badge>\n * <ore-badge color=\"error\" count=\"5\"></ore-badge>\n * <ore-badge color=\"error\" count=\"120\" max=\"99\"></ore-badge>\n * <ore-badge color=\"success\" dot></ore-badge>\n * <ore-badge color=\"warning\" variant=\"flat\">Beta</ore-badge>\n * ```\n */\nexport const BADGE_TAG = 'ore-badge' as const;\ndefine<OreBadgeProps>(BADGE_TAG, {\n props: {\n ...themableBundle,\n size: prop.string<BadgeSize>(),\n ...roundableBundle,\n anchor: prop.string<'top-end' | 'top-start' | 'bottom-end' | 'bottom-start'>(),\n count: prop.number(),\n dot: prop.bool(false),\n label: prop.string(),\n max: prop.number(),\n variant: prop.string<BadgeVariant>(),\n },\n setup(props) {\n const label = computed(() => {\n const count = props.count.value != null ? Number(props.count.value) : undefined;\n const max = props.max.value != null ? Number(props.max.value) : undefined;\n\n if (count === undefined || Number.isNaN(count)) return undefined;\n\n if (max !== undefined && !Number.isNaN(max) && count > max) return `${max}+`;\n\n return String(count);\n });\n\n const ariaLabel = computed(() => {\n if (props.label.value) return props.label.value;\n\n if (props.dot.value) return undefined;\n\n if (label.value != null) return `${label.value} notifications`;\n\n return undefined;\n });\n\n return html`\n <span class=\"badge\" part=\"badge\" aria-label=\"${ariaLabel}\">\n <slot name=\"icon\"></slot>\n <span ?hidden=\"${() => label.value == null}\">${label}</span>\n <span class=\"badge-label\" ?hidden=\"${() => label.value != null}\"><slot></slot></span>\n </span>\n <slot name=\"target\"></slot>\n `;\n },\n styles: [\n colorThemeMixin,\n forcedColorsMixin,\n roundedVariantMixin,\n frostVariantMixin('.badge'),\n sizeVariantMixin({\n lg: { '--_padding-x': 'var(--size-2-5)', '--_padding-y': 'var(--size-1)', fontSize: 'var(--text-sm)' },\n md: { '--_padding-x': 'var(--size-2)', '--_padding-y': 'var(--size-0-5)', fontSize: 'var(--text-xs)' },\n sm: { '--_padding-x': 'var(--size-1-5)', '--_padding-y': 'var(--size-px)', fontSize: 'var(--text-xs)' },\n }),\n componentStyles,\n ],\n});\n"],"mappings":"6VAgFA,IAAa,EAAY,aACzB,EAAA,EAAA,OAAA,CAAsB,EAAW,CAC/B,MAAO,CACL,GAAG,EAAA,eACH,KAAM,EAAA,KAAK,OAAkB,EAC7B,GAAG,EAAA,gBACH,OAAQ,EAAA,KAAK,OAAgE,EAC7E,MAAO,EAAA,KAAK,OAAO,EACnB,IAAK,EAAA,KAAK,KAAK,EAAK,EACpB,MAAO,EAAA,KAAK,OAAO,EACnB,IAAK,EAAA,KAAK,OAAO,EACjB,QAAS,EAAA,KAAK,OAAqB,CACrC,EACA,MAAM,EAAO,CACX,IAAM,GAAA,EAAQ,EAAA,SAAA,KAAe,CAC3B,IAAM,EAAQ,EAAM,MAAM,OAAS,KAAmC,IAAA,GAA5B,OAAO,EAAM,MAAM,KAAK,EAC5D,EAAM,EAAM,IAAI,OAAS,KAAiC,IAAA,GAA1B,OAAO,EAAM,IAAI,KAAK,EAExD,SAAU,IAAA,IAAa,OAAO,MAAM,CAAK,GAI7C,OAFI,IAAQ,IAAA,IAAa,CAAC,OAAO,MAAM,CAAG,GAAK,EAAQ,EAAY,GAAG,EAAI,GAEnE,OAAO,CAAK,CACrB,CAAC,EAEK,GAAA,EAAY,EAAA,SAAA,KAAe,CAC/B,GAAI,EAAM,MAAM,MAAO,OAAO,EAAM,MAAM,MAEtC,MAAM,IAAI,OAEV,EAAM,OAAS,KAAM,MAAO,GAAG,EAAM,MAAM,eAGjD,CAAC,EAED,MAAO,GAAA,IAAI;qDACsC,EAAU;;6BAEhC,EAAM,OAAS,KAAK,IAAI,EAAM;iDACV,EAAM,OAAS,KAAK;;;KAIrE,EACA,OAAQ,CACN,EAAA,gBACA,EAAA,kBACA,EAAA,oBACA,EAAA,kBAAkB,QAAQ,EAC1B,EAAA,iBAAiB,CACf,GAAI,CAAE,eAAgB,kBAAmB,eAAgB,gBAAiB,SAAU,gBAAiB,EACrG,GAAI,CAAE,eAAgB,gBAAiB,eAAgB,kBAAmB,SAAU,gBAAiB,EACrG,GAAI,CAAE,eAAgB,kBAAmB,eAAgB,iBAAkB,SAAU,gBAAiB,CACxG,CAAC,EACD,EAAA,OACF,CACF,CAAC"}
package/dist/badge.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"badge.js","names":[],"sources":["../src/feedback/badge/badge.ts"],"sourcesContent":["import { define, html, prop } from '@vielzeug/ore';\nimport { computed } from '@vielzeug/ripple';\n\nimport type { RoundedSize, ThemeColor, VisualVariant } from '../../types';\n\nimport { roundableBundle, themableBundle } from '../../shared';\nimport {\n colorThemeMixin,\n forcedColorsMixin,\n frostVariantMixin,\n roundedVariantMixin,\n sizeVariantMixin,\n} from '../../styles';\nimport componentStyles from './badge.css?inline';\n\ntype BadgeVariant = Extract<VisualVariant, 'solid' | 'flat' | 'bordered' | 'outline' | 'frost'>;\ntype BadgeSize = 'xs' | 'sm' | 'md' | 'lg';\n\n/** Badge component properties */\nexport type OreBadgeProps = {\n /**\n * When set, switches to overlay mode: the host becomes `position:relative`\n * and the badge pins to a corner over the slotted content.\n * Value controls which corner: 'top-end' (default) | 'top-start' | 'bottom-end' | 'bottom-start'\n */\n anchor?: 'top-end' | 'top-start' | 'bottom-end' | 'bottom-start';\n /** Theme color */\n color?: ThemeColor;\n /** Numeric count to display */\n count?: number;\n /** Render as a small dot with no label */\n dot?: boolean;\n /** Accessible label for assistive technology. Recommended for count-only and dot mode. */\n label?: string;\n /** Max count — displays \"<max>+\" when count exceeds this value */\n max?: number;\n /** Border radius override */\n rounded?: RoundedSize;\n /** Badge size */\n size?: BadgeSize;\n /** Visual style variant */\n variant?: BadgeVariant;\n};\n\n/**\n * A compact badge/chip for counts, statuses, and labels.\n * Supports numeric counts with overflow, dot mode, and icon slots.\n *\n * @element ore-badge\n *\n * @attr {string} color - Theme color: 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'\n * @attr {string} variant - Visual variant: 'solid' | 'flat' | 'bordered' | 'outline' | 'frost'\n * @attr {string} size - Component size: 'xs' | 'sm' | 'md' | 'lg'\n * @attr {number} count - Numeric count to display\n * @attr {number} max - Max count before showing \"<max>+\"\n * @attr {boolean} dot - Render as a dot indicator (no text)\n * @attr {string} rounded - Border radius: 'none' | 'sm' | 'md' | 'lg' | 'full' etc.\n *\n * @slot - Badge label text\n * @slot icon - Icon displayed before the label\n * @slot target - Element the badge is anchored to (used with the anchor attribute)\n *\n * @cssprop --badge-bg - Badge background color\n * @cssprop --badge-color - Badge text color\n * @cssprop --badge-border-color - Badge border color\n * @cssprop --badge-radius - Border radius\n * @cssprop --badge-font-size - Font size\n * @cssprop --badge-font-weight - Font weight\n * @cssprop --badge-padding-x - Horizontal padding\n * @cssprop --badge-padding-y - Vertical padding\n * @cssprop --badge-gap - Gap between icon and label\n *\n * @part badge - Shadow part for the `badge` element.\n * @example\n * ```html\n * <ore-badge color=\"primary\">New</ore-badge>\n * <ore-badge color=\"error\" count=\"5\"></ore-badge>\n * <ore-badge color=\"error\" count=\"120\" max=\"99\"></ore-badge>\n * <ore-badge color=\"success\" dot></ore-badge>\n * <ore-badge color=\"warning\" variant=\"flat\">Beta</ore-badge>\n * ```\n */\nexport const BADGE_TAG = 'ore-badge' as const;\ndefine<OreBadgeProps>(BADGE_TAG, {\n props: {\n ...themableBundle,\n size: prop.string<BadgeSize>(),\n ...roundableBundle,\n anchor: prop.string<'top-end' | 'top-start' | 'bottom-end' | 'bottom-start'>(),\n count: prop.number(),\n dot: prop.bool(false),\n label: prop.string(),\n max: prop.number(),\n variant: prop.string<BadgeVariant>(),\n },\n setup(props) {\n const label = computed(() => {\n const count = props.count.value != null ? Number(props.count.value) : undefined;\n const max = props.max.value != null ? Number(props.max.value) : undefined;\n\n if (count === undefined || Number.isNaN(count)) return undefined;\n\n if (max !== undefined && !Number.isNaN(max) && count > max) return `${max}+`;\n\n return String(count);\n });\n\n const ariaLabel = computed(() => {\n if (props.label.value) return props.label.value;\n\n if (props.dot.value) return undefined;\n\n if (label.value != null) return `${label.value} notifications`;\n\n return undefined;\n });\n\n return html`\n <span class=\"badge\" part=\"badge\" aria-label=\"${ariaLabel}\">\n <slot name=\"icon\"></slot>\n <span ?hidden=\"${() => label.value == null}\">${label}</span>\n <span class=\"badge-label\" ?hidden=\"${() => label.value != null}\"><slot></slot></span>\n </span>\n <slot name=\"target\"></slot>\n `;\n },\n styles: [\n colorThemeMixin,\n forcedColorsMixin,\n roundedVariantMixin,\n frostVariantMixin('.badge'),\n sizeVariantMixin({\n lg: { '--_padding-x': 'var(--size-2-5)', '--_padding-y': 'var(--size-1)', fontSize: 'var(--text-sm)' },\n md: { '--_padding-x': 'var(--size-2)', '--_padding-y': 'var(--size-0-5)', fontSize: 'var(--text-xs)' },\n sm: { '--_padding-x': 'var(--size-1-5)', '--_padding-y': 'var(--size-px)', fontSize: 'var(--text-xs)' },\n }),\n componentStyles,\n ],\n});\n"],"mappings":";;;;;;;;AAkFA,IAAa,IAAY;AACzB,EAAsB,GAAW;CAC/B,OAAO;EACL,GAAG;EACH,MAAM,EAAK,OAAkB;EAC7B,GAAG;EACH,QAAQ,EAAK,OAAgE;EAC7E,OAAO,EAAK,OAAO;EACnB,KAAK,EAAK,KAAK,EAAK;EACpB,OAAO,EAAK,OAAO;EACnB,KAAK,EAAK,OAAO;EACjB,SAAS,EAAK,OAAqB;CACrC;CACA,MAAM,GAAO;EACX,IAAM,IAAQ,QAAe;GAC3B,IAAM,IAAQ,EAAM,MAAM,SAAS,OAAmC,KAAA,IAA5B,OAAO,EAAM,MAAM,KAAK,GAC5D,IAAM,EAAM,IAAI,SAAS,OAAiC,KAAA,IAA1B,OAAO,EAAM,IAAI,KAAK;GAExD,YAAU,KAAA,KAAa,OAAO,MAAM,CAAK,IAI7C,OAFI,MAAQ,KAAA,KAAa,CAAC,OAAO,MAAM,CAAG,KAAK,IAAQ,IAAY,GAAG,EAAI,KAEnE,OAAO,CAAK;EACrB,CAAC,GAEK,IAAY,QAAe;GAC/B,IAAI,EAAM,MAAM,OAAO,OAAO,EAAM,MAAM;GAEtC,OAAM,IAAI,SAEV,EAAM,SAAS,MAAM,OAAO,GAAG,EAAM,MAAM;EAGjD,CAAC;EAED,OAAO,CAAI;qDACsC,EAAU;;+BAEhC,EAAM,SAAS,KAAK,IAAI,EAAM;mDACV,EAAM,SAAS,KAAK;;;;CAIrE;CACA,QAAQ;EACN;EACA;EACA;EACA,EAAkB,QAAQ;EAC1B,EAAiB;GACf,IAAI;IAAE,gBAAgB;IAAmB,gBAAgB;IAAiB,UAAU;GAAiB;GACrG,IAAI;IAAE,gBAAgB;IAAiB,gBAAgB;IAAmB,UAAU;GAAiB;GACrG,IAAI;IAAE,gBAAgB;IAAmB,gBAAgB;IAAkB,UAAU;GAAiB;EACxG,CAAC;EACD;CACF;AACF,CAAC"}
1
+ {"version":3,"file":"badge.js","names":[],"sources":["../src/feedback/badge/badge.ts"],"sourcesContent":["import { define, html, prop } from '@vielzeug/ore';\nimport { computed } from '@vielzeug/ripple';\nimport { roundableBundle, themableBundle } from '../../shared';\nimport {\n colorThemeMixin,\n forcedColorsMixin,\n frostVariantMixin,\n roundedVariantMixin,\n sizeVariantMixin,\n} from '../../styles';\nimport type { RoundedSize, ThemeColor, VisualVariant } from '../../types';\nimport componentStyles from './badge.css?inline';\n\ntype BadgeVariant = Extract<VisualVariant, 'solid' | 'flat' | 'bordered' | 'outline' | 'frost'>;\ntype BadgeSize = 'xs' | 'sm' | 'md' | 'lg';\n\n/** Badge component properties */\nexport type OreBadgeProps = {\n /**\n * When set, switches to overlay mode: the host becomes `position:relative`\n * and the badge pins to a corner over the slotted content.\n * Value controls which corner: 'top-end' (default) | 'top-start' | 'bottom-end' | 'bottom-start'\n */\n anchor?: 'top-end' | 'top-start' | 'bottom-end' | 'bottom-start';\n /** Theme color */\n color?: ThemeColor;\n /** Numeric count to display */\n count?: number;\n /** Render as a small dot with no label */\n dot?: boolean;\n /** Accessible label for assistive technology. Recommended for count-only and dot mode. */\n label?: string;\n /** Max count — displays \"<max>+\" when count exceeds this value */\n max?: number;\n /** Border radius override */\n rounded?: RoundedSize;\n /** Badge size */\n size?: BadgeSize;\n /** Visual style variant */\n variant?: BadgeVariant;\n};\n\n/**\n * A compact badge/chip for counts, statuses, and labels.\n * Supports numeric counts with overflow, dot mode, and icon slots.\n *\n * @element ore-badge\n *\n * @attr {string} color - Theme color: 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'\n * @attr {string} variant - Visual variant: 'solid' | 'flat' | 'bordered' | 'outline' | 'frost'\n * @attr {string} size - Component size: 'xs' | 'sm' | 'md' | 'lg'\n * @attr {number} count - Numeric count to display\n * @attr {number} max - Max count before showing \"<max>+\"\n * @attr {boolean} dot - Render as a dot indicator (no text)\n * @attr {string} rounded - Border radius: 'none' | 'sm' | 'md' | 'lg' | 'full' etc.\n *\n * @slot - Badge label text\n * @slot icon - Icon displayed before the label\n * @slot target - Element the badge is anchored to (used with the anchor attribute)\n *\n * @cssprop --badge-bg - Badge background color\n * @cssprop --badge-color - Badge text color\n * @cssprop --badge-border-color - Badge border color\n * @cssprop --badge-radius - Border radius\n * @cssprop --badge-font-size - Font size\n * @cssprop --badge-font-weight - Font weight\n * @cssprop --badge-padding-x - Horizontal padding\n * @cssprop --badge-padding-y - Vertical padding\n * @cssprop --badge-gap - Gap between icon and label\n *\n * @part badge - Shadow part for the `badge` element.\n * @example\n * ```html\n * <ore-badge color=\"primary\">New</ore-badge>\n * <ore-badge color=\"error\" count=\"5\"></ore-badge>\n * <ore-badge color=\"error\" count=\"120\" max=\"99\"></ore-badge>\n * <ore-badge color=\"success\" dot></ore-badge>\n * <ore-badge color=\"warning\" variant=\"flat\">Beta</ore-badge>\n * ```\n */\nexport const BADGE_TAG = 'ore-badge' as const;\ndefine<OreBadgeProps>(BADGE_TAG, {\n props: {\n ...themableBundle,\n size: prop.string<BadgeSize>(),\n ...roundableBundle,\n anchor: prop.string<'top-end' | 'top-start' | 'bottom-end' | 'bottom-start'>(),\n count: prop.number(),\n dot: prop.bool(false),\n label: prop.string(),\n max: prop.number(),\n variant: prop.string<BadgeVariant>(),\n },\n setup(props) {\n const label = computed(() => {\n const count = props.count.value != null ? Number(props.count.value) : undefined;\n const max = props.max.value != null ? Number(props.max.value) : undefined;\n\n if (count === undefined || Number.isNaN(count)) return undefined;\n\n if (max !== undefined && !Number.isNaN(max) && count > max) return `${max}+`;\n\n return String(count);\n });\n\n const ariaLabel = computed(() => {\n if (props.label.value) return props.label.value;\n\n if (props.dot.value) return undefined;\n\n if (label.value != null) return `${label.value} notifications`;\n\n return undefined;\n });\n\n return html`\n <span class=\"badge\" part=\"badge\" aria-label=\"${ariaLabel}\">\n <slot name=\"icon\"></slot>\n <span ?hidden=\"${() => label.value == null}\">${label}</span>\n <span class=\"badge-label\" ?hidden=\"${() => label.value != null}\"><slot></slot></span>\n </span>\n <slot name=\"target\"></slot>\n `;\n },\n styles: [\n colorThemeMixin,\n forcedColorsMixin,\n roundedVariantMixin,\n frostVariantMixin('.badge'),\n sizeVariantMixin({\n lg: { '--_padding-x': 'var(--size-2-5)', '--_padding-y': 'var(--size-1)', fontSize: 'var(--text-sm)' },\n md: { '--_padding-x': 'var(--size-2)', '--_padding-y': 'var(--size-0-5)', fontSize: 'var(--text-xs)' },\n sm: { '--_padding-x': 'var(--size-1-5)', '--_padding-y': 'var(--size-px)', fontSize: 'var(--text-xs)' },\n }),\n componentStyles,\n ],\n});\n"],"mappings":";;;;;;;;AAgFA,IAAa,IAAY;AACzB,EAAsB,GAAW;CAC/B,OAAO;EACL,GAAG;EACH,MAAM,EAAK,OAAkB;EAC7B,GAAG;EACH,QAAQ,EAAK,OAAgE;EAC7E,OAAO,EAAK,OAAO;EACnB,KAAK,EAAK,KAAK,EAAK;EACpB,OAAO,EAAK,OAAO;EACnB,KAAK,EAAK,OAAO;EACjB,SAAS,EAAK,OAAqB;CACrC;CACA,MAAM,GAAO;EACX,IAAM,IAAQ,QAAe;GAC3B,IAAM,IAAQ,EAAM,MAAM,SAAS,OAAmC,KAAA,IAA5B,OAAO,EAAM,MAAM,KAAK,GAC5D,IAAM,EAAM,IAAI,SAAS,OAAiC,KAAA,IAA1B,OAAO,EAAM,IAAI,KAAK;GAExD,YAAU,KAAA,KAAa,OAAO,MAAM,CAAK,IAI7C,OAFI,MAAQ,KAAA,KAAa,CAAC,OAAO,MAAM,CAAG,KAAK,IAAQ,IAAY,GAAG,EAAI,KAEnE,OAAO,CAAK;EACrB,CAAC,GAEK,IAAY,QAAe;GAC/B,IAAI,EAAM,MAAM,OAAO,OAAO,EAAM,MAAM;GAEtC,OAAM,IAAI,SAEV,EAAM,SAAS,MAAM,OAAO,GAAG,EAAM,MAAM;EAGjD,CAAC;EAED,OAAO,CAAI;qDACsC,EAAU;;+BAEhC,EAAM,SAAS,KAAK,IAAI,EAAM;mDACV,EAAM,SAAS,KAAK;;;;CAIrE;CACA,QAAQ;EACN;EACA;EACA;EACA,EAAkB,QAAQ;EAC1B,EAAiB;GACf,IAAI;IAAE,gBAAgB;IAAmB,gBAAgB;IAAiB,UAAU;GAAiB;GACrG,IAAI;IAAE,gBAAgB;IAAiB,gBAAgB;IAAmB,UAAU;GAAiB;GACrG,IAAI;IAAE,gBAAgB;IAAmB,gBAAgB;IAAkB,UAAU;GAAiB;EACxG,CAAC;EACD;CACF;AACF,CAAC"}
package/dist/box.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"box.cjs","names":[],"sources":["../src/layout/box/box.ts"],"sourcesContent":["import { define, html, prop } from '@vielzeug/ore';\n\nimport type { ElevationLevel, PaddingSize, RoundedSize, ThemeColor } from '../../types';\n\nimport {\n colorThemeMixin,\n elevationMixin,\n frostVariantMixin,\n paddingMixin,\n rainbowEffectMixin,\n roundedVariantMixin,\n} from '../../styles';\nimport componentStyles from './box.css?inline';\n\n/** Box component properties */\nexport type OreBoxProps = {\n /** Theme color */\n color?: ThemeColor;\n /** Animated border effect */\n effect?: 'rainbow';\n /** Shadow elevation level (0–5) */\n elevation?: ElevationLevel;\n /** Full width mode (100% of container) */\n fullwidth?: boolean;\n /** Internal padding size */\n padding?: PaddingSize;\n /** Border radius size */\n rounded?: RoundedSize;\n /** Visual style variant */\n variant?: 'solid' | 'flat' | 'glass' | 'frost';\n};\n\n/**\n * ore-box — A foundational layout primitive with theming support.\n *\n * @element ore-box\n *\n * @attr {string} variant - Style variant: 'solid' | 'flat' | 'glass' | 'frost'\n * @attr {string} color - Color theme: 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'\n * @attr {string} padding - Padding size: 'none' | 'sm' | 'md' | 'lg' | 'xl'\n * @attr {string} elevation - Shadow elevation: '0' | '1' | '2' | '3' | '4' | '5'\n * @attr {string} rounded - Border radius: 'none' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | 'full'\n * @attr {string} effect - Animated border effect: 'rainbow'\n * @attr {boolean} fullwidth - Expand to full width\n *\n * @slot - Default slot for content\n *\n * @part box - The inner box element\n *\n * @cssprop --box-bg - Background color\n * @cssprop --box-color - Text color\n * @cssprop --box-border - Border width\n * @cssprop --box-border-color - Border color\n * @cssprop --box-radius - Border radius\n * @cssprop --box-padding - Inner padding\n * @cssprop --box-shadow - Box shadow\n *\n * @example\n * ```html\n * <ore-box padding=\"lg\" elevation=\"2\">Simple content</ore-box>\n * <ore-box variant=\"glass\" color=\"primary\">Glass effect</ore-box>\n * <ore-box variant=\"frost\" effect=\"rainbow\">Frosted glass</ore-box>\n * ```\n */\nexport const BOX_TAG = 'ore-box' as const;\ndefine<OreBoxProps>(BOX_TAG, {\n props: {\n color: prop.string<ThemeColor>(),\n effect: prop.string<'rainbow'>(),\n elevation: prop.number<ElevationLevel>(),\n fullwidth: prop.bool(),\n padding: prop.string<PaddingSize>(),\n rounded: prop.string<RoundedSize>(),\n variant: prop.string<'flat' | 'solid' | 'frost' | 'glass'>(),\n },\n setup() {\n return html`\n <div class=\"box\" part=\"box\"><slot></slot></div>\n `;\n },\n\n styles: [\n colorThemeMixin,\n elevationMixin,\n paddingMixin,\n roundedVariantMixin,\n frostVariantMixin('.box'),\n rainbowEffectMixin('.box'),\n componentStyles,\n ],\n});\n"],"mappings":"iUAgEA,IAAa,EAAU,WACvB,EAAA,EAAA,OAAA,CAAoB,EAAS,CAC3B,MAAO,CACL,MAAO,EAAA,KAAK,OAAmB,EAC/B,OAAQ,EAAA,KAAK,OAAkB,EAC/B,UAAW,EAAA,KAAK,OAAuB,EACvC,UAAW,EAAA,KAAK,KAAK,EACrB,QAAS,EAAA,KAAK,OAAoB,EAClC,QAAS,EAAA,KAAK,OAAoB,EAClC,QAAS,EAAA,KAAK,OAA6C,CAC7D,EACA,OAAQ,CACN,MAAO,GAAA,IAAI;;KAGb,EAEA,OAAQ,CACN,EAAA,gBACA,EAAA,eACA,EAAA,aACA,EAAA,oBACA,EAAA,kBAAkB,MAAM,EACxB,EAAA,mBAAmB,MAAM,EACzB,EAAA,OACF,CACF,CAAC"}
1
+ {"version":3,"file":"box.cjs","names":[],"sources":["../src/layout/box/box.ts"],"sourcesContent":["import { define, html, prop } from '@vielzeug/ore';\nimport {\n colorThemeMixin,\n elevationMixin,\n frostVariantMixin,\n paddingMixin,\n rainbowEffectMixin,\n roundedVariantMixin,\n} from '../../styles';\nimport type { ElevationLevel, PaddingSize, RoundedSize, ThemeColor } from '../../types';\nimport componentStyles from './box.css?inline';\n\n/** Box component properties */\nexport type OreBoxProps = {\n /** Theme color */\n color?: ThemeColor;\n /** Animated border effect */\n effect?: 'rainbow';\n /** Shadow elevation level (0–5) */\n elevation?: ElevationLevel;\n /** Full width mode (100% of container) */\n fullwidth?: boolean;\n /** Internal padding size */\n padding?: PaddingSize;\n /** Border radius size */\n rounded?: RoundedSize;\n /** Visual style variant */\n variant?: 'solid' | 'flat' | 'glass' | 'frost';\n};\n\n/**\n * ore-box — A foundational layout primitive with theming support.\n *\n * @element ore-box\n *\n * @attr {string} variant - Style variant: 'solid' | 'flat' | 'glass' | 'frost'\n * @attr {string} color - Color theme: 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'\n * @attr {string} padding - Padding size: 'none' | 'sm' | 'md' | 'lg' | 'xl'\n * @attr {string} elevation - Shadow elevation: '0' | '1' | '2' | '3' | '4' | '5'\n * @attr {string} rounded - Border radius: 'none' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | 'full'\n * @attr {string} effect - Animated border effect: 'rainbow'\n * @attr {boolean} fullwidth - Expand to full width\n *\n * @slot - Default slot for content\n *\n * @part box - The inner box element\n *\n * @cssprop --box-bg - Background color\n * @cssprop --box-color - Text color\n * @cssprop --box-border - Border width\n * @cssprop --box-border-color - Border color\n * @cssprop --box-radius - Border radius\n * @cssprop --box-padding - Inner padding\n * @cssprop --box-shadow - Box shadow\n *\n * @example\n * ```html\n * <ore-box padding=\"lg\" elevation=\"2\">Simple content</ore-box>\n * <ore-box variant=\"glass\" color=\"primary\">Glass effect</ore-box>\n * <ore-box variant=\"frost\" effect=\"rainbow\">Frosted glass</ore-box>\n * ```\n */\nexport const BOX_TAG = 'ore-box' as const;\ndefine<OreBoxProps>(BOX_TAG, {\n props: {\n color: prop.string<ThemeColor>(),\n effect: prop.string<'rainbow'>(),\n elevation: prop.number<ElevationLevel>(),\n fullwidth: prop.bool(),\n padding: prop.string<PaddingSize>(),\n rounded: prop.string<RoundedSize>(),\n variant: prop.string<'flat' | 'solid' | 'frost' | 'glass'>(),\n },\n setup() {\n return html`\n <div class=\"box\" part=\"box\"><slot></slot></div>\n `;\n },\n\n styles: [\n colorThemeMixin,\n elevationMixin,\n paddingMixin,\n roundedVariantMixin,\n frostVariantMixin('.box'),\n rainbowEffectMixin('.box'),\n componentStyles,\n ],\n});\n"],"mappings":"iUA8DA,IAAa,EAAU,WACvB,EAAA,EAAA,OAAA,CAAoB,EAAS,CAC3B,MAAO,CACL,MAAO,EAAA,KAAK,OAAmB,EAC/B,OAAQ,EAAA,KAAK,OAAkB,EAC/B,UAAW,EAAA,KAAK,OAAuB,EACvC,UAAW,EAAA,KAAK,KAAK,EACrB,QAAS,EAAA,KAAK,OAAoB,EAClC,QAAS,EAAA,KAAK,OAAoB,EAClC,QAAS,EAAA,KAAK,OAA6C,CAC7D,EACA,OAAQ,CACN,MAAO,GAAA,IAAI;;KAGb,EAEA,OAAQ,CACN,EAAA,gBACA,EAAA,eACA,EAAA,aACA,EAAA,oBACA,EAAA,kBAAkB,MAAM,EACxB,EAAA,mBAAmB,MAAM,EACzB,EAAA,OACF,CACF,CAAC"}
package/dist/box.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"box.js","names":[],"sources":["../src/layout/box/box.ts"],"sourcesContent":["import { define, html, prop } from '@vielzeug/ore';\n\nimport type { ElevationLevel, PaddingSize, RoundedSize, ThemeColor } from '../../types';\n\nimport {\n colorThemeMixin,\n elevationMixin,\n frostVariantMixin,\n paddingMixin,\n rainbowEffectMixin,\n roundedVariantMixin,\n} from '../../styles';\nimport componentStyles from './box.css?inline';\n\n/** Box component properties */\nexport type OreBoxProps = {\n /** Theme color */\n color?: ThemeColor;\n /** Animated border effect */\n effect?: 'rainbow';\n /** Shadow elevation level (0–5) */\n elevation?: ElevationLevel;\n /** Full width mode (100% of container) */\n fullwidth?: boolean;\n /** Internal padding size */\n padding?: PaddingSize;\n /** Border radius size */\n rounded?: RoundedSize;\n /** Visual style variant */\n variant?: 'solid' | 'flat' | 'glass' | 'frost';\n};\n\n/**\n * ore-box — A foundational layout primitive with theming support.\n *\n * @element ore-box\n *\n * @attr {string} variant - Style variant: 'solid' | 'flat' | 'glass' | 'frost'\n * @attr {string} color - Color theme: 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'\n * @attr {string} padding - Padding size: 'none' | 'sm' | 'md' | 'lg' | 'xl'\n * @attr {string} elevation - Shadow elevation: '0' | '1' | '2' | '3' | '4' | '5'\n * @attr {string} rounded - Border radius: 'none' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | 'full'\n * @attr {string} effect - Animated border effect: 'rainbow'\n * @attr {boolean} fullwidth - Expand to full width\n *\n * @slot - Default slot for content\n *\n * @part box - The inner box element\n *\n * @cssprop --box-bg - Background color\n * @cssprop --box-color - Text color\n * @cssprop --box-border - Border width\n * @cssprop --box-border-color - Border color\n * @cssprop --box-radius - Border radius\n * @cssprop --box-padding - Inner padding\n * @cssprop --box-shadow - Box shadow\n *\n * @example\n * ```html\n * <ore-box padding=\"lg\" elevation=\"2\">Simple content</ore-box>\n * <ore-box variant=\"glass\" color=\"primary\">Glass effect</ore-box>\n * <ore-box variant=\"frost\" effect=\"rainbow\">Frosted glass</ore-box>\n * ```\n */\nexport const BOX_TAG = 'ore-box' as const;\ndefine<OreBoxProps>(BOX_TAG, {\n props: {\n color: prop.string<ThemeColor>(),\n effect: prop.string<'rainbow'>(),\n elevation: prop.number<ElevationLevel>(),\n fullwidth: prop.bool(),\n padding: prop.string<PaddingSize>(),\n rounded: prop.string<RoundedSize>(),\n variant: prop.string<'flat' | 'solid' | 'frost' | 'glass'>(),\n },\n setup() {\n return html`\n <div class=\"box\" part=\"box\"><slot></slot></div>\n `;\n },\n\n styles: [\n colorThemeMixin,\n elevationMixin,\n paddingMixin,\n roundedVariantMixin,\n frostVariantMixin('.box'),\n rainbowEffectMixin('.box'),\n componentStyles,\n ],\n});\n"],"mappings":";;;;;;;AAgEA,IAAa,IAAU;AACvB,EAAoB,GAAS;CAC3B,OAAO;EACL,OAAO,EAAK,OAAmB;EAC/B,QAAQ,EAAK,OAAkB;EAC/B,WAAW,EAAK,OAAuB;EACvC,WAAW,EAAK,KAAK;EACrB,SAAS,EAAK,OAAoB;EAClC,SAAS,EAAK,OAAoB;EAClC,SAAS,EAAK,OAA6C;CAC7D;CACA,QAAQ;EACN,OAAO,CAAI;;;CAGb;CAEA,QAAQ;EACN;EACA;EACA;EACA;EACA,EAAkB,MAAM;EACxB,EAAmB,MAAM;EACzB;CACF;AACF,CAAC"}
1
+ {"version":3,"file":"box.js","names":[],"sources":["../src/layout/box/box.ts"],"sourcesContent":["import { define, html, prop } from '@vielzeug/ore';\nimport {\n colorThemeMixin,\n elevationMixin,\n frostVariantMixin,\n paddingMixin,\n rainbowEffectMixin,\n roundedVariantMixin,\n} from '../../styles';\nimport type { ElevationLevel, PaddingSize, RoundedSize, ThemeColor } from '../../types';\nimport componentStyles from './box.css?inline';\n\n/** Box component properties */\nexport type OreBoxProps = {\n /** Theme color */\n color?: ThemeColor;\n /** Animated border effect */\n effect?: 'rainbow';\n /** Shadow elevation level (0–5) */\n elevation?: ElevationLevel;\n /** Full width mode (100% of container) */\n fullwidth?: boolean;\n /** Internal padding size */\n padding?: PaddingSize;\n /** Border radius size */\n rounded?: RoundedSize;\n /** Visual style variant */\n variant?: 'solid' | 'flat' | 'glass' | 'frost';\n};\n\n/**\n * ore-box — A foundational layout primitive with theming support.\n *\n * @element ore-box\n *\n * @attr {string} variant - Style variant: 'solid' | 'flat' | 'glass' | 'frost'\n * @attr {string} color - Color theme: 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'\n * @attr {string} padding - Padding size: 'none' | 'sm' | 'md' | 'lg' | 'xl'\n * @attr {string} elevation - Shadow elevation: '0' | '1' | '2' | '3' | '4' | '5'\n * @attr {string} rounded - Border radius: 'none' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | 'full'\n * @attr {string} effect - Animated border effect: 'rainbow'\n * @attr {boolean} fullwidth - Expand to full width\n *\n * @slot - Default slot for content\n *\n * @part box - The inner box element\n *\n * @cssprop --box-bg - Background color\n * @cssprop --box-color - Text color\n * @cssprop --box-border - Border width\n * @cssprop --box-border-color - Border color\n * @cssprop --box-radius - Border radius\n * @cssprop --box-padding - Inner padding\n * @cssprop --box-shadow - Box shadow\n *\n * @example\n * ```html\n * <ore-box padding=\"lg\" elevation=\"2\">Simple content</ore-box>\n * <ore-box variant=\"glass\" color=\"primary\">Glass effect</ore-box>\n * <ore-box variant=\"frost\" effect=\"rainbow\">Frosted glass</ore-box>\n * ```\n */\nexport const BOX_TAG = 'ore-box' as const;\ndefine<OreBoxProps>(BOX_TAG, {\n props: {\n color: prop.string<ThemeColor>(),\n effect: prop.string<'rainbow'>(),\n elevation: prop.number<ElevationLevel>(),\n fullwidth: prop.bool(),\n padding: prop.string<PaddingSize>(),\n rounded: prop.string<RoundedSize>(),\n variant: prop.string<'flat' | 'solid' | 'frost' | 'glass'>(),\n },\n setup() {\n return html`\n <div class=\"box\" part=\"box\"><slot></slot></div>\n `;\n },\n\n styles: [\n colorThemeMixin,\n elevationMixin,\n paddingMixin,\n roundedVariantMixin,\n frostVariantMixin('.box'),\n rainbowEffectMixin('.box'),\n componentStyles,\n ],\n});\n"],"mappings":";;;;;;;AA8DA,IAAa,IAAU;AACvB,EAAoB,GAAS;CAC3B,OAAO;EACL,OAAO,EAAK,OAAmB;EAC/B,QAAQ,EAAK,OAAkB;EAC/B,WAAW,EAAK,OAAuB;EACvC,WAAW,EAAK,KAAK;EACrB,SAAS,EAAK,OAAoB;EAClC,SAAS,EAAK,OAAoB;EAClC,SAAS,EAAK,OAA6C;CAC7D;CACA,QAAQ;EACN,OAAO,CAAI;;;CAGb;CAEA,QAAQ;EACN;EACA;EACA;EACA;EACA,EAAkB,MAAM;EACxB,EAAmB,MAAM;EACzB;CACF;AACF,CAAC"}
@@ -1,4 +1,4 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./content/breadcrumb/breadcrumb-item.css.cjs"),t=require("./content/breadcrumb/breadcrumb.css.cjs");let n=require("@vielzeug/ore");var r=`ore-breadcrumb-item`;(0,n.define)(r,{props:{active:n.prop.bool(),href:n.prop.string(),separator:n.prop.string(`/`)},setup(e){return n.html`
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./content/breadcrumb/breadcrumb.css.cjs"),t=require("./content/breadcrumb/breadcrumb-item.css.cjs");let n=require("@vielzeug/ore");var r=`ore-breadcrumb-item`;(0,n.define)(r,{props:{active:n.prop.bool(),href:n.prop.string(),separator:n.prop.string(`/`)},setup(e){return n.html`
2
2
  <li class="item" role="listitem">
3
3
  <span class="separator" part="separator" aria-hidden="true">${e.separator}</span>
4
4
  <a
@@ -11,11 +11,11 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=requi
11
11
  <span class="label"><slot></slot></span>
12
12
  </a>
13
13
  </li>
14
- `},styles:[e.default]});var i=`ore-breadcrumb`;(0,n.define)(i,{props:{label:n.prop.string(`Breadcrumb`),separator:n.prop.string()},setup(e){let t=(0,n.getHost)(),r=(0,n.useSlots)(),i=n.watchEffect,a=()=>Array.from(t.getElementsByTagName(`ore-breadcrumb-item`)),o=()=>{let n=e.separator.value||`/`,r=a();for(let e=0;e<r.length;e++)r[e].setAttribute(`separator`,n),r[e].toggleAttribute(`data-show-separator`,e>0);n?t.style.setProperty(`--breadcrumb-separator`,`'${n}'`):t.style.removeProperty(`--breadcrumb-separator`)};return i(()=>{r.elements().value,o()}),n.html`
14
+ `},styles:[t.default]});var i=`ore-breadcrumb`;(0,n.define)(i,{props:{label:n.prop.string(`Breadcrumb`),separator:n.prop.string()},setup(e){let t=(0,n.getHost)(),r=(0,n.useSlots)(),i=n.watchEffect,a=()=>Array.from(t.getElementsByTagName(`ore-breadcrumb-item`)),o=()=>{let n=e.separator.value||`/`,r=a();for(let e=0;e<r.length;e++)r[e].setAttribute(`separator`,n),r[e].toggleAttribute(`data-show-separator`,e>0);n?t.style.setProperty(`--breadcrumb-separator`,`'${n}'`):t.style.removeProperty(`--breadcrumb-separator`)};return i(()=>{r.elements().value,o()}),n.html`
15
15
  <nav part="nav" aria-label="${e.label}">
16
16
  <ol role="list" part="list">
17
17
  <slot></slot>
18
18
  </ol>
19
19
  </nav>
20
- `},styles:[t.default]}),exports.BREADCRUMB_ITEM_TAG=r,exports.BREADCRUMB_TAG=i;
20
+ `},styles:[e.default]}),exports.BREADCRUMB_ITEM_TAG=r,exports.BREADCRUMB_TAG=i;
21
21
  //# sourceMappingURL=breadcrumb.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"breadcrumb.cjs","names":[],"sources":["../src/content/breadcrumb/breadcrumb.ts"],"sourcesContent":["import { define, html, prop, getHost, useSlots, watchEffect } from '@vielzeug/ore';\n\nimport itemStyles from './breadcrumb-item.css?inline';\nimport componentStyles from './breadcrumb.css?inline';\n\nexport type OreBreadcrumbProps = {\n label?: string;\n separator?: string;\n};\n\nexport type OreBreadcrumbItemProps = {\n active?: boolean;\n href?: string;\n separator?: string;\n};\n\n/**\n * A single breadcrumb entry rendered inside `<ore-breadcrumb>`.\n *\n * @element ore-breadcrumb-item\n *\n * @attr {boolean} active - Marks this item as the current page (`aria-current=\"page\"`)\n * @attr {string} href - Link target for this breadcrumb item\n * @attr {string} separator - Separator text shown before the item (except first item)\n *\n * @slot - Item label/content\n * @slot icon - Optional leading icon for the crumb\n *\n * @part separator - Separator element before the item label\n * @part link - The interactive anchor element\n *\n * @example\n * ```html\n * <ore-breadcrumb-item href=\"/\">Home</ore-breadcrumb-item>\n * <ore-breadcrumb-item active>Current Page</ore-breadcrumb-item>\n * ```\n */\nexport const BREADCRUMB_ITEM_TAG = 'ore-breadcrumb-item' as const;\ndefine<OreBreadcrumbItemProps>(BREADCRUMB_ITEM_TAG, {\n props: {\n active: prop.bool(),\n href: prop.string(),\n separator: prop.string('/'),\n },\n setup(props) {\n return html`\n <li class=\"item\" role=\"listitem\">\n <span class=\"separator\" part=\"separator\" aria-hidden=\"true\">${props.separator}</span>\n <a\n class=\"link\"\n href=\"${props.href}\"\n aria-current=\"${() => (props.active.value ? 'page' : null)}\"\n tabindex=\"${() => (props.active.value ? '-1' : null)}\"\n part=\"link\">\n <span class=\"icon\"><slot name=\"icon\"></slot></span>\n <span class=\"label\"><slot></slot></span>\n </a>\n </li>\n `;\n },\n styles: [itemStyles],\n});\n\n// ============================================\n// Breadcrumb Component\n// ============================================\n\n/**\n * Accessible breadcrumb navigation container.\n *\n * @element ore-breadcrumb\n *\n * @attr {string} label - Accessible label for the internal `<nav>` landmark\n * @attr {string} separator - Separator text propagated to child `<ore-breadcrumb-item>` elements\n *\n * @slot - One or more `<ore-breadcrumb-item>` children\n *\n * @part nav - Internal navigation landmark element\n * @part list - Internal ordered list container\n *\n * @cssprop --breadcrumb-separator - Optional custom separator text synced to child items\n *\n * @example\n * ```html\n * <ore-breadcrumb label=\"Page breadcrumb\">\n * <ore-breadcrumb-item href=\"/\">Home</ore-breadcrumb-item>\n * <ore-breadcrumb-item href=\"/blog\">Blog</ore-breadcrumb-item>\n * <ore-breadcrumb-item active>My Post</ore-breadcrumb-item>\n * </ore-breadcrumb>\n * ```\n */\nexport const BREADCRUMB_TAG = 'ore-breadcrumb' as const;\ndefine<OreBreadcrumbProps>(BREADCRUMB_TAG, {\n props: {\n label: prop.string('Breadcrumb'),\n separator: prop.string(),\n },\n setup(props) {\n const el = getHost();\n const slots = useSlots();\n const watch = watchEffect;\n\n // ────────────────────────────────────────────────────────────────\n // Item & Separator Synchronization\n // ────────────────────────────────────────────────────────────────\n\n const getItems = (): HTMLElement[] => Array.from(el.getElementsByTagName('ore-breadcrumb-item'));\n\n const syncItems = () => {\n const sep = props.separator.value || '/';\n const items = getItems();\n\n for (let i = 0; i < items.length; i++) {\n items[i].setAttribute('separator', sep);\n items[i].toggleAttribute('data-show-separator', i > 0);\n }\n\n // Sync CSS variable for CSS-based separator (if used)\n if (sep) el.style.setProperty('--breadcrumb-separator', `'${sep}'`);\n else el.style.removeProperty('--breadcrumb-separator');\n };\n\n // ────────────────────────────────────────────────────────────────\n // Lifecycle\n // ────────────────────────────────────────────────────────────────\n\n watch(() => {\n void slots.elements().value;\n syncItems();\n });\n\n return html`\n <nav part=\"nav\" aria-label=\"${props.label}\">\n <ol role=\"list\" part=\"list\">\n <slot></slot>\n </ol>\n </nav>\n `;\n },\n styles: [componentStyles],\n});\n"],"mappings":"uNAqCA,IAAa,EAAsB,uBACnC,EAAA,EAAA,OAAA,CAA+B,EAAqB,CAClD,MAAO,CACL,OAAQ,EAAA,KAAK,KAAK,EAClB,KAAM,EAAA,KAAK,OAAO,EAClB,UAAW,EAAA,KAAK,OAAO,GAAG,CAC5B,EACA,MAAM,EAAO,CACX,MAAO,GAAA,IAAI;;sEAEuD,EAAM,UAAU;;;kBAGpE,EAAM,KAAK;8BACI,EAAM,OAAO,MAAQ,OAAS,KAAM;0BACxC,EAAM,OAAO,MAAQ,KAAO,KAAM;;;;;;KAO7D,EACA,OAAQ,CAAC,EAAA,OAAU,CACrB,CAAC,EA8BD,IAAa,EAAiB,kBAC9B,EAAA,EAAA,OAAA,CAA2B,EAAgB,CACzC,MAAO,CACL,MAAO,EAAA,KAAK,OAAO,YAAY,EAC/B,UAAW,EAAA,KAAK,OAAO,CACzB,EACA,MAAM,EAAO,CACX,IAAM,GAAA,EAAK,EAAA,QAAA,CAAQ,EACb,GAAA,EAAQ,EAAA,SAAA,CAAS,EACjB,EAAQ,EAAA,YAMR,MAAgC,MAAM,KAAK,EAAG,qBAAqB,qBAAqB,CAAC,EAEzF,MAAkB,CACtB,IAAM,EAAM,EAAM,UAAU,OAAS,IAC/B,EAAQ,EAAS,EAEvB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAM,OAAQ,IAChC,EAAM,EAAE,CAAC,aAAa,YAAa,CAAG,EACtC,EAAM,EAAE,CAAC,gBAAgB,sBAAuB,EAAI,CAAC,EAInD,EAAK,EAAG,MAAM,YAAY,yBAA0B,IAAI,EAAI,EAAE,EAC7D,EAAG,MAAM,eAAe,wBAAwB,CACvD,EAWA,OALA,MAAY,CACV,EAAW,SAAS,CAAC,CAAC,MACtB,EAAU,CACZ,CAAC,EAEM,EAAA,IAAI;oCACqB,EAAM,MAAM;;;;;KAM9C,EACA,OAAQ,CAAC,EAAA,OAAe,CAC1B,CAAC"}
1
+ {"version":3,"file":"breadcrumb.cjs","names":[],"sources":["../src/content/breadcrumb/breadcrumb.ts"],"sourcesContent":["import { define, getHost, html, prop, useSlots, watchEffect } from '@vielzeug/ore';\nimport componentStyles from './breadcrumb.css?inline';\nimport itemStyles from './breadcrumb-item.css?inline';\n\nexport type OreBreadcrumbProps = {\n label?: string;\n separator?: string;\n};\n\nexport type OreBreadcrumbItemProps = {\n active?: boolean;\n href?: string;\n separator?: string;\n};\n\n/**\n * A single breadcrumb entry rendered inside `<ore-breadcrumb>`.\n *\n * @element ore-breadcrumb-item\n *\n * @attr {boolean} active - Marks this item as the current page (`aria-current=\"page\"`)\n * @attr {string} href - Link target for this breadcrumb item\n * @attr {string} separator - Separator text shown before the item (except first item)\n *\n * @slot - Item label/content\n * @slot icon - Optional leading icon for the crumb\n *\n * @part separator - Separator element before the item label\n * @part link - The interactive anchor element\n *\n * @example\n * ```html\n * <ore-breadcrumb-item href=\"/\">Home</ore-breadcrumb-item>\n * <ore-breadcrumb-item active>Current Page</ore-breadcrumb-item>\n * ```\n */\nexport const BREADCRUMB_ITEM_TAG = 'ore-breadcrumb-item' as const;\ndefine<OreBreadcrumbItemProps>(BREADCRUMB_ITEM_TAG, {\n props: {\n active: prop.bool(),\n href: prop.string(),\n separator: prop.string('/'),\n },\n setup(props) {\n return html`\n <li class=\"item\" role=\"listitem\">\n <span class=\"separator\" part=\"separator\" aria-hidden=\"true\">${props.separator}</span>\n <a\n class=\"link\"\n href=\"${props.href}\"\n aria-current=\"${() => (props.active.value ? 'page' : null)}\"\n tabindex=\"${() => (props.active.value ? '-1' : null)}\"\n part=\"link\">\n <span class=\"icon\"><slot name=\"icon\"></slot></span>\n <span class=\"label\"><slot></slot></span>\n </a>\n </li>\n `;\n },\n styles: [itemStyles],\n});\n\n// ============================================\n// Breadcrumb Component\n// ============================================\n\n/**\n * Accessible breadcrumb navigation container.\n *\n * @element ore-breadcrumb\n *\n * @attr {string} label - Accessible label for the internal `<nav>` landmark\n * @attr {string} separator - Separator text propagated to child `<ore-breadcrumb-item>` elements\n *\n * @slot - One or more `<ore-breadcrumb-item>` children\n *\n * @part nav - Internal navigation landmark element\n * @part list - Internal ordered list container\n *\n * @cssprop --breadcrumb-separator - Optional custom separator text synced to child items\n *\n * @example\n * ```html\n * <ore-breadcrumb label=\"Page breadcrumb\">\n * <ore-breadcrumb-item href=\"/\">Home</ore-breadcrumb-item>\n * <ore-breadcrumb-item href=\"/blog\">Blog</ore-breadcrumb-item>\n * <ore-breadcrumb-item active>My Post</ore-breadcrumb-item>\n * </ore-breadcrumb>\n * ```\n */\nexport const BREADCRUMB_TAG = 'ore-breadcrumb' as const;\ndefine<OreBreadcrumbProps>(BREADCRUMB_TAG, {\n props: {\n label: prop.string('Breadcrumb'),\n separator: prop.string(),\n },\n setup(props) {\n const el = getHost();\n const slots = useSlots();\n const watch = watchEffect;\n\n // ────────────────────────────────────────────────────────────────\n // Item & Separator Synchronization\n // ────────────────────────────────────────────────────────────────\n\n const getItems = (): HTMLElement[] => Array.from(el.getElementsByTagName('ore-breadcrumb-item'));\n\n const syncItems = () => {\n const sep = props.separator.value || '/';\n const items = getItems();\n\n for (let i = 0; i < items.length; i++) {\n items[i].setAttribute('separator', sep);\n items[i].toggleAttribute('data-show-separator', i > 0);\n }\n\n // Sync CSS variable for CSS-based separator (if used)\n if (sep) el.style.setProperty('--breadcrumb-separator', `'${sep}'`);\n else el.style.removeProperty('--breadcrumb-separator');\n };\n\n // ────────────────────────────────────────────────────────────────\n // Lifecycle\n // ────────────────────────────────────────────────────────────────\n\n watch(() => {\n void slots.elements().value;\n syncItems();\n });\n\n return html`\n <nav part=\"nav\" aria-label=\"${props.label}\">\n <ol role=\"list\" part=\"list\">\n <slot></slot>\n </ol>\n </nav>\n `;\n },\n styles: [componentStyles],\n});\n"],"mappings":"uNAoCA,IAAa,EAAsB,uBACnC,EAAA,EAAA,OAAA,CAA+B,EAAqB,CAClD,MAAO,CACL,OAAQ,EAAA,KAAK,KAAK,EAClB,KAAM,EAAA,KAAK,OAAO,EAClB,UAAW,EAAA,KAAK,OAAO,GAAG,CAC5B,EACA,MAAM,EAAO,CACX,MAAO,GAAA,IAAI;;sEAEuD,EAAM,UAAU;;;kBAGpE,EAAM,KAAK;8BACI,EAAM,OAAO,MAAQ,OAAS,KAAM;0BACxC,EAAM,OAAO,MAAQ,KAAO,KAAM;;;;;;KAO7D,EACA,OAAQ,CAAC,EAAA,OAAU,CACrB,CAAC,EA8BD,IAAa,EAAiB,kBAC9B,EAAA,EAAA,OAAA,CAA2B,EAAgB,CACzC,MAAO,CACL,MAAO,EAAA,KAAK,OAAO,YAAY,EAC/B,UAAW,EAAA,KAAK,OAAO,CACzB,EACA,MAAM,EAAO,CACX,IAAM,GAAA,EAAK,EAAA,QAAA,CAAQ,EACb,GAAA,EAAQ,EAAA,SAAA,CAAS,EACjB,EAAQ,EAAA,YAMR,MAAgC,MAAM,KAAK,EAAG,qBAAqB,qBAAqB,CAAC,EAEzF,MAAkB,CACtB,IAAM,EAAM,EAAM,UAAU,OAAS,IAC/B,EAAQ,EAAS,EAEvB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAM,OAAQ,IAChC,EAAM,EAAE,CAAC,aAAa,YAAa,CAAG,EACtC,EAAM,EAAE,CAAC,gBAAgB,sBAAuB,EAAI,CAAC,EAInD,EAAK,EAAG,MAAM,YAAY,yBAA0B,IAAI,EAAI,EAAE,EAC7D,EAAG,MAAM,eAAe,wBAAwB,CACvD,EAWA,OALA,MAAY,CACV,EAAW,SAAS,CAAC,CAAC,MACtB,EAAU,CACZ,CAAC,EAEM,EAAA,IAAI;oCACqB,EAAM,MAAM;;;;;KAM9C,EACA,OAAQ,CAAC,EAAA,OAAe,CAC1B,CAAC"}
@@ -1,5 +1,5 @@
1
- import e from "./content/breadcrumb/breadcrumb-item.css.js";
2
- import t from "./content/breadcrumb/breadcrumb.css.js";
1
+ import e from "./content/breadcrumb/breadcrumb.css.js";
2
+ import t from "./content/breadcrumb/breadcrumb-item.css.js";
3
3
  import { define as n, getHost as r, html as i, prop as a, useSlots as o, watchEffect as s } from "@vielzeug/ore";
4
4
  //#region src/content/breadcrumb/breadcrumb.ts
5
5
  var c = "ore-breadcrumb-item";
@@ -25,7 +25,7 @@ n(c, {
25
25
  </li>
26
26
  `;
27
27
  },
28
- styles: [e]
28
+ styles: [t]
29
29
  });
30
30
  var l = "ore-breadcrumb";
31
31
  n(l, {
@@ -49,7 +49,7 @@ n(l, {
49
49
  </nav>
50
50
  `;
51
51
  },
52
- styles: [t]
52
+ styles: [e]
53
53
  });
54
54
  //#endregion
55
55
  export { c as BREADCRUMB_ITEM_TAG, l as BREADCRUMB_TAG };
@@ -1 +1 @@
1
- {"version":3,"file":"breadcrumb.js","names":[],"sources":["../src/content/breadcrumb/breadcrumb.ts"],"sourcesContent":["import { define, html, prop, getHost, useSlots, watchEffect } from '@vielzeug/ore';\n\nimport itemStyles from './breadcrumb-item.css?inline';\nimport componentStyles from './breadcrumb.css?inline';\n\nexport type OreBreadcrumbProps = {\n label?: string;\n separator?: string;\n};\n\nexport type OreBreadcrumbItemProps = {\n active?: boolean;\n href?: string;\n separator?: string;\n};\n\n/**\n * A single breadcrumb entry rendered inside `<ore-breadcrumb>`.\n *\n * @element ore-breadcrumb-item\n *\n * @attr {boolean} active - Marks this item as the current page (`aria-current=\"page\"`)\n * @attr {string} href - Link target for this breadcrumb item\n * @attr {string} separator - Separator text shown before the item (except first item)\n *\n * @slot - Item label/content\n * @slot icon - Optional leading icon for the crumb\n *\n * @part separator - Separator element before the item label\n * @part link - The interactive anchor element\n *\n * @example\n * ```html\n * <ore-breadcrumb-item href=\"/\">Home</ore-breadcrumb-item>\n * <ore-breadcrumb-item active>Current Page</ore-breadcrumb-item>\n * ```\n */\nexport const BREADCRUMB_ITEM_TAG = 'ore-breadcrumb-item' as const;\ndefine<OreBreadcrumbItemProps>(BREADCRUMB_ITEM_TAG, {\n props: {\n active: prop.bool(),\n href: prop.string(),\n separator: prop.string('/'),\n },\n setup(props) {\n return html`\n <li class=\"item\" role=\"listitem\">\n <span class=\"separator\" part=\"separator\" aria-hidden=\"true\">${props.separator}</span>\n <a\n class=\"link\"\n href=\"${props.href}\"\n aria-current=\"${() => (props.active.value ? 'page' : null)}\"\n tabindex=\"${() => (props.active.value ? '-1' : null)}\"\n part=\"link\">\n <span class=\"icon\"><slot name=\"icon\"></slot></span>\n <span class=\"label\"><slot></slot></span>\n </a>\n </li>\n `;\n },\n styles: [itemStyles],\n});\n\n// ============================================\n// Breadcrumb Component\n// ============================================\n\n/**\n * Accessible breadcrumb navigation container.\n *\n * @element ore-breadcrumb\n *\n * @attr {string} label - Accessible label for the internal `<nav>` landmark\n * @attr {string} separator - Separator text propagated to child `<ore-breadcrumb-item>` elements\n *\n * @slot - One or more `<ore-breadcrumb-item>` children\n *\n * @part nav - Internal navigation landmark element\n * @part list - Internal ordered list container\n *\n * @cssprop --breadcrumb-separator - Optional custom separator text synced to child items\n *\n * @example\n * ```html\n * <ore-breadcrumb label=\"Page breadcrumb\">\n * <ore-breadcrumb-item href=\"/\">Home</ore-breadcrumb-item>\n * <ore-breadcrumb-item href=\"/blog\">Blog</ore-breadcrumb-item>\n * <ore-breadcrumb-item active>My Post</ore-breadcrumb-item>\n * </ore-breadcrumb>\n * ```\n */\nexport const BREADCRUMB_TAG = 'ore-breadcrumb' as const;\ndefine<OreBreadcrumbProps>(BREADCRUMB_TAG, {\n props: {\n label: prop.string('Breadcrumb'),\n separator: prop.string(),\n },\n setup(props) {\n const el = getHost();\n const slots = useSlots();\n const watch = watchEffect;\n\n // ────────────────────────────────────────────────────────────────\n // Item & Separator Synchronization\n // ────────────────────────────────────────────────────────────────\n\n const getItems = (): HTMLElement[] => Array.from(el.getElementsByTagName('ore-breadcrumb-item'));\n\n const syncItems = () => {\n const sep = props.separator.value || '/';\n const items = getItems();\n\n for (let i = 0; i < items.length; i++) {\n items[i].setAttribute('separator', sep);\n items[i].toggleAttribute('data-show-separator', i > 0);\n }\n\n // Sync CSS variable for CSS-based separator (if used)\n if (sep) el.style.setProperty('--breadcrumb-separator', `'${sep}'`);\n else el.style.removeProperty('--breadcrumb-separator');\n };\n\n // ────────────────────────────────────────────────────────────────\n // Lifecycle\n // ────────────────────────────────────────────────────────────────\n\n watch(() => {\n void slots.elements().value;\n syncItems();\n });\n\n return html`\n <nav part=\"nav\" aria-label=\"${props.label}\">\n <ol role=\"list\" part=\"list\">\n <slot></slot>\n </ol>\n </nav>\n `;\n },\n styles: [componentStyles],\n});\n"],"mappings":";;;;AAqCA,IAAa,IAAsB;AACnC,EAA+B,GAAqB;CAClD,OAAO;EACL,QAAQ,EAAK,KAAK;EAClB,MAAM,EAAK,OAAO;EAClB,WAAW,EAAK,OAAO,GAAG;CAC5B;CACA,MAAM,GAAO;EACX,OAAO,CAAI;;sEAEuD,EAAM,UAAU;;;kBAGpE,EAAM,KAAK;gCACI,EAAM,OAAO,QAAQ,SAAS,KAAM;4BACxC,EAAM,OAAO,QAAQ,OAAO,KAAM;;;;;;;CAO7D;CACA,QAAQ,CAAC,CAAU;AACrB,CAAC;AA8BD,IAAa,IAAiB;AAC9B,EAA2B,GAAgB;CACzC,OAAO;EACL,OAAO,EAAK,OAAO,YAAY;EAC/B,WAAW,EAAK,OAAO;CACzB;CACA,MAAM,GAAO;EACX,IAAM,IAAK,EAAQ,GACb,IAAQ,EAAS,GACjB,IAAQ,GAMR,UAAgC,MAAM,KAAK,EAAG,qBAAqB,qBAAqB,CAAC,GAEzF,UAAkB;GACtB,IAAM,IAAM,EAAM,UAAU,SAAS,KAC/B,IAAQ,EAAS;GAEvB,KAAK,IAAI,IAAI,GAAG,IAAI,EAAM,QAAQ,KAEhC,AADA,EAAM,EAAE,CAAC,aAAa,aAAa,CAAG,GACtC,EAAM,EAAE,CAAC,gBAAgB,uBAAuB,IAAI,CAAC;GAIvD,AAAI,IAAK,EAAG,MAAM,YAAY,0BAA0B,IAAI,EAAI,EAAE,IAC7D,EAAG,MAAM,eAAe,wBAAwB;EACvD;EAWA,OALA,QAAY;GAEV,AADA,EAAW,SAAS,CAAC,CAAC,OACtB,EAAU;EACZ,CAAC,GAEM,CAAI;oCACqB,EAAM,MAAM;;;;;;CAM9C;CACA,QAAQ,CAAC,CAAe;AAC1B,CAAC"}
1
+ {"version":3,"file":"breadcrumb.js","names":[],"sources":["../src/content/breadcrumb/breadcrumb.ts"],"sourcesContent":["import { define, getHost, html, prop, useSlots, watchEffect } from '@vielzeug/ore';\nimport componentStyles from './breadcrumb.css?inline';\nimport itemStyles from './breadcrumb-item.css?inline';\n\nexport type OreBreadcrumbProps = {\n label?: string;\n separator?: string;\n};\n\nexport type OreBreadcrumbItemProps = {\n active?: boolean;\n href?: string;\n separator?: string;\n};\n\n/**\n * A single breadcrumb entry rendered inside `<ore-breadcrumb>`.\n *\n * @element ore-breadcrumb-item\n *\n * @attr {boolean} active - Marks this item as the current page (`aria-current=\"page\"`)\n * @attr {string} href - Link target for this breadcrumb item\n * @attr {string} separator - Separator text shown before the item (except first item)\n *\n * @slot - Item label/content\n * @slot icon - Optional leading icon for the crumb\n *\n * @part separator - Separator element before the item label\n * @part link - The interactive anchor element\n *\n * @example\n * ```html\n * <ore-breadcrumb-item href=\"/\">Home</ore-breadcrumb-item>\n * <ore-breadcrumb-item active>Current Page</ore-breadcrumb-item>\n * ```\n */\nexport const BREADCRUMB_ITEM_TAG = 'ore-breadcrumb-item' as const;\ndefine<OreBreadcrumbItemProps>(BREADCRUMB_ITEM_TAG, {\n props: {\n active: prop.bool(),\n href: prop.string(),\n separator: prop.string('/'),\n },\n setup(props) {\n return html`\n <li class=\"item\" role=\"listitem\">\n <span class=\"separator\" part=\"separator\" aria-hidden=\"true\">${props.separator}</span>\n <a\n class=\"link\"\n href=\"${props.href}\"\n aria-current=\"${() => (props.active.value ? 'page' : null)}\"\n tabindex=\"${() => (props.active.value ? '-1' : null)}\"\n part=\"link\">\n <span class=\"icon\"><slot name=\"icon\"></slot></span>\n <span class=\"label\"><slot></slot></span>\n </a>\n </li>\n `;\n },\n styles: [itemStyles],\n});\n\n// ============================================\n// Breadcrumb Component\n// ============================================\n\n/**\n * Accessible breadcrumb navigation container.\n *\n * @element ore-breadcrumb\n *\n * @attr {string} label - Accessible label for the internal `<nav>` landmark\n * @attr {string} separator - Separator text propagated to child `<ore-breadcrumb-item>` elements\n *\n * @slot - One or more `<ore-breadcrumb-item>` children\n *\n * @part nav - Internal navigation landmark element\n * @part list - Internal ordered list container\n *\n * @cssprop --breadcrumb-separator - Optional custom separator text synced to child items\n *\n * @example\n * ```html\n * <ore-breadcrumb label=\"Page breadcrumb\">\n * <ore-breadcrumb-item href=\"/\">Home</ore-breadcrumb-item>\n * <ore-breadcrumb-item href=\"/blog\">Blog</ore-breadcrumb-item>\n * <ore-breadcrumb-item active>My Post</ore-breadcrumb-item>\n * </ore-breadcrumb>\n * ```\n */\nexport const BREADCRUMB_TAG = 'ore-breadcrumb' as const;\ndefine<OreBreadcrumbProps>(BREADCRUMB_TAG, {\n props: {\n label: prop.string('Breadcrumb'),\n separator: prop.string(),\n },\n setup(props) {\n const el = getHost();\n const slots = useSlots();\n const watch = watchEffect;\n\n // ────────────────────────────────────────────────────────────────\n // Item & Separator Synchronization\n // ────────────────────────────────────────────────────────────────\n\n const getItems = (): HTMLElement[] => Array.from(el.getElementsByTagName('ore-breadcrumb-item'));\n\n const syncItems = () => {\n const sep = props.separator.value || '/';\n const items = getItems();\n\n for (let i = 0; i < items.length; i++) {\n items[i].setAttribute('separator', sep);\n items[i].toggleAttribute('data-show-separator', i > 0);\n }\n\n // Sync CSS variable for CSS-based separator (if used)\n if (sep) el.style.setProperty('--breadcrumb-separator', `'${sep}'`);\n else el.style.removeProperty('--breadcrumb-separator');\n };\n\n // ────────────────────────────────────────────────────────────────\n // Lifecycle\n // ────────────────────────────────────────────────────────────────\n\n watch(() => {\n void slots.elements().value;\n syncItems();\n });\n\n return html`\n <nav part=\"nav\" aria-label=\"${props.label}\">\n <ol role=\"list\" part=\"list\">\n <slot></slot>\n </ol>\n </nav>\n `;\n },\n styles: [componentStyles],\n});\n"],"mappings":";;;;AAoCA,IAAa,IAAsB;AACnC,EAA+B,GAAqB;CAClD,OAAO;EACL,QAAQ,EAAK,KAAK;EAClB,MAAM,EAAK,OAAO;EAClB,WAAW,EAAK,OAAO,GAAG;CAC5B;CACA,MAAM,GAAO;EACX,OAAO,CAAI;;sEAEuD,EAAM,UAAU;;;kBAGpE,EAAM,KAAK;gCACI,EAAM,OAAO,QAAQ,SAAS,KAAM;4BACxC,EAAM,OAAO,QAAQ,OAAO,KAAM;;;;;;;CAO7D;CACA,QAAQ,CAAC,CAAU;AACrB,CAAC;AA8BD,IAAa,IAAiB;AAC9B,EAA2B,GAAgB;CACzC,OAAO;EACL,OAAO,EAAK,OAAO,YAAY;EAC/B,WAAW,EAAK,OAAO;CACzB;CACA,MAAM,GAAO;EACX,IAAM,IAAK,EAAQ,GACb,IAAQ,EAAS,GACjB,IAAQ,GAMR,UAAgC,MAAM,KAAK,EAAG,qBAAqB,qBAAqB,CAAC,GAEzF,UAAkB;GACtB,IAAM,IAAM,EAAM,UAAU,SAAS,KAC/B,IAAQ,EAAS;GAEvB,KAAK,IAAI,IAAI,GAAG,IAAI,EAAM,QAAQ,KAEhC,AADA,EAAM,EAAE,CAAC,aAAa,aAAa,CAAG,GACtC,EAAM,EAAE,CAAC,gBAAgB,uBAAuB,IAAI,CAAC;GAIvD,AAAI,IAAK,EAAG,MAAM,YAAY,0BAA0B,IAAI,EAAI,EAAE,IAC7D,EAAG,MAAM,eAAe,wBAAwB;EACvD;EAWA,OALA,QAAY;GAEV,AADA,EAAW,SAAS,CAAC,CAAC,OACtB,EAAU;EACZ,CAAC,GAEM,CAAI;oCACqB,EAAM,MAAM;;;;;;CAM9C;CACA,QAAQ,CAAC,CAAe;AAC1B,CAAC"}
@@ -1,4 +1,4 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./styles/mixins/shape.css.cjs"),t=require("./shared/prop-bundles.cjs"),n=require("./inputs/button-group/button-group.css.cjs");let r=require("@vielzeug/ore");require("@vielzeug/ripple");var i=(0,r.createContext)(`OreButtonGroup`),a=`ore-button-group`;(0,r.define)(a,{props:{...t.themableBundle,...t.sizableBundle,...t.roundableBundle,attached:r.prop.bool(!1),fullwidth:r.prop.bool(!1),label:r.prop.string(),orientation:r.prop.string(),variant:r.prop.string()},setup(e){return(0,r.provide)(i,{color:e.color,size:e.size,variant:e.variant}),r.html`
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./styles/mixins/shape.css.cjs"),t=require("./shared/prop-bundles.cjs"),n=require("./inputs/button-group/button-group.css.cjs");let r=require("@vielzeug/ore");var i=(0,r.createContext)(`OreButtonGroup`),a=`ore-button-group`;(0,r.define)(a,{props:{...t.themableBundle,...t.sizableBundle,...t.roundableBundle,attached:r.prop.bool(!1),fullwidth:r.prop.bool(!1),label:r.prop.string(),orientation:r.prop.string(),variant:r.prop.string()},setup(e){return(0,r.provide)(i,{color:e.color,size:e.size,variant:e.variant}),r.html`
2
2
  <div class="button-group" part="group" role="group" aria-label="${e.label}">
3
3
  <slot></slot>
4
4
  </div>
@@ -1 +1 @@
1
- {"version":3,"file":"button-group.cjs","names":[],"sources":["../src/inputs/button-group/button-group.ts"],"sourcesContent":["import { createContext, define, html, prop, provide } from '@vielzeug/ore';\nimport { type Readable } from '@vielzeug/ripple';\n\nimport type { ComponentSize, RoundedSize, ThemeColor } from '../../shared';\nimport type { ButtonVariant } from '../button/button';\n\nimport { roundableBundle, sizableBundle, themableBundle } from '../../shared';\nimport { roundedVariantMixin } from '../../styles';\nimport componentStyles from './button-group.css?inline';\n\n/** Button group properties */\nexport type OreButtonGroupProps = {\n /** Join buttons together into a single unit */\n attached?: boolean;\n /** Theme color tint for all child buttons */\n color?: ThemeColor;\n /** Group children span full width */\n fullwidth?: boolean;\n /** Label for screen readers */\n label?: string;\n /** Layout direction */\n orientation?: 'horizontal' | 'vertical';\n /** Corner radius of the group container (and its attached-mode end buttons) */\n rounded?: RoundedSize | '';\n /** Shared size for all child buttons */\n size?: ComponentSize;\n /** Shared visual variant for all child buttons */\n variant?: ButtonVariant;\n};\n\n/** Shared context propagated from ore-button-group to child ore-button elements */\nexport type ButtonGroupContext = {\n color: Readable<ThemeColor | undefined>;\n size: Readable<ComponentSize | undefined>;\n variant: Readable<ButtonVariant | undefined>;\n};\n\nexport const BUTTON_GROUP_CTX = createContext<ButtonGroupContext | undefined>('OreButtonGroup');\n\n/**\n * A container for grouping related buttons.\n * Child `ore-button` components automatically inherit the group's color, size, and variant.\n *\n * @element ore-button-group\n *\n * @attr {boolean} attached - Join buttons together into a unit\n * @attr {string} color - Shared color tint: 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'\n * @attr {boolean} fullwidth - Group spans full width\n * @attr {string} label - Accessible label\n * @attr {string} orientation - 'horizontal' | 'vertical'\n * @attr {string} rounded - Corner radius: 'none' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | 'full' (bare attribute defaults to 'full')\n * @attr {string} size - Shared size: 'sm' | 'md' | 'lg'\n * @attr {string} variant - Shared visual variant: 'solid' | 'flat' | 'bordered' | 'outline' | 'ghost' | 'frost'\n *\n * @slot - Place ore-button elements here\n *\n * @cssprop --group-gap - Gap between buttons (non-attached mode)\n * @cssprop --group-radius - Border radius of the group container, defaults to the `rounded` attribute's token\n * @cssprop --button-radius - Passed through to child buttons to control corner radius\n * @cssprop --button-border-start - Passed through to suppress start borders in attached mode\n * @cssprop --button-border-top - Passed through to suppress top borders in vertical attached mode\n * @part group - Group container.\n * @example\n * ```html\n * <ore-button-group attached rounded=\"full\">\n * <ore-button variant=\"solid\" color=\"primary\">Save</ore-button>\n * <ore-button variant=\"solid\" color=\"primary\">Save &amp; Continue</ore-button>\n * </ore-button-group>\n * <ore-button-group orientation=\"vertical\" size=\"sm\">\n * <ore-button>Top</ore-button>\n * <ore-button>Middle</ore-button>\n * <ore-button>Bottom</ore-button>\n * </ore-button-group>\n * ```\n */\nexport const BUTTON_GROUP_TAG = 'ore-button-group' as const;\ndefine<OreButtonGroupProps>(BUTTON_GROUP_TAG, {\n props: {\n ...themableBundle,\n ...sizableBundle,\n ...roundableBundle,\n attached: prop.bool(false),\n fullwidth: prop.bool(false),\n label: prop.string(),\n orientation: prop.string<'horizontal' | 'vertical'>(),\n variant: prop.string(),\n },\n setup(props) {\n provide(BUTTON_GROUP_CTX, {\n color: props.color!,\n size: props.size!,\n variant: props.variant!,\n });\n\n return html`\n <div class=\"button-group\" part=\"group\" role=\"group\" aria-label=\"${props.label}\">\n <slot></slot>\n </div>\n `;\n },\n styles: [roundedVariantMixin, componentStyles],\n});\n"],"mappings":"8QAqCA,IAAa,GAAA,EAAmB,EAAA,cAAA,CAA8C,gBAAgB,EAsCjF,EAAmB,oBAChC,EAAA,EAAA,OAAA,CAA4B,EAAkB,CAC5C,MAAO,CACL,GAAG,EAAA,eACH,GAAG,EAAA,cACH,GAAG,EAAA,gBACH,SAAU,EAAA,KAAK,KAAK,EAAK,EACzB,UAAW,EAAA,KAAK,KAAK,EAAK,EAC1B,MAAO,EAAA,KAAK,OAAO,EACnB,YAAa,EAAA,KAAK,OAAkC,EACpD,QAAS,EAAA,KAAK,OAAO,CACvB,EACA,MAAM,EAAO,CAOX,OANA,EAAA,EAAA,QAAA,CAAQ,EAAkB,CACxB,MAAO,EAAM,MACb,KAAM,EAAM,KACZ,QAAS,EAAM,OACjB,CAAC,EAEM,EAAA,IAAI;wEACyD,EAAM,MAAM;;;KAIlF,EACA,OAAQ,CAAC,EAAA,oBAAqB,EAAA,OAAe,CAC/C,CAAC"}
1
+ {"version":3,"file":"button-group.cjs","names":[],"sources":["../src/inputs/button-group/button-group.ts"],"sourcesContent":["import { createContext, define, html, prop, provide } from '@vielzeug/ore';\nimport type { Readable } from '@vielzeug/ripple';\n\nimport type { ComponentSize, RoundedSize, ThemeColor } from '../../shared';\nimport { roundableBundle, sizableBundle, themableBundle } from '../../shared';\nimport { roundedVariantMixin } from '../../styles';\nimport type { ButtonVariant } from '../button/button';\nimport componentStyles from './button-group.css?inline';\n\n/** Button group properties */\nexport type OreButtonGroupProps = {\n /** Join buttons together into a single unit */\n attached?: boolean;\n /** Theme color tint for all child buttons */\n color?: ThemeColor;\n /** Group children span full width */\n fullwidth?: boolean;\n /** Label for screen readers */\n label?: string;\n /** Layout direction */\n orientation?: 'horizontal' | 'vertical';\n /** Corner radius of the group container (and its attached-mode end buttons) */\n rounded?: RoundedSize | '';\n /** Shared size for all child buttons */\n size?: ComponentSize;\n /** Shared visual variant for all child buttons */\n variant?: ButtonVariant;\n};\n\n/** Shared context propagated from ore-button-group to child ore-button elements */\nexport type ButtonGroupContext = {\n color: Readable<ThemeColor | undefined>;\n size: Readable<ComponentSize | undefined>;\n variant: Readable<ButtonVariant | undefined>;\n};\n\nexport const BUTTON_GROUP_CTX = createContext<ButtonGroupContext | undefined>('OreButtonGroup');\n\n/**\n * A container for grouping related buttons.\n * Child `ore-button` components automatically inherit the group's color, size, and variant.\n *\n * @element ore-button-group\n *\n * @attr {boolean} attached - Join buttons together into a unit\n * @attr {string} color - Shared color tint: 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'\n * @attr {boolean} fullwidth - Group spans full width\n * @attr {string} label - Accessible label\n * @attr {string} orientation - 'horizontal' | 'vertical'\n * @attr {string} rounded - Corner radius: 'none' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | 'full' (bare attribute defaults to 'full')\n * @attr {string} size - Shared size: 'sm' | 'md' | 'lg'\n * @attr {string} variant - Shared visual variant: 'solid' | 'flat' | 'bordered' | 'outline' | 'ghost' | 'frost'\n *\n * @slot - Place ore-button elements here\n *\n * @cssprop --group-gap - Gap between buttons (non-attached mode)\n * @cssprop --group-radius - Border radius of the group container, defaults to the `rounded` attribute's token\n * @cssprop --button-radius - Passed through to child buttons to control corner radius\n * @cssprop --button-border-start - Passed through to suppress start borders in attached mode\n * @cssprop --button-border-top - Passed through to suppress top borders in vertical attached mode\n * @part group - Group container.\n * @example\n * ```html\n * <ore-button-group attached rounded=\"full\">\n * <ore-button variant=\"solid\" color=\"primary\">Save</ore-button>\n * <ore-button variant=\"solid\" color=\"primary\">Save &amp; Continue</ore-button>\n * </ore-button-group>\n * <ore-button-group orientation=\"vertical\" size=\"sm\">\n * <ore-button>Top</ore-button>\n * <ore-button>Middle</ore-button>\n * <ore-button>Bottom</ore-button>\n * </ore-button-group>\n * ```\n */\nexport const BUTTON_GROUP_TAG = 'ore-button-group' as const;\ndefine<OreButtonGroupProps>(BUTTON_GROUP_TAG, {\n props: {\n ...themableBundle,\n ...sizableBundle,\n ...roundableBundle,\n attached: prop.bool(false),\n fullwidth: prop.bool(false),\n label: prop.string(),\n orientation: prop.string<'horizontal' | 'vertical'>(),\n variant: prop.string(),\n },\n setup(props) {\n provide(BUTTON_GROUP_CTX, {\n color: props.color!,\n size: props.size!,\n variant: props.variant!,\n });\n\n return html`\n <div class=\"button-group\" part=\"group\" role=\"group\" aria-label=\"${props.label}\">\n <slot></slot>\n </div>\n `;\n },\n styles: [roundedVariantMixin, componentStyles],\n});\n"],"mappings":"kPAoCA,IAAa,GAAA,EAAmB,EAAA,cAAA,CAA8C,gBAAgB,EAsCjF,EAAmB,oBAChC,EAAA,EAAA,OAAA,CAA4B,EAAkB,CAC5C,MAAO,CACL,GAAG,EAAA,eACH,GAAG,EAAA,cACH,GAAG,EAAA,gBACH,SAAU,EAAA,KAAK,KAAK,EAAK,EACzB,UAAW,EAAA,KAAK,KAAK,EAAK,EAC1B,MAAO,EAAA,KAAK,OAAO,EACnB,YAAa,EAAA,KAAK,OAAkC,EACpD,QAAS,EAAA,KAAK,OAAO,CACvB,EACA,MAAM,EAAO,CAOX,OANA,EAAA,EAAA,QAAA,CAAQ,EAAkB,CACxB,MAAO,EAAM,MACb,KAAM,EAAM,KACZ,QAAS,EAAM,OACjB,CAAC,EAEM,EAAA,IAAI;wEACyD,EAAM,MAAM;;;KAIlF,EACA,OAAQ,CAAC,EAAA,oBAAqB,EAAA,OAAe,CAC/C,CAAC"}
@@ -2,7 +2,6 @@ import { roundedVariantMixin as e } from "./styles/mixins/shape.css.js";
2
2
  import { roundableBundle as t, sizableBundle as n, themableBundle as r } from "./shared/prop-bundles.js";
3
3
  import i from "./inputs/button-group/button-group.css.js";
4
4
  import { createContext as a, define as o, html as s, prop as c, provide as l } from "@vielzeug/ore";
5
- import "@vielzeug/ripple";
6
5
  //#region src/inputs/button-group/button-group.ts
7
6
  var u = a("OreButtonGroup"), d = "ore-button-group";
8
7
  o(d, {
@@ -1 +1 @@
1
- {"version":3,"file":"button-group.js","names":[],"sources":["../src/inputs/button-group/button-group.ts"],"sourcesContent":["import { createContext, define, html, prop, provide } from '@vielzeug/ore';\nimport { type Readable } from '@vielzeug/ripple';\n\nimport type { ComponentSize, RoundedSize, ThemeColor } from '../../shared';\nimport type { ButtonVariant } from '../button/button';\n\nimport { roundableBundle, sizableBundle, themableBundle } from '../../shared';\nimport { roundedVariantMixin } from '../../styles';\nimport componentStyles from './button-group.css?inline';\n\n/** Button group properties */\nexport type OreButtonGroupProps = {\n /** Join buttons together into a single unit */\n attached?: boolean;\n /** Theme color tint for all child buttons */\n color?: ThemeColor;\n /** Group children span full width */\n fullwidth?: boolean;\n /** Label for screen readers */\n label?: string;\n /** Layout direction */\n orientation?: 'horizontal' | 'vertical';\n /** Corner radius of the group container (and its attached-mode end buttons) */\n rounded?: RoundedSize | '';\n /** Shared size for all child buttons */\n size?: ComponentSize;\n /** Shared visual variant for all child buttons */\n variant?: ButtonVariant;\n};\n\n/** Shared context propagated from ore-button-group to child ore-button elements */\nexport type ButtonGroupContext = {\n color: Readable<ThemeColor | undefined>;\n size: Readable<ComponentSize | undefined>;\n variant: Readable<ButtonVariant | undefined>;\n};\n\nexport const BUTTON_GROUP_CTX = createContext<ButtonGroupContext | undefined>('OreButtonGroup');\n\n/**\n * A container for grouping related buttons.\n * Child `ore-button` components automatically inherit the group's color, size, and variant.\n *\n * @element ore-button-group\n *\n * @attr {boolean} attached - Join buttons together into a unit\n * @attr {string} color - Shared color tint: 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'\n * @attr {boolean} fullwidth - Group spans full width\n * @attr {string} label - Accessible label\n * @attr {string} orientation - 'horizontal' | 'vertical'\n * @attr {string} rounded - Corner radius: 'none' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | 'full' (bare attribute defaults to 'full')\n * @attr {string} size - Shared size: 'sm' | 'md' | 'lg'\n * @attr {string} variant - Shared visual variant: 'solid' | 'flat' | 'bordered' | 'outline' | 'ghost' | 'frost'\n *\n * @slot - Place ore-button elements here\n *\n * @cssprop --group-gap - Gap between buttons (non-attached mode)\n * @cssprop --group-radius - Border radius of the group container, defaults to the `rounded` attribute's token\n * @cssprop --button-radius - Passed through to child buttons to control corner radius\n * @cssprop --button-border-start - Passed through to suppress start borders in attached mode\n * @cssprop --button-border-top - Passed through to suppress top borders in vertical attached mode\n * @part group - Group container.\n * @example\n * ```html\n * <ore-button-group attached rounded=\"full\">\n * <ore-button variant=\"solid\" color=\"primary\">Save</ore-button>\n * <ore-button variant=\"solid\" color=\"primary\">Save &amp; Continue</ore-button>\n * </ore-button-group>\n * <ore-button-group orientation=\"vertical\" size=\"sm\">\n * <ore-button>Top</ore-button>\n * <ore-button>Middle</ore-button>\n * <ore-button>Bottom</ore-button>\n * </ore-button-group>\n * ```\n */\nexport const BUTTON_GROUP_TAG = 'ore-button-group' as const;\ndefine<OreButtonGroupProps>(BUTTON_GROUP_TAG, {\n props: {\n ...themableBundle,\n ...sizableBundle,\n ...roundableBundle,\n attached: prop.bool(false),\n fullwidth: prop.bool(false),\n label: prop.string(),\n orientation: prop.string<'horizontal' | 'vertical'>(),\n variant: prop.string(),\n },\n setup(props) {\n provide(BUTTON_GROUP_CTX, {\n color: props.color!,\n size: props.size!,\n variant: props.variant!,\n });\n\n return html`\n <div class=\"button-group\" part=\"group\" role=\"group\" aria-label=\"${props.label}\">\n <slot></slot>\n </div>\n `;\n },\n styles: [roundedVariantMixin, componentStyles],\n});\n"],"mappings":";;;;;;AAqCA,IAAa,IAAmB,EAA8C,gBAAgB,GAsCjF,IAAmB;AAChC,EAA4B,GAAkB;CAC5C,OAAO;EACL,GAAG;EACH,GAAG;EACH,GAAG;EACH,UAAU,EAAK,KAAK,EAAK;EACzB,WAAW,EAAK,KAAK,EAAK;EAC1B,OAAO,EAAK,OAAO;EACnB,aAAa,EAAK,OAAkC;EACpD,SAAS,EAAK,OAAO;CACvB;CACA,MAAM,GAAO;EAOX,OANA,EAAQ,GAAkB;GACxB,OAAO,EAAM;GACb,MAAM,EAAM;GACZ,SAAS,EAAM;EACjB,CAAC,GAEM,CAAI;wEACyD,EAAM,MAAM;;;;CAIlF;CACA,QAAQ,CAAC,GAAqB,CAAe;AAC/C,CAAC"}
1
+ {"version":3,"file":"button-group.js","names":[],"sources":["../src/inputs/button-group/button-group.ts"],"sourcesContent":["import { createContext, define, html, prop, provide } from '@vielzeug/ore';\nimport type { Readable } from '@vielzeug/ripple';\n\nimport type { ComponentSize, RoundedSize, ThemeColor } from '../../shared';\nimport { roundableBundle, sizableBundle, themableBundle } from '../../shared';\nimport { roundedVariantMixin } from '../../styles';\nimport type { ButtonVariant } from '../button/button';\nimport componentStyles from './button-group.css?inline';\n\n/** Button group properties */\nexport type OreButtonGroupProps = {\n /** Join buttons together into a single unit */\n attached?: boolean;\n /** Theme color tint for all child buttons */\n color?: ThemeColor;\n /** Group children span full width */\n fullwidth?: boolean;\n /** Label for screen readers */\n label?: string;\n /** Layout direction */\n orientation?: 'horizontal' | 'vertical';\n /** Corner radius of the group container (and its attached-mode end buttons) */\n rounded?: RoundedSize | '';\n /** Shared size for all child buttons */\n size?: ComponentSize;\n /** Shared visual variant for all child buttons */\n variant?: ButtonVariant;\n};\n\n/** Shared context propagated from ore-button-group to child ore-button elements */\nexport type ButtonGroupContext = {\n color: Readable<ThemeColor | undefined>;\n size: Readable<ComponentSize | undefined>;\n variant: Readable<ButtonVariant | undefined>;\n};\n\nexport const BUTTON_GROUP_CTX = createContext<ButtonGroupContext | undefined>('OreButtonGroup');\n\n/**\n * A container for grouping related buttons.\n * Child `ore-button` components automatically inherit the group's color, size, and variant.\n *\n * @element ore-button-group\n *\n * @attr {boolean} attached - Join buttons together into a unit\n * @attr {string} color - Shared color tint: 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'\n * @attr {boolean} fullwidth - Group spans full width\n * @attr {string} label - Accessible label\n * @attr {string} orientation - 'horizontal' | 'vertical'\n * @attr {string} rounded - Corner radius: 'none' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | 'full' (bare attribute defaults to 'full')\n * @attr {string} size - Shared size: 'sm' | 'md' | 'lg'\n * @attr {string} variant - Shared visual variant: 'solid' | 'flat' | 'bordered' | 'outline' | 'ghost' | 'frost'\n *\n * @slot - Place ore-button elements here\n *\n * @cssprop --group-gap - Gap between buttons (non-attached mode)\n * @cssprop --group-radius - Border radius of the group container, defaults to the `rounded` attribute's token\n * @cssprop --button-radius - Passed through to child buttons to control corner radius\n * @cssprop --button-border-start - Passed through to suppress start borders in attached mode\n * @cssprop --button-border-top - Passed through to suppress top borders in vertical attached mode\n * @part group - Group container.\n * @example\n * ```html\n * <ore-button-group attached rounded=\"full\">\n * <ore-button variant=\"solid\" color=\"primary\">Save</ore-button>\n * <ore-button variant=\"solid\" color=\"primary\">Save &amp; Continue</ore-button>\n * </ore-button-group>\n * <ore-button-group orientation=\"vertical\" size=\"sm\">\n * <ore-button>Top</ore-button>\n * <ore-button>Middle</ore-button>\n * <ore-button>Bottom</ore-button>\n * </ore-button-group>\n * ```\n */\nexport const BUTTON_GROUP_TAG = 'ore-button-group' as const;\ndefine<OreButtonGroupProps>(BUTTON_GROUP_TAG, {\n props: {\n ...themableBundle,\n ...sizableBundle,\n ...roundableBundle,\n attached: prop.bool(false),\n fullwidth: prop.bool(false),\n label: prop.string(),\n orientation: prop.string<'horizontal' | 'vertical'>(),\n variant: prop.string(),\n },\n setup(props) {\n provide(BUTTON_GROUP_CTX, {\n color: props.color!,\n size: props.size!,\n variant: props.variant!,\n });\n\n return html`\n <div class=\"button-group\" part=\"group\" role=\"group\" aria-label=\"${props.label}\">\n <slot></slot>\n </div>\n `;\n },\n styles: [roundedVariantMixin, componentStyles],\n});\n"],"mappings":";;;;;AAoCA,IAAa,IAAmB,EAA8C,gBAAgB,GAsCjF,IAAmB;AAChC,EAA4B,GAAkB;CAC5C,OAAO;EACL,GAAG;EACH,GAAG;EACH,GAAG;EACH,UAAU,EAAK,KAAK,EAAK;EACzB,WAAW,EAAK,KAAK,EAAK;EAC1B,OAAO,EAAK,OAAO;EACnB,aAAa,EAAK,OAAkC;EACpD,SAAS,EAAK,OAAO;CACvB;CACA,MAAM,GAAO;EAOX,OANA,EAAQ,GAAkB;GACxB,OAAO,EAAM;GACb,MAAM,EAAM;GACZ,SAAS,EAAM;EACjB,CAAC,GAEM,CAAI;wEACyD,EAAM,MAAM;;;;CAIlF;CACA,QAAQ,CAAC,GAAqB,CAAe;AAC/C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"button.cjs","names":[],"sources":["../src/inputs/button/button.ts"],"sourcesContent":["import { define, html, inject, prop, bind, getHost } from '@vielzeug/ore';\nimport { useField } from '@vielzeug/ore';\nimport { computed } from '@vielzeug/ripple';\n\nimport type { ButtonType, ComponentSize, LinkTarget, RoundedSize, ThemeColor } from '../../types';\n\nimport { commonProps } from '../../shared';\nimport {\n coarsePointerMixin,\n colorThemeMixin,\n disabledLoadingMixin,\n forcedColorsMixin,\n frostVariantMixin,\n rainbowEffectMixin,\n reducedMotionMixin,\n roundedVariantMixin,\n shineEffectMixin,\n sizeVariantMixin,\n} from '../../styles';\nimport { useLinkProps } from '../../utils';\nimport { BUTTON_GROUP_CTX } from '../button-group/button-group';\nimport { useFormAction } from '../shared';\nimport componentStyles from './button.css?inline';\n\nexport const BUTTON_VARIANTS = ['solid', 'flat', 'bordered', 'outline', 'ghost', 'text', 'frost'] as const;\n\n/** Visual variant for ore-button — derived from BUTTON_VARIANTS for a single source of truth. */\nexport type ButtonVariant = (typeof BUTTON_VARIANTS)[number];\n\n/** Animated border effect for ore-button. */\nexport type ButtonEffect = 'shine' | 'rainbow';\n\n/** Button component properties */\nexport type OreButtonProps = {\n /** Theme color */\n color?: ThemeColor;\n /** Disable interaction */\n disabled?: boolean;\n /** Animated border effect: 'shine' (color-aware neon sweep) or 'rainbow' */\n effect?: ButtonEffect;\n /**\n * Full height button (100% of container) — the inner `[part=\"button\"]` fills its host's\n * height instead of the size preset's fixed height. Useful when the button itself is the\n * whole tappable surface of a container it doesn't otherwise control the size of (e.g. a\n * swipe-revealed row action in `ore-list-item`'s `actions-left`/`actions-right` slots).\n */\n fullheight?: boolean;\n /** Full width button (100% of container) */\n fullwidth?: boolean;\n /** When set, renders an `<a>` instead of `<button>` */\n href?: string;\n /** Icon-only mode (square aspect ratio, no padding) */\n iconOnly?: boolean;\n /** Accessible label for the inner button — required for icon-only buttons */\n label?: string;\n /** Show loading state with spinner */\n loading?: boolean;\n /** Link rel attribute (requires href) */\n rel?: string;\n /** Border radius size */\n rounded?: RoundedSize;\n /** Component size */\n size?: ComponentSize;\n /** Link target (requires href) */\n target?: LinkTarget;\n /** HTML button type attribute */\n type?: ButtonType;\n /** Visual style variant */\n variant?: ButtonVariant;\n};\n\n/**\n * A customizable button component with multiple variants, sizes, and states.\n * Supports icons, loading states, and animated border effects.\n *\n * @element ore-button\n *\n * @attr {string} type - HTML button type: 'button' | 'submit' | 'reset'\n * @attr {boolean} disabled - Disable button interaction\n * @attr {boolean} loading - Show loading state with spinner\n * @attr {string} color - Theme color: 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'\n * @attr {string} variant - Visual variant: 'solid' | 'flat' | 'bordered' | 'outline' | 'ghost' | 'text' | 'frost'\n * @attr {string} size - Button size: 'sm' | 'md' | 'lg'\n * @attr {string} rounded - Border radius: 'none' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | 'full'\n * @attr {string} effect - Animated border effect: 'shine' | 'rainbow'\n * @attr {boolean} icon-only - Icon-only mode (square aspect ratio, no padding)\n * @attr {boolean} fullwidth - Full width button (100% of container)\n * @attr {boolean} fullheight - Full height button (100% of container)\n *\n * @fires click - Emitted when button is clicked (unless disabled/loading)\n *\n * @slot - Button content (text, icons, etc.)\n * @slot prefix - Content before the button text (e.g., icons)\n * @slot suffix - Content after the button text (e.g., icons, badges)\n *\n * @part button - The inner button or anchor element\n * @part loader - The loading spinner element\n * @part content - The button content wrapper\n *\n * @cssprop --button-bg - Background color override\n * @cssprop --button-color - Text color override\n * @cssprop --button-border - Border width override\n * @cssprop --button-border-color - Border color override\n * @cssprop --button-radius - Border radius override\n * @cssprop --button-padding - Inner padding override\n * @cssprop --button-gap - Gap between icon and text override\n * @cssprop --button-font-size - Font size override\n * @cssprop --button-frost-active-bg - Background when pressed (frost variant)\n * @cssprop --button-frost-active-border-color - Border color when pressed (frost variant)\n *\n * @example\n * ```html\n * <ore-button variant=\"solid\" color=\"primary\">Click me</ore-button>\n * <ore-button loading color=\"success\">Processing...</ore-button>\n * <ore-button effect=\"shine\" color=\"primary\">Shine</ore-button>\n * <ore-button effect=\"rainbow\" variant=\"frost\">Rainbow</ore-button>\n * ```\n */\nexport const BUTTON_TAG = 'ore-button' as const;\ndefine<OreButtonProps>(BUTTON_TAG, {\n formAssociated: true,\n props: {\n ...commonProps,\n effect: prop.string<ButtonEffect>(),\n fullheight: prop.bool(false),\n fullwidth: prop.bool(false),\n href: prop.string(),\n iconOnly: prop.bool(false),\n label: prop.string(),\n rel: prop.string(),\n target: prop.string<LinkTarget>(),\n type: prop.oneOf(['button', 'submit', 'reset'] as const, 'button'),\n variant: prop.oneOf(BUTTON_VARIANTS, 'solid'),\n },\n setup(props) {\n const el = getHost();\n\n // Prefer group context over own props for color/size/variant.\n const groupCtx = inject(BUTTON_GROUP_CTX);\n const effectiveColor = computed(() => groupCtx?.color.value ?? props.color.value);\n const effectiveSize = computed(() => groupCtx?.size.value ?? props.size.value);\n const effectiveVariant = computed(() => groupCtx?.variant.value ?? props.variant.value);\n\n const isDisabled = computed(() => !!(props.disabled.value || props.loading.value));\n\n // isLink and effectiveRel are computed from signals — correct even if href changes at runtime.\n const { effectiveRel, isLink } = useLinkProps(props.href, props.rel, props.target);\n\n // Form association: relay submit/reset clicks to the associated form.\n // The inner <button> always has type=\"button\" so shadow DOM never drives native form actions.\n // getForm() returns null for link mode at runtime, so no form actions fire.\n const formField = useField({\n disabled: isDisabled,\n toFormValue: () => null,\n value: computed(() => ''),\n });\n\n const handleClick = (e: MouseEvent) => {\n if (isDisabled.value) {\n e.preventDefault();\n\n return;\n }\n\n // Link mode renders a real <a href> below — the browser handles left/middle/ctrl-click\n // navigation, target, and rel natively. No manual window.open/location.href needed.\n useFormAction(() => (isLink.value ? null : formField.internals.form), props.type, isDisabled, el)(e);\n };\n\n const handleKeydown = (e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n (el.shadowRoot?.querySelector('[part=\"button\"]') as HTMLElement)?.click();\n }\n };\n\n // ARIA attributes live on the host.\n bind({\n attr: {\n 'aria-busy': props.loading,\n 'aria-disabled': isDisabled,\n 'aria-label': props.label,\n color: effectiveColor,\n effect: props.effect,\n role: computed(() => el.getAttribute('role') ?? (isLink.value ? 'link' : 'button')),\n size: effectiveSize,\n tabindex: computed(() => (isDisabled.value ? '-1' : '0')),\n variant: effectiveVariant,\n },\n on: {\n keydown: handleKeydown,\n },\n });\n\n const buttonContent = html`\n <span class=\"loader\" part=\"loader\" aria-label=\"Loading\" ?hidden=${() => !props.loading.value}></span>\n <slot name=\"prefix\"></slot>\n <span class=\"content\" part=\"content\"><slot></slot></span>\n <slot name=\"suffix\"></slot>\n `;\n\n // The inner element (<a> or <span>) is deliberately non-focusable/decorative — this\n // component's real interactive semantics (role, tabindex, aria-label) live on the\n // custom-element host itself (see the `bind()` block above), since ore-button is\n // formAssociated and needs the host, not an inner element, to carry ElementInternals.\n // This differs from ore-navbar-item / ore-sidebar-item, which aren't form-associated\n // and so render their <a> as the one real focusable/semantic element.\n return html`\n ${() =>\n isLink.value\n ? html`\n <a\n part=\"button\"\n role=\"presentation\"\n tabindex=\"-1\"\n href=\"${props.href}\"\n rel=\"${effectiveRel}\"\n target=\"${props.target}\"\n @click=\"${handleClick}\">\n ${buttonContent}\n </a>\n `\n : html`\n <span part=\"button\" role=\"presentation\" @click=\"${handleClick}\">${buttonContent}</span>\n `}\n `;\n },\n shadow: { delegatesFocus: false },\n styles: [\n colorThemeMixin,\n coarsePointerMixin,\n reducedMotionMixin,\n roundedVariantMixin,\n forcedColorsMixin,\n sizeVariantMixin({\n lg: {\n fontSize: 'var(--text-base)',\n gap: 'var(--size-2-5)',\n height: 'var(--size-12)',\n iconSize: 'var(--size-6)',\n lineHeight: 'var(--leading-relaxed)',\n padding: 'var(--size-2-5) var(--size-5)',\n },\n sm: {\n fontSize: 'var(--text-sm)',\n gap: 'var(--size-1-5)',\n height: 'var(--size-8)',\n iconSize: 'var(--size-4)',\n lineHeight: 'var(--leading-tight)',\n padding: 'var(--size-1-5) var(--size-3)',\n },\n }),\n frostVariantMixin('[part=\"button\"]'),\n rainbowEffectMixin('[part=\"button\"]'),\n shineEffectMixin('[part=\"button\"]'),\n disabledLoadingMixin,\n componentStyles,\n ],\n});\n"],"mappings":"0lBAwBA,IAAa,EAAkB,CAAC,QAAS,OAAQ,WAAY,UAAW,QAAS,OAAQ,OAAO,EA8FnF,EAAa,cAC1B,EAAA,EAAA,OAAA,CAAuB,EAAY,CACjC,eAAgB,GAChB,MAAO,CACL,GAAG,EAAA,YACH,OAAQ,EAAA,KAAK,OAAqB,EAClC,WAAY,EAAA,KAAK,KAAK,EAAK,EAC3B,UAAW,EAAA,KAAK,KAAK,EAAK,EAC1B,KAAM,EAAA,KAAK,OAAO,EAClB,SAAU,EAAA,KAAK,KAAK,EAAK,EACzB,MAAO,EAAA,KAAK,OAAO,EACnB,IAAK,EAAA,KAAK,OAAO,EACjB,OAAQ,EAAA,KAAK,OAAmB,EAChC,KAAM,EAAA,KAAK,MAAM,CAAC,SAAU,SAAU,OAAO,EAAY,QAAQ,EACjE,QAAS,EAAA,KAAK,MAAM,EAAiB,OAAO,CAC9C,EACA,MAAM,EAAO,CACX,IAAM,GAAA,EAAK,EAAA,QAAA,CAAQ,EAGb,GAAA,EAAW,EAAA,OAAA,CAAO,EAAA,gBAAgB,EAClC,GAAA,EAAiB,EAAA,SAAA,KAAe,GAAU,MAAM,OAAS,EAAM,MAAM,KAAK,EAC1E,GAAA,EAAgB,EAAA,SAAA,KAAe,GAAU,KAAK,OAAS,EAAM,KAAK,KAAK,EACvE,GAAA,EAAmB,EAAA,SAAA,KAAe,GAAU,QAAQ,OAAS,EAAM,QAAQ,KAAK,EAEhF,GAAA,EAAa,EAAA,SAAA,KAAe,CAAC,EAAE,EAAM,SAAS,OAAS,EAAM,QAAQ,MAAM,EAG3E,CAAE,eAAc,UAAW,EAAA,aAAa,EAAM,KAAM,EAAM,IAAK,EAAM,MAAM,EAK3E,GAAA,EAAY,EAAA,SAAA,CAAS,CACzB,SAAU,EACV,gBAAmB,KACnB,OAAA,EAAO,EAAA,SAAA,KAAe,EAAE,CAC1B,CAAC,EAEK,EAAe,GAAkB,CACrC,GAAI,EAAW,MAAO,CACpB,EAAE,eAAe,EAEjB,MACF,CAIA,EAAA,kBAAqB,EAAO,MAAQ,KAAO,EAAU,UAAU,KAAO,EAAM,KAAM,EAAY,CAAE,CAAC,CAAC,CAAC,CACrG,GAUA,EAAA,EAAA,KAAA,CAAK,CACH,KAAM,CACJ,YAAa,EAAM,QACnB,gBAAiB,EACjB,aAAc,EAAM,MACpB,MAAO,EACP,OAAQ,EAAM,OACd,MAAA,EAAM,EAAA,SAAA,KAAe,EAAG,aAAa,MAAM,IAAM,EAAO,MAAQ,OAAS,SAAS,EAClF,KAAM,EACN,UAAA,EAAU,EAAA,SAAA,KAAgB,EAAW,MAAQ,KAAO,GAAI,EACxD,QAAS,CACX,EACA,GAAI,CACF,QArBmB,GAAqB,EACtC,EAAE,MAAQ,SAAW,EAAE,MAAQ,OACjC,EAAE,eAAe,GAChB,EAAG,YAAY,cAAc,iBAAiB,EAAA,EAAmB,MAAM,EAE5E,CAiBE,CACF,CAAC,EAED,IAAM,EAAgB,EAAA,IAAI;4EACgD,CAAC,EAAM,QAAQ,MAAM;;;;MAY/F,MAAO,GAAA,IAAI;YAEP,EAAO,MACH,EAAA,IAAI;;;;;wBAKQ,EAAM,KAAK;uBACZ,EAAa;0BACV,EAAM,OAAO;0BACb,EAAY;kBACpB,EAAc;;cAGpB,EAAA,IAAI;gEACgD,EAAY,IAAI,EAAc;cAChF;KAEZ,EACA,OAAQ,CAAE,eAAgB,EAAM,EAChC,OAAQ,CACN,EAAA,gBACA,EAAA,mBACA,EAAA,mBACA,EAAA,oBACA,EAAA,kBACA,EAAA,iBAAiB,CACf,GAAI,CACF,SAAU,mBACV,IAAK,kBACL,OAAQ,iBACR,SAAU,gBACV,WAAY,yBACZ,QAAS,+BACX,EACA,GAAI,CACF,SAAU,iBACV,IAAK,kBACL,OAAQ,gBACR,SAAU,gBACV,WAAY,uBACZ,QAAS,+BACX,CACF,CAAC,EACD,EAAA,kBAAkB,iBAAiB,EACnC,EAAA,mBAAmB,iBAAiB,EACpC,EAAA,iBAAiB,iBAAiB,EAClC,EAAA,qBACA,EAAA,OACF,CACF,CAAC"}
1
+ {"version":3,"file":"button.cjs","names":[],"sources":["../src/inputs/button/button.ts"],"sourcesContent":["import { bind, define, getHost, html, inject, prop, useField } from '@vielzeug/ore';\nimport { computed } from '@vielzeug/ripple';\nimport { commonProps } from '../../shared';\nimport {\n coarsePointerMixin,\n colorThemeMixin,\n disabledLoadingMixin,\n forcedColorsMixin,\n frostVariantMixin,\n rainbowEffectMixin,\n reducedMotionMixin,\n roundedVariantMixin,\n shineEffectMixin,\n sizeVariantMixin,\n} from '../../styles';\nimport type { ButtonType, ComponentSize, LinkTarget, RoundedSize, ThemeColor } from '../../types';\nimport { useLinkProps } from '../../utils';\nimport { BUTTON_GROUP_CTX } from '../button-group/button-group';\nimport { useFormAction } from '../shared';\nimport componentStyles from './button.css?inline';\n\nexport const BUTTON_VARIANTS = ['solid', 'flat', 'bordered', 'outline', 'ghost', 'text', 'frost'] as const;\n\n/** Visual variant for ore-button — derived from BUTTON_VARIANTS for a single source of truth. */\nexport type ButtonVariant = (typeof BUTTON_VARIANTS)[number];\n\n/** Animated border effect for ore-button. */\nexport type ButtonEffect = 'shine' | 'rainbow';\n\n/** Button component properties */\nexport type OreButtonProps = {\n /** Theme color */\n color?: ThemeColor;\n /** Disable interaction */\n disabled?: boolean;\n /** Animated border effect: 'shine' (color-aware neon sweep) or 'rainbow' */\n effect?: ButtonEffect;\n /**\n * Full height button (100% of container) — the inner `[part=\"button\"]` fills its host's\n * height instead of the size preset's fixed height. Useful when the button itself is the\n * whole tappable surface of a container it doesn't otherwise control the size of (e.g. a\n * swipe-revealed row action in `ore-list-item`'s `actions-left`/`actions-right` slots).\n */\n fullheight?: boolean;\n /** Full width button (100% of container) */\n fullwidth?: boolean;\n /** When set, renders an `<a>` instead of `<button>` */\n href?: string;\n /** Icon-only mode (square aspect ratio, no padding) */\n iconOnly?: boolean;\n /** Accessible label for the inner button — required for icon-only buttons */\n label?: string;\n /** Show loading state with spinner */\n loading?: boolean;\n /** Link rel attribute (requires href) */\n rel?: string;\n /** Border radius size */\n rounded?: RoundedSize;\n /** Component size */\n size?: ComponentSize;\n /** Link target (requires href) */\n target?: LinkTarget;\n /** HTML button type attribute */\n type?: ButtonType;\n /** Visual style variant */\n variant?: ButtonVariant;\n};\n\n/**\n * A customizable button component with multiple variants, sizes, and states.\n * Supports icons, loading states, and animated border effects.\n *\n * @element ore-button\n *\n * @attr {string} type - HTML button type: 'button' | 'submit' | 'reset'\n * @attr {boolean} disabled - Disable button interaction\n * @attr {boolean} loading - Show loading state with spinner\n * @attr {string} color - Theme color: 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'\n * @attr {string} variant - Visual variant: 'solid' | 'flat' | 'bordered' | 'outline' | 'ghost' | 'text' | 'frost'\n * @attr {string} size - Button size: 'sm' | 'md' | 'lg'\n * @attr {string} rounded - Border radius: 'none' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | 'full'\n * @attr {string} effect - Animated border effect: 'shine' | 'rainbow'\n * @attr {boolean} icon-only - Icon-only mode (square aspect ratio, no padding)\n * @attr {boolean} fullwidth - Full width button (100% of container)\n * @attr {boolean} fullheight - Full height button (100% of container)\n *\n * @fires click - Emitted when button is clicked (unless disabled/loading)\n *\n * @slot - Button content (text, icons, etc.)\n * @slot prefix - Content before the button text (e.g., icons)\n * @slot suffix - Content after the button text (e.g., icons, badges)\n *\n * @part button - The inner button or anchor element\n * @part loader - The loading spinner element\n * @part content - The button content wrapper\n *\n * @cssprop --button-bg - Background color override\n * @cssprop --button-color - Text color override\n * @cssprop --button-border - Border width override\n * @cssprop --button-border-color - Border color override\n * @cssprop --button-radius - Border radius override\n * @cssprop --button-padding - Inner padding override\n * @cssprop --button-gap - Gap between icon and text override\n * @cssprop --button-font-size - Font size override\n * @cssprop --button-frost-active-bg - Background when pressed (frost variant)\n * @cssprop --button-frost-active-border-color - Border color when pressed (frost variant)\n *\n * @example\n * ```html\n * <ore-button variant=\"solid\" color=\"primary\">Click me</ore-button>\n * <ore-button loading color=\"success\">Processing...</ore-button>\n * <ore-button effect=\"shine\" color=\"primary\">Shine</ore-button>\n * <ore-button effect=\"rainbow\" variant=\"frost\">Rainbow</ore-button>\n * ```\n */\nexport const BUTTON_TAG = 'ore-button' as const;\ndefine<OreButtonProps>(BUTTON_TAG, {\n formAssociated: true,\n props: {\n ...commonProps,\n effect: prop.string<ButtonEffect>(),\n fullheight: prop.bool(false),\n fullwidth: prop.bool(false),\n href: prop.string(),\n iconOnly: prop.bool(false),\n label: prop.string(),\n rel: prop.string(),\n target: prop.string<LinkTarget>(),\n type: prop.oneOf(['button', 'submit', 'reset'] as const, 'button'),\n variant: prop.oneOf(BUTTON_VARIANTS, 'solid'),\n },\n setup(props) {\n const el = getHost();\n\n // Prefer group context over own props for color/size/variant.\n const groupCtx = inject(BUTTON_GROUP_CTX);\n const effectiveColor = computed(() => groupCtx?.color.value ?? props.color.value);\n const effectiveSize = computed(() => groupCtx?.size.value ?? props.size.value);\n const effectiveVariant = computed(() => groupCtx?.variant.value ?? props.variant.value);\n\n const isDisabled = computed(() => !!(props.disabled.value || props.loading.value));\n\n // isLink and effectiveRel are computed from signals — correct even if href changes at runtime.\n const { effectiveRel, isLink } = useLinkProps(props.href, props.rel, props.target);\n\n // Form association: relay submit/reset clicks to the associated form.\n // The inner <button> always has type=\"button\" so shadow DOM never drives native form actions.\n // getForm() returns null for link mode at runtime, so no form actions fire.\n const formField = useField({\n disabled: isDisabled,\n toFormValue: () => null,\n value: computed(() => ''),\n });\n\n const handleClick = (e: MouseEvent) => {\n if (isDisabled.value) {\n e.preventDefault();\n\n return;\n }\n\n // Link mode renders a real <a href> below — the browser handles left/middle/ctrl-click\n // navigation, target, and rel natively. No manual window.open/location.href needed.\n useFormAction(() => (isLink.value ? null : formField.internals.form), props.type, isDisabled, el)(e);\n };\n\n const handleKeydown = (e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n (el.shadowRoot?.querySelector('[part=\"button\"]') as HTMLElement)?.click();\n }\n };\n\n // ARIA attributes live on the host.\n bind({\n attr: {\n 'aria-busy': props.loading,\n 'aria-disabled': isDisabled,\n 'aria-label': props.label,\n color: effectiveColor,\n effect: props.effect,\n role: computed(() => el.getAttribute('role') ?? (isLink.value ? 'link' : 'button')),\n size: effectiveSize,\n tabindex: computed(() => (isDisabled.value ? '-1' : '0')),\n variant: effectiveVariant,\n },\n on: {\n keydown: handleKeydown,\n },\n });\n\n const buttonContent = html`\n <span class=\"loader\" part=\"loader\" aria-label=\"Loading\" ?hidden=${() => !props.loading.value}></span>\n <slot name=\"prefix\"></slot>\n <span class=\"content\" part=\"content\"><slot></slot></span>\n <slot name=\"suffix\"></slot>\n `;\n\n // The inner element (<a> or <span>) is deliberately non-focusable/decorative — this\n // component's real interactive semantics (role, tabindex, aria-label) live on the\n // custom-element host itself (see the `bind()` block above), since ore-button is\n // formAssociated and needs the host, not an inner element, to carry ElementInternals.\n // This differs from ore-navbar-item / ore-sidebar-item, which aren't form-associated\n // and so render their <a> as the one real focusable/semantic element.\n return html`\n ${() =>\n isLink.value\n ? html`\n <a\n part=\"button\"\n role=\"presentation\"\n tabindex=\"-1\"\n href=\"${props.href}\"\n rel=\"${effectiveRel}\"\n target=\"${props.target}\"\n @click=\"${handleClick}\">\n ${buttonContent}\n </a>\n `\n : html`\n <span part=\"button\" role=\"presentation\" @click=\"${handleClick}\">${buttonContent}</span>\n `}\n `;\n },\n shadow: { delegatesFocus: false },\n styles: [\n colorThemeMixin,\n coarsePointerMixin,\n reducedMotionMixin,\n roundedVariantMixin,\n forcedColorsMixin,\n sizeVariantMixin({\n lg: {\n fontSize: 'var(--text-base)',\n gap: 'var(--size-2-5)',\n height: 'var(--size-12)',\n iconSize: 'var(--size-6)',\n lineHeight: 'var(--leading-relaxed)',\n padding: 'var(--size-2-5) var(--size-5)',\n },\n sm: {\n fontSize: 'var(--text-sm)',\n gap: 'var(--size-1-5)',\n height: 'var(--size-8)',\n iconSize: 'var(--size-4)',\n lineHeight: 'var(--leading-tight)',\n padding: 'var(--size-1-5) var(--size-3)',\n },\n }),\n frostVariantMixin('[part=\"button\"]'),\n rainbowEffectMixin('[part=\"button\"]'),\n shineEffectMixin('[part=\"button\"]'),\n disabledLoadingMixin,\n componentStyles,\n ],\n});\n"],"mappings":"0lBAqBA,IAAa,EAAkB,CAAC,QAAS,OAAQ,WAAY,UAAW,QAAS,OAAQ,OAAO,EA8FnF,EAAa,cAC1B,EAAA,EAAA,OAAA,CAAuB,EAAY,CACjC,eAAgB,GAChB,MAAO,CACL,GAAG,EAAA,YACH,OAAQ,EAAA,KAAK,OAAqB,EAClC,WAAY,EAAA,KAAK,KAAK,EAAK,EAC3B,UAAW,EAAA,KAAK,KAAK,EAAK,EAC1B,KAAM,EAAA,KAAK,OAAO,EAClB,SAAU,EAAA,KAAK,KAAK,EAAK,EACzB,MAAO,EAAA,KAAK,OAAO,EACnB,IAAK,EAAA,KAAK,OAAO,EACjB,OAAQ,EAAA,KAAK,OAAmB,EAChC,KAAM,EAAA,KAAK,MAAM,CAAC,SAAU,SAAU,OAAO,EAAY,QAAQ,EACjE,QAAS,EAAA,KAAK,MAAM,EAAiB,OAAO,CAC9C,EACA,MAAM,EAAO,CACX,IAAM,GAAA,EAAK,EAAA,QAAA,CAAQ,EAGb,GAAA,EAAW,EAAA,OAAA,CAAO,EAAA,gBAAgB,EAClC,GAAA,EAAiB,EAAA,SAAA,KAAe,GAAU,MAAM,OAAS,EAAM,MAAM,KAAK,EAC1E,GAAA,EAAgB,EAAA,SAAA,KAAe,GAAU,KAAK,OAAS,EAAM,KAAK,KAAK,EACvE,GAAA,EAAmB,EAAA,SAAA,KAAe,GAAU,QAAQ,OAAS,EAAM,QAAQ,KAAK,EAEhF,GAAA,EAAa,EAAA,SAAA,KAAe,CAAC,EAAE,EAAM,SAAS,OAAS,EAAM,QAAQ,MAAM,EAG3E,CAAE,eAAc,UAAW,EAAA,aAAa,EAAM,KAAM,EAAM,IAAK,EAAM,MAAM,EAK3E,GAAA,EAAY,EAAA,SAAA,CAAS,CACzB,SAAU,EACV,gBAAmB,KACnB,OAAA,EAAO,EAAA,SAAA,KAAe,EAAE,CAC1B,CAAC,EAEK,EAAe,GAAkB,CACrC,GAAI,EAAW,MAAO,CACpB,EAAE,eAAe,EAEjB,MACF,CAIA,EAAA,kBAAqB,EAAO,MAAQ,KAAO,EAAU,UAAU,KAAO,EAAM,KAAM,EAAY,CAAE,CAAC,CAAC,CAAC,CACrG,GAUA,EAAA,EAAA,KAAA,CAAK,CACH,KAAM,CACJ,YAAa,EAAM,QACnB,gBAAiB,EACjB,aAAc,EAAM,MACpB,MAAO,EACP,OAAQ,EAAM,OACd,MAAA,EAAM,EAAA,SAAA,KAAe,EAAG,aAAa,MAAM,IAAM,EAAO,MAAQ,OAAS,SAAS,EAClF,KAAM,EACN,UAAA,EAAU,EAAA,SAAA,KAAgB,EAAW,MAAQ,KAAO,GAAI,EACxD,QAAS,CACX,EACA,GAAI,CACF,QArBmB,GAAqB,EACtC,EAAE,MAAQ,SAAW,EAAE,MAAQ,OACjC,EAAE,eAAe,GAChB,EAAG,YAAY,cAAc,iBAAiB,EAAA,EAAmB,MAAM,EAE5E,CAiBE,CACF,CAAC,EAED,IAAM,EAAgB,EAAA,IAAI;4EACgD,CAAC,EAAM,QAAQ,MAAM;;;;MAY/F,MAAO,GAAA,IAAI;YAEP,EAAO,MACH,EAAA,IAAI;;;;;wBAKQ,EAAM,KAAK;uBACZ,EAAa;0BACV,EAAM,OAAO;0BACb,EAAY;kBACpB,EAAc;;cAGpB,EAAA,IAAI;gEACgD,EAAY,IAAI,EAAc;cAChF;KAEZ,EACA,OAAQ,CAAE,eAAgB,EAAM,EAChC,OAAQ,CACN,EAAA,gBACA,EAAA,mBACA,EAAA,mBACA,EAAA,oBACA,EAAA,kBACA,EAAA,iBAAiB,CACf,GAAI,CACF,SAAU,mBACV,IAAK,kBACL,OAAQ,iBACR,SAAU,gBACV,WAAY,yBACZ,QAAS,+BACX,EACA,GAAI,CACF,SAAU,iBACV,IAAK,kBACL,OAAQ,gBACR,SAAU,gBACV,WAAY,uBACZ,QAAS,+BACX,CACF,CAAC,EACD,EAAA,kBAAkB,iBAAiB,EACnC,EAAA,mBAAmB,iBAAiB,EACpC,EAAA,iBAAiB,iBAAiB,EAClC,EAAA,qBACA,EAAA,OACF,CACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"button.js","names":[],"sources":["../src/inputs/button/button.ts"],"sourcesContent":["import { define, html, inject, prop, bind, getHost } from '@vielzeug/ore';\nimport { useField } from '@vielzeug/ore';\nimport { computed } from '@vielzeug/ripple';\n\nimport type { ButtonType, ComponentSize, LinkTarget, RoundedSize, ThemeColor } from '../../types';\n\nimport { commonProps } from '../../shared';\nimport {\n coarsePointerMixin,\n colorThemeMixin,\n disabledLoadingMixin,\n forcedColorsMixin,\n frostVariantMixin,\n rainbowEffectMixin,\n reducedMotionMixin,\n roundedVariantMixin,\n shineEffectMixin,\n sizeVariantMixin,\n} from '../../styles';\nimport { useLinkProps } from '../../utils';\nimport { BUTTON_GROUP_CTX } from '../button-group/button-group';\nimport { useFormAction } from '../shared';\nimport componentStyles from './button.css?inline';\n\nexport const BUTTON_VARIANTS = ['solid', 'flat', 'bordered', 'outline', 'ghost', 'text', 'frost'] as const;\n\n/** Visual variant for ore-button — derived from BUTTON_VARIANTS for a single source of truth. */\nexport type ButtonVariant = (typeof BUTTON_VARIANTS)[number];\n\n/** Animated border effect for ore-button. */\nexport type ButtonEffect = 'shine' | 'rainbow';\n\n/** Button component properties */\nexport type OreButtonProps = {\n /** Theme color */\n color?: ThemeColor;\n /** Disable interaction */\n disabled?: boolean;\n /** Animated border effect: 'shine' (color-aware neon sweep) or 'rainbow' */\n effect?: ButtonEffect;\n /**\n * Full height button (100% of container) — the inner `[part=\"button\"]` fills its host's\n * height instead of the size preset's fixed height. Useful when the button itself is the\n * whole tappable surface of a container it doesn't otherwise control the size of (e.g. a\n * swipe-revealed row action in `ore-list-item`'s `actions-left`/`actions-right` slots).\n */\n fullheight?: boolean;\n /** Full width button (100% of container) */\n fullwidth?: boolean;\n /** When set, renders an `<a>` instead of `<button>` */\n href?: string;\n /** Icon-only mode (square aspect ratio, no padding) */\n iconOnly?: boolean;\n /** Accessible label for the inner button — required for icon-only buttons */\n label?: string;\n /** Show loading state with spinner */\n loading?: boolean;\n /** Link rel attribute (requires href) */\n rel?: string;\n /** Border radius size */\n rounded?: RoundedSize;\n /** Component size */\n size?: ComponentSize;\n /** Link target (requires href) */\n target?: LinkTarget;\n /** HTML button type attribute */\n type?: ButtonType;\n /** Visual style variant */\n variant?: ButtonVariant;\n};\n\n/**\n * A customizable button component with multiple variants, sizes, and states.\n * Supports icons, loading states, and animated border effects.\n *\n * @element ore-button\n *\n * @attr {string} type - HTML button type: 'button' | 'submit' | 'reset'\n * @attr {boolean} disabled - Disable button interaction\n * @attr {boolean} loading - Show loading state with spinner\n * @attr {string} color - Theme color: 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'\n * @attr {string} variant - Visual variant: 'solid' | 'flat' | 'bordered' | 'outline' | 'ghost' | 'text' | 'frost'\n * @attr {string} size - Button size: 'sm' | 'md' | 'lg'\n * @attr {string} rounded - Border radius: 'none' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | 'full'\n * @attr {string} effect - Animated border effect: 'shine' | 'rainbow'\n * @attr {boolean} icon-only - Icon-only mode (square aspect ratio, no padding)\n * @attr {boolean} fullwidth - Full width button (100% of container)\n * @attr {boolean} fullheight - Full height button (100% of container)\n *\n * @fires click - Emitted when button is clicked (unless disabled/loading)\n *\n * @slot - Button content (text, icons, etc.)\n * @slot prefix - Content before the button text (e.g., icons)\n * @slot suffix - Content after the button text (e.g., icons, badges)\n *\n * @part button - The inner button or anchor element\n * @part loader - The loading spinner element\n * @part content - The button content wrapper\n *\n * @cssprop --button-bg - Background color override\n * @cssprop --button-color - Text color override\n * @cssprop --button-border - Border width override\n * @cssprop --button-border-color - Border color override\n * @cssprop --button-radius - Border radius override\n * @cssprop --button-padding - Inner padding override\n * @cssprop --button-gap - Gap between icon and text override\n * @cssprop --button-font-size - Font size override\n * @cssprop --button-frost-active-bg - Background when pressed (frost variant)\n * @cssprop --button-frost-active-border-color - Border color when pressed (frost variant)\n *\n * @example\n * ```html\n * <ore-button variant=\"solid\" color=\"primary\">Click me</ore-button>\n * <ore-button loading color=\"success\">Processing...</ore-button>\n * <ore-button effect=\"shine\" color=\"primary\">Shine</ore-button>\n * <ore-button effect=\"rainbow\" variant=\"frost\">Rainbow</ore-button>\n * ```\n */\nexport const BUTTON_TAG = 'ore-button' as const;\ndefine<OreButtonProps>(BUTTON_TAG, {\n formAssociated: true,\n props: {\n ...commonProps,\n effect: prop.string<ButtonEffect>(),\n fullheight: prop.bool(false),\n fullwidth: prop.bool(false),\n href: prop.string(),\n iconOnly: prop.bool(false),\n label: prop.string(),\n rel: prop.string(),\n target: prop.string<LinkTarget>(),\n type: prop.oneOf(['button', 'submit', 'reset'] as const, 'button'),\n variant: prop.oneOf(BUTTON_VARIANTS, 'solid'),\n },\n setup(props) {\n const el = getHost();\n\n // Prefer group context over own props for color/size/variant.\n const groupCtx = inject(BUTTON_GROUP_CTX);\n const effectiveColor = computed(() => groupCtx?.color.value ?? props.color.value);\n const effectiveSize = computed(() => groupCtx?.size.value ?? props.size.value);\n const effectiveVariant = computed(() => groupCtx?.variant.value ?? props.variant.value);\n\n const isDisabled = computed(() => !!(props.disabled.value || props.loading.value));\n\n // isLink and effectiveRel are computed from signals — correct even if href changes at runtime.\n const { effectiveRel, isLink } = useLinkProps(props.href, props.rel, props.target);\n\n // Form association: relay submit/reset clicks to the associated form.\n // The inner <button> always has type=\"button\" so shadow DOM never drives native form actions.\n // getForm() returns null for link mode at runtime, so no form actions fire.\n const formField = useField({\n disabled: isDisabled,\n toFormValue: () => null,\n value: computed(() => ''),\n });\n\n const handleClick = (e: MouseEvent) => {\n if (isDisabled.value) {\n e.preventDefault();\n\n return;\n }\n\n // Link mode renders a real <a href> below — the browser handles left/middle/ctrl-click\n // navigation, target, and rel natively. No manual window.open/location.href needed.\n useFormAction(() => (isLink.value ? null : formField.internals.form), props.type, isDisabled, el)(e);\n };\n\n const handleKeydown = (e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n (el.shadowRoot?.querySelector('[part=\"button\"]') as HTMLElement)?.click();\n }\n };\n\n // ARIA attributes live on the host.\n bind({\n attr: {\n 'aria-busy': props.loading,\n 'aria-disabled': isDisabled,\n 'aria-label': props.label,\n color: effectiveColor,\n effect: props.effect,\n role: computed(() => el.getAttribute('role') ?? (isLink.value ? 'link' : 'button')),\n size: effectiveSize,\n tabindex: computed(() => (isDisabled.value ? '-1' : '0')),\n variant: effectiveVariant,\n },\n on: {\n keydown: handleKeydown,\n },\n });\n\n const buttonContent = html`\n <span class=\"loader\" part=\"loader\" aria-label=\"Loading\" ?hidden=${() => !props.loading.value}></span>\n <slot name=\"prefix\"></slot>\n <span class=\"content\" part=\"content\"><slot></slot></span>\n <slot name=\"suffix\"></slot>\n `;\n\n // The inner element (<a> or <span>) is deliberately non-focusable/decorative — this\n // component's real interactive semantics (role, tabindex, aria-label) live on the\n // custom-element host itself (see the `bind()` block above), since ore-button is\n // formAssociated and needs the host, not an inner element, to carry ElementInternals.\n // This differs from ore-navbar-item / ore-sidebar-item, which aren't form-associated\n // and so render their <a> as the one real focusable/semantic element.\n return html`\n ${() =>\n isLink.value\n ? html`\n <a\n part=\"button\"\n role=\"presentation\"\n tabindex=\"-1\"\n href=\"${props.href}\"\n rel=\"${effectiveRel}\"\n target=\"${props.target}\"\n @click=\"${handleClick}\">\n ${buttonContent}\n </a>\n `\n : html`\n <span part=\"button\" role=\"presentation\" @click=\"${handleClick}\">${buttonContent}</span>\n `}\n `;\n },\n shadow: { delegatesFocus: false },\n styles: [\n colorThemeMixin,\n coarsePointerMixin,\n reducedMotionMixin,\n roundedVariantMixin,\n forcedColorsMixin,\n sizeVariantMixin({\n lg: {\n fontSize: 'var(--text-base)',\n gap: 'var(--size-2-5)',\n height: 'var(--size-12)',\n iconSize: 'var(--size-6)',\n lineHeight: 'var(--leading-relaxed)',\n padding: 'var(--size-2-5) var(--size-5)',\n },\n sm: {\n fontSize: 'var(--text-sm)',\n gap: 'var(--size-1-5)',\n height: 'var(--size-8)',\n iconSize: 'var(--size-4)',\n lineHeight: 'var(--leading-tight)',\n padding: 'var(--size-1-5) var(--size-3)',\n },\n }),\n frostVariantMixin('[part=\"button\"]'),\n rainbowEffectMixin('[part=\"button\"]'),\n shineEffectMixin('[part=\"button\"]'),\n disabledLoadingMixin,\n componentStyles,\n ],\n});\n"],"mappings":";;;;;;;;;;;;;;AAwBA,IAAa,IAAkB;CAAC;CAAS;CAAQ;CAAY;CAAW;CAAS;CAAQ;AAAO,GA8FnF,IAAa;AAC1B,EAAuB,GAAY;CACjC,gBAAgB;CAChB,OAAO;EACL,GAAG;EACH,QAAQ,EAAK,OAAqB;EAClC,YAAY,EAAK,KAAK,EAAK;EAC3B,WAAW,EAAK,KAAK,EAAK;EAC1B,MAAM,EAAK,OAAO;EAClB,UAAU,EAAK,KAAK,EAAK;EACzB,OAAO,EAAK,OAAO;EACnB,KAAK,EAAK,OAAO;EACjB,QAAQ,EAAK,OAAmB;EAChC,MAAM,EAAK,MAAM;GAAC;GAAU;GAAU;EAAO,GAAY,QAAQ;EACjE,SAAS,EAAK,MAAM,GAAiB,OAAO;CAC9C;CACA,MAAM,GAAO;EACX,IAAM,IAAK,EAAQ,GAGb,IAAW,EAAO,CAAgB,GAClC,IAAiB,QAAe,GAAU,MAAM,SAAS,EAAM,MAAM,KAAK,GAC1E,IAAgB,QAAe,GAAU,KAAK,SAAS,EAAM,KAAK,KAAK,GACvE,IAAmB,QAAe,GAAU,QAAQ,SAAS,EAAM,QAAQ,KAAK,GAEhF,IAAa,QAAe,CAAC,EAAE,EAAM,SAAS,SAAS,EAAM,QAAQ,MAAM,GAG3E,EAAE,iBAAc,cAAW,EAAa,EAAM,MAAM,EAAM,KAAK,EAAM,MAAM,GAK3E,IAAY,EAAS;GACzB,UAAU;GACV,mBAAmB;GACnB,OAAO,QAAe,EAAE;EAC1B,CAAC,GAEK,KAAe,MAAkB;GACrC,IAAI,EAAW,OAAO;IACpB,EAAE,eAAe;IAEjB;GACF;GAIA,QAAqB,EAAO,QAAQ,OAAO,EAAU,UAAU,MAAO,EAAM,MAAM,GAAY,CAAE,CAAC,CAAC,CAAC;EACrG;EAUA,EAAK;GACH,MAAM;IACJ,aAAa,EAAM;IACnB,iBAAiB;IACjB,cAAc,EAAM;IACpB,OAAO;IACP,QAAQ,EAAM;IACd,MAAM,QAAe,EAAG,aAAa,MAAM,MAAM,EAAO,QAAQ,SAAS,SAAS;IAClF,MAAM;IACN,UAAU,QAAgB,EAAW,QAAQ,OAAO,GAAI;IACxD,SAAS;GACX;GACA,IAAI,EACF,UArBmB,MAAqB;IAC1C,CAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,SACjC,EAAE,eAAe,IAChB,EAAG,YAAY,cAAc,mBAAiB,EAAA,EAAmB,MAAM;GAE5E,EAiBE;EACF,CAAC;EAED,IAAM,IAAgB,CAAI;8EACgD,CAAC,EAAM,QAAQ,MAAM;;;;;EAY/F,OAAO,CAAI;cAEP,EAAO,QACH,CAAI;;;;;wBAKQ,EAAM,KAAK;uBACZ,EAAa;0BACV,EAAM,OAAO;0BACb,EAAY;kBACpB,EAAc;;gBAGpB,CAAI;gEACgD,EAAY,IAAI,EAAc;cAChF;;CAEZ;CACA,QAAQ,EAAE,gBAAgB,GAAM;CAChC,QAAQ;EACN;EACA;EACA;EACA;EACA;EACA,EAAiB;GACf,IAAI;IACF,UAAU;IACV,KAAK;IACL,QAAQ;IACR,UAAU;IACV,YAAY;IACZ,SAAS;GACX;GACA,IAAI;IACF,UAAU;IACV,KAAK;IACL,QAAQ;IACR,UAAU;IACV,YAAY;IACZ,SAAS;GACX;EACF,CAAC;EACD,EAAkB,mBAAiB;EACnC,EAAmB,mBAAiB;EACpC,EAAiB,mBAAiB;EAClC;EACA;CACF;AACF,CAAC"}
1
+ {"version":3,"file":"button.js","names":[],"sources":["../src/inputs/button/button.ts"],"sourcesContent":["import { bind, define, getHost, html, inject, prop, useField } from '@vielzeug/ore';\nimport { computed } from '@vielzeug/ripple';\nimport { commonProps } from '../../shared';\nimport {\n coarsePointerMixin,\n colorThemeMixin,\n disabledLoadingMixin,\n forcedColorsMixin,\n frostVariantMixin,\n rainbowEffectMixin,\n reducedMotionMixin,\n roundedVariantMixin,\n shineEffectMixin,\n sizeVariantMixin,\n} from '../../styles';\nimport type { ButtonType, ComponentSize, LinkTarget, RoundedSize, ThemeColor } from '../../types';\nimport { useLinkProps } from '../../utils';\nimport { BUTTON_GROUP_CTX } from '../button-group/button-group';\nimport { useFormAction } from '../shared';\nimport componentStyles from './button.css?inline';\n\nexport const BUTTON_VARIANTS = ['solid', 'flat', 'bordered', 'outline', 'ghost', 'text', 'frost'] as const;\n\n/** Visual variant for ore-button — derived from BUTTON_VARIANTS for a single source of truth. */\nexport type ButtonVariant = (typeof BUTTON_VARIANTS)[number];\n\n/** Animated border effect for ore-button. */\nexport type ButtonEffect = 'shine' | 'rainbow';\n\n/** Button component properties */\nexport type OreButtonProps = {\n /** Theme color */\n color?: ThemeColor;\n /** Disable interaction */\n disabled?: boolean;\n /** Animated border effect: 'shine' (color-aware neon sweep) or 'rainbow' */\n effect?: ButtonEffect;\n /**\n * Full height button (100% of container) — the inner `[part=\"button\"]` fills its host's\n * height instead of the size preset's fixed height. Useful when the button itself is the\n * whole tappable surface of a container it doesn't otherwise control the size of (e.g. a\n * swipe-revealed row action in `ore-list-item`'s `actions-left`/`actions-right` slots).\n */\n fullheight?: boolean;\n /** Full width button (100% of container) */\n fullwidth?: boolean;\n /** When set, renders an `<a>` instead of `<button>` */\n href?: string;\n /** Icon-only mode (square aspect ratio, no padding) */\n iconOnly?: boolean;\n /** Accessible label for the inner button — required for icon-only buttons */\n label?: string;\n /** Show loading state with spinner */\n loading?: boolean;\n /** Link rel attribute (requires href) */\n rel?: string;\n /** Border radius size */\n rounded?: RoundedSize;\n /** Component size */\n size?: ComponentSize;\n /** Link target (requires href) */\n target?: LinkTarget;\n /** HTML button type attribute */\n type?: ButtonType;\n /** Visual style variant */\n variant?: ButtonVariant;\n};\n\n/**\n * A customizable button component with multiple variants, sizes, and states.\n * Supports icons, loading states, and animated border effects.\n *\n * @element ore-button\n *\n * @attr {string} type - HTML button type: 'button' | 'submit' | 'reset'\n * @attr {boolean} disabled - Disable button interaction\n * @attr {boolean} loading - Show loading state with spinner\n * @attr {string} color - Theme color: 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'\n * @attr {string} variant - Visual variant: 'solid' | 'flat' | 'bordered' | 'outline' | 'ghost' | 'text' | 'frost'\n * @attr {string} size - Button size: 'sm' | 'md' | 'lg'\n * @attr {string} rounded - Border radius: 'none' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | 'full'\n * @attr {string} effect - Animated border effect: 'shine' | 'rainbow'\n * @attr {boolean} icon-only - Icon-only mode (square aspect ratio, no padding)\n * @attr {boolean} fullwidth - Full width button (100% of container)\n * @attr {boolean} fullheight - Full height button (100% of container)\n *\n * @fires click - Emitted when button is clicked (unless disabled/loading)\n *\n * @slot - Button content (text, icons, etc.)\n * @slot prefix - Content before the button text (e.g., icons)\n * @slot suffix - Content after the button text (e.g., icons, badges)\n *\n * @part button - The inner button or anchor element\n * @part loader - The loading spinner element\n * @part content - The button content wrapper\n *\n * @cssprop --button-bg - Background color override\n * @cssprop --button-color - Text color override\n * @cssprop --button-border - Border width override\n * @cssprop --button-border-color - Border color override\n * @cssprop --button-radius - Border radius override\n * @cssprop --button-padding - Inner padding override\n * @cssprop --button-gap - Gap between icon and text override\n * @cssprop --button-font-size - Font size override\n * @cssprop --button-frost-active-bg - Background when pressed (frost variant)\n * @cssprop --button-frost-active-border-color - Border color when pressed (frost variant)\n *\n * @example\n * ```html\n * <ore-button variant=\"solid\" color=\"primary\">Click me</ore-button>\n * <ore-button loading color=\"success\">Processing...</ore-button>\n * <ore-button effect=\"shine\" color=\"primary\">Shine</ore-button>\n * <ore-button effect=\"rainbow\" variant=\"frost\">Rainbow</ore-button>\n * ```\n */\nexport const BUTTON_TAG = 'ore-button' as const;\ndefine<OreButtonProps>(BUTTON_TAG, {\n formAssociated: true,\n props: {\n ...commonProps,\n effect: prop.string<ButtonEffect>(),\n fullheight: prop.bool(false),\n fullwidth: prop.bool(false),\n href: prop.string(),\n iconOnly: prop.bool(false),\n label: prop.string(),\n rel: prop.string(),\n target: prop.string<LinkTarget>(),\n type: prop.oneOf(['button', 'submit', 'reset'] as const, 'button'),\n variant: prop.oneOf(BUTTON_VARIANTS, 'solid'),\n },\n setup(props) {\n const el = getHost();\n\n // Prefer group context over own props for color/size/variant.\n const groupCtx = inject(BUTTON_GROUP_CTX);\n const effectiveColor = computed(() => groupCtx?.color.value ?? props.color.value);\n const effectiveSize = computed(() => groupCtx?.size.value ?? props.size.value);\n const effectiveVariant = computed(() => groupCtx?.variant.value ?? props.variant.value);\n\n const isDisabled = computed(() => !!(props.disabled.value || props.loading.value));\n\n // isLink and effectiveRel are computed from signals — correct even if href changes at runtime.\n const { effectiveRel, isLink } = useLinkProps(props.href, props.rel, props.target);\n\n // Form association: relay submit/reset clicks to the associated form.\n // The inner <button> always has type=\"button\" so shadow DOM never drives native form actions.\n // getForm() returns null for link mode at runtime, so no form actions fire.\n const formField = useField({\n disabled: isDisabled,\n toFormValue: () => null,\n value: computed(() => ''),\n });\n\n const handleClick = (e: MouseEvent) => {\n if (isDisabled.value) {\n e.preventDefault();\n\n return;\n }\n\n // Link mode renders a real <a href> below — the browser handles left/middle/ctrl-click\n // navigation, target, and rel natively. No manual window.open/location.href needed.\n useFormAction(() => (isLink.value ? null : formField.internals.form), props.type, isDisabled, el)(e);\n };\n\n const handleKeydown = (e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n (el.shadowRoot?.querySelector('[part=\"button\"]') as HTMLElement)?.click();\n }\n };\n\n // ARIA attributes live on the host.\n bind({\n attr: {\n 'aria-busy': props.loading,\n 'aria-disabled': isDisabled,\n 'aria-label': props.label,\n color: effectiveColor,\n effect: props.effect,\n role: computed(() => el.getAttribute('role') ?? (isLink.value ? 'link' : 'button')),\n size: effectiveSize,\n tabindex: computed(() => (isDisabled.value ? '-1' : '0')),\n variant: effectiveVariant,\n },\n on: {\n keydown: handleKeydown,\n },\n });\n\n const buttonContent = html`\n <span class=\"loader\" part=\"loader\" aria-label=\"Loading\" ?hidden=${() => !props.loading.value}></span>\n <slot name=\"prefix\"></slot>\n <span class=\"content\" part=\"content\"><slot></slot></span>\n <slot name=\"suffix\"></slot>\n `;\n\n // The inner element (<a> or <span>) is deliberately non-focusable/decorative — this\n // component's real interactive semantics (role, tabindex, aria-label) live on the\n // custom-element host itself (see the `bind()` block above), since ore-button is\n // formAssociated and needs the host, not an inner element, to carry ElementInternals.\n // This differs from ore-navbar-item / ore-sidebar-item, which aren't form-associated\n // and so render their <a> as the one real focusable/semantic element.\n return html`\n ${() =>\n isLink.value\n ? html`\n <a\n part=\"button\"\n role=\"presentation\"\n tabindex=\"-1\"\n href=\"${props.href}\"\n rel=\"${effectiveRel}\"\n target=\"${props.target}\"\n @click=\"${handleClick}\">\n ${buttonContent}\n </a>\n `\n : html`\n <span part=\"button\" role=\"presentation\" @click=\"${handleClick}\">${buttonContent}</span>\n `}\n `;\n },\n shadow: { delegatesFocus: false },\n styles: [\n colorThemeMixin,\n coarsePointerMixin,\n reducedMotionMixin,\n roundedVariantMixin,\n forcedColorsMixin,\n sizeVariantMixin({\n lg: {\n fontSize: 'var(--text-base)',\n gap: 'var(--size-2-5)',\n height: 'var(--size-12)',\n iconSize: 'var(--size-6)',\n lineHeight: 'var(--leading-relaxed)',\n padding: 'var(--size-2-5) var(--size-5)',\n },\n sm: {\n fontSize: 'var(--text-sm)',\n gap: 'var(--size-1-5)',\n height: 'var(--size-8)',\n iconSize: 'var(--size-4)',\n lineHeight: 'var(--leading-tight)',\n padding: 'var(--size-1-5) var(--size-3)',\n },\n }),\n frostVariantMixin('[part=\"button\"]'),\n rainbowEffectMixin('[part=\"button\"]'),\n shineEffectMixin('[part=\"button\"]'),\n disabledLoadingMixin,\n componentStyles,\n ],\n});\n"],"mappings":";;;;;;;;;;;;;;AAqBA,IAAa,IAAkB;CAAC;CAAS;CAAQ;CAAY;CAAW;CAAS;CAAQ;AAAO,GA8FnF,IAAa;AAC1B,EAAuB,GAAY;CACjC,gBAAgB;CAChB,OAAO;EACL,GAAG;EACH,QAAQ,EAAK,OAAqB;EAClC,YAAY,EAAK,KAAK,EAAK;EAC3B,WAAW,EAAK,KAAK,EAAK;EAC1B,MAAM,EAAK,OAAO;EAClB,UAAU,EAAK,KAAK,EAAK;EACzB,OAAO,EAAK,OAAO;EACnB,KAAK,EAAK,OAAO;EACjB,QAAQ,EAAK,OAAmB;EAChC,MAAM,EAAK,MAAM;GAAC;GAAU;GAAU;EAAO,GAAY,QAAQ;EACjE,SAAS,EAAK,MAAM,GAAiB,OAAO;CAC9C;CACA,MAAM,GAAO;EACX,IAAM,IAAK,EAAQ,GAGb,IAAW,EAAO,CAAgB,GAClC,IAAiB,QAAe,GAAU,MAAM,SAAS,EAAM,MAAM,KAAK,GAC1E,IAAgB,QAAe,GAAU,KAAK,SAAS,EAAM,KAAK,KAAK,GACvE,IAAmB,QAAe,GAAU,QAAQ,SAAS,EAAM,QAAQ,KAAK,GAEhF,IAAa,QAAe,CAAC,EAAE,EAAM,SAAS,SAAS,EAAM,QAAQ,MAAM,GAG3E,EAAE,iBAAc,cAAW,EAAa,EAAM,MAAM,EAAM,KAAK,EAAM,MAAM,GAK3E,IAAY,EAAS;GACzB,UAAU;GACV,mBAAmB;GACnB,OAAO,QAAe,EAAE;EAC1B,CAAC,GAEK,KAAe,MAAkB;GACrC,IAAI,EAAW,OAAO;IACpB,EAAE,eAAe;IAEjB;GACF;GAIA,QAAqB,EAAO,QAAQ,OAAO,EAAU,UAAU,MAAO,EAAM,MAAM,GAAY,CAAE,CAAC,CAAC,CAAC;EACrG;EAUA,EAAK;GACH,MAAM;IACJ,aAAa,EAAM;IACnB,iBAAiB;IACjB,cAAc,EAAM;IACpB,OAAO;IACP,QAAQ,EAAM;IACd,MAAM,QAAe,EAAG,aAAa,MAAM,MAAM,EAAO,QAAQ,SAAS,SAAS;IAClF,MAAM;IACN,UAAU,QAAgB,EAAW,QAAQ,OAAO,GAAI;IACxD,SAAS;GACX;GACA,IAAI,EACF,UArBmB,MAAqB;IAC1C,CAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,SACjC,EAAE,eAAe,IAChB,EAAG,YAAY,cAAc,mBAAiB,EAAA,EAAmB,MAAM;GAE5E,EAiBE;EACF,CAAC;EAED,IAAM,IAAgB,CAAI;8EACgD,CAAC,EAAM,QAAQ,MAAM;;;;;EAY/F,OAAO,CAAI;cAEP,EAAO,QACH,CAAI;;;;;wBAKQ,EAAM,KAAK;uBACZ,EAAa;0BACV,EAAM,OAAO;0BACb,EAAY;kBACpB,EAAc;;gBAGpB,CAAI;gEACgD,EAAY,IAAI,EAAc;cAChF;;CAEZ;CACA,QAAQ,EAAE,gBAAgB,GAAM;CAChC,QAAQ;EACN;EACA;EACA;EACA;EACA;EACA,EAAiB;GACf,IAAI;IACF,UAAU;IACV,KAAK;IACL,QAAQ;IACR,UAAU;IACV,YAAY;IACZ,SAAS;GACX;GACA,IAAI;IACF,UAAU;IACV,KAAK;IACL,QAAQ;IACR,UAAU;IACV,YAAY;IACZ,SAAS;GACX;EACF,CAAC;EACD,EAAkB,mBAAiB;EACnC,EAAmB,mBAAiB;EACpC,EAAiB,mBAAiB;EAClC;EACA;CACF;AACF,CAAC"}