@spark-ui/components 10.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 (296) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/LICENSE.md +21 -0
  3. package/README.md +19 -0
  4. package/dist/DialogTrigger-5SI4dvpK.d.mts +142 -0
  5. package/dist/DialogTrigger-5SI4dvpK.d.ts +142 -0
  6. package/dist/Input-g0LpWuv0.d.mts +17 -0
  7. package/dist/Input-g0LpWuv0.d.ts +17 -0
  8. package/dist/InputGroup-aoaZxCLk.d.mts +28 -0
  9. package/dist/InputGroup-aoaZxCLk.d.ts +28 -0
  10. package/dist/InputTrailingIcon-BBp7sE6D.d.mts +20 -0
  11. package/dist/InputTrailingIcon-ZZx8PoJy.d.ts +20 -0
  12. package/dist/LabelRequiredIndicator-DRnCzHMU.d.mts +19 -0
  13. package/dist/LabelRequiredIndicator-DRnCzHMU.d.ts +19 -0
  14. package/dist/accordion/index.d.mts +85 -0
  15. package/dist/accordion/index.d.ts +85 -0
  16. package/dist/accordion/index.js +461 -0
  17. package/dist/accordion/index.js.map +1 -0
  18. package/dist/accordion/index.mjs +249 -0
  19. package/dist/accordion/index.mjs.map +1 -0
  20. package/dist/alert-dialog/index.d.mts +119 -0
  21. package/dist/alert-dialog/index.d.ts +119 -0
  22. package/dist/alert-dialog/index.js +1451 -0
  23. package/dist/alert-dialog/index.js.map +1 -0
  24. package/dist/alert-dialog/index.mjs +177 -0
  25. package/dist/alert-dialog/index.mjs.map +1 -0
  26. package/dist/badge/index.d.mts +47 -0
  27. package/dist/badge/index.d.ts +47 -0
  28. package/dist/badge/index.js +122 -0
  29. package/dist/badge/index.js.map +1 -0
  30. package/dist/badge/index.mjs +95 -0
  31. package/dist/badge/index.mjs.map +1 -0
  32. package/dist/breadcrumb/index.d.mts +64 -0
  33. package/dist/breadcrumb/index.d.ts +64 -0
  34. package/dist/breadcrumb/index.js +326 -0
  35. package/dist/breadcrumb/index.js.map +1 -0
  36. package/dist/breadcrumb/index.mjs +149 -0
  37. package/dist/breadcrumb/index.mjs.map +1 -0
  38. package/dist/button/index.d.mts +40 -0
  39. package/dist/button/index.d.ts +40 -0
  40. package/dist/button/index.js +877 -0
  41. package/dist/button/index.js.map +1 -0
  42. package/dist/button/index.mjs +10 -0
  43. package/dist/button/index.mjs.map +1 -0
  44. package/dist/carousel/index.d.mts +253 -0
  45. package/dist/carousel/index.d.ts +253 -0
  46. package/dist/carousel/index.js +1678 -0
  47. package/dist/carousel/index.js.map +1 -0
  48. package/dist/carousel/index.mjs +716 -0
  49. package/dist/carousel/index.mjs.map +1 -0
  50. package/dist/checkbox/index.d.mts +120 -0
  51. package/dist/checkbox/index.d.ts +120 -0
  52. package/dist/checkbox/index.js +873 -0
  53. package/dist/checkbox/index.js.map +1 -0
  54. package/dist/checkbox/index.mjs +349 -0
  55. package/dist/checkbox/index.mjs.map +1 -0
  56. package/dist/chip/index.d.mts +97 -0
  57. package/dist/chip/index.d.ts +97 -0
  58. package/dist/chip/index.js +905 -0
  59. package/dist/chip/index.js.map +1 -0
  60. package/dist/chip/index.mjs +793 -0
  61. package/dist/chip/index.mjs.map +1 -0
  62. package/dist/chunk-2KPFQEAA.mjs +52 -0
  63. package/dist/chunk-2KPFQEAA.mjs.map +1 -0
  64. package/dist/chunk-4F5DOL57.mjs +26 -0
  65. package/dist/chunk-4F5DOL57.mjs.map +1 -0
  66. package/dist/chunk-6JOA37TZ.mjs +742 -0
  67. package/dist/chunk-6JOA37TZ.mjs.map +1 -0
  68. package/dist/chunk-7PMPYEHJ.mjs +379 -0
  69. package/dist/chunk-7PMPYEHJ.mjs.map +1 -0
  70. package/dist/chunk-AESXFMCC.mjs +68 -0
  71. package/dist/chunk-AESXFMCC.mjs.map +1 -0
  72. package/dist/chunk-B42LOFIZ.mjs +308 -0
  73. package/dist/chunk-B42LOFIZ.mjs.map +1 -0
  74. package/dist/chunk-FGOZHKBT.mjs +97 -0
  75. package/dist/chunk-FGOZHKBT.mjs.map +1 -0
  76. package/dist/chunk-HLXYG643.mjs +52 -0
  77. package/dist/chunk-HLXYG643.mjs.map +1 -0
  78. package/dist/chunk-JKNBJHD5.mjs +601 -0
  79. package/dist/chunk-JKNBJHD5.mjs.map +1 -0
  80. package/dist/chunk-K7VP7DH3.mjs +66 -0
  81. package/dist/chunk-K7VP7DH3.mjs.map +1 -0
  82. package/dist/chunk-MUNDKRAE.mjs +80 -0
  83. package/dist/chunk-MUNDKRAE.mjs.map +1 -0
  84. package/dist/chunk-NBZKMCHF.mjs +36 -0
  85. package/dist/chunk-NBZKMCHF.mjs.map +1 -0
  86. package/dist/chunk-PZWESKAR.mjs +314 -0
  87. package/dist/chunk-PZWESKAR.mjs.map +1 -0
  88. package/dist/collapsible/index.d.mts +60 -0
  89. package/dist/collapsible/index.d.ts +60 -0
  90. package/dist/collapsible/index.js +140 -0
  91. package/dist/collapsible/index.js.map +1 -0
  92. package/dist/collapsible/index.mjs +8 -0
  93. package/dist/collapsible/index.mjs.map +1 -0
  94. package/dist/combobox/index.d.mts +285 -0
  95. package/dist/combobox/index.d.ts +285 -0
  96. package/dist/combobox/index.js +2920 -0
  97. package/dist/combobox/index.js.map +1 -0
  98. package/dist/combobox/index.mjs +1267 -0
  99. package/dist/combobox/index.mjs.map +1 -0
  100. package/dist/dialog/index.d.mts +33 -0
  101. package/dist/dialog/index.d.ts +33 -0
  102. package/dist/dialog/index.js +1286 -0
  103. package/dist/dialog/index.js.map +1 -0
  104. package/dist/dialog/index.mjs +13 -0
  105. package/dist/dialog/index.mjs.map +1 -0
  106. package/dist/divider/index.d.mts +61 -0
  107. package/dist/divider/index.d.ts +61 -0
  108. package/dist/divider/index.js +223 -0
  109. package/dist/divider/index.js.map +1 -0
  110. package/dist/divider/index.mjs +196 -0
  111. package/dist/divider/index.mjs.map +1 -0
  112. package/dist/drawer/index.d.mts +148 -0
  113. package/dist/drawer/index.d.ts +148 -0
  114. package/dist/drawer/index.js +1266 -0
  115. package/dist/drawer/index.js.map +1 -0
  116. package/dist/drawer/index.mjs +299 -0
  117. package/dist/drawer/index.mjs.map +1 -0
  118. package/dist/dropdown/index.d.mts +233 -0
  119. package/dist/dropdown/index.d.ts +233 -0
  120. package/dist/dropdown/index.js +2402 -0
  121. package/dist/dropdown/index.js.map +1 -0
  122. package/dist/dropdown/index.mjs +741 -0
  123. package/dist/dropdown/index.mjs.map +1 -0
  124. package/dist/form-field/index.d.mts +176 -0
  125. package/dist/form-field/index.d.ts +176 -0
  126. package/dist/form-field/index.js +540 -0
  127. package/dist/form-field/index.js.map +1 -0
  128. package/dist/form-field/index.mjs +13 -0
  129. package/dist/form-field/index.mjs.map +1 -0
  130. package/dist/icon/index.d.mts +28 -0
  131. package/dist/icon/index.d.ts +28 -0
  132. package/dist/icon/index.js +127 -0
  133. package/dist/icon/index.js.map +1 -0
  134. package/dist/icon/index.mjs +9 -0
  135. package/dist/icon/index.mjs.map +1 -0
  136. package/dist/icon-button/index.d.mts +16 -0
  137. package/dist/icon-button/index.d.ts +16 -0
  138. package/dist/icon-button/index.js +921 -0
  139. package/dist/icon-button/index.js.map +1 -0
  140. package/dist/icon-button/index.mjs +11 -0
  141. package/dist/icon-button/index.mjs.map +1 -0
  142. package/dist/input/index.d.mts +78 -0
  143. package/dist/input/index.d.ts +78 -0
  144. package/dist/input/index.js +1119 -0
  145. package/dist/input/index.js.map +1 -0
  146. package/dist/input/index.mjs +16 -0
  147. package/dist/input/index.mjs.map +1 -0
  148. package/dist/kbd/index.d.mts +9 -0
  149. package/dist/kbd/index.d.ts +9 -0
  150. package/dist/kbd/index.js +46 -0
  151. package/dist/kbd/index.js.map +1 -0
  152. package/dist/kbd/index.mjs +19 -0
  153. package/dist/kbd/index.mjs.map +1 -0
  154. package/dist/label/index.d.mts +11 -0
  155. package/dist/label/index.d.ts +11 -0
  156. package/dist/label/index.js +78 -0
  157. package/dist/label/index.js.map +1 -0
  158. package/dist/label/index.mjs +7 -0
  159. package/dist/label/index.mjs.map +1 -0
  160. package/dist/link-box/index.d.mts +34 -0
  161. package/dist/link-box/index.d.ts +34 -0
  162. package/dist/link-box/index.js +92 -0
  163. package/dist/link-box/index.js.map +1 -0
  164. package/dist/link-box/index.mjs +58 -0
  165. package/dist/link-box/index.mjs.map +1 -0
  166. package/dist/pagination/index.d.mts +143 -0
  167. package/dist/pagination/index.d.ts +143 -0
  168. package/dist/pagination/index.js +1303 -0
  169. package/dist/pagination/index.js.map +1 -0
  170. package/dist/pagination/index.mjs +326 -0
  171. package/dist/pagination/index.mjs.map +1 -0
  172. package/dist/popover/index.d.mts +93 -0
  173. package/dist/popover/index.d.ts +93 -0
  174. package/dist/popover/index.js +1280 -0
  175. package/dist/popover/index.js.map +1 -0
  176. package/dist/popover/index.mjs +13 -0
  177. package/dist/popover/index.mjs.map +1 -0
  178. package/dist/portal/index.d.mts +13 -0
  179. package/dist/portal/index.d.ts +13 -0
  180. package/dist/portal/index.js +37 -0
  181. package/dist/portal/index.js.map +1 -0
  182. package/dist/portal/index.mjs +10 -0
  183. package/dist/portal/index.mjs.map +1 -0
  184. package/dist/progress/index.d.mts +48 -0
  185. package/dist/progress/index.d.ts +48 -0
  186. package/dist/progress/index.js +201 -0
  187. package/dist/progress/index.js.map +1 -0
  188. package/dist/progress/index.mjs +174 -0
  189. package/dist/progress/index.mjs.map +1 -0
  190. package/dist/progress-tracker/index.d.mts +81 -0
  191. package/dist/progress-tracker/index.d.ts +81 -0
  192. package/dist/progress-tracker/index.js +834 -0
  193. package/dist/progress-tracker/index.js.map +1 -0
  194. package/dist/progress-tracker/index.mjs +716 -0
  195. package/dist/progress-tracker/index.mjs.map +1 -0
  196. package/dist/radio-group/index.d.mts +100 -0
  197. package/dist/radio-group/index.d.ts +100 -0
  198. package/dist/radio-group/index.js +824 -0
  199. package/dist/radio-group/index.js.map +1 -0
  200. package/dist/radio-group/index.mjs +297 -0
  201. package/dist/radio-group/index.mjs.map +1 -0
  202. package/dist/rating/index.d.mts +78 -0
  203. package/dist/rating/index.d.ts +78 -0
  204. package/dist/rating/index.js +362 -0
  205. package/dist/rating/index.js.map +1 -0
  206. package/dist/rating/index.mjs +247 -0
  207. package/dist/rating/index.mjs.map +1 -0
  208. package/dist/scrolling-list/index.d.mts +105 -0
  209. package/dist/scrolling-list/index.d.ts +105 -0
  210. package/dist/scrolling-list/index.js +1367 -0
  211. package/dist/scrolling-list/index.js.map +1 -0
  212. package/dist/scrolling-list/index.mjs +407 -0
  213. package/dist/scrolling-list/index.mjs.map +1 -0
  214. package/dist/select/index.d.mts +167 -0
  215. package/dist/select/index.d.ts +167 -0
  216. package/dist/select/index.js +991 -0
  217. package/dist/select/index.js.map +1 -0
  218. package/dist/select/index.mjs +470 -0
  219. package/dist/select/index.mjs.map +1 -0
  220. package/dist/skeleton/index.d.mts +67 -0
  221. package/dist/skeleton/index.d.ts +67 -0
  222. package/dist/skeleton/index.js +206 -0
  223. package/dist/skeleton/index.js.map +1 -0
  224. package/dist/skeleton/index.mjs +147 -0
  225. package/dist/skeleton/index.mjs.map +1 -0
  226. package/dist/slider/index.d.mts +97 -0
  227. package/dist/slider/index.d.ts +97 -0
  228. package/dist/slider/index.js +209 -0
  229. package/dist/slider/index.js.map +1 -0
  230. package/dist/slider/index.mjs +182 -0
  231. package/dist/slider/index.mjs.map +1 -0
  232. package/dist/slot/index.d.mts +17 -0
  233. package/dist/slot/index.d.ts +17 -0
  234. package/dist/slot/index.js +51 -0
  235. package/dist/slot/index.js.map +1 -0
  236. package/dist/slot/index.mjs +11 -0
  237. package/dist/slot/index.mjs.map +1 -0
  238. package/dist/snackbar/index.d.mts +158 -0
  239. package/dist/snackbar/index.d.ts +158 -0
  240. package/dist/snackbar/index.js +1693 -0
  241. package/dist/snackbar/index.js.map +1 -0
  242. package/dist/snackbar/index.mjs +733 -0
  243. package/dist/snackbar/index.mjs.map +1 -0
  244. package/dist/spinner/index.d.mts +21 -0
  245. package/dist/spinner/index.d.ts +21 -0
  246. package/dist/spinner/index.js +139 -0
  247. package/dist/spinner/index.js.map +1 -0
  248. package/dist/spinner/index.mjs +9 -0
  249. package/dist/spinner/index.mjs.map +1 -0
  250. package/dist/stepper/index.d.mts +82 -0
  251. package/dist/stepper/index.d.ts +82 -0
  252. package/dist/stepper/index.js +2178 -0
  253. package/dist/stepper/index.js.map +1 -0
  254. package/dist/stepper/index.mjs +229 -0
  255. package/dist/stepper/index.mjs.map +1 -0
  256. package/dist/switch/index.d.mts +64 -0
  257. package/dist/switch/index.d.ts +64 -0
  258. package/dist/switch/index.js +768 -0
  259. package/dist/switch/index.js.map +1 -0
  260. package/dist/switch/index.mjs +245 -0
  261. package/dist/switch/index.mjs.map +1 -0
  262. package/dist/tabs/index.d.mts +103 -0
  263. package/dist/tabs/index.d.ts +103 -0
  264. package/dist/tabs/index.js +1315 -0
  265. package/dist/tabs/index.js.map +1 -0
  266. package/dist/tabs/index.mjs +391 -0
  267. package/dist/tabs/index.mjs.map +1 -0
  268. package/dist/tag/index.d.mts +27 -0
  269. package/dist/tag/index.d.ts +27 -0
  270. package/dist/tag/index.js +269 -0
  271. package/dist/tag/index.js.map +1 -0
  272. package/dist/tag/index.mjs +237 -0
  273. package/dist/tag/index.mjs.map +1 -0
  274. package/dist/text-link/index.d.mts +20 -0
  275. package/dist/text-link/index.d.ts +20 -0
  276. package/dist/text-link/index.js +99 -0
  277. package/dist/text-link/index.js.map +1 -0
  278. package/dist/text-link/index.mjs +8 -0
  279. package/dist/text-link/index.mjs.map +1 -0
  280. package/dist/textarea/index.d.mts +47 -0
  281. package/dist/textarea/index.d.ts +47 -0
  282. package/dist/textarea/index.js +1180 -0
  283. package/dist/textarea/index.js.map +1 -0
  284. package/dist/textarea/index.mjs +77 -0
  285. package/dist/textarea/index.mjs.map +1 -0
  286. package/dist/visually-hidden/index.d.mts +16 -0
  287. package/dist/visually-hidden/index.d.ts +16 -0
  288. package/dist/visually-hidden/index.js +67 -0
  289. package/dist/visually-hidden/index.js.map +1 -0
  290. package/dist/visually-hidden/index.mjs +8 -0
  291. package/dist/visually-hidden/index.mjs.map +1 -0
  292. package/global.d.ts +12 -0
  293. package/package.json +75 -0
  294. package/tsconfig.build.json +9 -0
  295. package/tsconfig.json +9 -0
  296. package/tsup.config.ts +11 -0
