@vielzeug/refine 26.10.0 → 26.10.1

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 (463) hide show
  1. package/README.md +1 -1
  2. package/dist/accordion-item.cjs.map +1 -1
  3. package/dist/accordion-item.js.map +1 -1
  4. package/dist/accordion.cjs.map +1 -1
  5. package/dist/accordion.js.map +1 -1
  6. package/dist/async.cjs.map +1 -1
  7. package/dist/async.js.map +1 -1
  8. package/dist/badge.cjs.map +1 -1
  9. package/dist/badge.js.map +1 -1
  10. package/dist/box.cjs.map +1 -1
  11. package/dist/box.js.map +1 -1
  12. package/dist/button.cjs +3 -3
  13. package/dist/button.cjs.map +1 -1
  14. package/dist/button.js +3 -3
  15. package/dist/button.js.map +1 -1
  16. package/dist/calendar.cjs.map +1 -1
  17. package/dist/calendar.js.map +1 -1
  18. package/dist/carousel.cjs.map +1 -1
  19. package/dist/carousel.js.map +1 -1
  20. package/dist/chat-message.cjs.map +1 -1
  21. package/dist/chat-message.js.map +1 -1
  22. package/dist/chat-panel.cjs.map +1 -1
  23. package/dist/chat-panel.js.map +1 -1
  24. package/dist/checkbox-group.cjs.map +1 -1
  25. package/dist/checkbox-group.js.map +1 -1
  26. package/dist/chip.cjs.map +1 -1
  27. package/dist/chip.js.map +1 -1
  28. package/dist/code-window.cjs.map +1 -1
  29. package/dist/code-window.js.map +1 -1
  30. package/dist/combobox.cjs.map +1 -1
  31. package/dist/combobox.js.map +1 -1
  32. package/dist/command-palette.cjs.map +1 -1
  33. package/dist/command-palette.js.map +1 -1
  34. package/dist/content/card/card.css.cjs.map +1 -1
  35. package/dist/content/card/card.css.js.map +1 -1
  36. package/dist/content/carousel/carousel-slide.css.cjs.map +1 -1
  37. package/dist/content/carousel/carousel-slide.css.js.map +1 -1
  38. package/dist/content/carousel/carousel.css.cjs.map +1 -1
  39. package/dist/content/carousel/carousel.css.js.map +1 -1
  40. package/dist/content/carousel/carousel.d.ts +5 -5
  41. package/dist/content/chat-message/chat-message.css.cjs +1 -1
  42. package/dist/content/chat-message/chat-message.css.cjs.map +1 -1
  43. package/dist/content/chat-message/chat-message.css.js +1 -1
  44. package/dist/content/chat-message/chat-message.css.js.map +1 -1
  45. package/dist/content/chat-message/chat-message.d.ts +4 -4
  46. package/dist/content/chat-message/chat-message.d.ts.map +1 -1
  47. package/dist/content/chat-panel/chat-panel.d.ts +1 -1
  48. package/dist/content/code-window/code-window.css.cjs.map +1 -1
  49. package/dist/content/code-window/code-window.css.js.map +1 -1
  50. package/dist/content/code-window/code-window.d.ts +4 -4
  51. package/dist/content/index.d.ts +4 -0
  52. package/dist/content/index.d.ts.map +1 -1
  53. package/dist/content/list/_list-item-reveal.cjs.map +1 -1
  54. package/dist/content/list/_list-item-reveal.d.ts +4 -4
  55. package/dist/content/list/_list-item-reveal.d.ts.map +1 -1
  56. package/dist/content/list/_list-item-reveal.js.map +1 -1
  57. package/dist/content/list/list-item.css.cjs.map +1 -1
  58. package/dist/content/list/list-item.css.js.map +1 -1
  59. package/dist/content/list/list-item.d.ts +8 -8
  60. package/dist/content/list/list-item.d.ts.map +1 -1
  61. package/dist/content/list/list.d.ts +8 -8
  62. package/dist/content/list/list.d.ts.map +1 -1
  63. package/dist/content/qr-code/qr-code.d.ts +1 -1
  64. package/dist/content/rank-list/rank-item.css.cjs +2 -0
  65. package/dist/content/rank-list/rank-item.css.cjs.map +1 -0
  66. package/dist/content/rank-list/rank-item.css.js +2 -0
  67. package/dist/content/rank-list/rank-item.css.js.map +1 -0
  68. package/dist/content/rank-list/rank-item.d.ts +68 -0
  69. package/dist/content/rank-list/rank-item.d.ts.map +1 -0
  70. package/dist/content/rank-list/rank-list.css.cjs +2 -0
  71. package/dist/content/rank-list/rank-list.css.cjs.map +1 -0
  72. package/dist/content/rank-list/rank-list.css.js +2 -0
  73. package/dist/content/rank-list/rank-list.css.js.map +1 -0
  74. package/dist/content/rank-list/rank-list.d.ts +44 -0
  75. package/dist/content/rank-list/rank-list.d.ts.map +1 -0
  76. package/dist/content/separator/separator.d.ts +1 -1
  77. package/dist/content/separator/separator.d.ts.map +1 -1
  78. package/dist/content/speech-player/speech-player.css.cjs.map +1 -1
  79. package/dist/content/speech-player/speech-player.css.js.map +1 -1
  80. package/dist/content/speech-player/speech-player.d.ts +12 -12
  81. package/dist/content/speech-player/speech-player.d.ts.map +1 -1
  82. package/dist/content/stepper/step.css.cjs.map +1 -1
  83. package/dist/content/stepper/step.css.js.map +1 -1
  84. package/dist/content/stepper/step.d.ts +3 -3
  85. package/dist/content/stepper/step.d.ts.map +1 -1
  86. package/dist/content/stepper/stepper.css.cjs.map +1 -1
  87. package/dist/content/stepper/stepper.css.js.map +1 -1
  88. package/dist/content/stepper/stepper.d.ts +3 -3
  89. package/dist/content/stepper/stepper.d.ts.map +1 -1
  90. package/dist/content/table/table.css.cjs.map +1 -1
  91. package/dist/content/table/table.css.js.map +1 -1
  92. package/dist/content/table/table.d.ts +3 -3
  93. package/dist/content/table/table.d.ts.map +1 -1
  94. package/dist/content/text/text.css.cjs.map +1 -1
  95. package/dist/content/text/text.css.js.map +1 -1
  96. package/dist/content/text/text.d.ts +2 -2
  97. package/dist/content/text/text.d.ts.map +1 -1
  98. package/dist/cookie-banner.cjs.map +1 -1
  99. package/dist/cookie-banner.js.map +1 -1
  100. package/dist/copy-command.cjs +1 -1
  101. package/dist/copy-command.cjs.map +1 -1
  102. package/dist/copy-command.js +1 -1
  103. package/dist/copy-command.js.map +1 -1
  104. package/dist/core/announcer.cjs.map +1 -1
  105. package/dist/core/announcer.d.ts +2 -2
  106. package/dist/core/announcer.js.map +1 -1
  107. package/dist/core/aria-reflection.cjs.map +1 -1
  108. package/dist/core/aria-reflection.d.ts +3 -3
  109. package/dist/core/aria-reflection.js.map +1 -1
  110. package/dist/core/auto-resize.cjs.map +1 -1
  111. package/dist/core/auto-resize.d.ts +1 -1
  112. package/dist/core/auto-resize.js.map +1 -1
  113. package/dist/core/checkable.cjs.map +1 -1
  114. package/dist/core/checkable.d.ts +2 -2
  115. package/dist/core/checkable.d.ts.map +1 -1
  116. package/dist/core/checkable.js.map +1 -1
  117. package/dist/core/choice-field.cjs.map +1 -1
  118. package/dist/core/choice-field.d.ts +3 -3
  119. package/dist/core/choice-field.d.ts.map +1 -1
  120. package/dist/core/choice-field.js.map +1 -1
  121. package/dist/core/composer.cjs.map +1 -1
  122. package/dist/core/composer.d.ts +4 -4
  123. package/dist/core/composer.d.ts.map +1 -1
  124. package/dist/core/composer.js.map +1 -1
  125. package/dist/core/date-picker.cjs.map +1 -1
  126. package/dist/core/date-picker.d.ts +5 -5
  127. package/dist/core/date-picker.d.ts.map +1 -1
  128. package/dist/core/date-picker.js.map +1 -1
  129. package/dist/core/direction.cjs.map +1 -1
  130. package/dist/core/direction.d.ts +1 -1
  131. package/dist/core/direction.js.map +1 -1
  132. package/dist/core/field-base.cjs.map +1 -1
  133. package/dist/core/field-base.d.ts +9 -9
  134. package/dist/core/field-base.d.ts.map +1 -1
  135. package/dist/core/field-base.js.map +1 -1
  136. package/dist/core/focus.cjs.map +1 -1
  137. package/dist/core/focus.d.ts +1 -1
  138. package/dist/core/focus.js.map +1 -1
  139. package/dist/core/icon-registry.cjs.map +1 -1
  140. package/dist/core/icon-registry.d.ts +1 -1
  141. package/dist/core/icon-registry.js.map +1 -1
  142. package/dist/core/icons.cjs.map +1 -1
  143. package/dist/core/icons.js.map +1 -1
  144. package/dist/core/keyboard.cjs.map +1 -1
  145. package/dist/core/keyboard.d.ts +1 -1
  146. package/dist/core/keyboard.js.map +1 -1
  147. package/dist/core/numbers.cjs.map +1 -1
  148. package/dist/core/numbers.d.ts +1 -1
  149. package/dist/core/numbers.js.map +1 -1
  150. package/dist/core/overlay.cjs.map +1 -1
  151. package/dist/core/overlay.d.ts +6 -6
  152. package/dist/core/overlay.js.map +1 -1
  153. package/dist/core/parse.cjs.map +1 -1
  154. package/dist/core/parse.d.ts +1 -1
  155. package/dist/core/parse.js.map +1 -1
  156. package/dist/core/positioner.cjs.map +1 -1
  157. package/dist/core/positioner.d.ts +3 -3
  158. package/dist/core/positioner.js.map +1 -1
  159. package/dist/core/ref-callback.cjs.map +1 -1
  160. package/dist/core/ref-callback.d.ts +2 -2
  161. package/dist/core/ref-callback.d.ts.map +1 -1
  162. package/dist/core/ref-callback.js.map +1 -1
  163. package/dist/core/text-field.cjs.map +1 -1
  164. package/dist/core/text-field.d.ts +6 -6
  165. package/dist/core/text-field.d.ts.map +1 -1
  166. package/dist/core/text-field.js.map +1 -1
  167. package/dist/counter.cjs +1 -0
  168. package/dist/counter.cjs.map +1 -1
  169. package/dist/counter.js +1 -0
  170. package/dist/counter.js.map +1 -1
  171. package/dist/custom-elements.json +315 -87
  172. package/dist/datagrid.cjs.map +1 -1
  173. package/dist/datagrid.js.map +1 -1
  174. package/dist/date-picker.cjs +1 -1
  175. package/dist/date-picker.cjs.map +1 -1
  176. package/dist/date-picker.js +1 -1
  177. package/dist/date-picker.js.map +1 -1
  178. package/dist/dialog.cjs.map +1 -1
  179. package/dist/dialog.js.map +1 -1
  180. package/dist/disclosure/accordion-item/accordion-item.css.cjs +1 -1
  181. package/dist/disclosure/accordion-item/accordion-item.css.cjs.map +1 -1
  182. package/dist/disclosure/accordion-item/accordion-item.css.js +1 -1
  183. package/dist/disclosure/accordion-item/accordion-item.css.js.map +1 -1
  184. package/dist/disclosure/tab-item/tab-item.d.ts +1 -1
  185. package/dist/disclosure/tab-item/tab-item.d.ts.map +1 -1
  186. package/dist/drawer.cjs.map +1 -1
  187. package/dist/drawer.js.map +1 -1
  188. package/dist/feedback/alert/alert.css.cjs.map +1 -1
  189. package/dist/feedback/alert/alert.css.js.map +1 -1
  190. package/dist/feedback/badge/badge.css.cjs.map +1 -1
  191. package/dist/feedback/badge/badge.css.js.map +1 -1
  192. package/dist/feedback/badge/badge.d.ts +1 -1
  193. package/dist/feedback/badge/badge.d.ts.map +1 -1
  194. package/dist/feedback/chip/chip.css.cjs.map +1 -1
  195. package/dist/feedback/chip/chip.css.js.map +1 -1
  196. package/dist/feedback/chip/chip.d.ts +3 -3
  197. package/dist/feedback/chip/chip.d.ts.map +1 -1
  198. package/dist/feedback/cookie-banner/cookie-banner.css.cjs.map +1 -1
  199. package/dist/feedback/cookie-banner/cookie-banner.css.js.map +1 -1
  200. package/dist/feedback/cookie-banner/cookie-banner.d.ts +8 -8
  201. package/dist/feedback/cookie-banner/cookie-banner.d.ts.map +1 -1
  202. package/dist/feedback/progress/progress.css.cjs.map +1 -1
  203. package/dist/feedback/progress/progress.css.js.map +1 -1
  204. package/dist/feedback/progress/progress.d.ts +1 -1
  205. package/dist/feedback/progress/progress.d.ts.map +1 -1
  206. package/dist/feedback/skeleton/skeleton.css.cjs.map +1 -1
  207. package/dist/feedback/skeleton/skeleton.css.js.map +1 -1
  208. package/dist/feedback/skeleton/skeleton.d.ts +1 -1
  209. package/dist/feedback/skeleton/skeleton.d.ts.map +1 -1
  210. package/dist/feedback/toast/toast.css.cjs +1 -1
  211. package/dist/feedback/toast/toast.css.cjs.map +1 -1
  212. package/dist/feedback/toast/toast.css.js +1 -1
  213. package/dist/feedback/toast/toast.css.js.map +1 -1
  214. package/dist/feedback/toast/toast.d.ts +1 -1
  215. package/dist/feedback/toast/toast.d.ts.map +1 -1
  216. package/dist/feedback/typing-indicator/typing-indicator.d.ts +2 -2
  217. package/dist/file-input.cjs +1 -1
  218. package/dist/file-input.cjs.map +1 -1
  219. package/dist/file-input.js +1 -1
  220. package/dist/file-input.js.map +1 -1
  221. package/dist/frameworks/elements.d.ts +1 -1
  222. package/dist/grid-item.cjs.map +1 -1
  223. package/dist/grid-item.js.map +1 -1
  224. package/dist/grid.cjs.map +1 -1
  225. package/dist/grid.js.map +1 -1
  226. package/dist/icon.cjs.map +1 -1
  227. package/dist/icon.js.map +1 -1
  228. package/dist/input.cjs.map +1 -1
  229. package/dist/input.js.map +1 -1
  230. package/dist/inputs/button/button.css.cjs.map +1 -1
  231. package/dist/inputs/button/button.css.js.map +1 -1
  232. package/dist/inputs/button/button.d.ts +3 -3
  233. package/dist/inputs/button/button.d.ts.map +1 -1
  234. package/dist/inputs/calendar/calendar.css.cjs.map +1 -1
  235. package/dist/inputs/calendar/calendar.css.js.map +1 -1
  236. package/dist/inputs/calendar/calendar.d.ts +2 -2
  237. package/dist/inputs/checkbox-group/checkbox-group.d.ts +2 -2
  238. package/dist/inputs/checkbox-group/checkbox-group.d.ts.map +1 -1
  239. package/dist/inputs/combobox/combobox.css.cjs.map +1 -1
  240. package/dist/inputs/combobox/combobox.css.js.map +1 -1
  241. package/dist/inputs/counter/counter.css.cjs +1 -1
  242. package/dist/inputs/counter/counter.css.cjs.map +1 -1
  243. package/dist/inputs/counter/counter.css.js +1 -1
  244. package/dist/inputs/counter/counter.css.js.map +1 -1
  245. package/dist/inputs/counter/counter.d.ts +2 -1
  246. package/dist/inputs/counter/counter.d.ts.map +1 -1
  247. package/dist/inputs/datagrid/datagrid.css.cjs.map +1 -1
  248. package/dist/inputs/datagrid/datagrid.css.js.map +1 -1
  249. package/dist/inputs/datagrid/datagrid.d.ts +5 -5
  250. package/dist/inputs/date-picker/date-picker.css.cjs.map +1 -1
  251. package/dist/inputs/date-picker/date-picker.css.js.map +1 -1
  252. package/dist/inputs/date-picker/date-picker.d.ts +1 -1
  253. package/dist/inputs/file-input/file-input-upload.cjs.map +1 -1
  254. package/dist/inputs/file-input/file-input-upload.d.ts +6 -6
  255. package/dist/inputs/file-input/file-input-upload.js.map +1 -1
  256. package/dist/inputs/file-input/file-input.css.cjs.map +1 -1
  257. package/dist/inputs/file-input/file-input.css.js.map +1 -1
  258. package/dist/inputs/file-input/file-input.d.ts +6 -6
  259. package/dist/inputs/input/input.css.cjs +1 -1
  260. package/dist/inputs/input/input.css.cjs.map +1 -1
  261. package/dist/inputs/input/input.css.js +1 -1
  262. package/dist/inputs/input/input.css.js.map +1 -1
  263. package/dist/inputs/input/input.d.ts +6 -6
  264. package/dist/inputs/input/input.d.ts.map +1 -1
  265. package/dist/inputs/message-composer/message-composer.css.cjs.map +1 -1
  266. package/dist/inputs/message-composer/message-composer.css.js.map +1 -1
  267. package/dist/inputs/message-composer/message-composer.d.ts +7 -7
  268. package/dist/inputs/message-composer/message-composer.d.ts.map +1 -1
  269. package/dist/inputs/number-input/number-input.css.cjs.map +1 -1
  270. package/dist/inputs/number-input/number-input.css.js.map +1 -1
  271. package/dist/inputs/number-input/number-input.d.ts +2 -2
  272. package/dist/inputs/otp-input/otp-input.css.cjs.map +1 -1
  273. package/dist/inputs/otp-input/otp-input.css.js.map +1 -1
  274. package/dist/inputs/qr-scanner/qr-scanner.d.ts +1 -1
  275. package/dist/inputs/qr-scanner/qr-scanner.d.ts.map +1 -1
  276. package/dist/inputs/rating/rating.d.ts +1 -1
  277. package/dist/inputs/rating/rating.d.ts.map +1 -1
  278. package/dist/inputs/select/select.css.cjs +1 -1
  279. package/dist/inputs/select/select.css.cjs.map +1 -1
  280. package/dist/inputs/select/select.css.js +1 -1
  281. package/dist/inputs/select/select.css.js.map +1 -1
  282. package/dist/inputs/select/select.d.ts +1 -1
  283. package/dist/inputs/select/select.d.ts.map +1 -1
  284. package/dist/inputs/shared/field-binding.cjs.map +1 -1
  285. package/dist/inputs/shared/field-binding.d.ts +2 -2
  286. package/dist/inputs/shared/field-binding.d.ts.map +1 -1
  287. package/dist/inputs/shared/field-binding.js.map +1 -1
  288. package/dist/inputs/shared/native-field-event.cjs.map +1 -1
  289. package/dist/inputs/shared/native-field-event.d.ts +1 -1
  290. package/dist/inputs/shared/native-field-event.js.map +1 -1
  291. package/dist/inputs/shared/templates.cjs.map +1 -1
  292. package/dist/inputs/shared/templates.d.ts +3 -3
  293. package/dist/inputs/shared/templates.js.map +1 -1
  294. package/dist/inputs/slider/slider.css.cjs.map +1 -1
  295. package/dist/inputs/slider/slider.css.js.map +1 -1
  296. package/dist/inputs/slider/slider.d.ts +1 -1
  297. package/dist/inputs/slider/slider.d.ts.map +1 -1
  298. package/dist/inputs/textarea/textarea.css.cjs.map +1 -1
  299. package/dist/inputs/textarea/textarea.css.js.map +1 -1
  300. package/dist/inputs/textarea/textarea.d.ts +1 -1
  301. package/dist/inputs/time-picker/time-picker.css.cjs.map +1 -1
  302. package/dist/inputs/time-picker/time-picker.css.js.map +1 -1
  303. package/dist/inputs/time-picker/time-picker.d.ts +1 -1
  304. package/dist/layout/box/box.css.cjs.map +1 -1
  305. package/dist/layout/box/box.css.js.map +1 -1
  306. package/dist/layout/box/box.d.ts +1 -1
  307. package/dist/layout/grid/grid.d.ts +1 -1
  308. package/dist/layout/grid-item/grid-item.d.ts +3 -3
  309. package/dist/layout/grid-item/grid-item.d.ts.map +1 -1
  310. package/dist/layout/navbar/navbar.css.cjs +1 -1
  311. package/dist/layout/navbar/navbar.css.cjs.map +1 -1
  312. package/dist/layout/navbar/navbar.css.js +1 -1
  313. package/dist/layout/navbar/navbar.css.js.map +1 -1
  314. package/dist/layout/navbar/navbar.d.ts +3 -3
  315. package/dist/layout/sidebar/sidebar-item.css.cjs.map +1 -1
  316. package/dist/layout/sidebar/sidebar-item.css.js.map +1 -1
  317. package/dist/layout/sidebar/sidebar.d.ts +5 -5
  318. package/dist/layout/sidebar/sidebar.d.ts.map +1 -1
  319. package/dist/list-item.cjs.map +1 -1
  320. package/dist/list-item.js.map +1 -1
  321. package/dist/list.cjs.map +1 -1
  322. package/dist/list.js.map +1 -1
  323. package/dist/menu.cjs +6 -5
  324. package/dist/menu.cjs.map +1 -1
  325. package/dist/menu.js +6 -5
  326. package/dist/menu.js.map +1 -1
  327. package/dist/message-composer.cjs.map +1 -1
  328. package/dist/message-composer.js.map +1 -1
  329. package/dist/navbar.cjs.map +1 -1
  330. package/dist/navbar.js.map +1 -1
  331. package/dist/number-input.cjs.map +1 -1
  332. package/dist/number-input.js.map +1 -1
  333. package/dist/otp-input.cjs.map +1 -1
  334. package/dist/otp-input.js.map +1 -1
  335. package/dist/overlay/command-palette/command-palette-items.cjs.map +1 -1
  336. package/dist/overlay/command-palette/command-palette-items.d.ts +1 -1
  337. package/dist/overlay/command-palette/command-palette-items.js.map +1 -1
  338. package/dist/overlay/command-palette/command-palette.css.cjs.map +1 -1
  339. package/dist/overlay/command-palette/command-palette.css.js.map +1 -1
  340. package/dist/overlay/command-palette/command-palette.d.ts +3 -3
  341. package/dist/overlay/command-palette/command-palette.types.d.ts +6 -6
  342. package/dist/overlay/command-palette/command-palette.types.d.ts.map +1 -1
  343. package/dist/overlay/dialog/dialog.css.cjs +1 -1
  344. package/dist/overlay/dialog/dialog.css.cjs.map +1 -1
  345. package/dist/overlay/dialog/dialog.css.js +1 -1
  346. package/dist/overlay/dialog/dialog.css.js.map +1 -1
  347. package/dist/overlay/dialog/dialog.d.ts +2 -2
  348. package/dist/overlay/dialog/dialog.d.ts.map +1 -1
  349. package/dist/overlay/drawer/drawer.css.cjs.map +1 -1
  350. package/dist/overlay/drawer/drawer.css.js.map +1 -1
  351. package/dist/overlay/drawer/drawer.d.ts +1 -1
  352. package/dist/overlay/drawer/drawer.d.ts.map +1 -1
  353. package/dist/overlay/menu/menu-item.css.cjs.map +1 -1
  354. package/dist/overlay/menu/menu-item.css.js.map +1 -1
  355. package/dist/overlay/menu/menu.d.ts.map +1 -1
  356. package/dist/overlay/shared/use-dialog.cjs.map +1 -1
  357. package/dist/overlay/shared/use-dialog.d.ts +6 -6
  358. package/dist/overlay/shared/use-dialog.d.ts.map +1 -1
  359. package/dist/overlay/shared/use-dialog.js.map +1 -1
  360. package/dist/overlay/shared/use-floating-trigger.cjs.map +1 -1
  361. package/dist/overlay/shared/use-floating-trigger.d.ts +1 -1
  362. package/dist/overlay/shared/use-floating-trigger.d.ts.map +1 -1
  363. package/dist/overlay/shared/use-floating-trigger.js.map +1 -1
  364. package/dist/overlay/tooltip/tooltip.css.cjs.map +1 -1
  365. package/dist/overlay/tooltip/tooltip.css.js.map +1 -1
  366. package/dist/progress.cjs.map +1 -1
  367. package/dist/progress.js.map +1 -1
  368. package/dist/qr-code.cjs.map +1 -1
  369. package/dist/qr-code.js.map +1 -1
  370. package/dist/qr-scanner.cjs.map +1 -1
  371. package/dist/qr-scanner.js.map +1 -1
  372. package/dist/radio-group.cjs.map +1 -1
  373. package/dist/radio-group.js.map +1 -1
  374. package/dist/radio.cjs.map +1 -1
  375. package/dist/radio.js.map +1 -1
  376. package/dist/rank-item.cjs +21 -0
  377. package/dist/rank-item.cjs.map +1 -0
  378. package/dist/rank-item.js +21 -0
  379. package/dist/rank-item.js.map +1 -0
  380. package/dist/rank-list.cjs +4 -0
  381. package/dist/rank-list.cjs.map +1 -0
  382. package/dist/rank-list.js +4 -0
  383. package/dist/rank-list.js.map +1 -0
  384. package/dist/rating.cjs.map +1 -1
  385. package/dist/rating.js.map +1 -1
  386. package/dist/refine.cjs +103 -80
  387. package/dist/refine.cjs.map +1 -1
  388. package/dist/refine.iife.js +103 -80
  389. package/dist/refine.iife.js.map +1 -1
  390. package/dist/refine.js +104 -81
  391. package/dist/refine.js.map +1 -1
  392. package/dist/select.cjs.map +1 -1
  393. package/dist/select.js.map +1 -1
  394. package/dist/separator.cjs.map +1 -1
  395. package/dist/separator.js.map +1 -1
  396. package/dist/shared/index.d.ts +3 -3
  397. package/dist/shared/size-presets.cjs.map +1 -1
  398. package/dist/shared/size-presets.d.ts +4 -4
  399. package/dist/shared/size-presets.js.map +1 -1
  400. package/dist/shared/types.d.ts +1 -1
  401. package/dist/sidebar.cjs.map +1 -1
  402. package/dist/sidebar.js.map +1 -1
  403. package/dist/skeleton.cjs.map +1 -1
  404. package/dist/skeleton.js.map +1 -1
  405. package/dist/slider.cjs.map +1 -1
  406. package/dist/slider.js.map +1 -1
  407. package/dist/speech-player.cjs.map +1 -1
  408. package/dist/speech-player.js.map +1 -1
  409. package/dist/step.cjs.map +1 -1
  410. package/dist/step.js.map +1 -1
  411. package/dist/stepper.cjs.map +1 -1
  412. package/dist/stepper.js.map +1 -1
  413. package/dist/styles/fouc.css +2 -2
  414. package/dist/styles/mixins/accessibility.css.cjs.map +1 -1
  415. package/dist/styles/mixins/accessibility.css.d.ts +4 -4
  416. package/dist/styles/mixins/accessibility.css.js.map +1 -1
  417. package/dist/styles/mixins/animation.css.cjs +2 -2
  418. package/dist/styles/mixins/animation.css.cjs.map +1 -1
  419. package/dist/styles/mixins/animation.css.d.ts +4 -4
  420. package/dist/styles/mixins/animation.css.js +2 -2
  421. package/dist/styles/mixins/animation.css.js.map +1 -1
  422. package/dist/styles/mixins/field-variants.css.cjs +2 -2
  423. package/dist/styles/mixins/field-variants.css.cjs.map +1 -1
  424. package/dist/styles/mixins/field-variants.css.d.ts +6 -6
  425. package/dist/styles/mixins/field-variants.css.d.ts.map +1 -1
  426. package/dist/styles/mixins/field-variants.css.js +2 -2
  427. package/dist/styles/mixins/field-variants.css.js.map +1 -1
  428. package/dist/styles/mixins/shape.css.cjs.map +1 -1
  429. package/dist/styles/mixins/shape.css.d.ts +9 -9
  430. package/dist/styles/mixins/shape.css.d.ts.map +1 -1
  431. package/dist/styles/mixins/shape.css.js.map +1 -1
  432. package/dist/styles/mixins/variants.css.cjs.map +1 -1
  433. package/dist/styles/mixins/variants.css.d.ts +1 -1
  434. package/dist/styles/mixins/variants.css.js.map +1 -1
  435. package/dist/styles/theme.css +36 -28
  436. package/dist/tab-item.cjs.map +1 -1
  437. package/dist/tab-item.js.map +1 -1
  438. package/dist/tab-panel.cjs.map +1 -1
  439. package/dist/tab-panel.js.map +1 -1
  440. package/dist/table.cjs.map +1 -1
  441. package/dist/table.js.map +1 -1
  442. package/dist/text.cjs.map +1 -1
  443. package/dist/text.js.map +1 -1
  444. package/dist/textarea.cjs.map +1 -1
  445. package/dist/textarea.js.map +1 -1
  446. package/dist/theme.cjs.map +1 -1
  447. package/dist/theme.d.ts +2 -2
  448. package/dist/theme.js.map +1 -1
  449. package/dist/time-picker.cjs +1 -1
  450. package/dist/time-picker.cjs.map +1 -1
  451. package/dist/time-picker.js +1 -1
  452. package/dist/time-picker.js.map +1 -1
  453. package/dist/toast.cjs.map +1 -1
  454. package/dist/toast.js.map +1 -1
  455. package/dist/types/elements.d.ts +6 -2
  456. package/dist/typing-indicator.cjs.map +1 -1
  457. package/dist/typing-indicator.js.map +1 -1
  458. package/dist/utils/css.cjs.map +1 -1
  459. package/dist/utils/css.js.map +1 -1
  460. package/dist/utils/link.cjs.map +1 -1
  461. package/dist/utils/link.d.ts +2 -2
  462. package/dist/utils/link.js.map +1 -1
  463. package/package.json +31 -14
