@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/rating/RatingStar.styles.ts","../../src/rating/RatingStar.tsx","../../src/rating/utils.ts","../../src/rating/Rating.tsx"],"sourcesContent":["import { cva, cx, VariantProps } from 'class-variance-authority'\n\nconst emptyRemainingStarsOnHoverClass = cx('[&_>_div]:peer-hover:w-0!')\n\nconst ratingStarStyles = cva(\n ['peer', 'after:inset-0', 'group', 'relative', 'after:block after:absolute'],\n {\n variants: {\n disabled: {\n true: 'opacity-dim-3',\n false: '',\n },\n readOnly: {\n true: '',\n false: '',\n },\n gap: {\n sm: ['after:w-[calc(100%+(var(--spacing-sm)))]', 'last-of-type:after:content-none'],\n md: ['after:w-[calc(100%+(var(--spacing-md)))]', 'last-of-type:after:content-none'],\n },\n },\n compoundVariants: [\n {\n readOnly: false,\n disabled: false,\n className: cx(emptyRemainingStarsOnHoverClass, 'cursor-pointer'),\n },\n ],\n defaultVariants: {\n disabled: false,\n readOnly: false,\n gap: 'sm',\n },\n }\n)\n\nconst ratingStarIconStyles = cva('', {\n variants: {\n size: {\n sm: 'text-caption-link',\n md: 'text-body-1',\n lg: 'text-display-1',\n },\n design: {\n filled: [\n 'text-main-variant',\n 'group-[[data-part=star][data-hovered]]:text-main-variant-hovered',\n ],\n outlined: ['text-on-surface/dim-3'],\n },\n },\n})\n\ntype RatingStarstylesProps = Omit<VariantProps<typeof ratingStarStyles>, 'gap'>\ntype RatingStarIconStylesProps = Omit<VariantProps<typeof ratingStarIconStyles>, 'design'>\n\nexport { ratingStarStyles, ratingStarIconStyles }\nexport type { RatingStarstylesProps, RatingStarIconStylesProps }\n","import { StarFill } from '@spark-ui/icons/StarFill'\nimport { StarOutline } from '@spark-ui/icons/StarOutline'\nimport { cx } from 'class-variance-authority'\nimport { type MouseEvent, Ref } from 'react'\n\nimport { Icon } from '../icon'\nimport {\n ratingStarIconStyles,\n type RatingStarIconStylesProps,\n ratingStarStyles,\n type RatingStarstylesProps,\n} from './RatingStar.styles'\nimport type { StarValue } from './types'\n\nexport interface RatingStarProps extends RatingStarstylesProps, RatingStarIconStylesProps {\n value: StarValue\n onClick?: (event: MouseEvent<HTMLDivElement>) => void\n onMouseEnter?: (event: MouseEvent<HTMLDivElement>) => void\n ref?: Ref<HTMLDivElement>\n}\n\nexport const RatingStar = ({\n value,\n size,\n disabled,\n readOnly,\n onClick,\n onMouseEnter,\n ref: forwardedRef,\n}: RatingStarProps) => {\n return (\n <div\n data-spark-component=\"rating-star\"\n ref={forwardedRef}\n onMouseEnter={onMouseEnter}\n className={ratingStarStyles({\n gap: size === 'lg' ? 'md' : 'sm',\n disabled,\n readOnly,\n })}\n data-part=\"star\"\n onClick={onClick}\n >\n <div\n className={cx(\n 'z-raised absolute overflow-hidden',\n 'group-[[data-part=star][data-hovered]]:overflow-visible'\n )}\n style={{ width: value * 100 + '%' }}\n >\n <Icon\n className={ratingStarIconStyles({\n size,\n design: 'filled',\n })}\n >\n <StarFill />\n </Icon>\n </div>\n\n <Icon className={ratingStarIconStyles({ size, design: 'outlined' })}>\n <StarOutline />\n </Icon>\n </div>\n )\n}\n","import { type StarValue } from './types'\n\nfunction getNearestHalfDecimal(num: number): number {\n return Math.round(num / 0.5) * 0.5\n}\n\nfunction getStarValue({ value, index }: { value?: number; index: number }): StarValue {\n if (value === undefined) return 0\n\n const starPosition = index + 1\n const formattedValue = getNearestHalfDecimal(value)\n\n if (Math.ceil(formattedValue) < starPosition) return 0\n\n return formattedValue >= starPosition ? 1 : 0.5\n}\n\nfunction splitAt<T>(arr: T[], index: number): [T[], T[]] {\n const prev = arr.slice(0, index)\n const next = arr.slice(index)\n\n return [prev, next]\n}\n\nexport { getNearestHalfDecimal, getStarValue, splitAt }\n","import { useCombinedState } from '@spark-ui/hooks/use-combined-state'\nimport { cx } from 'class-variance-authority'\nimport {\n type ChangeEvent,\n type ComponentPropsWithRef,\n type MouseEvent,\n type PropsWithChildren,\n useCallback,\n useRef,\n} from 'react'\n\nimport { RatingStar, type RatingStarProps } from './RatingStar'\nimport { getNearestHalfDecimal, getStarValue, splitAt } from './utils'\n\nexport interface RatingProps extends PropsWithChildren<ComponentPropsWithRef<'div'>> {\n /**\n * Use the `defaultValue` prop to set the default value of the input, on a from 0 to 5.\n *\n * Use this when you want to use it in an uncontrolled manner\n */\n defaultValue?: number\n /**\n * The value is the number of the rating selected, on a scale from 0 to 5.\n *\n * Use this when you want to use it in a controlled manner,\n * in conjunction with the `onValueChange` prop\n */\n value?: number\n /**\n * Event handler called when the value changes.\n */\n onValueChange?: (value: number) => void\n /**\n * Sets the component as interactive or not.\n * @default undefined\n */\n readOnly?: boolean\n /**\n * When `true`, prevents the user from interacting.\n * @default false\n */\n disabled?: boolean\n /**\n * Sets the size of the stars.\n * @default 'md'\n */\n size?: RatingStarProps['size']\n /**\n * Name of the underlying input.\n * @default undefined\n */\n name?: string\n /**\n * id of the underlying input.\n * @default undefined\n */\n id?: string\n /**\n * aria-label of the underlying input.\n * @default undefined\n */\n 'aria-label': string\n}\n\nexport const Rating = ({\n defaultValue,\n value: propValue,\n onValueChange,\n size = 'md',\n disabled,\n readOnly,\n name,\n id,\n 'aria-label': ariaLabel,\n ref,\n ...rest\n}: RatingProps) => {\n const inputRef = useRef<HTMLInputElement>(null)\n const starRefList = useRef<HTMLDivElement[]>([])\n\n const [value, setRatingValue] = useCombinedState(propValue, defaultValue, onValueChange)\n\n const valueRef = useRef(value)\n const isInteractive = !(disabled || readOnly)\n\n function onStarClick(index: number) {\n if (!inputRef.current) return\n\n setRatingValue(index + 1)\n valueRef.current = index + 1\n\n inputRef.current.focus()\n inputRef.current.setAttribute('data-clicked', '')\n }\n\n function onInputChange(event: ChangeEvent<HTMLInputElement>) {\n // 1. Avoiding unnecessary calls to onValueChange prop if value doesn't change\n // 2. Preventing value to be resetted to 0\n if (valueRef.current === Number(event.target.value) || Number(event.target.value) === 0) {\n return\n }\n valueRef.current = Number(event.target.value)\n\n setRatingValue(Number(event.target.value))\n }\n\n function onStarMouseEnter({ currentTarget }: MouseEvent<HTMLDivElement>) {\n const currentStarIndex = starRefList.current.findIndex(star => star === currentTarget)\n\n const [previousStars, followingStars] = splitAt(starRefList.current, currentStarIndex + 1)\n\n previousStars.forEach(star => star.setAttribute('data-hovered', ''))\n followingStars.forEach(star => star.removeAttribute('data-hovered'))\n }\n\n const handleStarRef = useCallback((elm: HTMLDivElement | null) => {\n if (!elm) return\n starRefList.current.push(elm)\n }, [])\n\n function resetDataPartInputAttr() {\n inputRef.current?.removeAttribute('data-clicked')\n }\n\n function resetDataPartStarAttr() {\n starRefList.current.forEach(star => star.removeAttribute('data-hovered'))\n }\n\n return (\n <div\n className=\"relative inline-flex\"\n ref={ref}\n data-spark-component=\"rating\"\n {...rest}\n onMouseLeave={resetDataPartStarAttr}\n >\n <input\n name={name}\n id={id}\n aria-label={ariaLabel}\n ref={inputRef}\n data-part=\"input\"\n className=\"peer absolute inset-0 opacity-0\"\n type=\"range\"\n min=\"0\"\n max=\"5\"\n step={readOnly ? 0.5 : 1}\n disabled={disabled}\n readOnly={readOnly}\n value={getNearestHalfDecimal(value ?? 0)}\n onChange={event => isInteractive && onInputChange(event)}\n onBlur={resetDataPartInputAttr}\n />\n <div\n className={cx(\n size === 'lg' ? 'gap-x-md' : 'gap-x-sm',\n 'flex',\n 'peer-focus-visible:u-outline peer-[[data-part=input][data-clicked]]:shadow-none'\n )}\n >\n {Array.from({ length: 5 }).map((_, index) => (\n <RatingStar\n disabled={disabled}\n readOnly={readOnly}\n size={size}\n onClick={() => isInteractive && onStarClick(index)}\n onMouseEnter={event => isInteractive && onStarMouseEnter(event)}\n ref={handleStarRef}\n key={index}\n value={getStarValue({ index, value })}\n />\n ))}\n </div>\n </div>\n )\n}\n"],"names":["emptyRemainingStarsOnHoverClass","cx","ratingStarStyles","cva","ratingStarIconStyles","RatingStar","value","size","disabled","readOnly","onClick","onMouseEnter","forwardedRef","jsxs","jsx","Icon","StarFill","StarOutline","getNearestHalfDecimal","num","getStarValue","index","starPosition","formattedValue","splitAt","arr","prev","next","Rating","defaultValue","propValue","onValueChange","name","id","ariaLabel","ref","rest","inputRef","useRef","starRefList","setRatingValue","useCombinedState","valueRef","isInteractive","onStarClick","onInputChange","event","onStarMouseEnter","currentTarget","currentStarIndex","star","previousStars","followingStars","handleStarRef","useCallback","elm","resetDataPartInputAttr","resetDataPartStarAttr","_"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/rating/RatingStar.styles.ts","../../src/rating/RatingStar.tsx","../../src/rating/utils.ts","../../src/rating/Rating.tsx"],"sourcesContent":["import { cva, cx, VariantProps } from 'class-variance-authority'\n\nconst emptyRemainingStarsOnHoverClass = cx('[&_>_div]:peer-hover:w-0!')\n\nconst ratingStarStyles = cva(\n ['peer', 'after:inset-0', 'group', 'relative', 'after:block after:absolute'],\n {\n variants: {\n disabled: {\n true: 'opacity-dim-3',\n false: '',\n },\n readOnly: {\n true: '',\n false: '',\n },\n gap: {\n sm: ['after:w-[calc(100%+(var(--spacing-sm)))]', 'last-of-type:after:content-none'],\n md: ['after:w-[calc(100%+(var(--spacing-md)))]', 'last-of-type:after:content-none'],\n },\n },\n compoundVariants: [\n {\n readOnly: false,\n disabled: false,\n className: cx(emptyRemainingStarsOnHoverClass, 'cursor-pointer'),\n },\n ],\n defaultVariants: {\n disabled: false,\n readOnly: false,\n gap: 'sm',\n },\n }\n)\n\nconst ratingStarIconStyles = cva('', {\n variants: {\n size: {\n sm: 'text-caption-link',\n md: 'text-body-1',\n lg: 'text-display-1',\n },\n design: {\n filled: [\n 'text-main-variant',\n 'group-[[data-part=star][data-hovered]]:text-main-variant-hovered',\n ],\n outlined: ['text-on-surface/dim-3'],\n },\n },\n})\n\ntype RatingStarstylesProps = Omit<VariantProps<typeof ratingStarStyles>, 'gap'>\ntype RatingStarIconStylesProps = Omit<VariantProps<typeof ratingStarIconStyles>, 'design'>\n\nexport { ratingStarStyles, ratingStarIconStyles }\nexport type { RatingStarstylesProps, RatingStarIconStylesProps }\n","import { StarFill } from '@spark-ui/icons/StarFill'\nimport { StarOutline } from '@spark-ui/icons/StarOutline'\nimport { cx } from 'class-variance-authority'\nimport { type MouseEvent, Ref } from 'react'\n\nimport { Icon } from '../icon'\nimport {\n ratingStarIconStyles,\n type RatingStarIconStylesProps,\n ratingStarStyles,\n type RatingStarstylesProps,\n} from './RatingStar.styles'\nimport type { StarValue } from './types'\n\nexport interface RatingStarProps extends RatingStarstylesProps, RatingStarIconStylesProps {\n value: StarValue\n onClick?: (event: MouseEvent<HTMLDivElement>) => void\n onMouseEnter?: (event: MouseEvent<HTMLDivElement>) => void\n ref?: Ref<HTMLDivElement>\n}\n\nexport const RatingStar = ({\n value,\n size,\n disabled,\n readOnly,\n onClick,\n onMouseEnter,\n ref: forwardedRef,\n}: RatingStarProps) => {\n return (\n <div\n data-spark-component=\"rating-star\"\n ref={forwardedRef}\n onMouseEnter={onMouseEnter}\n className={ratingStarStyles({\n gap: size === 'lg' ? 'md' : 'sm',\n disabled,\n readOnly,\n })}\n data-part=\"star\"\n onClick={onClick}\n >\n <div\n className={cx(\n 'z-raised absolute overflow-hidden',\n 'group-[[data-part=star][data-hovered]]:overflow-visible'\n )}\n style={{ width: value * 100 + '%' }}\n >\n <Icon\n className={ratingStarIconStyles({\n size,\n design: 'filled',\n })}\n >\n <StarFill />\n </Icon>\n </div>\n\n <Icon className={ratingStarIconStyles({ size, design: 'outlined' })}>\n <StarOutline />\n </Icon>\n </div>\n )\n}\n","import { type StarValue } from './types'\n\nfunction getNearestHalfDecimal(num: number): number {\n return Math.round(num / 0.5) * 0.5\n}\n\nfunction getStarValue({ value, index }: { value?: number; index: number }): StarValue {\n if (value === undefined) return 0\n\n const starPosition = index + 1\n const formattedValue = getNearestHalfDecimal(value)\n\n if (Math.ceil(formattedValue) < starPosition) return 0\n\n return formattedValue >= starPosition ? 1 : 0.5\n}\n\nfunction splitAt<T>(arr: T[], index: number): [T[], T[]] {\n const prev = arr.slice(0, index)\n const next = arr.slice(index)\n\n return [prev, next]\n}\n\nexport { getNearestHalfDecimal, getStarValue, splitAt }\n","import { useCombinedState } from '@spark-ui/hooks/use-combined-state'\nimport { cx } from 'class-variance-authority'\nimport {\n type ChangeEvent,\n type ComponentPropsWithRef,\n type MouseEvent,\n type PropsWithChildren,\n useCallback,\n useRef,\n} from 'react'\n\nimport { RatingStar, type RatingStarProps } from './RatingStar'\nimport { getNearestHalfDecimal, getStarValue, splitAt } from './utils'\n\nexport interface RatingProps extends PropsWithChildren<ComponentPropsWithRef<'div'>> {\n /**\n * Use the `defaultValue` prop to set the default value of the input, on a from 0 to 5.\n *\n * Use this when you want to use it in an uncontrolled manner\n */\n defaultValue?: number\n /**\n * The value is the number of the rating selected, on a scale from 0 to 5.\n *\n * Use this when you want to use it in a controlled manner,\n * in conjunction with the `onValueChange` prop\n */\n value?: number\n /**\n * Event handler called when the value changes.\n */\n onValueChange?: (value: number) => void\n /**\n * Sets the component as interactive or not.\n * @default undefined\n */\n readOnly?: boolean\n /**\n * When `true`, prevents the user from interacting.\n * @default false\n */\n disabled?: boolean\n /**\n * Sets the size of the stars.\n * @default 'md'\n */\n size?: RatingStarProps['size']\n /**\n * Name of the underlying input.\n * @default undefined\n */\n name?: string\n /**\n * id of the underlying input.\n * @default undefined\n */\n id?: string\n /**\n * aria-label of the underlying input.\n * @default undefined\n */\n 'aria-label': string\n}\n\nexport const Rating = ({\n defaultValue,\n value: propValue,\n onValueChange,\n size = 'md',\n disabled,\n readOnly,\n name,\n id,\n 'aria-label': ariaLabel,\n ref,\n ...rest\n}: RatingProps) => {\n const inputRef = useRef<HTMLInputElement>(null)\n const starRefList = useRef<HTMLDivElement[]>([])\n\n const [value, setRatingValue] = useCombinedState(propValue, defaultValue, onValueChange)\n\n const valueRef = useRef(value)\n const isInteractive = !(disabled || readOnly)\n\n function onStarClick(index: number) {\n if (!inputRef.current) return\n\n setRatingValue(index + 1)\n valueRef.current = index + 1\n\n inputRef.current.focus()\n inputRef.current.setAttribute('data-clicked', '')\n }\n\n function onInputChange(event: ChangeEvent<HTMLInputElement>) {\n // 1. Avoiding unnecessary calls to onValueChange prop if value doesn't change\n // 2. Preventing value to be resetted to 0\n if (valueRef.current === Number(event.target.value) || Number(event.target.value) === 0) {\n return\n }\n valueRef.current = Number(event.target.value)\n\n setRatingValue(Number(event.target.value))\n }\n\n function onStarMouseEnter({ currentTarget }: MouseEvent<HTMLDivElement>) {\n const currentStarIndex = starRefList.current.findIndex(star => star === currentTarget)\n\n const [previousStars, followingStars] = splitAt(starRefList.current, currentStarIndex + 1)\n\n previousStars.forEach(star => star.setAttribute('data-hovered', ''))\n followingStars.forEach(star => star.removeAttribute('data-hovered'))\n }\n\n const handleStarRef = useCallback((elm: HTMLDivElement | null) => {\n if (!elm) return\n starRefList.current.push(elm)\n }, [])\n\n function resetDataPartInputAttr() {\n inputRef.current?.removeAttribute('data-clicked')\n }\n\n function resetDataPartStarAttr() {\n starRefList.current.forEach(star => star.removeAttribute('data-hovered'))\n }\n\n return (\n <div\n className=\"relative inline-flex\"\n ref={ref}\n data-spark-component=\"rating\"\n {...rest}\n onMouseLeave={resetDataPartStarAttr}\n >\n <input\n name={name}\n id={id}\n aria-label={ariaLabel}\n ref={inputRef}\n data-part=\"input\"\n className=\"peer absolute inset-0 opacity-0\"\n type=\"range\"\n min=\"0\"\n max=\"5\"\n step={readOnly ? 0.5 : 1}\n disabled={disabled}\n readOnly={readOnly}\n value={getNearestHalfDecimal(value ?? 0)}\n onChange={event => isInteractive && onInputChange(event)}\n onBlur={resetDataPartInputAttr}\n />\n <div\n className={cx(\n size === 'lg' ? 'gap-x-md' : 'gap-x-sm',\n 'flex',\n 'peer-focus-visible:u-outline peer-[[data-part=input][data-clicked]]:shadow-none'\n )}\n >\n {Array.from({ length: 5 }).map((_, index) => (\n <RatingStar\n disabled={disabled}\n readOnly={readOnly}\n size={size}\n onClick={() => isInteractive && onStarClick(index)}\n onMouseEnter={event => isInteractive && onStarMouseEnter(event)}\n ref={handleStarRef}\n key={index}\n value={getStarValue({ index, value })}\n />\n ))}\n </div>\n </div>\n )\n}\n"],"names":["emptyRemainingStarsOnHoverClass","cx","ratingStarStyles","cva","ratingStarIconStyles","RatingStar","value","size","disabled","readOnly","onClick","onMouseEnter","forwardedRef","jsxs","jsx","Icon","StarFill","StarOutline","getNearestHalfDecimal","num","getStarValue","index","starPosition","formattedValue","splitAt","arr","prev","next","Rating","defaultValue","propValue","onValueChange","name","id","ariaLabel","ref","rest","inputRef","useRef","starRefList","setRatingValue","useCombinedState","valueRef","isInteractive","onStarClick","onInputChange","event","onStarMouseEnter","currentTarget","currentStarIndex","star","previousStars","followingStars","handleStarRef","useCallback","elm","resetDataPartInputAttr","resetDataPartStarAttr","_"],"mappings":"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"}
@@ -1,10 +1,10 @@
1
1
  import { jsxs as y, jsx as o } from "react/jsx-runtime";
2
2
  import { useCombinedState as H } from "@spark-ui/hooks/use-combined-state";
3
- import { a as f, c as k } from "../index-BmAFn37q.mjs";
3
+ import { cx as f, cva as k } from "class-variance-authority";
4
4
  import { useRef as b, useCallback as L } from "react";
5
5
  import { StarFill as O } from "@spark-ui/icons/StarFill";
6
6
  import { StarOutline as B } from "@spark-ui/icons/StarOutline";
7
- import { I as x } from "../Icon-D1RueiPY.mjs";
7
+ import { I as x } from "../Icon-Ck-dhfLd.mjs";
8
8
  const F = f("[&_>_div]:peer-hover:w-0!"), q = k(
9
9
  ["peer", "after:inset-0", "group", "relative", "after:block after:absolute"],
10
10
  {
@@ -121,22 +121,22 @@ const $ = ({
121
121
  ref: I,
122
122
  ...C
123
123
  }) => {
124
- const c = b(null), d = b([]), [p, S] = H(a, e, n), v = b(p), g = !(i || s);
124
+ const l = b(null), d = b([]), [p, S] = H(a, e, n), v = b(p), g = !(i || s);
125
125
  function E(t) {
126
- c.current && (S(t + 1), v.current = t + 1, c.current.focus(), c.current.setAttribute("data-clicked", ""));
126
+ l.current && (S(t + 1), v.current = t + 1, l.current.focus(), l.current.setAttribute("data-clicked", ""));
127
127
  }
128
128
  function M(t) {
129
129
  v.current === Number(t.target.value) || Number(t.target.value) === 0 || (v.current = Number(t.target.value), S(Number(t.target.value)));
130
130
  }
131
131
  function V({ currentTarget: t }) {
132
- const l = d.current.findIndex((u) => u === t), [h, j] = K(d.current, l + 1);
132
+ const c = d.current.findIndex((u) => u === t), [h, j] = K(d.current, c + 1);
133
133
  h.forEach((u) => u.setAttribute("data-hovered", "")), j.forEach((u) => u.removeAttribute("data-hovered"));
134
134
  }
135
135
  const D = L((t) => {
136
136
  t && d.current.push(t);
137
137
  }, []);
138
138
  function P() {
139
- c.current?.removeAttribute("data-clicked");
139
+ l.current?.removeAttribute("data-clicked");
140
140
  }
141
141
  function _() {
142
142
  d.current.forEach((t) => t.removeAttribute("data-hovered"));
@@ -156,7 +156,7 @@ const $ = ({
156
156
  name: m,
157
157
  id: R,
158
158
  "aria-label": w,
159
- ref: c,
159
+ ref: l,
160
160
  "data-part": "input",
161
161
  className: "peer absolute inset-0 opacity-0",
162
162
  type: "range",
@@ -178,18 +178,18 @@ const $ = ({
178
178
  "flex",
179
179
  "peer-focus-visible:u-outline peer-[[data-part=input][data-clicked]]:shadow-none"
180
180
  ),
181
- children: Array.from({ length: 5 }).map((t, l) => /* @__PURE__ */ o(
181
+ children: Array.from({ length: 5 }).map((t, c) => /* @__PURE__ */ o(
182
182
  G,
183
183
  {
184
184
  disabled: i,
185
185
  readOnly: s,
186
186
  size: r,
187
- onClick: () => g && E(l),
187
+ onClick: () => g && E(c),
188
188
  onMouseEnter: (h) => g && V(h),
189
189
  ref: D,
190
- value: J({ index: l, value: p })
190
+ value: J({ index: c, value: p })
191
191
  },
192
- l
192
+ c
193
193
  ))
194
194
  }
195
195
  )
@@ -0,0 +1,15 @@
1
+ import { ScrollingList as Root } from './ScrollingList';
2
+ import { ScrollingListControls as Controls } from './ScrollingListControls';
3
+ import { ScrollingListItem as Item } from './ScrollingListItem';
4
+ import { ScrollingListItems as Items } from './ScrollingListItems';
5
+ import { ScrollingListNextButton as NextButton } from './ScrollingListNextButton';
6
+ import { ScrollingListPrevButton as PrevButton } from './ScrollingListPrevButton';
7
+ import { ScrollingListSkipButton as SkipButton } from './ScrollingListSkipButton';
8
+ export declare const ScrollingList: typeof Root & {
9
+ Controls: typeof Controls;
10
+ NextButton: typeof NextButton;
11
+ PrevButton: typeof PrevButton;
12
+ Item: typeof Item;
13
+ Items: typeof Items;
14
+ SkipButton: typeof SkipButton;
15
+ };
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f=require("react/jsx-runtime"),Y=require("@spark-ui/hooks/use-scroll-overflow"),b=require("../index-DnaHaH_0.js"),c=require("react"),Z=require("../Slot-ghrohQLA.js"),ee=require("@spark-ui/icons/ArrowVerticalRight"),F=require("../Icon-Bf0XrmiR.js"),H=require("../IconButton-Bf-EDzpI.js"),te=require("@spark-ui/icons/ArrowVerticalLeft"),oe=require("../Button-C3xHNaGl.js");var ne=typeof document<"u"?c.useLayoutEffect:c.useEffect,se=({axis:o="x",initialPages:n=[]}={})=>{const e=o==="x"?"width":"height",l=o==="x"?"scrollWidth":"scrollHeight",t=o==="x"?"clientWidth":"clientHeight",s=o==="x"?"left":"top",u=o==="x"?"right":"bottom",d=o==="x"?"scrollLeft":"scrollTop",[r,v]=c.useState(null),[{pages:i,activePageIndex:g},y]=c.useState({pages:n,activePageIndex:0}),S=c.useCallback(a=>{if(!r)return;if(Math.floor(r[l]-r[d])<=r[t]){y({pages:a,activePageIndex:a.length-1});return}const w=Array.from(r.children),B=r.getBoundingClientRect(),h=a.map(E=>{const A=E[0],k=w[A];I(k instanceof HTMLElement,"Expected HTMLElement");const Q=O(r,k,s),X=k.getBoundingClientRect()[s]-B[s]-Q;return Math.abs(X)}),p=Math.min(...h),L=h.indexOf(p);y({pages:a,activePageIndex:L})},[r,t,s,l,d]),m=c.useCallback(()=>{if(!r)return;const a=Array.from(r.children),x=r.getBoundingClientRect();let w;const B=a.reduce((h,p,L)=>{I(p instanceof HTMLElement,"Expected HTMLElement");const E=h[h.length-1],A=V(p,p.parentElement);if(!E||p.dataset.shouldSnap==="true"||A[u]-w>Math.ceil(x[e])){h.push([L]);const k=O(r,p,s);w=A[s]-k}else E.push(L);return h},[]);S(B)},[S,r,e,u,s]);ne(()=>{m()},[m]),c.useEffect(()=>{const a=()=>{m()};return window.addEventListener("resize",a),window.addEventListener("orientationchange",a),()=>{window.removeEventListener("resize",a),window.removeEventListener("orientationchange",a)}},[m]),c.useEffect(()=>{if(!r)return;const a=()=>{S(i)};return r.addEventListener("scroll",a),()=>{r.removeEventListener("scroll",a)}},[S,i,r]);const C=(a,x)=>{if(!r)return;const w=i[a];if(!w)return;const B=Array.from(r.children),h=w[0],p=B[h];if(!(p instanceof HTMLElement))return;const L=O(r,p,s),E=x?.behavior||"smooth";r.scrollTo({behavior:E,[s]:V(p,p.parentElement)[s]-L})},j=a=>{C(g-1,a)},R=a=>{C(g+1,a)},P=c.useMemo(()=>new Set(i.map(a=>a[0])),[i]),M=g>0,T=g<i.length-1;return{hasPrevPage:M,hasNextPage:T,prev:j,next:R,goTo:C,refresh:m,pages:i,activePageIndex:g,snapPointIndexes:P,scrollRef:v}},V=(o,n)=>{const e=q(o);if(!n)return e;const l=q(n);return{left:e.left-l.left,top:e.top-l.top,right:e.right-l.left,bottom:e.bottom-l.top,width:e.width,height:e.height}},q=o=>{const n=o.getBoundingClientRect();let e=0,l=0,t=o.parentElement;for(;t;)e+=t.scrollLeft,l+=t.scrollTop,t=t.parentElement;const s=n.left+e,u=n.top+l;return{left:s,top:u,right:s+n.width,bottom:u+n.height,width:n.width,height:n.height}},le=(o,n)=>{const l=window.getComputedStyle(o).getPropertyValue(`scroll-padding-${n}`)||"0px";if(l==="auto")return 0;const t=`Unsupported scroll padding value, expected <length> or <percentage> value, received ${l}`;if(l.endsWith("px")){const s=parseInt(l);return I(!Number.isNaN(s),t),s}if(l.endsWith("%")){const s=parseInt(l);return I(!Number.isNaN(s),t),o.clientWidth/100*s}throw new $(t)},re=(o,n)=>{const l=window.getComputedStyle(o).getPropertyValue(`scroll-margin-${n}`)||"0px",t=`Unsupported scroll margin value, expected <length> value, received ${l}`;I(l.endsWith("px"),t);const s=parseInt(l);return I(!Number.isNaN(s),t),s},O=(o,n,e)=>{const l=le(o,e),t=re(n,e),s=V(n,n.parentElement);return Math.min(l+t,s[e])};function I(o,n){if(!o)throw new $(n)}var $=class extends Error{constructor(o){super(`[react-snap-carousel]: ${o}`)}};const N=c.createContext(null),z=({snapType:o="none",snapStop:n="normal",scrollBehavior:e="smooth",loop:l=!1,gap:t=16,withFade:s=!1,scrollPadding:u=0,children:d,className:r,...v})=>{const i=c.useRef(null),g=c.useRef(null),y=se(),{overflow:S,refresh:m}=Y.useScrollOverflow(i,{precisionTreshold:1}),{activePageIndex:C,pages:j,refresh:R}=y,P=j[C],M=P?[P[0]+1,P[P.length-1]+1]:[0,0],T=c.useCallback(()=>{R&&i.current&&setTimeout(()=>{R()},0)},[R]);c.useEffect(()=>{T()},[d,T]),c.useLayoutEffect(()=>{i.current&&requestAnimationFrame(()=>{m()})},[d,m]);const x={...y,snapType:o,snapStop:n,skipKeyboardNavigation:()=>{g.current?.focus()},scrollBehavior:e,visibleItemsRange:M,loop:l,gap:t,withFade:s,scrollPadding:u,scrollAreaRef:i,overflow:S};return f.jsxs(N.Provider,{value:x,children:[f.jsx("div",{"data-spark-component":"scrolling-list",className:b.cx("gap-lg group/scrolling-list relative flex flex-col default:w-full",r),...v,children:d}),f.jsx("span",{ref:g,className:"size-0 overflow-hidden",tabIndex:-1})]})};z.displayName="ScrollingList";const W=({children:o,visibility:n="always",className:e,...l})=>f.jsx("div",{"data-spark-component":"scrolling-list-controls",className:b.cx("default:px-md pointer-events-none absolute inset-0 flex flex-row items-center justify-between overflow-hidden",e),style:{"--scrolling-list-controls-opacity":n==="hover"?"0":"1"},"data-orientation":"horizontal",...l,children:o});W.displayName="ScrollingList.Controls";function ie(o,n){const[e,l]=c.useState(!1);return c.useEffect(()=>{const t=d=>{l(!0);const r=d.target,v=n.current;if(r&&v){const i=r.getBoundingClientRect(),g=v.getBoundingClientRect();i.left>=g.left&&i.right<=g.right&&i.top>=g.top&&i.bottom<=g.bottom||r.scrollIntoView({behavior:"smooth",inline:"center",block:"nearest"})}},s=d=>{o.current&&!o.current.contains(d.relatedTarget)&&l(!1)},u=o.current;return u&&(u.addEventListener("focusin",t),u.addEventListener("focusout",s)),()=>{u&&(u.removeEventListener("focusin",t),u.removeEventListener("focusout",s))}},[o,n]),e}const D=({asChild:o=!1,children:n,index:e=0,className:l="",...t})=>{const s=c.useContext(N),u=c.useRef(null),d=s.snapPointIndexes.has(e);ie(u,s.scrollAreaRef);const r=o?Z.Slot:"div";return f.jsx(r,{"data-spark-component":"scrolling-list-item",role:"listitem",ref:u,className:b.cx("default:w-auto default:shrink-0",{"snap-start":d,"snap-normal":d&&s.snapStop==="normal","snap-always":d&&s.snapStop==="always"},l),...t,children:n})};D.displayName="ScrollingList.Item";function ce(...o){return n=>{o.forEach(e=>{typeof e=="function"?e(n):e&&typeof e=="object"&&"current"in e&&(e.current=n)})}}const K=({children:o,ref:n,className:e="",...l})=>{const t=c.useContext(N),s={mandatory:"x mandatory",proximity:"x proximity",none:"none"},u=i=>{!t.loop&&!t.hasPrevPage||(i.preventDefault(),t.goTo(t.hasPrevPage?t.activePageIndex-1:t.pages.length-1,{behavior:t.scrollBehavior}))},d=i=>{!t.loop&&!t.hasNextPage||(i.preventDefault(),t.goTo(t.hasNextPage?t.activePageIndex+1:0,{behavior:t.scrollBehavior}))},r=i=>{i.key==="ArrowLeft"&&u(i),i.key==="ArrowRight"&&d(i)},v={scrollSnapType:s[t.snapType],scrollPaddingInline:"var(--scrolling-list-px)","--scrolling-list-px":`${t.scrollPadding}px`,"--scrolling-list-gap":`${t.gap}px`,...t.withFade&&{maskImage:"linear-gradient(to right, rgba(0, 0, 0, 0), rgba(0, 0, 0, 1) 44px, rgba(0, 0, 0, 1) calc(100% - 44px), rgba(0, 0, 0, 0))",maskSize:`calc(100% + ${t.overflow.left?"0px":"44px"} + ${t.overflow.right?"0px":"44px"}) 100%`,maskPosition:`${t.overflow.left?"0px":"-44px"} 0`}};return f.jsx("div",{"data-spark-component":"scrolling-list-items",id:"scrolling-list-items",role:"list",className:b.cx("relative transition-all duration-300","u-no-scrollbar overflow-x-auto scroll-smooth","w-full gap-(--scrolling-list-gap) default:flex default:flex-row","focus-visible:u-outline",e),ref:ce(t.scrollAreaRef,t.scrollRef,n),style:v,onKeyDown:r,...l,children:c.Children.map(o,(i,g)=>c.isValidElement(i)?c.cloneElement(i,{index:g}):i)})};K.displayName="ScrollingList.Items";const U=({"aria-label":o,...n})=>{const e=c.useContext(N),l=()=>{e.hasNextPage?e.next({behavior:e.scrollBehavior}):e.goTo(0,{behavior:e.scrollBehavior})},s=!(e.overflow.left||e.overflow.right)||!e.loop&&!e.overflow.right;return f.jsx(H.IconButton,{"data-spark-component":"scrolling-list-next-button",size:"sm",intent:"surface",design:"filled",className:b.cx("pointer-events-auto opacity-(--scrolling-list-controls-opacity) shadow-sm disabled:invisible","group-hover/scrolling-list:opacity-none focus-visible:opacity-none"),onClick:l,disabled:s,"aria-label":o,"aria-controls":"scrolling-list-items",...n,children:f.jsx(F.Icon,{children:f.jsx(ee.ArrowVerticalRight,{})})})};U.displayName="ScrollingList.NextButton";const G=({"aria-label":o,...n})=>{const e=c.useContext(N),l=()=>{e.activePageIndex===0&&(e.scrollAreaRef.current?.scrollLeft||0)>0?e.goTo(0,{behavior:e.scrollBehavior}):e.hasPrevPage?e.prev({behavior:e.scrollBehavior}):e.goTo(e.pages.length-1,{behavior:e.scrollBehavior})},s=!(e.overflow.left||e.overflow.right)||!e.loop&&!e.overflow.left;return f.jsx(H.IconButton,{"data-spark-component":"scrolling-list-prev-button",size:"sm",intent:"surface",design:"filled",className:b.cx("pointer-events-auto opacity-(--scrolling-list-controls-opacity) shadow-sm disabled:invisible","group-hover/scrolling-list:opacity-none focus-visible:opacity-none"),onClick:l,disabled:s,"aria-label":o,"aria-controls":"scrolling-list-items",...n,children:f.jsx(F.Icon,{children:f.jsx(te.ArrowVerticalLeft,{})})})};G.displayName="ScrollingList.PrevButton";const _=({children:o,...n})=>{const e=c.useContext(N);return f.jsx(oe.Button,{type:"button",design:"tinted",intent:"surface",tabIndex:0,className:b.cx("z-raised absolute top-1/2 left-0 -translate-y-1/2","not-focus-visible:pointer-events-none not-focus-visible:size-0 not-focus-visible:opacity-0"),onClick:e.skipKeyboardNavigation,...n,children:o})};_.displayName="ScrollingList.SkipButton";const J=Object.assign(z,{Controls:W,NextButton:U,PrevButton:G,Item:D,Items:K,SkipButton:_});J.displayName="ScrollingList";exports.ScrollingList=J;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const u=require("react/jsx-runtime"),T=require("@spark-ui/hooks/use-scroll-overflow"),p=require("class-variance-authority"),l=require("react"),O=require("react-snap-carousel"),V=require("../Slot-DQ8z2zsy.js"),z=require("@spark-ui/icons/ArrowVerticalRight"),w=require("../Icon-CF0W0LKr.js"),S=require("../IconButton-D3g86WpZ.js"),D=require("@spark-ui/icons/ArrowVerticalLeft"),$=require("../Button-B6rA3-e5.js"),v=l.createContext(null),P=({snapType:s="none",snapStop:n="normal",scrollBehavior:e="smooth",loop:r=!1,gap:t=16,withFade:i=!1,scrollPadding:a=0,children:c,className:f,...d})=>{const o=l.useRef(null),g=l.useRef(null),h=O.useSnapCarousel(),{overflow:j,refresh:b}=T.useScrollOverflow(o,{precisionTreshold:1}),{activePageIndex:A,pages:q,refresh:m}=h,x=q[A],E=x?[x[0]+1,x[x.length-1]+1]:[0,0],y=l.useCallback(()=>{m&&o.current&&setTimeout(()=>{m()},0)},[m]);l.useEffect(()=>{y()},[c,y]),l.useLayoutEffect(()=>{o.current&&requestAnimationFrame(()=>{b()})},[c,b]);const F={...h,snapType:s,snapStop:n,skipKeyboardNavigation:()=>{g.current?.focus()},scrollBehavior:e,visibleItemsRange:E,loop:r,gap:t,withFade:i,scrollPadding:a,scrollAreaRef:o,overflow:j};return u.jsxs(v.Provider,{value:F,children:[u.jsx("div",{"data-spark-component":"scrolling-list",className:p.cx("gap-lg group/scrolling-list relative flex flex-col default:w-full",f),...d,children:c}),u.jsx("span",{ref:g,className:"size-0 overflow-hidden",tabIndex:-1})]})};P.displayName="ScrollingList";const L=({children:s,visibility:n="always",className:e,...r})=>u.jsx("div",{"data-spark-component":"scrolling-list-controls",className:p.cx("default:px-md pointer-events-none absolute inset-0 flex flex-row items-center justify-between overflow-hidden",e),style:{"--scrolling-list-controls-opacity":n==="hover"?"0":"1"},"data-orientation":"horizontal",...r,children:s});L.displayName="ScrollingList.Controls";function K(s,n){const[e,r]=l.useState(!1);return l.useEffect(()=>{const t=c=>{r(!0);const f=c.target,d=n.current;if(f&&d){const o=f.getBoundingClientRect(),g=d.getBoundingClientRect();o.left>=g.left&&o.right<=g.right&&o.top>=g.top&&o.bottom<=g.bottom||f.scrollIntoView({behavior:"smooth",inline:"center",block:"nearest"})}},i=c=>{s.current&&!s.current.contains(c.relatedTarget)&&r(!1)},a=s.current;return a&&(a.addEventListener("focusin",t),a.addEventListener("focusout",i)),()=>{a&&(a.removeEventListener("focusin",t),a.removeEventListener("focusout",i))}},[s,n]),e}const I=({asChild:s=!1,children:n,index:e=0,className:r="",...t})=>{const i=l.useContext(v),a=l.useRef(null),c=i.snapPointIndexes.has(e);K(a,i.scrollAreaRef);const f=s?V.Slot:"div";return u.jsx(f,{"data-spark-component":"scrolling-list-item",role:"listitem",ref:a,className:p.cx("default:w-auto default:shrink-0",{"snap-start":c,"snap-normal":c&&i.snapStop==="normal","snap-always":c&&i.snapStop==="always"},r),...t,children:n})};I.displayName="ScrollingList.Item";function H(...s){return n=>{s.forEach(e=>{typeof e=="function"?e(n):e&&typeof e=="object"&&"current"in e&&(e.current=n)})}}const N=({children:s,ref:n,className:e="",...r})=>{const t=l.useContext(v),i={mandatory:"x mandatory",proximity:"x proximity",none:"none"},a=o=>{!t.loop&&!t.hasPrevPage||(o.preventDefault(),t.goTo(t.hasPrevPage?t.activePageIndex-1:t.pages.length-1,{behavior:t.scrollBehavior}))},c=o=>{!t.loop&&!t.hasNextPage||(o.preventDefault(),t.goTo(t.hasNextPage?t.activePageIndex+1:0,{behavior:t.scrollBehavior}))},f=o=>{o.key==="ArrowLeft"&&a(o),o.key==="ArrowRight"&&c(o)},d={scrollSnapType:i[t.snapType],scrollPaddingInline:"var(--scrolling-list-px)","--scrolling-list-px":`${t.scrollPadding}px`,"--scrolling-list-gap":`${t.gap}px`,...t.withFade&&{maskImage:"linear-gradient(to right, rgba(0, 0, 0, 0), rgba(0, 0, 0, 1) 44px, rgba(0, 0, 0, 1) calc(100% - 44px), rgba(0, 0, 0, 0))",maskSize:`calc(100% + ${t.overflow.left?"0px":"44px"} + ${t.overflow.right?"0px":"44px"}) 100%`,maskPosition:`${t.overflow.left?"0px":"-44px"} 0`}};return u.jsx("div",{"data-spark-component":"scrolling-list-items",id:"scrolling-list-items",role:"list",className:p.cx("relative transition-all duration-300","u-no-scrollbar overflow-x-auto scroll-smooth","w-full gap-(--scrolling-list-gap) default:flex default:flex-row","focus-visible:u-outline",e),ref:H(t.scrollAreaRef,t.scrollRef,n),style:d,onKeyDown:f,...r,children:l.Children.map(s,(o,g)=>l.isValidElement(o)?l.cloneElement(o,{index:g}):o)})};N.displayName="ScrollingList.Items";const k=({"aria-label":s,...n})=>{const e=l.useContext(v),r=()=>{e.hasNextPage?e.next({behavior:e.scrollBehavior}):e.goTo(0,{behavior:e.scrollBehavior})},i=!(e.overflow.left||e.overflow.right)||!e.loop&&!e.overflow.right;return u.jsx(S.IconButton,{"data-spark-component":"scrolling-list-next-button",size:"sm",intent:"surface",design:"filled",className:p.cx("pointer-events-auto opacity-(--scrolling-list-controls-opacity) shadow-sm disabled:invisible","group-hover/scrolling-list:opacity-none focus-visible:opacity-none"),onClick:r,disabled:i,"aria-label":s,"aria-controls":"scrolling-list-items",...n,children:u.jsx(w.Icon,{children:u.jsx(z.ArrowVerticalRight,{})})})};k.displayName="ScrollingList.NextButton";const B=({"aria-label":s,...n})=>{const e=l.useContext(v),r=()=>{e.activePageIndex===0&&(e.scrollAreaRef.current?.scrollLeft||0)>0?e.goTo(0,{behavior:e.scrollBehavior}):e.hasPrevPage?e.prev({behavior:e.scrollBehavior}):e.goTo(e.pages.length-1,{behavior:e.scrollBehavior})},i=!(e.overflow.left||e.overflow.right)||!e.loop&&!e.overflow.left;return u.jsx(S.IconButton,{"data-spark-component":"scrolling-list-prev-button",size:"sm",intent:"surface",design:"filled",className:p.cx("pointer-events-auto opacity-(--scrolling-list-controls-opacity) shadow-sm disabled:invisible","group-hover/scrolling-list:opacity-none focus-visible:opacity-none"),onClick:r,disabled:i,"aria-label":s,"aria-controls":"scrolling-list-items",...n,children:u.jsx(w.Icon,{children:u.jsx(D.ArrowVerticalLeft,{})})})};B.displayName="ScrollingList.PrevButton";const C=({children:s,...n})=>{const e=l.useContext(v);return u.jsx($.Button,{type:"button",design:"tinted",intent:"surface",tabIndex:0,className:p.cx("z-raised absolute top-1/2 left-0 -translate-y-1/2","not-focus-visible:pointer-events-none not-focus-visible:size-0 not-focus-visible:opacity-0"),onClick:e.skipKeyboardNavigation,...n,children:s})};C.displayName="ScrollingList.SkipButton";const R=Object.assign(P,{Controls:L,NextButton:k,PrevButton:B,Item:I,Items:N,SkipButton:C});R.displayName="ScrollingList";exports.ScrollingList=R;
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../node_modules/react-snap-carousel/dist/use-snap-carousel.mjs","../../src/scrolling-list/ScrollingList.tsx","../../src/scrolling-list/ScrollingListControls.tsx","../../src/scrolling-list/useFocusWithinScroll.tsx","../../src/scrolling-list/ScrollingListItem.tsx","../../src/scrolling-list/ScrollingListItems.tsx","../../src/scrolling-list/ScrollingListNextButton.tsx","../../src/scrolling-list/ScrollingListPrevButton.tsx","../../src/scrolling-list/ScrollingListSkipButton.tsx","../../src/scrolling-list/index.ts"],"sourcesContent":["// src/use-snap-carousel.tsx\nimport { useState, useCallback, useEffect as useEffect2, useMemo } from \"react\";\n\n// src/use-isomorphic-layout-effect.tsx\nimport { useEffect, useLayoutEffect } from \"react\";\nvar useIsomorphicLayoutEffect = typeof document !== \"undefined\" ? useLayoutEffect : useEffect;\n\n// src/use-snap-carousel.tsx\nvar useSnapCarousel = ({\n axis = \"x\",\n initialPages = []\n} = {}) => {\n const dimension = axis === \"x\" ? \"width\" : \"height\";\n const scrollDimension = axis === \"x\" ? \"scrollWidth\" : \"scrollHeight\";\n const clientDimension = axis === \"x\" ? \"clientWidth\" : \"clientHeight\";\n const nearSidePos = axis === \"x\" ? \"left\" : \"top\";\n const farSidePos = axis === \"x\" ? \"right\" : \"bottom\";\n const scrollPos = axis === \"x\" ? \"scrollLeft\" : \"scrollTop\";\n const [scrollEl, setScrollEl] = useState(null);\n const [{ pages, activePageIndex }, setCarouselState] = useState({\n pages: initialPages,\n activePageIndex: 0\n });\n const refreshActivePage = useCallback(\n (pages2) => {\n if (!scrollEl) {\n return;\n }\n const hasScrolledToEnd = Math.floor(scrollEl[scrollDimension] - scrollEl[scrollPos]) <= scrollEl[clientDimension];\n if (hasScrolledToEnd) {\n setCarouselState({ pages: pages2, activePageIndex: pages2.length - 1 });\n return;\n }\n const items = Array.from(scrollEl.children);\n const scrollPort = scrollEl.getBoundingClientRect();\n const offsets = pages2.map((page) => {\n const leadIndex = page[0];\n const leadEl = items[leadIndex];\n assert(leadEl instanceof HTMLElement, \"Expected HTMLElement\");\n const scrollSpacing = getEffectiveScrollSpacing(\n scrollEl,\n leadEl,\n nearSidePos\n );\n const rect = leadEl.getBoundingClientRect();\n const offset = rect[nearSidePos] - scrollPort[nearSidePos] - scrollSpacing;\n return Math.abs(offset);\n });\n const minOffset = Math.min(...offsets);\n const nextActivePageIndex = offsets.indexOf(minOffset);\n setCarouselState({ pages: pages2, activePageIndex: nextActivePageIndex });\n },\n [scrollEl, clientDimension, nearSidePos, scrollDimension, scrollPos]\n );\n const refresh = useCallback(() => {\n if (!scrollEl) {\n return;\n }\n const items = Array.from(scrollEl.children);\n const scrollPort = scrollEl.getBoundingClientRect();\n let currPageStartPos;\n const pages2 = items.reduce((acc, item, i) => {\n assert(item instanceof HTMLElement, \"Expected HTMLElement\");\n const currPage = acc[acc.length - 1];\n const rect = getOffsetRect(item, item.parentElement);\n if (!currPage || item.dataset.shouldSnap === \"true\" || rect[farSidePos] - currPageStartPos > Math.ceil(scrollPort[dimension])) {\n acc.push([i]);\n const scrollSpacing = getEffectiveScrollSpacing(\n scrollEl,\n item,\n nearSidePos\n );\n currPageStartPos = rect[nearSidePos] - scrollSpacing;\n } else {\n currPage.push(i);\n }\n return acc;\n }, []);\n refreshActivePage(pages2);\n }, [refreshActivePage, scrollEl, dimension, farSidePos, nearSidePos]);\n useIsomorphicLayoutEffect(() => {\n refresh();\n }, [refresh]);\n useEffect2(() => {\n const handle = () => {\n refresh();\n };\n window.addEventListener(\"resize\", handle);\n window.addEventListener(\"orientationchange\", handle);\n return () => {\n window.removeEventListener(\"resize\", handle);\n window.removeEventListener(\"orientationchange\", handle);\n };\n }, [refresh]);\n useEffect2(() => {\n if (!scrollEl) {\n return;\n }\n const handle = () => {\n refreshActivePage(pages);\n };\n scrollEl.addEventListener(\"scroll\", handle);\n return () => {\n scrollEl.removeEventListener(\"scroll\", handle);\n };\n }, [refreshActivePage, pages, scrollEl]);\n const handleGoTo = (index, opts) => {\n if (!scrollEl) {\n return;\n }\n const page = pages[index];\n if (!page) {\n return;\n }\n const items = Array.from(scrollEl.children);\n const leadIndex = page[0];\n const leadEl = items[leadIndex];\n if (!(leadEl instanceof HTMLElement)) {\n return;\n }\n const scrollSpacing = getEffectiveScrollSpacing(\n scrollEl,\n leadEl,\n nearSidePos\n );\n const behavior = (opts == null ? void 0 : opts.behavior) || \"smooth\";\n scrollEl.scrollTo({\n behavior,\n [nearSidePos]: getOffsetRect(leadEl, leadEl.parentElement)[nearSidePos] - scrollSpacing\n });\n };\n const handlePrev = (opts) => {\n handleGoTo(activePageIndex - 1, opts);\n };\n const handleNext = (opts) => {\n handleGoTo(activePageIndex + 1, opts);\n };\n const snapPointIndexes = useMemo(\n () => new Set(pages.map((page) => page[0])),\n [pages]\n );\n const hasPrevPage = activePageIndex > 0;\n const hasNextPage = activePageIndex < pages.length - 1;\n return {\n hasPrevPage,\n hasNextPage,\n prev: handlePrev,\n next: handleNext,\n goTo: handleGoTo,\n refresh,\n pages,\n activePageIndex,\n snapPointIndexes,\n scrollRef: setScrollEl\n };\n};\nvar getOffsetRect = (el, relativeTo) => {\n const rect = _getOffsetRect(el);\n if (!relativeTo) {\n return rect;\n }\n const relativeRect = _getOffsetRect(relativeTo);\n return {\n left: rect.left - relativeRect.left,\n top: rect.top - relativeRect.top,\n right: rect.right - relativeRect.left,\n bottom: rect.bottom - relativeRect.top,\n width: rect.width,\n height: rect.height\n };\n};\nvar _getOffsetRect = (el) => {\n const rect = el.getBoundingClientRect();\n let scrollLeft = 0;\n let scrollTop = 0;\n let parentEl = el.parentElement;\n while (parentEl) {\n scrollLeft += parentEl.scrollLeft;\n scrollTop += parentEl.scrollTop;\n parentEl = parentEl.parentElement;\n }\n const left = rect.left + scrollLeft;\n const top = rect.top + scrollTop;\n return {\n left,\n top,\n right: left + rect.width,\n bottom: top + rect.height,\n width: rect.width,\n height: rect.height\n };\n};\nvar getScrollPaddingUsedValue = (el, pos) => {\n const style = window.getComputedStyle(el);\n const scrollPadding = style.getPropertyValue(`scroll-padding-${pos}`) || \"0px\";\n if (scrollPadding === \"auto\") {\n return 0;\n }\n const invalidMsg = `Unsupported scroll padding value, expected <length> or <percentage> value, received ${scrollPadding}`;\n if (scrollPadding.endsWith(\"px\")) {\n const value = parseInt(scrollPadding);\n assert(!Number.isNaN(value), invalidMsg);\n return value;\n }\n if (scrollPadding.endsWith(\"%\")) {\n const value = parseInt(scrollPadding);\n assert(!Number.isNaN(value), invalidMsg);\n return el.clientWidth / 100 * value;\n }\n throw new RSCError(invalidMsg);\n};\nvar getScrollMarginUsedValue = (el, pos) => {\n const style = window.getComputedStyle(el);\n const scrollMargin = style.getPropertyValue(`scroll-margin-${pos}`) || \"0px\";\n const invalidMsg = `Unsupported scroll margin value, expected <length> value, received ${scrollMargin}`;\n assert(scrollMargin.endsWith(\"px\"), invalidMsg);\n const value = parseInt(scrollMargin);\n assert(!Number.isNaN(value), invalidMsg);\n return value;\n};\nvar getEffectiveScrollSpacing = (scrollEl, itemEl, pos) => {\n const scrollPadding = getScrollPaddingUsedValue(scrollEl, pos);\n const scrollMargin = getScrollMarginUsedValue(itemEl, pos);\n const rect = getOffsetRect(itemEl, itemEl.parentElement);\n return Math.min(scrollPadding + scrollMargin, rect[pos]);\n};\nfunction assert(value, message) {\n if (value) {\n return;\n }\n throw new RSCError(message);\n}\nvar RSCError = class extends Error {\n constructor(message) {\n super(`[react-snap-carousel]: ${message}`);\n }\n};\nexport {\n useSnapCarousel\n};\n","import { ScrollOverflow, useScrollOverflow } from '@spark-ui/hooks/use-scroll-overflow'\nimport { cx } from 'class-variance-authority'\nimport {\n ComponentPropsWithRef,\n createContext,\n ReactNode,\n RefObject,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n} from 'react'\nimport { SnapCarouselResult, useSnapCarousel } from 'react-snap-carousel'\n\ntype SnapType = 'mandatory' | 'proximity' | 'none'\ntype ScrollBehavior = 'smooth' | 'instant'\ntype SnapStop = 'normal' | 'always'\n\ninterface Props extends ComponentPropsWithRef<'div'> {\n /**\n * CSS scroll snap behavior.\n * - `mandatory` to force snapping on each \"page\".\n * - `proximity` to force snapping only when scroll position is near the edge of a \"page\". Behavior can change depending on each browser.\n * - `none` to disabled scroll snapping.\n */\n snapType?: SnapType\n /**\n * Defines whether or not the scroll container is allowed to \"pass over\" possible snap positions.\n */\n snapStop?: SnapStop\n scrollBehavior?: ScrollBehavior\n /**\n * Add a fade effect to indicate content overflow.\n */\n withFade?: boolean\n children?: ReactNode\n /**\n * When `true`, allow previous and next buttons to be used when reaching the edges of the list.\n */\n loop?: boolean\n /**\n * Space (in pixels) between items.\n */\n gap?: number\n /**\n * Offset (in pixels) of the left of the optimal viewing region of the list.\n */\n scrollPadding?: number\n className?: string\n}\n\ninterface ScrollingListContextState extends SnapCarouselResult {\n snapType: SnapType\n snapStop: SnapStop\n scrollBehavior: ScrollBehavior\n visibleItemsRange: readonly [number, number]\n loop: boolean\n gap: number\n withFade: boolean\n scrollPadding: number\n scrollAreaRef: RefObject<HTMLDivElement | null>\n overflow: ScrollOverflow\n skipKeyboardNavigation: () => void\n}\n\nexport const ScrollingListContext = createContext<ScrollingListContextState>(\n null as unknown as ScrollingListContextState\n)\n\nexport const ScrollingList = ({\n snapType = 'none',\n snapStop = 'normal',\n scrollBehavior = 'smooth',\n loop = false,\n gap = 16,\n withFade = false,\n scrollPadding = 0,\n children,\n className,\n ...rest\n}: Props) => {\n const scrollAreaRef = useRef<HTMLDivElement>(null)\n const skipAnchorRef = useRef<HTMLButtonElement>(null)\n\n const snapCarouselAPI = useSnapCarousel()\n\n const { overflow, refresh: refreshOverflow } = useScrollOverflow(scrollAreaRef, {\n precisionTreshold: 1,\n })\n\n const { activePageIndex, pages, refresh } = snapCarouselAPI\n\n const visibleItems = pages[activePageIndex] as number[]\n\n const visibleItemsRange = visibleItems\n ? ([visibleItems[0]! + 1, visibleItems[visibleItems.length - 1]! + 1] as const)\n : ([0, 0] as const)\n\n // Force refresh of the carousel API when children change\n const forceRefresh = useCallback(() => {\n if (refresh && scrollAreaRef.current) {\n // Small delay to ensure DOM is updated\n setTimeout(() => {\n refresh()\n }, 0)\n }\n }, [refresh])\n\n useEffect(() => {\n forceRefresh()\n }, [children, forceRefresh])\n\n useLayoutEffect(() => {\n if (scrollAreaRef.current) {\n // Use requestAnimationFrame to ensure proper timing with the render cycle\n // This prevents race conditions that occur when the console is closed\n requestAnimationFrame(() => {\n refreshOverflow()\n })\n }\n }, [children, refreshOverflow])\n\n const skipKeyboardNavigation = () => {\n skipAnchorRef.current?.focus()\n }\n\n const ctxValue: ScrollingListContextState = {\n ...snapCarouselAPI,\n snapType,\n snapStop,\n skipKeyboardNavigation,\n scrollBehavior,\n visibleItemsRange,\n loop,\n gap,\n withFade,\n scrollPadding,\n scrollAreaRef,\n overflow,\n }\n\n return (\n <ScrollingListContext.Provider value={ctxValue}>\n <div\n data-spark-component=\"scrolling-list\"\n className={cx(\n 'gap-lg group/scrolling-list relative flex flex-col default:w-full',\n className\n )}\n {...rest}\n >\n {children}\n </div>\n <span ref={skipAnchorRef} className=\"size-0 overflow-hidden\" tabIndex={-1} />\n </ScrollingListContext.Provider>\n )\n}\n\nScrollingList.displayName = 'ScrollingList'\n","import { cx } from 'class-variance-authority'\nimport { ComponentPropsWithoutRef, CSSProperties, ReactNode } from 'react'\n\ninterface ScrollingListControls extends ComponentPropsWithoutRef<'div'> {\n /**\n * Visibility behavior of the control buttons:\n * - `always`: buttons are always visible.\n * - `hover`: buttons only appear on hover.\n *\n * a11y: `hover` is dangerous for accessibility as it disabled controls for touch screen users.\n * When using it, you must provide an alternative control outside of the list to replace them.\n */\n visibility?: 'hover' | 'always'\n children: ReactNode\n}\n\nexport const ScrollingListControls = ({\n children,\n visibility = 'always',\n className,\n ...rest\n}: ScrollingListControls) => {\n return (\n <div\n data-spark-component=\"scrolling-list-controls\"\n className={cx(\n 'default:px-md pointer-events-none absolute inset-0 flex flex-row items-center justify-between overflow-hidden',\n className\n )}\n style={\n {\n '--scrolling-list-controls-opacity': visibility === 'hover' ? '0' : '1',\n } as CSSProperties\n }\n data-orientation=\"horizontal\"\n {...rest}\n >\n {children}\n </div>\n )\n}\n\nScrollingListControls.displayName = 'ScrollingList.Controls'\n","import { RefObject, useEffect, useState } from 'react'\n\nexport function useFocusWithinScroll<T extends HTMLElement | null>(\n ref: RefObject<T>, // The container to detect focus within\n scrollRef: RefObject<HTMLDivElement | null> // The scrollable container\n) {\n const [isFocusWithin, setIsFocusWithin] = useState(false)\n\n useEffect(() => {\n const handleFocusIn = (event: FocusEvent) => {\n setIsFocusWithin(true)\n\n const focusedElement = event.target as HTMLElement\n const scrollContainer = scrollRef.current\n\n if (focusedElement && scrollContainer) {\n const focusRect = focusedElement.getBoundingClientRect()\n const scrollRect = scrollContainer.getBoundingClientRect()\n\n // Check if the focused element is fully visible inside the scroll container\n const isFullyVisible =\n focusRect.left >= scrollRect.left &&\n focusRect.right <= scrollRect.right &&\n focusRect.top >= scrollRect.top &&\n focusRect.bottom <= scrollRect.bottom\n\n if (!isFullyVisible) {\n focusedElement.scrollIntoView({ behavior: 'smooth', inline: 'center', block: 'nearest' })\n }\n }\n }\n\n const handleFocusOut = (event: FocusEvent) => {\n if (ref.current && !ref.current.contains(event.relatedTarget as Node)) {\n setIsFocusWithin(false)\n }\n }\n\n const node = ref.current\n if (node) {\n node.addEventListener('focusin', handleFocusIn)\n node.addEventListener('focusout', handleFocusOut)\n }\n\n return () => {\n if (node) {\n node.removeEventListener('focusin', handleFocusIn)\n node.removeEventListener('focusout', handleFocusOut)\n }\n }\n }, [ref, scrollRef])\n\n return isFocusWithin\n}\n","import { cx } from 'class-variance-authority'\nimport { ComponentPropsWithoutRef, ReactNode, useContext, useRef } from 'react'\n\nimport { Slot } from '../slot'\nimport { ScrollingListContext } from './ScrollingList'\nimport { useFocusWithinScroll } from './useFocusWithinScroll'\n\nexport interface ScrollingListItemProps extends ComponentPropsWithoutRef<'div'> {\n /**\n * Change the default rendered element for the one passed as a child, merging their props and behavior.\n */\n asChild?: boolean\n children?: ReactNode\n /**\n * DO NOT USE. This prop is automatically managed by the parent ScrollingList.ListItems\n */\n index?: number\n className?: string\n}\n\nexport const ScrollingListItem = ({\n asChild = false,\n children,\n index = 0,\n className = '',\n ...rest\n}: ScrollingListItemProps) => {\n const ctx = useContext(ScrollingListContext)\n const itemRef = useRef<HTMLDivElement>(null)\n\n const isSnapPoint = ctx.snapPointIndexes.has(index)\n\n useFocusWithinScroll(itemRef, ctx.scrollAreaRef)\n\n const Component = asChild ? Slot : 'div'\n\n return (\n <Component\n data-spark-component=\"scrolling-list-item\"\n role=\"listitem\"\n ref={itemRef}\n className={cx(\n 'default:w-auto default:shrink-0',\n {\n 'snap-start': isSnapPoint,\n 'snap-normal': isSnapPoint && ctx.snapStop === 'normal',\n 'snap-always': isSnapPoint && ctx.snapStop === 'always',\n },\n className\n )}\n {...rest}\n >\n {children}\n </Component>\n )\n}\n\nScrollingListItem.displayName = 'ScrollingList.Item'\n","import { cx } from 'class-variance-authority'\nimport {\n Children,\n cloneElement,\n ComponentPropsWithRef,\n CSSProperties,\n isValidElement,\n KeyboardEvent,\n ReactNode,\n Ref,\n RefObject,\n useContext,\n} from 'react'\n\nimport { ScrollingListContext } from './ScrollingList'\nimport { ScrollingListItemProps } from './ScrollingListItem'\n\ninterface Props extends ComponentPropsWithRef<'div'> {\n children?: ReactNode\n className?: string\n}\n\nexport function mergeRefs<T>(...refs: (Ref<T> | undefined | null)[]): Ref<T> {\n return (value: T | null) => {\n refs.forEach(ref => {\n if (typeof ref === 'function') {\n ref(value)\n } else if (ref && typeof ref === 'object' && 'current' in ref) {\n ;(ref as RefObject<T | null>).current = value\n }\n })\n }\n}\n\nexport const ScrollingListItems = ({ children, ref, className = '', ...rest }: Props) => {\n const ctx = useContext(ScrollingListContext)\n\n const snapConfig = {\n mandatory: 'x mandatory',\n proximity: 'x proximity',\n none: 'none',\n }\n\n const handleLeftArrow = (event: KeyboardEvent<HTMLDivElement>) => {\n if (!ctx.loop && !ctx.hasPrevPage) return\n\n event.preventDefault()\n ctx.goTo(ctx.hasPrevPage ? ctx.activePageIndex - 1 : ctx.pages.length - 1, {\n behavior: ctx.scrollBehavior,\n })\n }\n\n const handleRightArrow = (event: KeyboardEvent<HTMLDivElement>) => {\n if (!ctx.loop && !ctx.hasNextPage) return\n\n event.preventDefault()\n ctx.goTo(ctx.hasNextPage ? ctx.activePageIndex + 1 : 0, { behavior: ctx.scrollBehavior })\n }\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'ArrowLeft') {\n handleLeftArrow(event)\n }\n\n if (event.key === 'ArrowRight') {\n handleRightArrow(event)\n }\n }\n\n interface CustomCSSProperties extends CSSProperties {\n '--scrolling-list-gap'?: string\n '--scrolling-list-px'?: string\n }\n\n const inlineStyles: CustomCSSProperties = {\n scrollSnapType: snapConfig[ctx.snapType],\n scrollPaddingInline: 'var(--scrolling-list-px)',\n '--scrolling-list-px': `${ctx.scrollPadding}px`,\n '--scrolling-list-gap': `${ctx.gap}px`,\n ...(ctx.withFade && {\n maskImage:\n 'linear-gradient(to right, rgba(0, 0, 0, 0), rgba(0, 0, 0, 1) 44px, rgba(0, 0, 0, 1) calc(100% - 44px), rgba(0, 0, 0, 0))',\n maskSize: `calc(100% + ${ctx.overflow.left ? '0px' : '44px'} + ${ctx.overflow.right ? '0px' : '44px'}) 100%`,\n maskPosition: `${ctx.overflow.left ? '0px' : '-44px'} 0`,\n }),\n }\n\n return (\n <div\n data-spark-component=\"scrolling-list-items\"\n id=\"scrolling-list-items\"\n role=\"list\"\n className={cx(\n 'relative transition-all duration-300',\n 'u-no-scrollbar overflow-x-auto scroll-smooth',\n 'w-full gap-(--scrolling-list-gap) default:flex default:flex-row',\n 'focus-visible:u-outline',\n className\n )}\n ref={mergeRefs<HTMLDivElement>(ctx.scrollAreaRef, ctx.scrollRef, ref)}\n style={inlineStyles}\n onKeyDown={handleKeyDown}\n {...rest}\n >\n {Children.map(children, (child, index) =>\n isValidElement<ScrollingListItemProps>(child) ? cloneElement(child, { index }) : child\n )}\n </div>\n )\n}\n\nScrollingListItems.displayName = 'ScrollingList.Items'\n","import { ArrowVerticalRight } from '@spark-ui/icons/ArrowVerticalRight'\nimport { cx } from 'class-variance-authority'\nimport { useContext } from 'react'\n\nimport { Icon } from '../icon'\nimport { IconButton, IconButtonProps } from '../icon-button'\nimport { ScrollingListContext } from './ScrollingList'\n\nexport const ScrollingListNextButton = ({ 'aria-label': ariaLabel, ...rest }: IconButtonProps) => {\n const ctx = useContext(ScrollingListContext)\n\n const handleNextPage = () => {\n if (ctx.hasNextPage) {\n ctx.next({ behavior: ctx.scrollBehavior })\n } else {\n ctx.goTo(0, { behavior: ctx.scrollBehavior })\n }\n }\n\n const listHasOverflow = ctx.overflow.left || ctx.overflow.right\n const isDisabled = !listHasOverflow || (!ctx.loop && !ctx.overflow.right)\n\n return (\n <IconButton\n data-spark-component=\"scrolling-list-next-button\"\n size=\"sm\"\n intent=\"surface\"\n design=\"filled\"\n className={cx(\n 'pointer-events-auto opacity-(--scrolling-list-controls-opacity) shadow-sm disabled:invisible',\n 'group-hover/scrolling-list:opacity-none focus-visible:opacity-none'\n )}\n onClick={handleNextPage}\n disabled={isDisabled}\n aria-label={ariaLabel}\n aria-controls=\"scrolling-list-items\"\n {...rest}\n >\n <Icon>\n <ArrowVerticalRight />\n </Icon>\n </IconButton>\n )\n}\n\nScrollingListNextButton.displayName = 'ScrollingList.NextButton'\n","import { ArrowVerticalLeft } from '@spark-ui/icons/ArrowVerticalLeft'\nimport { cx } from 'class-variance-authority'\nimport { useContext } from 'react'\n\nimport { Icon } from '../icon'\nimport { IconButton, IconButtonProps } from '../icon-button'\nimport { ScrollingListContext } from './ScrollingList'\n\nexport const ScrollingListPrevButton = ({\n 'aria-label': ariaLabel,\n\n ...rest\n}: IconButtonProps) => {\n const ctx = useContext(ScrollingListContext)\n\n const handlePrevPage = () => {\n const shouldSnapFirstPage =\n ctx.activePageIndex === 0 && (ctx.scrollAreaRef.current?.scrollLeft || 0) > 0\n\n if (shouldSnapFirstPage) {\n ctx.goTo(0, { behavior: ctx.scrollBehavior })\n } else if (ctx.hasPrevPage) {\n ctx.prev({ behavior: ctx.scrollBehavior })\n } else {\n ctx.goTo(ctx.pages.length - 1, { behavior: ctx.scrollBehavior })\n }\n }\n\n const listHasOverflow = ctx.overflow.left || ctx.overflow.right\n const isDisabled = !listHasOverflow || (!ctx.loop && !ctx.overflow.left)\n\n return (\n <IconButton\n data-spark-component=\"scrolling-list-prev-button\"\n size=\"sm\"\n intent=\"surface\"\n design=\"filled\"\n className={cx(\n 'pointer-events-auto opacity-(--scrolling-list-controls-opacity) shadow-sm disabled:invisible',\n 'group-hover/scrolling-list:opacity-none focus-visible:opacity-none'\n )}\n onClick={handlePrevPage}\n disabled={isDisabled}\n aria-label={ariaLabel}\n aria-controls=\"scrolling-list-items\"\n {...rest}\n >\n <Icon>\n <ArrowVerticalLeft />\n </Icon>\n </IconButton>\n )\n}\n\nScrollingListPrevButton.displayName = 'ScrollingList.PrevButton'\n","import { cx } from 'class-variance-authority'\nimport { ComponentPropsWithoutRef, useContext } from 'react'\n\nimport { Button } from '../button'\nimport { ScrollingListContext } from './ScrollingList'\n\ninterface Props extends ComponentPropsWithoutRef<'button'> {\n children: string\n}\n\nexport const ScrollingListSkipButton = ({ children, ...rest }: Props) => {\n const ctx = useContext(ScrollingListContext)\n\n return (\n <Button\n type=\"button\"\n design=\"tinted\"\n intent=\"surface\"\n tabIndex={0}\n className={cx(\n 'z-raised absolute top-1/2 left-0 -translate-y-1/2',\n 'not-focus-visible:pointer-events-none not-focus-visible:size-0 not-focus-visible:opacity-0'\n )}\n onClick={ctx.skipKeyboardNavigation}\n {...rest}\n >\n {children}\n </Button>\n )\n}\n\nScrollingListSkipButton.displayName = 'ScrollingList.SkipButton'\n","import { ScrollingList as Root } from './ScrollingList'\nimport { ScrollingListControls as Controls } from './ScrollingListControls'\nimport { ScrollingListItem as Item } from './ScrollingListItem'\nimport { ScrollingListItems as Items } from './ScrollingListItems'\nimport { ScrollingListNextButton as NextButton } from './ScrollingListNextButton'\nimport { ScrollingListPrevButton as PrevButton } from './ScrollingListPrevButton'\nimport { ScrollingListSkipButton as SkipButton } from './ScrollingListSkipButton'\n\nexport const ScrollingList: typeof Root & {\n Controls: typeof Controls\n NextButton: typeof NextButton\n PrevButton: typeof PrevButton\n Item: typeof Item\n Items: typeof Items\n SkipButton: typeof SkipButton\n} = Object.assign(Root, {\n Controls,\n NextButton,\n PrevButton,\n Item,\n Items,\n SkipButton,\n})\n\nScrollingList.displayName = 'ScrollingList'\n"],"names":["useIsomorphicLayoutEffect","useLayoutEffect","useEffect","useSnapCarousel","axis","initialPages","dimension","scrollDimension","clientDimension","nearSidePos","farSidePos","scrollPos","scrollEl","setScrollEl","useState","pages","activePageIndex","setCarouselState","refreshActivePage","useCallback","pages2","items","scrollPort","offsets","page","leadIndex","leadEl","assert","scrollSpacing","getEffectiveScrollSpacing","offset","minOffset","nextActivePageIndex","refresh","currPageStartPos","acc","item","i","currPage","rect","getOffsetRect","useEffect2","handle","handleGoTo","index","opts","behavior","handlePrev","handleNext","snapPointIndexes","useMemo","hasPrevPage","hasNextPage","el","relativeTo","_getOffsetRect","relativeRect","scrollLeft","scrollTop","parentEl","left","top","getScrollPaddingUsedValue","pos","scrollPadding","invalidMsg","value","RSCError","getScrollMarginUsedValue","scrollMargin","itemEl","message","ScrollingListContext","createContext","ScrollingList","snapType","snapStop","scrollBehavior","loop","gap","withFade","children","className","rest","scrollAreaRef","useRef","skipAnchorRef","snapCarouselAPI","overflow","refreshOverflow","useScrollOverflow","visibleItems","visibleItemsRange","forceRefresh","ctxValue","jsxs","jsx","cx","ScrollingListControls","visibility","useFocusWithinScroll","ref","scrollRef","isFocusWithin","setIsFocusWithin","handleFocusIn","event","focusedElement","scrollContainer","focusRect","scrollRect","handleFocusOut","node","ScrollingListItem","asChild","ctx","useContext","itemRef","isSnapPoint","Component","Slot","mergeRefs","refs","ScrollingListItems","snapConfig","handleLeftArrow","handleRightArrow","handleKeyDown","inlineStyles","Children","child","isValidElement","cloneElement","ScrollingListNextButton","ariaLabel","handleNextPage","isDisabled","IconButton","Icon","ArrowVerticalRight","ScrollingListPrevButton","handlePrevPage","ArrowVerticalLeft","ScrollingListSkipButton","Button","Root","Controls","NextButton","PrevButton","Item","Items","SkipButton"],"mappings":"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","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"index.js","sources":["../../src/scrolling-list/ScrollingList.tsx","../../src/scrolling-list/ScrollingListControls.tsx","../../src/scrolling-list/useFocusWithinScroll.tsx","../../src/scrolling-list/ScrollingListItem.tsx","../../src/scrolling-list/ScrollingListItems.tsx","../../src/scrolling-list/ScrollingListNextButton.tsx","../../src/scrolling-list/ScrollingListPrevButton.tsx","../../src/scrolling-list/ScrollingListSkipButton.tsx","../../src/scrolling-list/index.ts"],"sourcesContent":["import { ScrollOverflow, useScrollOverflow } from '@spark-ui/hooks/use-scroll-overflow'\nimport { cx } from 'class-variance-authority'\nimport {\n ComponentPropsWithRef,\n createContext,\n ReactNode,\n RefObject,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n} from 'react'\nimport { SnapCarouselResult, useSnapCarousel } from 'react-snap-carousel'\n\ntype SnapType = 'mandatory' | 'proximity' | 'none'\ntype ScrollBehavior = 'smooth' | 'instant'\ntype SnapStop = 'normal' | 'always'\n\ninterface Props extends ComponentPropsWithRef<'div'> {\n /**\n * CSS scroll snap behavior.\n * - `mandatory` to force snapping on each \"page\".\n * - `proximity` to force snapping only when scroll position is near the edge of a \"page\". Behavior can change depending on each browser.\n * - `none` to disabled scroll snapping.\n */\n snapType?: SnapType\n /**\n * Defines whether or not the scroll container is allowed to \"pass over\" possible snap positions.\n */\n snapStop?: SnapStop\n scrollBehavior?: ScrollBehavior\n /**\n * Add a fade effect to indicate content overflow.\n */\n withFade?: boolean\n children?: ReactNode\n /**\n * When `true`, allow previous and next buttons to be used when reaching the edges of the list.\n */\n loop?: boolean\n /**\n * Space (in pixels) between items.\n */\n gap?: number\n /**\n * Offset (in pixels) of the left of the optimal viewing region of the list.\n */\n scrollPadding?: number\n className?: string\n}\n\ninterface ScrollingListContextState extends SnapCarouselResult {\n snapType: SnapType\n snapStop: SnapStop\n scrollBehavior: ScrollBehavior\n visibleItemsRange: readonly [number, number]\n loop: boolean\n gap: number\n withFade: boolean\n scrollPadding: number\n scrollAreaRef: RefObject<HTMLDivElement | null>\n overflow: ScrollOverflow\n skipKeyboardNavigation: () => void\n}\n\nexport const ScrollingListContext = createContext<ScrollingListContextState>(\n null as unknown as ScrollingListContextState\n)\n\nexport const ScrollingList = ({\n snapType = 'none',\n snapStop = 'normal',\n scrollBehavior = 'smooth',\n loop = false,\n gap = 16,\n withFade = false,\n scrollPadding = 0,\n children,\n className,\n ...rest\n}: Props) => {\n const scrollAreaRef = useRef<HTMLDivElement>(null)\n const skipAnchorRef = useRef<HTMLButtonElement>(null)\n\n const snapCarouselAPI = useSnapCarousel()\n\n const { overflow, refresh: refreshOverflow } = useScrollOverflow(scrollAreaRef, {\n precisionTreshold: 1,\n })\n\n const { activePageIndex, pages, refresh } = snapCarouselAPI\n\n const visibleItems = pages[activePageIndex] as number[]\n\n const visibleItemsRange = visibleItems\n ? ([visibleItems[0]! + 1, visibleItems[visibleItems.length - 1]! + 1] as const)\n : ([0, 0] as const)\n\n // Force refresh of the carousel API when children change\n const forceRefresh = useCallback(() => {\n if (refresh && scrollAreaRef.current) {\n // Small delay to ensure DOM is updated\n setTimeout(() => {\n refresh()\n }, 0)\n }\n }, [refresh])\n\n useEffect(() => {\n forceRefresh()\n }, [children, forceRefresh])\n\n useLayoutEffect(() => {\n if (scrollAreaRef.current) {\n // Use requestAnimationFrame to ensure proper timing with the render cycle\n // This prevents race conditions that occur when the console is closed\n requestAnimationFrame(() => {\n refreshOverflow()\n })\n }\n }, [children, refreshOverflow])\n\n const skipKeyboardNavigation = () => {\n skipAnchorRef.current?.focus()\n }\n\n const ctxValue: ScrollingListContextState = {\n ...snapCarouselAPI,\n snapType,\n snapStop,\n skipKeyboardNavigation,\n scrollBehavior,\n visibleItemsRange,\n loop,\n gap,\n withFade,\n scrollPadding,\n scrollAreaRef,\n overflow,\n }\n\n return (\n <ScrollingListContext.Provider value={ctxValue}>\n <div\n data-spark-component=\"scrolling-list\"\n className={cx(\n 'gap-lg group/scrolling-list relative flex flex-col default:w-full',\n className\n )}\n {...rest}\n >\n {children}\n </div>\n <span ref={skipAnchorRef} className=\"size-0 overflow-hidden\" tabIndex={-1} />\n </ScrollingListContext.Provider>\n )\n}\n\nScrollingList.displayName = 'ScrollingList'\n","import { cx } from 'class-variance-authority'\nimport { ComponentPropsWithoutRef, CSSProperties, ReactNode } from 'react'\n\ninterface ScrollingListControls extends ComponentPropsWithoutRef<'div'> {\n /**\n * Visibility behavior of the control buttons:\n * - `always`: buttons are always visible.\n * - `hover`: buttons only appear on hover.\n *\n * a11y: `hover` is dangerous for accessibility as it disabled controls for touch screen users.\n * When using it, you must provide an alternative control outside of the list to replace them.\n */\n visibility?: 'hover' | 'always'\n children: ReactNode\n}\n\nexport const ScrollingListControls = ({\n children,\n visibility = 'always',\n className,\n ...rest\n}: ScrollingListControls) => {\n return (\n <div\n data-spark-component=\"scrolling-list-controls\"\n className={cx(\n 'default:px-md pointer-events-none absolute inset-0 flex flex-row items-center justify-between overflow-hidden',\n className\n )}\n style={\n {\n '--scrolling-list-controls-opacity': visibility === 'hover' ? '0' : '1',\n } as CSSProperties\n }\n data-orientation=\"horizontal\"\n {...rest}\n >\n {children}\n </div>\n )\n}\n\nScrollingListControls.displayName = 'ScrollingList.Controls'\n","import { RefObject, useEffect, useState } from 'react'\n\nexport function useFocusWithinScroll<T extends HTMLElement | null>(\n ref: RefObject<T>, // The container to detect focus within\n scrollRef: RefObject<HTMLDivElement | null> // The scrollable container\n) {\n const [isFocusWithin, setIsFocusWithin] = useState(false)\n\n useEffect(() => {\n const handleFocusIn = (event: FocusEvent) => {\n setIsFocusWithin(true)\n\n const focusedElement = event.target as HTMLElement\n const scrollContainer = scrollRef.current\n\n if (focusedElement && scrollContainer) {\n const focusRect = focusedElement.getBoundingClientRect()\n const scrollRect = scrollContainer.getBoundingClientRect()\n\n // Check if the focused element is fully visible inside the scroll container\n const isFullyVisible =\n focusRect.left >= scrollRect.left &&\n focusRect.right <= scrollRect.right &&\n focusRect.top >= scrollRect.top &&\n focusRect.bottom <= scrollRect.bottom\n\n if (!isFullyVisible) {\n focusedElement.scrollIntoView({ behavior: 'smooth', inline: 'center', block: 'nearest' })\n }\n }\n }\n\n const handleFocusOut = (event: FocusEvent) => {\n if (ref.current && !ref.current.contains(event.relatedTarget as Node)) {\n setIsFocusWithin(false)\n }\n }\n\n const node = ref.current\n if (node) {\n node.addEventListener('focusin', handleFocusIn)\n node.addEventListener('focusout', handleFocusOut)\n }\n\n return () => {\n if (node) {\n node.removeEventListener('focusin', handleFocusIn)\n node.removeEventListener('focusout', handleFocusOut)\n }\n }\n }, [ref, scrollRef])\n\n return isFocusWithin\n}\n","import { cx } from 'class-variance-authority'\nimport { ComponentPropsWithoutRef, ReactNode, useContext, useRef } from 'react'\n\nimport { Slot } from '../slot'\nimport { ScrollingListContext } from './ScrollingList'\nimport { useFocusWithinScroll } from './useFocusWithinScroll'\n\nexport interface ScrollingListItemProps extends ComponentPropsWithoutRef<'div'> {\n /**\n * Change the default rendered element for the one passed as a child, merging their props and behavior.\n */\n asChild?: boolean\n children?: ReactNode\n /**\n * DO NOT USE. This prop is automatically managed by the parent ScrollingList.ListItems\n */\n index?: number\n className?: string\n}\n\nexport const ScrollingListItem = ({\n asChild = false,\n children,\n index = 0,\n className = '',\n ...rest\n}: ScrollingListItemProps) => {\n const ctx = useContext(ScrollingListContext)\n const itemRef = useRef<HTMLDivElement>(null)\n\n const isSnapPoint = ctx.snapPointIndexes.has(index)\n\n useFocusWithinScroll(itemRef, ctx.scrollAreaRef)\n\n const Component = asChild ? Slot : 'div'\n\n return (\n <Component\n data-spark-component=\"scrolling-list-item\"\n role=\"listitem\"\n ref={itemRef}\n className={cx(\n 'default:w-auto default:shrink-0',\n {\n 'snap-start': isSnapPoint,\n 'snap-normal': isSnapPoint && ctx.snapStop === 'normal',\n 'snap-always': isSnapPoint && ctx.snapStop === 'always',\n },\n className\n )}\n {...rest}\n >\n {children}\n </Component>\n )\n}\n\nScrollingListItem.displayName = 'ScrollingList.Item'\n","import { cx } from 'class-variance-authority'\nimport {\n Children,\n cloneElement,\n ComponentPropsWithRef,\n CSSProperties,\n isValidElement,\n KeyboardEvent,\n ReactNode,\n Ref,\n RefObject,\n useContext,\n} from 'react'\n\nimport { ScrollingListContext } from './ScrollingList'\nimport { ScrollingListItemProps } from './ScrollingListItem'\n\ninterface Props extends ComponentPropsWithRef<'div'> {\n children?: ReactNode\n className?: string\n}\n\nexport function mergeRefs<T>(...refs: (Ref<T> | undefined | null)[]): Ref<T> {\n return (value: T | null) => {\n refs.forEach(ref => {\n if (typeof ref === 'function') {\n ref(value)\n } else if (ref && typeof ref === 'object' && 'current' in ref) {\n ;(ref as RefObject<T | null>).current = value\n }\n })\n }\n}\n\nexport const ScrollingListItems = ({ children, ref, className = '', ...rest }: Props) => {\n const ctx = useContext(ScrollingListContext)\n\n const snapConfig = {\n mandatory: 'x mandatory',\n proximity: 'x proximity',\n none: 'none',\n }\n\n const handleLeftArrow = (event: KeyboardEvent<HTMLDivElement>) => {\n if (!ctx.loop && !ctx.hasPrevPage) return\n\n event.preventDefault()\n ctx.goTo(ctx.hasPrevPage ? ctx.activePageIndex - 1 : ctx.pages.length - 1, {\n behavior: ctx.scrollBehavior,\n })\n }\n\n const handleRightArrow = (event: KeyboardEvent<HTMLDivElement>) => {\n if (!ctx.loop && !ctx.hasNextPage) return\n\n event.preventDefault()\n ctx.goTo(ctx.hasNextPage ? ctx.activePageIndex + 1 : 0, { behavior: ctx.scrollBehavior })\n }\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'ArrowLeft') {\n handleLeftArrow(event)\n }\n\n if (event.key === 'ArrowRight') {\n handleRightArrow(event)\n }\n }\n\n interface CustomCSSProperties extends CSSProperties {\n '--scrolling-list-gap'?: string\n '--scrolling-list-px'?: string\n }\n\n const inlineStyles: CustomCSSProperties = {\n scrollSnapType: snapConfig[ctx.snapType],\n scrollPaddingInline: 'var(--scrolling-list-px)',\n '--scrolling-list-px': `${ctx.scrollPadding}px`,\n '--scrolling-list-gap': `${ctx.gap}px`,\n ...(ctx.withFade && {\n maskImage:\n 'linear-gradient(to right, rgba(0, 0, 0, 0), rgba(0, 0, 0, 1) 44px, rgba(0, 0, 0, 1) calc(100% - 44px), rgba(0, 0, 0, 0))',\n maskSize: `calc(100% + ${ctx.overflow.left ? '0px' : '44px'} + ${ctx.overflow.right ? '0px' : '44px'}) 100%`,\n maskPosition: `${ctx.overflow.left ? '0px' : '-44px'} 0`,\n }),\n }\n\n return (\n <div\n data-spark-component=\"scrolling-list-items\"\n id=\"scrolling-list-items\"\n role=\"list\"\n className={cx(\n 'relative transition-all duration-300',\n 'u-no-scrollbar overflow-x-auto scroll-smooth',\n 'w-full gap-(--scrolling-list-gap) default:flex default:flex-row',\n 'focus-visible:u-outline',\n className\n )}\n ref={mergeRefs<HTMLDivElement>(ctx.scrollAreaRef, ctx.scrollRef, ref)}\n style={inlineStyles}\n onKeyDown={handleKeyDown}\n {...rest}\n >\n {Children.map(children, (child, index) =>\n isValidElement<ScrollingListItemProps>(child) ? cloneElement(child, { index }) : child\n )}\n </div>\n )\n}\n\nScrollingListItems.displayName = 'ScrollingList.Items'\n","import { ArrowVerticalRight } from '@spark-ui/icons/ArrowVerticalRight'\nimport { cx } from 'class-variance-authority'\nimport { useContext } from 'react'\n\nimport { Icon } from '../icon'\nimport { IconButton, IconButtonProps } from '../icon-button'\nimport { ScrollingListContext } from './ScrollingList'\n\nexport const ScrollingListNextButton = ({ 'aria-label': ariaLabel, ...rest }: IconButtonProps) => {\n const ctx = useContext(ScrollingListContext)\n\n const handleNextPage = () => {\n if (ctx.hasNextPage) {\n ctx.next({ behavior: ctx.scrollBehavior })\n } else {\n ctx.goTo(0, { behavior: ctx.scrollBehavior })\n }\n }\n\n const listHasOverflow = ctx.overflow.left || ctx.overflow.right\n const isDisabled = !listHasOverflow || (!ctx.loop && !ctx.overflow.right)\n\n return (\n <IconButton\n data-spark-component=\"scrolling-list-next-button\"\n size=\"sm\"\n intent=\"surface\"\n design=\"filled\"\n className={cx(\n 'pointer-events-auto opacity-(--scrolling-list-controls-opacity) shadow-sm disabled:invisible',\n 'group-hover/scrolling-list:opacity-none focus-visible:opacity-none'\n )}\n onClick={handleNextPage}\n disabled={isDisabled}\n aria-label={ariaLabel}\n aria-controls=\"scrolling-list-items\"\n {...rest}\n >\n <Icon>\n <ArrowVerticalRight />\n </Icon>\n </IconButton>\n )\n}\n\nScrollingListNextButton.displayName = 'ScrollingList.NextButton'\n","import { ArrowVerticalLeft } from '@spark-ui/icons/ArrowVerticalLeft'\nimport { cx } from 'class-variance-authority'\nimport { useContext } from 'react'\n\nimport { Icon } from '../icon'\nimport { IconButton, IconButtonProps } from '../icon-button'\nimport { ScrollingListContext } from './ScrollingList'\n\nexport const ScrollingListPrevButton = ({\n 'aria-label': ariaLabel,\n\n ...rest\n}: IconButtonProps) => {\n const ctx = useContext(ScrollingListContext)\n\n const handlePrevPage = () => {\n const shouldSnapFirstPage =\n ctx.activePageIndex === 0 && (ctx.scrollAreaRef.current?.scrollLeft || 0) > 0\n\n if (shouldSnapFirstPage) {\n ctx.goTo(0, { behavior: ctx.scrollBehavior })\n } else if (ctx.hasPrevPage) {\n ctx.prev({ behavior: ctx.scrollBehavior })\n } else {\n ctx.goTo(ctx.pages.length - 1, { behavior: ctx.scrollBehavior })\n }\n }\n\n const listHasOverflow = ctx.overflow.left || ctx.overflow.right\n const isDisabled = !listHasOverflow || (!ctx.loop && !ctx.overflow.left)\n\n return (\n <IconButton\n data-spark-component=\"scrolling-list-prev-button\"\n size=\"sm\"\n intent=\"surface\"\n design=\"filled\"\n className={cx(\n 'pointer-events-auto opacity-(--scrolling-list-controls-opacity) shadow-sm disabled:invisible',\n 'group-hover/scrolling-list:opacity-none focus-visible:opacity-none'\n )}\n onClick={handlePrevPage}\n disabled={isDisabled}\n aria-label={ariaLabel}\n aria-controls=\"scrolling-list-items\"\n {...rest}\n >\n <Icon>\n <ArrowVerticalLeft />\n </Icon>\n </IconButton>\n )\n}\n\nScrollingListPrevButton.displayName = 'ScrollingList.PrevButton'\n","import { cx } from 'class-variance-authority'\nimport { ComponentPropsWithoutRef, useContext } from 'react'\n\nimport { Button } from '../button'\nimport { ScrollingListContext } from './ScrollingList'\n\ninterface Props extends ComponentPropsWithoutRef<'button'> {\n children: string\n}\n\nexport const ScrollingListSkipButton = ({ children, ...rest }: Props) => {\n const ctx = useContext(ScrollingListContext)\n\n return (\n <Button\n type=\"button\"\n design=\"tinted\"\n intent=\"surface\"\n tabIndex={0}\n className={cx(\n 'z-raised absolute top-1/2 left-0 -translate-y-1/2',\n 'not-focus-visible:pointer-events-none not-focus-visible:size-0 not-focus-visible:opacity-0'\n )}\n onClick={ctx.skipKeyboardNavigation}\n {...rest}\n >\n {children}\n </Button>\n )\n}\n\nScrollingListSkipButton.displayName = 'ScrollingList.SkipButton'\n","import { ScrollingList as Root } from './ScrollingList'\nimport { ScrollingListControls as Controls } from './ScrollingListControls'\nimport { ScrollingListItem as Item } from './ScrollingListItem'\nimport { ScrollingListItems as Items } from './ScrollingListItems'\nimport { ScrollingListNextButton as NextButton } from './ScrollingListNextButton'\nimport { ScrollingListPrevButton as PrevButton } from './ScrollingListPrevButton'\nimport { ScrollingListSkipButton as SkipButton } from './ScrollingListSkipButton'\n\nexport const ScrollingList: typeof Root & {\n Controls: typeof Controls\n NextButton: typeof NextButton\n PrevButton: typeof PrevButton\n Item: typeof Item\n Items: typeof Items\n SkipButton: typeof SkipButton\n} = Object.assign(Root, {\n Controls,\n NextButton,\n PrevButton,\n Item,\n Items,\n SkipButton,\n})\n\nScrollingList.displayName = 'ScrollingList'\n"],"names":["ScrollingListContext","createContext","ScrollingList","snapType","snapStop","scrollBehavior","loop","gap","withFade","scrollPadding","children","className","rest","scrollAreaRef","useRef","skipAnchorRef","snapCarouselAPI","useSnapCarousel","overflow","refreshOverflow","useScrollOverflow","activePageIndex","pages","refresh","visibleItems","visibleItemsRange","forceRefresh","useCallback","useEffect","useLayoutEffect","ctxValue","jsxs","jsx","cx","ScrollingListControls","visibility","useFocusWithinScroll","ref","scrollRef","isFocusWithin","setIsFocusWithin","useState","handleFocusIn","event","focusedElement","scrollContainer","focusRect","scrollRect","handleFocusOut","node","ScrollingListItem","asChild","index","ctx","useContext","itemRef","isSnapPoint","Component","Slot","mergeRefs","refs","value","ScrollingListItems","snapConfig","handleLeftArrow","handleRightArrow","handleKeyDown","inlineStyles","Children","child","isValidElement","cloneElement","ScrollingListNextButton","ariaLabel","handleNextPage","isDisabled","IconButton","Icon","ArrowVerticalRight","ScrollingListPrevButton","handlePrevPage","ArrowVerticalLeft","ScrollingListSkipButton","Button","Root","Controls","NextButton","PrevButton","Item","Items","SkipButton"],"mappings":"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"}