@@ -0,0 +1,1678 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/carousel/index.ts
21
+ var carousel_exports = {};
22
+ __export(carousel_exports, {
23
+ Carousel: () => Carousel2
24
+ });
25
+ module.exports = __toCommonJS(carousel_exports);
26
+
27
+ // src/carousel/Carousel.tsx
28
+ var import_class_variance_authority = require("class-variance-authority");
29
+ var import_react7 = require("react");
30
+
31
+ // src/carousel/useCarousel.ts
32
+ var import_react6 = require("react");
33
+
34
+ // src/carousel/useEvent.ts
35
+ var import_react = require("react");
36
+ function useEvent(callback) {
37
+ const ref = (0, import_react.useRef)(() => {
38
+ throw new Error("Cannot call an event handler while rendering.");
39
+ });
40
+ (0, import_react.useLayoutEffect)(() => {
41
+ ref.current = callback;
42
+ });
43
+ return (0, import_react.useCallback)((...args) => ref.current?.(...args), []);
44
+ }
45
+
46
+ // src/carousel/useIsMounted.ts
47
+ var import_react2 = require("react");
48
+ var useIsMounted = () => {
49
+ const isMounted = (0, import_react2.useRef)(false);
50
+ (0, import_react2.useEffect)(() => {
51
+ isMounted.current = true;
52
+ return () => {
53
+ isMounted.current = false;
54
+ };
55
+ }, []);
56
+ return isMounted;
57
+ };
58
+
59
+ // src/carousel/useScrollEnd.ts
60
+ var import_react3 = require("react");
61
+ function useScrollEnd(scrollRef, callback) {
62
+ const scrollLeft = (0, import_react3.useRef)(0);
63
+ const safariTimeout = (0, import_react3.useRef)(null);
64
+ (0, import_react3.useEffect)(() => {
65
+ const element = scrollRef.current;
66
+ if (!element) return;
67
+ const supportsScrollend = "onscrollend" in window;
68
+ const handleScrollEnd = () => {
69
+ callback();
70
+ };
71
+ const handleSafariScroll = () => {
72
+ if (safariTimeout.current) {
73
+ clearTimeout(safariTimeout.current);
74
+ }
75
+ if (scrollRef.current) {
76
+ scrollLeft.current = scrollRef.current.scrollLeft;
77
+ safariTimeout.current = setTimeout(() => {
78
+ if (scrollRef.current) {
79
+ handleScrollEnd();
80
+ }
81
+ }, 150);
82
+ }
83
+ };
84
+ if (supportsScrollend) {
85
+ element.addEventListener("scrollend", handleScrollEnd);
86
+ } else {
87
+ element.addEventListener("scroll", handleSafariScroll);
88
+ }
89
+ return () => {
90
+ if (safariTimeout.current) {
91
+ clearTimeout(safariTimeout.current);
92
+ }
93
+ if (supportsScrollend) {
94
+ element.removeEventListener("scrollend", handleScrollEnd);
95
+ } else {
96
+ element.removeEventListener("scroll", handleSafariScroll);
97
+ }
98
+ };
99
+ }, [callback, scrollRef]);
100
+ }
101
+
102
+ // src/carousel/useSnapPoints.ts
103
+ var import_react5 = require("react");
104
+
105
+ // src/carousel/useResizeObserver.ts
106
+ var import_react4 = require("react");
107
+ function useResizeObserver(ref, callback) {
108
+ (0, import_react4.useLayoutEffect)(() => {
109
+ const element = ref.current;
110
+ if (!element) return;
111
+ const observer = new ResizeObserver((entries) => {
112
+ for (const entry of entries) {
113
+ callback(entry.contentRect.width);
114
+ }
115
+ });
116
+ observer.observe(element);
117
+ return () => observer.disconnect();
118
+ }, [ref, callback]);
119
+ }
120
+
121
+ // src/carousel/utils.ts
122
+ function getSnapIndices({
123
+ totalSlides,
124
+ slidesPerMove,
125
+ slidesPerPage
126
+ }) {
127
+ const slideBy = slidesPerMove === "auto" ? slidesPerPage : slidesPerMove;
128
+ const snapPoints = [];
129
+ const lastSnapIndex = Math.floor((totalSlides - slidesPerPage) / slideBy) * slideBy;
130
+ for (let i = 0; i <= lastSnapIndex; i += slideBy) {
131
+ snapPoints.push(i);
132
+ }
133
+ if (snapPoints[snapPoints.length - 1] !== totalSlides - slidesPerPage) {
134
+ snapPoints.push(totalSlides - slidesPerPage);
135
+ }
136
+ return snapPoints;
137
+ }
138
+ function getSlideElements(container) {
139
+ return container ? Array.from(container.querySelectorAll('[data-part="item"]')) : [];
140
+ }
141
+ function isSnapPoint(slideIndex, {
142
+ container,
143
+ slidesPerMove,
144
+ slidesPerPage
145
+ }) {
146
+ return getSnapIndices({
147
+ totalSlides: getSlideElements(container).length,
148
+ slidesPerPage,
149
+ slidesPerMove
150
+ }).includes(slideIndex);
151
+ }
152
+ function getSnapPositions({
153
+ container,
154
+ slidesPerMove,
155
+ slidesPerPage
156
+ }) {
157
+ if (!container) return [];
158
+ return getSlideElements(container).filter((_, index) => {
159
+ return isSnapPoint(index, {
160
+ slidesPerMove,
161
+ slidesPerPage,
162
+ container
163
+ });
164
+ }).map((slide) => slide.offsetLeft);
165
+ }
166
+
167
+ // src/carousel/useSnapPoints.ts
168
+ function useSnapPoints(initialSnapPoints = [], {
169
+ carouselRef,
170
+ slidesPerMove,
171
+ slidesPerPage
172
+ }) {
173
+ const [pageSnapPoints, setPageSnapPoints] = (0, import_react5.useState)(initialSnapPoints);
174
+ const stableSnapPoints = (0, import_react5.useMemo)(() => pageSnapPoints, [pageSnapPoints]);
175
+ useResizeObserver(carouselRef, () => {
176
+ const newSnapPoints = getSnapPositions({
177
+ slidesPerMove,
178
+ slidesPerPage,
179
+ container: carouselRef.current
180
+ });
181
+ if (JSON.stringify(pageSnapPoints) !== JSON.stringify(newSnapPoints)) {
182
+ setPageSnapPoints(newSnapPoints);
183
+ }
184
+ });
185
+ return [stableSnapPoints, setPageSnapPoints];
186
+ }
187
+
188
+ // src/carousel/useCarousel.ts
189
+ var DATA_SCOPE = "carousel";
190
+ var DIRECTION = "ltr";
191
+ var useCarousel = ({
192
+ defaultPage,
193
+ gap = 16,
194
+ snapType = "mandatory",
195
+ snapStop = "always",
196
+ scrollPadding = 0,
197
+ slidesPerPage = 1,
198
+ slidesPerMove = "auto",
199
+ scrollBehavior = "smooth",
200
+ loop = false,
201
+ // state control
202
+ page: controlledPage,
203
+ onPageChange: onPageChangeProp
204
+ }) => {
205
+ const carouselId = (0, import_react6.useId)();
206
+ const [pageState, setPageState] = (0, import_react6.useState)(defaultPage || controlledPage || 0);
207
+ const carouselRef = (0, import_react6.useRef)(null);
208
+ const pageIndicatorsRefs = (0, import_react6.useRef)([]);
209
+ const isMountedRef = useIsMounted();
210
+ const isMounted = isMountedRef.current;
211
+ const onPageChange = useEvent(onPageChangeProp);
212
+ const [pageSnapPoints] = useSnapPoints([], {
213
+ carouselRef,
214
+ slidesPerMove,
215
+ slidesPerPage
216
+ });
217
+ const canScrollPrev = (0, import_react6.useRef)(loop || pageState > 0);
218
+ const canScrollNext = (0, import_react6.useRef)(loop || pageState < pageSnapPoints.length - 1);
219
+ canScrollPrev.current = loop || pageState > 0;
220
+ canScrollNext.current = loop || pageState < pageSnapPoints.length - 1;
221
+ const handlePageChange = (0, import_react6.useCallback)(
222
+ (page) => {
223
+ if (page !== pageState) {
224
+ setPageState(page);
225
+ onPageChange?.(page);
226
+ }
227
+ },
228
+ [onPageChange, pageState]
229
+ );
230
+ const scrollTo = (0, import_react6.useCallback)(
231
+ (page, behavior) => {
232
+ if (carouselRef.current) {
233
+ carouselRef.current.scrollTo({
234
+ left: pageSnapPoints[page],
235
+ behavior: behavior === "instant" ? "auto" : "smooth"
236
+ });
237
+ handlePageChange(page);
238
+ }
239
+ },
240
+ [handlePageChange, pageSnapPoints]
241
+ );
242
+ const scrollPrev = (0, import_react6.useCallback)(
243
+ (cb) => {
244
+ if (canScrollPrev) {
245
+ const targetPage = loop && pageState === 0 ? pageSnapPoints.length - 1 : Math.max(pageState - 1, 0);
246
+ scrollTo(targetPage, scrollBehavior);
247
+ cb?.(targetPage);
248
+ }
249
+ },
250
+ [loop, pageSnapPoints, pageState, scrollBehavior, scrollTo]
251
+ );
252
+ const scrollNext = (0, import_react6.useCallback)(
253
+ (cb) => {
254
+ if (canScrollNext) {
255
+ const targetPage = loop && pageState === pageSnapPoints.length - 1 ? 0 : Math.min(pageState + 1, pageSnapPoints.length - 1);
256
+ scrollTo(targetPage, scrollBehavior);
257
+ cb?.(targetPage);
258
+ }
259
+ },
260
+ [loop, pageSnapPoints, pageState, scrollBehavior, scrollTo]
261
+ );
262
+ (0, import_react6.useEffect)(() => {
263
+ if (controlledPage != null) {
264
+ scrollTo(controlledPage, scrollBehavior);
265
+ }
266
+ }, [controlledPage, scrollBehavior, scrollTo]);
267
+ (0, import_react6.useLayoutEffect)(() => {
268
+ if (defaultPage != null && !isMounted && carouselRef.current) {
269
+ const snapPositions = getSnapPositions({
270
+ container: carouselRef.current,
271
+ slidesPerMove,
272
+ slidesPerPage
273
+ });
274
+ carouselRef.current.scrollTo({
275
+ left: snapPositions[defaultPage],
276
+ behavior: "instant"
277
+ });
278
+ }
279
+ }, [defaultPage, isMounted, slidesPerMove, slidesPerPage]);
280
+ const syncPageStateWithScrollPosition = (0, import_react6.useCallback)(() => {
281
+ if (!carouselRef.current || pageSnapPoints.length === 0) return;
282
+ const { scrollLeft } = carouselRef.current;
283
+ const distances = pageSnapPoints.map((pagePosition) => Math.abs(scrollLeft - pagePosition));
284
+ const pageInViewport = distances.indexOf(Math.min(...distances));
285
+ if (pageInViewport !== -1) {
286
+ handlePageChange(pageInViewport);
287
+ }
288
+ }, [pageSnapPoints, handlePageChange]);
289
+ useScrollEnd(carouselRef, syncPageStateWithScrollPosition);
290
+ const contextValue = {
291
+ ref: carouselRef,
292
+ pageIndicatorsRefs,
293
+ // props
294
+ gap,
295
+ snapType,
296
+ snapStop,
297
+ scrollPadding,
298
+ slidesPerPage,
299
+ slidesPerMove,
300
+ scrollBehavior,
301
+ loop,
302
+ // computed state
303
+ page: pageState,
304
+ pageSnapPoints,
305
+ canScrollNext: canScrollNext.current,
306
+ canScrollPrev: canScrollPrev.current,
307
+ scrollTo,
308
+ scrollPrev,
309
+ scrollNext,
310
+ // anatomy
311
+ getRootProps: () => ({
312
+ id: `carousel::${carouselId}:`,
313
+ role: "region",
314
+ "aria-roledescription": "carousel",
315
+ "data-scope": DATA_SCOPE,
316
+ "data-part": "root",
317
+ "data-orientation": "horizontal",
318
+ dir: DIRECTION,
319
+ style: {
320
+ "--slides-per-page": slidesPerPage,
321
+ "--slide-spacing": `${gap}px`,
322
+ "--slide-item-size": "calc(100% / var(--slides-per-page) - var(--slide-spacing) * (var(--slides-per-page) - 1) / var(--slides-per-page))"
323
+ }
324
+ }),
325
+ getControlProps: () => ({
326
+ "data-scope": DATA_SCOPE,
327
+ "data-part": "control",
328
+ "data-orientation": "horizontal"
329
+ }),
330
+ getPrevTriggerProps: () => ({
331
+ id: `carousel::${carouselId}::prev-trigger`,
332
+ "aria-controls": `carousel::${carouselId}::item-group`,
333
+ "data-scope": DATA_SCOPE,
334
+ "data-part": "prev-trigger",
335
+ "data-orientation": "horizontal",
336
+ type: "button",
337
+ dir: DIRECTION,
338
+ disabled: !canScrollPrev.current,
339
+ onClick: () => scrollPrev()
340
+ }),
341
+ getNextTriggerProps: () => ({
342
+ id: `carousel::${carouselId}::next-trigger`,
343
+ "aria-controls": `carousel::${carouselId}::item-group`,
344
+ "data-scope": DATA_SCOPE,
345
+ "data-part": "next-trigger",
346
+ "data-orientation": "horizontal",
347
+ type: "button",
348
+ dir: DIRECTION,
349
+ disabled: !canScrollNext.current,
350
+ onClick: () => scrollNext()
351
+ }),
352
+ getSlidesContainerProps: () => ({
353
+ id: `carousel::${carouselId}::item-group`,
354
+ "aria-live": slidesPerPage > 1 ? "off" : "polite",
355
+ "data-scope": DATA_SCOPE,
356
+ "data-part": "item-group",
357
+ "data-orientation": "horizontal",
358
+ dir: DIRECTION,
359
+ tabIndex: 0,
360
+ style: {
361
+ display: "grid",
362
+ gap: "var(--slide-spacing)",
363
+ scrollSnapType: `x ${snapType}`,
364
+ gridAutoFlow: "column",
365
+ scrollbarWidth: "none",
366
+ overscrollBehavior: "contain",
367
+ gridAutoColumns: "var(--slide-item-size)",
368
+ overflowX: "auto"
369
+ },
370
+ ref: carouselRef
371
+ }),
372
+ getSlideProps: ({ index }) => {
373
+ const isStopPoint = isSnapPoint(index, {
374
+ container: carouselRef.current,
375
+ slidesPerMove,
376
+ slidesPerPage
377
+ });
378
+ return {
379
+ id: `carousel::${carouselId}::item:${index}`,
380
+ role: "group",
381
+ "aria-roledescription": "slide",
382
+ "data-scope": DATA_SCOPE,
383
+ "data-part": "item",
384
+ "data-index": index,
385
+ "data-orientation": "horizontal",
386
+ dir: DIRECTION,
387
+ style: {
388
+ ...isStopPoint && {
389
+ scrollSnapAlign: "start",
390
+ scrollSnapStop: snapStop
391
+ }
392
+ }
393
+ };
394
+ },
395
+ getIndicatorGroupProps: () => ({
396
+ role: "radiogroup",
397
+ id: `carousel::${carouselId}::indicator-group`,
398
+ "data-scope": DATA_SCOPE,
399
+ "data-part": "indicator-group",
400
+ "data-orientation": "horizontal",
401
+ dir: DIRECTION
402
+ }),
403
+ getIndicatorProps: ({ index }) => {
404
+ const isActivePage = index === pageState;
405
+ return {
406
+ role: "radio",
407
+ id: `carousel::${carouselId}::indicator:${index}`,
408
+ "aria-checked": isActivePage,
409
+ "data-scope": DATA_SCOPE,
410
+ "data-part": "indicator",
411
+ "data-orientation": "horizontal",
412
+ "data-index": index,
413
+ "data-state": isActivePage ? "active" : "inactive",
414
+ tabIndex: isActivePage ? 0 : -1,
415
+ onClick: () => {
416
+ scrollTo(index, scrollBehavior);
417
+ },
418
+ onKeyDown: (event) => {
419
+ const focusActiveIndicator = (page) => {
420
+ pageIndicatorsRefs.current[page]?.focus();
421
+ };
422
+ if (event.key === "ArrowRight" && canScrollNext) {
423
+ scrollNext(focusActiveIndicator);
424
+ } else if (event.key === "ArrowLeft" && canScrollPrev) {
425
+ scrollPrev(focusActiveIndicator);
426
+ }
427
+ }
428
+ };
429
+ }
430
+ };
431
+ return contextValue;
432
+ };
433
+
434
+ // src/carousel/Carousel.tsx
435
+ var import_jsx_runtime = require("react/jsx-runtime");
436
+ var CarouselContext = (0, import_react7.createContext)(null);
437
+ var Carousel = ({
438
+ className,
439
+ snapType = "mandatory",
440
+ snapStop = "always",
441
+ scrollBehavior = "smooth",
442
+ slidesPerMove = "auto",
443
+ slidesPerPage = 1,
444
+ loop = false,
445
+ children,
446
+ gap = 16,
447
+ defaultPage,
448
+ page,
449
+ onPageChange
450
+ }) => {
451
+ const carouselApi = useCarousel({
452
+ defaultPage,
453
+ slidesPerPage,
454
+ slidesPerMove,
455
+ loop,
456
+ gap,
457
+ scrollBehavior,
458
+ snapStop,
459
+ snapType,
460
+ page,
461
+ onPageChange
462
+ });
463
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
464
+ CarouselContext.Provider,
465
+ {
466
+ value: {
467
+ ...carouselApi,
468
+ scrollBehavior
469
+ },
470
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
471
+ "div",
472
+ {
473
+ className: (0, import_class_variance_authority.cx)("gap-lg relative box-border flex flex-col", className),
474
+ ...carouselApi.getRootProps(),
475
+ children
476
+ }
477
+ )
478
+ }
479
+ );
480
+ };
481
+ Carousel.displayName = "Carousel";
482
+ var useCarouselContext = () => {
483
+ const context = (0, import_react7.useContext)(CarouselContext);
484
+ if (!context) {
485
+ throw Error("useCarouselContext must be used within a Carousel provider");
486
+ }
487
+ return context;
488
+ };
489
+
490
+ // src/carousel/CarouselControls.tsx
491
+ var import_jsx_runtime2 = require("react/jsx-runtime");
492
+ var CarouselControls = ({ children }) => {
493
+ const ctx = useCarouselContext();
494
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
495
+ "div",
496
+ {
497
+ className: "default:px-lg pointer-events-none absolute inset-0 flex flex-row items-center justify-between",
498
+ ...ctx.getControlProps(),
499
+ children
500
+ }
501
+ );
502
+ };
503
+ CarouselControls.displayName = "Carousel.Controls";
504
+
505
+ // src/carousel/CarouselNextButton.tsx
506
+ var import_ArrowVerticalRight = require("@spark-ui/icons/ArrowVerticalRight");
507
+
508
+ // src/icon/Icon.tsx
509
+ var import_react9 = require("react");
510
+
511
+ // src/slot/Slot.tsx
512
+ var import_radix_ui = require("radix-ui");
513
+ var import_react8 = require("react");
514
+ var import_jsx_runtime3 = require("react/jsx-runtime");
515
+ var Slottable = import_radix_ui.Slot.Slottable;
516
+ var Slot = ({ ref, ...props }) => {
517
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_radix_ui.Slot.Root, { ref, ...props });
518
+ };
519
+ var wrapPolymorphicSlot = (asChild, children, callback) => {
520
+ if (!asChild) return callback(children);
521
+ return (0, import_react8.isValidElement)(children) ? (0, import_react8.cloneElement)(
522
+ children,
523
+ void 0,
524
+ callback(children.props.children)
525
+ ) : null;
526
+ };
527
+
528
+ // src/visually-hidden/VisuallyHidden.tsx
529
+ var import_jsx_runtime4 = require("react/jsx-runtime");
530
+ var VisuallyHidden = ({ asChild = false, ref, ...props }) => {
531
+ const Component = asChild ? Slot : "span";
532
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
533
+ Component,
534
+ {
535
+ ...props,
536
+ ref,
537
+ style: {
538
+ // See: https://github.com/twbs/bootstrap/blob/main/scss/mixins/_visually-hidden.scss
539
+ position: "absolute",
540
+ border: 0,
541
+ width: 1,
542
+ height: 1,
543
+ padding: 0,
544
+ margin: -1,
545
+ overflow: "hidden",
546
+ clip: "rect(0, 0, 0, 0)",
547
+ whiteSpace: "nowrap",
548
+ wordWrap: "normal",
549
+ ...props.style
550
+ }
551
+ }
552
+ );
553
+ };
554
+ VisuallyHidden.displayName = "VisuallyHidden";
555
+
556
+ // src/icon/Icon.styles.tsx
557
+ var import_internal_utils = require("@spark-ui/internal-utils");
558
+ var import_class_variance_authority2 = require("class-variance-authority");
559
+ var iconStyles = (0, import_class_variance_authority2.cva)(["fill-current shrink-0"], {
560
+ variants: {
561
+ /**
562
+ * Color scheme of the icon.
563
+ */
564
+ intent: (0, import_internal_utils.makeVariants)({
565
+ current: ["text-current"],
566
+ main: ["text-main"],
567
+ support: ["text-support"],
568
+ accent: ["text-accent"],
569
+ basic: ["text-basic"],
570
+ success: ["text-success"],
571
+ alert: ["text-alert"],
572
+ error: ["text-error"],
573
+ info: ["text-info"],
574
+ neutral: ["text-neutral"]
575
+ }),
576
+ /**
577
+ * Sets the size of the icon.
578
+ */
579
+ size: (0, import_internal_utils.makeVariants)({
580
+ current: ["u-current-font-size"],
581
+ sm: ["w-sz-16", "h-sz-16"],
582
+ md: ["w-sz-24", "h-sz-24"],
583
+ lg: ["w-sz-32", "h-sz-32"],
584
+ xl: ["w-sz-40", "h-sz-40"]
585
+ })
586
+ }
587
+ });
588
+
589
+ // src/icon/Icon.tsx
590
+ var import_jsx_runtime5 = require("react/jsx-runtime");
591
+ var Icon = ({
592
+ label,
593
+ className,
594
+ size = "current",
595
+ intent = "current",
596
+ children,
597
+ ...others
598
+ }) => {
599
+ const child = import_react9.Children.only(children);
600
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_jsx_runtime5.Fragment, { children: [
601
+ (0, import_react9.cloneElement)(child, {
602
+ className: iconStyles({ className, size, intent }),
603
+ "data-spark-component": "icon",
604
+ "aria-hidden": "true",
605
+ focusable: "false",
606
+ ...others
607
+ }),
608
+ label && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(VisuallyHidden, { children: label })
609
+ ] });
610
+ };
611
+ Icon.displayName = "Icon";
612
+
613
+ // src/button/Button.tsx
614
+ var import_class_variance_authority5 = require("class-variance-authority");
615
+ var import_react10 = require("react");
616
+
617
+ // src/spinner/Spinner.styles.tsx
618
+ var import_internal_utils2 = require("@spark-ui/internal-utils");
619
+ var import_class_variance_authority3 = require("class-variance-authority");
620
+ var defaultVariants = {
621
+ intent: "current",
622
+ size: "current",
623
+ isBackgroundVisible: false
624
+ };
625
+ var spinnerStyles = (0, import_class_variance_authority3.cva)(
626
+ ["inline-block", "border-solid", "rounded-full", "border-md", "animate-spin"],
627
+ {
628
+ variants: {
629
+ /**
630
+ * Use `size` prop to set the size of the spinner. If you want to set the full size for the spinner, don't forget to add a wrapping container with its own size.
631
+ */
632
+ size: {
633
+ current: ["u-current-font-size"],
634
+ sm: ["w-sz-20", "h-sz-20"],
635
+ md: ["w-sz-28", "h-sz-28"],
636
+ full: ["w-full", "h-full"]
637
+ },
638
+ /**
639
+ * Color scheme of the spinner.
640
+ */
641
+ intent: (0, import_internal_utils2.makeVariants)({
642
+ current: ["border-current"],
643
+ main: ["border-main"],
644
+ support: ["border-support"],
645
+ accent: ["border-accent"],
646
+ basic: ["border-basic"],
647
+ success: ["border-success"],
648
+ alert: ["border-alert"],
649
+ error: ["border-error"],
650
+ info: ["border-info"],
651
+ neutral: ["border-neutral"]
652
+ }),
653
+ /**
654
+ * Size of the button.
655
+ */
656
+ isBackgroundVisible: {
657
+ true: ["border-b-neutral-container", "border-l-neutral-container"],
658
+ false: ["border-b-transparent", "border-l-transparent"]
659
+ }
660
+ },
661
+ defaultVariants
662
+ }
663
+ );
664
+
665
+ // src/spinner/Spinner.tsx
666
+ var import_jsx_runtime6 = require("react/jsx-runtime");
667
+ var Spinner = ({
668
+ className,
669
+ size = "current",
670
+ intent = "current",
671
+ label,
672
+ isBackgroundVisible,
673
+ ref,
674
+ ...others
675
+ }) => {
676
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
677
+ "span",
678
+ {
679
+ role: "status",
680
+ "data-spark-component": "spinner",
681
+ ref,
682
+ className: spinnerStyles({ className, size, intent, isBackgroundVisible }),
683
+ ...others,
684
+ children: label && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(VisuallyHidden, { children: label })
685
+ }
686
+ );
687
+ };
688
+
689
+ // src/button/Button.styles.tsx
690
+ var import_internal_utils8 = require("@spark-ui/internal-utils");
691
+ var import_class_variance_authority4 = require("class-variance-authority");
692
+
693
+ // src/button/variants/filled.ts
694
+ var import_internal_utils3 = require("@spark-ui/internal-utils");
695
+ var filledVariants = [
696
+ // Main
697
+ {
698
+ intent: "main",
699
+ design: "filled",
700
+ class: (0, import_internal_utils3.tw)([
701
+ "bg-main",
702
+ "text-on-main",
703
+ "hover:bg-main-hovered",
704
+ "enabled:active:bg-main-hovered",
705
+ "focus-visible:bg-main-hovered"
706
+ ])
707
+ },
708
+ // Support
709
+ {
710
+ intent: "support",
711
+ design: "filled",
712
+ class: (0, import_internal_utils3.tw)([
713
+ "bg-support",
714
+ "text-on-support",
715
+ "hover:bg-support-hovered",
716
+ "enabled:active:bg-support-hovered",
717
+ "focus-visible:bg-support-hovered"
718
+ ])
719
+ },
720
+ // Accent
721
+ {
722
+ intent: "accent",
723
+ design: "filled",
724
+ class: (0, import_internal_utils3.tw)([
725
+ "bg-accent",
726
+ "text-on-accent",
727
+ "hover:bg-accent-hovered",
728
+ "enabled:active:bg-accent-hovered",
729
+ "focus-visible:bg-accent-hovered"
730
+ ])
731
+ },
732
+ // Basic
733
+ {
734
+ intent: "basic",
735
+ design: "filled",
736
+ class: (0, import_internal_utils3.tw)([
737
+ "bg-basic",
738
+ "text-on-basic",
739
+ "hover:bg-basic-hovered",
740
+ "enabled:active:bg-basic-hovered",
741
+ "focus-visible:bg-basic-hovered"
742
+ ])
743
+ },
744
+ // Success
745
+ {
746
+ intent: "success",
747
+ design: "filled",
748
+ class: (0, import_internal_utils3.tw)([
749
+ "bg-success",
750
+ "text-on-success",
751
+ "hover:bg-success-hovered",
752
+ "enabled:active:bg-success-hovered",
753
+ "focus-visible:bg-success-hovered"
754
+ ])
755
+ },
756
+ // Alert
757
+ {
758
+ intent: "alert",
759
+ design: "filled",
760
+ class: (0, import_internal_utils3.tw)([
761
+ "bg-alert",
762
+ "text-on-alert",
763
+ "hover:bg-alert-hovered",
764
+ "enabled:active:bg-alert-hovered",
765
+ "focus-visible:bg-alert-hovered"
766
+ ])
767
+ },
768
+ // Danger
769
+ {
770
+ intent: "danger",
771
+ design: "filled",
772
+ class: (0, import_internal_utils3.tw)([
773
+ "text-on-error bg-error",
774
+ "hover:bg-error-hovered enabled:active:bg-error-hovered",
775
+ "focus-visible:bg-error-hovered"
776
+ ])
777
+ },
778
+ // Info
779
+ {
780
+ intent: "info",
781
+ design: "filled",
782
+ class: (0, import_internal_utils3.tw)([
783
+ "text-on-error bg-info",
784
+ "hover:bg-info-hovered enabled:active:bg-info-hovered",
785
+ "focus-visible:bg-info-hovered"
786
+ ])
787
+ },
788
+ // Neutral
789
+ {
790
+ intent: "neutral",
791
+ design: "filled",
792
+ class: (0, import_internal_utils3.tw)([
793
+ "bg-neutral",
794
+ "text-on-neutral",
795
+ "hover:bg-neutral-hovered",
796
+ "enabled:active:bg-neutral-hovered",
797
+ "focus-visible:bg-neutral-hovered"
798
+ ])
799
+ },
800
+ // Surface
801
+ {
802
+ intent: "surface",
803
+ design: "filled",
804
+ class: (0, import_internal_utils3.tw)([
805
+ "bg-surface",
806
+ "text-on-surface",
807
+ "hover:bg-surface-hovered",
808
+ "enabled:active:bg-surface-hovered",
809
+ "focus-visible:bg-surface-hovered"
810
+ ])
811
+ }
812
+ ];
813
+
814
+ // src/button/variants/ghost.ts
815
+ var import_internal_utils4 = require("@spark-ui/internal-utils");
816
+ var ghostVariants = [
817
+ {
818
+ intent: "main",
819
+ design: "ghost",
820
+ class: (0, import_internal_utils4.tw)([
821
+ "text-main",
822
+ "hover:bg-main/dim-5",
823
+ "enabled:active:bg-main/dim-5",
824
+ "focus-visible:bg-main/dim-5"
825
+ ])
826
+ },
827
+ {
828
+ intent: "support",
829
+ design: "ghost",
830
+ class: (0, import_internal_utils4.tw)([
831
+ "text-support",
832
+ "hover:bg-support/dim-5",
833
+ "enabled:active:bg-support/dim-5",
834
+ "focus-visible:bg-support/dim-5"
835
+ ])
836
+ },
837
+ {
838
+ intent: "accent",
839
+ design: "ghost",
840
+ class: (0, import_internal_utils4.tw)([
841
+ "text-accent",
842
+ "hover:bg-accent/dim-5",
843
+ "enabled:active:bg-accent/dim-5",
844
+ "focus-visible:bg-accent/dim-5"
845
+ ])
846
+ },
847
+ {
848
+ intent: "basic",
849
+ design: "ghost",
850
+ class: (0, import_internal_utils4.tw)([
851
+ "text-basic",
852
+ "hover:bg-basic/dim-5",
853
+ "enabled:active:bg-basic/dim-5",
854
+ "focus-visible:bg-basic/dim-5"
855
+ ])
856
+ },
857
+ {
858
+ intent: "success",
859
+ design: "ghost",
860
+ class: (0, import_internal_utils4.tw)([
861
+ "text-success",
862
+ "hover:bg-success/dim-5",
863
+ "enabled:active:bg-success/dim-5",
864
+ "focus-visible:bg-success/dim-5"
865
+ ])
866
+ },
867
+ {
868
+ intent: "alert",
869
+ design: "ghost",
870
+ class: (0, import_internal_utils4.tw)([
871
+ "text-alert",
872
+ "hover:bg-alert/dim-5",
873
+ "enabled:active:bg-alert/dim-5",
874
+ "focus-visible:bg-alert/dim-5"
875
+ ])
876
+ },
877
+ {
878
+ intent: "danger",
879
+ design: "ghost",
880
+ class: (0, import_internal_utils4.tw)([
881
+ "text-error",
882
+ "hover:bg-error/dim-5",
883
+ "enabled:active:bg-error/dim-5",
884
+ "focus-visible:bg-error/dim-5"
885
+ ])
886
+ },
887
+ {
888
+ intent: "info",
889
+ design: "ghost",
890
+ class: (0, import_internal_utils4.tw)([
891
+ "text-info",
892
+ "hover:bg-info/dim-5",
893
+ "enabled:active:bg-info/dim-5",
894
+ "focus-visible:bg-info/dim-5"
895
+ ])
896
+ },
897
+ {
898
+ intent: "neutral",
899
+ design: "ghost",
900
+ class: (0, import_internal_utils4.tw)([
901
+ "text-neutral",
902
+ "hover:bg-neutral/dim-5",
903
+ "enabled:active:bg-neutral/dim-5",
904
+ "focus-visible:bg-neutral/dim-5"
905
+ ])
906
+ },
907
+ {
908
+ intent: "surface",
909
+ design: "ghost",
910
+ class: (0, import_internal_utils4.tw)([
911
+ "text-surface",
912
+ "hover:bg-surface/dim-5",
913
+ "enabled:active:bg-surface/dim-5",
914
+ "focus-visible:bg-surface/dim-5"
915
+ ])
916
+ }
917
+ ];
918
+
919
+ // src/button/variants/outlined.ts
920
+ var import_internal_utils5 = require("@spark-ui/internal-utils");
921
+ var outlinedVariants = [
922
+ {
923
+ intent: "main",
924
+ design: "outlined",
925
+ class: (0, import_internal_utils5.tw)([
926
+ "hover:bg-main/dim-5",
927
+ "enabled:active:bg-main/dim-5",
928
+ "focus-visible:bg-main/dim-5",
929
+ "text-main"
930
+ ])
931
+ },
932
+ {
933
+ intent: "support",
934
+ design: "outlined",
935
+ class: (0, import_internal_utils5.tw)([
936
+ "hover:bg-support/dim-5",
937
+ "enabled:active:bg-support/dim-5",
938
+ "focus-visible:bg-support/dim-5",
939
+ "text-support"
940
+ ])
941
+ },
942
+ {
943
+ intent: "accent",
944
+ design: "outlined",
945
+ class: (0, import_internal_utils5.tw)([
946
+ "hover:bg-accent/dim-5",
947
+ "enabled:active:bg-accent/dim-5",
948
+ "focus-visible:bg-accent/dim-5",
949
+ "text-accent"
950
+ ])
951
+ },
952
+ {
953
+ intent: "basic",
954
+ design: "outlined",
955
+ class: (0, import_internal_utils5.tw)([
956
+ "hover:bg-basic/dim-5",
957
+ "enabled:active:bg-basic/dim-5",
958
+ "focus-visible:bg-basic/dim-5",
959
+ "text-basic"
960
+ ])
961
+ },
962
+ {
963
+ intent: "success",
964
+ design: "outlined",
965
+ class: (0, import_internal_utils5.tw)([
966
+ "hover:bg-success/dim-5",
967
+ "enabled:active:bg-success/dim-5",
968
+ "focus-visible:bg-success/dim-5",
969
+ "text-success"
970
+ ])
971
+ },
972
+ {
973
+ intent: "alert",
974
+ design: "outlined",
975
+ class: (0, import_internal_utils5.tw)([
976
+ "hover:bg-alert/dim-5",
977
+ "enabled:active:bg-alert/dim-5",
978
+ "focus-visible:bg-alert/dim-5",
979
+ "text-alert"
980
+ ])
981
+ },
982
+ {
983
+ intent: "danger",
984
+ design: "outlined",
985
+ class: (0, import_internal_utils5.tw)([
986
+ "hover:bg-error/dim-5",
987
+ "enabled:active:bg-error/dim-5",
988
+ "focus-visible:bg-error/dim-5",
989
+ "text-error"
990
+ ])
991
+ },
992
+ {
993
+ intent: "info",
994
+ design: "outlined",
995
+ class: (0, import_internal_utils5.tw)([
996
+ "hover:bg-info/dim-5",
997
+ "enabled:active:bg-info/dim-5",
998
+ "focus-visible:bg-info/dim-5",
999
+ "text-info"
1000
+ ])
1001
+ },
1002
+ {
1003
+ intent: "neutral",
1004
+ design: "outlined",
1005
+ class: (0, import_internal_utils5.tw)([
1006
+ "hover:bg-neutral/dim-5",
1007
+ "enabled:active:bg-neutral/dim-5",
1008
+ "focus-visible:bg-neutral/dim-5",
1009
+ "text-neutral"
1010
+ ])
1011
+ },
1012
+ {
1013
+ intent: "surface",
1014
+ design: "outlined",
1015
+ class: (0, import_internal_utils5.tw)([
1016
+ "hover:bg-surface/dim-5",
1017
+ "enabled:active:bg-surface/dim-5",
1018
+ "focus-visible:bg-surface/dim-5",
1019
+ "text-surface"
1020
+ ])
1021
+ }
1022
+ ];
1023
+
1024
+ // src/button/variants/tinted.ts
1025
+ var import_internal_utils6 = require("@spark-ui/internal-utils");
1026
+ var tintedVariants = [
1027
+ {
1028
+ intent: "main",
1029
+ design: "tinted",
1030
+ class: (0, import_internal_utils6.tw)([
1031
+ "bg-main-container",
1032
+ "text-on-main-container",
1033
+ "hover:bg-main-container-hovered",
1034
+ "enabled:active:bg-main-container-hovered",
1035
+ "focus-visible:bg-main-container-hovered"
1036
+ ])
1037
+ },
1038
+ {
1039
+ intent: "support",
1040
+ design: "tinted",
1041
+ class: (0, import_internal_utils6.tw)([
1042
+ "bg-support-container",
1043
+ "text-on-support-container",
1044
+ "hover:bg-support-container-hovered",
1045
+ "enabled:active:bg-support-container-hovered",
1046
+ "focus-visible:bg-support-container-hovered"
1047
+ ])
1048
+ },
1049
+ {
1050
+ intent: "accent",
1051
+ design: "tinted",
1052
+ class: (0, import_internal_utils6.tw)([
1053
+ "bg-accent-container",
1054
+ "text-on-accent-container",
1055
+ "hover:bg-accent-container-hovered",
1056
+ "enabled:active:bg-accent-container-hovered",
1057
+ "focus-visible:bg-accent-container-hovered"
1058
+ ])
1059
+ },
1060
+ {
1061
+ intent: "basic",
1062
+ design: "tinted",
1063
+ class: (0, import_internal_utils6.tw)([
1064
+ "bg-basic-container",
1065
+ "text-on-basic-container",
1066
+ "hover:bg-basic-container-hovered",
1067
+ "enabled:active:bg-basic-container-hovered",
1068
+ "focus-visible:bg-basic-container-hovered"
1069
+ ])
1070
+ },
1071
+ {
1072
+ intent: "success",
1073
+ design: "tinted",
1074
+ class: (0, import_internal_utils6.tw)([
1075
+ "bg-success-container",
1076
+ "text-on-success-container",
1077
+ "hover:bg-success-container-hovered",
1078
+ "enabled:active:bg-success-container-hovered",
1079
+ "focus-visible:bg-success-container-hovered"
1080
+ ])
1081
+ },
1082
+ {
1083
+ intent: "alert",
1084
+ design: "tinted",
1085
+ class: (0, import_internal_utils6.tw)([
1086
+ "bg-alert-container",
1087
+ "text-on-alert-container",
1088
+ "hover:bg-alert-container-hovered",
1089
+ "enabled:active:bg-alert-container-hovered",
1090
+ "focus-visible:bg-alert-container-hovered"
1091
+ ])
1092
+ },
1093
+ {
1094
+ intent: "danger",
1095
+ design: "tinted",
1096
+ class: (0, import_internal_utils6.tw)([
1097
+ "bg-error-container",
1098
+ "text-on-error-container",
1099
+ "hover:bg-error-container-hovered",
1100
+ "enabled:active:bg-error-container-hovered",
1101
+ "focus-visible:bg-error-container-hovered"
1102
+ ])
1103
+ },
1104
+ {
1105
+ intent: "info",
1106
+ design: "tinted",
1107
+ class: (0, import_internal_utils6.tw)([
1108
+ "bg-info-container",
1109
+ "text-on-info-container",
1110
+ "hover:bg-info-container-hovered",
1111
+ "enabled:active:bg-info-container-hovered",
1112
+ "focus-visible:bg-info-container-hovered"
1113
+ ])
1114
+ },
1115
+ {
1116
+ intent: "neutral",
1117
+ design: "tinted",
1118
+ class: (0, import_internal_utils6.tw)([
1119
+ "bg-neutral-container",
1120
+ "text-on-neutral-container",
1121
+ "hover:bg-neutral-container-hovered",
1122
+ "enabled:active:bg-neutral-container-hovered",
1123
+ "focus-visible:bg-neutral-container-hovered"
1124
+ ])
1125
+ },
1126
+ {
1127
+ intent: "surface",
1128
+ design: "tinted",
1129
+ class: (0, import_internal_utils6.tw)([
1130
+ "bg-surface",
1131
+ "text-on-surface",
1132
+ "hover:bg-surface-hovered",
1133
+ "enabled:active:bg-surface-hovered",
1134
+ "focus-visible:bg-surface-hovered"
1135
+ ])
1136
+ }
1137
+ ];
1138
+
1139
+ // src/button/variants/contrast.ts
1140
+ var import_internal_utils7 = require("@spark-ui/internal-utils");
1141
+ var contrastVariants = [
1142
+ {
1143
+ intent: "main",
1144
+ design: "contrast",
1145
+ class: (0, import_internal_utils7.tw)([
1146
+ "text-main",
1147
+ "hover:bg-main-container-hovered",
1148
+ "enabled:active:bg-main-container-hovered",
1149
+ "focus-visible:bg-main-container-hovered"
1150
+ ])
1151
+ },
1152
+ {
1153
+ intent: "support",
1154
+ design: "contrast",
1155
+ class: (0, import_internal_utils7.tw)([
1156
+ "text-support",
1157
+ "hover:bg-support-container-hovered",
1158
+ "enabled:active:bg-support-container-hovered",
1159
+ "focus-visible:bg-support-container-hovered"
1160
+ ])
1161
+ },
1162
+ {
1163
+ intent: "accent",
1164
+ design: "contrast",
1165
+ class: (0, import_internal_utils7.tw)([
1166
+ "text-accent",
1167
+ "hover:bg-accent-container-hovered",
1168
+ "enabled:active:bg-accent-container-hovered",
1169
+ "focus-visible:bg-accent-container-hovered"
1170
+ ])
1171
+ },
1172
+ {
1173
+ intent: "basic",
1174
+ design: "contrast",
1175
+ class: (0, import_internal_utils7.tw)([
1176
+ "text-basic",
1177
+ "hover:bg-basic-container-hovered",
1178
+ "enabled:active:bg-basic-container-hovered",
1179
+ "focus-visible:bg-basic-container-hovered"
1180
+ ])
1181
+ },
1182
+ {
1183
+ intent: "success",
1184
+ design: "contrast",
1185
+ class: (0, import_internal_utils7.tw)([
1186
+ "text-success",
1187
+ "hover:bg-success-container-hovered",
1188
+ "enabled:active:bg-success-container-hovered",
1189
+ "focus-visible:bg-success-container-hovered"
1190
+ ])
1191
+ },
1192
+ {
1193
+ intent: "alert",
1194
+ design: "contrast",
1195
+ class: (0, import_internal_utils7.tw)([
1196
+ "text-alert",
1197
+ "hover:bg-alert-container-hovered",
1198
+ "enabled:active:bg-alert-container-hovered",
1199
+ "focus-visible:bg-alert-container-hovered"
1200
+ ])
1201
+ },
1202
+ {
1203
+ intent: "danger",
1204
+ design: "contrast",
1205
+ class: (0, import_internal_utils7.tw)([
1206
+ "text-error",
1207
+ "hover:bg-error-container-hovered",
1208
+ "enabled:active:bg-error-container-hovered",
1209
+ "focus-visible:bg-error-container-hovered"
1210
+ ])
1211
+ },
1212
+ {
1213
+ intent: "info",
1214
+ design: "contrast",
1215
+ class: (0, import_internal_utils7.tw)([
1216
+ "text-info",
1217
+ "hover:bg-info-container-hovered",
1218
+ "enabled:active:bg-info-container-hovered",
1219
+ "focus-visible:bg-info-container-hovered"
1220
+ ])
1221
+ },
1222
+ {
1223
+ intent: "neutral",
1224
+ design: "contrast",
1225
+ class: (0, import_internal_utils7.tw)([
1226
+ "text-neutral",
1227
+ "hover:bg-neutral-container-hovered",
1228
+ "enabled:active:bg-neutral-container-hovered",
1229
+ "focus-visible:bg-neutral-container-hovered"
1230
+ ])
1231
+ },
1232
+ {
1233
+ intent: "surface",
1234
+ design: "contrast",
1235
+ class: (0, import_internal_utils7.tw)([
1236
+ "text-on-surface",
1237
+ "hover:bg-surface-hovered",
1238
+ "enabled:active:bg-surface-hovered",
1239
+ "focus-visible:bg-surface-hovered"
1240
+ ])
1241
+ }
1242
+ ];
1243
+
1244
+ // src/button/Button.styles.tsx
1245
+ var buttonStyles = (0, import_class_variance_authority4.cva)(
1246
+ [
1247
+ "u-shadow-border-transition",
1248
+ "box-border inline-flex items-center justify-center gap-md whitespace-nowrap",
1249
+ "px-lg",
1250
+ "text-body-1 font-bold",
1251
+ "focus-visible:u-outline"
1252
+ ],
1253
+ {
1254
+ variants: {
1255
+ /**
1256
+ * Main style of the button.
1257
+ *
1258
+ * - `filled`: Button will be plain.
1259
+ *
1260
+ * - `outlined`: Button will be transparent with an outline.
1261
+ *
1262
+ * - `tinted`: Button will be filled but using a lighter color scheme.
1263
+ *
1264
+ * - `ghost`: Button will look like a link. No borders, plain text.
1265
+ *
1266
+ * - `contrast`: Button will be surface filled. No borders, plain text.
1267
+ *
1268
+ */
1269
+ design: (0, import_internal_utils8.makeVariants)({
1270
+ filled: [],
1271
+ outlined: ["bg-transparent", "border-sm", "border-current"],
1272
+ tinted: [],
1273
+ ghost: [],
1274
+ contrast: ["bg-surface"]
1275
+ }),
1276
+ /**
1277
+ * Color scheme of the button.
1278
+ */
1279
+ intent: (0, import_internal_utils8.makeVariants)({
1280
+ main: [],
1281
+ support: [],
1282
+ accent: [],
1283
+ basic: [],
1284
+ success: [],
1285
+ alert: [],
1286
+ danger: [],
1287
+ info: [],
1288
+ neutral: [],
1289
+ surface: []
1290
+ }),
1291
+ /**
1292
+ * Size of the button.
1293
+ */
1294
+ size: (0, import_internal_utils8.makeVariants)({
1295
+ sm: ["min-w-sz-32", "h-sz-32"],
1296
+ md: ["min-w-sz-44", "h-sz-44"],
1297
+ lg: ["min-w-sz-56", "h-sz-56"]
1298
+ }),
1299
+ /**
1300
+ * Shape of the button.
1301
+ */
1302
+ shape: (0, import_internal_utils8.makeVariants)({
1303
+ rounded: ["rounded-lg"],
1304
+ square: ["rounded-0"],
1305
+ pill: ["rounded-full"]
1306
+ }),
1307
+ /**
1308
+ * Disable the button, preventing user interaction and adding opacity.
1309
+ */
1310
+ disabled: {
1311
+ true: ["cursor-not-allowed", "opacity-dim-3"],
1312
+ false: ["cursor-pointer"]
1313
+ }
1314
+ },
1315
+ compoundVariants: [
1316
+ ...filledVariants,
1317
+ ...outlinedVariants,
1318
+ ...tintedVariants,
1319
+ ...ghostVariants,
1320
+ ...contrastVariants
1321
+ ],
1322
+ defaultVariants: {
1323
+ design: "filled",
1324
+ intent: "main",
1325
+ size: "md",
1326
+ shape: "rounded"
1327
+ }
1328
+ }
1329
+ );
1330
+
1331
+ // src/button/Button.tsx
1332
+ var import_jsx_runtime7 = require("react/jsx-runtime");
1333
+ var blockedEventHandlers = [
1334
+ "onClick",
1335
+ "onMouseDown",
1336
+ "onMouseUp",
1337
+ "onMouseEnter",
1338
+ "onMouseLeave",
1339
+ "onMouseOver",
1340
+ "onMouseOut",
1341
+ "onKeyDown",
1342
+ "onKeyPress",
1343
+ "onKeyUp",
1344
+ "onSubmit"
1345
+ ];
1346
+ var Button = ({
1347
+ children,
1348
+ design = "filled",
1349
+ disabled = false,
1350
+ intent = "main",
1351
+ isLoading = false,
1352
+ loadingLabel,
1353
+ loadingText,
1354
+ shape = "rounded",
1355
+ size = "md",
1356
+ asChild,
1357
+ className,
1358
+ ref,
1359
+ ...others
1360
+ }) => {
1361
+ const Component = asChild ? Slot : "button";
1362
+ const shouldNotInteract = !!disabled || isLoading;
1363
+ const disabledEventHandlers = (0, import_react10.useMemo)(() => {
1364
+ const result = {};
1365
+ if (shouldNotInteract) {
1366
+ blockedEventHandlers.forEach((eventHandler) => result[eventHandler] = void 0);
1367
+ }
1368
+ return result;
1369
+ }, [shouldNotInteract]);
1370
+ const spinnerProps = {
1371
+ size: "current",
1372
+ className: loadingText ? "inline-block" : "absolute",
1373
+ ...loadingLabel && { "aria-label": loadingLabel }
1374
+ };
1375
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
1376
+ Component,
1377
+ {
1378
+ "data-spark-component": "button",
1379
+ ...Component === "button" && { type: "button" },
1380
+ ref,
1381
+ className: buttonStyles({
1382
+ className,
1383
+ design,
1384
+ disabled: shouldNotInteract,
1385
+ intent,
1386
+ shape,
1387
+ size
1388
+ }),
1389
+ disabled: !!disabled,
1390
+ "aria-busy": isLoading,
1391
+ "aria-live": isLoading ? "assertive" : "off",
1392
+ ...others,
1393
+ ...disabledEventHandlers,
1394
+ children: wrapPolymorphicSlot(
1395
+ asChild,
1396
+ children,
1397
+ (slotted) => isLoading ? /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_jsx_runtime7.Fragment, { children: [
1398
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(Spinner, { ...spinnerProps }),
1399
+ loadingText && loadingText,
1400
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
1401
+ "div",
1402
+ {
1403
+ "aria-hidden": true,
1404
+ className: (0, import_class_variance_authority5.cx)("gap-md", loadingText ? "hidden" : "inline-flex opacity-0"),
1405
+ children: slotted
1406
+ }
1407
+ )
1408
+ ] }) : slotted
1409
+ )
1410
+ }
1411
+ );
1412
+ };
1413
+ Button.displayName = "Button";
1414
+
1415
+ // src/icon-button/IconButton.styles.tsx
1416
+ var import_internal_utils9 = require("@spark-ui/internal-utils");
1417
+ var import_class_variance_authority6 = require("class-variance-authority");
1418
+ var iconButtonStyles = (0, import_class_variance_authority6.cva)(["pl-0 pr-0"], {
1419
+ variants: {
1420
+ /**
1421
+ * Sets the size of the icon.
1422
+ */
1423
+ size: (0, import_internal_utils9.makeVariants)({
1424
+ sm: ["text-body-1"],
1425
+ md: ["text-body-1"],
1426
+ lg: ["text-display-3"]
1427
+ })
1428
+ }
1429
+ });
1430
+
1431
+ // src/icon-button/IconButton.tsx
1432
+ var import_jsx_runtime8 = require("react/jsx-runtime");
1433
+ var IconButton = ({
1434
+ design = "filled",
1435
+ disabled = false,
1436
+ intent = "main",
1437
+ shape = "rounded",
1438
+ size = "md",
1439
+ className,
1440
+ ref,
1441
+ ...others
1442
+ }) => {
1443
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1444
+ Button,
1445
+ {
1446
+ ref,
1447
+ className: iconButtonStyles({ size, className }),
1448
+ design,
1449
+ disabled,
1450
+ intent,
1451
+ shape,
1452
+ size,
1453
+ ...others
1454
+ }
1455
+ );
1456
+ };
1457
+ IconButton.displayName = "IconButton";
1458
+
1459
+ // src/carousel/CarouselNextButton.tsx
1460
+ var import_jsx_runtime9 = require("react/jsx-runtime");
1461
+ var CarouselNextButton = ({
1462
+ "aria-label": ariaLabel,
1463
+ ...buttonProps
1464
+ }) => {
1465
+ const ctx = useCarouselContext();
1466
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
1467
+ IconButton,
1468
+ {
1469
+ ...ctx.getNextTriggerProps(),
1470
+ intent: "surface",
1471
+ design: "filled",
1472
+ className: "pointer-events-auto cursor-pointer shadow-sm disabled:invisible",
1473
+ "aria-label": ariaLabel,
1474
+ ...buttonProps,
1475
+ children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(Icon, { children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_ArrowVerticalRight.ArrowVerticalRight, {}) })
1476
+ }
1477
+ );
1478
+ };
1479
+ CarouselNextButton.displayName = "Carousel.NextButton";
1480
+
1481
+ // src/carousel/CarouselPageIndicator.tsx
1482
+ var import_class_variance_authority7 = require("class-variance-authority");
1483
+ var import_react11 = require("react");
1484
+ var import_jsx_runtime10 = require("react/jsx-runtime");
1485
+ var CarouselPageIndicator = ({
1486
+ children,
1487
+ unstyled = false,
1488
+ index,
1489
+ "aria-label": ariaLabel,
1490
+ className
1491
+ }) => {
1492
+ const ctx = useCarouselContext();
1493
+ const ref = (0, import_react11.useRef)(null);
1494
+ (0, import_react11.useEffect)(() => {
1495
+ if (ctx.pageIndicatorsRefs.current) {
1496
+ ctx.pageIndicatorsRefs.current[index] = ref.current;
1497
+ }
1498
+ });
1499
+ const styles = (0, import_class_variance_authority7.cx)(
1500
+ "group h-sz-16 relative flex",
1501
+ "hover:cursor-pointer",
1502
+ "w-sz-16 data-[state=active]:w-sz-44"
1503
+ );
1504
+ const dotsStyles = (0, import_class_variance_authority7.cx)(
1505
+ "before:rounded-sm before:block before:size-md",
1506
+ "before:absolute before:left-1/2 before:top-1/2 before:-translate-x-1/2 before:-translate-y-1/2",
1507
+ "data-[state=active]:before:w-sz-32 data-[state=active]:before:bg-basic",
1508
+ "data-[state=inactive]:before:bg-on-surface/dim-3"
1509
+ );
1510
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1511
+ "button",
1512
+ {
1513
+ ref,
1514
+ ...ctx.getIndicatorProps({ index }),
1515
+ "aria-label": ariaLabel,
1516
+ className: (0, import_class_variance_authority7.cx)(
1517
+ {
1518
+ [styles]: !unstyled,
1519
+ [dotsStyles]: !unstyled
1520
+ },
1521
+ className
1522
+ ),
1523
+ children
1524
+ },
1525
+ index
1526
+ );
1527
+ };
1528
+ CarouselPageIndicator.displayName = "Carousel.PageIndicator";
1529
+
1530
+ // src/carousel/CarouselPagePicker.tsx
1531
+ var import_class_variance_authority8 = require("class-variance-authority");
1532
+ var import_jsx_runtime11 = require("react/jsx-runtime");
1533
+ var CarouselPagePicker = ({ children, className }) => {
1534
+ const ctx = useCarouselContext();
1535
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_jsx_runtime11.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1536
+ "div",
1537
+ {
1538
+ ...ctx.getIndicatorGroupProps(),
1539
+ className: (0, import_class_variance_authority8.cx)(
1540
+ "default:min-h-sz-16 flex w-full flex-wrap items-center justify-center",
1541
+ className
1542
+ ),
1543
+ children: ctx.pageSnapPoints.length <= 1 ? null : children({
1544
+ ...ctx,
1545
+ pages: Array.from({ length: ctx.pageSnapPoints.length }, (_, i) => i)
1546
+ })
1547
+ }
1548
+ ) });
1549
+ };
1550
+ CarouselPagePicker.displayName = "Carousel.PagePicker";
1551
+
1552
+ // src/carousel/CarouselPrevButton.tsx
1553
+ var import_ArrowVerticalLeft = require("@spark-ui/icons/ArrowVerticalLeft");
1554
+ var import_jsx_runtime12 = require("react/jsx-runtime");
1555
+ var CarouselPrevButton = ({
1556
+ "aria-label": ariaLabel,
1557
+ ...buttonProps
1558
+ }) => {
1559
+ const ctx = useCarouselContext();
1560
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1561
+ IconButton,
1562
+ {
1563
+ ...ctx.getPrevTriggerProps(),
1564
+ intent: "surface",
1565
+ design: "filled",
1566
+ className: "pointer-events-auto cursor-pointer shadow-sm disabled:invisible",
1567
+ "aria-label": ariaLabel,
1568
+ ...buttonProps,
1569
+ children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(Icon, { children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_ArrowVerticalLeft.ArrowVerticalLeft, {}) })
1570
+ }
1571
+ );
1572
+ };
1573
+ CarouselPrevButton.displayName = "Carousel.PrevButton";
1574
+
1575
+ // src/carousel/CarouselSlide.tsx
1576
+ var import_class_variance_authority9 = require("class-variance-authority");
1577
+ var import_react13 = require("react");
1578
+
1579
+ // src/carousel/useIsVisible.ts
1580
+ var import_react12 = require("react");
1581
+ function useIsVisible(elementRef, parentRef) {
1582
+ const [isVisible, setIsVisible] = (0, import_react12.useState)(true);
1583
+ (0, import_react12.useLayoutEffect)(() => {
1584
+ const el = elementRef.current;
1585
+ const parent = parentRef.current;
1586
+ if (!parent || !el) return;
1587
+ const observer = new IntersectionObserver(
1588
+ ([entry]) => {
1589
+ if (entry) {
1590
+ setIsVisible(entry.isIntersecting);
1591
+ }
1592
+ },
1593
+ { root: parent, threshold: 0.2 }
1594
+ );
1595
+ observer.observe(el);
1596
+ return () => observer.disconnect();
1597
+ });
1598
+ return isVisible;
1599
+ }
1600
+
1601
+ // src/carousel/CarouselSlide.tsx
1602
+ var import_jsx_runtime13 = require("react/jsx-runtime");
1603
+ var CarouselSlide = ({
1604
+ children,
1605
+ index = 0,
1606
+ totalSlides,
1607
+ className = "",
1608
+ ...props
1609
+ }) => {
1610
+ const itemRef = (0, import_react13.useRef)(null);
1611
+ const ctx = useCarouselContext();
1612
+ const isVisible = useIsVisible(itemRef, ctx.ref);
1613
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
1614
+ "div",
1615
+ {
1616
+ ref: itemRef,
1617
+ ...ctx.getSlideProps({ index, totalSlides }),
1618
+ className: (0, import_class_variance_authority9.cx)("default:bg-surface relative overflow-hidden", className),
1619
+ "aria-hidden": !isVisible,
1620
+ inert: !isVisible,
1621
+ ...props,
1622
+ children
1623
+ }
1624
+ );
1625
+ };
1626
+ CarouselSlide.displayName = "Carousel.Slide";
1627
+
1628
+ // src/carousel/CarouselSlides.tsx
1629
+ var import_class_variance_authority10 = require("class-variance-authority");
1630
+ var import_react14 = require("react");
1631
+ var import_jsx_runtime14 = require("react/jsx-runtime");
1632
+ var CarouselSlides = ({ children, className = "" }) => {
1633
+ const ctx = useCarouselContext();
1634
+ const childrenElements = import_react14.Children.toArray(children);
1635
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1636
+ "div",
1637
+ {
1638
+ ...ctx.getSlidesContainerProps(),
1639
+ className: (0, import_class_variance_authority10.cx)(
1640
+ "focus-visible:u-outline relative w-full",
1641
+ "[-ms-overflow-style:none] [scrollbar-width:none] [&::-webkit-scrollbar]:hidden",
1642
+ className
1643
+ ),
1644
+ children: childrenElements.map(
1645
+ (child, index) => (0, import_react14.isValidElement)(child) ? (0, import_react14.cloneElement)(child, {
1646
+ index,
1647
+ totalSlides: childrenElements.length
1648
+ }) : child
1649
+ )
1650
+ }
1651
+ );
1652
+ };
1653
+ CarouselSlides.displayName = "Carousel.Slides";
1654
+
1655
+ // src/carousel/CarouselViewport.tsx
1656
+ var import_jsx_runtime15 = require("react/jsx-runtime");
1657
+ var CarouselViewport = ({ children }) => {
1658
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { className: "relative flex items-center justify-around p-0", children });
1659
+ };
1660
+ CarouselViewport.displayName = "Carousel.Viewport";
1661
+
1662
+ // src/carousel/index.ts
1663
+ var Carousel2 = Object.assign(Carousel, {
1664
+ Controls: CarouselControls,
1665
+ NextButton: CarouselNextButton,
1666
+ PrevButton: CarouselPrevButton,
1667
+ Slide: CarouselSlide,
1668
+ Slides: CarouselSlides,
1669
+ Viewport: CarouselViewport,
1670
+ PagePicker: CarouselPagePicker,
1671
+ PageIndicator: CarouselPageIndicator
1672
+ });
1673
+ Carousel2.displayName = "Carousel";
1674
+ // Annotate the CommonJS export names for ESM import in node:
1675
+ 0 && (module.exports = {
1676
+ Carousel
1677
+ });
1678
+ //# sourceMappingURL=index.js.map