@@ -1,2 +1,2 @@
1
- var e=`@layer refine.base{:host{--accordion-details-radius:var(--rounded-lg);--accordion-item-transition:var(--transition-normal);--accordion-item-expand-easing:var(--ease-spring);--accordion-item-row-duration:.2s;--accordion-item-fade-duration:.2s;--accordion-item-fade-delay:60ms;--accordion-item-collapse-delay:.12s;color:var(--accordion-item-body-color,var(--text-color-body));display:block}details{border-radius:var(--accordion-item-radius);width:100%;overflow:hidden}summary{gap:var(--size-4);min-height:var(--_touch-target);padding:var(--accordion-item-details-padding,var(--size-3) var(--size-4));font-size:var(--accordion-item-title);cursor:pointer;-webkit-user-select:none;user-select:none;background:var(--accordion-item-bg);border:var(--border) solid var(--accordion-item-border-color);border-radius:var(--accordion-details-radius);transition:background var(--accordion-item-transition), border-color var(--accordion-item-transition), color var(--accordion-item-transition);outline:none;align-items:center;list-style:none;display:flex;position:relative}summary::-webkit-details-marker{display:none}summary:focus{outline:none}summary:focus-visible{outline:var(--border-2) solid currentcolor;outline-offset:var(--border-2);box-shadow:0 0 0 3px color-mix(in oklch, currentcolor 20%, transparent)}.header-content{flex-direction:column;flex:1;min-width:0;display:flex}.subtitle{font-size:var(--accordion-item-subtitle-size);line-height:var(--leading-normal);color:var(--accordion-item-subtitle-color,var(--text-color-secondary))}.title{text-overflow:ellipsis;font-weight:var(--font-medium);color:var(--accordion-item-title-color,var(--text-color-heading));white-space:nowrap;overflow:hidden}.content-wrapper{font-size:var(--accordion-item-body);background:var(--accordion-item-bg);border-inline:1px solid var(--accordion-item-border-color);border-bottom:1px solid var(--accordion-item-border-color);border-radius:var(--accordion-summary-radius);transition:grid-template-rows var(--accordion-item-row-duration) var(--accordion-item-expand-easing,var(--ease-spring));grid-template-rows:0fr;display:grid}details[open] .content-wrapper{grid-template-rows:1fr}.content-inner{padding:var(--accordion-item-summary-padding,var(--size-2) var(--size-4));opacity:1;transition:opacity var(--accordion-item-fade-duration) var(--accordion-item-fade-delay) var(--ease-spring), transform var(--accordion-item-fade-duration) var(--accordion-item-fade-delay) var(--ease-spring);overflow:hidden;transform:translateY(0)}details.opening .content-inner{opacity:0;transition:none;transform:translateY(-6px)}details.closing .content-inner{opacity:0;transition:opacity .15s var(--ease-spring), transform .15s var(--ease-spring);transform:translateY(-4px)}details.closing .content-wrapper{transition:grid-template-rows var(--accordion-item-row-duration) var(--accordion-item-collapse-delay) var(--accordion-item-expand-easing,var(--ease-spring));grid-template-rows:1fr}}@layer refine.variants{:host,:host([variant=solid]){--accordion-item-bg:var(--color-contrast-50);--accordion-item-border-color:transparent;--accordion-item-hover-bg:var(--color-contrast-200)}:host([variant=flat]){--accordion-item-bg:var(--color-contrast-100);--accordion-item-hover-bg:var(--color-contrast-200)}:host([variant=bordered]){--accordion-item-bg:var(--color-contrast-100);--accordion-item-border-color:var(--color-divider);--accordion-item-hover-bg:var(--color-contrast-200);box-shadow:var(--inset-shadow-xs), var(--shadow-2xs)}:host([variant=outline]){--accordion-item-bg:transparent;--accordion-item-border-color:var(--color-divider);--accordion-item-hover-bg:var(--color-contrast-300)}:host([variant=ghost]){--accordion-item-bg:transparent;--accordion-item-border-color:transparent;--accordion-item-hover-bg:var(--color-contrast-200)}:host([variant=text]){--accordion-item-bg:transparent;--accordion-item-border-color:transparent;--accordion-item-hover-bg:transparent}:host summary:hover{background:var(--accordion-item-hover-bg)}:host([variant=frost]) details{border-radius:inherit}:host([variant=frost]) summary{border-radius:inherit;-webkit-backdrop-filter:blur(var(--blur-lg)) saturate(180%);backdrop-filter:blur(var(--blur-lg)) saturate(180%)}:host([variant=frost]) .content-wrapper{-webkit-backdrop-filter:blur(var(--blur-lg)) saturate(180%);backdrop-filter:blur(var(--blur-lg)) saturate(180%);border-radius:0}:host([variant=frost]){--accordion-item-bg:color-mix(in oklch, var(--color-canvas) 55%, transparent);--accordion-item-border-color:transparent;--accordion-item-hover-bg:color-mix(in oklch, var(--color-canvas) 20%, transparent)}:host([variant=frost]) summary{text-shadow:var(--text-shadow-2xs)}:host([size=sm]){--accordion-item-details-padding:var(--size-2) var(--size-4);--accordion-item-summary-padding:var(--size-1) var(--size-5);--accordion-item-title:var(--text-sm);--accordion-item-subtitle-size:var(--text-xs);--accordion-item-body:var(--text-xs)}:host(:not([size])),:host([size=md]){--accordion-item-details-padding:var(--size-3) var(--size-4);--accordion-item-summary-padding:var(--size-1) var(--size-5);--accordion-item-title:var(--text-base);--accordion-item-subtitle-size:var(--text-sm);--accordion-item-body:var(--text-sm)}:host([size=lg]){--accordion-item-details-padding:var(--size-4) var(--size-4);--accordion-item-summary-padding:var(--size-1) var(--size-5);--accordion-item-title:var(--text-lg);--accordion-item-subtitle-size:var(--text-base);--accordion-item-body:var(--text-base)}@media (pointer:coarse){:host,:host([size=md]){--accordion-item-details-padding:var(--size-4) var(--size-5);--accordion-item-title:var(--text-lg);--accordion-item-subtitle-size:var(--text-base);--accordion-item-body:var(--text-base)}:host([size=sm]){--accordion-item-details-padding:var(--size-3) var(--size-4);--accordion-item-title:var(--text-base);--accordion-item-subtitle-size:var(--text-sm);--accordion-item-body:var(--text-sm)}}:host([disabled]){pointer-events:none;opacity:.6}.chevron{--ore-icon-size:var(--_size,var(--size-5));width:var(--_size,var(--size-5));height:var(--_size,var(--size-5));transition:transform var(--accordion-item-row-duration) var(--ease-spring);transform:rotate(-90deg)}.chevron:not(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){margin-left:auto}.chevron:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){margin-right:auto}details[open] .chevron{transform:rotate(0)}details.rtl .chevron{transform:rotate(90deg)}details.rtl[open] .chevron{transform:rotate(0)}:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)) .chevron{transform:rotate(90deg)}:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)) details[open] .chevron{transform:rotate(0)}:host([expanded]){--accordion-details-radius:var(--rounded-lg) var(--rounded-lg) 0 0;--accordion-summary-radius:0 0 var(--rounded-lg) var(--rounded-lg)}@media (forced-colors:active){summary{border-color:buttontext}}}`;export{e as default};
1
+ var e=`@layer refine.base{:host{--accordion-details-radius:var(--rounded-lg);--accordion-item-transition:var(--transition-normal);--accordion-item-expand-easing:var(--ease-spring);--accordion-item-row-duration:.2s;--accordion-item-fade-duration:.2s;--accordion-item-fade-delay:60ms;--accordion-item-collapse-delay:.12s;color:var(--accordion-item-body-color,var(--text-color-body));display:block}details{border-radius:var(--accordion-item-radius);width:100%}summary{gap:var(--size-4);min-height:var(--_touch-target);padding:var(--accordion-item-details-padding,var(--size-3) var(--size-4));font-size:var(--accordion-item-title);cursor:pointer;-webkit-user-select:none;user-select:none;background:var(--accordion-item-bg);border:var(--border) solid var(--accordion-item-border-color);border-radius:var(--accordion-details-radius);transition:background var(--accordion-item-transition), border-color var(--accordion-item-transition), color var(--accordion-item-transition);outline:none;align-items:center;list-style:none;display:flex;position:relative}summary::-webkit-details-marker{display:none}summary:focus{outline:none}summary:focus-visible{outline:var(--border-2) solid currentcolor;outline-offset:var(--border-2);box-shadow:0 0 0 3px color-mix(in oklch, currentcolor 20%, transparent)}.header-content{flex-direction:column;flex:1;min-width:0;display:flex}.subtitle{font-size:var(--accordion-item-subtitle-size);line-height:var(--leading-normal);color:var(--accordion-item-subtitle-color,var(--text-color-secondary))}.title{text-overflow:ellipsis;font-weight:var(--font-medium);color:var(--accordion-item-title-color,var(--text-color-heading));white-space:nowrap;overflow:hidden}.content-wrapper{font-size:var(--accordion-item-body);background:var(--accordion-item-bg);border-inline:1px solid var(--accordion-item-border-color);border-bottom:1px solid var(--accordion-item-border-color);border-radius:var(--accordion-summary-radius);transition:grid-template-rows var(--accordion-item-row-duration) var(--accordion-item-expand-easing,var(--ease-spring));grid-template-rows:0fr;display:grid}details[open] .content-wrapper{grid-template-rows:1fr}.content-inner{padding:var(--accordion-item-summary-padding,var(--size-2) var(--size-4));opacity:1;transition:opacity var(--accordion-item-fade-duration) var(--accordion-item-fade-delay) var(--ease-spring), transform var(--accordion-item-fade-duration) var(--accordion-item-fade-delay) var(--ease-spring);overflow:hidden;transform:translateY(0)}details.opening .content-inner{opacity:0;transition:none;transform:translateY(-6px)}details.closing .content-inner{opacity:0;transition:opacity .15s var(--ease-spring), transform .15s var(--ease-spring);transform:translateY(-4px)}details.closing .content-wrapper{transition:grid-template-rows var(--accordion-item-row-duration) var(--accordion-item-collapse-delay) var(--accordion-item-expand-easing,var(--ease-spring));grid-template-rows:1fr}}@layer refine.variants{:host,:host([variant=solid]){--accordion-item-bg:var(--color-contrast-50);--accordion-item-border-color:transparent;--accordion-item-hover-bg:var(--color-contrast-200)}:host([variant=flat]){--accordion-item-bg:var(--color-contrast-100);--accordion-item-hover-bg:var(--color-contrast-200)}:host([variant=bordered]){--accordion-item-bg:var(--color-contrast-100);--accordion-item-border-color:var(--color-divider);--accordion-item-hover-bg:var(--color-contrast-200);box-shadow:var(--inset-shadow-xs), var(--shadow-2xs)}:host([variant=outline]){--accordion-item-bg:transparent;--accordion-item-border-color:var(--color-divider);--accordion-item-hover-bg:var(--color-contrast-300)}:host([variant=ghost]){--accordion-item-bg:transparent;--accordion-item-border-color:transparent;--accordion-item-hover-bg:var(--color-contrast-200)}:host([variant=text]){--accordion-item-bg:transparent;--accordion-item-border-color:transparent;--accordion-item-hover-bg:transparent}:host summary:hover{background:var(--accordion-item-hover-bg)}:host([variant=frost]) details{border-radius:inherit}:host([variant=frost]) summary{border-radius:inherit;-webkit-backdrop-filter:blur(var(--blur-lg)) saturate(180%);backdrop-filter:blur(var(--blur-lg)) saturate(180%)}:host([variant=frost]) .content-wrapper{-webkit-backdrop-filter:blur(var(--blur-lg)) saturate(180%);backdrop-filter:blur(var(--blur-lg)) saturate(180%);border-radius:0}:host([variant=frost]){--accordion-item-bg:color-mix(in oklch, var(--color-canvas) 55%, transparent);--accordion-item-border-color:transparent;--accordion-item-hover-bg:color-mix(in oklch, var(--color-canvas) 20%, transparent)}:host([variant=frost]) summary{text-shadow:var(--text-shadow-2xs)}:host([size=sm]){--accordion-item-details-padding:var(--size-2) var(--size-4);--accordion-item-summary-padding:var(--size-1) var(--size-5);--accordion-item-title:var(--text-sm);--accordion-item-subtitle-size:var(--text-xs);--accordion-item-body:var(--text-xs)}:host(:not([size])),:host([size=md]){--accordion-item-details-padding:var(--size-3) var(--size-4);--accordion-item-summary-padding:var(--size-1) var(--size-5);--accordion-item-title:var(--text-base);--accordion-item-subtitle-size:var(--text-sm);--accordion-item-body:var(--text-sm)}:host([size=lg]){--accordion-item-details-padding:var(--size-4) var(--size-4);--accordion-item-summary-padding:var(--size-1) var(--size-5);--accordion-item-title:var(--text-lg);--accordion-item-subtitle-size:var(--text-base);--accordion-item-body:var(--text-base)}@media (pointer:coarse){:host,:host([size=md]){--accordion-item-details-padding:var(--size-4) var(--size-5);--accordion-item-title:var(--text-lg);--accordion-item-subtitle-size:var(--text-base);--accordion-item-body:var(--text-base)}:host([size=sm]){--accordion-item-details-padding:var(--size-3) var(--size-4);--accordion-item-title:var(--text-base);--accordion-item-subtitle-size:var(--text-sm);--accordion-item-body:var(--text-sm)}}:host([disabled]){pointer-events:none;opacity:.6}.chevron{--ore-icon-size:var(--_size,var(--size-5));width:var(--_size,var(--size-5));height:var(--_size,var(--size-5));transition:transform var(--accordion-item-row-duration) var(--ease-spring);transform:rotate(-90deg)}.chevron:not(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){margin-left:auto}.chevron:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){margin-right:auto}details[open] .chevron{transform:rotate(0)}details.rtl .chevron{transform:rotate(90deg)}details.rtl[open] .chevron{transform:rotate(0)}:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)) .chevron{transform:rotate(90deg)}:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)) details[open] .chevron{transform:rotate(0)}:host([expanded]){--accordion-details-radius:var(--rounded-lg) var(--rounded-lg) 0 0;--accordion-summary-radius:0 0 var(--rounded-lg) var(--rounded-lg)}@media (forced-colors:active){summary{border-color:buttontext}}}`;export{e as default};
2
2
  //# sourceMappingURL=accordion-item.css.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"accordion-item.css.js","names":[],"sources":["../../../src/disclosure/accordion-item/accordion-item.css?inline"],"sourcesContent":["@layer refine.base {\n /* ========================================\n Base Styles & Defaults\n ======================================== */\n\n :host {\n --accordion-details-radius: var(--rounded-lg);\n --accordion-item-transition: var(--transition-normal);\n --accordion-item-expand-easing: var(--ease-spring);\n --accordion-item-row-duration: 200ms;\n --accordion-item-fade-duration: 200ms;\n --accordion-item-fade-delay: 60ms;\n --accordion-item-collapse-delay: 120ms;\n display: block;\n color: var(--accordion-item-body-color, var(--text-color-body));\n }\n\n details {\n width: 100%;\n overflow: hidden;\n border-radius: var(--accordion-item-radius);\n }\n\n summary {\n position: relative;\n display: flex;\n gap: var(--size-4);\n align-items: center;\n min-height: var(--_touch-target);\n padding: var(--accordion-item-details-padding, var(--size-3) var(--size-4));\n font-size: var(--accordion-item-title);\n cursor: pointer;\n user-select: none;\n outline: none;\n list-style: none;\n background: var(--accordion-item-bg);\n border: var(--border) solid var(--accordion-item-border-color);\n border-radius: var(--accordion-details-radius);\n transition:\n background var(--accordion-item-transition),\n border-color var(--accordion-item-transition),\n color var(--accordion-item-transition);\n }\n\n summary::-webkit-details-marker {\n display: none;\n }\n\n summary:focus {\n outline: none;\n }\n\n summary:focus-visible {\n outline: var(--border-2) solid currentcolor;\n outline-offset: var(--border-2);\n box-shadow: 0 0 0 3px color-mix(in oklch, currentcolor 20%, transparent);\n }\n\n .header-content {\n display: flex;\n flex: 1;\n flex-direction: column;\n min-width: 0;\n }\n\n .subtitle {\n font-size: var(--accordion-item-subtitle-size);\n line-height: var(--leading-normal);\n color: var(--accordion-item-subtitle-color, var(--text-color-secondary));\n }\n\n .title {\n overflow: hidden;\n text-overflow: ellipsis;\n font-weight: var(--font-medium);\n color: var(--accordion-item-title-color, var(--text-color-heading));\n white-space: nowrap;\n }\n\n .content-wrapper {\n display: grid;\n grid-template-rows: 0fr;\n font-size: var(--accordion-item-body);\n background: var(--accordion-item-bg);\n border-inline: 1px solid var(--accordion-item-border-color);\n border-bottom: 1px solid var(--accordion-item-border-color);\n border-radius: var(--accordion-summary-radius);\n transition: grid-template-rows var(--accordion-item-row-duration)\n var(--accordion-item-expand-easing, var(--ease-spring));\n }\n\n details[open] .content-wrapper {\n grid-template-rows: 1fr;\n }\n\n .content-inner {\n padding: var(--accordion-item-summary-padding, var(--size-2) var(--size-4));\n overflow: hidden;\n opacity: 1;\n transform: translateY(0);\n transition:\n opacity var(--accordion-item-fade-duration) var(--accordion-item-fade-delay) var(--ease-spring),\n transform var(--accordion-item-fade-duration) var(--accordion-item-fade-delay) var(--ease-spring);\n }\n\n /* Opening: set from-state with no transition — transition fires on base rule when class is removed */\n details.opening .content-inner {\n opacity: 0;\n transform: translateY(-6px);\n transition: none;\n }\n\n /* Closing: content fades out immediately, row collapses after */\n details.closing .content-inner {\n opacity: 0;\n transform: translateY(-4px);\n transition:\n opacity 150ms var(--ease-spring),\n transform 150ms var(--ease-spring);\n }\n\n /* Keep row expanded while closing animation plays */\n details.closing .content-wrapper {\n grid-template-rows: 1fr;\n transition: grid-template-rows var(--accordion-item-row-duration) var(--accordion-item-collapse-delay)\n var(--accordion-item-expand-easing, var(--ease-spring));\n }\n}\n\n@layer refine.variants {\n /* ========================================\n Visual Variants\n ======================================== */\n\n :host,\n :host([variant='solid']) {\n --accordion-item-bg: var(--color-contrast-50);\n --accordion-item-border-color: transparent;\n --accordion-item-hover-bg: var(--color-contrast-200);\n }\n\n :host([variant='flat']) {\n --accordion-item-bg: var(--color-contrast-100);\n --accordion-item-hover-bg: var(--color-contrast-200);\n }\n\n :host([variant='bordered']) {\n --accordion-item-bg: var(--color-contrast-100);\n --accordion-item-border-color: var(--color-divider);\n --accordion-item-hover-bg: var(--color-contrast-200);\n\n box-shadow: var(--inset-shadow-xs), var(--shadow-2xs);\n }\n\n :host([variant='outline']) {\n --accordion-item-bg: transparent;\n --accordion-item-border-color: var(--color-divider);\n --accordion-item-hover-bg: var(--color-contrast-300);\n }\n\n :host([variant='ghost']) {\n --accordion-item-bg: transparent;\n --accordion-item-border-color: transparent;\n --accordion-item-hover-bg: var(--color-contrast-200);\n }\n\n :host([variant='text']) {\n --accordion-item-bg: transparent;\n --accordion-item-border-color: transparent;\n --accordion-item-hover-bg: transparent;\n }\n\n /* ── Shared hover state reads per-variant --accordion-item-hover-bg ── */\n :host summary:hover {\n background: var(--accordion-item-hover-bg);\n }\n\n :host([variant='frost']) details {\n border-radius: inherit;\n }\n\n :host([variant='frost']) summary {\n border-radius: inherit;\n backdrop-filter: blur(var(--blur-lg)) saturate(180%);\n }\n\n :host([variant='frost']) .content-wrapper {\n border-radius: 0;\n backdrop-filter: blur(var(--blur-lg)) saturate(180%);\n }\n\n /* Frost */\n :host([variant='frost']) {\n --accordion-item-bg: color-mix(in oklch, var(--color-canvas) 55%, transparent);\n --accordion-item-border-color: transparent;\n --accordion-item-hover-bg: color-mix(in oklch, var(--color-canvas) 20%, transparent);\n }\n\n :host([variant='frost']) summary {\n text-shadow: var(--text-shadow-2xs);\n }\n\n /* ========================================\n Size Variants\n ======================================== */\n\n :host([size='sm']) {\n --accordion-item-details-padding: var(--size-2) var(--size-4);\n --accordion-item-summary-padding: var(--size-1) var(--size-5);\n --accordion-item-title: var(--text-sm);\n --accordion-item-subtitle-size: var(--text-xs);\n --accordion-item-body: var(--text-xs);\n }\n\n :host(:not([size])),\n :host([size='md']) {\n --accordion-item-details-padding: var(--size-3) var(--size-4);\n --accordion-item-summary-padding: var(--size-1) var(--size-5);\n --accordion-item-title: var(--text-base);\n --accordion-item-subtitle-size: var(--text-sm);\n --accordion-item-body: var(--text-sm);\n }\n\n :host([size='lg']) {\n --accordion-item-details-padding: var(--size-4) var(--size-4);\n --accordion-item-summary-padding: var(--size-1) var(--size-5);\n --accordion-item-title: var(--text-lg);\n --accordion-item-subtitle-size: var(--text-base);\n --accordion-item-body: var(--text-base);\n }\n\n /* ─── coarse pointer: promote one size tier for proportional scaling ─── */\n @media (pointer: coarse) {\n :host,\n :host([size='md']) {\n --accordion-item-details-padding: var(--size-4) var(--size-5);\n --accordion-item-title: var(--text-lg);\n --accordion-item-subtitle-size: var(--text-base);\n --accordion-item-body: var(--text-base);\n }\n\n :host([size='sm']) {\n --accordion-item-details-padding: var(--size-3) var(--size-4);\n --accordion-item-title: var(--text-base);\n --accordion-item-subtitle-size: var(--text-sm);\n --accordion-item-body: var(--text-sm);\n }\n }\n\n /* ========================================\n States\n ======================================== */\n\n :host([disabled]) {\n pointer-events: none;\n opacity: 0.6;\n }\n\n /* ========================================\n Chevron Animation\n ======================================== */\n\n .chevron {\n --ore-icon-size: var(--_size, var(--size-5));\n width: var(--_size, var(--size-5));\n height: var(--_size, var(--size-5));\n\n margin-inline-start: auto;\n transform: rotate(-90deg);\n transition: transform var(--accordion-item-row-duration) var(--ease-spring);\n }\n\n details[open] .chevron {\n transform: rotate(0deg);\n }\n\n /* RTL Support - use .rtl class added by JavaScript */\n details.rtl .chevron {\n transform: rotate(90deg);\n }\n\n details.rtl[open] .chevron {\n transform: rotate(0deg);\n }\n\n /* :dir(rtl) is inheritance-driven and crosses the shadow boundary; the ancestor-attribute\n selectors (html[dir='rtl']/[dir='rtl']) cannot match anything inside this shadow root and\n were removed. */\n :dir(rtl) .chevron {\n transform: rotate(90deg);\n }\n\n :dir(rtl) details[open] .chevron {\n transform: rotate(0deg);\n }\n\n /* Expanded state - adjust border radius */\n :host([expanded]) {\n --accordion-details-radius: var(--rounded-lg) var(--rounded-lg) 0 0;\n --accordion-summary-radius: 0 0 var(--rounded-lg) var(--rounded-lg);\n }\n\n @media (forced-colors: active) {\n /* Default variant uses a transparent border — ensure a visible border\n renders in HCM so the summary is distinguishable from the body */\n summary {\n border-color: ButtonText;\n }\n }\n}\n"],"mappings":""}
