@spark-ui/components 14.0.0-beta.1 → 14.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (382) hide show
  1. package/dist/Button-B6rA3-e5.js +2 -0
  2. package/dist/{Button-C3xHNaGl.js.map → Button-B6rA3-e5.js.map} +1 -1
  3. package/dist/{Button-D32Avk2j.mjs → Button-C3C0aixy.mjs} +4 -4
  4. package/dist/{Button-D32Avk2j.mjs.map → Button-C3C0aixy.mjs.map} +1 -1
  5. package/dist/DialogContent.styles-BSfXHt21.mjs +61 -0
  6. package/dist/DialogContent.styles-BSfXHt21.mjs.map +1 -0
  7. package/dist/DialogContent.styles-bBs6l8Cy.js +2 -0
  8. package/dist/DialogContent.styles-bBs6l8Cy.js.map +1 -0
  9. package/dist/Icon-CF0W0LKr.js +2 -0
  10. package/dist/{Icon-Bf0XrmiR.js.map → Icon-CF0W0LKr.js.map} +1 -1
  11. package/dist/{Icon-D1RueiPY.mjs → Icon-Ck-dhfLd.mjs} +6 -6
  12. package/dist/{Icon-D1RueiPY.mjs.map → Icon-Ck-dhfLd.mjs.map} +1 -1
  13. package/dist/{IconButton-BY3gYXtU.mjs → IconButton-C62-axzv.mjs} +6 -6
  14. package/dist/{IconButton-BY3gYXtU.mjs.map → IconButton-C62-axzv.mjs.map} +1 -1
  15. package/dist/IconButton-D3g86WpZ.js +2 -0
  16. package/dist/{IconButton-Bf-EDzpI.js.map → IconButton-D3g86WpZ.js.map} +1 -1
  17. package/dist/Slot-D2Bbf8Gw.mjs +14 -0
  18. package/dist/{Slot-C98rL4yy.mjs.map → Slot-D2Bbf8Gw.mjs.map} +1 -1
  19. package/dist/Slot-DQ8z2zsy.js +2 -0
  20. package/dist/{Slot-ghrohQLA.js.map → Slot-DQ8z2zsy.js.map} +1 -1
  21. package/dist/Spinner-_Kffli3B.js +2 -0
  22. package/dist/{Spinner-DK8VEsaR.js.map → Spinner-_Kffli3B.js.map} +1 -1
  23. package/dist/{Spinner-CYL5kyzM.mjs → Spinner-jF3-zoh_.mjs} +3 -3
  24. package/dist/{Spinner-CYL5kyzM.mjs.map → Spinner-jF3-zoh_.mjs.map} +1 -1
  25. package/dist/{TextLink-3MEVs3No.mjs → TextLink-BuzFRWO6.mjs} +3 -3
  26. package/dist/{TextLink-3MEVs3No.mjs.map → TextLink-BuzFRWO6.mjs.map} +1 -1
  27. package/dist/TextLink-C3xDLsbC.js +2 -0
  28. package/dist/{TextLink-DD0VO37q.js.map → TextLink-C3xDLsbC.js.map} +1 -1
  29. package/dist/{VisuallyHidden-AoRh4WRK.js → VisuallyHidden-CB6Nx76j.js} +2 -2
  30. package/dist/{VisuallyHidden-AoRh4WRK.js.map → VisuallyHidden-CB6Nx76j.js.map} +1 -1
  31. package/dist/{VisuallyHidden-ByNP7ZUI.mjs → VisuallyHidden-KH1biLx-.mjs} +2 -2
  32. package/dist/{VisuallyHidden-ByNP7ZUI.mjs.map → VisuallyHidden-KH1biLx-.mjs.map} +1 -1
  33. package/dist/accordion/index.d.mts +15 -0
  34. package/dist/accordion/index.js +1 -1
  35. package/dist/accordion/index.js.map +1 -1
  36. package/dist/accordion/index.mjs +90 -608
  37. package/dist/accordion/index.mjs.map +1 -1
  38. package/dist/alert-dialog/AlertDialogPortal.d.ts +1 -1
  39. package/dist/alert-dialog/index.d.mts +38 -0
  40. package/dist/alert-dialog/index.js +1 -34
  41. package/dist/alert-dialog/index.js.map +1 -1
  42. package/dist/alert-dialog/index.mjs +139 -2475
  43. package/dist/alert-dialog/index.mjs.map +1 -1
  44. package/dist/avatar/index.d.mts +15 -0
  45. package/dist/avatar/index.js +1 -1
  46. package/dist/avatar/index.js.map +1 -1
  47. package/dist/avatar/index.mjs +4 -4
  48. package/dist/badge/index.d.mts +1 -0
  49. package/dist/badge/index.js +1 -1
  50. package/dist/badge/index.js.map +1 -1
  51. package/dist/badge/index.mjs +6 -6
  52. package/dist/breadcrumb/index.d.mts +12 -0
  53. package/dist/breadcrumb/index.js +1 -1
  54. package/dist/breadcrumb/index.js.map +1 -1
  55. package/dist/breadcrumb/index.mjs +21 -21
  56. package/dist/button/Button.d.ts +1 -1
  57. package/dist/button/index.d.mts +1 -0
  58. package/dist/button/index.js +1 -1
  59. package/dist/button/index.mjs +1 -1
  60. package/dist/button/variants/index.d.mts +5 -0
  61. package/dist/card/index.d.mts +8 -0
  62. package/dist/card/index.js +1 -1
  63. package/dist/card/index.js.map +1 -1
  64. package/dist/card/index.mjs +2 -2
  65. package/dist/carousel/index.d.mts +19 -0
  66. package/dist/carousel/index.js +1 -1
  67. package/dist/carousel/index.js.map +1 -1
  68. package/dist/carousel/index.mjs +3 -3
  69. package/dist/checkbox/index.d.mts +2 -0
  70. package/dist/checkbox/index.js +1 -1
  71. package/dist/checkbox/index.js.map +1 -1
  72. package/dist/checkbox/index.mjs +128 -364
  73. package/dist/checkbox/index.mjs.map +1 -1
  74. package/dist/chip/index.d.mts +15 -0
  75. package/dist/chip/index.js +1 -1
  76. package/dist/chip/index.js.map +1 -1
  77. package/dist/chip/index.mjs +196 -370
  78. package/dist/chip/index.mjs.map +1 -1
  79. package/dist/chip/variants/index.d.mts +3 -0
  80. package/dist/collapsible/index.d.mts +7 -0
  81. package/dist/collapsible/index.js +1 -1
  82. package/dist/collapsible/index.js.map +1 -1
  83. package/dist/collapsible/index.mjs +38 -213
  84. package/dist/collapsible/index.mjs.map +1 -1
  85. package/dist/combobox/index.d.mts +35 -0
  86. package/dist/combobox/index.js +1 -1
  87. package/dist/combobox/index.js.map +1 -1
  88. package/dist/combobox/index.mjs +7 -7
  89. package/dist/combobox/utils/index.d.mts +14 -0
  90. package/dist/dialog/Dialog.d.ts +13 -13
  91. package/dist/dialog/DialogClose.d.ts +9 -8
  92. package/dist/dialog/DialogContent.d.ts +4 -4
  93. package/dist/dialog/DialogDescription.d.ts +3 -3
  94. package/dist/dialog/DialogOverlay.d.ts +5 -5
  95. package/dist/dialog/DialogPortal.d.ts +4 -4
  96. package/dist/dialog/DialogTitle.d.ts +3 -3
  97. package/dist/dialog/DialogTrigger.d.ts +5 -9
  98. package/dist/dialog/index.d.mts +37 -0
  99. package/dist/dialog/index.js +1 -1
  100. package/dist/dialog/index.js.map +1 -1
  101. package/dist/dialog/index.mjs +149 -159
  102. package/dist/dialog/index.mjs.map +1 -1
  103. package/dist/divider/index.d.mts +6 -0
  104. package/dist/divider/index.js +1 -1
  105. package/dist/divider/index.js.map +1 -1
  106. package/dist/divider/index.mjs +58 -76
  107. package/dist/divider/index.mjs.map +1 -1
  108. package/dist/drawer/Drawer.d.ts +12 -19
  109. package/dist/drawer/DrawerClose.d.ts +9 -5
  110. package/dist/drawer/DrawerContent.d.ts +5 -5
  111. package/dist/drawer/DrawerDescription.d.ts +4 -4
  112. package/dist/drawer/DrawerOverlay.d.ts +5 -5
  113. package/dist/drawer/DrawerPortal.d.ts +4 -4
  114. package/dist/drawer/DrawerTitle.d.ts +5 -5
  115. package/dist/drawer/DrawerTrigger.d.ts +5 -5
  116. package/dist/drawer/index.d.mts +37 -0
  117. package/dist/drawer/index.d.ts +2 -0
  118. package/dist/drawer/index.js +1 -1
  119. package/dist/drawer/index.js.map +1 -1
  120. package/dist/drawer/index.mjs +143 -114
  121. package/dist/drawer/index.mjs.map +1 -1
  122. package/dist/drawer/useRenderSlot.d.ts +3 -0
  123. package/dist/dropdown/index.d.mts +29 -0
  124. package/dist/dropdown/index.js +1 -1
  125. package/dist/dropdown/index.js.map +1 -1
  126. package/dist/dropdown/index.mjs +5 -5
  127. package/dist/file-upload/index.d.mts +22 -0
  128. package/dist/file-upload/index.js +1 -1
  129. package/dist/file-upload/index.js.map +1 -1
  130. package/dist/file-upload/index.mjs +6 -6
  131. package/dist/form-field/index.d.mts +31 -0
  132. package/dist/form-field/index.js +1 -1
  133. package/dist/form-field/index.js.map +1 -1
  134. package/dist/form-field/index.mjs +47 -47
  135. package/dist/icon/index.d.mts +1 -0
  136. package/dist/icon/index.js +1 -1
  137. package/dist/icon/index.mjs +1 -1
  138. package/dist/icon-button/index.d.mts +1 -0
  139. package/dist/icon-button/index.js +1 -1
  140. package/dist/icon-button/index.mjs +1 -1
  141. package/dist/input/index.d.mts +21 -0
  142. package/dist/input/index.js +1 -1
  143. package/dist/input/index.js.map +1 -1
  144. package/dist/input/index.mjs +4 -4
  145. package/dist/input-otp/index.d.mts +14 -0
  146. package/dist/input-otp/index.js +1 -1
  147. package/dist/input-otp/index.js.map +1 -1
  148. package/dist/input-otp/index.mjs +139 -137
  149. package/dist/input-otp/index.mjs.map +1 -1
  150. package/dist/kbd/index.d.mts +1 -0
  151. package/dist/label/index.d.mts +7 -0
  152. package/dist/label/index.js +1 -1
  153. package/dist/label/index.js.map +1 -1
  154. package/dist/label/index.mjs +37 -2
  155. package/dist/label/index.mjs.map +1 -1
  156. package/dist/link-box/index.d.mts +9 -0
  157. package/dist/link-box/index.js +1 -1
  158. package/dist/link-box/index.js.map +1 -1
  159. package/dist/link-box/index.mjs +7 -7
  160. package/dist/pagination/index.d.mts +18 -0
  161. package/dist/pagination/index.js +1 -1
  162. package/dist/pagination/index.js.map +1 -1
  163. package/dist/pagination/index.mjs +126 -844
  164. package/dist/pagination/index.mjs.map +1 -1
  165. package/dist/popover/index.d.mts +17 -0
  166. package/dist/popover/index.js +1 -1
  167. package/dist/popover/index.js.map +1 -1
  168. package/dist/popover/index.mjs +119 -1748
  169. package/dist/popover/index.mjs.map +1 -1
  170. package/dist/portal/index.d.mts +1 -0
  171. package/dist/portal/index.js +1 -1
  172. package/dist/portal/index.js.map +1 -1
  173. package/dist/portal/index.mjs +3 -3
  174. package/dist/portal/index.mjs.map +1 -1
  175. package/dist/progress/index.d.mts +13 -0
  176. package/dist/progress/index.js +1 -6
  177. package/dist/progress/index.js.map +1 -1
  178. package/dist/progress/index.mjs +87 -162
  179. package/dist/progress/index.mjs.map +1 -1
  180. package/dist/progress-tracker/index.d.mts +10 -0
  181. package/dist/progress-tracker/index.js +1 -1
  182. package/dist/progress-tracker/index.js.map +1 -1
  183. package/dist/progress-tracker/index.mjs +14 -14
  184. package/dist/radio-group/index.d.mts +7 -0
  185. package/dist/radio-group/index.js +1 -1
  186. package/dist/radio-group/index.js.map +1 -1
  187. package/dist/radio-group/index.mjs +85 -312
  188. package/dist/radio-group/index.mjs.map +1 -1
  189. package/dist/rating/index.d.mts +1 -0
  190. package/dist/rating/index.js +1 -1
  191. package/dist/rating/index.js.map +1 -1
  192. package/dist/rating/index.mjs +11 -11
  193. package/dist/scrolling-list/index.d.mts +15 -0
  194. package/dist/scrolling-list/index.js +1 -1
  195. package/dist/scrolling-list/index.js.map +1 -1
  196. package/dist/scrolling-list/index.mjs +168 -333
  197. package/dist/scrolling-list/index.mjs.map +1 -1
  198. package/dist/segmented-gauge/index.d.mts +13 -0
  199. package/dist/segmented-gauge/index.js +1 -1
  200. package/dist/segmented-gauge/index.js.map +1 -1
  201. package/dist/segmented-gauge/index.mjs +1 -1
  202. package/dist/select/index.d.mts +21 -0
  203. package/dist/select/index.js +1 -1
  204. package/dist/select/index.js.map +1 -1
  205. package/dist/select/index.mjs +21 -21
  206. package/dist/skeleton/index.d.mts +8 -0
  207. package/dist/skeleton/index.js +1 -1
  208. package/dist/skeleton/index.js.map +1 -1
  209. package/dist/skeleton/index.mjs +2 -2
  210. package/dist/slider/Slider.d.ts +6 -1
  211. package/dist/slider/SliderContext.d.ts +4 -1
  212. package/dist/slider/index.d.mts +8 -0
  213. package/dist/slider/index.js +1 -1
  214. package/dist/slider/index.js.map +1 -1
  215. package/dist/slider/index.mjs +96 -496
  216. package/dist/slider/index.mjs.map +1 -1
  217. package/dist/slot/index.d.mts +1 -0
  218. package/dist/slot/index.js +1 -1
  219. package/dist/slot/index.mjs +1 -1
  220. package/dist/snackbar/index.d.mts +13 -0
  221. package/dist/snackbar/index.js +1 -1
  222. package/dist/snackbar/index.js.map +1 -1
  223. package/dist/snackbar/index.mjs +189 -1105
  224. package/dist/snackbar/index.mjs.map +1 -1
  225. package/dist/spinner/index.d.mts +1 -0
  226. package/dist/spinner/index.js +1 -1
  227. package/dist/spinner/index.mjs +1 -1
  228. package/dist/stepper/index.d.mts +9 -0
  229. package/dist/stepper/index.js +1 -7
  230. package/dist/stepper/index.js.map +1 -1
  231. package/dist/stepper/index.mjs +137 -2317
  232. package/dist/stepper/index.mjs.map +1 -1
  233. package/dist/switch/index.d.mts +1 -0
  234. package/dist/switch/index.js +1 -1
  235. package/dist/switch/index.js.map +1 -1
  236. package/dist/switch/index.mjs +85 -208
  237. package/dist/switch/index.mjs.map +1 -1
  238. package/dist/tabs/index.d.mts +13 -0
  239. package/dist/tabs/index.js +1 -1
  240. package/dist/tabs/index.js.map +1 -1
  241. package/dist/tabs/index.mjs +179 -329
  242. package/dist/tabs/index.mjs.map +1 -1
  243. package/dist/tag/index.d.mts +1 -0
  244. package/dist/tag/index.js +1 -1
  245. package/dist/tag/index.js.map +1 -1
  246. package/dist/tag/index.mjs +2 -2
  247. package/dist/tag/variants/index.d.mts +3 -0
  248. package/dist/text-link/index.d.mts +1 -0
  249. package/dist/text-link/index.js +1 -1
  250. package/dist/text-link/index.mjs +1 -1
  251. package/dist/textarea/index.d.mts +14 -0
  252. package/dist/textarea/index.js +1 -1
  253. package/dist/textarea/index.js.map +1 -1
  254. package/dist/textarea/index.mjs +6 -6
  255. package/dist/toast/index.d.mts +20 -0
  256. package/dist/toast/index.js +1 -1
  257. package/dist/toast/index.js.map +1 -1
  258. package/dist/toast/index.mjs +146 -1008
  259. package/dist/toast/index.mjs.map +1 -1
  260. package/dist/useRenderSlot-DATwjgpo.js +2 -0
  261. package/dist/useRenderSlot-DATwjgpo.js.map +1 -0
  262. package/dist/useRenderSlot-LwWj8QbC.mjs +10 -0
  263. package/dist/useRenderSlot-LwWj8QbC.mjs.map +1 -0
  264. package/dist/visually-hidden/index.d.mts +1 -0
  265. package/dist/visually-hidden/index.js +1 -1
  266. package/dist/visually-hidden/index.mjs +1 -1
  267. package/package.json +7 -6
  268. package/dist/Button-C3xHNaGl.js +0 -2
  269. package/dist/DialogContent.styles-BrhKaHc_.js +0 -2
  270. package/dist/DialogContent.styles-BrhKaHc_.js.map +0 -1
  271. package/dist/DialogContent.styles-WGWJS9dj.mjs +0 -48
  272. package/dist/DialogContent.styles-WGWJS9dj.mjs.map +0 -1
  273. package/dist/Icon-Bf0XrmiR.js +0 -2
  274. package/dist/IconButton-Bf-EDzpI.js +0 -2
  275. package/dist/Slot-C98rL4yy.mjs +0 -14
  276. package/dist/Slot-ghrohQLA.js +0 -2
  277. package/dist/Spinner-DK8VEsaR.js +0 -2
  278. package/dist/TextLink-DD0VO37q.js +0 -2
  279. package/dist/composite-Br3kM5N9.mjs +0 -40
  280. package/dist/composite-Br3kM5N9.mjs.map +0 -1
  281. package/dist/composite-fJD9R7R0.js +0 -2
  282. package/dist/composite-fJD9R7R0.js.map +0 -1
  283. package/dist/detectBrowser-Bc7rk5fI.mjs +0 -44
  284. package/dist/detectBrowser-Bc7rk5fI.mjs.map +0 -1
  285. package/dist/detectBrowser-DTbs_30X.js +0 -2
  286. package/dist/detectBrowser-DTbs_30X.js.map +0 -1
  287. package/dist/downshift.esm-Ncwetv0s.mjs +0 -3038
  288. package/dist/downshift.esm-Ncwetv0s.mjs.map +0 -1
  289. package/dist/downshift.esm-PfCOUbxq.js +0 -37
  290. package/dist/downshift.esm-PfCOUbxq.js.map +0 -1
  291. package/dist/floating-ui.utils.dom-CCN4I08l.js +0 -2
  292. package/dist/floating-ui.utils.dom-CCN4I08l.js.map +0 -1
  293. package/dist/floating-ui.utils.dom-uiDUZc_y.mjs +0 -136
  294. package/dist/floating-ui.utils.dom-uiDUZc_y.mjs.map +0 -1
  295. package/dist/index-0KYGKeVg.js +0 -2
  296. package/dist/index-0KYGKeVg.js.map +0 -1
  297. package/dist/index-1WIgmEZh.js +0 -2
  298. package/dist/index-1WIgmEZh.js.map +0 -1
  299. package/dist/index-BRi38DTc.mjs +0 -21
  300. package/dist/index-BRi38DTc.mjs.map +0 -1
  301. package/dist/index-BZAtNKwE.mjs +0 -71
  302. package/dist/index-BZAtNKwE.mjs.map +0 -1
  303. package/dist/index-BZPx6jYI.mjs +0 -9
  304. package/dist/index-BZPx6jYI.mjs.map +0 -1
  305. package/dist/index-BlkdpEIe.mjs +0 -55
  306. package/dist/index-BlkdpEIe.mjs.map +0 -1
  307. package/dist/index-BmAFn37q.mjs +0 -49
  308. package/dist/index-BmAFn37q.mjs.map +0 -1
  309. package/dist/index-C-J_tHdS.js +0 -6
  310. package/dist/index-C-J_tHdS.js.map +0 -1
  311. package/dist/index-C1qb0595.mjs +0 -28
  312. package/dist/index-C1qb0595.mjs.map +0 -1
  313. package/dist/index-C34GgsKQ.mjs +0 -54
  314. package/dist/index-C34GgsKQ.mjs.map +0 -1
  315. package/dist/index-CCKe-Mpx.mjs +0 -7
  316. package/dist/index-CCKe-Mpx.mjs.map +0 -1
  317. package/dist/index-CDBBjNXc.js +0 -2
  318. package/dist/index-CDBBjNXc.js.map +0 -1
  319. package/dist/index-CYjGhVvU.mjs +0 -243
  320. package/dist/index-CYjGhVvU.mjs.map +0 -1
  321. package/dist/index-ChLwd62c.js +0 -2
  322. package/dist/index-ChLwd62c.js.map +0 -1
  323. package/dist/index-Cjj_rUPu.js +0 -2
  324. package/dist/index-Cjj_rUPu.js.map +0 -1
  325. package/dist/index-CyMbLkj0.js +0 -2
  326. package/dist/index-CyMbLkj0.js.map +0 -1
  327. package/dist/index-DFZozV_h.mjs +0 -69
  328. package/dist/index-DFZozV_h.mjs.map +0 -1
  329. package/dist/index-DKuHkHFX.js +0 -2
  330. package/dist/index-DKuHkHFX.js.map +0 -1
  331. package/dist/index-DLHLIYPI.mjs +0 -16
  332. package/dist/index-DLHLIYPI.mjs.map +0 -1
  333. package/dist/index-DO-atGp-.js +0 -2
  334. package/dist/index-DO-atGp-.js.map +0 -1
  335. package/dist/index-DWlg8lkk.mjs +0 -179
  336. package/dist/index-DWlg8lkk.mjs.map +0 -1
  337. package/dist/index-DYxWvftI.js +0 -2
  338. package/dist/index-DYxWvftI.js.map +0 -1
  339. package/dist/index-D_lWkK39.mjs +0 -803
  340. package/dist/index-D_lWkK39.mjs.map +0 -1
  341. package/dist/index-DdkVj7D0.js +0 -18
  342. package/dist/index-DdkVj7D0.js.map +0 -1
  343. package/dist/index-De-6atSi.js +0 -2
  344. package/dist/index-De-6atSi.js.map +0 -1
  345. package/dist/index-DhGWNzsz.mjs +0 -83
  346. package/dist/index-DhGWNzsz.mjs.map +0 -1
  347. package/dist/index-Dkj4QRX8.js +0 -2
  348. package/dist/index-Dkj4QRX8.js.map +0 -1
  349. package/dist/index-DlIFg0Eu.mjs +0 -60
  350. package/dist/index-DlIFg0Eu.mjs.map +0 -1
  351. package/dist/index-DnaHaH_0.js +0 -2
  352. package/dist/index-DnaHaH_0.js.map +0 -1
  353. package/dist/index-MHF2-CYX.js +0 -2
  354. package/dist/index-MHF2-CYX.js.map +0 -1
  355. package/dist/index-MQ0c3ZX_.js +0 -2
  356. package/dist/index-MQ0c3ZX_.js.map +0 -1
  357. package/dist/index-MSR-vgWR.mjs +0 -37
  358. package/dist/index-MSR-vgWR.mjs.map +0 -1
  359. package/dist/index-VL0YEmOW.mjs +0 -125
  360. package/dist/index-VL0YEmOW.mjs.map +0 -1
  361. package/dist/index-tXqxYME3.js +0 -42
  362. package/dist/index-tXqxYME3.js.map +0 -1
  363. package/dist/inertValue-Bif5Sqs6.mjs +0 -522
  364. package/dist/inertValue-Bif5Sqs6.mjs.map +0 -1
  365. package/dist/inertValue-ShwihJSN.js +0 -5
  366. package/dist/inertValue-ShwihJSN.js.map +0 -1
  367. package/dist/useCollapsiblePanel-D1dCo0lf.js +0 -4
  368. package/dist/useCollapsiblePanel-D1dCo0lf.js.map +0 -1
  369. package/dist/useCollapsiblePanel-kbMNl4Z4.mjs +0 -287
  370. package/dist/useCollapsiblePanel-kbMNl4Z4.mjs.map +0 -1
  371. package/dist/useFocusWithin-CFNEka2I.js +0 -2
  372. package/dist/useFocusWithin-CFNEka2I.js.map +0 -1
  373. package/dist/useFocusWithin-CoL4390f.mjs +0 -796
  374. package/dist/useFocusWithin-CoL4390f.mjs.map +0 -1
  375. package/dist/useOpenChangeComplete-Dk-u_f2y.js +0 -2
  376. package/dist/useOpenChangeComplete-Dk-u_f2y.js.map +0 -1
  377. package/dist/useOpenChangeComplete-RUbg6RBw.mjs +0 -582
  378. package/dist/useOpenChangeComplete-RUbg6RBw.mjs.map +0 -1
  379. package/dist/useTransitionStatus-CktVVKxz.mjs +0 -46
  380. package/dist/useTransitionStatus-CktVVKxz.mjs.map +0 -1
  381. package/dist/useTransitionStatus-CqbEyvIj.js +0 -2
  382. package/dist/useTransitionStatus-CqbEyvIj.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/card/Backdrop.tsx","../../src/card/Card.styles.tsx","../../src/card/context.tsx","../../src/card/utils.ts","../../src/card/Card.tsx","../../src/card/Content.styles.tsx","../../src/card/Content.tsx","../../src/card/index.ts"],"sourcesContent":["import { makeVariants } from '@spark-ui/internal-utils'\nimport { cva, VariantProps } from 'class-variance-authority'\n\nexport const backdropStyles = cva(\n [\n 'default:bg-surface default:bg-gradient-to-r absolute inset-x-0 top-0',\n 'h-sz-16',\n 'default:rounded-t-lg',\n 'bg-[length:200%_100%] bg-position-[0%_0%]',\n ],\n {\n variants: {\n animation: {\n none: '',\n pulse: 'animate-standalone-backdrop-pulse',\n },\n intent: makeVariants<\n 'intent',\n [\n 'main',\n 'support',\n 'accent',\n 'basic',\n 'success',\n 'alert',\n 'danger',\n 'info',\n 'neutral',\n 'surface',\n 'surfaceInverse',\n ]\n >({\n main: ['default:from-main/dim-4 default:via-main/dim-2 default:to-main/dim-4'],\n support: ['default:from-support/dim-4 default:via-support/dim-2 default:to-support/dim-4'],\n accent: ['default:from-accent/dim-4 default:via-accent/dim-2 default:to-accent/dim-4'],\n basic: ['default:from-basic/dim-4 default:via-basic/dim-2 default:to-basic/dim-4'],\n success: ['default:from-success/dim-4 default:via-success/dim-2 default:to-success/dim-4'],\n alert: ['default:from-alert/dim-4 default:via-alert/dim-2 default:to-alert/dim-4'],\n danger: ['default:from-error/dim-4 default:via-error/dim-2 default:to-error/dim-4'],\n info: ['default:from-info/dim-4 default:via-info/dim-2 default:to-info/dim-4'],\n neutral: ['default:from-neutral/dim-4 default:via-neutral/dim-2 default:to-neutral/dim-4'],\n surface: ['default:from-outline/dim-4 default:via-outline/dim-2 default:to-outline/dim-4'],\n surfaceInverse: [\n 'default:from-surface/dim-4 default:via-surface/dim-2 default:to-surface/dim-4',\n ],\n }),\n },\n defaultVariants: {\n intent: 'main',\n animation: 'none',\n },\n }\n)\n\nexport type BackdropStylesProps = VariantProps<typeof backdropStyles>\n\ninterface BackdropProps extends BackdropStylesProps {\n className?: string\n}\n\nexport const Backdrop = ({ intent = 'main', animation = 'none', ...props }: BackdropProps) => {\n return <div className={backdropStyles({ intent, animation })} {...props} />\n}\n\nBackdrop.displayName = 'Card.Backdrop'\n","import { makeVariants, tw } from '@spark-ui/internal-utils'\nimport { cva, VariantProps } from 'class-variance-authority'\n\nexport const cardStyles = cva(\n [\n 'group relative bg-clip-padding default:rounded-lg focus-visible:u-outline',\n 'disabled:opacity-dim-3 disabled:cursor-not-allowed',\n ],\n {\n variants: {\n design: {\n filled: [],\n outlined: ['border-sm'],\n tinted: [],\n },\n hasBackdrop: {\n true: ['pt-md'],\n },\n /**\n * Color scheme of the button.\n */\n intent: makeVariants<\n 'intent',\n [\n 'main',\n 'support',\n 'accent',\n 'basic',\n 'success',\n 'alert',\n 'danger',\n 'info',\n 'neutral',\n 'surface',\n 'surfaceInverse',\n ]\n >({\n main: [],\n support: [],\n accent: [],\n basic: [],\n success: [],\n alert: [],\n danger: [],\n info: [],\n neutral: [],\n surface: [],\n surfaceInverse: [],\n }),\n },\n compoundVariants: [\n // OUTLINED\n { intent: 'main', design: 'outlined', class: tw(['border-main']) },\n { intent: 'support', design: 'outlined', class: tw(['border-support']) },\n { intent: 'accent', design: 'outlined', class: tw(['border-accent']) },\n { intent: 'basic', design: 'outlined', class: tw(['border-basic']) },\n { intent: 'success', design: 'outlined', class: tw(['border-success']) },\n { intent: 'alert', design: 'outlined', class: tw(['border-alert']) },\n { intent: 'danger', design: 'outlined', class: tw(['border-error']) },\n { intent: 'info', design: 'outlined', class: tw(['border-info']) },\n { intent: 'neutral', design: 'outlined', class: tw(['border-neutral']) },\n { intent: 'surface', design: 'outlined', class: tw(['border-outline']) },\n ],\n defaultVariants: {\n design: 'filled',\n intent: 'surface',\n },\n }\n)\n\nexport type CardStylesProps = VariantProps<typeof cardStyles>\n","import { createContext, useContext } from 'react'\n\nimport type { CardStylesProps } from './Card.styles'\n\nexport interface CardContextValue {\n design: CardStylesProps['design']\n intent: CardStylesProps['intent']\n hasBackdrop: boolean\n inset: boolean\n isInteractive: boolean\n}\n\nconst CardContext = createContext<CardContextValue | undefined>(undefined)\n\nexport const useCardContext = () => {\n const context = useContext(CardContext)\n if (!context) {\n throw new Error('useCardContext must be used within a Card component')\n }\n\n return context\n}\n\nexport { CardContext }\n","import { Children, isValidElement, ReactNode } from 'react'\n\nconst MOUSE_EVENTS = [\n 'onClick',\n 'onMouseDown',\n 'onMouseUp',\n 'onMouseEnter',\n 'onMouseLeave',\n 'onMouseMove',\n 'onMouseOver',\n 'onMouseOut',\n 'onDoubleClick',\n 'onContextMenu',\n] as const\n\nexport const hasBackdrop = (children: ReactNode): boolean => {\n let backdropFound = false\n\n const searchForBackdrop = (node: ReactNode): void => {\n if (backdropFound) return\n\n Children.forEach(node, child => {\n if (backdropFound) return\n\n if (isValidElement(child)) {\n const isBackdropComponent =\n typeof child.type === 'function' &&\n (child.type as { displayName?: string }).displayName === 'Card.Backdrop'\n\n if (isBackdropComponent) {\n backdropFound = true\n\n return\n }\n\n const hasChildren =\n child.props && typeof child.props === 'object' && 'children' in child.props\n\n if (hasChildren) {\n const childChildren = (child.props as { children: ReactNode }).children\n if (childChildren !== undefined && childChildren !== null) {\n searchForBackdrop(childChildren)\n }\n }\n }\n })\n }\n\n searchForBackdrop(children)\n\n return backdropFound\n}\n\nexport const isInteractive = (\n children: ReactNode,\n asChild: boolean | undefined,\n props: Record<string, any>\n): boolean => {\n const hasMouseEventHandlers = MOUSE_EVENTS.some(event => event in props)\n\n if (hasMouseEventHandlers) {\n return true\n }\n\n if (!asChild) {\n return false\n }\n\n const child = Children.only(children)\n\n if (!isValidElement(child)) {\n return false\n }\n\n const interactiveElements = ['a', 'button']\n const isInteractiveElement =\n typeof child.type === 'string' && interactiveElements.includes(child.type)\n\n if (isInteractiveElement) {\n return true\n }\n\n const childProps = child.props as Record<string, any>\n const hasChildEventHandlers = MOUSE_EVENTS.some(event => event in childProps)\n\n return hasChildEventHandlers\n}\n","import { ComponentProps } from 'react'\n\nimport { Slot } from '../slot'\nimport { cardStyles, type CardStylesProps } from './Card.styles'\nimport { CardContext } from './context'\nimport { hasBackdrop, isInteractive } from './utils'\n\nexport interface CardProps extends ComponentProps<'div'>, CardStylesProps {\n /**\n * Change the component to the HTML tag or custom component of the only child.\n */\n asChild?: boolean\n /**\n * Whether the card should have an inset padding.\n */\n inset?: boolean\n}\n\nexport const Card = ({\n children,\n design = 'filled',\n intent = 'surface',\n inset = false,\n asChild,\n className,\n ref,\n ...props\n}: CardProps) => {\n const Component = asChild ? Slot : 'div'\n const backdropDetected = hasBackdrop(children)\n const interactiveDetected = isInteractive(children, asChild, props)\n\n return (\n <CardContext.Provider\n value={{\n design,\n intent,\n hasBackdrop: backdropDetected,\n inset,\n isInteractive: interactiveDetected,\n }}\n >\n <Component\n data-spark-component=\"card\"\n data-interactive={interactiveDetected}\n ref={ref}\n className={cardStyles({\n className,\n design,\n intent,\n hasBackdrop: backdropDetected,\n })}\n {...props}\n >\n {children}\n </Component>\n </CardContext.Provider>\n )\n}\n\nCard.displayName = 'Card'\n","import { makeVariants, tw } from '@spark-ui/internal-utils'\nimport { cva, VariantProps } from 'class-variance-authority'\n\nexport const contentStyles = cva(\n [\n 'relative h-full default:rounded-lg w-full focus-visible:u-outline',\n 'default:transition-colors default:duration-200 ease-linear',\n ],\n {\n variants: {\n inset: {\n false: ['default:p-lg'],\n },\n design: {\n filled: [],\n outlined: [\n 'default:bg-surface group-focus:bg-surface-hovered group-not-disabled:group-data-[interactive=true]:group-hover:bg-surface-hovered',\n ],\n tinted: [],\n },\n hasBackdrop: {\n true: ['rounded-t-[16px_8px] '],\n },\n intent: makeVariants<\n 'intent',\n [\n 'main',\n 'support',\n 'accent',\n 'basic',\n 'success',\n 'alert',\n 'danger',\n 'info',\n 'neutral',\n 'surface',\n 'surfaceInverse',\n ]\n >({\n main: [],\n support: [],\n accent: [],\n basic: [],\n success: [],\n alert: [],\n danger: [],\n info: [],\n neutral: [],\n surface: [],\n surfaceInverse: [],\n }),\n },\n compoundVariants: [\n // FILLED\n {\n intent: 'main',\n design: 'filled',\n class: tw([\n 'bg-main text-on-main group-focus:bg-main-hovered',\n 'group-not-disabled:group-data-[interactive=true]:group-hover:bg-main-hovered',\n ]),\n },\n {\n intent: 'support',\n design: 'filled',\n class: tw([\n 'bg-support text-on-support group-focus:bg-support-hovered',\n 'group-not-disabled:group-data-[interactive=true]:group-hover:bg-support-hovered',\n ]),\n },\n {\n intent: 'accent',\n design: 'filled',\n class: tw([\n 'bg-accent text-on-accent group-focus:bg-accent-hovered',\n 'group-not-disabled:group-data-[interactive=true]:group-hover:bg-accent-hovered',\n ]),\n },\n {\n intent: 'basic',\n design: 'filled',\n class: tw([\n 'bg-basic text-on-basic group-focus:bg-basic-hovered',\n 'group-not-disabled:group-data-[interactive=true]:group-hover:bg-basic-hovered',\n ]),\n },\n {\n intent: 'success',\n design: 'filled',\n class: tw([\n 'bg-success text-on-success group-focus:bg-success-hovered',\n 'group-not-disabled:group-data-[interactive=true]:group-hover:bg-success-hovered',\n ]),\n },\n {\n intent: 'alert',\n design: 'filled',\n class: tw([\n 'bg-alert text-on-alert group-focus:bg-alert-hovered',\n 'group-not-disabled:group-data-[interactive=true]:group-hover:bg-alert-hovered',\n ]),\n },\n {\n intent: 'danger',\n design: 'filled',\n class: tw([\n 'text-on-error bg-error group-focus:bg-error-hovered',\n 'group-not-disabled:group-data-[interactive=true]:group-hover:bg-error-hovered',\n ]),\n },\n {\n intent: 'info',\n design: 'filled',\n class: tw([\n 'text-on-error bg-info group-focus:bg-info-hovered',\n 'group-not-disabled:group-data-[interactive=true]:group-hover:bg-info-hovered',\n ]),\n },\n {\n intent: 'neutral',\n design: 'filled',\n class: tw([\n 'bg-neutral text-on-neutral group-focus:bg-neutral-hovered',\n 'group-not-disabled:group-data-[interactive=true]:group-hover:bg-neutral-hovered',\n ]),\n },\n {\n intent: 'surface',\n design: 'filled',\n class: tw([\n 'bg-surface text-on-surface group-focus:bg-surface-hovered',\n 'group-not-disabled:group-data-[interactive=true]:group-hover:bg-surface-hovered',\n ]),\n },\n // OUTLINED\n /**\n * Outlined styles are handled by the Card component (parent)\n */\n // TINTED\n {\n intent: 'main',\n design: 'tinted',\n class: tw([\n 'bg-main-container text-on-main-container group-focus:bg-main-container-hovered',\n 'group-not-disabled:group-data-[interactive=true]:group-hover:bg-main-container-hovered',\n ]),\n },\n {\n intent: 'support',\n design: 'tinted',\n class: tw([\n 'bg-support-container text-on-support-container group-focus:bg-support-container-hovered',\n 'group-not-disabled:group-data-[interactive=true]:group-hover:bg-support-container-hovered',\n ]),\n },\n {\n intent: 'accent',\n design: 'tinted',\n class: tw([\n 'bg-accent-container text-on-accent-container group-focus:bg-accent-container-hovered',\n 'group-not-disabled:group-data-[interactive=true]:group-hover:bg-accent-container-hovered',\n ]),\n },\n {\n intent: 'basic',\n design: 'tinted',\n class: tw([\n 'bg-basic-container text-on-basic-container group-focus:bg-basic-container-hovered',\n ]),\n },\n {\n intent: 'success',\n design: 'tinted',\n class: tw([\n 'bg-success-container text-on-success-container group-focus:bg-success-container-hovered',\n 'group-not-disabled:group-data-[interactive=true]:group-hover:bg-success-container-hovered',\n ]),\n },\n {\n intent: 'alert',\n design: 'tinted',\n class: tw([\n 'bg-alert-container text-on-alert-container group-focus:bg-alert-container-hovered',\n 'group-not-disabled:group-data-[interactive=true]:group-hover:bg-alert-container-hovered',\n ]),\n },\n {\n intent: 'danger',\n design: 'tinted',\n class: tw([\n 'bg-error-container text-on-error-container group-focus:bg-error-container-hovered',\n 'group-not-disabled:group-data-[interactive=true]:group-hover:bg-error-container-hovered',\n ]),\n },\n {\n intent: 'info',\n design: 'tinted',\n class: tw([\n 'bg-info-container text-on-info-container group-focus:bg-info-container-hovered',\n 'group-not-disabled:group-data-[interactive=true]:group-hover:bg-info-container-hovered',\n ]),\n },\n {\n intent: 'neutral',\n design: 'tinted',\n class: tw([\n 'bg-neutral-container text-on-neutral-container group-focus:bg-neutral-container-hovered',\n 'group-not-disabled:group-data-[interactive=true]:group-hover:bg-neutral-container-hovered',\n ]),\n },\n {\n intent: 'surface',\n design: 'tinted',\n class: tw([\n 'bg-surface text-on-surface group-focus:bg-surface-hovered',\n 'group-not-disabled:group-data-[interactive=true]:group-hover:bg-surface-hovered',\n ]),\n },\n ],\n defaultVariants: {\n design: 'filled',\n intent: 'surface',\n inset: false,\n hasBackdrop: true,\n },\n }\n)\n\nexport type ContentStylesProps = VariantProps<typeof contentStyles>\n","import { ComponentProps } from 'react'\n\nimport { Slot } from '../slot'\nimport { contentStyles } from './Content.styles'\nimport { useCardContext } from './context'\n\nexport interface ContentProps extends ComponentProps<'div'> {\n /**\n * Change the component to the HTML tag or custom component of the only child.\n */\n asChild?: boolean\n /**\n * Whether the card should have an inset padding.\n */\n inset?: boolean\n}\n\nexport const Content = ({ children, inset, asChild, className, ref, ...props }: ContentProps) => {\n const Component = asChild ? Slot : 'div'\n const { design, intent, hasBackdrop } = useCardContext()\n\n return (\n <Component\n data-spark-component=\"card-content\"\n ref={ref}\n className={contentStyles({\n className,\n design,\n intent,\n inset,\n hasBackdrop,\n })}\n {...props}\n >\n {children}\n </Component>\n )\n}\n\nContent.displayName = 'Content'\n","import { Backdrop } from './Backdrop'\nimport { Card as Root } from './Card'\nimport { Content } from './Content'\n\nexport const Card: typeof Root & {\n Content: typeof Content\n Backdrop: typeof Backdrop\n} = Object.assign(Root, {\n Content,\n Backdrop,\n})\n\nCard.displayName = 'Card'\nContent.displayName = 'Card.Content'\nBackdrop.displayName = 'Card.Backdrop'\n\nexport { type CardProps } from './Card'\n"],"names":["backdropStyles","cva","makeVariants","Backdrop","intent","animation","props","jsx","cardStyles","tw","CardContext","createContext","useCardContext","context","useContext","MOUSE_EVENTS","hasBackdrop","children","backdropFound","searchForBackdrop","node","Children","child","isValidElement","childChildren","isInteractive","asChild","event","interactiveElements","childProps","Card","design","inset","className","ref","Component","Slot","backdropDetected","interactiveDetected","contentStyles","Content","Root"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/card/Backdrop.tsx","../../src/card/Card.styles.tsx","../../src/card/context.tsx","../../src/card/utils.ts","../../src/card/Card.tsx","../../src/card/Content.styles.tsx","../../src/card/Content.tsx","../../src/card/index.ts"],"sourcesContent":["import { makeVariants } from '@spark-ui/internal-utils'\nimport { cva, VariantProps } from 'class-variance-authority'\n\nexport const backdropStyles = cva(\n [\n 'default:bg-surface default:bg-gradient-to-r absolute inset-x-0 top-0',\n 'h-sz-16',\n 'default:rounded-t-lg',\n 'bg-[length:200%_100%] bg-position-[0%_0%]',\n ],\n {\n variants: {\n animation: {\n none: '',\n pulse: 'animate-standalone-backdrop-pulse',\n },\n intent: makeVariants<\n 'intent',\n [\n 'main',\n 'support',\n 'accent',\n 'basic',\n 'success',\n 'alert',\n 'danger',\n 'info',\n 'neutral',\n 'surface',\n 'surfaceInverse',\n ]\n >({\n main: ['default:from-main/dim-4 default:via-main/dim-2 default:to-main/dim-4'],\n support: ['default:from-support/dim-4 default:via-support/dim-2 default:to-support/dim-4'],\n accent: ['default:from-accent/dim-4 default:via-accent/dim-2 default:to-accent/dim-4'],\n basic: ['default:from-basic/dim-4 default:via-basic/dim-2 default:to-basic/dim-4'],\n success: ['default:from-success/dim-4 default:via-success/dim-2 default:to-success/dim-4'],\n alert: ['default:from-alert/dim-4 default:via-alert/dim-2 default:to-alert/dim-4'],\n danger: ['default:from-error/dim-4 default:via-error/dim-2 default:to-error/dim-4'],\n info: ['default:from-info/dim-4 default:via-info/dim-2 default:to-info/dim-4'],\n neutral: ['default:from-neutral/dim-4 default:via-neutral/dim-2 default:to-neutral/dim-4'],\n surface: ['default:from-outline/dim-4 default:via-outline/dim-2 default:to-outline/dim-4'],\n surfaceInverse: [\n 'default:from-surface/dim-4 default:via-surface/dim-2 default:to-surface/dim-4',\n ],\n }),\n },\n defaultVariants: {\n intent: 'main',\n animation: 'none',\n },\n }\n)\n\nexport type BackdropStylesProps = VariantProps<typeof backdropStyles>\n\ninterface BackdropProps extends BackdropStylesProps {\n className?: string\n}\n\nexport const Backdrop = ({ intent = 'main', animation = 'none', ...props }: BackdropProps) => {\n return <div className={backdropStyles({ intent, animation })} {...props} />\n}\n\nBackdrop.displayName = 'Card.Backdrop'\n","import { makeVariants, tw } from '@spark-ui/internal-utils'\nimport { cva, VariantProps } from 'class-variance-authority'\n\nexport const cardStyles = cva(\n [\n 'group relative bg-clip-padding default:rounded-lg focus-visible:u-outline',\n 'disabled:opacity-dim-3 disabled:cursor-not-allowed',\n ],\n {\n variants: {\n design: {\n filled: [],\n outlined: ['border-sm'],\n tinted: [],\n },\n hasBackdrop: {\n true: ['pt-md'],\n },\n /**\n * Color scheme of the button.\n */\n intent: makeVariants<\n 'intent',\n [\n 'main',\n 'support',\n 'accent',\n 'basic',\n 'success',\n 'alert',\n 'danger',\n 'info',\n 'neutral',\n 'surface',\n 'surfaceInverse',\n ]\n >({\n main: [],\n support: [],\n accent: [],\n basic: [],\n success: [],\n alert: [],\n danger: [],\n info: [],\n neutral: [],\n surface: [],\n surfaceInverse: [],\n }),\n },\n compoundVariants: [\n // OUTLINED\n { intent: 'main', design: 'outlined', class: tw(['border-main']) },\n { intent: 'support', design: 'outlined', class: tw(['border-support']) },\n { intent: 'accent', design: 'outlined', class: tw(['border-accent']) },\n { intent: 'basic', design: 'outlined', class: tw(['border-basic']) },\n { intent: 'success', design: 'outlined', class: tw(['border-success']) },\n { intent: 'alert', design: 'outlined', class: tw(['border-alert']) },\n { intent: 'danger', design: 'outlined', class: tw(['border-error']) },\n { intent: 'info', design: 'outlined', class: tw(['border-info']) },\n { intent: 'neutral', design: 'outlined', class: tw(['border-neutral']) },\n { intent: 'surface', design: 'outlined', class: tw(['border-outline']) },\n ],\n defaultVariants: {\n design: 'filled',\n intent: 'surface',\n },\n }\n)\n\nexport type CardStylesProps = VariantProps<typeof cardStyles>\n","import { createContext, useContext } from 'react'\n\nimport type { CardStylesProps } from './Card.styles'\n\nexport interface CardContextValue {\n design: CardStylesProps['design']\n intent: CardStylesProps['intent']\n hasBackdrop: boolean\n inset: boolean\n isInteractive: boolean\n}\n\nconst CardContext = createContext<CardContextValue | undefined>(undefined)\n\nexport const useCardContext = () => {\n const context = useContext(CardContext)\n if (!context) {\n throw new Error('useCardContext must be used within a Card component')\n }\n\n return context\n}\n\nexport { CardContext }\n","import { Children, isValidElement, ReactNode } from 'react'\n\nconst MOUSE_EVENTS = [\n 'onClick',\n 'onMouseDown',\n 'onMouseUp',\n 'onMouseEnter',\n 'onMouseLeave',\n 'onMouseMove',\n 'onMouseOver',\n 'onMouseOut',\n 'onDoubleClick',\n 'onContextMenu',\n] as const\n\nexport const hasBackdrop = (children: ReactNode): boolean => {\n let backdropFound = false\n\n const searchForBackdrop = (node: ReactNode): void => {\n if (backdropFound) return\n\n Children.forEach(node, child => {\n if (backdropFound) return\n\n if (isValidElement(child)) {\n const isBackdropComponent =\n typeof child.type === 'function' &&\n (child.type as { displayName?: string }).displayName === 'Card.Backdrop'\n\n if (isBackdropComponent) {\n backdropFound = true\n\n return\n }\n\n const hasChildren =\n child.props && typeof child.props === 'object' && 'children' in child.props\n\n if (hasChildren) {\n const childChildren = (child.props as { children: ReactNode }).children\n if (childChildren !== undefined && childChildren !== null) {\n searchForBackdrop(childChildren)\n }\n }\n }\n })\n }\n\n searchForBackdrop(children)\n\n return backdropFound\n}\n\nexport const isInteractive = (\n children: ReactNode,\n asChild: boolean | undefined,\n props: Record<string, any>\n): boolean => {\n const hasMouseEventHandlers = MOUSE_EVENTS.some(event => event in props)\n\n if (hasMouseEventHandlers) {\n return true\n }\n\n if (!asChild) {\n return false\n }\n\n const child = Children.only(children)\n\n if (!isValidElement(child)) {\n return false\n }\n\n const interactiveElements = ['a', 'button']\n const isInteractiveElement =\n typeof child.type === 'string' && interactiveElements.includes(child.type)\n\n if (isInteractiveElement) {\n return true\n }\n\n const childProps = child.props as Record<string, any>\n const hasChildEventHandlers = MOUSE_EVENTS.some(event => event in childProps)\n\n return hasChildEventHandlers\n}\n","import { ComponentProps } from 'react'\n\nimport { Slot } from '../slot'\nimport { cardStyles, type CardStylesProps } from './Card.styles'\nimport { CardContext } from './context'\nimport { hasBackdrop, isInteractive } from './utils'\n\nexport interface CardProps extends ComponentProps<'div'>, CardStylesProps {\n /**\n * Change the component to the HTML tag or custom component of the only child.\n */\n asChild?: boolean\n /**\n * Whether the card should have an inset padding.\n */\n inset?: boolean\n}\n\nexport const Card = ({\n children,\n design = 'filled',\n intent = 'surface',\n inset = false,\n asChild,\n className,\n ref,\n ...props\n}: CardProps) => {\n const Component = asChild ? Slot : 'div'\n const backdropDetected = hasBackdrop(children)\n const interactiveDetected = isInteractive(children, asChild, props)\n\n return (\n <CardContext.Provider\n value={{\n design,\n intent,\n hasBackdrop: backdropDetected,\n inset,\n isInteractive: interactiveDetected,\n }}\n >\n <Component\n data-spark-component=\"card\"\n data-interactive={interactiveDetected}\n ref={ref}\n className={cardStyles({\n className,\n design,\n intent,\n hasBackdrop: backdropDetected,\n })}\n {...props}\n >\n {children}\n </Component>\n </CardContext.Provider>\n )\n}\n\nCard.displayName = 'Card'\n","import { makeVariants, tw } from '@spark-ui/internal-utils'\nimport { cva, VariantProps } from 'class-variance-authority'\n\nexport const contentStyles = cva(\n [\n 'relative h-full default:rounded-lg w-full focus-visible:u-outline',\n 'default:transition-colors default:duration-200 ease-linear',\n ],\n {\n variants: {\n inset: {\n false: ['default:p-lg'],\n },\n design: {\n filled: [],\n outlined: [\n 'default:bg-surface group-focus:bg-surface-hovered group-not-disabled:group-data-[interactive=true]:group-hover:bg-surface-hovered',\n ],\n tinted: [],\n },\n hasBackdrop: {\n true: ['rounded-t-[16px_8px] '],\n },\n intent: makeVariants<\n 'intent',\n [\n 'main',\n 'support',\n 'accent',\n 'basic',\n 'success',\n 'alert',\n 'danger',\n 'info',\n 'neutral',\n 'surface',\n 'surfaceInverse',\n ]\n >({\n main: [],\n support: [],\n accent: [],\n basic: [],\n success: [],\n alert: [],\n danger: [],\n info: [],\n neutral: [],\n surface: [],\n surfaceInverse: [],\n }),\n },\n compoundVariants: [\n // FILLED\n {\n intent: 'main',\n design: 'filled',\n class: tw([\n 'bg-main text-on-main group-focus:bg-main-hovered',\n 'group-not-disabled:group-data-[interactive=true]:group-hover:bg-main-hovered',\n ]),\n },\n {\n intent: 'support',\n design: 'filled',\n class: tw([\n 'bg-support text-on-support group-focus:bg-support-hovered',\n 'group-not-disabled:group-data-[interactive=true]:group-hover:bg-support-hovered',\n ]),\n },\n {\n intent: 'accent',\n design: 'filled',\n class: tw([\n 'bg-accent text-on-accent group-focus:bg-accent-hovered',\n 'group-not-disabled:group-data-[interactive=true]:group-hover:bg-accent-hovered',\n ]),\n },\n {\n intent: 'basic',\n design: 'filled',\n class: tw([\n 'bg-basic text-on-basic group-focus:bg-basic-hovered',\n 'group-not-disabled:group-data-[interactive=true]:group-hover:bg-basic-hovered',\n ]),\n },\n {\n intent: 'success',\n design: 'filled',\n class: tw([\n 'bg-success text-on-success group-focus:bg-success-hovered',\n 'group-not-disabled:group-data-[interactive=true]:group-hover:bg-success-hovered',\n ]),\n },\n {\n intent: 'alert',\n design: 'filled',\n class: tw([\n 'bg-alert text-on-alert group-focus:bg-alert-hovered',\n 'group-not-disabled:group-data-[interactive=true]:group-hover:bg-alert-hovered',\n ]),\n },\n {\n intent: 'danger',\n design: 'filled',\n class: tw([\n 'text-on-error bg-error group-focus:bg-error-hovered',\n 'group-not-disabled:group-data-[interactive=true]:group-hover:bg-error-hovered',\n ]),\n },\n {\n intent: 'info',\n design: 'filled',\n class: tw([\n 'text-on-error bg-info group-focus:bg-info-hovered',\n 'group-not-disabled:group-data-[interactive=true]:group-hover:bg-info-hovered',\n ]),\n },\n {\n intent: 'neutral',\n design: 'filled',\n class: tw([\n 'bg-neutral text-on-neutral group-focus:bg-neutral-hovered',\n 'group-not-disabled:group-data-[interactive=true]:group-hover:bg-neutral-hovered',\n ]),\n },\n {\n intent: 'surface',\n design: 'filled',\n class: tw([\n 'bg-surface text-on-surface group-focus:bg-surface-hovered',\n 'group-not-disabled:group-data-[interactive=true]:group-hover:bg-surface-hovered',\n ]),\n },\n // OUTLINED\n /**\n * Outlined styles are handled by the Card component (parent)\n */\n // TINTED\n {\n intent: 'main',\n design: 'tinted',\n class: tw([\n 'bg-main-container text-on-main-container group-focus:bg-main-container-hovered',\n 'group-not-disabled:group-data-[interactive=true]:group-hover:bg-main-container-hovered',\n ]),\n },\n {\n intent: 'support',\n design: 'tinted',\n class: tw([\n 'bg-support-container text-on-support-container group-focus:bg-support-container-hovered',\n 'group-not-disabled:group-data-[interactive=true]:group-hover:bg-support-container-hovered',\n ]),\n },\n {\n intent: 'accent',\n design: 'tinted',\n class: tw([\n 'bg-accent-container text-on-accent-container group-focus:bg-accent-container-hovered',\n 'group-not-disabled:group-data-[interactive=true]:group-hover:bg-accent-container-hovered',\n ]),\n },\n {\n intent: 'basic',\n design: 'tinted',\n class: tw([\n 'bg-basic-container text-on-basic-container group-focus:bg-basic-container-hovered',\n ]),\n },\n {\n intent: 'success',\n design: 'tinted',\n class: tw([\n 'bg-success-container text-on-success-container group-focus:bg-success-container-hovered',\n 'group-not-disabled:group-data-[interactive=true]:group-hover:bg-success-container-hovered',\n ]),\n },\n {\n intent: 'alert',\n design: 'tinted',\n class: tw([\n 'bg-alert-container text-on-alert-container group-focus:bg-alert-container-hovered',\n 'group-not-disabled:group-data-[interactive=true]:group-hover:bg-alert-container-hovered',\n ]),\n },\n {\n intent: 'danger',\n design: 'tinted',\n class: tw([\n 'bg-error-container text-on-error-container group-focus:bg-error-container-hovered',\n 'group-not-disabled:group-data-[interactive=true]:group-hover:bg-error-container-hovered',\n ]),\n },\n {\n intent: 'info',\n design: 'tinted',\n class: tw([\n 'bg-info-container text-on-info-container group-focus:bg-info-container-hovered',\n 'group-not-disabled:group-data-[interactive=true]:group-hover:bg-info-container-hovered',\n ]),\n },\n {\n intent: 'neutral',\n design: 'tinted',\n class: tw([\n 'bg-neutral-container text-on-neutral-container group-focus:bg-neutral-container-hovered',\n 'group-not-disabled:group-data-[interactive=true]:group-hover:bg-neutral-container-hovered',\n ]),\n },\n {\n intent: 'surface',\n design: 'tinted',\n class: tw([\n 'bg-surface text-on-surface group-focus:bg-surface-hovered',\n 'group-not-disabled:group-data-[interactive=true]:group-hover:bg-surface-hovered',\n ]),\n },\n ],\n defaultVariants: {\n design: 'filled',\n intent: 'surface',\n inset: false,\n hasBackdrop: true,\n },\n }\n)\n\nexport type ContentStylesProps = VariantProps<typeof contentStyles>\n","import { ComponentProps } from 'react'\n\nimport { Slot } from '../slot'\nimport { contentStyles } from './Content.styles'\nimport { useCardContext } from './context'\n\nexport interface ContentProps extends ComponentProps<'div'> {\n /**\n * Change the component to the HTML tag or custom component of the only child.\n */\n asChild?: boolean\n /**\n * Whether the card should have an inset padding.\n */\n inset?: boolean\n}\n\nexport const Content = ({ children, inset, asChild, className, ref, ...props }: ContentProps) => {\n const Component = asChild ? Slot : 'div'\n const { design, intent, hasBackdrop } = useCardContext()\n\n return (\n <Component\n data-spark-component=\"card-content\"\n ref={ref}\n className={contentStyles({\n className,\n design,\n intent,\n inset,\n hasBackdrop,\n })}\n {...props}\n >\n {children}\n </Component>\n )\n}\n\nContent.displayName = 'Content'\n","import { Backdrop } from './Backdrop'\nimport { Card as Root } from './Card'\nimport { Content } from './Content'\n\nexport const Card: typeof Root & {\n Content: typeof Content\n Backdrop: typeof Backdrop\n} = Object.assign(Root, {\n Content,\n Backdrop,\n})\n\nCard.displayName = 'Card'\nContent.displayName = 'Card.Content'\nBackdrop.displayName = 'Card.Backdrop'\n\nexport { type CardProps } from './Card'\n"],"names":["backdropStyles","cva","makeVariants","Backdrop","intent","animation","props","jsx","cardStyles","tw","CardContext","createContext","useCardContext","context","useContext","MOUSE_EVENTS","hasBackdrop","children","backdropFound","searchForBackdrop","node","Children","child","isValidElement","childChildren","isInteractive","asChild","event","interactiveElements","childProps","Card","design","inset","className","ref","Component","Slot","backdropDetected","interactiveDetected","contentStyles","Content","Root"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { jsx as l } from "react/jsx-runtime";
2
2
  import { makeVariants as g, tw as e } from "@spark-ui/internal-utils";
3
- import { c as p } from "../index-BmAFn37q.mjs";
4
- import { a as h } from "../Slot-C98rL4yy.mjs";
3
+ import { cva as p } from "class-variance-authority";
4
+ import { a as h } from "../Slot-D2Bbf8Gw.mjs";
5
5
  import { createContext as B, useContext as E, Children as x, isValidElement as C } from "react";
6
6
  const M = p(
7
7
  [
@@ -0,0 +1,19 @@
1
+ import { Carousel as Root } from './Carousel';
2
+ import { CarouselControls as Controls } from './CarouselControls';
3
+ import { CarouselNextButton as NextButton } from './CarouselNextButton';
4
+ import { CarouselPageIndicator as PageIndicator } from './CarouselPageIndicator';
5
+ import { CarouselPagePicker as PagePicker } from './CarouselPagePicker';
6
+ import { CarouselPrevButton as PrevButton } from './CarouselPrevButton';
7
+ import { CarouselSlide as Slide } from './CarouselSlide';
8
+ import { CarouselSlides as Slides } from './CarouselSlides';
9
+ import { CarouselViewport as Viewport } from './CarouselViewport';
10
+ export declare const Carousel: typeof Root & {
11
+ Controls: typeof Controls;
12
+ NextButton: typeof NextButton;
13
+ PrevButton: typeof PrevButton;
14
+ Slide: typeof Slide;
15
+ Slides: typeof Slides;
16
+ Viewport: typeof Viewport;
17
+ PagePicker: typeof PagePicker;
18
+ PageIndicator: typeof PageIndicator;
19
+ };
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const p=require("react/jsx-runtime"),k=require("../index-DnaHaH_0.js"),s=require("react"),se=require("@spark-ui/icons/ArrowVerticalRight"),O=require("../Icon-Bf0XrmiR.js"),$=require("../IconButton-Bf-EDzpI.js"),oe=require("@spark-ui/icons/ArrowVerticalLeft");function ae(e){const t=s.useRef(new Map),r=s.useRef(null),n=s.useRef(new Map),o=s.useCallback(()=>u=>{u.forEach(d=>{const b=d.isIntersecting,S=d.target;t.current.set(S,b);const h=n.current.get(S);h&&h(b)})},[]),a=s.useCallback(()=>{if(r.current)return r.current;const u=e.current;if(!u)return null;const d=new IntersectionObserver(o(),{root:u,threshold:.2});return r.current=d,d},[e,o]);s.useEffect(()=>{const u=a(),d=t.current,b=n.current;return()=>{u&&(u.disconnect(),d.clear(),b.clear(),r.current=null)}},[a]);const i=s.useCallback((u,d)=>{if(!u)return;const b=a();if(!b){setTimeout(()=>i(u,d),0);return}const S=t.current.get(u)??!0;t.current.set(u,S),n.current.set(u,d),b.observe(u),d(S)},[a]),c=s.useCallback(u=>{if(!u)return;const d=r.current;d&&d.unobserve(u),t.current.delete(u),n.current.delete(u)},[]),g=s.useCallback(u=>u?t.current.get(u)??!0:!0,[]);return{registerSlide:i,unregisterSlide:c,isSlideVisible:g}}function ie(e){const t=s.useRef(()=>{throw new Error("Cannot call an event handler while rendering.")});return s.useLayoutEffect(()=>{t.current=e}),s.useCallback((...r)=>t.current?.(...r),[])}const ce=()=>{const e=s.useRef(!1);return s.useEffect(()=>(e.current=!0,()=>{e.current=!1}),[]),e};function ue(e,t){const r=s.useRef(0),n=s.useRef(null);s.useEffect(()=>{const o=e.current;if(!o)return;const a="onscrollend"in window,i=()=>{t()},c=()=>{n.current&&clearTimeout(n.current),e.current&&(r.current=e.current.scrollLeft,n.current=setTimeout(()=>{e.current&&i()},150))};return a?o.addEventListener("scrollend",i):o.addEventListener("scroll",c),()=>{n.current&&clearTimeout(n.current),a?o.removeEventListener("scrollend",i):o.removeEventListener("scroll",c)}},[t,e])}function le(e,t){s.useLayoutEffect(()=>{const r=e.current;if(!r)return;const n=new ResizeObserver(o=>{for(const a of o)t(a.contentRect.width)});return n.observe(r),()=>n.disconnect()},[e,t])}function de({totalSlides:e,slidesPerMove:t,slidesPerPage:r}){const n=t==="auto"?r:t,o=[],a=Math.floor((e-r)/n)*n;for(let i=0;i<=a;i+=n)o.push(i);return o[o.length-1]!==e-r&&o.push(e-r),o}function q(e){return e?Array.from(e.querySelectorAll('[data-part="item"]')):[]}function _(e,{container:t,slidesPerMove:r,slidesPerPage:n}){return de({totalSlides:q(t).length,slidesPerPage:n,slidesPerMove:r}).includes(e)}function B({container:e,slidesPerMove:t,slidesPerPage:r}){return e?q(e).filter((n,o)=>_(o,{slidesPerMove:t,slidesPerPage:r,container:e})).map(n=>n.offsetLeft):[]}function fe({dotIndex:e,pageState:t,totalPages:r,maxDots:n=5}){if(r<=n)return e===t?"active":"idle";if(t<=Math.floor(n/2))return e>n-1?"hidden":e===t?"active":e===n-1?"edge":"idle";if(t>=r-Math.ceil(n/2)){const i=r-n;return e<i?"hidden":e===t?"active":e===i?"edge":"idle"}const o=t-Math.floor(n/2),a=t+Math.floor(n/2);return e<o||e>a?"hidden":e===t?"active":e===o||e===a?"edge":"idle"}function pe(e=[],{carouselRef:t,slidesPerMove:r,slidesPerPage:n}){const[o,a]=s.useState(e),i=s.useMemo(()=>o,[o]);return le(t,()=>{const c=B({slidesPerMove:r,slidesPerPage:n,container:t.current});JSON.stringify(o)!==JSON.stringify(c)&&a(c)}),[i,a]}const y="carousel",N="ltr",ge=({defaultPage:e,gap:t=16,snapType:r="mandatory",snapStop:n="always",scrollPadding:o=0,slidesPerPage:a=1,slidesPerMove:i="auto",scrollBehavior:c="smooth",loop:g=!1,pagePickerInset:u=!1,maxDots:d=5,page:b,onPageChange:S})=>{const h=s.useId(),[f,I]=s.useState(e||b||0),C=s.useRef(null),M=s.useRef([]),T=ce().current,L=ie(S),{registerSlide:D,unregisterSlide:ee,isSlideVisible:te}=ae(C),[m]=pe([],{carouselRef:C,slidesPerMove:i,slidesPerPage:a}),P=s.useRef(g||f>0),R=s.useRef(g||f<m.length-1);P.current=g||f>0,R.current=g||f<m.length-1;const j=s.useCallback(l=>{l!==f&&(I(l),L?.(l))},[L,f]),x=s.useCallback((l,v)=>{C.current&&(C.current.scrollTo({left:m[l],behavior:v==="instant"?"auto":"smooth"}),j(l))},[j,m]),V=s.useCallback(l=>{if(P){const v=g&&f===0?m.length-1:Math.max(f-1,0);x(v,c),l?.(v)}},[g,m,f,c,x]),A=s.useCallback(l=>{if(R){const v=g&&f===m.length-1?0:Math.min(f+1,m.length-1);x(v,c),l?.(v)}},[g,m,f,c,x]);s.useEffect(()=>{b!=null&&x(b,c)},[b,c,x]),s.useLayoutEffect(()=>{if(e!=null&&!T&&C.current){const l=B({container:C.current,slidesPerMove:i,slidesPerPage:a});C.current.scrollTo({left:l[e],behavior:"instant"})}},[e,T,i,a]);const re=s.useCallback(()=>{if(!C.current||m.length===0)return;const{scrollLeft:l}=C.current,v=m.map(z=>Math.abs(l-z)),E=v.indexOf(Math.min(...v));E!==-1&&j(E)},[m,j]);return ue(C,re),{ref:C,pageIndicatorsRefs:M,gap:t,snapType:r,snapStop:n,scrollPadding:o,slidesPerPage:a,slidesPerMove:i,scrollBehavior:c,loop:g,pagePickerInset:u,maxDots:d,page:f,pageSnapPoints:m,canScrollNext:R.current,canScrollPrev:P.current,scrollTo:x,scrollPrev:V,scrollNext:A,registerSlide:D,unregisterSlide:ee,isSlideVisible:te,getRootProps:()=>({id:`carousel::${h}:`,role:"region","aria-roledescription":"carousel","data-scope":y,"data-part":"root","data-orientation":"horizontal",dir:N,style:{"--slides-per-page":a,"--slide-spacing":`${t}px`,"--slide-item-size":"calc(100% / var(--slides-per-page) - var(--slide-spacing) * (var(--slides-per-page) - 1) / var(--slides-per-page))"}}),getControlProps:()=>({"data-scope":y,"data-part":"control","data-orientation":"horizontal"}),getPrevTriggerProps:()=>({id:`carousel::${h}::prev-trigger`,"aria-controls":`carousel::${h}::item-group`,"data-scope":y,"data-part":"prev-trigger","data-orientation":"horizontal",type:"button",dir:N,disabled:!P.current,onClick:()=>V()}),getNextTriggerProps:()=>({id:`carousel::${h}::next-trigger`,"aria-controls":`carousel::${h}::item-group`,"data-scope":y,"data-part":"next-trigger","data-orientation":"horizontal",type:"button",dir:N,disabled:!R.current,onClick:()=>A()}),getSlidesContainerProps:()=>({id:`carousel::${h}::item-group`,"aria-live":a>1?"off":"polite","data-scope":y,"data-part":"item-group","data-orientation":"horizontal",dir:N,tabIndex:0,style:{display:"grid",gap:"var(--slide-spacing)",scrollSnapType:`x ${r}`,gridAutoFlow:"column",scrollbarWidth:"none",gridAutoColumns:"var(--slide-item-size)",overflowX:"auto"},ref:C}),getSlideProps:({index:l})=>{const v=_(l,{container:C.current,slidesPerMove:i,slidesPerPage:a});return{id:`carousel::${h}::item:${l}`,role:"group","aria-roledescription":"slide","data-scope":y,"data-part":"item","data-index":l,"data-orientation":"horizontal",dir:N,style:{...v&&{scrollSnapAlign:"start",scrollSnapStop:n}}}},getIndicatorGroupProps:()=>({role:"radiogroup",id:`carousel::${h}::indicator-group`,"data-scope":y,"data-part":"indicator-group","data-orientation":"horizontal",dir:N}),getIndicatorProps:({index:l})=>{const v=fe({dotIndex:l,pageState:f,totalPages:m.length,maxDots:d});return{role:"radio",id:`carousel::${h}::indicator:${l}`,"aria-checked":l===f,"data-scope":y,"data-part":"indicator","data-orientation":"horizontal","data-index":l,"data-state":v,tabIndex:l===f?0:-1,onClick:()=>{x(l,c)},onKeyDown:E=>{const z=ne=>{M.current[ne]?.focus()};E.key==="ArrowRight"&&R?A(z):E.key==="ArrowLeft"&&P&&V(z)}}}}},F=s.createContext(null),G=({className:e,snapType:t="mandatory",snapStop:r="always",scrollBehavior:n="smooth",slidesPerMove:o="auto",pagePickerInset:a=!1,slidesPerPage:i=1,loop:c=!1,children:g,gap:u=16,defaultPage:d,page:b,onPageChange:S,maxDots:h=5,...f})=>{const I=ge({defaultPage:d,slidesPerPage:i,slidesPerMove:o,loop:c,gap:u,scrollBehavior:n,snapStop:r,snapType:t,page:b,pagePickerInset:a,onPageChange:S,maxDots:h});return p.jsx(F.Provider,{value:{...I,scrollBehavior:n},children:p.jsx("div",{"data-spark-component":"carousel",className:k.cx("gap-lg relative box-border flex flex-col",e),...I.getRootProps(),...f,children:g})})};G.displayName="Carousel";const w=()=>{const e=s.useContext(F);if(!e)throw Error("useCarouselContext must be used within a Carousel provider");return e},J=({children:e,className:t,...r})=>{const n=w();return p.jsx("div",{"data-spark-component":"carousel-controls",className:k.cx("default:px-lg pointer-events-none absolute inset-0 flex flex-row items-center justify-between",t),...n.getControlProps(),...r,children:e})};J.displayName="Carousel.Controls";const W=({"aria-label":e,...t})=>{const r=w();return p.jsx($.IconButton,{"data-spark-component":"carousel-next-button",...r.getNextTriggerProps(),intent:"surface",design:"filled",className:"pointer-events-auto cursor-pointer shadow-sm disabled:invisible","aria-label":e,...t,children:p.jsx(O.Icon,{children:p.jsx(se.ArrowVerticalRight,{})})})};W.displayName="Carousel.NextButton";const K=({children:e,unstyled:t=!1,index:r,"aria-label":n,className:o,intent:a="basic"})=>{const i=w(),c=s.useRef(null);s.useEffect(()=>{i.pageIndicatorsRefs.current&&(i.pageIndicatorsRefs.current[r]=c.current)});const g=i.getIndicatorProps({index:r});return p.jsx("button",{"data-spark-component":"carousel-page-indicator",ref:c,...g,"aria-label":n,className:k.cx({[k.cx("border-outline group relative flex justify-center border-0 hover:cursor-pointer","m-sm rounded-sm transition-all duration-[200ms] ease-linear","w-sz-8 h-sz-8","data-[state=active]:w-sz-32 data-[state=active]:h-sz-8","data-[state=edge]:w-sz-4 data-[state=edge]:h-sz-4","data-[state=hidden]:m-0 data-[state=hidden]:size-0",a==="surface"?"data-[state=active]:bg-surface bg-surface/dim-2":"data-[state=active]:bg-basic bg-on-surface/dim-2")]:!t},o),children:e},r)};K.displayName="Carousel.PageIndicator";const X=({children:e,className:t})=>{const r=w();return p.jsx(p.Fragment,{children:p.jsx("div",{"data-spark-component":"carousel-page-picker",...r.getIndicatorGroupProps(),className:k.cx("flex-wrap items-center justify-center","default:min-h-sz-16 flex",r.pagePickerInset&&"bottom-sz-12 absolute inset-x-0",t),children:r.pageSnapPoints.length<=1?null:e({...r,pages:Array.from({length:r.pageSnapPoints.length},(n,o)=>o)})})})};X.displayName="Carousel.PagePicker";const H=({"aria-label":e,...t})=>{const r=w();return p.jsx($.IconButton,{"data-spark-component":"carousel-prev-button",...r.getPrevTriggerProps(),intent:"surface",design:"filled",className:"pointer-events-auto cursor-pointer shadow-sm disabled:invisible","aria-label":e,...t,children:p.jsx(O.Icon,{children:p.jsx(oe.ArrowVerticalLeft,{})})})};H.displayName="Carousel.PrevButton";function be(e,t){const[r,n]=s.useState(!0),o=w();return s.useEffect(()=>{const a=e.current;if(!a)return;const{registerSlide:i,unregisterSlide:c}=o;return i(a,n),()=>{c(a)}},[e]),r}const Q=({children:e,index:t=0,totalSlides:r,className:n="",...o})=>{const a=s.useRef(null),i=w(),c=be(a,i.ref);return p.jsx("div",{"data-spark-component":"carousel-slide",ref:a,...i.getSlideProps({index:t,totalSlides:r}),className:k.cx("default:bg-surface relative overflow-hidden",n),"aria-hidden":!c,inert:!c,...o,children:e})};Q.displayName="Carousel.Slide";const U=({children:e,className:t=""})=>{const r=w(),n=s.Children.toArray(e);return p.jsx("div",{"data-spark-component":"carousel-slides",...r.getSlidesContainerProps(),className:k.cx("focus-visible:u-outline relative w-full","[-ms-overflow-style:none] [scrollbar-width:none] [&::-webkit-scrollbar]:hidden",t),children:n.map((o,a)=>s.isValidElement(o)?s.cloneElement(o,{index:a,totalSlides:n.length}):o)})};U.displayName="Carousel.Slides";const Y=({children:e})=>p.jsx("div",{className:"relative flex items-center justify-around p-0",children:e});Y.displayName="Carousel.Viewport";const Z=Object.assign(G,{Controls:J,NextButton:W,PrevButton:H,Slide:Q,Slides:U,Viewport:Y,PagePicker:X,PageIndicator:K});Z.displayName="Carousel";exports.Carousel=Z;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const p=require("react/jsx-runtime"),k=require("class-variance-authority"),s=require("react"),se=require("@spark-ui/icons/ArrowVerticalRight"),O=require("../Icon-CF0W0LKr.js"),$=require("../IconButton-D3g86WpZ.js"),oe=require("@spark-ui/icons/ArrowVerticalLeft");function ae(e){const t=s.useRef(new Map),r=s.useRef(null),n=s.useRef(new Map),o=s.useCallback(()=>u=>{u.forEach(d=>{const b=d.isIntersecting,S=d.target;t.current.set(S,b);const h=n.current.get(S);h&&h(b)})},[]),a=s.useCallback(()=>{if(r.current)return r.current;const u=e.current;if(!u)return null;const d=new IntersectionObserver(o(),{root:u,threshold:.2});return r.current=d,d},[e,o]);s.useEffect(()=>{const u=a(),d=t.current,b=n.current;return()=>{u&&(u.disconnect(),d.clear(),b.clear(),r.current=null)}},[a]);const i=s.useCallback((u,d)=>{if(!u)return;const b=a();if(!b){setTimeout(()=>i(u,d),0);return}const S=t.current.get(u)??!0;t.current.set(u,S),n.current.set(u,d),b.observe(u),d(S)},[a]),c=s.useCallback(u=>{if(!u)return;const d=r.current;d&&d.unobserve(u),t.current.delete(u),n.current.delete(u)},[]),g=s.useCallback(u=>u?t.current.get(u)??!0:!0,[]);return{registerSlide:i,unregisterSlide:c,isSlideVisible:g}}function ie(e){const t=s.useRef(()=>{throw new Error("Cannot call an event handler while rendering.")});return s.useLayoutEffect(()=>{t.current=e}),s.useCallback((...r)=>t.current?.(...r),[])}const ce=()=>{const e=s.useRef(!1);return s.useEffect(()=>(e.current=!0,()=>{e.current=!1}),[]),e};function ue(e,t){const r=s.useRef(0),n=s.useRef(null);s.useEffect(()=>{const o=e.current;if(!o)return;const a="onscrollend"in window,i=()=>{t()},c=()=>{n.current&&clearTimeout(n.current),e.current&&(r.current=e.current.scrollLeft,n.current=setTimeout(()=>{e.current&&i()},150))};return a?o.addEventListener("scrollend",i):o.addEventListener("scroll",c),()=>{n.current&&clearTimeout(n.current),a?o.removeEventListener("scrollend",i):o.removeEventListener("scroll",c)}},[t,e])}function le(e,t){s.useLayoutEffect(()=>{const r=e.current;if(!r)return;const n=new ResizeObserver(o=>{for(const a of o)t(a.contentRect.width)});return n.observe(r),()=>n.disconnect()},[e,t])}function de({totalSlides:e,slidesPerMove:t,slidesPerPage:r}){const n=t==="auto"?r:t,o=[],a=Math.floor((e-r)/n)*n;for(let i=0;i<=a;i+=n)o.push(i);return o[o.length-1]!==e-r&&o.push(e-r),o}function q(e){return e?Array.from(e.querySelectorAll('[data-part="item"]')):[]}function _(e,{container:t,slidesPerMove:r,slidesPerPage:n}){return de({totalSlides:q(t).length,slidesPerPage:n,slidesPerMove:r}).includes(e)}function B({container:e,slidesPerMove:t,slidesPerPage:r}){return e?q(e).filter((n,o)=>_(o,{slidesPerMove:t,slidesPerPage:r,container:e})).map(n=>n.offsetLeft):[]}function fe({dotIndex:e,pageState:t,totalPages:r,maxDots:n=5}){if(r<=n)return e===t?"active":"idle";if(t<=Math.floor(n/2))return e>n-1?"hidden":e===t?"active":e===n-1?"edge":"idle";if(t>=r-Math.ceil(n/2)){const i=r-n;return e<i?"hidden":e===t?"active":e===i?"edge":"idle"}const o=t-Math.floor(n/2),a=t+Math.floor(n/2);return e<o||e>a?"hidden":e===t?"active":e===o||e===a?"edge":"idle"}function pe(e=[],{carouselRef:t,slidesPerMove:r,slidesPerPage:n}){const[o,a]=s.useState(e),i=s.useMemo(()=>o,[o]);return le(t,()=>{const c=B({slidesPerMove:r,slidesPerPage:n,container:t.current});JSON.stringify(o)!==JSON.stringify(c)&&a(c)}),[i,a]}const x="carousel",N="ltr",ge=({defaultPage:e,gap:t=16,snapType:r="mandatory",snapStop:n="always",scrollPadding:o=0,slidesPerPage:a=1,slidesPerMove:i="auto",scrollBehavior:c="smooth",loop:g=!1,pagePickerInset:u=!1,maxDots:d=5,page:b,onPageChange:S})=>{const h=s.useId(),[f,I]=s.useState(e||b||0),C=s.useRef(null),M=s.useRef([]),T=ce().current,L=ie(S),{registerSlide:D,unregisterSlide:ee,isSlideVisible:te}=ae(C),[m]=pe([],{carouselRef:C,slidesPerMove:i,slidesPerPage:a}),P=s.useRef(g||f>0),R=s.useRef(g||f<m.length-1);P.current=g||f>0,R.current=g||f<m.length-1;const j=s.useCallback(l=>{l!==f&&(I(l),L?.(l))},[L,f]),y=s.useCallback((l,v)=>{C.current&&(C.current.scrollTo({left:m[l],behavior:v==="instant"?"auto":"smooth"}),j(l))},[j,m]),z=s.useCallback(l=>{if(P){const v=g&&f===0?m.length-1:Math.max(f-1,0);y(v,c),l?.(v)}},[g,m,f,c,y]),A=s.useCallback(l=>{if(R){const v=g&&f===m.length-1?0:Math.min(f+1,m.length-1);y(v,c),l?.(v)}},[g,m,f,c,y]);s.useEffect(()=>{b!=null&&y(b,c)},[b,c,y]),s.useLayoutEffect(()=>{if(e!=null&&!T&&C.current){const l=B({container:C.current,slidesPerMove:i,slidesPerPage:a});C.current.scrollTo({left:l[e],behavior:"instant"})}},[e,T,i,a]);const re=s.useCallback(()=>{if(!C.current||m.length===0)return;const{scrollLeft:l}=C.current,v=m.map(V=>Math.abs(l-V)),E=v.indexOf(Math.min(...v));E!==-1&&j(E)},[m,j]);return ue(C,re),{ref:C,pageIndicatorsRefs:M,gap:t,snapType:r,snapStop:n,scrollPadding:o,slidesPerPage:a,slidesPerMove:i,scrollBehavior:c,loop:g,pagePickerInset:u,maxDots:d,page:f,pageSnapPoints:m,canScrollNext:R.current,canScrollPrev:P.current,scrollTo:y,scrollPrev:z,scrollNext:A,registerSlide:D,unregisterSlide:ee,isSlideVisible:te,getRootProps:()=>({id:`carousel::${h}:`,role:"region","aria-roledescription":"carousel","data-scope":x,"data-part":"root","data-orientation":"horizontal",dir:N,style:{"--slides-per-page":a,"--slide-spacing":`${t}px`,"--slide-item-size":"calc(100% / var(--slides-per-page) - var(--slide-spacing) * (var(--slides-per-page) - 1) / var(--slides-per-page))"}}),getControlProps:()=>({"data-scope":x,"data-part":"control","data-orientation":"horizontal"}),getPrevTriggerProps:()=>({id:`carousel::${h}::prev-trigger`,"aria-controls":`carousel::${h}::item-group`,"data-scope":x,"data-part":"prev-trigger","data-orientation":"horizontal",type:"button",dir:N,disabled:!P.current,onClick:()=>z()}),getNextTriggerProps:()=>({id:`carousel::${h}::next-trigger`,"aria-controls":`carousel::${h}::item-group`,"data-scope":x,"data-part":"next-trigger","data-orientation":"horizontal",type:"button",dir:N,disabled:!R.current,onClick:()=>A()}),getSlidesContainerProps:()=>({id:`carousel::${h}::item-group`,"aria-live":a>1?"off":"polite","data-scope":x,"data-part":"item-group","data-orientation":"horizontal",dir:N,tabIndex:0,style:{display:"grid",gap:"var(--slide-spacing)",scrollSnapType:`x ${r}`,gridAutoFlow:"column",scrollbarWidth:"none",gridAutoColumns:"var(--slide-item-size)",overflowX:"auto"},ref:C}),getSlideProps:({index:l})=>{const v=_(l,{container:C.current,slidesPerMove:i,slidesPerPage:a});return{id:`carousel::${h}::item:${l}`,role:"group","aria-roledescription":"slide","data-scope":x,"data-part":"item","data-index":l,"data-orientation":"horizontal",dir:N,style:{...v&&{scrollSnapAlign:"start",scrollSnapStop:n}}}},getIndicatorGroupProps:()=>({role:"radiogroup",id:`carousel::${h}::indicator-group`,"data-scope":x,"data-part":"indicator-group","data-orientation":"horizontal",dir:N}),getIndicatorProps:({index:l})=>{const v=fe({dotIndex:l,pageState:f,totalPages:m.length,maxDots:d});return{role:"radio",id:`carousel::${h}::indicator:${l}`,"aria-checked":l===f,"data-scope":x,"data-part":"indicator","data-orientation":"horizontal","data-index":l,"data-state":v,tabIndex:l===f?0:-1,onClick:()=>{y(l,c)},onKeyDown:E=>{const V=ne=>{M.current[ne]?.focus()};E.key==="ArrowRight"&&R?A(V):E.key==="ArrowLeft"&&P&&z(V)}}}}},F=s.createContext(null),G=({className:e,snapType:t="mandatory",snapStop:r="always",scrollBehavior:n="smooth",slidesPerMove:o="auto",pagePickerInset:a=!1,slidesPerPage:i=1,loop:c=!1,children:g,gap:u=16,defaultPage:d,page:b,onPageChange:S,maxDots:h=5,...f})=>{const I=ge({defaultPage:d,slidesPerPage:i,slidesPerMove:o,loop:c,gap:u,scrollBehavior:n,snapStop:r,snapType:t,page:b,pagePickerInset:a,onPageChange:S,maxDots:h});return p.jsx(F.Provider,{value:{...I,scrollBehavior:n},children:p.jsx("div",{"data-spark-component":"carousel",className:k.cx("gap-lg relative box-border flex flex-col",e),...I.getRootProps(),...f,children:g})})};G.displayName="Carousel";const w=()=>{const e=s.useContext(F);if(!e)throw Error("useCarouselContext must be used within a Carousel provider");return e},J=({children:e,className:t,...r})=>{const n=w();return p.jsx("div",{"data-spark-component":"carousel-controls",className:k.cx("default:px-lg pointer-events-none absolute inset-0 flex flex-row items-center justify-between",t),...n.getControlProps(),...r,children:e})};J.displayName="Carousel.Controls";const W=({"aria-label":e,...t})=>{const r=w();return p.jsx($.IconButton,{"data-spark-component":"carousel-next-button",...r.getNextTriggerProps(),intent:"surface",design:"filled",className:"pointer-events-auto cursor-pointer shadow-sm disabled:invisible","aria-label":e,...t,children:p.jsx(O.Icon,{children:p.jsx(se.ArrowVerticalRight,{})})})};W.displayName="Carousel.NextButton";const K=({children:e,unstyled:t=!1,index:r,"aria-label":n,className:o,intent:a="basic"})=>{const i=w(),c=s.useRef(null);s.useEffect(()=>{i.pageIndicatorsRefs.current&&(i.pageIndicatorsRefs.current[r]=c.current)});const g=i.getIndicatorProps({index:r});return p.jsx("button",{"data-spark-component":"carousel-page-indicator",ref:c,...g,"aria-label":n,className:k.cx({[k.cx("border-outline group relative flex justify-center border-0 hover:cursor-pointer","m-sm rounded-sm transition-all duration-[200ms] ease-linear","w-sz-8 h-sz-8","data-[state=active]:w-sz-32 data-[state=active]:h-sz-8","data-[state=edge]:w-sz-4 data-[state=edge]:h-sz-4","data-[state=hidden]:m-0 data-[state=hidden]:size-0",a==="surface"?"data-[state=active]:bg-surface bg-surface/dim-2":"data-[state=active]:bg-basic bg-on-surface/dim-2")]:!t},o),children:e},r)};K.displayName="Carousel.PageIndicator";const X=({children:e,className:t})=>{const r=w();return p.jsx(p.Fragment,{children:p.jsx("div",{"data-spark-component":"carousel-page-picker",...r.getIndicatorGroupProps(),className:k.cx("flex-wrap items-center justify-center","default:min-h-sz-16 flex",r.pagePickerInset&&"bottom-sz-12 absolute inset-x-0",t),children:r.pageSnapPoints.length<=1?null:e({...r,pages:Array.from({length:r.pageSnapPoints.length},(n,o)=>o)})})})};X.displayName="Carousel.PagePicker";const H=({"aria-label":e,...t})=>{const r=w();return p.jsx($.IconButton,{"data-spark-component":"carousel-prev-button",...r.getPrevTriggerProps(),intent:"surface",design:"filled",className:"pointer-events-auto cursor-pointer shadow-sm disabled:invisible","aria-label":e,...t,children:p.jsx(O.Icon,{children:p.jsx(oe.ArrowVerticalLeft,{})})})};H.displayName="Carousel.PrevButton";function be(e,t){const[r,n]=s.useState(!0),o=w();return s.useEffect(()=>{const a=e.current;if(!a)return;const{registerSlide:i,unregisterSlide:c}=o;return i(a,n),()=>{c(a)}},[e]),r}const Q=({children:e,index:t=0,totalSlides:r,className:n="",...o})=>{const a=s.useRef(null),i=w(),c=be(a,i.ref);return p.jsx("div",{"data-spark-component":"carousel-slide",ref:a,...i.getSlideProps({index:t,totalSlides:r}),className:k.cx("default:bg-surface relative overflow-hidden",n),"aria-hidden":!c,inert:!c,...o,children:e})};Q.displayName="Carousel.Slide";const U=({children:e,className:t=""})=>{const r=w(),n=s.Children.toArray(e);return p.jsx("div",{"data-spark-component":"carousel-slides",...r.getSlidesContainerProps(),className:k.cx("focus-visible:u-outline relative w-full","[-ms-overflow-style:none] [scrollbar-width:none] [&::-webkit-scrollbar]:hidden",t),children:n.map((o,a)=>s.isValidElement(o)?s.cloneElement(o,{index:a,totalSlides:n.length}):o)})};U.displayName="Carousel.Slides";const Y=({children:e})=>p.jsx("div",{className:"relative flex items-center justify-around p-0",children:e});Y.displayName="Carousel.Viewport";const Z=Object.assign(G,{Controls:J,NextButton:W,PrevButton:H,Slide:Q,Slides:U,Viewport:Y,PagePicker:X,PageIndicator:K});Z.displayName="Carousel";exports.Carousel=Z;
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/carousel/useCarouselVisibility.ts","../../src/carousel/useEvent.ts","../../src/carousel/useIsMounted.ts","../../src/carousel/useScrollEnd.ts","../../src/carousel/useResizeObserver.ts","../../src/carousel/utils.ts","../../src/carousel/useSnapPoints.ts","../../src/carousel/useCarousel.ts","../../src/carousel/Carousel.tsx","../../src/carousel/CarouselControls.tsx","../../src/carousel/CarouselNextButton.tsx","../../src/carousel/CarouselPageIndicator.tsx","../../src/carousel/CarouselPagePicker.tsx","../../src/carousel/CarouselPrevButton.tsx","../../src/carousel/useIsVisible.ts","../../src/carousel/CarouselSlide.tsx","../../src/carousel/CarouselSlides.tsx","../../src/carousel/CarouselViewport.tsx","../../src/carousel/index.ts"],"sourcesContent":["import { RefObject, useCallback, useEffect, useRef } from 'react'\n\n/**\n * Hook to manage slide visibility using a centralized IntersectionObserver.\n * This optimizes performance by using a single observer per carousel instead of one per slide.\n *\n * @param carouselRef - Reference to the carousel container element\n * @returns Object with functions to register/unregister slides and check visibility\n */\nexport function useCarouselVisibility(carouselRef: RefObject<HTMLDivElement | null>) {\n const slideVisibilityMap = useRef<Map<HTMLElement, boolean>>(new Map())\n const visibilityObserverRef = useRef<IntersectionObserver | null>(null)\n const visibilityCallbacksRef = useRef<Map<HTMLElement, (isVisible: boolean) => void>>(new Map())\n\n // Create the shared IntersectionObserver callback\n const createObserverCallback = useCallback(() => {\n return (entries: IntersectionObserverEntry[]) => {\n // Batch all visibility updates to minimize re-renders\n entries.forEach(entry => {\n const isVisible = entry.isIntersecting\n const element = entry.target as HTMLElement\n slideVisibilityMap.current.set(element, isVisible)\n\n // Notify the callback if it exists\n const callback = visibilityCallbacksRef.current.get(element)\n if (callback) {\n callback(isVisible)\n }\n })\n }\n }, [])\n\n // Initialize or get the shared IntersectionObserver\n const getOrCreateObserver = useCallback(() => {\n if (visibilityObserverRef.current) {\n return visibilityObserverRef.current\n }\n\n const container = carouselRef.current\n if (!container) return null\n\n const observer = new IntersectionObserver(createObserverCallback(), {\n root: container,\n threshold: 0.2,\n })\n\n visibilityObserverRef.current = observer\n\n return observer\n }, [carouselRef, createObserverCallback])\n\n // Initialize the shared IntersectionObserver when container is ready\n useEffect(() => {\n const observer = getOrCreateObserver()\n // Capture ref values to avoid stale closure warnings\n const visibilityMap = slideVisibilityMap.current\n const callbacksMap = visibilityCallbacksRef.current\n\n return () => {\n if (observer) {\n observer.disconnect()\n visibilityMap.clear()\n callbacksMap.clear()\n visibilityObserverRef.current = null\n }\n }\n }, [getOrCreateObserver])\n\n // Register a slide element with the observer\n const registerSlide = useCallback(\n (element: HTMLElement | null, callback: (isVisible: boolean) => void) => {\n if (!element) return\n\n const observer = getOrCreateObserver()\n if (!observer) {\n // If container is not ready yet, retry on next tick\n setTimeout(() => registerSlide(element, callback), 0)\n\n return\n }\n\n // Check initial visibility (default to true for slides that are already in view)\n const initialVisible = slideVisibilityMap.current.get(element) ?? true\n slideVisibilityMap.current.set(element, initialVisible)\n visibilityCallbacksRef.current.set(element, callback)\n observer.observe(element)\n\n // Call callback with initial state\n callback(initialVisible)\n },\n [getOrCreateObserver]\n )\n\n // Unregister a slide element from the observer\n const unregisterSlide = useCallback((element: HTMLElement | null) => {\n if (!element) return\n\n const observer = visibilityObserverRef.current\n if (observer) {\n observer.unobserve(element)\n }\n slideVisibilityMap.current.delete(element)\n visibilityCallbacksRef.current.delete(element)\n }, [])\n\n // Get current visibility state for a slide\n const isSlideVisible = useCallback((element: HTMLElement | null): boolean => {\n if (!element) return true\n\n return slideVisibilityMap.current.get(element) ?? true\n }, [])\n\n return {\n registerSlide,\n unregisterSlide,\n isSlideVisible,\n }\n}\n","import { useCallback, useLayoutEffect, useRef } from 'react'\n\ntype AnyFunction = (...args: any[]) => any\n\n/**\n * Directly from this gist: https://gist.github.com/diegohaz/695097a06f038a707c3a1b11e4e40195\n * Until React releases a native `useEvent` hook.\n */\nexport function useEvent<T extends AnyFunction>(callback?: T) {\n const ref = useRef<AnyFunction | undefined>(() => {\n throw new Error('Cannot call an event handler while rendering.')\n })\n\n useLayoutEffect(() => {\n ref.current = callback\n })\n\n return useCallback<AnyFunction>((...args) => ref.current?.(...args), []) as T\n}\n","import { useEffect, useRef } from 'react'\n\nexport const useIsMounted = () => {\n const isMounted = useRef(false)\n\n useEffect(() => {\n isMounted.current = true\n\n return () => {\n isMounted.current = false\n }\n }, [])\n\n return isMounted\n}\n","import { useEffect, useRef, RefObject } from 'react'\n\nexport function useScrollEnd(scrollRef: RefObject<HTMLDivElement | null>, callback: () => void) {\n const scrollLeft = useRef(0)\n\n /**\n * Safari (and some smaller browsers) to not yet support the `scrollend` event.\n * For those we must rely on the `scroll` event and and an idle state delay to trigger the \"scroll end\".\n *\n * Caveats:\n * - when using a trackpad or your fingers on a touch device, scrolling then holding the position might trigger the \"scrollend\" callback too early.\n */\n const safariTimeout = useRef<NodeJS.Timeout | null>(null)\n\n useEffect(() => {\n const element = scrollRef.current\n if (!element) return\n\n const supportsScrollend = 'onscrollend' in window\n\n const handleScrollEnd = () => {\n callback()\n }\n\n const handleSafariScroll = () => {\n if (safariTimeout.current) {\n clearTimeout(safariTimeout.current)\n }\n\n if (scrollRef.current) {\n scrollLeft.current = scrollRef.current.scrollLeft\n\n safariTimeout.current = setTimeout(() => {\n if (scrollRef.current) {\n handleScrollEnd()\n }\n }, 150)\n }\n }\n\n if (supportsScrollend) {\n element.addEventListener('scrollend', handleScrollEnd)\n } else {\n element.addEventListener('scroll', handleSafariScroll)\n }\n\n return () => {\n if (safariTimeout.current) {\n clearTimeout(safariTimeout.current)\n }\n\n if (supportsScrollend) {\n element.removeEventListener('scrollend', handleScrollEnd)\n } else {\n element.removeEventListener('scroll', handleSafariScroll)\n }\n }\n }, [callback, scrollRef])\n}\n\nexport default useScrollEnd\n","import { useLayoutEffect, RefObject } from 'react'\n\nexport function useResizeObserver<T extends HTMLElement | null>(\n ref: RefObject<T>,\n callback: (width: number) => void\n) {\n useLayoutEffect(() => {\n const element = ref.current\n if (!element) return\n\n const observer = new ResizeObserver(entries => {\n for (const entry of entries) {\n callback(entry.contentRect.width)\n }\n })\n\n observer.observe(element)\n\n return () => observer.disconnect() // Cleanup on unmount\n }, [ref, callback])\n}\n","/**\n * Get the indices of each slides that serves as the start of a page\n * @returns number[] (ex: [0, 2, 4])\n */\nfunction getSnapIndices({\n totalSlides,\n slidesPerMove,\n slidesPerPage,\n}: {\n totalSlides: number\n slidesPerMove: number | 'auto'\n slidesPerPage: number\n}) {\n const slideBy = slidesPerMove === 'auto' ? slidesPerPage : slidesPerMove\n const snapPoints: number[] = []\n\n const lastSnapIndex = Math.floor((totalSlides - slidesPerPage) / slideBy) * slideBy\n\n for (let i = 0; i <= lastSnapIndex; i += slideBy) {\n snapPoints.push(i)\n }\n\n // Adding final snap point if necessary\n if (snapPoints[snapPoints.length - 1] !== totalSlides - slidesPerPage) {\n snapPoints.push(totalSlides - slidesPerPage)\n }\n\n return snapPoints\n}\n\nexport function getSlideElements(container: HTMLDivElement | null): Element[] {\n return container ? Array.from(container.querySelectorAll('[data-part=\"item\"]')) : []\n}\n\nexport function isSnapPoint(\n slideIndex: number,\n {\n container,\n slidesPerMove,\n slidesPerPage,\n }: {\n container: HTMLDivElement | null\n slidesPerMove: number | 'auto'\n slidesPerPage: number\n }\n) {\n return getSnapIndices({\n totalSlides: getSlideElements(container).length,\n slidesPerPage,\n slidesPerMove,\n }).includes(slideIndex)\n}\n\n/**\n * Get the scroll value of each slides that serves as the start of a page\n * @returns number[] (ex for a 400px carousel with no gap: [400, 800, 1200])\n */\nexport function getSnapPositions({\n container,\n slidesPerMove,\n slidesPerPage,\n}: {\n container: HTMLDivElement | null\n slidesPerMove: number | 'auto'\n slidesPerPage: number\n}) {\n if (!container) return []\n\n return getSlideElements(container)\n .filter((_, index) => {\n return isSnapPoint(index, {\n slidesPerMove,\n slidesPerPage,\n container,\n })\n })\n .map(slide => (slide as HTMLElement).offsetLeft)\n}\n\n/**\n * Calculate the state of a dot indicator of a carousel depending on the current page and the total number of pages.\n */\nexport function computeDotState({\n dotIndex,\n pageState,\n totalPages,\n maxDots = 5,\n}: {\n dotIndex: number\n pageState: number\n totalPages: number\n maxDots?: number\n}): 'active' | 'edge' | 'idle' | 'hidden' {\n if (totalPages <= maxDots) {\n return dotIndex === pageState ? 'active' : 'idle'\n }\n\n if (pageState <= Math.floor(maxDots / 2)) {\n if (dotIndex > maxDots - 1) return 'hidden'\n if (dotIndex === pageState) return 'active'\n if (dotIndex === maxDots - 1) return 'edge'\n\n return 'idle'\n }\n\n if (pageState >= totalPages - Math.ceil(maxDots / 2)) {\n const startIndex = totalPages - maxDots\n if (dotIndex < startIndex) return 'hidden'\n if (dotIndex === pageState) return 'active'\n if (dotIndex === startIndex) return 'edge'\n\n return 'idle'\n }\n\n const startIndex = pageState - Math.floor(maxDots / 2)\n const endIndex = pageState + Math.floor(maxDots / 2)\n if (dotIndex < startIndex || dotIndex > endIndex) return 'hidden'\n if (dotIndex === pageState) return 'active'\n if (dotIndex === startIndex || dotIndex === endIndex) return 'edge'\n\n return 'idle'\n}\n","import { useMemo, useState, RefObject } from 'react'\n\nimport { useResizeObserver } from './useResizeObserver'\nimport { getSnapPositions } from './utils'\n\n/**\n * Get the scroll value of each slides that serves as the start of a page\n * The array is updated when resize event are caught in the carousel.\n */\nexport function useSnapPoints<T extends HTMLDivElement | null>(\n initialSnapPoints: number[] = [],\n {\n carouselRef,\n slidesPerMove,\n slidesPerPage,\n }: {\n carouselRef: RefObject<T>\n slidesPerMove: 'auto' | number\n slidesPerPage: number\n }\n) {\n const [pageSnapPoints, setPageSnapPoints] = useState(initialSnapPoints)\n\n const stableSnapPoints = useMemo(() => pageSnapPoints, [pageSnapPoints])\n\n /**\n * On resize, dimensions of the carousel might changes, which requires to update the snap points positions in the state.\n */\n useResizeObserver(carouselRef, () => {\n const newSnapPoints = getSnapPositions({\n slidesPerMove,\n slidesPerPage,\n container: carouselRef.current,\n })\n\n if (JSON.stringify(pageSnapPoints) !== JSON.stringify(newSnapPoints)) {\n setPageSnapPoints(newSnapPoints)\n }\n })\n\n return [stableSnapPoints, setPageSnapPoints] as const\n}\n","/* eslint-disable max-lines-per-function */\nimport {\n KeyboardEvent,\n useCallback,\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react'\n\nimport {\n CarouselAPI,\n ComputedControlProps,\n ComputedIndicatorGroupProps,\n ComputedIndicatorProps,\n ComputedRootProps,\n ComputedSlideGroupProps,\n ComputedSlideProps,\n ComputedTriggerProps,\n UseCarouselProps,\n} from './types'\nimport { useCarouselVisibility } from './useCarouselVisibility'\nimport { useEvent } from './useEvent'\nimport { useIsMounted } from './useIsMounted'\nimport { useScrollEnd } from './useScrollEnd'\nimport { useSnapPoints } from './useSnapPoints'\nimport { computeDotState, getSnapPositions, isSnapPoint } from './utils'\n\nconst DATA_SCOPE = 'carousel' as const\nconst DIRECTION = 'ltr' as const\n\nexport const useCarousel = ({\n defaultPage,\n gap = 16,\n snapType = 'mandatory',\n snapStop = 'always',\n scrollPadding = 0,\n slidesPerPage = 1,\n slidesPerMove = 'auto',\n scrollBehavior = 'smooth',\n loop = false,\n pagePickerInset = false,\n maxDots = 5,\n // state control\n page: controlledPage,\n onPageChange: onPageChangeProp,\n}: UseCarouselProps): CarouselAPI => {\n const carouselId = useId()\n const [pageState, setPageState] = useState(defaultPage || controlledPage || 0)\n\n const carouselRef = useRef<HTMLDivElement>(null)\n const pageIndicatorsRefs = useRef<(HTMLElement | null)[]>([])\n const isMountedRef = useIsMounted()\n const isMounted = isMountedRef.current\n const onPageChange = useEvent(onPageChangeProp)\n\n // Centralized visibility management with a single IntersectionObserver per carousel\n const { registerSlide, unregisterSlide, isSlideVisible } = useCarouselVisibility(carouselRef)\n\n const [pageSnapPoints] = useSnapPoints([], {\n carouselRef,\n slidesPerMove,\n slidesPerPage,\n })\n\n const canScrollPrev = useRef(loop || pageState > 0)\n const canScrollNext = useRef(loop || pageState < pageSnapPoints.length - 1)\n canScrollPrev.current = loop || pageState > 0\n canScrollNext.current = loop || pageState < pageSnapPoints.length - 1\n\n const handlePageChange = useCallback(\n (page: number) => {\n if (page !== pageState) {\n setPageState(page)\n onPageChange?.(page)\n }\n },\n [onPageChange, pageState]\n )\n\n const scrollTo = useCallback(\n (page: number, behavior: 'instant' | 'smooth') => {\n if (carouselRef.current) {\n carouselRef.current.scrollTo({\n left: pageSnapPoints[page],\n behavior: behavior === 'instant' ? 'auto' : 'smooth',\n })\n handlePageChange(page)\n }\n },\n [handlePageChange, pageSnapPoints]\n )\n\n const scrollPrev = useCallback(\n (cb?: (pageIndex: number) => void) => {\n if (canScrollPrev) {\n const targetPage =\n loop && pageState === 0 ? pageSnapPoints.length - 1 : Math.max(pageState - 1, 0)\n\n scrollTo(targetPage, scrollBehavior)\n cb?.(targetPage)\n }\n },\n [loop, pageSnapPoints, pageState, scrollBehavior, scrollTo]\n )\n\n const scrollNext = useCallback(\n (cb?: (pageIndex: number) => void) => {\n if (canScrollNext) {\n const targetPage =\n loop && pageState === pageSnapPoints.length - 1\n ? 0\n : Math.min(pageState + 1, pageSnapPoints.length - 1)\n\n scrollTo(targetPage, scrollBehavior)\n cb?.(targetPage)\n }\n },\n [loop, pageSnapPoints, pageState, scrollBehavior, scrollTo]\n )\n\n useEffect(() => {\n if (controlledPage != null) {\n scrollTo(controlledPage, scrollBehavior)\n }\n }, [controlledPage, scrollBehavior, scrollTo])\n\n /**\n * Set the default scroll position of the carousel based on `defaultPage`.\n * As this operation is done before the snap points are set in the state, we have to get them from the ref directly.\n */\n useLayoutEffect(() => {\n if (defaultPage != null && !isMounted && carouselRef.current) {\n const snapPositions = getSnapPositions({\n container: carouselRef.current,\n slidesPerMove,\n slidesPerPage,\n })\n\n carouselRef.current.scrollTo({\n left: snapPositions[defaultPage],\n behavior: 'instant',\n })\n }\n }, [defaultPage, isMounted, slidesPerMove, slidesPerPage])\n\n /**\n * Monitoring scrollend events inside the scrollable area to sync the carousel active page with current scroll position.\n * Scrollend has been chosen over \"scroll\" for performance reason.\n */\n const syncPageStateWithScrollPosition = useCallback(() => {\n if (!carouselRef.current || pageSnapPoints.length === 0) return\n\n const { scrollLeft } = carouselRef.current\n\n const distances = pageSnapPoints.map(pagePosition => Math.abs(scrollLeft - pagePosition))\n const pageInViewport = distances.indexOf(Math.min(...distances))\n\n if (pageInViewport !== -1) {\n handlePageChange(pageInViewport)\n }\n }, [pageSnapPoints, handlePageChange])\n\n useScrollEnd(carouselRef, syncPageStateWithScrollPosition)\n\n const contextValue: CarouselAPI = {\n ref: carouselRef,\n pageIndicatorsRefs,\n // props\n gap,\n snapType,\n snapStop,\n scrollPadding,\n slidesPerPage,\n slidesPerMove,\n scrollBehavior,\n loop,\n pagePickerInset,\n maxDots,\n // computed state\n page: pageState,\n pageSnapPoints,\n canScrollNext: canScrollNext.current,\n canScrollPrev: canScrollPrev.current,\n scrollTo,\n scrollPrev,\n scrollNext,\n // visibility management\n registerSlide,\n unregisterSlide,\n isSlideVisible,\n // anatomy\n getRootProps: (): ComputedRootProps => ({\n id: `carousel::${carouselId}:`,\n role: 'region',\n 'aria-roledescription': 'carousel',\n 'data-scope': DATA_SCOPE,\n 'data-part': 'root',\n 'data-orientation': 'horizontal',\n dir: DIRECTION,\n style: {\n '--slides-per-page': slidesPerPage,\n '--slide-spacing': `${gap}px`,\n '--slide-item-size':\n 'calc(100% / var(--slides-per-page) - var(--slide-spacing) * (var(--slides-per-page) - 1) / var(--slides-per-page))',\n },\n }),\n\n getControlProps: (): ComputedControlProps => ({\n 'data-scope': DATA_SCOPE,\n 'data-part': 'control',\n 'data-orientation': 'horizontal',\n }),\n\n getPrevTriggerProps: (): ComputedTriggerProps<'prev-trigger'> => ({\n id: `carousel::${carouselId}::prev-trigger`,\n 'aria-controls': `carousel::${carouselId}::item-group`,\n 'data-scope': DATA_SCOPE,\n 'data-part': 'prev-trigger',\n 'data-orientation': 'horizontal',\n type: 'button',\n dir: DIRECTION,\n disabled: !canScrollPrev.current,\n onClick: () => scrollPrev(),\n }),\n\n getNextTriggerProps: (): ComputedTriggerProps<'next-trigger'> => ({\n id: `carousel::${carouselId}::next-trigger`,\n 'aria-controls': `carousel::${carouselId}::item-group`,\n 'data-scope': DATA_SCOPE,\n 'data-part': 'next-trigger',\n 'data-orientation': 'horizontal',\n type: 'button',\n dir: DIRECTION,\n disabled: !canScrollNext.current,\n onClick: () => scrollNext(),\n }),\n\n getSlidesContainerProps: (): ComputedSlideGroupProps => ({\n id: `carousel::${carouselId}::item-group`,\n /**\n * The carousel pattern was originally designed for a single slide.\n * When there is more than one slide, the aria-live region is set to off to avoid announcing the whole list of slides.\n * This is not ideal but we keep it for backwards compatibility.\n *\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/carousel/#wai-aria-attributes\n */\n 'aria-live': slidesPerPage > 1 ? 'off' : 'polite',\n 'data-scope': DATA_SCOPE,\n 'data-part': 'item-group',\n 'data-orientation': 'horizontal',\n dir: DIRECTION,\n tabIndex: 0,\n style: {\n display: 'grid',\n gap: 'var(--slide-spacing)',\n scrollSnapType: `x ${snapType}`,\n gridAutoFlow: 'column',\n scrollbarWidth: 'none',\n gridAutoColumns: 'var(--slide-item-size)',\n overflowX: 'auto',\n },\n ref: carouselRef,\n }),\n\n getSlideProps: ({ index }): ComputedSlideProps => {\n const isStopPoint = isSnapPoint(index, {\n container: carouselRef.current,\n slidesPerMove,\n slidesPerPage,\n })\n\n return {\n id: `carousel::${carouselId}::item:${index}`,\n role: 'group',\n 'aria-roledescription': 'slide',\n 'data-scope': DATA_SCOPE,\n 'data-part': 'item',\n 'data-index': index,\n 'data-orientation': 'horizontal',\n dir: DIRECTION,\n style: {\n ...(isStopPoint && {\n scrollSnapAlign: 'start',\n scrollSnapStop: snapStop,\n }),\n },\n }\n },\n\n getIndicatorGroupProps: (): ComputedIndicatorGroupProps => ({\n role: 'radiogroup',\n id: `carousel::${carouselId}::indicator-group`,\n 'data-scope': DATA_SCOPE,\n 'data-part': 'indicator-group',\n 'data-orientation': 'horizontal',\n dir: DIRECTION,\n }),\n\n getIndicatorProps: ({ index }): ComputedIndicatorProps => {\n const dotState = computeDotState({\n dotIndex: index,\n pageState,\n totalPages: pageSnapPoints.length,\n maxDots,\n })\n\n return {\n role: 'radio',\n id: `carousel::${carouselId}::indicator:${index}`,\n 'aria-checked': index === pageState,\n 'data-scope': DATA_SCOPE,\n 'data-part': 'indicator',\n 'data-orientation': 'horizontal',\n 'data-index': index,\n 'data-state': dotState,\n tabIndex: index === pageState ? 0 : -1,\n onClick: () => {\n scrollTo(index, scrollBehavior)\n },\n onKeyDown: (event: KeyboardEvent) => {\n const focusActiveIndicator = (page: number) => {\n pageIndicatorsRefs.current[page]?.focus()\n }\n\n if (event.key === 'ArrowRight' && canScrollNext) {\n scrollNext(focusActiveIndicator)\n } else if (event.key === 'ArrowLeft' && canScrollPrev) {\n scrollPrev(focusActiveIndicator)\n }\n },\n }\n },\n }\n\n return contextValue\n}\n","import { cx } from 'class-variance-authority'\nimport { ComponentProps, createContext, ReactNode, useContext } from 'react'\n\nimport { CarouselAPI, UseCarouselProps } from './types'\nimport { useCarousel } from './useCarousel'\n\ninterface Props extends UseCarouselProps, ComponentProps<'div'> {\n children?: ReactNode\n className?: string\n}\n\nconst CarouselContext = createContext<CarouselAPI | null>(null)\n\nexport const Carousel = ({\n className,\n snapType = 'mandatory',\n snapStop = 'always',\n scrollBehavior = 'smooth',\n slidesPerMove = 'auto',\n pagePickerInset = false,\n slidesPerPage = 1,\n loop = false,\n children,\n gap = 16,\n defaultPage,\n page,\n onPageChange,\n maxDots = 5,\n ...props\n}: Props) => {\n const carouselApi = useCarousel({\n defaultPage,\n slidesPerPage,\n slidesPerMove,\n loop,\n gap,\n scrollBehavior,\n snapStop,\n snapType,\n page,\n pagePickerInset,\n onPageChange,\n maxDots,\n })\n\n return (\n <CarouselContext.Provider\n value={{\n ...carouselApi,\n scrollBehavior,\n }}\n >\n <div\n data-spark-component=\"carousel\"\n className={cx('gap-lg relative box-border flex flex-col', className)}\n {...carouselApi.getRootProps()}\n {...props}\n >\n {children}\n </div>\n </CarouselContext.Provider>\n )\n}\n\nCarousel.displayName = 'Carousel'\n\nexport const useCarouselContext = () => {\n const context = useContext(CarouselContext)\n\n if (!context) {\n throw Error('useCarouselContext must be used within a Carousel provider')\n }\n\n return context\n}\n","import { cx } from 'class-variance-authority'\nimport { HTMLAttributes, ReactNode } from 'react'\n\nimport { useCarouselContext } from './Carousel'\n\ninterface ControlsProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode\n}\n\nexport const CarouselControls = ({ children, className, ...props }: ControlsProps) => {\n const ctx = useCarouselContext()\n\n return (\n <div\n data-spark-component=\"carousel-controls\"\n className={cx(\n 'default:px-lg pointer-events-none absolute inset-0 flex flex-row items-center justify-between',\n className\n )}\n {...ctx.getControlProps()}\n {...props}\n >\n {children}\n </div>\n )\n}\n\nCarouselControls.displayName = 'Carousel.Controls'\n","import { ArrowVerticalRight } from '@spark-ui/icons/ArrowVerticalRight'\n\nimport { Icon } from '../icon'\nimport { IconButton, IconButtonProps } from '../icon-button'\nimport { useCarouselContext } from './Carousel'\n\nexport const CarouselNextButton = ({\n 'aria-label': ariaLabel,\n ...buttonProps\n}: IconButtonProps) => {\n const ctx = useCarouselContext()\n\n return (\n <IconButton\n data-spark-component=\"carousel-next-button\"\n {...ctx.getNextTriggerProps()}\n intent=\"surface\"\n design=\"filled\"\n className=\"pointer-events-auto cursor-pointer shadow-sm disabled:invisible\"\n aria-label={ariaLabel}\n {...buttonProps}\n >\n <Icon>\n <ArrowVerticalRight />\n </Icon>\n </IconButton>\n )\n}\n\nCarouselNextButton.displayName = 'Carousel.NextButton'\n","import { cx } from 'class-variance-authority'\nimport { ReactNode, useEffect, useRef } from 'react'\n\nimport { useCarouselContext } from './Carousel'\n\ninterface Props {\n children?: ReactNode\n 'aria-label': string\n index: number\n className?: string\n unstyled?: boolean\n intent?: 'basic' | 'surface'\n}\n\nexport const CarouselPageIndicator = ({\n children,\n unstyled = false,\n index,\n 'aria-label': ariaLabel,\n className,\n intent = 'basic',\n}: Props) => {\n const ctx = useCarouselContext()\n\n const ref = useRef<HTMLButtonElement | null>(null)\n\n useEffect(() => {\n if (ctx.pageIndicatorsRefs.current) {\n ctx.pageIndicatorsRefs.current[index] = ref.current\n }\n })\n\n const indicatorProps = ctx.getIndicatorProps({ index })\n\n return (\n <button\n data-spark-component=\"carousel-page-indicator\"\n ref={ref}\n key={index}\n {...indicatorProps}\n aria-label={ariaLabel}\n className={cx(\n {\n [cx(\n 'border-outline group relative flex justify-center border-0 hover:cursor-pointer',\n 'm-sm rounded-sm transition-all duration-[200ms] ease-linear',\n 'w-sz-8 h-sz-8',\n 'data-[state=active]:w-sz-32 data-[state=active]:h-sz-8',\n 'data-[state=edge]:w-sz-4 data-[state=edge]:h-sz-4',\n 'data-[state=hidden]:m-0 data-[state=hidden]:size-0',\n intent === 'surface'\n ? 'data-[state=active]:bg-surface bg-surface/dim-2'\n : 'data-[state=active]:bg-basic bg-on-surface/dim-2'\n )]: !unstyled,\n // [dotsStyles]: !unstyled,\n },\n className\n )}\n >\n {children}\n </button>\n )\n}\n\nCarouselPageIndicator.displayName = 'Carousel.PageIndicator'\n","import { cx } from 'class-variance-authority'\nimport { ReactNode } from 'react'\n\nimport { useCarouselContext } from './Carousel'\nimport { CarouselAPI } from './types'\n\ninterface RenderProps extends CarouselAPI {\n pages: number[]\n}\n\ninterface Props {\n children: (renderProps: RenderProps) => ReactNode\n className?: string\n}\n\nexport const CarouselPagePicker = ({ children, className }: Props) => {\n const ctx = useCarouselContext()\n\n return (\n <>\n <div\n data-spark-component=\"carousel-page-picker\"\n {...ctx.getIndicatorGroupProps()}\n className={cx(\n 'flex-wrap items-center justify-center',\n 'default:min-h-sz-16 flex',\n ctx.pagePickerInset && 'bottom-sz-12 absolute inset-x-0',\n className\n )}\n >\n {ctx.pageSnapPoints.length <= 1\n ? null\n : children({\n ...ctx,\n pages: Array.from({ length: ctx.pageSnapPoints.length }, (_, i) => i),\n })}\n </div>\n </>\n )\n}\n\nCarouselPagePicker.displayName = 'Carousel.PagePicker'\n","import { ArrowVerticalLeft } from '@spark-ui/icons/ArrowVerticalLeft'\n\nimport { Icon } from '../icon'\nimport { IconButton, IconButtonProps } from '../icon-button'\nimport { useCarouselContext } from './Carousel'\n\nexport const CarouselPrevButton = ({\n 'aria-label': ariaLabel,\n ...buttonProps\n}: IconButtonProps) => {\n const ctx = useCarouselContext()\n\n return (\n <IconButton\n data-spark-component=\"carousel-prev-button\"\n {...ctx.getPrevTriggerProps()}\n intent=\"surface\"\n design=\"filled\"\n className=\"pointer-events-auto cursor-pointer shadow-sm disabled:invisible\"\n aria-label={ariaLabel}\n {...buttonProps}\n >\n <Icon>\n <ArrowVerticalLeft />\n </Icon>\n </IconButton>\n )\n}\n\nCarouselPrevButton.displayName = 'Carousel.PrevButton'\n","import { RefObject, useEffect, useState } from 'react'\n\nimport { useCarouselContext } from './Carousel'\n\n/**\n * Hook to track slide visibility using the centralized IntersectionObserver.\n * This optimizes performance by using a single observer per carousel instead of one per slide.\n */\nexport function useIsVisible(\n elementRef: RefObject<HTMLElement | null>,\n _parentRef: RefObject<HTMLElement | null>\n) {\n const [isVisible, setIsVisible] = useState(true)\n const ctx = useCarouselContext()\n\n useEffect(() => {\n const el = elementRef.current\n if (!el) return\n\n // Extract stable functions from context to avoid unnecessary re-renders\n const { registerSlide, unregisterSlide } = ctx\n\n // Register the slide with the centralized observer\n registerSlide(el, setIsVisible)\n\n // Cleanup: unregister when the component unmounts\n return () => {\n unregisterSlide(el)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [elementRef]) // Only depend on elementRef, registerSlide/unregisterSlide are stable callbacks\n\n return isVisible\n}\n","import { cx } from 'class-variance-authority'\nimport { ComponentProps, ReactNode, useRef } from 'react'\n\nimport { useCarouselContext } from './Carousel'\nimport { useIsVisible } from './useIsVisible'\n\nexport interface CarouselSlideProps extends ComponentProps<'div'> {\n isSnapPoint?: boolean\n children?: ReactNode\n index?: number\n totalSlides?: number\n className?: string\n}\n\nexport const CarouselSlide = ({\n children,\n index = 0,\n totalSlides,\n className = '',\n ...props\n}: CarouselSlideProps) => {\n const itemRef = useRef<HTMLDivElement>(null)\n const ctx = useCarouselContext()\n\n const isVisible = useIsVisible(itemRef, ctx.ref)\n\n return (\n <div\n data-spark-component=\"carousel-slide\"\n ref={itemRef}\n {...ctx.getSlideProps({ index, totalSlides: totalSlides as number })}\n className={cx('default:bg-surface relative overflow-hidden', className)}\n aria-hidden={!isVisible}\n inert={!isVisible}\n {...props}\n >\n {children}\n </div>\n )\n}\n\nCarouselSlide.displayName = 'Carousel.Slide'\n","import { cx } from 'class-variance-authority'\nimport { Children, cloneElement, ComponentProps, isValidElement, ReactNode } from 'react'\n\nimport { useCarouselContext } from './Carousel'\nimport { CarouselSlideProps } from './CarouselSlide'\n\ninterface Props extends ComponentProps<'div'> {\n children?: ReactNode\n className?: string\n}\n\nexport const CarouselSlides = ({ children, className = '' }: Props) => {\n const ctx = useCarouselContext()\n\n const childrenElements = Children.toArray(children)\n\n return (\n <div\n data-spark-component=\"carousel-slides\"\n {...ctx.getSlidesContainerProps()}\n className={cx(\n 'focus-visible:u-outline relative w-full',\n '[-ms-overflow-style:none] [scrollbar-width:none] [&::-webkit-scrollbar]:hidden',\n className\n )}\n >\n {childrenElements.map((child, index) =>\n isValidElement<CarouselSlideProps>(child)\n ? cloneElement(child, {\n index,\n totalSlides: childrenElements.length,\n })\n : child\n )}\n </div>\n )\n}\n\nCarouselSlides.displayName = 'Carousel.Slides'\n","import { ReactNode } from 'react'\n\ninterface Props {\n children: ReactNode\n}\n\nexport const CarouselViewport = ({ children }: Props) => {\n return <div className=\"relative flex items-center justify-around p-0\">{children}</div>\n}\n\nCarouselViewport.displayName = 'Carousel.Viewport'\n","import { Carousel as Root } from './Carousel'\nimport { CarouselControls as Controls } from './CarouselControls'\nimport { CarouselNextButton as NextButton } from './CarouselNextButton'\nimport { CarouselPageIndicator as PageIndicator } from './CarouselPageIndicator'\nimport { CarouselPagePicker as PagePicker } from './CarouselPagePicker'\nimport { CarouselPrevButton as PrevButton } from './CarouselPrevButton'\nimport { CarouselSlide as Slide } from './CarouselSlide'\nimport { CarouselSlides as Slides } from './CarouselSlides'\nimport { CarouselViewport as Viewport } from './CarouselViewport'\n\nexport const Carousel: typeof Root & {\n Controls: typeof Controls\n NextButton: typeof NextButton\n PrevButton: typeof PrevButton\n Slide: typeof Slide\n Slides: typeof Slides\n Viewport: typeof Viewport\n PagePicker: typeof PagePicker\n PageIndicator: typeof PageIndicator\n} = Object.assign(Root, {\n Controls,\n NextButton,\n PrevButton,\n Slide,\n Slides,\n Viewport,\n PagePicker,\n PageIndicator,\n})\n\nCarousel.displayName = 'Carousel'\n"],"names":["useCarouselVisibility","carouselRef","slideVisibilityMap","useRef","visibilityObserverRef","visibilityCallbacksRef","createObserverCallback","useCallback","entries","entry","isVisible","element","callback","getOrCreateObserver","container","observer","useEffect","visibilityMap","callbacksMap","registerSlide","initialVisible","unregisterSlide","isSlideVisible","useEvent","ref","useLayoutEffect","args","useIsMounted","isMounted","useScrollEnd","scrollRef","scrollLeft","safariTimeout","supportsScrollend","handleScrollEnd","handleSafariScroll","useResizeObserver","getSnapIndices","totalSlides","slidesPerMove","slidesPerPage","slideBy","snapPoints","lastSnapIndex","getSlideElements","isSnapPoint","slideIndex","getSnapPositions","_","index","slide","computeDotState","dotIndex","pageState","totalPages","maxDots","startIndex","endIndex","useSnapPoints","initialSnapPoints","pageSnapPoints","setPageSnapPoints","useState","stableSnapPoints","useMemo","newSnapPoints","DATA_SCOPE","DIRECTION","useCarousel","defaultPage","gap","snapType","snapStop","scrollPadding","scrollBehavior","loop","pagePickerInset","controlledPage","onPageChangeProp","carouselId","useId","setPageState","pageIndicatorsRefs","onPageChange","canScrollPrev","canScrollNext","handlePageChange","page","scrollTo","behavior","scrollPrev","cb","targetPage","scrollNext","snapPositions","syncPageStateWithScrollPosition","distances","pagePosition","pageInViewport","isStopPoint","dotState","event","focusActiveIndicator","CarouselContext","createContext","Carousel","className","children","props","carouselApi","jsx","cx","useCarouselContext","context","useContext","CarouselControls","ctx","CarouselNextButton","ariaLabel","buttonProps","IconButton","Icon","ArrowVerticalRight","CarouselPageIndicator","unstyled","intent","indicatorProps","CarouselPagePicker","Fragment","i","CarouselPrevButton","ArrowVerticalLeft","useIsVisible","elementRef","_parentRef","setIsVisible","el","CarouselSlide","itemRef","CarouselSlides","childrenElements","Children","child","isValidElement","cloneElement","CarouselViewport","Root","Controls","NextButton","PrevButton","Slide","Slides","Viewport","PagePicker","PageIndicator"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/carousel/useCarouselVisibility.ts","../../src/carousel/useEvent.ts","../../src/carousel/useIsMounted.ts","../../src/carousel/useScrollEnd.ts","../../src/carousel/useResizeObserver.ts","../../src/carousel/utils.ts","../../src/carousel/useSnapPoints.ts","../../src/carousel/useCarousel.ts","../../src/carousel/Carousel.tsx","../../src/carousel/CarouselControls.tsx","../../src/carousel/CarouselNextButton.tsx","../../src/carousel/CarouselPageIndicator.tsx","../../src/carousel/CarouselPagePicker.tsx","../../src/carousel/CarouselPrevButton.tsx","../../src/carousel/useIsVisible.ts","../../src/carousel/CarouselSlide.tsx","../../src/carousel/CarouselSlides.tsx","../../src/carousel/CarouselViewport.tsx","../../src/carousel/index.ts"],"sourcesContent":["import { RefObject, useCallback, useEffect, useRef } from 'react'\n\n/**\n * Hook to manage slide visibility using a centralized IntersectionObserver.\n * This optimizes performance by using a single observer per carousel instead of one per slide.\n *\n * @param carouselRef - Reference to the carousel container element\n * @returns Object with functions to register/unregister slides and check visibility\n */\nexport function useCarouselVisibility(carouselRef: RefObject<HTMLDivElement | null>) {\n const slideVisibilityMap = useRef<Map<HTMLElement, boolean>>(new Map())\n const visibilityObserverRef = useRef<IntersectionObserver | null>(null)\n const visibilityCallbacksRef = useRef<Map<HTMLElement, (isVisible: boolean) => void>>(new Map())\n\n // Create the shared IntersectionObserver callback\n const createObserverCallback = useCallback(() => {\n return (entries: IntersectionObserverEntry[]) => {\n // Batch all visibility updates to minimize re-renders\n entries.forEach(entry => {\n const isVisible = entry.isIntersecting\n const element = entry.target as HTMLElement\n slideVisibilityMap.current.set(element, isVisible)\n\n // Notify the callback if it exists\n const callback = visibilityCallbacksRef.current.get(element)\n if (callback) {\n callback(isVisible)\n }\n })\n }\n }, [])\n\n // Initialize or get the shared IntersectionObserver\n const getOrCreateObserver = useCallback(() => {\n if (visibilityObserverRef.current) {\n return visibilityObserverRef.current\n }\n\n const container = carouselRef.current\n if (!container) return null\n\n const observer = new IntersectionObserver(createObserverCallback(), {\n root: container,\n threshold: 0.2,\n })\n\n visibilityObserverRef.current = observer\n\n return observer\n }, [carouselRef, createObserverCallback])\n\n // Initialize the shared IntersectionObserver when container is ready\n useEffect(() => {\n const observer = getOrCreateObserver()\n // Capture ref values to avoid stale closure warnings\n const visibilityMap = slideVisibilityMap.current\n const callbacksMap = visibilityCallbacksRef.current\n\n return () => {\n if (observer) {\n observer.disconnect()\n visibilityMap.clear()\n callbacksMap.clear()\n visibilityObserverRef.current = null\n }\n }\n }, [getOrCreateObserver])\n\n // Register a slide element with the observer\n const registerSlide = useCallback(\n (element: HTMLElement | null, callback: (isVisible: boolean) => void) => {\n if (!element) return\n\n const observer = getOrCreateObserver()\n if (!observer) {\n // If container is not ready yet, retry on next tick\n setTimeout(() => registerSlide(element, callback), 0)\n\n return\n }\n\n // Check initial visibility (default to true for slides that are already in view)\n const initialVisible = slideVisibilityMap.current.get(element) ?? true\n slideVisibilityMap.current.set(element, initialVisible)\n visibilityCallbacksRef.current.set(element, callback)\n observer.observe(element)\n\n // Call callback with initial state\n callback(initialVisible)\n },\n [getOrCreateObserver]\n )\n\n // Unregister a slide element from the observer\n const unregisterSlide = useCallback((element: HTMLElement | null) => {\n if (!element) return\n\n const observer = visibilityObserverRef.current\n if (observer) {\n observer.unobserve(element)\n }\n slideVisibilityMap.current.delete(element)\n visibilityCallbacksRef.current.delete(element)\n }, [])\n\n // Get current visibility state for a slide\n const isSlideVisible = useCallback((element: HTMLElement | null): boolean => {\n if (!element) return true\n\n return slideVisibilityMap.current.get(element) ?? true\n }, [])\n\n return {\n registerSlide,\n unregisterSlide,\n isSlideVisible,\n }\n}\n","import { useCallback, useLayoutEffect, useRef } from 'react'\n\ntype AnyFunction = (...args: any[]) => any\n\n/**\n * Directly from this gist: https://gist.github.com/diegohaz/695097a06f038a707c3a1b11e4e40195\n * Until React releases a native `useEvent` hook.\n */\nexport function useEvent<T extends AnyFunction>(callback?: T) {\n const ref = useRef<AnyFunction | undefined>(() => {\n throw new Error('Cannot call an event handler while rendering.')\n })\n\n useLayoutEffect(() => {\n ref.current = callback\n })\n\n return useCallback<AnyFunction>((...args) => ref.current?.(...args), []) as T\n}\n","import { useEffect, useRef } from 'react'\n\nexport const useIsMounted = () => {\n const isMounted = useRef(false)\n\n useEffect(() => {\n isMounted.current = true\n\n return () => {\n isMounted.current = false\n }\n }, [])\n\n return isMounted\n}\n","import { useEffect, useRef, RefObject } from 'react'\n\nexport function useScrollEnd(scrollRef: RefObject<HTMLDivElement | null>, callback: () => void) {\n const scrollLeft = useRef(0)\n\n /**\n * Safari (and some smaller browsers) to not yet support the `scrollend` event.\n * For those we must rely on the `scroll` event and and an idle state delay to trigger the \"scroll end\".\n *\n * Caveats:\n * - when using a trackpad or your fingers on a touch device, scrolling then holding the position might trigger the \"scrollend\" callback too early.\n */\n const safariTimeout = useRef<NodeJS.Timeout | null>(null)\n\n useEffect(() => {\n const element = scrollRef.current\n if (!element) return\n\n const supportsScrollend = 'onscrollend' in window\n\n const handleScrollEnd = () => {\n callback()\n }\n\n const handleSafariScroll = () => {\n if (safariTimeout.current) {\n clearTimeout(safariTimeout.current)\n }\n\n if (scrollRef.current) {\n scrollLeft.current = scrollRef.current.scrollLeft\n\n safariTimeout.current = setTimeout(() => {\n if (scrollRef.current) {\n handleScrollEnd()\n }\n }, 150)\n }\n }\n\n if (supportsScrollend) {\n element.addEventListener('scrollend', handleScrollEnd)\n } else {\n element.addEventListener('scroll', handleSafariScroll)\n }\n\n return () => {\n if (safariTimeout.current) {\n clearTimeout(safariTimeout.current)\n }\n\n if (supportsScrollend) {\n element.removeEventListener('scrollend', handleScrollEnd)\n } else {\n element.removeEventListener('scroll', handleSafariScroll)\n }\n }\n }, [callback, scrollRef])\n}\n\nexport default useScrollEnd\n","import { useLayoutEffect, RefObject } from 'react'\n\nexport function useResizeObserver<T extends HTMLElement | null>(\n ref: RefObject<T>,\n callback: (width: number) => void\n) {\n useLayoutEffect(() => {\n const element = ref.current\n if (!element) return\n\n const observer = new ResizeObserver(entries => {\n for (const entry of entries) {\n callback(entry.contentRect.width)\n }\n })\n\n observer.observe(element)\n\n return () => observer.disconnect() // Cleanup on unmount\n }, [ref, callback])\n}\n","/**\n * Get the indices of each slides that serves as the start of a page\n * @returns number[] (ex: [0, 2, 4])\n */\nfunction getSnapIndices({\n totalSlides,\n slidesPerMove,\n slidesPerPage,\n}: {\n totalSlides: number\n slidesPerMove: number | 'auto'\n slidesPerPage: number\n}) {\n const slideBy = slidesPerMove === 'auto' ? slidesPerPage : slidesPerMove\n const snapPoints: number[] = []\n\n const lastSnapIndex = Math.floor((totalSlides - slidesPerPage) / slideBy) * slideBy\n\n for (let i = 0; i <= lastSnapIndex; i += slideBy) {\n snapPoints.push(i)\n }\n\n // Adding final snap point if necessary\n if (snapPoints[snapPoints.length - 1] !== totalSlides - slidesPerPage) {\n snapPoints.push(totalSlides - slidesPerPage)\n }\n\n return snapPoints\n}\n\nexport function getSlideElements(container: HTMLDivElement | null): Element[] {\n return container ? Array.from(container.querySelectorAll('[data-part=\"item\"]')) : []\n}\n\nexport function isSnapPoint(\n slideIndex: number,\n {\n container,\n slidesPerMove,\n slidesPerPage,\n }: {\n container: HTMLDivElement | null\n slidesPerMove: number | 'auto'\n slidesPerPage: number\n }\n) {\n return getSnapIndices({\n totalSlides: getSlideElements(container).length,\n slidesPerPage,\n slidesPerMove,\n }).includes(slideIndex)\n}\n\n/**\n * Get the scroll value of each slides that serves as the start of a page\n * @returns number[] (ex for a 400px carousel with no gap: [400, 800, 1200])\n */\nexport function getSnapPositions({\n container,\n slidesPerMove,\n slidesPerPage,\n}: {\n container: HTMLDivElement | null\n slidesPerMove: number | 'auto'\n slidesPerPage: number\n}) {\n if (!container) return []\n\n return getSlideElements(container)\n .filter((_, index) => {\n return isSnapPoint(index, {\n slidesPerMove,\n slidesPerPage,\n container,\n })\n })\n .map(slide => (slide as HTMLElement).offsetLeft)\n}\n\n/**\n * Calculate the state of a dot indicator of a carousel depending on the current page and the total number of pages.\n */\nexport function computeDotState({\n dotIndex,\n pageState,\n totalPages,\n maxDots = 5,\n}: {\n dotIndex: number\n pageState: number\n totalPages: number\n maxDots?: number\n}): 'active' | 'edge' | 'idle' | 'hidden' {\n if (totalPages <= maxDots) {\n return dotIndex === pageState ? 'active' : 'idle'\n }\n\n if (pageState <= Math.floor(maxDots / 2)) {\n if (dotIndex > maxDots - 1) return 'hidden'\n if (dotIndex === pageState) return 'active'\n if (dotIndex === maxDots - 1) return 'edge'\n\n return 'idle'\n }\n\n if (pageState >= totalPages - Math.ceil(maxDots / 2)) {\n const startIndex = totalPages - maxDots\n if (dotIndex < startIndex) return 'hidden'\n if (dotIndex === pageState) return 'active'\n if (dotIndex === startIndex) return 'edge'\n\n return 'idle'\n }\n\n const startIndex = pageState - Math.floor(maxDots / 2)\n const endIndex = pageState + Math.floor(maxDots / 2)\n if (dotIndex < startIndex || dotIndex > endIndex) return 'hidden'\n if (dotIndex === pageState) return 'active'\n if (dotIndex === startIndex || dotIndex === endIndex) return 'edge'\n\n return 'idle'\n}\n","import { useMemo, useState, RefObject } from 'react'\n\nimport { useResizeObserver } from './useResizeObserver'\nimport { getSnapPositions } from './utils'\n\n/**\n * Get the scroll value of each slides that serves as the start of a page\n * The array is updated when resize event are caught in the carousel.\n */\nexport function useSnapPoints<T extends HTMLDivElement | null>(\n initialSnapPoints: number[] = [],\n {\n carouselRef,\n slidesPerMove,\n slidesPerPage,\n }: {\n carouselRef: RefObject<T>\n slidesPerMove: 'auto' | number\n slidesPerPage: number\n }\n) {\n const [pageSnapPoints, setPageSnapPoints] = useState(initialSnapPoints)\n\n const stableSnapPoints = useMemo(() => pageSnapPoints, [pageSnapPoints])\n\n /**\n * On resize, dimensions of the carousel might changes, which requires to update the snap points positions in the state.\n */\n useResizeObserver(carouselRef, () => {\n const newSnapPoints = getSnapPositions({\n slidesPerMove,\n slidesPerPage,\n container: carouselRef.current,\n })\n\n if (JSON.stringify(pageSnapPoints) !== JSON.stringify(newSnapPoints)) {\n setPageSnapPoints(newSnapPoints)\n }\n })\n\n return [stableSnapPoints, setPageSnapPoints] as const\n}\n","/* eslint-disable max-lines-per-function */\nimport {\n KeyboardEvent,\n useCallback,\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react'\n\nimport {\n CarouselAPI,\n ComputedControlProps,\n ComputedIndicatorGroupProps,\n ComputedIndicatorProps,\n ComputedRootProps,\n ComputedSlideGroupProps,\n ComputedSlideProps,\n ComputedTriggerProps,\n UseCarouselProps,\n} from './types'\nimport { useCarouselVisibility } from './useCarouselVisibility'\nimport { useEvent } from './useEvent'\nimport { useIsMounted } from './useIsMounted'\nimport { useScrollEnd } from './useScrollEnd'\nimport { useSnapPoints } from './useSnapPoints'\nimport { computeDotState, getSnapPositions, isSnapPoint } from './utils'\n\nconst DATA_SCOPE = 'carousel' as const\nconst DIRECTION = 'ltr' as const\n\nexport const useCarousel = ({\n defaultPage,\n gap = 16,\n snapType = 'mandatory',\n snapStop = 'always',\n scrollPadding = 0,\n slidesPerPage = 1,\n slidesPerMove = 'auto',\n scrollBehavior = 'smooth',\n loop = false,\n pagePickerInset = false,\n maxDots = 5,\n // state control\n page: controlledPage,\n onPageChange: onPageChangeProp,\n}: UseCarouselProps): CarouselAPI => {\n const carouselId = useId()\n const [pageState, setPageState] = useState(defaultPage || controlledPage || 0)\n\n const carouselRef = useRef<HTMLDivElement>(null)\n const pageIndicatorsRefs = useRef<(HTMLElement | null)[]>([])\n const isMountedRef = useIsMounted()\n const isMounted = isMountedRef.current\n const onPageChange = useEvent(onPageChangeProp)\n\n // Centralized visibility management with a single IntersectionObserver per carousel\n const { registerSlide, unregisterSlide, isSlideVisible } = useCarouselVisibility(carouselRef)\n\n const [pageSnapPoints] = useSnapPoints([], {\n carouselRef,\n slidesPerMove,\n slidesPerPage,\n })\n\n const canScrollPrev = useRef(loop || pageState > 0)\n const canScrollNext = useRef(loop || pageState < pageSnapPoints.length - 1)\n canScrollPrev.current = loop || pageState > 0\n canScrollNext.current = loop || pageState < pageSnapPoints.length - 1\n\n const handlePageChange = useCallback(\n (page: number) => {\n if (page !== pageState) {\n setPageState(page)\n onPageChange?.(page)\n }\n },\n [onPageChange, pageState]\n )\n\n const scrollTo = useCallback(\n (page: number, behavior: 'instant' | 'smooth') => {\n if (carouselRef.current) {\n carouselRef.current.scrollTo({\n left: pageSnapPoints[page],\n behavior: behavior === 'instant' ? 'auto' : 'smooth',\n })\n handlePageChange(page)\n }\n },\n [handlePageChange, pageSnapPoints]\n )\n\n const scrollPrev = useCallback(\n (cb?: (pageIndex: number) => void) => {\n if (canScrollPrev) {\n const targetPage =\n loop && pageState === 0 ? pageSnapPoints.length - 1 : Math.max(pageState - 1, 0)\n\n scrollTo(targetPage, scrollBehavior)\n cb?.(targetPage)\n }\n },\n [loop, pageSnapPoints, pageState, scrollBehavior, scrollTo]\n )\n\n const scrollNext = useCallback(\n (cb?: (pageIndex: number) => void) => {\n if (canScrollNext) {\n const targetPage =\n loop && pageState === pageSnapPoints.length - 1\n ? 0\n : Math.min(pageState + 1, pageSnapPoints.length - 1)\n\n scrollTo(targetPage, scrollBehavior)\n cb?.(targetPage)\n }\n },\n [loop, pageSnapPoints, pageState, scrollBehavior, scrollTo]\n )\n\n useEffect(() => {\n if (controlledPage != null) {\n scrollTo(controlledPage, scrollBehavior)\n }\n }, [controlledPage, scrollBehavior, scrollTo])\n\n /**\n * Set the default scroll position of the carousel based on `defaultPage`.\n * As this operation is done before the snap points are set in the state, we have to get them from the ref directly.\n */\n useLayoutEffect(() => {\n if (defaultPage != null && !isMounted && carouselRef.current) {\n const snapPositions = getSnapPositions({\n container: carouselRef.current,\n slidesPerMove,\n slidesPerPage,\n })\n\n carouselRef.current.scrollTo({\n left: snapPositions[defaultPage],\n behavior: 'instant',\n })\n }\n }, [defaultPage, isMounted, slidesPerMove, slidesPerPage])\n\n /**\n * Monitoring scrollend events inside the scrollable area to sync the carousel active page with current scroll position.\n * Scrollend has been chosen over \"scroll\" for performance reason.\n */\n const syncPageStateWithScrollPosition = useCallback(() => {\n if (!carouselRef.current || pageSnapPoints.length === 0) return\n\n const { scrollLeft } = carouselRef.current\n\n const distances = pageSnapPoints.map(pagePosition => Math.abs(scrollLeft - pagePosition))\n const pageInViewport = distances.indexOf(Math.min(...distances))\n\n if (pageInViewport !== -1) {\n handlePageChange(pageInViewport)\n }\n }, [pageSnapPoints, handlePageChange])\n\n useScrollEnd(carouselRef, syncPageStateWithScrollPosition)\n\n const contextValue: CarouselAPI = {\n ref: carouselRef,\n pageIndicatorsRefs,\n // props\n gap,\n snapType,\n snapStop,\n scrollPadding,\n slidesPerPage,\n slidesPerMove,\n scrollBehavior,\n loop,\n pagePickerInset,\n maxDots,\n // computed state\n page: pageState,\n pageSnapPoints,\n canScrollNext: canScrollNext.current,\n canScrollPrev: canScrollPrev.current,\n scrollTo,\n scrollPrev,\n scrollNext,\n // visibility management\n registerSlide,\n unregisterSlide,\n isSlideVisible,\n // anatomy\n getRootProps: (): ComputedRootProps => ({\n id: `carousel::${carouselId}:`,\n role: 'region',\n 'aria-roledescription': 'carousel',\n 'data-scope': DATA_SCOPE,\n 'data-part': 'root',\n 'data-orientation': 'horizontal',\n dir: DIRECTION,\n style: {\n '--slides-per-page': slidesPerPage,\n '--slide-spacing': `${gap}px`,\n '--slide-item-size':\n 'calc(100% / var(--slides-per-page) - var(--slide-spacing) * (var(--slides-per-page) - 1) / var(--slides-per-page))',\n },\n }),\n\n getControlProps: (): ComputedControlProps => ({\n 'data-scope': DATA_SCOPE,\n 'data-part': 'control',\n 'data-orientation': 'horizontal',\n }),\n\n getPrevTriggerProps: (): ComputedTriggerProps<'prev-trigger'> => ({\n id: `carousel::${carouselId}::prev-trigger`,\n 'aria-controls': `carousel::${carouselId}::item-group`,\n 'data-scope': DATA_SCOPE,\n 'data-part': 'prev-trigger',\n 'data-orientation': 'horizontal',\n type: 'button',\n dir: DIRECTION,\n disabled: !canScrollPrev.current,\n onClick: () => scrollPrev(),\n }),\n\n getNextTriggerProps: (): ComputedTriggerProps<'next-trigger'> => ({\n id: `carousel::${carouselId}::next-trigger`,\n 'aria-controls': `carousel::${carouselId}::item-group`,\n 'data-scope': DATA_SCOPE,\n 'data-part': 'next-trigger',\n 'data-orientation': 'horizontal',\n type: 'button',\n dir: DIRECTION,\n disabled: !canScrollNext.current,\n onClick: () => scrollNext(),\n }),\n\n getSlidesContainerProps: (): ComputedSlideGroupProps => ({\n id: `carousel::${carouselId}::item-group`,\n /**\n * The carousel pattern was originally designed for a single slide.\n * When there is more than one slide, the aria-live region is set to off to avoid announcing the whole list of slides.\n * This is not ideal but we keep it for backwards compatibility.\n *\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/carousel/#wai-aria-attributes\n */\n 'aria-live': slidesPerPage > 1 ? 'off' : 'polite',\n 'data-scope': DATA_SCOPE,\n 'data-part': 'item-group',\n 'data-orientation': 'horizontal',\n dir: DIRECTION,\n tabIndex: 0,\n style: {\n display: 'grid',\n gap: 'var(--slide-spacing)',\n scrollSnapType: `x ${snapType}`,\n gridAutoFlow: 'column',\n scrollbarWidth: 'none',\n gridAutoColumns: 'var(--slide-item-size)',\n overflowX: 'auto',\n },\n ref: carouselRef,\n }),\n\n getSlideProps: ({ index }): ComputedSlideProps => {\n const isStopPoint = isSnapPoint(index, {\n container: carouselRef.current,\n slidesPerMove,\n slidesPerPage,\n })\n\n return {\n id: `carousel::${carouselId}::item:${index}`,\n role: 'group',\n 'aria-roledescription': 'slide',\n 'data-scope': DATA_SCOPE,\n 'data-part': 'item',\n 'data-index': index,\n 'data-orientation': 'horizontal',\n dir: DIRECTION,\n style: {\n ...(isStopPoint && {\n scrollSnapAlign: 'start',\n scrollSnapStop: snapStop,\n }),\n },\n }\n },\n\n getIndicatorGroupProps: (): ComputedIndicatorGroupProps => ({\n role: 'radiogroup',\n id: `carousel::${carouselId}::indicator-group`,\n 'data-scope': DATA_SCOPE,\n 'data-part': 'indicator-group',\n 'data-orientation': 'horizontal',\n dir: DIRECTION,\n }),\n\n getIndicatorProps: ({ index }): ComputedIndicatorProps => {\n const dotState = computeDotState({\n dotIndex: index,\n pageState,\n totalPages: pageSnapPoints.length,\n maxDots,\n })\n\n return {\n role: 'radio',\n id: `carousel::${carouselId}::indicator:${index}`,\n 'aria-checked': index === pageState,\n 'data-scope': DATA_SCOPE,\n 'data-part': 'indicator',\n 'data-orientation': 'horizontal',\n 'data-index': index,\n 'data-state': dotState,\n tabIndex: index === pageState ? 0 : -1,\n onClick: () => {\n scrollTo(index, scrollBehavior)\n },\n onKeyDown: (event: KeyboardEvent) => {\n const focusActiveIndicator = (page: number) => {\n pageIndicatorsRefs.current[page]?.focus()\n }\n\n if (event.key === 'ArrowRight' && canScrollNext) {\n scrollNext(focusActiveIndicator)\n } else if (event.key === 'ArrowLeft' && canScrollPrev) {\n scrollPrev(focusActiveIndicator)\n }\n },\n }\n },\n }\n\n return contextValue\n}\n","import { cx } from 'class-variance-authority'\nimport { ComponentProps, createContext, ReactNode, useContext } from 'react'\n\nimport { CarouselAPI, UseCarouselProps } from './types'\nimport { useCarousel } from './useCarousel'\n\ninterface Props extends UseCarouselProps, ComponentProps<'div'> {\n children?: ReactNode\n className?: string\n}\n\nconst CarouselContext = createContext<CarouselAPI | null>(null)\n\nexport const Carousel = ({\n className,\n snapType = 'mandatory',\n snapStop = 'always',\n scrollBehavior = 'smooth',\n slidesPerMove = 'auto',\n pagePickerInset = false,\n slidesPerPage = 1,\n loop = false,\n children,\n gap = 16,\n defaultPage,\n page,\n onPageChange,\n maxDots = 5,\n ...props\n}: Props) => {\n const carouselApi = useCarousel({\n defaultPage,\n slidesPerPage,\n slidesPerMove,\n loop,\n gap,\n scrollBehavior,\n snapStop,\n snapType,\n page,\n pagePickerInset,\n onPageChange,\n maxDots,\n })\n\n return (\n <CarouselContext.Provider\n value={{\n ...carouselApi,\n scrollBehavior,\n }}\n >\n <div\n data-spark-component=\"carousel\"\n className={cx('gap-lg relative box-border flex flex-col', className)}\n {...carouselApi.getRootProps()}\n {...props}\n >\n {children}\n </div>\n </CarouselContext.Provider>\n )\n}\n\nCarousel.displayName = 'Carousel'\n\nexport const useCarouselContext = () => {\n const context = useContext(CarouselContext)\n\n if (!context) {\n throw Error('useCarouselContext must be used within a Carousel provider')\n }\n\n return context\n}\n","import { cx } from 'class-variance-authority'\nimport { HTMLAttributes, ReactNode } from 'react'\n\nimport { useCarouselContext } from './Carousel'\n\ninterface ControlsProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode\n}\n\nexport const CarouselControls = ({ children, className, ...props }: ControlsProps) => {\n const ctx = useCarouselContext()\n\n return (\n <div\n data-spark-component=\"carousel-controls\"\n className={cx(\n 'default:px-lg pointer-events-none absolute inset-0 flex flex-row items-center justify-between',\n className\n )}\n {...ctx.getControlProps()}\n {...props}\n >\n {children}\n </div>\n )\n}\n\nCarouselControls.displayName = 'Carousel.Controls'\n","import { ArrowVerticalRight } from '@spark-ui/icons/ArrowVerticalRight'\n\nimport { Icon } from '../icon'\nimport { IconButton, IconButtonProps } from '../icon-button'\nimport { useCarouselContext } from './Carousel'\n\nexport const CarouselNextButton = ({\n 'aria-label': ariaLabel,\n ...buttonProps\n}: IconButtonProps) => {\n const ctx = useCarouselContext()\n\n return (\n <IconButton\n data-spark-component=\"carousel-next-button\"\n {...ctx.getNextTriggerProps()}\n intent=\"surface\"\n design=\"filled\"\n className=\"pointer-events-auto cursor-pointer shadow-sm disabled:invisible\"\n aria-label={ariaLabel}\n {...buttonProps}\n >\n <Icon>\n <ArrowVerticalRight />\n </Icon>\n </IconButton>\n )\n}\n\nCarouselNextButton.displayName = 'Carousel.NextButton'\n","import { cx } from 'class-variance-authority'\nimport { ReactNode, useEffect, useRef } from 'react'\n\nimport { useCarouselContext } from './Carousel'\n\ninterface Props {\n children?: ReactNode\n 'aria-label': string\n index: number\n className?: string\n unstyled?: boolean\n intent?: 'basic' | 'surface'\n}\n\nexport const CarouselPageIndicator = ({\n children,\n unstyled = false,\n index,\n 'aria-label': ariaLabel,\n className,\n intent = 'basic',\n}: Props) => {\n const ctx = useCarouselContext()\n\n const ref = useRef<HTMLButtonElement | null>(null)\n\n useEffect(() => {\n if (ctx.pageIndicatorsRefs.current) {\n ctx.pageIndicatorsRefs.current[index] = ref.current\n }\n })\n\n const indicatorProps = ctx.getIndicatorProps({ index })\n\n return (\n <button\n data-spark-component=\"carousel-page-indicator\"\n ref={ref}\n key={index}\n {...indicatorProps}\n aria-label={ariaLabel}\n className={cx(\n {\n [cx(\n 'border-outline group relative flex justify-center border-0 hover:cursor-pointer',\n 'm-sm rounded-sm transition-all duration-[200ms] ease-linear',\n 'w-sz-8 h-sz-8',\n 'data-[state=active]:w-sz-32 data-[state=active]:h-sz-8',\n 'data-[state=edge]:w-sz-4 data-[state=edge]:h-sz-4',\n 'data-[state=hidden]:m-0 data-[state=hidden]:size-0',\n intent === 'surface'\n ? 'data-[state=active]:bg-surface bg-surface/dim-2'\n : 'data-[state=active]:bg-basic bg-on-surface/dim-2'\n )]: !unstyled,\n // [dotsStyles]: !unstyled,\n },\n className\n )}\n >\n {children}\n </button>\n )\n}\n\nCarouselPageIndicator.displayName = 'Carousel.PageIndicator'\n","import { cx } from 'class-variance-authority'\nimport { ReactNode } from 'react'\n\nimport { useCarouselContext } from './Carousel'\nimport { CarouselAPI } from './types'\n\ninterface RenderProps extends CarouselAPI {\n pages: number[]\n}\n\ninterface Props {\n children: (renderProps: RenderProps) => ReactNode\n className?: string\n}\n\nexport const CarouselPagePicker = ({ children, className }: Props) => {\n const ctx = useCarouselContext()\n\n return (\n <>\n <div\n data-spark-component=\"carousel-page-picker\"\n {...ctx.getIndicatorGroupProps()}\n className={cx(\n 'flex-wrap items-center justify-center',\n 'default:min-h-sz-16 flex',\n ctx.pagePickerInset && 'bottom-sz-12 absolute inset-x-0',\n className\n )}\n >\n {ctx.pageSnapPoints.length <= 1\n ? null\n : children({\n ...ctx,\n pages: Array.from({ length: ctx.pageSnapPoints.length }, (_, i) => i),\n })}\n </div>\n </>\n )\n}\n\nCarouselPagePicker.displayName = 'Carousel.PagePicker'\n","import { ArrowVerticalLeft } from '@spark-ui/icons/ArrowVerticalLeft'\n\nimport { Icon } from '../icon'\nimport { IconButton, IconButtonProps } from '../icon-button'\nimport { useCarouselContext } from './Carousel'\n\nexport const CarouselPrevButton = ({\n 'aria-label': ariaLabel,\n ...buttonProps\n}: IconButtonProps) => {\n const ctx = useCarouselContext()\n\n return (\n <IconButton\n data-spark-component=\"carousel-prev-button\"\n {...ctx.getPrevTriggerProps()}\n intent=\"surface\"\n design=\"filled\"\n className=\"pointer-events-auto cursor-pointer shadow-sm disabled:invisible\"\n aria-label={ariaLabel}\n {...buttonProps}\n >\n <Icon>\n <ArrowVerticalLeft />\n </Icon>\n </IconButton>\n )\n}\n\nCarouselPrevButton.displayName = 'Carousel.PrevButton'\n","import { RefObject, useEffect, useState } from 'react'\n\nimport { useCarouselContext } from './Carousel'\n\n/**\n * Hook to track slide visibility using the centralized IntersectionObserver.\n * This optimizes performance by using a single observer per carousel instead of one per slide.\n */\nexport function useIsVisible(\n elementRef: RefObject<HTMLElement | null>,\n _parentRef: RefObject<HTMLElement | null>\n) {\n const [isVisible, setIsVisible] = useState(true)\n const ctx = useCarouselContext()\n\n useEffect(() => {\n const el = elementRef.current\n if (!el) return\n\n // Extract stable functions from context to avoid unnecessary re-renders\n const { registerSlide, unregisterSlide } = ctx\n\n // Register the slide with the centralized observer\n registerSlide(el, setIsVisible)\n\n // Cleanup: unregister when the component unmounts\n return () => {\n unregisterSlide(el)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [elementRef]) // Only depend on elementRef, registerSlide/unregisterSlide are stable callbacks\n\n return isVisible\n}\n","import { cx } from 'class-variance-authority'\nimport { ComponentProps, ReactNode, useRef } from 'react'\n\nimport { useCarouselContext } from './Carousel'\nimport { useIsVisible } from './useIsVisible'\n\nexport interface CarouselSlideProps extends ComponentProps<'div'> {\n isSnapPoint?: boolean\n children?: ReactNode\n index?: number\n totalSlides?: number\n className?: string\n}\n\nexport const CarouselSlide = ({\n children,\n index = 0,\n totalSlides,\n className = '',\n ...props\n}: CarouselSlideProps) => {\n const itemRef = useRef<HTMLDivElement>(null)\n const ctx = useCarouselContext()\n\n const isVisible = useIsVisible(itemRef, ctx.ref)\n\n return (\n <div\n data-spark-component=\"carousel-slide\"\n ref={itemRef}\n {...ctx.getSlideProps({ index, totalSlides: totalSlides as number })}\n className={cx('default:bg-surface relative overflow-hidden', className)}\n aria-hidden={!isVisible}\n inert={!isVisible}\n {...props}\n >\n {children}\n </div>\n )\n}\n\nCarouselSlide.displayName = 'Carousel.Slide'\n","import { cx } from 'class-variance-authority'\nimport { Children, cloneElement, ComponentProps, isValidElement, ReactNode } from 'react'\n\nimport { useCarouselContext } from './Carousel'\nimport { CarouselSlideProps } from './CarouselSlide'\n\ninterface Props extends ComponentProps<'div'> {\n children?: ReactNode\n className?: string\n}\n\nexport const CarouselSlides = ({ children, className = '' }: Props) => {\n const ctx = useCarouselContext()\n\n const childrenElements = Children.toArray(children)\n\n return (\n <div\n data-spark-component=\"carousel-slides\"\n {...ctx.getSlidesContainerProps()}\n className={cx(\n 'focus-visible:u-outline relative w-full',\n '[-ms-overflow-style:none] [scrollbar-width:none] [&::-webkit-scrollbar]:hidden',\n className\n )}\n >\n {childrenElements.map((child, index) =>\n isValidElement<CarouselSlideProps>(child)\n ? cloneElement(child, {\n index,\n totalSlides: childrenElements.length,\n })\n : child\n )}\n </div>\n )\n}\n\nCarouselSlides.displayName = 'Carousel.Slides'\n","import { ReactNode } from 'react'\n\ninterface Props {\n children: ReactNode\n}\n\nexport const CarouselViewport = ({ children }: Props) => {\n return <div className=\"relative flex items-center justify-around p-0\">{children}</div>\n}\n\nCarouselViewport.displayName = 'Carousel.Viewport'\n","import { Carousel as Root } from './Carousel'\nimport { CarouselControls as Controls } from './CarouselControls'\nimport { CarouselNextButton as NextButton } from './CarouselNextButton'\nimport { CarouselPageIndicator as PageIndicator } from './CarouselPageIndicator'\nimport { CarouselPagePicker as PagePicker } from './CarouselPagePicker'\nimport { CarouselPrevButton as PrevButton } from './CarouselPrevButton'\nimport { CarouselSlide as Slide } from './CarouselSlide'\nimport { CarouselSlides as Slides } from './CarouselSlides'\nimport { CarouselViewport as Viewport } from './CarouselViewport'\n\nexport const Carousel: typeof Root & {\n Controls: typeof Controls\n NextButton: typeof NextButton\n PrevButton: typeof PrevButton\n Slide: typeof Slide\n Slides: typeof Slides\n Viewport: typeof Viewport\n PagePicker: typeof PagePicker\n PageIndicator: typeof PageIndicator\n} = Object.assign(Root, {\n Controls,\n NextButton,\n PrevButton,\n Slide,\n Slides,\n Viewport,\n PagePicker,\n PageIndicator,\n})\n\nCarousel.displayName = 'Carousel'\n"],"names":["useCarouselVisibility","carouselRef","slideVisibilityMap","useRef","visibilityObserverRef","visibilityCallbacksRef","createObserverCallback","useCallback","entries","entry","isVisible","element","callback","getOrCreateObserver","container","observer","useEffect","visibilityMap","callbacksMap","registerSlide","initialVisible","unregisterSlide","isSlideVisible","useEvent","ref","useLayoutEffect","args","useIsMounted","isMounted","useScrollEnd","scrollRef","scrollLeft","safariTimeout","supportsScrollend","handleScrollEnd","handleSafariScroll","useResizeObserver","getSnapIndices","totalSlides","slidesPerMove","slidesPerPage","slideBy","snapPoints","lastSnapIndex","getSlideElements","isSnapPoint","slideIndex","getSnapPositions","_","index","slide","computeDotState","dotIndex","pageState","totalPages","maxDots","startIndex","endIndex","useSnapPoints","initialSnapPoints","pageSnapPoints","setPageSnapPoints","useState","stableSnapPoints","useMemo","newSnapPoints","DATA_SCOPE","DIRECTION","useCarousel","defaultPage","gap","snapType","snapStop","scrollPadding","scrollBehavior","loop","pagePickerInset","controlledPage","onPageChangeProp","carouselId","useId","setPageState","pageIndicatorsRefs","onPageChange","canScrollPrev","canScrollNext","handlePageChange","page","scrollTo","behavior","scrollPrev","cb","targetPage","scrollNext","snapPositions","syncPageStateWithScrollPosition","distances","pagePosition","pageInViewport","isStopPoint","dotState","event","focusActiveIndicator","CarouselContext","createContext","Carousel","className","children","props","carouselApi","jsx","cx","useCarouselContext","context","useContext","CarouselControls","ctx","CarouselNextButton","ariaLabel","buttonProps","IconButton","Icon","ArrowVerticalRight","CarouselPageIndicator","unstyled","intent","indicatorProps","CarouselPagePicker","Fragment","i","CarouselPrevButton","ArrowVerticalLeft","useIsVisible","elementRef","_parentRef","setIsVisible","el","CarouselSlide","itemRef","CarouselSlides","childrenElements","Children","child","isValidElement","cloneElement","CarouselViewport","Root","Controls","NextButton","PrevButton","Slide","Slides","Viewport","PagePicker","PageIndicator"],"mappings":"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"}
@@ -1,9 +1,9 @@
1
1
  import { jsx as f, Fragment as it } from "react/jsx-runtime";
2
- import { a as x } from "../index-BmAFn37q.mjs";
2
+ import { cx as x } from "class-variance-authority";
3
3
  import { useRef as C, useCallback as S, useEffect as k, useLayoutEffect as R, useState as L, useMemo as ct, useId as lt, createContext as ut, useContext as dt, Children as pt, cloneElement as ft, isValidElement as gt } from "react";
4
4
  import { ArrowVerticalRight as mt } from "@spark-ui/icons/ArrowVerticalRight";
5
- import { I as G } from "../Icon-D1RueiPY.mjs";
6
- import { I as J } from "../IconButton-BY3gYXtU.mjs";
5
+ import { I as G } from "../Icon-Ck-dhfLd.mjs";
6
+ import { I as J } from "../IconButton-C62-axzv.mjs";
7
7
  import { ArrowVerticalLeft as bt } from "@spark-ui/icons/ArrowVerticalLeft";
8
8
  function ht(t) {
9
9
  const e = C(/* @__PURE__ */ new Map()), r = C(null), n = C(/* @__PURE__ */ new Map()), o = S(() => (c) => {
@@ -0,0 +1,2 @@
1
+ export * from './Checkbox';
2
+ export * from './CheckboxGroup';
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("react/jsx-runtime"),D=require("../form-field/index.js"),me=require("@spark-ui/hooks/use-merge-refs"),$=require("../index-DnaHaH_0.js"),I=require("react"),ke=require("@spark-ui/icons/Check"),fe=require("@spark-ui/icons/Minus"),pe=require("../Icon-Bf0XrmiR.js"),V=require("../index-1WIgmEZh.js"),xe=require("../index-DO-atGp-.js"),L=require("../index-Dkj4QRX8.js"),Ce=require("../index-DYxWvftI.js"),ve=require("../index-Cjj_rUPu.js"),ge=require("../index-MHF2-CYX.js"),z=require("../index-ChLwd62c.js"),Ie=require("@spark-ui/internal-utils"),Re=require("../index-0KYGKeVg.js"),ye=require("@spark-ui/hooks/use-combined-state");function je(e){const r=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const a in e)if(a!=="default"){const c=Object.getOwnPropertyDescriptor(e,a);Object.defineProperty(r,a,c.get?c:{enumerable:!0,get:()=>e[a]})}}return r.default=e,Object.freeze(r)}const C=je(I);var S="Checkbox",[qe]=xe.createContextScope(S),[Pe,B]=qe(S);function _e(e){const{__scopeCheckbox:r,checked:a,children:c,defaultChecked:o,disabled:t,form:u,name:k,onCheckedChange:l,required:f,value:p="on",internal_do_not_use_render:b}=e,[h,x]=L.useControllableState({prop:a,defaultProp:o??!1,onChange:l,caller:S}),[m,i]=C.useState(null),[v,s]=C.useState(null),d=C.useRef(!1),y=m?!!u||!!m.closest("form"):!0,j={checked:h,disabled:t,setChecked:x,control:m,setControl:i,name:k,form:u,value:p,hasConsumerStoppedPropagationRef:d,required:f,defaultChecked:P(o)?!1:o,isFormControl:y,bubbleInput:v,setBubbleInput:s};return n.jsx(Pe,{scope:r,...j,children:Ee(b)?b(j):c})}var H="CheckboxTrigger",U=C.forwardRef(({__scopeCheckbox:e,onKeyDown:r,onClick:a,...c},o)=>{const{control:t,value:u,disabled:k,checked:l,required:f,setControl:p,setChecked:b,hasConsumerStoppedPropagationRef:h,isFormControl:x,bubbleInput:m}=B(H,e),i=V.useComposedRefs(o,p),v=C.useRef(l);return C.useEffect(()=>{const s=t?.form;if(s){const d=()=>b(v.current);return s.addEventListener("reset",d),()=>s.removeEventListener("reset",d)}},[t,b]),n.jsx(z.Primitive.button,{type:"button",role:"checkbox","aria-checked":P(l)?"mixed":l,"aria-required":f,"data-state":Y(l),"data-disabled":k?"":void 0,disabled:k,value:u,...c,ref:i,onKeyDown:L.composeEventHandlers(r,s=>{s.key==="Enter"&&s.preventDefault()}),onClick:L.composeEventHandlers(a,s=>{b(d=>P(d)?!0:!d),m&&x&&(h.current=s.isPropagationStopped(),h.current||s.stopPropagation())})})});U.displayName=H;var X=C.forwardRef((e,r)=>{const{__scopeCheckbox:a,name:c,checked:o,defaultChecked:t,required:u,disabled:k,value:l,onCheckedChange:f,form:p,...b}=e;return n.jsx(_e,{__scopeCheckbox:a,checked:o,defaultChecked:t,disabled:k,required:u,onCheckedChange:f,name:c,form:p,value:l,internal_do_not_use_render:({isFormControl:h})=>n.jsxs(n.Fragment,{children:[n.jsx(U,{...b,ref:r,__scopeCheckbox:a}),h&&n.jsx(W,{__scopeCheckbox:a})]})})});X.displayName=S;var K="CheckboxIndicator",J=C.forwardRef((e,r)=>{const{__scopeCheckbox:a,forceMount:c,...o}=e,t=B(K,a);return n.jsx(ge.Presence,{present:c||P(t.checked)||t.checked===!0,children:n.jsx(z.Primitive.span,{"data-state":Y(t.checked),"data-disabled":t.disabled?"":void 0,...o,ref:r,style:{pointerEvents:"none",...e.style}})})});J.displayName=K;var Q="CheckboxBubbleInput",W=C.forwardRef(({__scopeCheckbox:e,...r},a)=>{const{control:c,hasConsumerStoppedPropagationRef:o,checked:t,defaultChecked:u,required:k,disabled:l,name:f,value:p,form:b,bubbleInput:h,setBubbleInput:x}=B(Q,e),m=V.useComposedRefs(a,x),i=Ce.usePrevious(t),v=ve.useSize(c);C.useEffect(()=>{const d=h;if(!d)return;const y=window.HTMLInputElement.prototype,q=Object.getOwnPropertyDescriptor(y,"checked").set,E=!o.current;if(i!==t&&q){const N=new Event("click",{bubbles:E});d.indeterminate=P(t),q.call(d,P(t)?!1:t),d.dispatchEvent(N)}},[h,i,t,o]);const s=C.useRef(P(t)?!1:t);return n.jsx(z.Primitive.input,{type:"checkbox","aria-hidden":!0,defaultChecked:u??s.current,required:k,disabled:l,name:f,value:p,form:b,...r,tabIndex:-1,ref:m,style:{...r.style,...v,position:"absolute",pointerEvents:"none",opacity:0,margin:0,transform:"translateX(-100%)"}})});W.displayName=Q;function Ee(e){return typeof e=="function"}function P(e){return e==="indeterminate"}function Y(e){return P(e)?"indeterminate":e?"checked":"unchecked"}const Z=I.createContext({}),Ne=()=>I.useContext(Z),we=J,ee=e=>n.jsx(we,{className:"flex size-full items-center justify-center",...e});ee.displayName="CheckboxIndicator";const Fe=$.cva(["size-sz-24 shrink-0 items-center justify-center rounded-sm border-md bg-transparent","disabled:cursor-not-allowed disabled:opacity-dim-3 disabled:hover:ring-0","focus-visible:u-outline","hover:ring-4 hover:cursor-pointer","u-shadow-border-transition"],{variants:{intent:Ie.makeVariants({main:["text-on-main","hover:ring-main-container","data-[state=unchecked]:border-outline","data-[state=indeterminate]:border-main data-[state=indeterminate]:bg-main","data-[state=checked]:border-main data-[state=checked]:bg-main"],support:["text-on-support","hover:ring-support-container","data-[state=unchecked]:border-outline","data-[state=indeterminate]:border-support data-[state=indeterminate]:bg-support","data-[state=checked]:border-support data-[state=checked]:bg-support"],accent:["text-on-accent","hover:ring-accent-container","data-[state=unchecked]:border-outline","data-[state=indeterminate]:border-accent data-[state=indeterminate]:bg-accent","data-[state=checked]:border-accent data-[state=checked]:bg-accent"],basic:["text-on-basic","hover:ring-basic-container","data-[state=unchecked]:border-outline","data-[state=indeterminate]:border-basic data-[state=indeterminate]:bg-basic","data-[state=checked]:border-basic data-[state=checked]:bg-basic"],success:["text-on-success","hover:ring-success-container","data-[state=unchecked]:border-success","data-[state=indeterminate]:border-success data-[state=indeterminate]:bg-success","data-[state=checked]:border-success data-[state=checked]:bg-success"],alert:["text-on-alert","hover:ring-alert-container","data-[state=unchecked]:border-alert","data-[state=indeterminate]:border-alert data-[state=indeterminate]:bg-alert","data-[state=checked]:border-alert data-[state=checked]:bg-alert"],error:["text-on-error","hover:ring-error-container","data-[state=unchecked]:border-error","data-[state=indeterminate]:border-error data-[state=indeterminate]:bg-error","data-[state=checked]:border-error data-[state=checked]:bg-error"],info:["text-on-info","hover:ring-info-container","data-[state=unchecked]:border-info","data-[state=indeterminate]:border-info data-[state=indeterminate]:bg-info","data-[state=checked]:border-info data-[state=checked]:bg-info"],neutral:["text-on-neutral","hover:ring-neutral-container","data-[state=unchecked]:border-outline","data-[state=indeterminate]:border-neutral data-[state=indeterminate]:bg-neutral","data-[state=checked]:border-neutral data-[state=checked]:bg-neutral"]})},defaultVariants:{intent:"basic"}}),Me=X,te=({className:e,icon:r=n.jsx(ke.Check,{}),indeterminateIcon:a=n.jsx(fe.Minus,{}),intent:c,checked:o,ref:t,...u})=>n.jsx(Me,{ref:t,className:Fe({intent:c,className:e}),checked:o,...u,children:n.jsx(ee,{children:n.jsx(pe.Icon,{size:"sm",children:o==="indeterminate"?a:r})})});te.displayName="CheckboxInput";const $e=$.cva("grow",{variants:{disabled:{true:["text-neutral/dim-2","cursor-not-allowed"],false:["cursor-pointer"]}},defaultVariants:{disabled:!1}}),ne=({disabled:e,...r})=>n.jsx(Re.Label,{className:$e({disabled:e}),...r});ne.displayName="CheckboxLabel";const A=":checkbox",re=({id:e,className:r,intent:a,checked:c,value:o,disabled:t,reverse:u=!1,onCheckedChange:k,children:l,ref:f,...p})=>{const b=`${A}-${I.useId()}`,h=e||b,x=`${A}-${I.useId()}`,m=D.useFormFieldControl(),i=Ne(),v=I.useRef(null),s=me.useMergeRefs(f,v),d=({fieldState:g,groupState:R,checkboxIntent:se})=>{const ce=g.name??R.name,ie=g.isRequired??R.isRequired,de=g.state??R.state,ue=g.isInvalid??R.isInvalid,T=g.id!==R.id,le=T?g.id:void 0,be=T?g.description:void 0,he=de??se??R.intent;return{name:ce,isRequired:ie,isInvalid:ue,id:le,description:be,intent:he}},y=o?i.value?.includes(o):c,j=g=>{k?.(g);const R=v.current?.value;R&&i.onCheckedChange&&i.onCheckedChange(g,R)},{id:q,name:E,isInvalid:N,description:O,intent:w,isRequired:_}=d({fieldState:m,groupState:i,checkboxIntent:a}),F=I.useMemo(()=>i?_?!i.value?.length:!1:_,[i,_]),M=l&&n.jsx(ne,{disabled:t,htmlFor:q||h,id:x,children:l}),G=n.jsx(te,{ref:s,id:q||h,name:E,value:o,intent:w,checked:y,disabled:t,required:F,"aria-describedby":O,"aria-invalid":N,onCheckedChange:j,"aria-labelledby":l?x:m.labelId,...p}),oe=i.reverse||u?n.jsxs(n.Fragment,{children:[M,G]}):n.jsxs(n.Fragment,{children:[G,M]});return n.jsx("div",{"data-spark-component":"checkbox",className:$.cx("gap-md text-body-1 relative flex items-start",r),children:oe})};re.displayName="Checkbox";const Se=$.cva(["flex"],{variants:{orientation:{vertical:["flex-col","gap-lg"],horizontal:["gap-xl"]}}}),ae=({name:e,value:r,defaultValue:a,className:c,intent:o,orientation:t="vertical",onCheckedChange:u,reverse:k=!1,children:l,ref:f,...p})=>{const[b,h]=ye.useCombinedState(r,a),x=D.useFormFieldControl(),m=I.useRef(u),{id:i,labelId:v,description:s,state:d,isInvalid:y,isRequired:j}=x,q=e??x.name,E=I.useMemo(()=>({id:i,name:q,value:b,intent:o,state:d,isInvalid:y,description:s,isRequired:j,reverse:k,onCheckedChange:(O,w)=>{const _=b||[],F=O?[..._,w]:_.filter(M=>M!==w);h(F),m.current&&m.current(F)}}),[i,q,b,o,d,y,s,j,h,k]);return I.useEffect(()=>{m.current=u},[u]),n.jsx(Z.Provider,{value:E,children:n.jsx("div",{ref:f,className:Se({className:c,orientation:t}),role:"group","aria-labelledby":v,"aria-describedby":s,...p,children:l})})};ae.displayName="CheckboxGroup";exports.Checkbox=re;exports.CheckboxGroup=ae;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),E=require("@spark-ui/components/form-field"),ee=require("@spark-ui/hooks/use-merge-refs"),N=require("class-variance-authority"),c=require("react"),te=require("@spark-ui/icons/Check"),ae=require("@spark-ui/icons/Minus"),P=require("radix-ui"),ne=require("../Icon-CF0W0LKr.js"),re=require("@spark-ui/internal-utils"),se=require("../label/index.js"),ce=require("@spark-ui/hooks/use-combined-state"),U=c.createContext({}),oe=()=>c.useContext(U),ie=P.Checkbox.CheckboxIndicator,D=a=>e.jsx(ie,{className:"flex size-full items-center justify-center",...a});D.displayName="CheckboxIndicator";const de=N.cva(["size-sz-24 shrink-0 items-center justify-center rounded-sm border-md bg-transparent","disabled:cursor-not-allowed disabled:opacity-dim-3 disabled:hover:ring-0","focus-visible:u-outline","hover:ring-4 hover:cursor-pointer","u-shadow-border-transition"],{variants:{intent:re.makeVariants({main:["text-on-main","hover:ring-main-container","data-[state=unchecked]:border-outline","data-[state=indeterminate]:border-main data-[state=indeterminate]:bg-main","data-[state=checked]:border-main data-[state=checked]:bg-main"],support:["text-on-support","hover:ring-support-container","data-[state=unchecked]:border-outline","data-[state=indeterminate]:border-support data-[state=indeterminate]:bg-support","data-[state=checked]:border-support data-[state=checked]:bg-support"],accent:["text-on-accent","hover:ring-accent-container","data-[state=unchecked]:border-outline","data-[state=indeterminate]:border-accent data-[state=indeterminate]:bg-accent","data-[state=checked]:border-accent data-[state=checked]:bg-accent"],basic:["text-on-basic","hover:ring-basic-container","data-[state=unchecked]:border-outline","data-[state=indeterminate]:border-basic data-[state=indeterminate]:bg-basic","data-[state=checked]:border-basic data-[state=checked]:bg-basic"],success:["text-on-success","hover:ring-success-container","data-[state=unchecked]:border-success","data-[state=indeterminate]:border-success data-[state=indeterminate]:bg-success","data-[state=checked]:border-success data-[state=checked]:bg-success"],alert:["text-on-alert","hover:ring-alert-container","data-[state=unchecked]:border-alert","data-[state=indeterminate]:border-alert data-[state=indeterminate]:bg-alert","data-[state=checked]:border-alert data-[state=checked]:bg-alert"],error:["text-on-error","hover:ring-error-container","data-[state=unchecked]:border-error","data-[state=indeterminate]:border-error data-[state=indeterminate]:bg-error","data-[state=checked]:border-error data-[state=checked]:bg-error"],info:["text-on-info","hover:ring-info-container","data-[state=unchecked]:border-info","data-[state=indeterminate]:border-info data-[state=indeterminate]:bg-info","data-[state=checked]:border-info data-[state=checked]:bg-info"],neutral:["text-on-neutral","hover:ring-neutral-container","data-[state=unchecked]:border-outline","data-[state=indeterminate]:border-neutral data-[state=indeterminate]:bg-neutral","data-[state=checked]:border-neutral data-[state=checked]:bg-neutral"]})},defaultVariants:{intent:"basic"}}),ue=P.Checkbox.Checkbox,O=({className:a,icon:o=e.jsx(te.Check,{}),indeterminateIcon:b=e.jsx(ae.Minus,{}),intent:h,checked:r,ref:d,...i})=>e.jsx(ue,{ref:d,className:de({intent:h,className:a}),checked:r,...i,children:e.jsx(D,{children:e.jsx(ne.Icon,{size:"sm",children:r==="indeterminate"?b:o})})});O.displayName="CheckboxInput";const le=N.cva("grow",{variants:{disabled:{true:["text-neutral/dim-2","cursor-not-allowed"],false:["cursor-pointer"]}},defaultVariants:{disabled:!1}}),T=({disabled:a,...o})=>e.jsx(se.Label,{className:le({disabled:a}),...o});T.displayName="CheckboxLabel";const A=":checkbox",X=({id:a,className:o,intent:b,checked:h,value:r,disabled:d,reverse:i=!1,onCheckedChange:p,children:m,ref:M,...G})=>{const k=`${A}-${c.useId()}`,x=a||k,g=`${A}-${c.useId()}`,u=E.useFormFieldControl(),t=oe(),f=c.useRef(null),C=ee.useMergeRefs(M,f),I=({fieldState:n,groupState:s,checkboxIntent:H})=>{const J=n.name??s.name,K=n.isRequired??s.isRequired,Q=n.state??s.state,W=n.isInvalid??s.isInvalid,$=n.id!==s.id,Y=$?n.id:void 0,Z=$?n.description:void 0,S=Q??H??s.intent;return{name:J,isRequired:K,isInvalid:W,id:Y,description:Z,intent:S}},q=r?t.value?.includes(r):h,y=n=>{p?.(n);const s=f.current?.value;s&&t.onCheckedChange&&t.onCheckedChange(n,s)},{id:v,name:V,isInvalid:L,description:z,intent:j,isRequired:l}=I({fieldState:u,groupState:t,checkboxIntent:b}),R=c.useMemo(()=>t?l?!t.value?.length:!1:l,[t,l]),F=m&&e.jsx(T,{disabled:d,htmlFor:v||x,id:g,children:m}),w=e.jsx(O,{ref:C,id:v||x,name:V,value:r,intent:j,checked:q,disabled:d,required:R,"aria-describedby":z,"aria-invalid":L,onCheckedChange:y,"aria-labelledby":m?g:u.labelId,...G}),B=t.reverse||i?e.jsxs(e.Fragment,{children:[F,w]}):e.jsxs(e.Fragment,{children:[w,F]});return e.jsx("div",{"data-spark-component":"checkbox",className:N.cx("gap-md text-body-1 relative flex items-start",o),children:B})};X.displayName="Checkbox";const be=N.cva(["flex"],{variants:{orientation:{vertical:["flex-col","gap-lg"],horizontal:["gap-xl"]}}}),_=({name:a,value:o,defaultValue:b,className:h,intent:r,orientation:d="vertical",onCheckedChange:i,reverse:p=!1,children:m,ref:M,...G})=>{const[k,x]=ce.useCombinedState(o,b),g=E.useFormFieldControl(),u=c.useRef(i),{id:t,labelId:f,description:C,state:I,isInvalid:q,isRequired:y}=g,v=a??g.name,V=c.useMemo(()=>({id:t,name:v,value:k,intent:r,state:I,isInvalid:q,description:C,isRequired:y,reverse:p,onCheckedChange:(z,j)=>{const l=k||[],R=z?[...l,j]:l.filter(F=>F!==j);x(R),u.current&&u.current(R)}}),[t,v,k,r,I,q,C,y,x,p]);return c.useEffect(()=>{u.current=i},[i]),e.jsx(U.Provider,{value:V,children:e.jsx("div",{ref:M,className:be({className:h,orientation:d}),role:"group","aria-labelledby":f,"aria-describedby":C,...G,children:m})})};_.displayName="CheckboxGroup";exports.Checkbox=X;exports.CheckboxGroup=_;
2
2
  //# sourceMappingURL=index.js.map