1
+ {"version":3,"file":"accordion-item.css.js","names":[],"sources":["../../../src/disclosure/accordion-item/accordion-item.css?inline"],"sourcesContent":["@layer refine.base {\n /* ========================================\n Base Styles & Defaults\n ======================================== */\n\n :host {\n --accordion-details-radius: var(--rounded-lg);\n --accordion-item-transition: var(--transition-normal);\n --accordion-item-expand-easing: var(--ease-spring);\n --accordion-item-row-duration: 200ms;\n --accordion-item-fade-duration: 200ms;\n --accordion-item-fade-delay: 60ms;\n --accordion-item-collapse-delay: 120ms;\n display: block;\n color: var(--accordion-item-body-color, var(--text-color-body));\n }\n\n details {\n width: 100%;\n border-radius: var(--accordion-item-radius);\n }\n\n summary {\n position: relative;\n display: flex;\n gap: var(--size-4);\n align-items: center;\n min-height: var(--_touch-target);\n padding: var(--accordion-item-details-padding, var(--size-3) var(--size-4));\n font-size: var(--accordion-item-title);\n cursor: pointer;\n user-select: none;\n outline: none;\n list-style: none;\n background: var(--accordion-item-bg);\n border: var(--border) solid var(--accordion-item-border-color);\n border-radius: var(--accordion-details-radius);\n transition:\n background var(--accordion-item-transition),\n border-color var(--accordion-item-transition),\n color var(--accordion-item-transition);\n }\n\n summary::-webkit-details-marker {\n display: none;\n }\n\n summary:focus {\n outline: none;\n }\n\n summary:focus-visible {\n outline: var(--border-2) solid currentcolor;\n outline-offset: var(--border-2);\n box-shadow: 0 0 0 3px color-mix(in oklch, currentcolor 20%, transparent);\n }\n\n .header-content {\n display: flex;\n flex: 1;\n flex-direction: column;\n min-width: 0;\n }\n\n .subtitle {\n font-size: var(--accordion-item-subtitle-size);\n line-height: var(--leading-normal);\n color: var(--accordion-item-subtitle-color, var(--text-color-secondary));\n }\n\n .title {\n overflow: hidden;\n text-overflow: ellipsis;\n font-weight: var(--font-medium);\n color: var(--accordion-item-title-color, var(--text-color-heading));\n white-space: nowrap;\n }\n\n .content-wrapper {\n display: grid;\n grid-template-rows: 0fr;\n font-size: var(--accordion-item-body);\n background: var(--accordion-item-bg);\n border-inline: 1px solid var(--accordion-item-border-color);\n border-bottom: 1px solid var(--accordion-item-border-color);\n border-radius: var(--accordion-summary-radius);\n transition: grid-template-rows var(--accordion-item-row-duration)\n var(--accordion-item-expand-easing, var(--ease-spring));\n }\n\n details[open] .content-wrapper {\n grid-template-rows: 1fr;\n }\n\n .content-inner {\n padding: var(--accordion-item-summary-padding, var(--size-2) var(--size-4));\n overflow: hidden;\n opacity: 1;\n transform: translateY(0);\n transition:\n opacity var(--accordion-item-fade-duration) var(--accordion-item-fade-delay) var(--ease-spring),\n transform var(--accordion-item-fade-duration) var(--accordion-item-fade-delay) var(--ease-spring);\n }\n\n /* Opening: set from-state with no transition: transition fires on base rule when class is removed */\n details.opening .content-inner {\n opacity: 0;\n transform: translateY(-6px);\n transition: none;\n }\n\n /* Closing: content fades out immediately, row collapses after */\n details.closing .content-inner {\n opacity: 0;\n transform: translateY(-4px);\n transition:\n opacity 150ms var(--ease-spring),\n transform 150ms var(--ease-spring);\n }\n\n /* Keep row expanded while closing animation plays */\n details.closing .content-wrapper {\n grid-template-rows: 1fr;\n transition: grid-template-rows var(--accordion-item-row-duration) var(--accordion-item-collapse-delay)\n var(--accordion-item-expand-easing, var(--ease-spring));\n }\n}\n\n@layer refine.variants {\n /* ========================================\n Visual Variants\n ======================================== */\n\n :host,\n :host([variant='solid']) {\n --accordion-item-bg: var(--color-contrast-50);\n --accordion-item-border-color: transparent;\n --accordion-item-hover-bg: var(--color-contrast-200);\n }\n\n :host([variant='flat']) {\n --accordion-item-bg: var(--color-contrast-100);\n --accordion-item-hover-bg: var(--color-contrast-200);\n }\n\n :host([variant='bordered']) {\n --accordion-item-bg: var(--color-contrast-100);\n --accordion-item-border-color: var(--color-divider);\n --accordion-item-hover-bg: var(--color-contrast-200);\n\n box-shadow: var(--inset-shadow-xs), var(--shadow-2xs);\n }\n\n :host([variant='outline']) {\n --accordion-item-bg: transparent;\n --accordion-item-border-color: var(--color-divider);\n --accordion-item-hover-bg: var(--color-contrast-300);\n }\n\n :host([variant='ghost']) {\n --accordion-item-bg: transparent;\n --accordion-item-border-color: transparent;\n --accordion-item-hover-bg: var(--color-contrast-200);\n }\n\n :host([variant='text']) {\n --accordion-item-bg: transparent;\n --accordion-item-border-color: transparent;\n --accordion-item-hover-bg: transparent;\n }\n\n /* ── Shared hover state reads per-variant --accordion-item-hover-bg ── */\n :host summary:hover {\n background: var(--accordion-item-hover-bg);\n }\n\n :host([variant='frost']) details {\n border-radius: inherit;\n }\n\n :host([variant='frost']) summary {\n border-radius: inherit;\n backdrop-filter: blur(var(--blur-lg)) saturate(180%);\n }\n\n :host([variant='frost']) .content-wrapper {\n border-radius: 0;\n backdrop-filter: blur(var(--blur-lg)) saturate(180%);\n }\n\n /* Frost */\n :host([variant='frost']) {\n --accordion-item-bg: color-mix(in oklch, var(--color-canvas) 55%, transparent);\n --accordion-item-border-color: transparent;\n --accordion-item-hover-bg: color-mix(in oklch, var(--color-canvas) 20%, transparent);\n }\n\n :host([variant='frost']) summary {\n text-shadow: var(--text-shadow-2xs);\n }\n\n /* ========================================\n Size Variants\n ======================================== */\n\n :host([size='sm']) {\n --accordion-item-details-padding: var(--size-2) var(--size-4);\n --accordion-item-summary-padding: var(--size-1) var(--size-5);\n --accordion-item-title: var(--text-sm);\n --accordion-item-subtitle-size: var(--text-xs);\n --accordion-item-body: var(--text-xs);\n }\n\n :host(:not([size])),\n :host([size='md']) {\n --accordion-item-details-padding: var(--size-3) var(--size-4);\n --accordion-item-summary-padding: var(--size-1) var(--size-5);\n --accordion-item-title: var(--text-base);\n --accordion-item-subtitle-size: var(--text-sm);\n --accordion-item-body: var(--text-sm);\n }\n\n :host([size='lg']) {\n --accordion-item-details-padding: var(--size-4) var(--size-4);\n --accordion-item-summary-padding: var(--size-1) var(--size-5);\n --accordion-item-title: var(--text-lg);\n --accordion-item-subtitle-size: var(--text-base);\n --accordion-item-body: var(--text-base);\n }\n\n /* ─── coarse pointer: promote one size tier for proportional scaling ─── */\n @media (pointer: coarse) {\n :host,\n :host([size='md']) {\n --accordion-item-details-padding: var(--size-4) var(--size-5);\n --accordion-item-title: var(--text-lg);\n --accordion-item-subtitle-size: var(--text-base);\n --accordion-item-body: var(--text-base);\n }\n\n :host([size='sm']) {\n --accordion-item-details-padding: var(--size-3) var(--size-4);\n --accordion-item-title: var(--text-base);\n --accordion-item-subtitle-size: var(--text-sm);\n --accordion-item-body: var(--text-sm);\n }\n }\n\n /* ========================================\n States\n ======================================== */\n\n :host([disabled]) {\n pointer-events: none;\n opacity: 0.6;\n }\n\n /* ========================================\n Chevron Animation\n ======================================== */\n\n .chevron {\n --ore-icon-size: var(--_size, var(--size-5));\n width: var(--_size, var(--size-5));\n height: var(--_size, var(--size-5));\n\n margin-inline-start: auto;\n transform: rotate(-90deg);\n transition: transform var(--accordion-item-row-duration) var(--ease-spring);\n }\n\n details[open] .chevron {\n transform: rotate(0deg);\n }\n\n /* RTL Support - use .rtl class added by JavaScript */\n details.rtl .chevron {\n transform: rotate(90deg);\n }\n\n details.rtl[open] .chevron {\n transform: rotate(0deg);\n }\n\n /* :dir(rtl) is inheritance-driven and crosses the shadow boundary; the ancestor-attribute\n selectors (html[dir='rtl']/[dir='rtl']) cannot match anything inside this shadow root and\n were removed. */\n :dir(rtl) .chevron {\n transform: rotate(90deg);\n }\n\n :dir(rtl) details[open] .chevron {\n transform: rotate(0deg);\n }\n\n /* Expanded state - adjust border radius */\n :host([expanded]) {\n --accordion-details-radius: var(--rounded-lg) var(--rounded-lg) 0 0;\n --accordion-summary-radius: 0 0 var(--rounded-lg) var(--rounded-lg);\n }\n\n @media (forced-colors: active) {\n /* Default variant uses a transparent border: ensure a visible border\n renders in HCM so the summary is distinguishable from the body */\n summary {\n border-color: ButtonText;\n }\n }\n}\n"],"mappings":""}
@@ -10,7 +10,7 @@ export type OreTabItemProps = {
10
10
  density?: 'compact' | 'default';
11
11
  /** Size (inherited from ore-tabs) */
12
12
  size?: ComponentSize;
13
- /** Unique value identifier — must match a ore-tab-panel value */
13
+ /** Unique value identifier: must match a ore-tab-panel value */
14
14
  value: string;
15
15
  /** Visual variant (inherited from ore-tabs) */
16
16
  variant?: VisualVariant;
@@ -1 +1 @@
1
- {"version":3,"file":"tab-item.d.ts","sourceRoot":"","sources":["../../../src/disclosure/tab-item/tab-item.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAI5E,MAAM,MAAM,eAAe,GAAG;IAC5B,+DAA+D;IAC/D,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,4CAA4C;IAC5C,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,uBAAuB;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gDAAgD;IAChD,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAChC,qCAAqC;IACrC,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,iEAAiE;IACjE,KAAK,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,eAAO,MAAM,YAAY,EAAG,cAAuB,CAAC"}
1
+ {"version":3,"file":"tab-item.d.ts","sourceRoot":"","sources":["../../../src/disclosure/tab-item/tab-item.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAI5E,MAAM,MAAM,eAAe,GAAG;IAC5B,+DAA+D;IAC/D,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,4CAA4C;IAC5C,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,uBAAuB;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gDAAgD;IAChD,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAChC,qCAAqC;IACrC,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,gEAAgE;IAChE,KAAK,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,eAAO,MAAM,YAAY,EAAG,cAAuB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"drawer.cjs","names":[],"sources":["../src/overlay/drawer/drawer.ts"],"sourcesContent":["import { createPanGesture, type PanAxis, type PanGesture, type PanGestureEndDetail } from '@vielzeug/gesture';\nimport {\n createId,\n define,\n getHost,\n html,\n onCleanup,\n onEvent,\n onMounted,\n prop,\n ref,\n useEmit,\n useSlots,\n} from '@vielzeug/ore';\nimport { signal } from '@vielzeug/ripple';\n\nimport { type OverlayOpenChangeDetail, parseOptionalBool } from '../../core';\n\nimport { coarsePointerMixin, forcedColorsMixin, reducedMotionMixin } from '../../styles';\nimport { useDialogControl } from '../shared/use-dialog';\nimport styles from './drawer.css?inline';\n\nexport { ICON_TAG } from '../../content/icon/icon';\n\ntype DrawerPlacement = 'left' | 'right' | 'top' | 'bottom';\ntype DrawerSize = 'sm' | 'lg' | 'full';\ntype DrawerBackdrop = 'opaque' | 'blur' | 'transparent';\ntype DrawerDragHandlePlacement = 'outside' | 'inset';\ntype DrawerSwipeConfig = {\n axis: PanAxis;\n closingDistance: (distance: number) => number;\n translate: (distance: number) => string;\n};\n\nconst drawerSwipeConfig: Record<DrawerPlacement, DrawerSwipeConfig> = {\n bottom: {\n axis: 'y',\n closingDistance: (distance) => Math.max(0, distance),\n translate: (distance) => `translateY(${distance}px)`,\n },\n left: {\n axis: 'x',\n closingDistance: (distance) => Math.max(0, -distance),\n translate: (distance) => `translateX(${distance}px)`,\n },\n right: {\n axis: 'x',\n closingDistance: (distance) => Math.max(0, distance),\n translate: (distance) => `translateX(${distance}px)`,\n },\n top: {\n axis: 'y',\n closingDistance: (distance) => Math.max(0, -distance),\n translate: (distance) => `translateY(${distance}px)`,\n },\n};\n\n/** Element interface exposing the imperative API for `ore-drawer`. */\nexport interface DrawerElement extends HTMLElement, Omit<OreDrawerProps, 'title'> {\n /** Programmatically close the drawer with the exit animation. */\n hide(): void;\n /** Programmatically open the drawer. Equivalent to setting `open`. */\n show(): void;\n}\n\n/** Drawer component properties */\n\nexport type OreDrawerEvents = {\n 'open-change': OverlayOpenChangeDetail;\n};\n\nexport type OreDrawerProps = {\n /** Backdrop style — 'opaque' (default), 'blur', or 'transparent' */\n backdrop?: DrawerBackdrop;\n /** Initial uncontrolled open state. Ignored when `open` is set. */\n 'default-open'?: boolean;\n /** Show the close (×) button in the header (default: true) */\n dismissible?: boolean;\n /** Drag handle position used for swipe-to-close gestures */\n 'drag-handle-placement'?: DrawerDragHandlePlacement;\n /**\n * CSS selector for the element inside the drawer that should receive focus on open.\n * Defaults to native dialog focus management (first focusable element).\n * @example '#submit-btn' | 'input[name=\"email\"]'\n */\n 'initial-focus'?: string;\n /**\n * Invisible accessible label for the dialog (`aria-label`).\n * Use when the drawer has no visible title (e.g. image-only content).\n * When omitted, `aria-labelledby` points to the visible header title instead.\n */\n label?: string;\n /** Controlled open state */\n open?: boolean;\n /** When true, backdrop clicks do not close the drawer (default: false) */\n persistent?: boolean;\n /** Side from which the drawer slides in */\n placement?: DrawerPlacement;\n /**\n * When true (default), focus returns to the triggering element after the drawer closes.\n * Set to false to manage focus manually.\n */\n 'return-focus'?: boolean;\n /** Drawer width/height preset */\n size?: DrawerSize;\n /**\n * Visible title text rendered inside the header.\n * Used as the dialog's accessible label via `aria-labelledby` when `label` is not set.\n */\n title?: string;\n};\n\n/**\n * A panel that slides in from any edge of the screen, built on the native `<dialog>` element.\n *\n * @element ore-drawer\n *\n * @attr {boolean} open - Controlled open state\n * @attr {boolean} default-open - Initial uncontrolled open state\n * @attr {string} placement - 'left' | 'right' (default) | 'top' | 'bottom'\n * @attr {string} size - 'sm' | 'lg' | 'full'\n * @attr {string} title - Visible header title text\n * @attr {string} label - Invisible aria-label (for drawers without a visible title)\n * @attr {boolean} dismissible - Show the close (×) button (default: true)\n * @attr {string} drag-handle-placement - 'outside' (default) | 'inset'\n * @attr {string} backdrop - Backdrop style: 'opaque' (default) | 'blur' | 'transparent'\n * @attr {boolean} persistent - Prevent backdrop-click from closing (default: false)\n *\n * @fires open-change - When the drawer state changes. detail: { open, reason }\n *\n * @slot header - Drawer header content\n * @slot - Main body content\n * @slot footer - Drawer footer content\n *\n * @cssprop --drawer-backdrop-bg - Backdrop background color\n * @cssprop --drawer-bg - Panel background color\n * @cssprop --drawer-size - Panel width (horizontal) or height (vertical)\n * @cssprop --drawer-shadow - Panel box-shadow\n * @cssprop --drawer-panel-blur - Panel backdrop blur amount\n *\n * @part drag-handle - Drawer drag handle.\n * @part panel - Panel container.\n * @part header - Header container.\n * @part close-btn - Close button.\n * @part body - Body content container.\n * @part footer - Footer container.\n * @example\n * ```html\n * <!-- With visible title -->\n * <ore-drawer open title=\"Settings\" placement=\"right\">\n * <p>Settings content here.</p>\n * </ore-drawer>\n *\n * <!-- With custom header slot -->\n * <ore-drawer open placement=\"right\">\n * <span slot=\"header\">Settings</span>\n * <p>Settings content here.</p>\n * </ore-drawer>\n * ```\n */\n\nexport const DRAWER_TAG = 'ore-drawer' as const;\ndefine<OreDrawerProps>(DRAWER_TAG, {\n props: {\n backdrop: prop.string<DrawerBackdrop>(),\n 'default-open': prop.bool(false),\n dismissible: prop.bool(true),\n 'drag-handle-placement': prop.oneOf(['outside', 'inset'] as const, 'outside'),\n 'initial-focus': prop.string(),\n label: prop.string(),\n open: { default: undefined as boolean | undefined, parse: parseOptionalBool },\n persistent: prop.bool(false),\n placement: prop.oneOf(['left', 'right', 'top', 'bottom'] as const, 'right'),\n 'return-focus': prop.bool(true),\n size: prop.string<DrawerSize>(),\n title: prop.string(),\n },\n setup(props) {\n const el = getHost();\n const emit = useEmit<OreDrawerEvents>();\n const slots = useSlots();\n\n const drawerLabelId = createId('drawer-label');\n const dialogRef = ref<HTMLDialogElement>();\n const panelRef = ref<HTMLDivElement>();\n\n // Drag-to-close state\n const isSwipeClosing = signal(false);\n let swipe: PanGesture | undefined;\n let swipeCloseTimer: ReturnType<typeof setTimeout> | undefined;\n\n const getHeaderText = () => props.label.value ?? props.title.value ?? '';\n const hasHeaderTitle = () => slots.has('header').value || !!getHeaderText();\n\n // Header is visible when there is slot content, a text label, or a close button.\n const hasHeader = () => hasHeaderTitle() || props.dismissible.value;\n const hasFooter = () => slots.has('footer').value;\n\n const getPlacement = (): DrawerPlacement => props.placement.value || 'right';\n\n const getSwipeConfig = (): DrawerSwipeConfig => drawerSwipeConfig[getPlacement()];\n\n const getSnapThreshold = (panel: HTMLElement, axis: PanAxis) => {\n const panelSize = axis === 'x' ? panel.offsetWidth : panel.offsetHeight;\n\n return Math.min(96, Math.max(36, panelSize * 0.18));\n };\n\n const shouldCommitSwipeClose = (distance: number, threshold: number) => {\n return getSwipeConfig().closingDistance(distance) >= threshold;\n };\n\n const finalizeSwipeClose = (panel: HTMLElement) => {\n if (!isSwipeClosing.value) return;\n\n if (swipeCloseTimer) {\n clearTimeout(swipeCloseTimer);\n swipeCloseTimer = undefined;\n }\n\n const dialog = dialogRef.value;\n\n if (!dialog) {\n isSwipeClosing.value = false;\n\n return;\n }\n\n dialog.style.transition = 'none';\n panel.style.opacity = '0';\n panel.style.visibility = 'hidden';\n void dialog.offsetWidth;\n\n requestClose('swipe');\n };\n\n const startSwipeClose = (panel: HTMLElement, swipe: DrawerSwipeConfig, committedDistance: number) => {\n if (isSwipeClosing.value) return;\n\n isSwipeClosing.value = true;\n\n const panelSize = swipe.axis === 'x' ? panel.offsetWidth : panel.offsetHeight;\n // Preserve overshoot so closing continues from the dragged position instead of snapping back.\n const exitDistance =\n committedDistance >= 0 ? Math.max(committedDistance, panelSize) : Math.min(committedDistance, -panelSize);\n const exitTransform = swipe.translate(exitDistance);\n\n // Commit the current drag position first so the magnetic snap continues\n // from the finger instead of jumping back to rest.\n panel.style.transition = 'transform 180ms cubic-bezier(0.2, 0.9, 0.2, 1), opacity 180ms ease-out';\n void panel.offsetWidth;\n\n const onExitTransitionEnd = (ev: TransitionEvent) => {\n if (ev.target !== panel || ev.propertyName !== 'transform') return;\n\n panel.removeEventListener('transitionend', onExitTransitionEnd);\n finalizeSwipeClose(panel);\n };\n\n panel.addEventListener('transitionend', onExitTransitionEnd);\n\n const durationMs = parseFloat(getComputedStyle(panel).transitionDuration) * 1000;\n\n swipeCloseTimer = setTimeout(() => {\n panel.removeEventListener('transitionend', onExitTransitionEnd);\n finalizeSwipeClose(panel);\n }, durationMs + 50);\n\n panel.style.transform = exitTransform;\n panel.style.opacity = '0.2';\n };\n\n const resetPanelDragStyles = (panel: HTMLElement) => {\n if (swipeCloseTimer) {\n clearTimeout(swipeCloseTimer);\n swipeCloseTimer = undefined;\n }\n\n // Re-enable transitions so the snap-back or exit animates.\n panel.style.transition = '';\n panel.style.transform = '';\n panel.style.opacity = '';\n panel.style.visibility = '';\n isSwipeClosing.value = false;\n };\n\n const handleSwipeEnd = ({ distance, reason }: PanGestureEndDetail): void => {\n const panel = panelRef.value;\n\n if (!panel) return;\n\n const threshold = getSnapThreshold(panel, getSwipeConfig().axis);\n\n if (reason === 'release' && shouldCommitSwipeClose(distance, threshold)) {\n startSwipeClose(panel, getSwipeConfig(), distance);\n\n return;\n }\n\n resetPanelDragStyles(panel);\n };\n\n // ────────────────────────────────────────────────────────────────\n // Overlay State Management\n // ────────────────────────────────────────────────────────────────\n\n const { closeWithAnimation, mount, overlay, requestClose } = useDialogControl({\n beforeOpen: (dialog) => {\n // Clear any inline drag styles from a previous swipe-close so the CSS\n // entry animation starts from the correct base state.\n const panel = panelRef.value;\n\n if (panel) resetPanelDragStyles(panel);\n\n void dialog;\n },\n closeRequestDetail: (_reason) => ({ placement: props.placement.value ?? 'right' }),\n defaultOpen: props['default-open'],\n dialogRef,\n getPanelEl: () => panelRef.value,\n host: el,\n initialFocus: props['initial-focus'],\n isPersistent: () => Boolean(props.persistent.value),\n onCleanup,\n onEvent,\n onNativeClose: (reason) => {\n const panelEl = panelRef.value;\n\n // For swipe-close, keep the panel hidden and off-screen until the next\n // open cycle — resetting inline styles during native close can produce\n // a visible frame at the rest position on some browsers.\n if (panelEl && reason !== 'swipe') resetPanelDragStyles(panelEl);\n\n const dialog = dialogRef.value;\n\n if (dialog) dialog.style.transition = '';\n\n emit('open-change', { open: false, reason });\n },\n onOpen: (reason) => emit('open-change', { open: true, reason }),\n openProp: props.open,\n performClose: (dialog, reason) => {\n if (reason === 'swipe') {\n dialog.close();\n } else {\n closeWithAnimation();\n }\n },\n returnFocus: props['return-focus'],\n });\n\n const handleCloseButtonClick = () => {\n requestClose('trigger');\n };\n\n // ────────────────────────────────────────────────────────────────\n // Lifecycle: Setup Drawer Integration\n // ────────────────────────────────────────────────────────────────\n\n onMounted(() => {\n const dialog = dialogRef.value;\n\n if (!dialog) return;\n\n // Expose imperative API\n const drawerEl = el as DrawerElement;\n\n drawerEl.show = () => {\n overlay.open('programmatic');\n };\n\n drawerEl.hide = () => {\n overlay.close('programmatic');\n };\n\n // ────────────────────────────────────────────────────────────\n // Event Handlers: Backdrop Click\n // ────────────────────────────────────────────────────────────\n // `mount()` registers the open-prop watcher and the shared native\n // `close`/`cancel` handling (Escape). Drawer registers only its own\n // backdrop-click handler on top, since swipe-to-dismiss adds guards the\n // shared `handleBackdropClick` doesn't know about.\n\n const handleBackdropClick = (e: MouseEvent) => {\n if (props.persistent.value) return;\n\n if (swipe?.active || isSwipeClosing.value) return;\n\n if (e.target !== dialog) return; // Click inside panel\n\n requestClose('outsideClick');\n };\n\n mount();\n\n onEvent(dialog, 'click', handleBackdropClick);\n\n // Drag-to-close handlers — scoped to the handle element only so interactions\n // with panel content don't accidentally start a drag.\n const panel = panelRef.value;\n const dragHandleEl = panel?.querySelector<HTMLElement>('[part=\"drag-handle\"]');\n\n if (dragHandleEl) {\n swipe = createPanGesture(dragHandleEl, {\n axis: () => getSwipeConfig().axis,\n disabled: () => isSwipeClosing.value,\n onEnd: handleSwipeEnd,\n onMove: ({ distance }) => {\n const currentPanel = panelRef.value;\n\n if (!currentPanel) return;\n\n const swipeConfig = getSwipeConfig();\n const threshold = getSnapThreshold(currentPanel, swipeConfig.axis);\n const closingDistance = swipeConfig.closingDistance(distance);\n const progress = Math.min(closingDistance / threshold, 1);\n\n currentPanel.style.transition = 'none';\n currentPanel.style.transform = swipeConfig.translate(distance);\n currentPanel.style.opacity = String(1 - progress * 0.4);\n },\n });\n }\n\n return () => {\n swipe?.dispose();\n swipe = undefined;\n overlay.dispose();\n };\n });\n\n return html`\n <dialog\n ref=${dialogRef}\n aria-modal=\"true\"\n aria-label=\"${() => props.label.value ?? null}\"\n aria-labelledby=\"${() => (!props.label.value ? drawerLabelId : null)}\">\n <div class=\"panel\" part=\"panel\" ref=${panelRef}>\n <div class=\"drag-handle\" part=\"drag-handle\" aria-label=\"Drag to close\" role=\"button\"></div>\n <div class=\"header\" part=\"header\" ?hidden=${() => !hasHeader()}>\n <span class=\"header-title\" id=\"${drawerLabelId}\" ?hidden=${() => !hasHeaderTitle()}>\n <slot name=\"header\">${() => getHeaderText()}</slot>\n </span>\n <button\n class=\"close-btn\"\n part=\"close-btn\"\n type=\"button\"\n aria-label=\"Close\"\n ?hidden=${() => !props.dismissible.value}\n @click=${handleCloseButtonClick}>\n <ore-icon name=\"x\" size=\"16\" stroke-width=\"2.5\" aria-hidden=\"true\"></ore-icon>\n </button>\n </div>\n <div class=\"body\" part=\"body\">\n <slot></slot>\n </div>\n <div class=\"footer\" part=\"footer\" ?hidden=${() => !hasFooter()}>\n <slot name=\"footer\"></slot>\n </div>\n </div>\n </dialog>\n `;\n },\n styles: [forcedColorsMixin, coarsePointerMixin, reducedMotionMixin, styles],\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"drawer.cjs","names":[],"sources":["../src/overlay/drawer/drawer.ts"],"sourcesContent":["import { createPanGesture, type PanAxis, type PanGesture, type PanGestureEndDetail } from '@vielzeug/gesture';\nimport {\n createId,\n define,\n getHost,\n html,\n onCleanup,\n onEvent,\n onMounted,\n prop,\n ref,\n useEmit,\n useSlots,\n} from '@vielzeug/ore';\nimport { signal } from '@vielzeug/ripple';\n\nimport { type OverlayOpenChangeDetail, parseOptionalBool } from '../../core';\n\nimport { coarsePointerMixin, forcedColorsMixin, reducedMotionMixin } from '../../styles';\nimport { useDialogControl } from '../shared/use-dialog';\nimport styles from './drawer.css?inline';\n\nexport { ICON_TAG } from '../../content/icon/icon';\n\ntype DrawerPlacement = 'left' | 'right' | 'top' | 'bottom';\ntype DrawerSize = 'sm' | 'lg' | 'full';\ntype DrawerBackdrop = 'opaque' | 'blur' | 'transparent';\ntype DrawerDragHandlePlacement = 'outside' | 'inset';\ntype DrawerSwipeConfig = {\n axis: PanAxis;\n closingDistance: (distance: number) => number;\n translate: (distance: number) => string;\n};\n\nconst drawerSwipeConfig: Record<DrawerPlacement, DrawerSwipeConfig> = {\n bottom: {\n axis: 'y',\n closingDistance: (distance) => Math.max(0, distance),\n translate: (distance) => `translateY(${distance}px)`,\n },\n left: {\n axis: 'x',\n closingDistance: (distance) => Math.max(0, -distance),\n translate: (distance) => `translateX(${distance}px)`,\n },\n right: {\n axis: 'x',\n closingDistance: (distance) => Math.max(0, distance),\n translate: (distance) => `translateX(${distance}px)`,\n },\n top: {\n axis: 'y',\n closingDistance: (distance) => Math.max(0, -distance),\n translate: (distance) => `translateY(${distance}px)`,\n },\n};\n\n/** Element interface exposing the imperative API for `ore-drawer`. */\nexport interface DrawerElement extends HTMLElement, Omit<OreDrawerProps, 'title'> {\n /** Programmatically close the drawer with the exit animation. */\n hide(): void;\n /** Programmatically open the drawer. Equivalent to setting `open`. */\n show(): void;\n}\n\n/** Drawer component properties */\n\nexport type OreDrawerEvents = {\n 'open-change': OverlayOpenChangeDetail;\n};\n\nexport type OreDrawerProps = {\n /** Backdrop style: 'opaque' (default), 'blur', or 'transparent' */\n backdrop?: DrawerBackdrop;\n /** Initial uncontrolled open state. Ignored when `open` is set. */\n 'default-open'?: boolean;\n /** Show the close (×) button in the header (default: true) */\n dismissible?: boolean;\n /** Drag handle position used for swipe-to-close gestures */\n 'drag-handle-placement'?: DrawerDragHandlePlacement;\n /**\n * CSS selector for the element inside the drawer that should receive focus on open.\n * Defaults to native dialog focus management (first focusable element).\n * @example '#submit-btn' | 'input[name=\"email\"]'\n */\n 'initial-focus'?: string;\n /**\n * Invisible accessible label for the dialog (`aria-label`).\n * Use when the drawer has no visible title (e.g. image-only content).\n * When omitted, `aria-labelledby` points to the visible header title instead.\n */\n label?: string;\n /** Controlled open state */\n open?: boolean;\n /** When true, backdrop clicks do not close the drawer (default: false) */\n persistent?: boolean;\n /** Side from which the drawer slides in */\n placement?: DrawerPlacement;\n /**\n * When true (default), focus returns to the triggering element after the drawer closes.\n * Set to false to manage focus manually.\n */\n 'return-focus'?: boolean;\n /** Drawer width/height preset */\n size?: DrawerSize;\n /**\n * Visible title text rendered inside the header.\n * Used as the dialog's accessible label via `aria-labelledby` when `label` is not set.\n */\n title?: string;\n};\n\n/**\n * A panel that slides in from any edge of the screen, built on the native `<dialog>` element.\n *\n * @element ore-drawer\n *\n * @attr {boolean} open - Controlled open state\n * @attr {boolean} default-open - Initial uncontrolled open state\n * @attr {string} placement - 'left' | 'right' (default) | 'top' | 'bottom'\n * @attr {string} size - 'sm' | 'lg' | 'full'\n * @attr {string} title - Visible header title text\n * @attr {string} label - Invisible aria-label (for drawers without a visible title)\n * @attr {boolean} dismissible - Show the close (×) button (default: true)\n * @attr {string} drag-handle-placement - 'outside' (default) | 'inset'\n * @attr {string} backdrop - Backdrop style: 'opaque' (default) | 'blur' | 'transparent'\n * @attr {boolean} persistent - Prevent backdrop-click from closing (default: false)\n *\n * @fires open-change - When the drawer state changes. detail: { open, reason }\n *\n * @slot header - Drawer header content\n * @slot - Main body content\n * @slot footer - Drawer footer content\n *\n * @cssprop --drawer-backdrop-bg - Backdrop background color\n * @cssprop --drawer-bg - Panel background color\n * @cssprop --drawer-size - Panel width (horizontal) or height (vertical)\n * @cssprop --drawer-shadow - Panel box-shadow\n * @cssprop --drawer-panel-blur - Panel backdrop blur amount\n *\n * @part drag-handle - Drawer drag handle.\n * @part panel - Panel container.\n * @part header - Header container.\n * @part close-btn - Close button.\n * @part body - Body content container.\n * @part footer - Footer container.\n * @example\n * ```html\n * <!-- With visible title -->\n * <ore-drawer open title=\"Settings\" placement=\"right\">\n * <p>Settings content here.</p>\n * </ore-drawer>\n *\n * <!-- With custom header slot -->\n * <ore-drawer open placement=\"right\">\n * <span slot=\"header\">Settings</span>\n * <p>Settings content here.</p>\n * </ore-drawer>\n * ```\n */\n\nexport const DRAWER_TAG = 'ore-drawer' as const;\ndefine<OreDrawerProps>(DRAWER_TAG, {\n props: {\n backdrop: prop.string<DrawerBackdrop>(),\n 'default-open': prop.bool(false),\n dismissible: prop.bool(true),\n 'drag-handle-placement': prop.oneOf(['outside', 'inset'] as const, 'outside'),\n 'initial-focus': prop.string(),\n label: prop.string(),\n open: { default: undefined as boolean | undefined, parse: parseOptionalBool },\n persistent: prop.bool(false),\n placement: prop.oneOf(['left', 'right', 'top', 'bottom'] as const, 'right'),\n 'return-focus': prop.bool(true),\n size: prop.string<DrawerSize>(),\n title: prop.string(),\n },\n setup(props) {\n const el = getHost();\n const emit = useEmit<OreDrawerEvents>();\n const slots = useSlots();\n\n const drawerLabelId = createId('drawer-label');\n const dialogRef = ref<HTMLDialogElement>();\n const panelRef = ref<HTMLDivElement>();\n\n // Drag-to-close state\n const isSwipeClosing = signal(false);\n let swipe: PanGesture | undefined;\n let swipeCloseTimer: ReturnType<typeof setTimeout> | undefined;\n\n const getHeaderText = () => props.label.value ?? props.title.value ?? '';\n const hasHeaderTitle = () => slots.has('header').value || !!getHeaderText();\n\n // Header is visible when there is slot content, a text label, or a close button.\n const hasHeader = () => hasHeaderTitle() || props.dismissible.value;\n const hasFooter = () => slots.has('footer').value;\n\n const getPlacement = (): DrawerPlacement => props.placement.value || 'right';\n\n const getSwipeConfig = (): DrawerSwipeConfig => drawerSwipeConfig[getPlacement()];\n\n const getSnapThreshold = (panel: HTMLElement, axis: PanAxis) => {\n const panelSize = axis === 'x' ? panel.offsetWidth : panel.offsetHeight;\n\n return Math.min(96, Math.max(36, panelSize * 0.18));\n };\n\n const shouldCommitSwipeClose = (distance: number, threshold: number) => {\n return getSwipeConfig().closingDistance(distance) >= threshold;\n };\n\n const finalizeSwipeClose = (panel: HTMLElement) => {\n if (!isSwipeClosing.value) return;\n\n if (swipeCloseTimer) {\n clearTimeout(swipeCloseTimer);\n swipeCloseTimer = undefined;\n }\n\n const dialog = dialogRef.value;\n\n if (!dialog) {\n isSwipeClosing.value = false;\n\n return;\n }\n\n dialog.style.transition = 'none';\n panel.style.opacity = '0';\n panel.style.visibility = 'hidden';\n void dialog.offsetWidth;\n\n requestClose('swipe');\n };\n\n const startSwipeClose = (panel: HTMLElement, swipe: DrawerSwipeConfig, committedDistance: number) => {\n if (isSwipeClosing.value) return;\n\n isSwipeClosing.value = true;\n\n const panelSize = swipe.axis === 'x' ? panel.offsetWidth : panel.offsetHeight;\n // Preserve overshoot so closing continues from the dragged position instead of snapping back.\n const exitDistance =\n committedDistance >= 0 ? Math.max(committedDistance, panelSize) : Math.min(committedDistance, -panelSize);\n const exitTransform = swipe.translate(exitDistance);\n\n // Commit the current drag position first so the magnetic snap continues\n // from the finger instead of jumping back to rest.\n panel.style.transition = 'transform 180ms cubic-bezier(0.2, 0.9, 0.2, 1), opacity 180ms ease-out';\n void panel.offsetWidth;\n\n const onExitTransitionEnd = (ev: TransitionEvent) => {\n if (ev.target !== panel || ev.propertyName !== 'transform') return;\n\n panel.removeEventListener('transitionend', onExitTransitionEnd);\n finalizeSwipeClose(panel);\n };\n\n panel.addEventListener('transitionend', onExitTransitionEnd);\n\n const durationMs = parseFloat(getComputedStyle(panel).transitionDuration) * 1000;\n\n swipeCloseTimer = setTimeout(() => {\n panel.removeEventListener('transitionend', onExitTransitionEnd);\n finalizeSwipeClose(panel);\n }, durationMs + 50);\n\n panel.style.transform = exitTransform;\n panel.style.opacity = '0.2';\n };\n\n const resetPanelDragStyles = (panel: HTMLElement) => {\n if (swipeCloseTimer) {\n clearTimeout(swipeCloseTimer);\n swipeCloseTimer = undefined;\n }\n\n // Re-enable transitions so the snap-back or exit animates.\n panel.style.transition = '';\n panel.style.transform = '';\n panel.style.opacity = '';\n panel.style.visibility = '';\n isSwipeClosing.value = false;\n };\n\n const handleSwipeEnd = ({ distance, reason }: PanGestureEndDetail): void => {\n const panel = panelRef.value;\n\n if (!panel) return;\n\n const threshold = getSnapThreshold(panel, getSwipeConfig().axis);\n\n if (reason === 'release' && shouldCommitSwipeClose(distance, threshold)) {\n startSwipeClose(panel, getSwipeConfig(), distance);\n\n return;\n }\n\n resetPanelDragStyles(panel);\n };\n\n // ────────────────────────────────────────────────────────────────\n // Overlay State Management\n // ────────────────────────────────────────────────────────────────\n\n const { closeWithAnimation, mount, overlay, requestClose } = useDialogControl({\n beforeOpen: (dialog) => {\n // Clear any inline drag styles from a previous swipe-close so the CSS\n // entry animation starts from the correct base state.\n const panel = panelRef.value;\n\n if (panel) resetPanelDragStyles(panel);\n\n void dialog;\n },\n closeRequestDetail: (_reason) => ({ placement: props.placement.value ?? 'right' }),\n defaultOpen: props['default-open'],\n dialogRef,\n getPanelEl: () => panelRef.value,\n host: el,\n initialFocus: props['initial-focus'],\n isPersistent: () => Boolean(props.persistent.value),\n onCleanup,\n onEvent,\n onNativeClose: (reason) => {\n const panelEl = panelRef.value;\n\n // For swipe-close, keep the panel hidden and off-screen until the next\n // open cycle: resetting inline styles during native close can produce\n // a visible frame at the rest position on some browsers.\n if (panelEl && reason !== 'swipe') resetPanelDragStyles(panelEl);\n\n const dialog = dialogRef.value;\n\n if (dialog) dialog.style.transition = '';\n\n emit('open-change', { open: false, reason });\n },\n onOpen: (reason) => emit('open-change', { open: true, reason }),\n openProp: props.open,\n performClose: (dialog, reason) => {\n if (reason === 'swipe') {\n dialog.close();\n } else {\n closeWithAnimation();\n }\n },\n returnFocus: props['return-focus'],\n });\n\n const handleCloseButtonClick = () => {\n requestClose('trigger');\n };\n\n // ────────────────────────────────────────────────────────────────\n // Lifecycle: Setup Drawer Integration\n // ────────────────────────────────────────────────────────────────\n\n onMounted(() => {\n const dialog = dialogRef.value;\n\n if (!dialog) return;\n\n // Expose imperative API\n const drawerEl = el as DrawerElement;\n\n drawerEl.show = () => {\n overlay.open('programmatic');\n };\n\n drawerEl.hide = () => {\n overlay.close('programmatic');\n };\n\n // ────────────────────────────────────────────────────────────\n // Event Handlers: Backdrop Click\n // ────────────────────────────────────────────────────────────\n // `mount()` registers the open-prop watcher and the shared native\n // `close`/`cancel` handling (Escape). Drawer registers only its own\n // backdrop-click handler on top, since swipe-to-dismiss adds guards the\n // shared `handleBackdropClick` doesn't know about.\n\n const handleBackdropClick = (e: MouseEvent) => {\n if (props.persistent.value) return;\n\n if (swipe?.active || isSwipeClosing.value) return;\n\n if (e.target !== dialog) return; // Click inside panel\n\n requestClose('outsideClick');\n };\n\n mount();\n\n onEvent(dialog, 'click', handleBackdropClick);\n\n // Drag-to-close handlers: scoped to the handle element only so interactions\n // with panel content don't accidentally start a drag.\n const panel = panelRef.value;\n const dragHandleEl = panel?.querySelector<HTMLElement>('[part=\"drag-handle\"]');\n\n if (dragHandleEl) {\n swipe = createPanGesture(dragHandleEl, {\n axis: () => getSwipeConfig().axis,\n disabled: () => isSwipeClosing.value,\n onEnd: handleSwipeEnd,\n onMove: ({ distance }) => {\n const currentPanel = panelRef.value;\n\n if (!currentPanel) return;\n\n const swipeConfig = getSwipeConfig();\n const threshold = getSnapThreshold(currentPanel, swipeConfig.axis);\n const closingDistance = swipeConfig.closingDistance(distance);\n const progress = Math.min(closingDistance / threshold, 1);\n\n currentPanel.style.transition = 'none';\n currentPanel.style.transform = swipeConfig.translate(distance);\n currentPanel.style.opacity = String(1 - progress * 0.4);\n },\n });\n }\n\n return () => {\n swipe?.dispose();\n swipe = undefined;\n overlay.dispose();\n };\n });\n\n return html`\n <dialog\n ref=${dialogRef}\n aria-modal=\"true\"\n aria-label=\"${() => props.label.value ?? null}\"\n aria-labelledby=\"${() => (!props.label.value ? drawerLabelId : null)}\">\n <div class=\"panel\" part=\"panel\" ref=${panelRef}>\n <div class=\"drag-handle\" part=\"drag-handle\" aria-label=\"Drag to close\" role=\"button\"></div>\n <div class=\"header\" part=\"header\" ?hidden=${() => !hasHeader()}>\n <span class=\"header-title\" id=\"${drawerLabelId}\" ?hidden=${() => !hasHeaderTitle()}>\n <slot name=\"header\">${() => getHeaderText()}</slot>\n </span>\n <button\n class=\"close-btn\"\n part=\"close-btn\"\n type=\"button\"\n aria-label=\"Close\"\n ?hidden=${() => !props.dismissible.value}\n @click=${handleCloseButtonClick}>\n <ore-icon name=\"x\" size=\"16\" stroke-width=\"2.5\" aria-hidden=\"true\"></ore-icon>\n </button>\n </div>\n <div class=\"body\" part=\"body\">\n <slot></slot>\n </div>\n <div class=\"footer\" part=\"footer\" ?hidden=${() => !hasFooter()}>\n <slot name=\"footer\"></slot>\n </div>\n </div>\n </dialog>\n `;\n },\n styles: [forcedColorsMixin, coarsePointerMixin, reducedMotionMixin, styles],\n});\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"drawer.js","names":[],"sources":["../src/overlay/drawer/drawer.ts"],"sourcesContent":["import { createPanGesture, type PanAxis, type PanGesture, type PanGestureEndDetail } from '@vielzeug/gesture';\nimport {\n createId,\n define,\n getHost,\n html,\n onCleanup,\n onEvent,\n onMounted,\n prop,\n ref,\n useEmit,\n useSlots,\n} from '@vielzeug/ore';\nimport { signal } from '@vielzeug/ripple';\n\nimport { type OverlayOpenChangeDetail, parseOptionalBool } from '../../core';\n\nimport { coarsePointerMixin, forcedColorsMixin, reducedMotionMixin } from '../../styles';\nimport { useDialogControl } from '../shared/use-dialog';\nimport styles from './drawer.css?inline';\n\nexport { ICON_TAG } from '../../content/icon/icon';\n\ntype DrawerPlacement = 'left' | 'right' | 'top' | 'bottom';\ntype DrawerSize = 'sm' | 'lg' | 'full';\ntype DrawerBackdrop = 'opaque' | 'blur' | 'transparent';\ntype DrawerDragHandlePlacement = 'outside' | 'inset';\ntype DrawerSwipeConfig = {\n axis: PanAxis;\n closingDistance: (distance: number) => number;\n translate: (distance: number) => string;\n};\n\nconst drawerSwipeConfig: Record<DrawerPlacement, DrawerSwipeConfig> = {\n bottom: {\n axis: 'y',\n closingDistance: (distance) => Math.max(0, distance),\n translate: (distance) => `translateY(${distance}px)`,\n },\n left: {\n axis: 'x',\n closingDistance: (distance) => Math.max(0, -distance),\n translate: (distance) => `translateX(${distance}px)`,\n },\n right: {\n axis: 'x',\n closingDistance: (distance) => Math.max(0, distance),\n translate: (distance) => `translateX(${distance}px)`,\n },\n top: {\n axis: 'y',\n closingDistance: (distance) => Math.max(0, -distance),\n translate: (distance) => `translateY(${distance}px)`,\n },\n};\n\n/** Element interface exposing the imperative API for `ore-drawer`. */\nexport interface DrawerElement extends HTMLElement, Omit<OreDrawerProps, 'title'> {\n /** Programmatically close the drawer with the exit animation. */\n hide(): void;\n /** Programmatically open the drawer. Equivalent to setting `open`. */\n show(): void;\n}\n\n/** Drawer component properties */\n\nexport type OreDrawerEvents = {\n 'open-change': OverlayOpenChangeDetail;\n};\n\nexport type OreDrawerProps = {\n /** Backdrop style — 'opaque' (default), 'blur', or 'transparent' */\n backdrop?: DrawerBackdrop;\n /** Initial uncontrolled open state. Ignored when `open` is set. */\n 'default-open'?: boolean;\n /** Show the close (×) button in the header (default: true) */\n dismissible?: boolean;\n /** Drag handle position used for swipe-to-close gestures */\n 'drag-handle-placement'?: DrawerDragHandlePlacement;\n /**\n * CSS selector for the element inside the drawer that should receive focus on open.\n * Defaults to native dialog focus management (first focusable element).\n * @example '#submit-btn' | 'input[name=\"email\"]'\n */\n 'initial-focus'?: string;\n /**\n * Invisible accessible label for the dialog (`aria-label`).\n * Use when the drawer has no visible title (e.g. image-only content).\n * When omitted, `aria-labelledby` points to the visible header title instead.\n */\n label?: string;\n /** Controlled open state */\n open?: boolean;\n /** When true, backdrop clicks do not close the drawer (default: false) */\n persistent?: boolean;\n /** Side from which the drawer slides in */\n placement?: DrawerPlacement;\n /**\n * When true (default), focus returns to the triggering element after the drawer closes.\n * Set to false to manage focus manually.\n */\n 'return-focus'?: boolean;\n /** Drawer width/height preset */\n size?: DrawerSize;\n /**\n * Visible title text rendered inside the header.\n * Used as the dialog's accessible label via `aria-labelledby` when `label` is not set.\n */\n title?: string;\n};\n\n/**\n * A panel that slides in from any edge of the screen, built on the native `<dialog>` element.\n *\n * @element ore-drawer\n *\n * @attr {boolean} open - Controlled open state\n * @attr {boolean} default-open - Initial uncontrolled open state\n * @attr {string} placement - 'left' | 'right' (default) | 'top' | 'bottom'\n * @attr {string} size - 'sm' | 'lg' | 'full'\n * @attr {string} title - Visible header title text\n * @attr {string} label - Invisible aria-label (for drawers without a visible title)\n * @attr {boolean} dismissible - Show the close (×) button (default: true)\n * @attr {string} drag-handle-placement - 'outside' (default) | 'inset'\n * @attr {string} backdrop - Backdrop style: 'opaque' (default) | 'blur' | 'transparent'\n * @attr {boolean} persistent - Prevent backdrop-click from closing (default: false)\n *\n * @fires open-change - When the drawer state changes. detail: { open, reason }\n *\n * @slot header - Drawer header content\n * @slot - Main body content\n * @slot footer - Drawer footer content\n *\n * @cssprop --drawer-backdrop-bg - Backdrop background color\n * @cssprop --drawer-bg - Panel background color\n * @cssprop --drawer-size - Panel width (horizontal) or height (vertical)\n * @cssprop --drawer-shadow - Panel box-shadow\n * @cssprop --drawer-panel-blur - Panel backdrop blur amount\n *\n * @part drag-handle - Drawer drag handle.\n * @part panel - Panel container.\n * @part header - Header container.\n * @part close-btn - Close button.\n * @part body - Body content container.\n * @part footer - Footer container.\n * @example\n * ```html\n * <!-- With visible title -->\n * <ore-drawer open title=\"Settings\" placement=\"right\">\n * <p>Settings content here.</p>\n * </ore-drawer>\n *\n * <!-- With custom header slot -->\n * <ore-drawer open placement=\"right\">\n * <span slot=\"header\">Settings</span>\n * <p>Settings content here.</p>\n * </ore-drawer>\n * ```\n */\n\nexport const DRAWER_TAG = 'ore-drawer' as const;\ndefine<OreDrawerProps>(DRAWER_TAG, {\n props: {\n backdrop: prop.string<DrawerBackdrop>(),\n 'default-open': prop.bool(false),\n dismissible: prop.bool(true),\n 'drag-handle-placement': prop.oneOf(['outside', 'inset'] as const, 'outside'),\n 'initial-focus': prop.string(),\n label: prop.string(),\n open: { default: undefined as boolean | undefined, parse: parseOptionalBool },\n persistent: prop.bool(false),\n placement: prop.oneOf(['left', 'right', 'top', 'bottom'] as const, 'right'),\n 'return-focus': prop.bool(true),\n size: prop.string<DrawerSize>(),\n title: prop.string(),\n },\n setup(props) {\n const el = getHost();\n const emit = useEmit<OreDrawerEvents>();\n const slots = useSlots();\n\n const drawerLabelId = createId('drawer-label');\n const dialogRef = ref<HTMLDialogElement>();\n const panelRef = ref<HTMLDivElement>();\n\n // Drag-to-close state\n const isSwipeClosing = signal(false);\n let swipe: PanGesture | undefined;\n let swipeCloseTimer: ReturnType<typeof setTimeout> | undefined;\n\n const getHeaderText = () => props.label.value ?? props.title.value ?? '';\n const hasHeaderTitle = () => slots.has('header').value || !!getHeaderText();\n\n // Header is visible when there is slot content, a text label, or a close button.\n const hasHeader = () => hasHeaderTitle() || props.dismissible.value;\n const hasFooter = () => slots.has('footer').value;\n\n const getPlacement = (): DrawerPlacement => props.placement.value || 'right';\n\n const getSwipeConfig = (): DrawerSwipeConfig => drawerSwipeConfig[getPlacement()];\n\n const getSnapThreshold = (panel: HTMLElement, axis: PanAxis) => {\n const panelSize = axis === 'x' ? panel.offsetWidth : panel.offsetHeight;\n\n return Math.min(96, Math.max(36, panelSize * 0.18));\n };\n\n const shouldCommitSwipeClose = (distance: number, threshold: number) => {\n return getSwipeConfig().closingDistance(distance) >= threshold;\n };\n\n const finalizeSwipeClose = (panel: HTMLElement) => {\n if (!isSwipeClosing.value) return;\n\n if (swipeCloseTimer) {\n clearTimeout(swipeCloseTimer);\n swipeCloseTimer = undefined;\n }\n\n const dialog = dialogRef.value;\n\n if (!dialog) {\n isSwipeClosing.value = false;\n\n return;\n }\n\n dialog.style.transition = 'none';\n panel.style.opacity = '0';\n panel.style.visibility = 'hidden';\n void dialog.offsetWidth;\n\n requestClose('swipe');\n };\n\n const startSwipeClose = (panel: HTMLElement, swipe: DrawerSwipeConfig, committedDistance: number) => {\n if (isSwipeClosing.value) return;\n\n isSwipeClosing.value = true;\n\n const panelSize = swipe.axis === 'x' ? panel.offsetWidth : panel.offsetHeight;\n // Preserve overshoot so closing continues from the dragged position instead of snapping back.\n const exitDistance =\n committedDistance >= 0 ? Math.max(committedDistance, panelSize) : Math.min(committedDistance, -panelSize);\n const exitTransform = swipe.translate(exitDistance);\n\n // Commit the current drag position first so the magnetic snap continues\n // from the finger instead of jumping back to rest.\n panel.style.transition = 'transform 180ms cubic-bezier(0.2, 0.9, 0.2, 1), opacity 180ms ease-out';\n void panel.offsetWidth;\n\n const onExitTransitionEnd = (ev: TransitionEvent) => {\n if (ev.target !== panel || ev.propertyName !== 'transform') return;\n\n panel.removeEventListener('transitionend', onExitTransitionEnd);\n finalizeSwipeClose(panel);\n };\n\n panel.addEventListener('transitionend', onExitTransitionEnd);\n\n const durationMs = parseFloat(getComputedStyle(panel).transitionDuration) * 1000;\n\n swipeCloseTimer = setTimeout(() => {\n panel.removeEventListener('transitionend', onExitTransitionEnd);\n finalizeSwipeClose(panel);\n }, durationMs + 50);\n\n panel.style.transform = exitTransform;\n panel.style.opacity = '0.2';\n };\n\n const resetPanelDragStyles = (panel: HTMLElement) => {\n if (swipeCloseTimer) {\n clearTimeout(swipeCloseTimer);\n swipeCloseTimer = undefined;\n }\n\n // Re-enable transitions so the snap-back or exit animates.\n panel.style.transition = '';\n panel.style.transform = '';\n panel.style.opacity = '';\n panel.style.visibility = '';\n isSwipeClosing.value = false;\n };\n\n const handleSwipeEnd = ({ distance, reason }: PanGestureEndDetail): void => {\n const panel = panelRef.value;\n\n if (!panel) return;\n\n const threshold = getSnapThreshold(panel, getSwipeConfig().axis);\n\n if (reason === 'release' && shouldCommitSwipeClose(distance, threshold)) {\n startSwipeClose(panel, getSwipeConfig(), distance);\n\n return;\n }\n\n resetPanelDragStyles(panel);\n };\n\n // ────────────────────────────────────────────────────────────────\n // Overlay State Management\n // ────────────────────────────────────────────────────────────────\n\n const { closeWithAnimation, mount, overlay, requestClose } = useDialogControl({\n beforeOpen: (dialog) => {\n // Clear any inline drag styles from a previous swipe-close so the CSS\n // entry animation starts from the correct base state.\n const panel = panelRef.value;\n\n if (panel) resetPanelDragStyles(panel);\n\n void dialog;\n },\n closeRequestDetail: (_reason) => ({ placement: props.placement.value ?? 'right' }),\n defaultOpen: props['default-open'],\n dialogRef,\n getPanelEl: () => panelRef.value,\n host: el,\n initialFocus: props['initial-focus'],\n isPersistent: () => Boolean(props.persistent.value),\n onCleanup,\n onEvent,\n onNativeClose: (reason) => {\n const panelEl = panelRef.value;\n\n // For swipe-close, keep the panel hidden and off-screen until the next\n // open cycle — resetting inline styles during native close can produce\n // a visible frame at the rest position on some browsers.\n if (panelEl && reason !== 'swipe') resetPanelDragStyles(panelEl);\n\n const dialog = dialogRef.value;\n\n if (dialog) dialog.style.transition = '';\n\n emit('open-change', { open: false, reason });\n },\n onOpen: (reason) => emit('open-change', { open: true, reason }),\n openProp: props.open,\n performClose: (dialog, reason) => {\n if (reason === 'swipe') {\n dialog.close();\n } else {\n closeWithAnimation();\n }\n },\n returnFocus: props['return-focus'],\n });\n\n const handleCloseButtonClick = () => {\n requestClose('trigger');\n };\n\n // ────────────────────────────────────────────────────────────────\n // Lifecycle: Setup Drawer Integration\n // ────────────────────────────────────────────────────────────────\n\n onMounted(() => {\n const dialog = dialogRef.value;\n\n if (!dialog) return;\n\n // Expose imperative API\n const drawerEl = el as DrawerElement;\n\n drawerEl.show = () => {\n overlay.open('programmatic');\n };\n\n drawerEl.hide = () => {\n overlay.close('programmatic');\n };\n\n // ────────────────────────────────────────────────────────────\n // Event Handlers: Backdrop Click\n // ────────────────────────────────────────────────────────────\n // `mount()` registers the open-prop watcher and the shared native\n // `close`/`cancel` handling (Escape). Drawer registers only its own\n // backdrop-click handler on top, since swipe-to-dismiss adds guards the\n // shared `handleBackdropClick` doesn't know about.\n\n const handleBackdropClick = (e: MouseEvent) => {\n if (props.persistent.value) return;\n\n if (swipe?.active || isSwipeClosing.value) return;\n\n if (e.target !== dialog) return; // Click inside panel\n\n requestClose('outsideClick');\n };\n\n mount();\n\n onEvent(dialog, 'click', handleBackdropClick);\n\n // Drag-to-close handlers — scoped to the handle element only so interactions\n // with panel content don't accidentally start a drag.\n const panel = panelRef.value;\n const dragHandleEl = panel?.querySelector<HTMLElement>('[part=\"drag-handle\"]');\n\n if (dragHandleEl) {\n swipe = createPanGesture(dragHandleEl, {\n axis: () => getSwipeConfig().axis,\n disabled: () => isSwipeClosing.value,\n onEnd: handleSwipeEnd,\n onMove: ({ distance }) => {\n const currentPanel = panelRef.value;\n\n if (!currentPanel) return;\n\n const swipeConfig = getSwipeConfig();\n const threshold = getSnapThreshold(currentPanel, swipeConfig.axis);\n const closingDistance = swipeConfig.closingDistance(distance);\n const progress = Math.min(closingDistance / threshold, 1);\n\n currentPanel.style.transition = 'none';\n currentPanel.style.transform = swipeConfig.translate(distance);\n currentPanel.style.opacity = String(1 - progress * 0.4);\n },\n });\n }\n\n return () => {\n swipe?.dispose();\n swipe = undefined;\n overlay.dispose();\n };\n });\n\n return html`\n <dialog\n ref=${dialogRef}\n aria-modal=\"true\"\n aria-label=\"${() => props.label.value ?? null}\"\n aria-labelledby=\"${() => (!props.label.value ? drawerLabelId : null)}\">\n <div class=\"panel\" part=\"panel\" ref=${panelRef}>\n <div class=\"drag-handle\" part=\"drag-handle\" aria-label=\"Drag to close\" role=\"button\"></div>\n <div class=\"header\" part=\"header\" ?hidden=${() => !hasHeader()}>\n <span class=\"header-title\" id=\"${drawerLabelId}\" ?hidden=${() => !hasHeaderTitle()}>\n <slot name=\"header\">${() => getHeaderText()}</slot>\n </span>\n <button\n class=\"close-btn\"\n part=\"close-btn\"\n type=\"button\"\n aria-label=\"Close\"\n ?hidden=${() => !props.dismissible.value}\n @click=${handleCloseButtonClick}>\n <ore-icon name=\"x\" size=\"16\" stroke-width=\"2.5\" aria-hidden=\"true\"></ore-icon>\n </button>\n </div>\n <div class=\"body\" part=\"body\">\n <slot></slot>\n </div>\n <div class=\"footer\" part=\"footer\" ?hidden=${() => !hasFooter()}>\n <slot name=\"footer\"></slot>\n </div>\n </div>\n </dialog>\n `;\n },\n styles: [forcedColorsMixin, coarsePointerMixin, reducedMotionMixin, styles],\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"drawer.js","names":[],"sources":["../src/overlay/drawer/drawer.ts"],"sourcesContent":["import { createPanGesture, type PanAxis, type PanGesture, type PanGestureEndDetail } from '@vielzeug/gesture';\nimport {\n createId,\n define,\n getHost,\n html,\n onCleanup,\n onEvent,\n onMounted,\n prop,\n ref,\n useEmit,\n useSlots,\n} from '@vielzeug/ore';\nimport { signal } from '@vielzeug/ripple';\n\nimport { type OverlayOpenChangeDetail, parseOptionalBool } from '../../core';\n\nimport { coarsePointerMixin, forcedColorsMixin, reducedMotionMixin } from '../../styles';\nimport { useDialogControl } from '../shared/use-dialog';\nimport styles from './drawer.css?inline';\n\nexport { ICON_TAG } from '../../content/icon/icon';\n\ntype DrawerPlacement = 'left' | 'right' | 'top' | 'bottom';\ntype DrawerSize = 'sm' | 'lg' | 'full';\ntype DrawerBackdrop = 'opaque' | 'blur' | 'transparent';\ntype DrawerDragHandlePlacement = 'outside' | 'inset';\ntype DrawerSwipeConfig = {\n axis: PanAxis;\n closingDistance: (distance: number) => number;\n translate: (distance: number) => string;\n};\n\nconst drawerSwipeConfig: Record<DrawerPlacement, DrawerSwipeConfig> = {\n bottom: {\n axis: 'y',\n closingDistance: (distance) => Math.max(0, distance),\n translate: (distance) => `translateY(${distance}px)`,\n },\n left: {\n axis: 'x',\n closingDistance: (distance) => Math.max(0, -distance),\n translate: (distance) => `translateX(${distance}px)`,\n },\n right: {\n axis: 'x',\n closingDistance: (distance) => Math.max(0, distance),\n translate: (distance) => `translateX(${distance}px)`,\n },\n top: {\n axis: 'y',\n closingDistance: (distance) => Math.max(0, -distance),\n translate: (distance) => `translateY(${distance}px)`,\n },\n};\n\n/** Element interface exposing the imperative API for `ore-drawer`. */\nexport interface DrawerElement extends HTMLElement, Omit<OreDrawerProps, 'title'> {\n /** Programmatically close the drawer with the exit animation. */\n hide(): void;\n /** Programmatically open the drawer. Equivalent to setting `open`. */\n show(): void;\n}\n\n/** Drawer component properties */\n\nexport type OreDrawerEvents = {\n 'open-change': OverlayOpenChangeDetail;\n};\n\nexport type OreDrawerProps = {\n /** Backdrop style: 'opaque' (default), 'blur', or 'transparent' */\n backdrop?: DrawerBackdrop;\n /** Initial uncontrolled open state. Ignored when `open` is set. */\n 'default-open'?: boolean;\n /** Show the close (×) button in the header (default: true) */\n dismissible?: boolean;\n /** Drag handle position used for swipe-to-close gestures */\n 'drag-handle-placement'?: DrawerDragHandlePlacement;\n /**\n * CSS selector for the element inside the drawer that should receive focus on open.\n * Defaults to native dialog focus management (first focusable element).\n * @example '#submit-btn' | 'input[name=\"email\"]'\n */\n 'initial-focus'?: string;\n /**\n * Invisible accessible label for the dialog (`aria-label`).\n * Use when the drawer has no visible title (e.g. image-only content).\n * When omitted, `aria-labelledby` points to the visible header title instead.\n */\n label?: string;\n /** Controlled open state */\n open?: boolean;\n /** When true, backdrop clicks do not close the drawer (default: false) */\n persistent?: boolean;\n /** Side from which the drawer slides in */\n placement?: DrawerPlacement;\n /**\n * When true (default), focus returns to the triggering element after the drawer closes.\n * Set to false to manage focus manually.\n */\n 'return-focus'?: boolean;\n /** Drawer width/height preset */\n size?: DrawerSize;\n /**\n * Visible title text rendered inside the header.\n * Used as the dialog's accessible label via `aria-labelledby` when `label` is not set.\n */\n title?: string;\n};\n\n/**\n * A panel that slides in from any edge of the screen, built on the native `<dialog>` element.\n *\n * @element ore-drawer\n *\n * @attr {boolean} open - Controlled open state\n * @attr {boolean} default-open - Initial uncontrolled open state\n * @attr {string} placement - 'left' | 'right' (default) | 'top' | 'bottom'\n * @attr {string} size - 'sm' | 'lg' | 'full'\n * @attr {string} title - Visible header title text\n * @attr {string} label - Invisible aria-label (for drawers without a visible title)\n * @attr {boolean} dismissible - Show the close (×) button (default: true)\n * @attr {string} drag-handle-placement - 'outside' (default) | 'inset'\n * @attr {string} backdrop - Backdrop style: 'opaque' (default) | 'blur' | 'transparent'\n * @attr {boolean} persistent - Prevent backdrop-click from closing (default: false)\n *\n * @fires open-change - When the drawer state changes. detail: { open, reason }\n *\n * @slot header - Drawer header content\n * @slot - Main body content\n * @slot footer - Drawer footer content\n *\n * @cssprop --drawer-backdrop-bg - Backdrop background color\n * @cssprop --drawer-bg - Panel background color\n * @cssprop --drawer-size - Panel width (horizontal) or height (vertical)\n * @cssprop --drawer-shadow - Panel box-shadow\n * @cssprop --drawer-panel-blur - Panel backdrop blur amount\n *\n * @part drag-handle - Drawer drag handle.\n * @part panel - Panel container.\n * @part header - Header container.\n * @part close-btn - Close button.\n * @part body - Body content container.\n * @part footer - Footer container.\n * @example\n * ```html\n * <!-- With visible title -->\n * <ore-drawer open title=\"Settings\" placement=\"right\">\n * <p>Settings content here.</p>\n * </ore-drawer>\n *\n * <!-- With custom header slot -->\n * <ore-drawer open placement=\"right\">\n * <span slot=\"header\">Settings</span>\n * <p>Settings content here.</p>\n * </ore-drawer>\n * ```\n */\n\nexport const DRAWER_TAG = 'ore-drawer' as const;\ndefine<OreDrawerProps>(DRAWER_TAG, {\n props: {\n backdrop: prop.string<DrawerBackdrop>(),\n 'default-open': prop.bool(false),\n dismissible: prop.bool(true),\n 'drag-handle-placement': prop.oneOf(['outside', 'inset'] as const, 'outside'),\n 'initial-focus': prop.string(),\n label: prop.string(),\n open: { default: undefined as boolean | undefined, parse: parseOptionalBool },\n persistent: prop.bool(false),\n placement: prop.oneOf(['left', 'right', 'top', 'bottom'] as const, 'right'),\n 'return-focus': prop.bool(true),\n size: prop.string<DrawerSize>(),\n title: prop.string(),\n },\n setup(props) {\n const el = getHost();\n const emit = useEmit<OreDrawerEvents>();\n const slots = useSlots();\n\n const drawerLabelId = createId('drawer-label');\n const dialogRef = ref<HTMLDialogElement>();\n const panelRef = ref<HTMLDivElement>();\n\n // Drag-to-close state\n const isSwipeClosing = signal(false);\n let swipe: PanGesture | undefined;\n let swipeCloseTimer: ReturnType<typeof setTimeout> | undefined;\n\n const getHeaderText = () => props.label.value ?? props.title.value ?? '';\n const hasHeaderTitle = () => slots.has('header').value || !!getHeaderText();\n\n // Header is visible when there is slot content, a text label, or a close button.\n const hasHeader = () => hasHeaderTitle() || props.dismissible.value;\n const hasFooter = () => slots.has('footer').value;\n\n const getPlacement = (): DrawerPlacement => props.placement.value || 'right';\n\n const getSwipeConfig = (): DrawerSwipeConfig => drawerSwipeConfig[getPlacement()];\n\n const getSnapThreshold = (panel: HTMLElement, axis: PanAxis) => {\n const panelSize = axis === 'x' ? panel.offsetWidth : panel.offsetHeight;\n\n return Math.min(96, Math.max(36, panelSize * 0.18));\n };\n\n const shouldCommitSwipeClose = (distance: number, threshold: number) => {\n return getSwipeConfig().closingDistance(distance) >= threshold;\n };\n\n const finalizeSwipeClose = (panel: HTMLElement) => {\n if (!isSwipeClosing.value) return;\n\n if (swipeCloseTimer) {\n clearTimeout(swipeCloseTimer);\n swipeCloseTimer = undefined;\n }\n\n const dialog = dialogRef.value;\n\n if (!dialog) {\n isSwipeClosing.value = false;\n\n return;\n }\n\n dialog.style.transition = 'none';\n panel.style.opacity = '0';\n panel.style.visibility = 'hidden';\n void dialog.offsetWidth;\n\n requestClose('swipe');\n };\n\n const startSwipeClose = (panel: HTMLElement, swipe: DrawerSwipeConfig, committedDistance: number) => {\n if (isSwipeClosing.value) return;\n\n isSwipeClosing.value = true;\n\n const panelSize = swipe.axis === 'x' ? panel.offsetWidth : panel.offsetHeight;\n // Preserve overshoot so closing continues from the dragged position instead of snapping back.\n const exitDistance =\n committedDistance >= 0 ? Math.max(committedDistance, panelSize) : Math.min(committedDistance, -panelSize);\n const exitTransform = swipe.translate(exitDistance);\n\n // Commit the current drag position first so the magnetic snap continues\n // from the finger instead of jumping back to rest.\n panel.style.transition = 'transform 180ms cubic-bezier(0.2, 0.9, 0.2, 1), opacity 180ms ease-out';\n void panel.offsetWidth;\n\n const onExitTransitionEnd = (ev: TransitionEvent) => {\n if (ev.target !== panel || ev.propertyName !== 'transform') return;\n\n panel.removeEventListener('transitionend', onExitTransitionEnd);\n finalizeSwipeClose(panel);\n };\n\n panel.addEventListener('transitionend', onExitTransitionEnd);\n\n const durationMs = parseFloat(getComputedStyle(panel).transitionDuration) * 1000;\n\n swipeCloseTimer = setTimeout(() => {\n panel.removeEventListener('transitionend', onExitTransitionEnd);\n finalizeSwipeClose(panel);\n }, durationMs + 50);\n\n panel.style.transform = exitTransform;\n panel.style.opacity = '0.2';\n };\n\n const resetPanelDragStyles = (panel: HTMLElement) => {\n if (swipeCloseTimer) {\n clearTimeout(swipeCloseTimer);\n swipeCloseTimer = undefined;\n }\n\n // Re-enable transitions so the snap-back or exit animates.\n panel.style.transition = '';\n panel.style.transform = '';\n panel.style.opacity = '';\n panel.style.visibility = '';\n isSwipeClosing.value = false;\n };\n\n const handleSwipeEnd = ({ distance, reason }: PanGestureEndDetail): void => {\n const panel = panelRef.value;\n\n if (!panel) return;\n\n const threshold = getSnapThreshold(panel, getSwipeConfig().axis);\n\n if (reason === 'release' && shouldCommitSwipeClose(distance, threshold)) {\n startSwipeClose(panel, getSwipeConfig(), distance);\n\n return;\n }\n\n resetPanelDragStyles(panel);\n };\n\n // ────────────────────────────────────────────────────────────────\n // Overlay State Management\n // ────────────────────────────────────────────────────────────────\n\n const { closeWithAnimation, mount, overlay, requestClose } = useDialogControl({\n beforeOpen: (dialog) => {\n // Clear any inline drag styles from a previous swipe-close so the CSS\n // entry animation starts from the correct base state.\n const panel = panelRef.value;\n\n if (panel) resetPanelDragStyles(panel);\n\n void dialog;\n },\n closeRequestDetail: (_reason) => ({ placement: props.placement.value ?? 'right' }),\n defaultOpen: props['default-open'],\n dialogRef,\n getPanelEl: () => panelRef.value,\n host: el,\n initialFocus: props['initial-focus'],\n isPersistent: () => Boolean(props.persistent.value),\n onCleanup,\n onEvent,\n onNativeClose: (reason) => {\n const panelEl = panelRef.value;\n\n // For swipe-close, keep the panel hidden and off-screen until the next\n // open cycle: resetting inline styles during native close can produce\n // a visible frame at the rest position on some browsers.\n if (panelEl && reason !== 'swipe') resetPanelDragStyles(panelEl);\n\n const dialog = dialogRef.value;\n\n if (dialog) dialog.style.transition = '';\n\n emit('open-change', { open: false, reason });\n },\n onOpen: (reason) => emit('open-change', { open: true, reason }),\n openProp: props.open,\n performClose: (dialog, reason) => {\n if (reason === 'swipe') {\n dialog.close();\n } else {\n closeWithAnimation();\n }\n },\n returnFocus: props['return-focus'],\n });\n\n const handleCloseButtonClick = () => {\n requestClose('trigger');\n };\n\n // ────────────────────────────────────────────────────────────────\n // Lifecycle: Setup Drawer Integration\n // ────────────────────────────────────────────────────────────────\n\n onMounted(() => {\n const dialog = dialogRef.value;\n\n if (!dialog) return;\n\n // Expose imperative API\n const drawerEl = el as DrawerElement;\n\n drawerEl.show = () => {\n overlay.open('programmatic');\n };\n\n drawerEl.hide = () => {\n overlay.close('programmatic');\n };\n\n // ────────────────────────────────────────────────────────────\n // Event Handlers: Backdrop Click\n // ────────────────────────────────────────────────────────────\n // `mount()` registers the open-prop watcher and the shared native\n // `close`/`cancel` handling (Escape). Drawer registers only its own\n // backdrop-click handler on top, since swipe-to-dismiss adds guards the\n // shared `handleBackdropClick` doesn't know about.\n\n const handleBackdropClick = (e: MouseEvent) => {\n if (props.persistent.value) return;\n\n if (swipe?.active || isSwipeClosing.value) return;\n\n if (e.target !== dialog) return; // Click inside panel\n\n requestClose('outsideClick');\n };\n\n mount();\n\n onEvent(dialog, 'click', handleBackdropClick);\n\n // Drag-to-close handlers: scoped to the handle element only so interactions\n // with panel content don't accidentally start a drag.\n const panel = panelRef.value;\n const dragHandleEl = panel?.querySelector<HTMLElement>('[part=\"drag-handle\"]');\n\n if (dragHandleEl) {\n swipe = createPanGesture(dragHandleEl, {\n axis: () => getSwipeConfig().axis,\n disabled: () => isSwipeClosing.value,\n onEnd: handleSwipeEnd,\n onMove: ({ distance }) => {\n const currentPanel = panelRef.value;\n\n if (!currentPanel) return;\n\n const swipeConfig = getSwipeConfig();\n const threshold = getSnapThreshold(currentPanel, swipeConfig.axis);\n const closingDistance = swipeConfig.closingDistance(distance);\n const progress = Math.min(closingDistance / threshold, 1);\n\n currentPanel.style.transition = 'none';\n currentPanel.style.transform = swipeConfig.translate(distance);\n currentPanel.style.opacity = String(1 - progress * 0.4);\n },\n });\n }\n\n return () => {\n swipe?.dispose();\n swipe = undefined;\n overlay.dispose();\n };\n });\n\n return html`\n <dialog\n ref=${dialogRef}\n aria-modal=\"true\"\n aria-label=\"${() => props.label.value ?? null}\"\n aria-labelledby=\"${() => (!props.label.value ? drawerLabelId : null)}\">\n <div class=\"panel\" part=\"panel\" ref=${panelRef}>\n <div class=\"drag-handle\" part=\"drag-handle\" aria-label=\"Drag to close\" role=\"button\"></div>\n <div class=\"header\" part=\"header\" ?hidden=${() => !hasHeader()}>\n <span class=\"header-title\" id=\"${drawerLabelId}\" ?hidden=${() => !hasHeaderTitle()}>\n <slot name=\"header\">${() => getHeaderText()}</slot>\n </span>\n <button\n class=\"close-btn\"\n part=\"close-btn\"\n type=\"button\"\n aria-label=\"Close\"\n ?hidden=${() => !props.dismissible.value}\n @click=${handleCloseButtonClick}>\n <ore-icon name=\"x\" size=\"16\" stroke-width=\"2.5\" aria-hidden=\"true\"></ore-icon>\n </button>\n </div>\n <div class=\"body\" part=\"body\">\n <slot></slot>\n </div>\n <div class=\"footer\" part=\"footer\" ?hidden=${() => !hasFooter()}>\n <slot name=\"footer\"></slot>\n </div>\n </div>\n </dialog>\n `;\n },\n styles: [forcedColorsMixin, coarsePointerMixin, reducedMotionMixin, styles],\n});\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"alert.css.cjs","names":[],"sources":["../../../src/feedback/alert/alert.css?inline"],"sourcesContent":["@layer refine.base {\n :host {\n --_bg: var(--alert-bg, var(--_theme-backdrop));\n --_color: var(--alert-color, var(--_theme-base));\n --_border-color: var(--alert-border-color, var(--_theme-border));\n --_radius: var(--alert-radius, var(--rounded-lg));\n --_padding: var(--alert-padding, var(--size-4));\n --_gap: var(--alert-gap, var(--size-3));\n --_font-size: var(--alert-font-size, var(--text-sm));\n --_shadow: var(--alert-shadow, var(--shadow-none));\n\n display: block;\n }\n\n .sr-announce {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n white-space: nowrap;\n border-width: 0;\n clip-path: inset(50%);\n }\n\n :host([dismissed]) {\n display: none;\n }\n\n :host([dismissing]) {\n overflow: hidden;\n pointer-events: none;\n animation: var(--_motion-animation, ore-alert-exit var(--transition-slow) var(--ease-in-out) forwards);\n }\n\n @keyframes ore-alert-exit {\n 0% {\n /* Use a large enough value to cover any realistic alert height. */\n max-height: 600px;\n margin-bottom: var(--size-3);\n opacity: 1;\n transform: scaleY(1);\n }\n\n 60% {\n opacity: 0;\n transform: scaleY(0.8);\n }\n\n 100% {\n max-height: 0;\n padding-top: 0;\n padding-bottom: 0;\n margin-bottom: 0;\n opacity: 0;\n transform: scaleY(0);\n }\n }\n\n .alert {\n display: grid;\n grid-template-columns: auto 1fr auto;\n row-gap: var(--size-1);\n padding: var(--_padding);\n overflow: hidden;\n font-size: var(--_font-size);\n line-height: var(--leading-normal);\n color: var(--_color);\n background: var(--_bg);\n border: var(--border) solid var(--_border-color);\n border-radius: var(--_radius);\n box-shadow: var(--_shadow);\n transition:\n background var(--transition-normal),\n border-color var(--transition-normal),\n box-shadow var(--transition-normal),\n color var(--transition-normal);\n }\n\n /* ── Icon ──────────────────────────────────────── */\n\n .icon {\n display: inline-flex;\n grid-row: 1;\n grid-column: 1;\n align-items: center;\n align-self: start;\n justify-content: center;\n margin-inline-end: var(--_gap);\n }\n\n /* Without heading: icon aligns with the body content */\n .alert:has(.header[hidden]) .icon {\n align-self: center;\n }\n\n .icon[hidden] {\n display: none;\n }\n\n /* ── Header row (heading + meta) ───────────────── */\n\n .header {\n display: flex;\n grid-row: 1;\n grid-column: 2;\n gap: var(--size-2);\n align-items: baseline;\n }\n\n .header[hidden] {\n display: none;\n }\n\n .heading {\n overflow: hidden;\n text-overflow: ellipsis;\n font-weight: var(--font-semibold);\n line-height: var(--leading-normal);\n white-space: nowrap;\n }\n\n .meta {\n margin-inline-start: auto;\n font-size: var(--text-xs);\n white-space: nowrap;\n opacity: 0.7;\n }\n\n :host(:not(:has([slot='meta']))) .meta {\n display: none;\n }\n\n /* ── Body ──────────────────────────────────────── */\n\n .body {\n grid-row: 2;\n grid-column: 1 / -1;\n min-width: 0;\n margin-top: var(--size-1);\n }\n\n /* Without heading: body moves up to share row with icon and close */\n .alert:has(.header[hidden]) .body {\n grid-row: 1;\n grid-column: 2;\n margin-top: 0;\n }\n\n /* ── Content ───────────────────────────────────── */\n\n .content {\n line-height: var(--leading-relaxed);\n }\n\n /* ── Actions ───────────────────────────────────── */\n\n .actions {\n display: flex;\n flex-wrap: wrap;\n grid-row: 3;\n grid-column: 1 / -1;\n gap: var(--size-2);\n margin-top: var(--size-2);\n }\n\n /* Without heading: actions move to row 2 */\n .alert:has(.header[hidden]) .actions {\n grid-row: 2;\n }\n\n .actions[hidden] {\n display: none;\n }\n\n /* Horizontal mode: 4-column grid — icon | body | actions | close */\n :host([horizontal]) .alert {\n grid-template-columns: auto 1fr auto auto;\n }\n\n :host([horizontal]) .body {\n grid-row: 1;\n grid-column: 2;\n align-self: center;\n margin-top: 0;\n }\n\n :host([horizontal]) .actions:not([hidden]) {\n flex-wrap: nowrap;\n grid-row: 1;\n grid-column: 3;\n margin-inline-start: var(--_gap);\n margin-top: 0;\n }\n\n :host([horizontal]) .close {\n grid-column: 4;\n align-self: center;\n }\n\n /* Phones: the horizontal action stacks below a wrapped message — a right-column action\n crowds multi-line text at narrow widths (Material flips at the same breakpoint). */\n @media (width <= 480px) {\n :host([horizontal]) .alert {\n grid-template-columns: auto 1fr auto;\n }\n\n :host([horizontal]) .actions:not([hidden]) {\n flex-wrap: wrap;\n grid-row: 2;\n grid-column: 1 / -1;\n margin-inline-start: 0;\n margin-top: var(--size-2);\n }\n\n :host([horizontal]) .close {\n grid-row: 1;\n grid-column: 3;\n align-self: center;\n }\n }\n\n /* ── Close button ──────────────────────────────── */\n\n .close {\n display: inline-flex;\n grid-row: 1;\n grid-column: 3;\n align-items: center;\n align-self: start;\n justify-content: center;\n width: var(--size-5);\n min-width: var(--_touch-target);\n height: var(--size-5);\n min-height: var(--_touch-target);\n padding: 0;\n margin-inline-start: var(--_gap);\n color: inherit;\n cursor: pointer;\n background: transparent;\n border: none;\n border-radius: var(--rounded-sm);\n opacity: 0.7;\n transition:\n opacity var(--transition-fast),\n background var(--transition-fast);\n }\n\n .close[hidden] {\n display: none;\n }\n\n .close:hover {\n background: color-mix(in oklch, currentcolor 12%, transparent);\n opacity: 1;\n }\n\n .close:focus-visible {\n outline: var(--border-2) solid currentcolor;\n outline-offset: var(--border-2);\n opacity: 1;\n }\n\n /* Accented left border for flat and bordered variants */\n :host([variant='flat'][accented]) .alert,\n :host([variant='bordered'][accented]) .alert {\n border-inline-start-width: var(--border-4, 4px);\n }\n}\n\n@layer refine.variants {\n /* Flat (Default) — canvas background, theme-colored border and text */\n :host(:not([variant])),\n :host([variant='flat']) {\n --_bg: var(--alert-bg, var(--color-canvas));\n --_color: var(--alert-color, var(--_theme-base));\n --_border-color: var(--alert-border-color, var(--_theme-base));\n --_shadow: var(--alert-shadow, var(--shadow-none));\n }\n\n /* Solid — fully filled with theme color */\n :host([variant='solid']) {\n --_bg: var(--alert-bg, var(--_theme-base));\n --_color: var(--alert-color, var(--_theme-contrast));\n --_border-color: var(--alert-border-color, var(--_theme-base));\n --_shadow: var(--alert-shadow, var(--shadow-xs));\n }\n\n /* Bordered — tinted background with a subtle themed border */\n :host([variant='bordered']) {\n --_bg: var(--alert-bg, color-mix(in oklch, var(--_theme-backdrop), var(--color-canvas)));\n --_color: var(--alert-color, var(--_theme-base));\n --_border-color: var(--alert-border-color, color-mix(in oklch, var(--_theme-focus) 30%, transparent));\n --_shadow: var(--alert-shadow, var(--inset-shadow-2xs));\n }\n}\n"],"mappings":""}
1
+ {"version":3,"file":"alert.css.cjs","names":[],"sources":["../../../src/feedback/alert/alert.css?inline"],"sourcesContent":["@layer refine.base {\n :host {\n --_bg: var(--alert-bg, var(--_theme-backdrop));\n --_color: var(--alert-color, var(--_theme-base));\n --_border-color: var(--alert-border-color, var(--_theme-border));\n --_radius: var(--alert-radius, var(--rounded-lg));\n --_padding: var(--alert-padding, var(--size-4));\n --_gap: var(--alert-gap, var(--size-3));\n --_font-size: var(--alert-font-size, var(--text-sm));\n --_shadow: var(--alert-shadow, var(--shadow-none));\n\n display: block;\n }\n\n .sr-announce {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n white-space: nowrap;\n border-width: 0;\n clip-path: inset(50%);\n }\n\n :host([dismissed]) {\n display: none;\n }\n\n :host([dismissing]) {\n overflow: hidden;\n pointer-events: none;\n animation: var(--_motion-animation, ore-alert-exit var(--transition-slow) var(--ease-in-out) forwards);\n }\n\n @keyframes ore-alert-exit {\n 0% {\n /* Use a large enough value to cover any realistic alert height. */\n max-height: 600px;\n margin-bottom: var(--size-3);\n opacity: 1;\n transform: scaleY(1);\n }\n\n 60% {\n opacity: 0;\n transform: scaleY(0.8);\n }\n\n 100% {\n max-height: 0;\n padding-top: 0;\n padding-bottom: 0;\n margin-bottom: 0;\n opacity: 0;\n transform: scaleY(0);\n }\n }\n\n .alert {\n display: grid;\n grid-template-columns: auto 1fr auto;\n row-gap: var(--size-1);\n padding: var(--_padding);\n overflow: hidden;\n font-size: var(--_font-size);\n line-height: var(--leading-normal);\n color: var(--_color);\n background: var(--_bg);\n border: var(--border) solid var(--_border-color);\n border-radius: var(--_radius);\n box-shadow: var(--_shadow);\n transition:\n background var(--transition-normal),\n border-color var(--transition-normal),\n box-shadow var(--transition-normal),\n color var(--transition-normal);\n }\n\n /* ── Icon ──────────────────────────────────────── */\n\n .icon {\n display: inline-flex;\n grid-row: 1;\n grid-column: 1;\n align-items: center;\n align-self: start;\n justify-content: center;\n margin-inline-end: var(--_gap);\n }\n\n /* Without heading: icon aligns with the body content */\n .alert:has(.header[hidden]) .icon {\n align-self: center;\n }\n\n .icon[hidden] {\n display: none;\n }\n\n /* ── Header row (heading + meta) ───────────────── */\n\n .header {\n display: flex;\n grid-row: 1;\n grid-column: 2;\n gap: var(--size-2);\n align-items: baseline;\n }\n\n .header[hidden] {\n display: none;\n }\n\n .heading {\n overflow: hidden;\n text-overflow: ellipsis;\n font-weight: var(--font-semibold);\n line-height: var(--leading-normal);\n white-space: nowrap;\n }\n\n .meta {\n margin-inline-start: auto;\n font-size: var(--text-xs);\n white-space: nowrap;\n opacity: 0.7;\n }\n\n :host(:not(:has([slot='meta']))) .meta {\n display: none;\n }\n\n /* ── Body ──────────────────────────────────────── */\n\n .body {\n grid-row: 2;\n grid-column: 1 / -1;\n min-width: 0;\n margin-top: var(--size-1);\n }\n\n /* Without heading: body moves up to share row with icon and close */\n .alert:has(.header[hidden]) .body {\n grid-row: 1;\n grid-column: 2;\n margin-top: 0;\n }\n\n /* ── Content ───────────────────────────────────── */\n\n .content {\n line-height: var(--leading-relaxed);\n }\n\n /* ── Actions ───────────────────────────────────── */\n\n .actions {\n display: flex;\n flex-wrap: wrap;\n grid-row: 3;\n grid-column: 1 / -1;\n gap: var(--size-2);\n margin-top: var(--size-2);\n }\n\n /* Without heading: actions move to row 2 */\n .alert:has(.header[hidden]) .actions {\n grid-row: 2;\n }\n\n .actions[hidden] {\n display: none;\n }\n\n /* Horizontal mode: 4-column grid: icon | body | actions | close */\n :host([horizontal]) .alert {\n grid-template-columns: auto 1fr auto auto;\n }\n\n :host([horizontal]) .body {\n grid-row: 1;\n grid-column: 2;\n align-self: center;\n margin-top: 0;\n }\n\n :host([horizontal]) .actions:not([hidden]) {\n flex-wrap: nowrap;\n grid-row: 1;\n grid-column: 3;\n margin-inline-start: var(--_gap);\n margin-top: 0;\n }\n\n :host([horizontal]) .close {\n grid-column: 4;\n align-self: center;\n }\n\n /* Phones: the horizontal action stacks below a wrapped message: a right-column action\n crowds multi-line text at narrow widths (Material flips at the same breakpoint). */\n @media (width <= 480px) {\n :host([horizontal]) .alert {\n grid-template-columns: auto 1fr auto;\n }\n\n :host([horizontal]) .actions:not([hidden]) {\n flex-wrap: wrap;\n grid-row: 2;\n grid-column: 1 / -1;\n margin-inline-start: 0;\n margin-top: var(--size-2);\n }\n\n :host([horizontal]) .close {\n grid-row: 1;\n grid-column: 3;\n align-self: center;\n }\n }\n\n /* ── Close button ──────────────────────────────── */\n\n .close {\n display: inline-flex;\n grid-row: 1;\n grid-column: 3;\n align-items: center;\n align-self: start;\n justify-content: center;\n width: var(--size-5);\n min-width: var(--_touch-target);\n height: var(--size-5);\n min-height: var(--_touch-target);\n padding: 0;\n margin-inline-start: var(--_gap);\n color: inherit;\n cursor: pointer;\n background: transparent;\n border: none;\n border-radius: var(--rounded-sm);\n opacity: 0.7;\n transition:\n opacity var(--transition-fast),\n background var(--transition-fast);\n }\n\n .close[hidden] {\n display: none;\n }\n\n .close:hover {\n background: color-mix(in oklch, currentcolor 12%, transparent);\n opacity: 1;\n }\n\n .close:focus-visible {\n outline: var(--border-2) solid currentcolor;\n outline-offset: var(--border-2);\n opacity: 1;\n }\n\n /* Accented left border for flat and bordered variants */\n :host([variant='flat'][accented]) .alert,\n :host([variant='bordered'][accented]) .alert {\n border-inline-start-width: var(--border-4, 4px);\n }\n}\n\n@layer refine.variants {\n /* Flat (Default): canvas background, theme-colored border and text */\n :host(:not([variant])),\n :host([variant='flat']) {\n --_bg: var(--alert-bg, var(--color-canvas));\n --_color: var(--alert-color, var(--_theme-base));\n --_border-color: var(--alert-border-color, var(--_theme-base));\n --_shadow: var(--alert-shadow, var(--shadow-none));\n }\n\n /* Solid: fully filled with theme color */\n :host([variant='solid']) {\n --_bg: var(--alert-bg, var(--_theme-base));\n --_color: var(--alert-color, var(--_theme-contrast));\n --_border-color: var(--alert-border-color, var(--_theme-base));\n --_shadow: var(--alert-shadow, var(--shadow-xs));\n }\n\n /* Bordered: tinted background with a subtle themed border */\n :host([variant='bordered']) {\n --_bg: var(--alert-bg, color-mix(in oklch, var(--_theme-backdrop), var(--color-canvas)));\n --_color: var(--alert-color, var(--_theme-base));\n --_border-color: var(--alert-border-color, color-mix(in oklch, var(--_theme-focus) 30%, transparent));\n --_shadow: var(--alert-shadow, var(--inset-shadow-2xs));\n }\n}\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"alert.css.js","names":[],"sources":["../../../src/feedback/alert/alert.css?inline"],"sourcesContent":["@layer refine.base {\n :host {\n --_bg: var(--alert-bg, var(--_theme-backdrop));\n --_color: var(--alert-color, var(--_theme-base));\n --_border-color: var(--alert-border-color, var(--_theme-border));\n --_radius: var(--alert-radius, var(--rounded-lg));\n --_padding: var(--alert-padding, var(--size-4));\n --_gap: var(--alert-gap, var(--size-3));\n --_font-size: var(--alert-font-size, var(--text-sm));\n --_shadow: var(--alert-shadow, var(--shadow-none));\n\n display: block;\n }\n\n .sr-announce {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n white-space: nowrap;\n border-width: 0;\n clip-path: inset(50%);\n }\n\n :host([dismissed]) {\n display: none;\n }\n\n :host([dismissing]) {\n overflow: hidden;\n pointer-events: none;\n animation: var(--_motion-animation, ore-alert-exit var(--transition-slow) var(--ease-in-out) forwards);\n }\n\n @keyframes ore-alert-exit {\n 0% {\n /* Use a large enough value to cover any realistic alert height. */\n max-height: 600px;\n margin-bottom: var(--size-3);\n opacity: 1;\n transform: scaleY(1);\n }\n\n 60% {\n opacity: 0;\n transform: scaleY(0.8);\n }\n\n 100% {\n max-height: 0;\n padding-top: 0;\n padding-bottom: 0;\n margin-bottom: 0;\n opacity: 0;\n transform: scaleY(0);\n }\n }\n\n .alert {\n display: grid;\n grid-template-columns: auto 1fr auto;\n row-gap: var(--size-1);\n padding: var(--_padding);\n overflow: hidden;\n font-size: var(--_font-size);\n line-height: var(--leading-normal);\n color: var(--_color);\n background: var(--_bg);\n border: var(--border) solid var(--_border-color);\n border-radius: var(--_radius);\n box-shadow: var(--_shadow);\n transition:\n background var(--transition-normal),\n border-color var(--transition-normal),\n box-shadow var(--transition-normal),\n color var(--transition-normal);\n }\n\n /* ── Icon ──────────────────────────────────────── */\n\n .icon {\n display: inline-flex;\n grid-row: 1;\n grid-column: 1;\n align-items: center;\n align-self: start;\n justify-content: center;\n margin-inline-end: var(--_gap);\n }\n\n /* Without heading: icon aligns with the body content */\n .alert:has(.header[hidden]) .icon {\n align-self: center;\n }\n\n .icon[hidden] {\n display: none;\n }\n\n /* ── Header row (heading + meta) ───────────────── */\n\n .header {\n display: flex;\n grid-row: 1;\n grid-column: 2;\n gap: var(--size-2);\n align-items: baseline;\n }\n\n .header[hidden] {\n display: none;\n }\n\n .heading {\n overflow: hidden;\n text-overflow: ellipsis;\n font-weight: var(--font-semibold);\n line-height: var(--leading-normal);\n white-space: nowrap;\n }\n\n .meta {\n margin-inline-start: auto;\n font-size: var(--text-xs);\n white-space: nowrap;\n opacity: 0.7;\n }\n\n :host(:not(:has([slot='meta']))) .meta {\n display: none;\n }\n\n /* ── Body ──────────────────────────────────────── */\n\n .body {\n grid-row: 2;\n grid-column: 1 / -1;\n min-width: 0;\n margin-top: var(--size-1);\n }\n\n /* Without heading: body moves up to share row with icon and close */\n .alert:has(.header[hidden]) .body {\n grid-row: 1;\n grid-column: 2;\n margin-top: 0;\n }\n\n /* ── Content ───────────────────────────────────── */\n\n .content {\n line-height: var(--leading-relaxed);\n }\n\n /* ── Actions ───────────────────────────────────── */\n\n .actions {\n display: flex;\n flex-wrap: wrap;\n grid-row: 3;\n grid-column: 1 / -1;\n gap: var(--size-2);\n margin-top: var(--size-2);\n }\n\n /* Without heading: actions move to row 2 */\n .alert:has(.header[hidden]) .actions {\n grid-row: 2;\n }\n\n .actions[hidden] {\n display: none;\n }\n\n /* Horizontal mode: 4-column grid — icon | body | actions | close */\n :host([horizontal]) .alert {\n grid-template-columns: auto 1fr auto auto;\n }\n\n :host([horizontal]) .body {\n grid-row: 1;\n grid-column: 2;\n align-self: center;\n margin-top: 0;\n }\n\n :host([horizontal]) .actions:not([hidden]) {\n flex-wrap: nowrap;\n grid-row: 1;\n grid-column: 3;\n margin-inline-start: var(--_gap);\n margin-top: 0;\n }\n\n :host([horizontal]) .close {\n grid-column: 4;\n align-self: center;\n }\n\n /* Phones: the horizontal action stacks below a wrapped message — a right-column action\n crowds multi-line text at narrow widths (Material flips at the same breakpoint). */\n @media (width <= 480px) {\n :host([horizontal]) .alert {\n grid-template-columns: auto 1fr auto;\n }\n\n :host([horizontal]) .actions:not([hidden]) {\n flex-wrap: wrap;\n grid-row: 2;\n grid-column: 1 / -1;\n margin-inline-start: 0;\n margin-top: var(--size-2);\n }\n\n :host([horizontal]) .close {\n grid-row: 1;\n grid-column: 3;\n align-self: center;\n }\n }\n\n /* ── Close button ──────────────────────────────── */\n\n .close {\n display: inline-flex;\n grid-row: 1;\n grid-column: 3;\n align-items: center;\n align-self: start;\n justify-content: center;\n width: var(--size-5);\n min-width: var(--_touch-target);\n height: var(--size-5);\n min-height: var(--_touch-target);\n padding: 0;\n margin-inline-start: var(--_gap);\n color: inherit;\n cursor: pointer;\n background: transparent;\n border: none;\n border-radius: var(--rounded-sm);\n opacity: 0.7;\n transition:\n opacity var(--transition-fast),\n background var(--transition-fast);\n }\n\n .close[hidden] {\n display: none;\n }\n\n .close:hover {\n background: color-mix(in oklch, currentcolor 12%, transparent);\n opacity: 1;\n }\n\n .close:focus-visible {\n outline: var(--border-2) solid currentcolor;\n outline-offset: var(--border-2);\n opacity: 1;\n }\n\n /* Accented left border for flat and bordered variants */\n :host([variant='flat'][accented]) .alert,\n :host([variant='bordered'][accented]) .alert {\n border-inline-start-width: var(--border-4, 4px);\n }\n}\n\n@layer refine.variants {\n /* Flat (Default) — canvas background, theme-colored border and text */\n :host(:not([variant])),\n :host([variant='flat']) {\n --_bg: var(--alert-bg, var(--color-canvas));\n --_color: var(--alert-color, var(--_theme-base));\n --_border-color: var(--alert-border-color, var(--_theme-base));\n --_shadow: var(--alert-shadow, var(--shadow-none));\n }\n\n /* Solid — fully filled with theme color */\n :host([variant='solid']) {\n --_bg: var(--alert-bg, var(--_theme-base));\n --_color: var(--alert-color, var(--_theme-contrast));\n --_border-color: var(--alert-border-color, var(--_theme-base));\n --_shadow: var(--alert-shadow, var(--shadow-xs));\n }\n\n /* Bordered — tinted background with a subtle themed border */\n :host([variant='bordered']) {\n --_bg: var(--alert-bg, color-mix(in oklch, var(--_theme-backdrop), var(--color-canvas)));\n --_color: var(--alert-color, var(--_theme-base));\n --_border-color: var(--alert-border-color, color-mix(in oklch, var(--_theme-focus) 30%, transparent));\n --_shadow: var(--alert-shadow, var(--inset-shadow-2xs));\n }\n}\n"],"mappings":""}
1
+ {"version":3,"file":"alert.css.js","names":[],"sources":["../../../src/feedback/alert/alert.css?inline"],"sourcesContent":["@layer refine.base {\n :host {\n --_bg: var(--alert-bg, var(--_theme-backdrop));\n --_color: var(--alert-color, var(--_theme-base));\n --_border-color: var(--alert-border-color, var(--_theme-border));\n --_radius: var(--alert-radius, var(--rounded-lg));\n --_padding: var(--alert-padding, var(--size-4));\n --_gap: var(--alert-gap, var(--size-3));\n --_font-size: var(--alert-font-size, var(--text-sm));\n --_shadow: var(--alert-shadow, var(--shadow-none));\n\n display: block;\n }\n\n .sr-announce {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n white-space: nowrap;\n border-width: 0;\n clip-path: inset(50%);\n }\n\n :host([dismissed]) {\n display: none;\n }\n\n :host([dismissing]) {\n overflow: hidden;\n pointer-events: none;\n animation: var(--_motion-animation, ore-alert-exit var(--transition-slow) var(--ease-in-out) forwards);\n }\n\n @keyframes ore-alert-exit {\n 0% {\n /* Use a large enough value to cover any realistic alert height. */\n max-height: 600px;\n margin-bottom: var(--size-3);\n opacity: 1;\n transform: scaleY(1);\n }\n\n 60% {\n opacity: 0;\n transform: scaleY(0.8);\n }\n\n 100% {\n max-height: 0;\n padding-top: 0;\n padding-bottom: 0;\n margin-bottom: 0;\n opacity: 0;\n transform: scaleY(0);\n }\n }\n\n .alert {\n display: grid;\n grid-template-columns: auto 1fr auto;\n row-gap: var(--size-1);\n padding: var(--_padding);\n overflow: hidden;\n font-size: var(--_font-size);\n line-height: var(--leading-normal);\n color: var(--_color);\n background: var(--_bg);\n border: var(--border) solid var(--_border-color);\n border-radius: var(--_radius);\n box-shadow: var(--_shadow);\n transition:\n background var(--transition-normal),\n border-color var(--transition-normal),\n box-shadow var(--transition-normal),\n color var(--transition-normal);\n }\n\n /* ── Icon ──────────────────────────────────────── */\n\n .icon {\n display: inline-flex;\n grid-row: 1;\n grid-column: 1;\n align-items: center;\n align-self: start;\n justify-content: center;\n margin-inline-end: var(--_gap);\n }\n\n /* Without heading: icon aligns with the body content */\n .alert:has(.header[hidden]) .icon {\n align-self: center;\n }\n\n .icon[hidden] {\n display: none;\n }\n\n /* ── Header row (heading + meta) ───────────────── */\n\n .header {\n display: flex;\n grid-row: 1;\n grid-column: 2;\n gap: var(--size-2);\n align-items: baseline;\n }\n\n .header[hidden] {\n display: none;\n }\n\n .heading {\n overflow: hidden;\n text-overflow: ellipsis;\n font-weight: var(--font-semibold);\n line-height: var(--leading-normal);\n white-space: nowrap;\n }\n\n .meta {\n margin-inline-start: auto;\n font-size: var(--text-xs);\n white-space: nowrap;\n opacity: 0.7;\n }\n\n :host(:not(:has([slot='meta']))) .meta {\n display: none;\n }\n\n /* ── Body ──────────────────────────────────────── */\n\n .body {\n grid-row: 2;\n grid-column: 1 / -1;\n min-width: 0;\n margin-top: var(--size-1);\n }\n\n /* Without heading: body moves up to share row with icon and close */\n .alert:has(.header[hidden]) .body {\n grid-row: 1;\n grid-column: 2;\n margin-top: 0;\n }\n\n /* ── Content ───────────────────────────────────── */\n\n .content {\n line-height: var(--leading-relaxed);\n }\n\n /* ── Actions ───────────────────────────────────── */\n\n .actions {\n display: flex;\n flex-wrap: wrap;\n grid-row: 3;\n grid-column: 1 / -1;\n gap: var(--size-2);\n margin-top: var(--size-2);\n }\n\n /* Without heading: actions move to row 2 */\n .alert:has(.header[hidden]) .actions {\n grid-row: 2;\n }\n\n .actions[hidden] {\n display: none;\n }\n\n /* Horizontal mode: 4-column grid: icon | body | actions | close */\n :host([horizontal]) .alert {\n grid-template-columns: auto 1fr auto auto;\n }\n\n :host([horizontal]) .body {\n grid-row: 1;\n grid-column: 2;\n align-self: center;\n margin-top: 0;\n }\n\n :host([horizontal]) .actions:not([hidden]) {\n flex-wrap: nowrap;\n grid-row: 1;\n grid-column: 3;\n margin-inline-start: var(--_gap);\n margin-top: 0;\n }\n\n :host([horizontal]) .close {\n grid-column: 4;\n align-self: center;\n }\n\n /* Phones: the horizontal action stacks below a wrapped message: a right-column action\n crowds multi-line text at narrow widths (Material flips at the same breakpoint). */\n @media (width <= 480px) {\n :host([horizontal]) .alert {\n grid-template-columns: auto 1fr auto;\n }\n\n :host([horizontal]) .actions:not([hidden]) {\n flex-wrap: wrap;\n grid-row: 2;\n grid-column: 1 / -1;\n margin-inline-start: 0;\n margin-top: var(--size-2);\n }\n\n :host([horizontal]) .close {\n grid-row: 1;\n grid-column: 3;\n align-self: center;\n }\n }\n\n /* ── Close button ──────────────────────────────── */\n\n .close {\n display: inline-flex;\n grid-row: 1;\n grid-column: 3;\n align-items: center;\n align-self: start;\n justify-content: center;\n width: var(--size-5);\n min-width: var(--_touch-target);\n height: var(--size-5);\n min-height: var(--_touch-target);\n padding: 0;\n margin-inline-start: var(--_gap);\n color: inherit;\n cursor: pointer;\n background: transparent;\n border: none;\n border-radius: var(--rounded-sm);\n opacity: 0.7;\n transition:\n opacity var(--transition-fast),\n background var(--transition-fast);\n }\n\n .close[hidden] {\n display: none;\n }\n\n .close:hover {\n background: color-mix(in oklch, currentcolor 12%, transparent);\n opacity: 1;\n }\n\n .close:focus-visible {\n outline: var(--border-2) solid currentcolor;\n outline-offset: var(--border-2);\n opacity: 1;\n }\n\n /* Accented left border for flat and bordered variants */\n :host([variant='flat'][accented]) .alert,\n :host([variant='bordered'][accented]) .alert {\n border-inline-start-width: var(--border-4, 4px);\n }\n}\n\n@layer refine.variants {\n /* Flat (Default): canvas background, theme-colored border and text */\n :host(:not([variant])),\n :host([variant='flat']) {\n --_bg: var(--alert-bg, var(--color-canvas));\n --_color: var(--alert-color, var(--_theme-base));\n --_border-color: var(--alert-border-color, var(--_theme-base));\n --_shadow: var(--alert-shadow, var(--shadow-none));\n }\n\n /* Solid: fully filled with theme color */\n :host([variant='solid']) {\n --_bg: var(--alert-bg, var(--_theme-base));\n --_color: var(--alert-color, var(--_theme-contrast));\n --_border-color: var(--alert-border-color, var(--_theme-base));\n --_shadow: var(--alert-shadow, var(--shadow-xs));\n }\n\n /* Bordered: tinted background with a subtle themed border */\n :host([variant='bordered']) {\n --_bg: var(--alert-bg, color-mix(in oklch, var(--_theme-backdrop), var(--color-canvas)));\n --_color: var(--alert-color, var(--_theme-base));\n --_border-color: var(--alert-border-color, color-mix(in oklch, var(--_theme-focus) 30%, transparent));\n --_shadow: var(--alert-shadow, var(--inset-shadow-2xs));\n }\n}\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"badge.css.cjs","names":[],"sources":["../../../src/feedback/badge/badge.css?inline"],"sourcesContent":["/* Only the size contract stays unlayered: sizeVariantMixin always emits an unlayered :host\n carrying its md metrics, and unlayered declarations beat every layered rule. This sheet\n is adopted after the mixin's, so these rules win by source order (the :host defaults,\n which read the public --badge-* variables) and by specificity (the xs size), while the\n mixin's sm/md/lg attribute rules still win by specificity over the defaults below. The\n color contract stays layered — the variant rules must keep beating the base. */\n:host {\n --_font-size: var(--badge-font-size, var(--text-xs));\n --_font-weight: var(--badge-font-weight, var(--font-semibold));\n --_padding-x: var(--badge-padding-x, var(--size-1-5));\n --_padding-y: var(--badge-padding-y, var(--size-0-5));\n --_gap: var(--badge-gap, var(--size-1));\n}\n\n/* The one size the shared mixin does not carry. */\n:host([size='xs']) {\n --_padding-x: var(--size-1);\n --_padding-y: 0px;\n --_font-size: var(--text-2xs);\n --_dot-padding: var(--size-0-5);\n}\n\n@layer refine.base {\n :host {\n --_bg: var(--badge-bg, var(--_theme-backdrop));\n --_color: var(--badge-color, var(--_theme-base));\n --_border-color: var(--badge-border-color, var(--_theme-border));\n --_radius: var(--badge-radius, var(--rounded-lg));\n\n display: inline-flex;\n vertical-align: middle;\n }\n\n .badge {\n display: inline-flex;\n gap: var(--_gap);\n align-items: center;\n justify-content: center;\n\n /* Dot-only (no text slot) gets circular shape */\n min-width: var(--size-2);\n max-width: var(--badge-max-width, 24ch);\n padding: var(--_padding-y) var(--_padding-x);\n overflow: hidden;\n text-overflow: ellipsis;\n font-size: var(--_font-size);\n font-weight: var(--_font-weight);\n line-height: 1;\n color: var(--_color);\n white-space: nowrap;\n background: var(--_bg);\n border: var(--border) solid var(--_border-color);\n border-radius: var(--_radius);\n }\n\n .badge-label {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n ::slotted([slot='icon']) {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: 1em;\n height: 1em;\n }\n}\n\n@layer refine.variants {\n /* Solid (Default) - Full theme color background */\n :host(:not([variant])),\n :host([variant='solid']) {\n --_bg: var(--badge-bg, var(--_theme-base));\n --_color: var(--badge-color, var(--_theme-contrast));\n --_border-color: var(--badge-border-color, var(--_theme-base));\n }\n\n /* Flat - Subtle background with theme color text */\n :host([variant='flat']) {\n --_bg: var(--badge-bg, color-mix(in oklch, var(--_theme-backdrop) 25%, var(--color-contrast-100)));\n --_color: var(--badge-color, var(--_theme-base));\n --_border-color: var(--badge-border-color, color-mix(in oklch, var(--_theme-focus) 20%, transparent));\n }\n\n /* Bordered - Outlined with filled background */\n :host([variant='bordered']) {\n --_bg: var(--badge-bg, var(--_theme-backdrop));\n --_color: var(--badge-color, var(--_theme-base));\n --_border-color: var(--badge-border-color, var(--_theme-border));\n }\n\n /* Outline - Transparent with colored border */\n :host([variant='outline']) {\n --_bg: var(--badge-bg, transparent);\n --_color: var(--badge-color, var(--_theme-base));\n --_border-color: var(--badge-border-color, var(--_theme-base));\n }\n\n /* Dot-only mode */\n :host([dot]) .badge {\n min-width: unset;\n padding: var(--_dot-padding, var(--size-1));\n line-height: 0;\n }\n}\n\n@layer refine.overrides {\n /* Dot — always force badge background and border regardless of variant */\n :host([dot]) {\n --_bg: var(--badge-bg, var(--_theme-base));\n --_border-color: var(--badge-border-color, var(--_theme-base));\n }\n\n /* ========================================\n Anchor overlay mode\n ======================================== */\n\n :host([anchor]) {\n position: relative;\n display: inline-flex;\n }\n\n /*\n * Per-direction multiplier: +1 in LTR, -1 in RTL.\n * Used to flip the translateX offset so the badge always overflows\n * the correct physical edge that corresponds to its logical corner.\n */\n :host {\n --_dir: 1;\n }\n\n :host(:dir(rtl)) {\n --_dir: -1;\n }\n\n /* Default position: top-end */\n :host([anchor]) .badge {\n position: absolute;\n inset-inline-end: 0;\n top: 0;\n z-index: 1;\n transform: translate(calc(var(--_dir) * 30%), -30%);\n }\n\n :host([anchor='top-start']) .badge {\n inset-inline-start: 0;\n inset-inline-end: unset;\n transform: translate(calc(var(--_dir) * -30%), -30%);\n }\n\n :host([anchor='bottom-end']) .badge {\n top: unset;\n bottom: 0;\n transform: translate(calc(var(--_dir) * 30%), 30%);\n }\n\n :host([anchor='bottom-start']) .badge {\n inset-inline-start: 0;\n inset-inline-end: unset;\n top: unset;\n bottom: 0;\n transform: translate(calc(var(--_dir) * -30%), 30%);\n }\n}\n"],"mappings":""}
1
+ {"version":3,"file":"badge.css.cjs","names":[],"sources":["../../../src/feedback/badge/badge.css?inline"],"sourcesContent":["/* Only the size contract stays unlayered: sizeVariantMixin always emits an unlayered :host\n carrying its md metrics, and unlayered declarations beat every layered rule. This sheet\n is adopted after the mixin's, so these rules win by source order (the :host defaults,\n which read the public --badge-* variables) and by specificity (the xs size), while the\n mixin's sm/md/lg attribute rules still win by specificity over the defaults below. The\n color contract stays layered: the variant rules must keep beating the base. */\n:host {\n --_font-size: var(--badge-font-size, var(--text-xs));\n --_font-weight: var(--badge-font-weight, var(--font-semibold));\n --_padding-x: var(--badge-padding-x, var(--size-1-5));\n --_padding-y: var(--badge-padding-y, var(--size-0-5));\n --_gap: var(--badge-gap, var(--size-1));\n}\n\n/* The one size the shared mixin does not carry. */\n:host([size='xs']) {\n --_padding-x: var(--size-1);\n --_padding-y: 0px;\n --_font-size: var(--text-2xs);\n --_dot-padding: var(--size-0-5);\n}\n\n@layer refine.base {\n :host {\n --_bg: var(--badge-bg, var(--_theme-backdrop));\n --_color: var(--badge-color, var(--_theme-base));\n --_border-color: var(--badge-border-color, var(--_theme-border));\n --_radius: var(--badge-radius, var(--rounded-lg));\n\n display: inline-flex;\n vertical-align: middle;\n }\n\n .badge {\n display: inline-flex;\n gap: var(--_gap);\n align-items: center;\n justify-content: center;\n\n /* Dot-only (no text slot) gets circular shape */\n min-width: var(--size-2);\n max-width: var(--badge-max-width, 24ch);\n padding: var(--_padding-y) var(--_padding-x);\n overflow: hidden;\n text-overflow: ellipsis;\n font-size: var(--_font-size);\n font-weight: var(--_font-weight);\n line-height: 1;\n color: var(--_color);\n white-space: nowrap;\n background: var(--_bg);\n border: var(--border) solid var(--_border-color);\n border-radius: var(--_radius);\n }\n\n .badge-label {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n ::slotted([slot='icon']) {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: 1em;\n height: 1em;\n }\n}\n\n@layer refine.variants {\n /* Solid (Default) - Full theme color background */\n :host(:not([variant])),\n :host([variant='solid']) {\n --_bg: var(--badge-bg, var(--_theme-base));\n --_color: var(--badge-color, var(--_theme-contrast));\n --_border-color: var(--badge-border-color, var(--_theme-base));\n }\n\n /* Flat - Subtle background with theme color text */\n :host([variant='flat']) {\n --_bg: var(--badge-bg, color-mix(in oklch, var(--_theme-backdrop) 25%, var(--color-contrast-100)));\n --_color: var(--badge-color, var(--_theme-base));\n --_border-color: var(--badge-border-color, color-mix(in oklch, var(--_theme-focus) 20%, transparent));\n }\n\n /* Bordered - Outlined with filled background */\n :host([variant='bordered']) {\n --_bg: var(--badge-bg, var(--_theme-backdrop));\n --_color: var(--badge-color, var(--_theme-base));\n --_border-color: var(--badge-border-color, var(--_theme-border));\n }\n\n /* Outline - Transparent with colored border */\n :host([variant='outline']) {\n --_bg: var(--badge-bg, transparent);\n --_color: var(--badge-color, var(--_theme-base));\n --_border-color: var(--badge-border-color, var(--_theme-base));\n }\n\n /* Dot-only mode */\n :host([dot]) .badge {\n min-width: unset;\n padding: var(--_dot-padding, var(--size-1));\n line-height: 0;\n }\n}\n\n@layer refine.overrides {\n /* Dot: always force badge background and border regardless of variant */\n :host([dot]) {\n --_bg: var(--badge-bg, var(--_theme-base));\n --_border-color: var(--badge-border-color, var(--_theme-base));\n }\n\n /* ========================================\n Anchor overlay mode\n ======================================== */\n\n :host([anchor]) {\n position: relative;\n display: inline-flex;\n }\n\n /*\n * Per-direction multiplier: +1 in LTR, -1 in RTL.\n * Used to flip the translateX offset so the badge always overflows\n * the correct physical edge that corresponds to its logical corner.\n */\n :host {\n --_dir: 1;\n }\n\n :host(:dir(rtl)) {\n --_dir: -1;\n }\n\n /* Default position: top-end */\n :host([anchor]) .badge {\n position: absolute;\n inset-inline-end: 0;\n top: 0;\n z-index: 1;\n transform: translate(calc(var(--_dir) * 30%), -30%);\n }\n\n :host([anchor='top-start']) .badge {\n inset-inline-start: 0;\n inset-inline-end: unset;\n transform: translate(calc(var(--_dir) * -30%), -30%);\n }\n\n :host([anchor='bottom-end']) .badge {\n top: unset;\n bottom: 0;\n transform: translate(calc(var(--_dir) * 30%), 30%);\n }\n\n :host([anchor='bottom-start']) .badge {\n inset-inline-start: 0;\n inset-inline-end: unset;\n top: unset;\n bottom: 0;\n transform: translate(calc(var(--_dir) * -30%), 30%);\n }\n}\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"badge.css.js","names":[],"sources":["../../../src/feedback/badge/badge.css?inline"],"sourcesContent":["/* Only the size contract stays unlayered: sizeVariantMixin always emits an unlayered :host\n carrying its md metrics, and unlayered declarations beat every layered rule. This sheet\n is adopted after the mixin's, so these rules win by source order (the :host defaults,\n which read the public --badge-* variables) and by specificity (the xs size), while the\n mixin's sm/md/lg attribute rules still win by specificity over the defaults below. The\n color contract stays layered — the variant rules must keep beating the base. */\n:host {\n --_font-size: var(--badge-font-size, var(--text-xs));\n --_font-weight: var(--badge-font-weight, var(--font-semibold));\n --_padding-x: var(--badge-padding-x, var(--size-1-5));\n --_padding-y: var(--badge-padding-y, var(--size-0-5));\n --_gap: var(--badge-gap, var(--size-1));\n}\n\n/* The one size the shared mixin does not carry. */\n:host([size='xs']) {\n --_padding-x: var(--size-1);\n --_padding-y: 0px;\n --_font-size: var(--text-2xs);\n --_dot-padding: var(--size-0-5);\n}\n\n@layer refine.base {\n :host {\n --_bg: var(--badge-bg, var(--_theme-backdrop));\n --_color: var(--badge-color, var(--_theme-base));\n --_border-color: var(--badge-border-color, var(--_theme-border));\n --_radius: var(--badge-radius, var(--rounded-lg));\n\n display: inline-flex;\n vertical-align: middle;\n }\n\n .badge {\n display: inline-flex;\n gap: var(--_gap);\n align-items: center;\n justify-content: center;\n\n /* Dot-only (no text slot) gets circular shape */\n min-width: var(--size-2);\n max-width: var(--badge-max-width, 24ch);\n padding: var(--_padding-y) var(--_padding-x);\n overflow: hidden;\n text-overflow: ellipsis;\n font-size: var(--_font-size);\n font-weight: var(--_font-weight);\n line-height: 1;\n color: var(--_color);\n white-space: nowrap;\n background: var(--_bg);\n border: var(--border) solid var(--_border-color);\n border-radius: var(--_radius);\n }\n\n .badge-label {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n ::slotted([slot='icon']) {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: 1em;\n height: 1em;\n }\n}\n\n@layer refine.variants {\n /* Solid (Default) - Full theme color background */\n :host(:not([variant])),\n :host([variant='solid']) {\n --_bg: var(--badge-bg, var(--_theme-base));\n --_color: var(--badge-color, var(--_theme-contrast));\n --_border-color: var(--badge-border-color, var(--_theme-base));\n }\n\n /* Flat - Subtle background with theme color text */\n :host([variant='flat']) {\n --_bg: var(--badge-bg, color-mix(in oklch, var(--_theme-backdrop) 25%, var(--color-contrast-100)));\n --_color: var(--badge-color, var(--_theme-base));\n --_border-color: var(--badge-border-color, color-mix(in oklch, var(--_theme-focus) 20%, transparent));\n }\n\n /* Bordered - Outlined with filled background */\n :host([variant='bordered']) {\n --_bg: var(--badge-bg, var(--_theme-backdrop));\n --_color: var(--badge-color, var(--_theme-base));\n --_border-color: var(--badge-border-color, var(--_theme-border));\n }\n\n /* Outline - Transparent with colored border */\n :host([variant='outline']) {\n --_bg: var(--badge-bg, transparent);\n --_color: var(--badge-color, var(--_theme-base));\n --_border-color: var(--badge-border-color, var(--_theme-base));\n }\n\n /* Dot-only mode */\n :host([dot]) .badge {\n min-width: unset;\n padding: var(--_dot-padding, var(--size-1));\n line-height: 0;\n }\n}\n\n@layer refine.overrides {\n /* Dot — always force badge background and border regardless of variant */\n :host([dot]) {\n --_bg: var(--badge-bg, var(--_theme-base));\n --_border-color: var(--badge-border-color, var(--_theme-base));\n }\n\n /* ========================================\n Anchor overlay mode\n ======================================== */\n\n :host([anchor]) {\n position: relative;\n display: inline-flex;\n }\n\n /*\n * Per-direction multiplier: +1 in LTR, -1 in RTL.\n * Used to flip the translateX offset so the badge always overflows\n * the correct physical edge that corresponds to its logical corner.\n */\n :host {\n --_dir: 1;\n }\n\n :host(:dir(rtl)) {\n --_dir: -1;\n }\n\n /* Default position: top-end */\n :host([anchor]) .badge {\n position: absolute;\n inset-inline-end: 0;\n top: 0;\n z-index: 1;\n transform: translate(calc(var(--_dir) * 30%), -30%);\n }\n\n :host([anchor='top-start']) .badge {\n inset-inline-start: 0;\n inset-inline-end: unset;\n transform: translate(calc(var(--_dir) * -30%), -30%);\n }\n\n :host([anchor='bottom-end']) .badge {\n top: unset;\n bottom: 0;\n transform: translate(calc(var(--_dir) * 30%), 30%);\n }\n\n :host([anchor='bottom-start']) .badge {\n inset-inline-start: 0;\n inset-inline-end: unset;\n top: unset;\n bottom: 0;\n transform: translate(calc(var(--_dir) * -30%), 30%);\n }\n}\n"],"mappings":""}
1
+ {"version":3,"file":"badge.css.js","names":[],"sources":["../../../src/feedback/badge/badge.css?inline"],"sourcesContent":["/* Only the size contract stays unlayered: sizeVariantMixin always emits an unlayered :host\n carrying its md metrics, and unlayered declarations beat every layered rule. This sheet\n is adopted after the mixin's, so these rules win by source order (the :host defaults,\n which read the public --badge-* variables) and by specificity (the xs size), while the\n mixin's sm/md/lg attribute rules still win by specificity over the defaults below. The\n color contract stays layered: the variant rules must keep beating the base. */\n:host {\n --_font-size: var(--badge-font-size, var(--text-xs));\n --_font-weight: var(--badge-font-weight, var(--font-semibold));\n --_padding-x: var(--badge-padding-x, var(--size-1-5));\n --_padding-y: var(--badge-padding-y, var(--size-0-5));\n --_gap: var(--badge-gap, var(--size-1));\n}\n\n/* The one size the shared mixin does not carry. */\n:host([size='xs']) {\n --_padding-x: var(--size-1);\n --_padding-y: 0px;\n --_font-size: var(--text-2xs);\n --_dot-padding: var(--size-0-5);\n}\n\n@layer refine.base {\n :host {\n --_bg: var(--badge-bg, var(--_theme-backdrop));\n --_color: var(--badge-color, var(--_theme-base));\n --_border-color: var(--badge-border-color, var(--_theme-border));\n --_radius: var(--badge-radius, var(--rounded-lg));\n\n display: inline-flex;\n vertical-align: middle;\n }\n\n .badge {\n display: inline-flex;\n gap: var(--_gap);\n align-items: center;\n justify-content: center;\n\n /* Dot-only (no text slot) gets circular shape */\n min-width: var(--size-2);\n max-width: var(--badge-max-width, 24ch);\n padding: var(--_padding-y) var(--_padding-x);\n overflow: hidden;\n text-overflow: ellipsis;\n font-size: var(--_font-size);\n font-weight: var(--_font-weight);\n line-height: 1;\n color: var(--_color);\n white-space: nowrap;\n background: var(--_bg);\n border: var(--border) solid var(--_border-color);\n border-radius: var(--_radius);\n }\n\n .badge-label {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n ::slotted([slot='icon']) {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: 1em;\n height: 1em;\n }\n}\n\n@layer refine.variants {\n /* Solid (Default) - Full theme color background */\n :host(:not([variant])),\n :host([variant='solid']) {\n --_bg: var(--badge-bg, var(--_theme-base));\n --_color: var(--badge-color, var(--_theme-contrast));\n --_border-color: var(--badge-border-color, var(--_theme-base));\n }\n\n /* Flat - Subtle background with theme color text */\n :host([variant='flat']) {\n --_bg: var(--badge-bg, color-mix(in oklch, var(--_theme-backdrop) 25%, var(--color-contrast-100)));\n --_color: var(--badge-color, var(--_theme-base));\n --_border-color: var(--badge-border-color, color-mix(in oklch, var(--_theme-focus) 20%, transparent));\n }\n\n /* Bordered - Outlined with filled background */\n :host([variant='bordered']) {\n --_bg: var(--badge-bg, var(--_theme-backdrop));\n --_color: var(--badge-color, var(--_theme-base));\n --_border-color: var(--badge-border-color, var(--_theme-border));\n }\n\n /* Outline - Transparent with colored border */\n :host([variant='outline']) {\n --_bg: var(--badge-bg, transparent);\n --_color: var(--badge-color, var(--_theme-base));\n --_border-color: var(--badge-border-color, var(--_theme-base));\n }\n\n /* Dot-only mode */\n :host([dot]) .badge {\n min-width: unset;\n padding: var(--_dot-padding, var(--size-1));\n line-height: 0;\n }\n}\n\n@layer refine.overrides {\n /* Dot: always force badge background and border regardless of variant */\n :host([dot]) {\n --_bg: var(--badge-bg, var(--_theme-base));\n --_border-color: var(--badge-border-color, var(--_theme-base));\n }\n\n /* ========================================\n Anchor overlay mode\n ======================================== */\n\n :host([anchor]) {\n position: relative;\n display: inline-flex;\n }\n\n /*\n * Per-direction multiplier: +1 in LTR, -1 in RTL.\n * Used to flip the translateX offset so the badge always overflows\n * the correct physical edge that corresponds to its logical corner.\n */\n :host {\n --_dir: 1;\n }\n\n :host(:dir(rtl)) {\n --_dir: -1;\n }\n\n /* Default position: top-end */\n :host([anchor]) .badge {\n position: absolute;\n inset-inline-end: 0;\n top: 0;\n z-index: 1;\n transform: translate(calc(var(--_dir) * 30%), -30%);\n }\n\n :host([anchor='top-start']) .badge {\n inset-inline-start: 0;\n inset-inline-end: unset;\n transform: translate(calc(var(--_dir) * -30%), -30%);\n }\n\n :host([anchor='bottom-end']) .badge {\n top: unset;\n bottom: 0;\n transform: translate(calc(var(--_dir) * 30%), 30%);\n }\n\n :host([anchor='bottom-start']) .badge {\n inset-inline-start: 0;\n inset-inline-end: unset;\n top: unset;\n bottom: 0;\n transform: translate(calc(var(--_dir) * -30%), 30%);\n }\n}\n"],"mappings":""}
@@ -17,7 +17,7 @@ export type OreBadgeProps = {
17
17
  dot?: boolean;
18
18
  /** Accessible label for assistive technology. Recommended for count-only and dot mode. */
19
19
  label?: string;
20
- /** Max count — displays "<max>+" when count exceeds this value */
20
+ /** Max count: displays "<max>+" when count exceeds this value */
21
21
  max?: number;
22
22
  /** Border radius override */
23
23
  rounded?: RoundedSize;
@@ -1 +1 @@
1
- {"version":3,"file":"badge.d.ts","sourceRoot":"","sources":["../../../src/feedback/badge/badge.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG1E,KAAK,YAAY,GAAG,OAAO,CAAC,aAAa,EAAE,OAAO,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,GAAG,OAAO,CAAC,CAAC;AAChG,KAAK,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE3C,iCAAiC;AACjC,MAAM,MAAM,aAAa,GAAG;IAC1B;;;;OAIG;IACH,MAAM,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,YAAY,GAAG,cAAc,CAAC;IACjE,kBAAkB;IAClB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,0FAA0F;IAC1F,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC7B,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,iBAAiB;IACjB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,2BAA2B;IAC3B,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,eAAO,MAAM,SAAS,EAAG,WAAoB,CAAC"}
1
+ {"version":3,"file":"badge.d.ts","sourceRoot":"","sources":["../../../src/feedback/badge/badge.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG1E,KAAK,YAAY,GAAG,OAAO,CAAC,aAAa,EAAE,OAAO,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,GAAG,OAAO,CAAC,CAAC;AAChG,KAAK,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE3C,iCAAiC;AACjC,MAAM,MAAM,aAAa,GAAG;IAC1B;;;;OAIG;IACH,MAAM,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,YAAY,GAAG,cAAc,CAAC;IACjE,kBAAkB;IAClB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,0FAA0F;IAC1F,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC7B,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,iBAAiB;IACjB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,2BAA2B;IAC3B,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,eAAO,MAAM,SAAS,EAAG,WAAoB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"chip.css.cjs","names":[],"sources":["../../../src/feedback/chip/chip.css?inline"],"sourcesContent":["@layer refine.base {\n :host {\n --_bg: var(--chip-bg, var(--color-contrast-150));\n --_color: var(--chip-color, var(--color-contrast-800));\n --_border-color: var(--chip-border-color, transparent);\n --_radius: var(--chip-radius, var(--rounded-lg));\n --_font-size: var(--chip-font-size, var(--text-sm));\n --_font-weight: var(--chip-font-weight, var(--font-medium));\n --_padding-x: var(--chip-padding-x, var(--size-2-5));\n --_padding-y: var(--chip-padding-y, var(--size-0-5));\n --_gap: var(--chip-gap, var(--size-1));\n --_icon-size: var(--chip-icon-size, 1em);\n\n display: inline-flex;\n align-items: center;\n max-width: 100%;\n vertical-align: middle;\n }\n\n .chip {\n position: relative;\n box-sizing: border-box;\n display: inline-flex;\n gap: var(--_gap);\n align-items: center;\n max-width: 100%;\n padding: var(--_padding-y) var(--_padding-x);\n font-size: var(--_font-size);\n font-weight: var(--_font-weight);\n line-height: 1.2;\n color: var(--_color);\n white-space: nowrap;\n background: var(--_bg);\n border: var(--border) solid var(--_border-color);\n border-radius: var(--_radius);\n transition:\n background var(--transition-fast),\n border-color var(--transition-fast),\n box-shadow var(--transition-fast),\n color var(--transition-fast);\n }\n\n .label {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n /* ========================================\n Remove Button\n ======================================== */\n\n .remove-btn {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: 1.35em;\n height: 1.35em;\n padding: 0;\n margin-inline: var(--size-0-5) calc(var(--size-2) * -1);\n color: inherit;\n cursor: pointer;\n background: color-mix(in oklch, currentcolor 12%, transparent);\n border: none;\n border-radius: var(--_radius);\n opacity: 0.7;\n transition:\n background var(--transition-fast),\n opacity var(--transition-fast);\n }\n\n .remove-btn:hover {\n background: color-mix(in oklch, currentcolor 28%, transparent);\n opacity: 1;\n }\n\n .remove-btn:focus-visible {\n outline: 2px solid currentcolor;\n outline-offset: 1px;\n opacity: 1;\n }\n\n /* ========================================\n Icon slot\n ======================================== */\n\n ::slotted([slot='icon']) {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: var(--_icon-size);\n height: var(--_icon-size);\n }\n\n /* ========================================\n Stacked layout — icon above a wrapping label (tile-like chips)\n ======================================== */\n\n :host([layout='stacked']) {\n display: inline-flex;\n }\n\n :host([layout='stacked']) .chip {\n flex-direction: column;\n gap: var(--_gap);\n align-items: center;\n justify-content: center;\n width: 100%;\n padding: var(--_padding-x);\n text-align: center;\n white-space: normal;\n }\n\n :host([layout='stacked']) .label {\n display: -webkit-box;\n -webkit-box-orient: vertical;\n overflow: hidden;\n text-overflow: clip;\n -webkit-line-clamp: 2;\n line-clamp: 2;\n white-space: normal;\n }\n\n :host([layout='stacked']) .remove-btn {\n margin-inline: 0;\n }\n\n .chip-btn {\n display: inline-flex;\n width: 100%;\n padding: 0;\n margin: 0;\n font: inherit;\n color: inherit;\n text-align: inherit;\n cursor: pointer;\n background: none;\n border: none;\n }\n\n .chip-btn:disabled {\n cursor: not-allowed;\n }\n\n :host([mode='selectable'][checked]) .chip {\n outline: var(--border-2) solid var(--_theme-base, currentColor);\n outline-offset: -2px;\n }\n\n :host([mode='selectable']:not([disabled])) .chip,\n :host([mode='action']:not([disabled])) .chip {\n cursor: pointer;\n }\n\n .chip-btn:focus-visible {\n outline: 2px solid var(--_theme-base, currentColor);\n outline-offset: 2px;\n border-radius: var(--_radius);\n }\n}\n\n@layer refine.variants {\n /* Solid (Default) — full theme color fill */\n :host(:not([variant])),\n :host([variant='solid']) {\n --_bg: var(--chip-bg, var(--_theme-base, var(--color-contrast-700)));\n --_color: var(--chip-color, var(--_theme-contrast, var(--color-contrast-50)));\n --_border-color: var(--chip-border-color, transparent);\n --_hover-bg: var(--chip-hover-bg, var(--_theme-focus, var(--color-contrast-800)));\n --_active-bg: var(--chip-active-bg, color-mix(in oklch, var(--_theme-focus, var(--color-contrast-800)) 85%, black));\n }\n\n /* Flat — subtle tint */\n :host([variant='flat']) {\n --_bg: var(--chip-bg, color-mix(in oklch, var(--_theme-backdrop, var(--color-contrast-200)) 55%, transparent));\n --_color: var(--chip-color, var(--_theme-base, var(--color-contrast-800)));\n --_border-color: var(--chip-border-color, transparent);\n --_hover-bg: var(--chip-hover-bg, var(--_theme-focus, var(--color-contrast-700)));\n --_hover-color: var(--chip-hover-color, var(--_theme-contrast, var(--color-contrast-50)));\n --_active-bg: var(--chip-active-bg, color-mix(in oklch, var(--_theme-focus, var(--color-contrast-800)) 85%, black));\n --_active-color: var(--chip-active-color, var(--_theme-contrast, var(--color-contrast-50)));\n }\n\n /* Bordered — backdrop fill with themed border */\n :host([variant='bordered']) {\n --_bg: var(--chip-bg, var(--_theme-backdrop, var(--color-contrast-50)));\n --_color: var(--chip-color, var(--_theme-base, var(--color-contrast-900)));\n --_border-color: var(--chip-border-color, var(--_theme-border, var(--color-contrast-300)));\n --_remove-bg: var(--chip-remove-bg, var(--_theme-focus, var(--color-contrast-700)));\n --_remove-color: var(--chip-remove-color, var(--_theme-backdrop, var(--color-contrast-50)));\n --_hover-bg: var(--chip-hover-bg, var(--_theme-focus, var(--color-contrast-700)));\n --_hover-color: var(--chip-hover-color, var(--_theme-contrast, var(--color-contrast-50)));\n --_hover-border-color: var(--chip-hover-border-color, var(--_theme-focus, var(--color-contrast-700)));\n --_active-bg: var(--chip-active-bg, color-mix(in oklch, var(--_theme-focus, var(--color-contrast-800)) 85%, black));\n --_active-color: var(--chip-active-color, var(--_theme-contrast, var(--color-contrast-50)));\n }\n\n /* Outline — transparent with colored border */\n :host([variant='outline']) {\n --_bg: var(--chip-bg, transparent);\n --_color: var(--chip-color, var(--_theme-base, var(--color-contrast-900)));\n --_border-color: var(--chip-border-color, var(--_theme-base, var(--color-contrast-400)));\n --_remove-bg: var(--chip-remove-bg, var(--_theme-focus, var(--color-contrast-700)));\n --_remove-color: var(--chip-remove-color, var(--_theme-backdrop, var(--color-contrast-50)));\n --_hover-bg: var(--chip-hover-bg, var(--_theme-backdrop, var(--color-contrast-100)));\n --_hover-border-color: var(--chip-hover-border-color, var(--_theme-focus, var(--color-contrast-700)));\n --_active-bg: var(--chip-active-bg, var(--_theme-base, var(--color-contrast-700)));\n --_active-color: var(--chip-active-color, var(--_theme-contrast, var(--color-contrast-50)));\n }\n\n /* Ghost — transparent, no border */\n :host([variant='ghost']) {\n --_bg: var(--chip-bg, transparent);\n --_color: var(--chip-color, var(--_theme-base, var(--color-contrast-900)));\n --_border-color: var(--chip-border-color, transparent);\n --_hover-bg: var(--chip-hover-bg, var(--_theme-backdrop, var(--color-contrast-100)));\n --_active-bg: var(--chip-active-bg, var(--_theme-base, var(--color-contrast-700)));\n --_active-color: var(--chip-active-color, var(--_theme-contrast, var(--color-contrast-50)));\n }\n\n :host([variant='frost']:not([color])) {\n --_hover-bg: var(--chip-hover-bg, color-mix(in oklch, var(--color-canvas) 70%, transparent));\n --_hover-border-color: var(--chip-hover-border-color, color-mix(in oklch, var(--_theme-focus) 40%, transparent));\n --_active-bg: var(--chip-active-bg, color-mix(in oklch, var(--color-canvas) 70%, transparent));\n --_active-border-color: color-mix(in oklch, var(--_theme-focus) 40%, transparent);\n }\n\n :host([variant='frost'][color]) {\n --_hover-bg: var(--chip-hover-bg, color-mix(in oklch, var(--_theme-backdrop) 50%, var(--_theme-base) 50%));\n --_hover-border-color: var(--chip-hover-border-color, color-mix(in oklch, var(--_theme-focus) 65%, transparent));\n --_active-bg: var(--chip-active-bg, color-mix(in oklch, var(--_theme-backdrop) 50%, var(--_theme-base) 50%));\n --_active-border-color: color-mix(in oklch, var(--_theme-focus) 65%, transparent);\n }\n\n /* ── Remove button theming (tokens set per-variant above) ── */\n\n :host([variant='bordered']) .remove-btn,\n :host([variant='outline']) .remove-btn {\n color: var(--_remove-color);\n background: var(--_remove-bg);\n border: var(--border) solid var(--_remove-bg);\n }\n\n :host([variant='bordered']) .remove-btn:hover,\n :host([variant='outline']) .remove-btn:hover {\n background: var(--chip-remove-hover-bg, color-mix(in oklch, var(--_remove-bg) 80%, var(--color-contrast-900)));\n opacity: 1;\n }\n\n :host([variant='ghost']) .remove-btn {\n border: var(--border) solid var(--_theme-focus, var(--color-contrast-400));\n }\n\n :host([variant='ghost']) .remove-btn:hover {\n background: var(--chip-remove-hover-bg, color-mix(in oklch, currentcolor 15%, transparent));\n }\n\n /* ========================================\n Hover / Active Feedback — interactive modes\n ======================================== */\n\n :host(\n :is(\n :not([variant]),\n [variant='solid'],\n [variant='flat'],\n [variant='bordered'],\n [variant='outline'],\n [variant='ghost'],\n [variant='frost']\n ):is([mode='selectable'], [mode='action']):not([disabled])\n )\n .chip-btn:hover\n .chip {\n color: var(--_hover-color, var(--_color));\n background: var(--_hover-bg, var(--_bg));\n border-color: var(--_hover-border-color, var(--_border-color));\n }\n\n :host(\n :is(\n :not([variant]),\n [variant='solid'],\n [variant='flat'],\n [variant='bordered'],\n [variant='outline'],\n [variant='ghost'],\n [variant='frost']\n ):is([mode='selectable'], [mode='action']):not([disabled])\n )\n .chip-btn:active\n .chip {\n color: var(--_active-color, var(--_color));\n background: var(--_active-bg, var(--_bg));\n border-color: var(--_active-border-color, var(--_border-color));\n box-shadow: var(--inset-shadow-2xs);\n }\n}\n"],"mappings":""}
1
+ {"version":3,"file":"chip.css.cjs","names":[],"sources":["../../../src/feedback/chip/chip.css?inline"],"sourcesContent":["@layer refine.base {\n :host {\n --_bg: var(--chip-bg, var(--color-contrast-150));\n --_color: var(--chip-color, var(--color-contrast-800));\n --_border-color: var(--chip-border-color, transparent);\n --_radius: var(--chip-radius, var(--rounded-lg));\n --_font-size: var(--chip-font-size, var(--text-sm));\n --_font-weight: var(--chip-font-weight, var(--font-medium));\n --_padding-x: var(--chip-padding-x, var(--size-2-5));\n --_padding-y: var(--chip-padding-y, var(--size-0-5));\n --_gap: var(--chip-gap, var(--size-1));\n --_icon-size: var(--chip-icon-size, 1em);\n\n display: inline-flex;\n align-items: center;\n max-width: 100%;\n vertical-align: middle;\n }\n\n .chip {\n position: relative;\n box-sizing: border-box;\n display: inline-flex;\n gap: var(--_gap);\n align-items: center;\n max-width: 100%;\n padding: var(--_padding-y) var(--_padding-x);\n font-size: var(--_font-size);\n font-weight: var(--_font-weight);\n line-height: 1.2;\n color: var(--_color);\n white-space: nowrap;\n background: var(--_bg);\n border: var(--border) solid var(--_border-color);\n border-radius: var(--_radius);\n transition:\n background var(--transition-fast),\n border-color var(--transition-fast),\n box-shadow var(--transition-fast),\n color var(--transition-fast);\n }\n\n .label {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n /* ========================================\n Remove Button\n ======================================== */\n\n .remove-btn {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: 1.35em;\n height: 1.35em;\n padding: 0;\n margin-inline: var(--size-0-5) calc(var(--size-2) * -1);\n color: inherit;\n cursor: pointer;\n background: color-mix(in oklch, currentcolor 12%, transparent);\n border: none;\n border-radius: var(--_radius);\n opacity: 0.7;\n transition:\n background var(--transition-fast),\n opacity var(--transition-fast);\n }\n\n .remove-btn:hover {\n background: color-mix(in oklch, currentcolor 28%, transparent);\n opacity: 1;\n }\n\n .remove-btn:focus-visible {\n outline: 2px solid currentcolor;\n outline-offset: 1px;\n opacity: 1;\n }\n\n /* ========================================\n Icon slot\n ======================================== */\n\n ::slotted([slot='icon']) {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: var(--_icon-size);\n height: var(--_icon-size);\n }\n\n /* ========================================\n Stacked layout: icon above a wrapping label (tile-like chips)\n ======================================== */\n\n :host([layout='stacked']) {\n display: inline-flex;\n }\n\n :host([layout='stacked']) .chip {\n flex-direction: column;\n gap: var(--_gap);\n align-items: center;\n justify-content: center;\n width: 100%;\n padding: var(--_padding-x);\n text-align: center;\n white-space: normal;\n }\n\n :host([layout='stacked']) .label {\n display: -webkit-box;\n -webkit-box-orient: vertical;\n overflow: hidden;\n text-overflow: clip;\n -webkit-line-clamp: 2;\n line-clamp: 2;\n white-space: normal;\n }\n\n :host([layout='stacked']) .remove-btn {\n margin-inline: 0;\n }\n\n .chip-btn {\n display: inline-flex;\n width: 100%;\n padding: 0;\n margin: 0;\n font: inherit;\n color: inherit;\n text-align: inherit;\n cursor: pointer;\n background: none;\n border: none;\n }\n\n .chip-btn:disabled {\n cursor: not-allowed;\n }\n\n :host([mode='selectable'][checked]) .chip {\n outline: var(--border-2) solid var(--_theme-base, currentColor);\n outline-offset: -2px;\n }\n\n :host([mode='selectable']:not([disabled])) .chip,\n :host([mode='action']:not([disabled])) .chip {\n cursor: pointer;\n }\n\n .chip-btn:focus-visible {\n outline: 2px solid var(--_theme-base, currentColor);\n outline-offset: 2px;\n border-radius: var(--_radius);\n }\n}\n\n@layer refine.variants {\n /* Solid (Default): full theme color fill */\n :host(:not([variant])),\n :host([variant='solid']) {\n --_bg: var(--chip-bg, var(--_theme-base, var(--color-contrast-700)));\n --_color: var(--chip-color, var(--_theme-contrast, var(--color-contrast-50)));\n --_border-color: var(--chip-border-color, transparent);\n --_hover-bg: var(--chip-hover-bg, var(--_theme-focus, var(--color-contrast-800)));\n --_active-bg: var(--chip-active-bg, color-mix(in oklch, var(--_theme-focus, var(--color-contrast-800)) 85%, black));\n }\n\n /* Flat: subtle tint */\n :host([variant='flat']) {\n --_bg: var(--chip-bg, color-mix(in oklch, var(--_theme-backdrop, var(--color-contrast-200)) 55%, transparent));\n --_color: var(--chip-color, var(--_theme-base, var(--color-contrast-800)));\n --_border-color: var(--chip-border-color, transparent);\n --_hover-bg: var(--chip-hover-bg, var(--_theme-focus, var(--color-contrast-700)));\n --_hover-color: var(--chip-hover-color, var(--_theme-contrast, var(--color-contrast-50)));\n --_active-bg: var(--chip-active-bg, color-mix(in oklch, var(--_theme-focus, var(--color-contrast-800)) 85%, black));\n --_active-color: var(--chip-active-color, var(--_theme-contrast, var(--color-contrast-50)));\n }\n\n /* Bordered: backdrop fill with themed border */\n :host([variant='bordered']) {\n --_bg: var(--chip-bg, var(--_theme-backdrop, var(--color-contrast-50)));\n --_color: var(--chip-color, var(--_theme-base, var(--color-contrast-900)));\n --_border-color: var(--chip-border-color, var(--_theme-border, var(--color-contrast-300)));\n --_remove-bg: var(--chip-remove-bg, var(--_theme-focus, var(--color-contrast-700)));\n --_remove-color: var(--chip-remove-color, var(--_theme-backdrop, var(--color-contrast-50)));\n --_hover-bg: var(--chip-hover-bg, var(--_theme-focus, var(--color-contrast-700)));\n --_hover-color: var(--chip-hover-color, var(--_theme-contrast, var(--color-contrast-50)));\n --_hover-border-color: var(--chip-hover-border-color, var(--_theme-focus, var(--color-contrast-700)));\n --_active-bg: var(--chip-active-bg, color-mix(in oklch, var(--_theme-focus, var(--color-contrast-800)) 85%, black));\n --_active-color: var(--chip-active-color, var(--_theme-contrast, var(--color-contrast-50)));\n }\n\n /* Outline: transparent with colored border */\n :host([variant='outline']) {\n --_bg: var(--chip-bg, transparent);\n --_color: var(--chip-color, var(--_theme-base, var(--color-contrast-900)));\n --_border-color: var(--chip-border-color, var(--_theme-base, var(--color-contrast-400)));\n --_remove-bg: var(--chip-remove-bg, var(--_theme-focus, var(--color-contrast-700)));\n --_remove-color: var(--chip-remove-color, var(--_theme-backdrop, var(--color-contrast-50)));\n --_hover-bg: var(--chip-hover-bg, var(--_theme-backdrop, var(--color-contrast-100)));\n --_hover-border-color: var(--chip-hover-border-color, var(--_theme-focus, var(--color-contrast-700)));\n --_active-bg: var(--chip-active-bg, var(--_theme-base, var(--color-contrast-700)));\n --_active-color: var(--chip-active-color, var(--_theme-contrast, var(--color-contrast-50)));\n }\n\n /* Ghost: transparent, no border */\n :host([variant='ghost']) {\n --_bg: var(--chip-bg, transparent);\n --_color: var(--chip-color, var(--_theme-base, var(--color-contrast-900)));\n --_border-color: var(--chip-border-color, transparent);\n --_hover-bg: var(--chip-hover-bg, var(--_theme-backdrop, var(--color-contrast-100)));\n --_active-bg: var(--chip-active-bg, var(--_theme-base, var(--color-contrast-700)));\n --_active-color: var(--chip-active-color, var(--_theme-contrast, var(--color-contrast-50)));\n }\n\n :host([variant='frost']:not([color])) {\n --_hover-bg: var(--chip-hover-bg, color-mix(in oklch, var(--color-canvas) 70%, transparent));\n --_hover-border-color: var(--chip-hover-border-color, color-mix(in oklch, var(--_theme-focus) 40%, transparent));\n --_active-bg: var(--chip-active-bg, color-mix(in oklch, var(--color-canvas) 70%, transparent));\n --_active-border-color: color-mix(in oklch, var(--_theme-focus) 40%, transparent);\n }\n\n :host([variant='frost'][color]) {\n --_hover-bg: var(--chip-hover-bg, color-mix(in oklch, var(--_theme-backdrop) 50%, var(--_theme-base) 50%));\n --_hover-border-color: var(--chip-hover-border-color, color-mix(in oklch, var(--_theme-focus) 65%, transparent));\n --_active-bg: var(--chip-active-bg, color-mix(in oklch, var(--_theme-backdrop) 50%, var(--_theme-base) 50%));\n --_active-border-color: color-mix(in oklch, var(--_theme-focus) 65%, transparent);\n }\n\n /* ── Remove button theming (tokens set per-variant above) ── */\n\n :host([variant='bordered']) .remove-btn,\n :host([variant='outline']) .remove-btn {\n color: var(--_remove-color);\n background: var(--_remove-bg);\n border: var(--border) solid var(--_remove-bg);\n }\n\n :host([variant='bordered']) .remove-btn:hover,\n :host([variant='outline']) .remove-btn:hover {\n background: var(--chip-remove-hover-bg, color-mix(in oklch, var(--_remove-bg) 80%, var(--color-contrast-900)));\n opacity: 1;\n }\n\n :host([variant='ghost']) .remove-btn {\n border: var(--border) solid var(--_theme-focus, var(--color-contrast-400));\n }\n\n :host([variant='ghost']) .remove-btn:hover {\n background: var(--chip-remove-hover-bg, color-mix(in oklch, currentcolor 15%, transparent));\n }\n\n /* ========================================\n Hover / Active Feedback: interactive modes\n ======================================== */\n\n :host(\n :is(\n :not([variant]),\n [variant='solid'],\n [variant='flat'],\n [variant='bordered'],\n [variant='outline'],\n [variant='ghost'],\n [variant='frost']\n ):is([mode='selectable'], [mode='action']):not([disabled])\n )\n .chip-btn:hover\n .chip {\n color: var(--_hover-color, var(--_color));\n background: var(--_hover-bg, var(--_bg));\n border-color: var(--_hover-border-color, var(--_border-color));\n }\n\n :host(\n :is(\n :not([variant]),\n [variant='solid'],\n [variant='flat'],\n [variant='bordered'],\n [variant='outline'],\n [variant='ghost'],\n [variant='frost']\n ):is([mode='selectable'], [mode='action']):not([disabled])\n )\n .chip-btn:active\n .chip {\n color: var(--_active-color, var(--_color));\n background: var(--_active-bg, var(--_bg));\n border-color: var(--_active-border-color, var(--_border-color));\n box-shadow: var(--inset-shadow-2xs);\n }\n}\n"],"mappings":""}