@hanzo/ui 5.3.28 → 5.3.30

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 (229) hide show
  1. package/dist/3d/button.js +298 -0
  2. package/dist/3d/button.mjs +273 -0
  3. package/dist/3d/card.js +234 -0
  4. package/dist/3d/card.mjs +207 -0
  5. package/dist/3d/carousel.js +371 -0
  6. package/dist/3d/carousel.mjs +344 -0
  7. package/dist/3d/grid.js +362 -0
  8. package/dist/3d/grid.mjs +337 -0
  9. package/dist/3d/index.js +1518 -0
  10. package/dist/3d/index.mjs +1472 -0
  11. package/dist/3d/marquee.js +352 -0
  12. package/dist/3d/marquee.mjs +327 -0
  13. package/dist/3d/pin.js +46 -0
  14. package/dist/3d/pin.mjs +24 -0
  15. package/dist/accordion.js +80 -0
  16. package/dist/accordion.mjs +55 -0
  17. package/dist/alert-dialog.js +220 -0
  18. package/dist/alert-dialog.mjs +187 -0
  19. package/dist/alert.js +68 -0
  20. package/dist/alert.mjs +64 -0
  21. package/dist/animation/animated-background.js +424 -0
  22. package/dist/animation/animated-background.mjs +418 -0
  23. package/dist/animation/animated-beam.js +119 -0
  24. package/dist/animation/animated-beam.mjs +97 -0
  25. package/dist/animation/animated-cursor.js +275 -0
  26. package/dist/animation/animated-cursor.mjs +270 -0
  27. package/dist/animation/animated-icon.js +357 -0
  28. package/dist/animation/animated-icon.mjs +351 -0
  29. package/dist/animation/animated-list.js +339 -0
  30. package/dist/animation/animated-list.mjs +333 -0
  31. package/dist/animation/animated-number.js +283 -0
  32. package/dist/animation/animated-number.mjs +277 -0
  33. package/dist/animation/animated-testimonials.js +97 -0
  34. package/dist/animation/animated-testimonials.mjs +75 -0
  35. package/dist/animation/animated-tooltip.js +67 -0
  36. package/dist/animation/animated-tooltip.mjs +45 -0
  37. package/dist/animation/apple-cards-carousel.js +308 -0
  38. package/dist/animation/apple-cards-carousel.mjs +285 -0
  39. package/dist/animation/apple-hello-effect.js +60 -0
  40. package/dist/animation/apple-hello-effect.mjs +38 -0
  41. package/dist/animation/index.js +1952 -0
  42. package/dist/animation/index.mjs +1921 -0
  43. package/dist/avatar.js +71 -0
  44. package/dist/avatar.mjs +47 -0
  45. package/dist/badge.js +66 -0
  46. package/dist/badge.mjs +40 -0
  47. package/dist/blocks/index.js +1665 -0
  48. package/dist/blocks/index.mjs +1626 -0
  49. package/dist/breadcrumb.js +107 -0
  50. package/dist/breadcrumb.mjs +99 -0
  51. package/dist/calendar.js +189 -0
  52. package/dist/calendar.mjs +164 -0
  53. package/dist/carousel.js +278 -0
  54. package/dist/carousel.mjs +249 -0
  55. package/dist/checkbox.js +60 -0
  56. package/dist/checkbox.mjs +35 -0
  57. package/dist/code/block.js +226 -0
  58. package/dist/code/block.mjs +203 -0
  59. package/dist/code/compare.js +446 -0
  60. package/dist/code/compare.mjs +423 -0
  61. package/dist/code/diff.js +430 -0
  62. package/dist/code/diff.mjs +407 -0
  63. package/dist/code/editor.js +243 -0
  64. package/dist/code/editor.mjs +218 -0
  65. package/dist/code/explorer.js +291 -0
  66. package/dist/code/explorer.mjs +268 -0
  67. package/dist/code/index.js +2551 -0
  68. package/dist/code/index.mjs +2510 -0
  69. package/dist/code/preview.js +400 -0
  70. package/dist/code/preview.mjs +377 -0
  71. package/dist/code/snippet.js +274 -0
  72. package/dist/code/snippet.mjs +250 -0
  73. package/dist/code/tabs.js +75 -0
  74. package/dist/code/tabs.mjs +53 -0
  75. package/dist/code/terminal.js +437 -0
  76. package/dist/code/terminal.mjs +414 -0
  77. package/dist/collapsible.js +33 -0
  78. package/dist/collapsible.mjs +9 -0
  79. package/dist/command.js +262 -0
  80. package/dist/command.mjs +232 -0
  81. package/dist/context-menu.js +207 -0
  82. package/dist/context-menu.mjs +171 -0
  83. package/dist/device/index.js +3 -0
  84. package/dist/device/index.mjs +2 -0
  85. package/dist/dialog.js +151 -0
  86. package/dist/dialog.mjs +121 -0
  87. package/dist/dock/basic.js +174 -0
  88. package/dist/dock/basic.mjs +151 -0
  89. package/dist/dock/index.js +628 -0
  90. package/dist/dock/index.mjs +601 -0
  91. package/dist/dock/limelight-nav.js +295 -0
  92. package/dist/dock/limelight-nav.mjs +274 -0
  93. package/dist/dock/macos.js +141 -0
  94. package/dist/dock/macos.mjs +118 -0
  95. package/dist/dock/menu.js +70 -0
  96. package/dist/dock/menu.mjs +48 -0
  97. package/dist/dock/message.js +144 -0
  98. package/dist/dock/message.mjs +122 -0
  99. package/dist/drawer.js +115 -0
  100. package/dist/drawer.mjs +103 -0
  101. package/dist/dropdown-menu.js +202 -0
  102. package/dist/dropdown-menu.mjs +166 -0
  103. package/dist/finance/AdvancedChart.js +48 -0
  104. package/dist/finance/AdvancedChart.mjs +46 -0
  105. package/dist/finance/CompanyProfile.js +48 -0
  106. package/dist/finance/CompanyProfile.mjs +46 -0
  107. package/dist/finance/CryptoScreener.js +45 -0
  108. package/dist/finance/CryptoScreener.mjs +43 -0
  109. package/dist/finance/Financials.js +52 -0
  110. package/dist/finance/Financials.mjs +50 -0
  111. package/dist/finance/ForexScreener.js +46 -0
  112. package/dist/finance/ForexScreener.mjs +44 -0
  113. package/dist/finance/MarketOverview.js +104 -0
  114. package/dist/finance/MarketOverview.mjs +102 -0
  115. package/dist/finance/NewsTimeline.js +44 -0
  116. package/dist/finance/NewsTimeline.mjs +42 -0
  117. package/dist/finance/OrderEntry.js +131 -0
  118. package/dist/finance/OrderEntry.mjs +129 -0
  119. package/dist/finance/OrdersHistory.js +64 -0
  120. package/dist/finance/OrdersHistory.mjs +62 -0
  121. package/dist/finance/PositionsList.js +80 -0
  122. package/dist/finance/PositionsList.mjs +78 -0
  123. package/dist/finance/StockScreener.js +46 -0
  124. package/dist/finance/StockScreener.mjs +44 -0
  125. package/dist/finance/SymbolInfo.js +46 -0
  126. package/dist/finance/SymbolInfo.mjs +44 -0
  127. package/dist/finance/TechnicalAnalysis.js +54 -0
  128. package/dist/finance/TechnicalAnalysis.mjs +52 -0
  129. package/dist/finance/TickerTape.js +56 -0
  130. package/dist/finance/TickerTape.mjs +54 -0
  131. package/dist/finance/TradingPanel.js +191 -0
  132. package/dist/finance/TradingPanel.mjs +189 -0
  133. package/dist/finance/index.js +930 -0
  134. package/dist/finance/index.mjs +914 -0
  135. package/dist/form/index.js +155 -0
  136. package/dist/form/index.mjs +125 -0
  137. package/dist/form.js +172 -0
  138. package/dist/form.mjs +142 -0
  139. package/dist/hover-card.js +58 -0
  140. package/dist/hover-card.mjs +34 -0
  141. package/dist/index.js +8467 -0
  142. package/dist/index.mjs +8087 -0
  143. package/dist/input-otp.js +79 -0
  144. package/dist/input-otp.mjs +54 -0
  145. package/dist/lib/utils.js +28 -0
  146. package/dist/lib/utils.mjs +24 -0
  147. package/dist/navigation/index.js +98 -0
  148. package/dist/navigation/index.mjs +79 -0
  149. package/dist/navigation-menu.js +149 -0
  150. package/dist/navigation-menu.mjs +116 -0
  151. package/dist/pattern/grid-pattern.js +333 -0
  152. package/dist/pattern/grid-pattern.mjs +310 -0
  153. package/dist/pattern/index.js +333 -0
  154. package/dist/pattern/index.mjs +310 -0
  155. package/dist/popover.js +63 -0
  156. package/dist/popover.mjs +37 -0
  157. package/dist/primitives/index.js +8467 -0
  158. package/dist/primitives/index.mjs +8087 -0
  159. package/dist/primitives-export.js +8467 -0
  160. package/dist/primitives-export.mjs +8087 -0
  161. package/dist/progress.js +62 -0
  162. package/dist/progress.mjs +37 -0
  163. package/dist/project/gantt.js +65 -0
  164. package/dist/project/gantt.mjs +43 -0
  165. package/dist/project/index.js +636 -0
  166. package/dist/project/index.mjs +611 -0
  167. package/dist/project/kanban.js +597 -0
  168. package/dist/project/kanban.mjs +572 -0
  169. package/dist/project/list.js +35 -0
  170. package/dist/project/list.mjs +12 -0
  171. package/dist/radio-group.js +68 -0
  172. package/dist/radio-group.mjs +45 -0
  173. package/dist/resizable.js +72 -0
  174. package/dist/resizable.mjs +48 -0
  175. package/dist/scroll-area.js +89 -0
  176. package/dist/scroll-area.mjs +66 -0
  177. package/dist/select.js +140 -0
  178. package/dist/select.mjs +111 -0
  179. package/dist/separator.js +59 -0
  180. package/dist/separator.mjs +34 -0
  181. package/dist/sheet.js +148 -0
  182. package/dist/sheet.mjs +117 -0
  183. package/dist/skeleton.js +32 -0
  184. package/dist/skeleton.mjs +27 -0
  185. package/dist/slider.js +99 -0
  186. package/dist/slider.mjs +73 -0
  187. package/dist/sonner.js +34 -0
  188. package/dist/sonner.mjs +29 -0
  189. package/dist/switch.js +62 -0
  190. package/dist/switch.mjs +37 -0
  191. package/dist/table.js +110 -0
  192. package/dist/table.mjs +101 -0
  193. package/dist/tabs.js +82 -0
  194. package/dist/tabs.mjs +57 -0
  195. package/dist/tailwind/index.js +2023 -0
  196. package/dist/tailwind/index.mjs +2011 -0
  197. package/dist/textarea.js +78 -0
  198. package/dist/textarea.mjs +56 -0
  199. package/dist/toggle-group.js +118 -0
  200. package/dist/toggle-group.mjs +93 -0
  201. package/dist/toggle.js +71 -0
  202. package/dist/toggle.mjs +48 -0
  203. package/dist/tooltip.js +67 -0
  204. package/dist/tooltip.mjs +40 -0
  205. package/dist/types/index.js +57 -0
  206. package/dist/types/index.mjs +51 -0
  207. package/dist/ui/announcement.js +129 -0
  208. package/dist/ui/announcement.mjs +107 -0
  209. package/dist/ui/avatar-group.js +88 -0
  210. package/dist/ui/avatar-group.mjs +65 -0
  211. package/dist/ui/banner.js +85 -0
  212. package/dist/ui/banner.mjs +62 -0
  213. package/dist/ui/cursor.js +78 -0
  214. package/dist/ui/cursor.mjs +56 -0
  215. package/dist/ui/index.js +475 -0
  216. package/dist/ui/index.mjs +442 -0
  217. package/dist/ui/marquee.js +74 -0
  218. package/dist/ui/marquee.mjs +52 -0
  219. package/dist/ui/pill.js +85 -0
  220. package/dist/ui/pill.mjs +62 -0
  221. package/dist/ui/spinner.js +28 -0
  222. package/dist/ui/spinner.mjs +26 -0
  223. package/dist/ui/tags.js +101 -0
  224. package/dist/ui/tags.mjs +79 -0
  225. package/dist/ui/ticker.js +73 -0
  226. package/dist/ui/ticker.mjs +51 -0
  227. package/dist/util/index.js +463 -0
  228. package/dist/util/index.mjs +404 -0
  229. package/package.json +1 -1
@@ -0,0 +1,339 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ Object.defineProperty(exports, '__esModule', { value: true });
5
+
6
+ var react = require('react');
7
+ var react$1 = require('motion/react');
8
+ var utils = require('@/lib/utils');
9
+ var jsxRuntime = require('react/jsx-runtime');
10
+
11
+ var __defProp = Object.defineProperty;
12
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
13
+ function usePrefersReducedMotion() {
14
+ const [prefersReducedMotion, setPrefersReducedMotion] = react.useState(false);
15
+ react.useEffect(() => {
16
+ if (typeof window === "undefined") return;
17
+ const mediaQuery = window.matchMedia("(prefers-reduced-motion: reduce)");
18
+ setPrefersReducedMotion(mediaQuery.matches);
19
+ const handleChange = /* @__PURE__ */ __name((event) => {
20
+ setPrefersReducedMotion(event.matches);
21
+ }, "handleChange");
22
+ mediaQuery.addEventListener("change", handleChange);
23
+ return () => mediaQuery.removeEventListener("change", handleChange);
24
+ }, []);
25
+ return prefersReducedMotion;
26
+ }
27
+ __name(usePrefersReducedMotion, "usePrefersReducedMotion");
28
+ var slideVariants = {
29
+ hidden: { opacity: 0, x: -50 },
30
+ visible: /* @__PURE__ */ __name((i) => ({
31
+ opacity: 1,
32
+ x: 0,
33
+ transition: {
34
+ delay: i * 0.1,
35
+ duration: 0.5,
36
+ ease: "easeOut"
37
+ }
38
+ }), "visible"),
39
+ exit: { opacity: 0, x: 50, transition: { duration: 0.3 } }
40
+ };
41
+ var fadeVariants = {
42
+ hidden: { opacity: 0 },
43
+ visible: /* @__PURE__ */ __name((i) => ({
44
+ opacity: 1,
45
+ transition: {
46
+ delay: i * 0.1,
47
+ duration: 0.5,
48
+ ease: "easeOut"
49
+ }
50
+ }), "visible"),
51
+ exit: { opacity: 0, transition: { duration: 0.3 } }
52
+ };
53
+ var scaleVariants = {
54
+ hidden: { opacity: 0, scale: 0.8 },
55
+ visible: /* @__PURE__ */ __name((i) => ({
56
+ opacity: 1,
57
+ scale: 1,
58
+ transition: {
59
+ delay: i * 0.1,
60
+ duration: 0.5,
61
+ ease: "easeOut",
62
+ type: "spring",
63
+ stiffness: 100
64
+ }
65
+ }), "visible"),
66
+ exit: { opacity: 0, scale: 0.8, transition: { duration: 0.3 } }
67
+ };
68
+ var slideUpVariants = {
69
+ hidden: { opacity: 0, y: 50 },
70
+ visible: /* @__PURE__ */ __name((i) => ({
71
+ opacity: 1,
72
+ y: 0,
73
+ transition: {
74
+ delay: i * 0.1,
75
+ duration: 0.5,
76
+ ease: "easeOut"
77
+ }
78
+ }), "visible"),
79
+ exit: { opacity: 0, y: -50, transition: { duration: 0.3 } }
80
+ };
81
+ var slideDownVariants = {
82
+ hidden: { opacity: 0, y: -50 },
83
+ visible: /* @__PURE__ */ __name((i) => ({
84
+ opacity: 1,
85
+ y: 0,
86
+ transition: {
87
+ delay: i * 0.1,
88
+ duration: 0.5,
89
+ ease: "easeOut"
90
+ }
91
+ }), "visible"),
92
+ exit: { opacity: 0, y: 50, transition: { duration: 0.3 } }
93
+ };
94
+ var slideLeftVariants = {
95
+ hidden: { opacity: 0, x: 50 },
96
+ visible: /* @__PURE__ */ __name((i) => ({
97
+ opacity: 1,
98
+ x: 0,
99
+ transition: {
100
+ delay: i * 0.1,
101
+ duration: 0.5,
102
+ ease: "easeOut"
103
+ }
104
+ }), "visible"),
105
+ exit: { opacity: 0, x: -50, transition: { duration: 0.3 } }
106
+ };
107
+ var slideRightVariants = {
108
+ hidden: { opacity: 0, x: -50 },
109
+ visible: /* @__PURE__ */ __name((i) => ({
110
+ opacity: 1,
111
+ x: 0,
112
+ transition: {
113
+ delay: i * 0.1,
114
+ duration: 0.5,
115
+ ease: "easeOut"
116
+ }
117
+ }), "visible"),
118
+ exit: { opacity: 0, x: 50, transition: { duration: 0.3 } }
119
+ };
120
+ var animationVariants = {
121
+ slide: slideVariants,
122
+ fade: fadeVariants,
123
+ scale: scaleVariants,
124
+ slideUp: slideUpVariants,
125
+ slideDown: slideDownVariants,
126
+ slideLeft: slideLeftVariants,
127
+ slideRight: slideRightVariants
128
+ };
129
+ function useVirtualizedList(items, containerHeight, itemHeight, enabled) {
130
+ const [scrollTop, setScrollTop] = react.useState(0);
131
+ const visibleItems = react.useMemo(() => {
132
+ if (!enabled) return items;
133
+ const startIndex = Math.floor(scrollTop / itemHeight);
134
+ const endIndex = Math.min(
135
+ startIndex + Math.ceil(containerHeight / itemHeight) + 1,
136
+ items.length
137
+ );
138
+ return items.slice(startIndex, endIndex).map((item, index) => ({
139
+ ...item,
140
+ virtualIndex: startIndex + index,
141
+ style: {
142
+ position: "absolute",
143
+ top: (startIndex + index) * itemHeight,
144
+ height: itemHeight,
145
+ width: "100%"
146
+ }
147
+ }));
148
+ }, [items, scrollTop, itemHeight, containerHeight, enabled]);
149
+ const totalHeight = items.length * itemHeight;
150
+ const handleScroll = react.useCallback((e) => {
151
+ setScrollTop(e.currentTarget.scrollTop);
152
+ }, []);
153
+ return {
154
+ visibleItems,
155
+ totalHeight,
156
+ handleScroll
157
+ };
158
+ }
159
+ __name(useVirtualizedList, "useVirtualizedList");
160
+ function AnimatedList({
161
+ items,
162
+ animation = "slideUp",
163
+ staggerDelay = 100,
164
+ duration = 500,
165
+ reorderable = false,
166
+ enableAddRemove = true,
167
+ layout = "vertical",
168
+ gridColumns = 3,
169
+ className,
170
+ itemClassName,
171
+ style,
172
+ onReorder,
173
+ onItemClick,
174
+ showHoverEffects = true,
175
+ customVariants,
176
+ virtualized = false,
177
+ itemHeight = 60,
178
+ containerHeight = 400,
179
+ autoStart = true,
180
+ onAnimationComplete
181
+ }) {
182
+ const [animatedItems, setAnimatedItems] = react.useState(items);
183
+ const [animationKey, setAnimationKey] = react.useState(0);
184
+ const prefersReducedMotion = usePrefersReducedMotion();
185
+ const variants = customVariants || animationVariants[animation];
186
+ const shouldAnimate = !prefersReducedMotion && autoStart;
187
+ const { visibleItems, totalHeight, handleScroll } = useVirtualizedList(
188
+ items,
189
+ containerHeight,
190
+ itemHeight,
191
+ virtualized
192
+ );
193
+ react.useEffect(() => {
194
+ setAnimatedItems(items);
195
+ }, [items]);
196
+ const updatedVariants = react.useMemo(() => {
197
+ if (!variants.visible || typeof variants.visible !== "function")
198
+ return variants;
199
+ return {
200
+ ...variants,
201
+ visible: /* @__PURE__ */ __name((i) => {
202
+ const original = variants.visible;
203
+ const originalResult = original(i);
204
+ return {
205
+ ...originalResult,
206
+ transition: {
207
+ ...originalResult.transition,
208
+ delay: i * (staggerDelay / 1e3),
209
+ duration: duration / 1e3
210
+ }
211
+ };
212
+ }, "visible")
213
+ };
214
+ }, [variants, staggerDelay, duration]);
215
+ const getLayoutClassName = /* @__PURE__ */ __name(() => {
216
+ switch (layout) {
217
+ case "horizontal":
218
+ return "flex flex-row gap-4 overflow-x-auto";
219
+ case "grid":
220
+ return `grid gap-4 grid-cols-${gridColumns}`;
221
+ default:
222
+ return "flex flex-col gap-4";
223
+ }
224
+ }, "getLayoutClassName");
225
+ const renderListItem = /* @__PURE__ */ __name((item, index, virtualStyle) => {
226
+ const itemContent = /* @__PURE__ */ jsxRuntime.jsx(
227
+ react$1.motion.div,
228
+ {
229
+ custom: index,
230
+ variants: updatedVariants,
231
+ initial: shouldAnimate ? "hidden" : "visible",
232
+ animate: "visible",
233
+ exit: "exit",
234
+ layout: enableAddRemove,
235
+ className: utils.cn(
236
+ "cursor-pointer select-none",
237
+ showHoverEffects && "hover:scale-105 transition-transform",
238
+ itemClassName
239
+ ),
240
+ style: virtualStyle,
241
+ onClick: () => onItemClick?.(item, index),
242
+ whileHover: showHoverEffects ? { scale: 1.02 } : void 0,
243
+ whileTap: showHoverEffects ? { scale: 0.98 } : void 0,
244
+ onAnimationComplete: () => {
245
+ if (index === animatedItems.length - 1) {
246
+ onAnimationComplete?.();
247
+ }
248
+ },
249
+ children: item.content
250
+ },
251
+ item.id
252
+ );
253
+ return itemContent;
254
+ }, "renderListItem");
255
+ if (reorderable && !virtualized) {
256
+ return /* @__PURE__ */ jsxRuntime.jsx(
257
+ react$1.Reorder.Group,
258
+ {
259
+ axis: layout === "horizontal" ? "x" : "y",
260
+ values: animatedItems,
261
+ onReorder: (newItems) => {
262
+ setAnimatedItems(newItems);
263
+ onReorder?.(newItems);
264
+ },
265
+ className: utils.cn(getLayoutClassName(), className),
266
+ style,
267
+ children: /* @__PURE__ */ jsxRuntime.jsx(react$1.AnimatePresence, { mode: "popLayout", children: animatedItems.map((item, index) => /* @__PURE__ */ jsxRuntime.jsx(
268
+ react$1.Reorder.Item,
269
+ {
270
+ value: item,
271
+ className: utils.cn(
272
+ "cursor-grab active:cursor-grabbing",
273
+ itemClassName
274
+ ),
275
+ whileDrag: { scale: 1.05, zIndex: 10 },
276
+ children: item.content
277
+ },
278
+ item.id
279
+ )) })
280
+ }
281
+ );
282
+ }
283
+ if (virtualized) {
284
+ return /* @__PURE__ */ jsxRuntime.jsx(
285
+ "div",
286
+ {
287
+ className: utils.cn("overflow-auto", className),
288
+ style: { height: containerHeight, ...style },
289
+ onScroll: handleScroll,
290
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { style: { height: totalHeight, position: "relative" }, children: /* @__PURE__ */ jsxRuntime.jsx(react$1.AnimatePresence, { mode: "popLayout", children: visibleItems.map(
291
+ (item, index) => renderListItem(item, item.virtualIndex || index, item.style)
292
+ ) }) })
293
+ }
294
+ );
295
+ }
296
+ return /* @__PURE__ */ jsxRuntime.jsx(
297
+ react$1.motion.div,
298
+ {
299
+ className: utils.cn(getLayoutClassName(), className),
300
+ style,
301
+ initial: "hidden",
302
+ animate: "visible",
303
+ children: /* @__PURE__ */ jsxRuntime.jsx(react$1.AnimatePresence, { mode: "popLayout", children: animatedItems.map((item, index) => renderListItem(item, index)) })
304
+ },
305
+ animationKey
306
+ );
307
+ }
308
+ __name(AnimatedList, "AnimatedList");
309
+ var AnimatedListPresets = {
310
+ /**
311
+ * Simple fade in list
312
+ */
313
+ FadeList: /* @__PURE__ */ __name((props) => /* @__PURE__ */ jsxRuntime.jsx(AnimatedList, { animation: "fade", ...props }), "FadeList"),
314
+ /**
315
+ * Scale up from center
316
+ */
317
+ ScaleList: /* @__PURE__ */ __name((props) => /* @__PURE__ */ jsxRuntime.jsx(AnimatedList, { animation: "scale", ...props }), "ScaleList"),
318
+ /**
319
+ * Slide up from bottom
320
+ */
321
+ SlideUpList: /* @__PURE__ */ __name((props) => /* @__PURE__ */ jsxRuntime.jsx(AnimatedList, { animation: "slideUp", ...props }), "SlideUpList"),
322
+ /**
323
+ * Horizontal carousel-style list
324
+ */
325
+ CarouselList: /* @__PURE__ */ __name((props) => /* @__PURE__ */ jsxRuntime.jsx(AnimatedList, { layout: "horizontal", animation: "slideLeft", ...props }), "CarouselList"),
326
+ /**
327
+ * Grid with scale animation
328
+ */
329
+ GridList: /* @__PURE__ */ __name((props) => /* @__PURE__ */ jsxRuntime.jsx(AnimatedList, { layout: "grid", animation: "scale", ...props }), "GridList"),
330
+ /**
331
+ * Reorderable task list
332
+ */
333
+ TaskList: /* @__PURE__ */ __name((props) => /* @__PURE__ */ jsxRuntime.jsx(AnimatedList, { reorderable: true, animation: "slideUp", showHoverEffects: true, ...props }), "TaskList")
334
+ };
335
+ var list_default = AnimatedList;
336
+
337
+ exports.AnimatedList = AnimatedList;
338
+ exports.AnimatedListPresets = AnimatedListPresets;
339
+ exports.default = list_default;
@@ -0,0 +1,333 @@
1
+ "use client";
2
+ import { useState, useEffect, useMemo, useCallback } from 'react';
3
+ import { Reorder, AnimatePresence, motion } from 'motion/react';
4
+ import { cn } from '@/lib/utils';
5
+ import { jsx } from 'react/jsx-runtime';
6
+
7
+ var __defProp = Object.defineProperty;
8
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
9
+ function usePrefersReducedMotion() {
10
+ const [prefersReducedMotion, setPrefersReducedMotion] = useState(false);
11
+ useEffect(() => {
12
+ if (typeof window === "undefined") return;
13
+ const mediaQuery = window.matchMedia("(prefers-reduced-motion: reduce)");
14
+ setPrefersReducedMotion(mediaQuery.matches);
15
+ const handleChange = /* @__PURE__ */ __name((event) => {
16
+ setPrefersReducedMotion(event.matches);
17
+ }, "handleChange");
18
+ mediaQuery.addEventListener("change", handleChange);
19
+ return () => mediaQuery.removeEventListener("change", handleChange);
20
+ }, []);
21
+ return prefersReducedMotion;
22
+ }
23
+ __name(usePrefersReducedMotion, "usePrefersReducedMotion");
24
+ var slideVariants = {
25
+ hidden: { opacity: 0, x: -50 },
26
+ visible: /* @__PURE__ */ __name((i) => ({
27
+ opacity: 1,
28
+ x: 0,
29
+ transition: {
30
+ delay: i * 0.1,
31
+ duration: 0.5,
32
+ ease: "easeOut"
33
+ }
34
+ }), "visible"),
35
+ exit: { opacity: 0, x: 50, transition: { duration: 0.3 } }
36
+ };
37
+ var fadeVariants = {
38
+ hidden: { opacity: 0 },
39
+ visible: /* @__PURE__ */ __name((i) => ({
40
+ opacity: 1,
41
+ transition: {
42
+ delay: i * 0.1,
43
+ duration: 0.5,
44
+ ease: "easeOut"
45
+ }
46
+ }), "visible"),
47
+ exit: { opacity: 0, transition: { duration: 0.3 } }
48
+ };
49
+ var scaleVariants = {
50
+ hidden: { opacity: 0, scale: 0.8 },
51
+ visible: /* @__PURE__ */ __name((i) => ({
52
+ opacity: 1,
53
+ scale: 1,
54
+ transition: {
55
+ delay: i * 0.1,
56
+ duration: 0.5,
57
+ ease: "easeOut",
58
+ type: "spring",
59
+ stiffness: 100
60
+ }
61
+ }), "visible"),
62
+ exit: { opacity: 0, scale: 0.8, transition: { duration: 0.3 } }
63
+ };
64
+ var slideUpVariants = {
65
+ hidden: { opacity: 0, y: 50 },
66
+ visible: /* @__PURE__ */ __name((i) => ({
67
+ opacity: 1,
68
+ y: 0,
69
+ transition: {
70
+ delay: i * 0.1,
71
+ duration: 0.5,
72
+ ease: "easeOut"
73
+ }
74
+ }), "visible"),
75
+ exit: { opacity: 0, y: -50, transition: { duration: 0.3 } }
76
+ };
77
+ var slideDownVariants = {
78
+ hidden: { opacity: 0, y: -50 },
79
+ visible: /* @__PURE__ */ __name((i) => ({
80
+ opacity: 1,
81
+ y: 0,
82
+ transition: {
83
+ delay: i * 0.1,
84
+ duration: 0.5,
85
+ ease: "easeOut"
86
+ }
87
+ }), "visible"),
88
+ exit: { opacity: 0, y: 50, transition: { duration: 0.3 } }
89
+ };
90
+ var slideLeftVariants = {
91
+ hidden: { opacity: 0, x: 50 },
92
+ visible: /* @__PURE__ */ __name((i) => ({
93
+ opacity: 1,
94
+ x: 0,
95
+ transition: {
96
+ delay: i * 0.1,
97
+ duration: 0.5,
98
+ ease: "easeOut"
99
+ }
100
+ }), "visible"),
101
+ exit: { opacity: 0, x: -50, transition: { duration: 0.3 } }
102
+ };
103
+ var slideRightVariants = {
104
+ hidden: { opacity: 0, x: -50 },
105
+ visible: /* @__PURE__ */ __name((i) => ({
106
+ opacity: 1,
107
+ x: 0,
108
+ transition: {
109
+ delay: i * 0.1,
110
+ duration: 0.5,
111
+ ease: "easeOut"
112
+ }
113
+ }), "visible"),
114
+ exit: { opacity: 0, x: 50, transition: { duration: 0.3 } }
115
+ };
116
+ var animationVariants = {
117
+ slide: slideVariants,
118
+ fade: fadeVariants,
119
+ scale: scaleVariants,
120
+ slideUp: slideUpVariants,
121
+ slideDown: slideDownVariants,
122
+ slideLeft: slideLeftVariants,
123
+ slideRight: slideRightVariants
124
+ };
125
+ function useVirtualizedList(items, containerHeight, itemHeight, enabled) {
126
+ const [scrollTop, setScrollTop] = useState(0);
127
+ const visibleItems = useMemo(() => {
128
+ if (!enabled) return items;
129
+ const startIndex = Math.floor(scrollTop / itemHeight);
130
+ const endIndex = Math.min(
131
+ startIndex + Math.ceil(containerHeight / itemHeight) + 1,
132
+ items.length
133
+ );
134
+ return items.slice(startIndex, endIndex).map((item, index) => ({
135
+ ...item,
136
+ virtualIndex: startIndex + index,
137
+ style: {
138
+ position: "absolute",
139
+ top: (startIndex + index) * itemHeight,
140
+ height: itemHeight,
141
+ width: "100%"
142
+ }
143
+ }));
144
+ }, [items, scrollTop, itemHeight, containerHeight, enabled]);
145
+ const totalHeight = items.length * itemHeight;
146
+ const handleScroll = useCallback((e) => {
147
+ setScrollTop(e.currentTarget.scrollTop);
148
+ }, []);
149
+ return {
150
+ visibleItems,
151
+ totalHeight,
152
+ handleScroll
153
+ };
154
+ }
155
+ __name(useVirtualizedList, "useVirtualizedList");
156
+ function AnimatedList({
157
+ items,
158
+ animation = "slideUp",
159
+ staggerDelay = 100,
160
+ duration = 500,
161
+ reorderable = false,
162
+ enableAddRemove = true,
163
+ layout = "vertical",
164
+ gridColumns = 3,
165
+ className,
166
+ itemClassName,
167
+ style,
168
+ onReorder,
169
+ onItemClick,
170
+ showHoverEffects = true,
171
+ customVariants,
172
+ virtualized = false,
173
+ itemHeight = 60,
174
+ containerHeight = 400,
175
+ autoStart = true,
176
+ onAnimationComplete
177
+ }) {
178
+ const [animatedItems, setAnimatedItems] = useState(items);
179
+ const [animationKey, setAnimationKey] = useState(0);
180
+ const prefersReducedMotion = usePrefersReducedMotion();
181
+ const variants = customVariants || animationVariants[animation];
182
+ const shouldAnimate = !prefersReducedMotion && autoStart;
183
+ const { visibleItems, totalHeight, handleScroll } = useVirtualizedList(
184
+ items,
185
+ containerHeight,
186
+ itemHeight,
187
+ virtualized
188
+ );
189
+ useEffect(() => {
190
+ setAnimatedItems(items);
191
+ }, [items]);
192
+ const updatedVariants = useMemo(() => {
193
+ if (!variants.visible || typeof variants.visible !== "function")
194
+ return variants;
195
+ return {
196
+ ...variants,
197
+ visible: /* @__PURE__ */ __name((i) => {
198
+ const original = variants.visible;
199
+ const originalResult = original(i);
200
+ return {
201
+ ...originalResult,
202
+ transition: {
203
+ ...originalResult.transition,
204
+ delay: i * (staggerDelay / 1e3),
205
+ duration: duration / 1e3
206
+ }
207
+ };
208
+ }, "visible")
209
+ };
210
+ }, [variants, staggerDelay, duration]);
211
+ const getLayoutClassName = /* @__PURE__ */ __name(() => {
212
+ switch (layout) {
213
+ case "horizontal":
214
+ return "flex flex-row gap-4 overflow-x-auto";
215
+ case "grid":
216
+ return `grid gap-4 grid-cols-${gridColumns}`;
217
+ default:
218
+ return "flex flex-col gap-4";
219
+ }
220
+ }, "getLayoutClassName");
221
+ const renderListItem = /* @__PURE__ */ __name((item, index, virtualStyle) => {
222
+ const itemContent = /* @__PURE__ */ jsx(
223
+ motion.div,
224
+ {
225
+ custom: index,
226
+ variants: updatedVariants,
227
+ initial: shouldAnimate ? "hidden" : "visible",
228
+ animate: "visible",
229
+ exit: "exit",
230
+ layout: enableAddRemove,
231
+ className: cn(
232
+ "cursor-pointer select-none",
233
+ showHoverEffects && "hover:scale-105 transition-transform",
234
+ itemClassName
235
+ ),
236
+ style: virtualStyle,
237
+ onClick: () => onItemClick?.(item, index),
238
+ whileHover: showHoverEffects ? { scale: 1.02 } : void 0,
239
+ whileTap: showHoverEffects ? { scale: 0.98 } : void 0,
240
+ onAnimationComplete: () => {
241
+ if (index === animatedItems.length - 1) {
242
+ onAnimationComplete?.();
243
+ }
244
+ },
245
+ children: item.content
246
+ },
247
+ item.id
248
+ );
249
+ return itemContent;
250
+ }, "renderListItem");
251
+ if (reorderable && !virtualized) {
252
+ return /* @__PURE__ */ jsx(
253
+ Reorder.Group,
254
+ {
255
+ axis: layout === "horizontal" ? "x" : "y",
256
+ values: animatedItems,
257
+ onReorder: (newItems) => {
258
+ setAnimatedItems(newItems);
259
+ onReorder?.(newItems);
260
+ },
261
+ className: cn(getLayoutClassName(), className),
262
+ style,
263
+ children: /* @__PURE__ */ jsx(AnimatePresence, { mode: "popLayout", children: animatedItems.map((item, index) => /* @__PURE__ */ jsx(
264
+ Reorder.Item,
265
+ {
266
+ value: item,
267
+ className: cn(
268
+ "cursor-grab active:cursor-grabbing",
269
+ itemClassName
270
+ ),
271
+ whileDrag: { scale: 1.05, zIndex: 10 },
272
+ children: item.content
273
+ },
274
+ item.id
275
+ )) })
276
+ }
277
+ );
278
+ }
279
+ if (virtualized) {
280
+ return /* @__PURE__ */ jsx(
281
+ "div",
282
+ {
283
+ className: cn("overflow-auto", className),
284
+ style: { height: containerHeight, ...style },
285
+ onScroll: handleScroll,
286
+ children: /* @__PURE__ */ jsx("div", { style: { height: totalHeight, position: "relative" }, children: /* @__PURE__ */ jsx(AnimatePresence, { mode: "popLayout", children: visibleItems.map(
287
+ (item, index) => renderListItem(item, item.virtualIndex || index, item.style)
288
+ ) }) })
289
+ }
290
+ );
291
+ }
292
+ return /* @__PURE__ */ jsx(
293
+ motion.div,
294
+ {
295
+ className: cn(getLayoutClassName(), className),
296
+ style,
297
+ initial: "hidden",
298
+ animate: "visible",
299
+ children: /* @__PURE__ */ jsx(AnimatePresence, { mode: "popLayout", children: animatedItems.map((item, index) => renderListItem(item, index)) })
300
+ },
301
+ animationKey
302
+ );
303
+ }
304
+ __name(AnimatedList, "AnimatedList");
305
+ var AnimatedListPresets = {
306
+ /**
307
+ * Simple fade in list
308
+ */
309
+ FadeList: /* @__PURE__ */ __name((props) => /* @__PURE__ */ jsx(AnimatedList, { animation: "fade", ...props }), "FadeList"),
310
+ /**
311
+ * Scale up from center
312
+ */
313
+ ScaleList: /* @__PURE__ */ __name((props) => /* @__PURE__ */ jsx(AnimatedList, { animation: "scale", ...props }), "ScaleList"),
314
+ /**
315
+ * Slide up from bottom
316
+ */
317
+ SlideUpList: /* @__PURE__ */ __name((props) => /* @__PURE__ */ jsx(AnimatedList, { animation: "slideUp", ...props }), "SlideUpList"),
318
+ /**
319
+ * Horizontal carousel-style list
320
+ */
321
+ CarouselList: /* @__PURE__ */ __name((props) => /* @__PURE__ */ jsx(AnimatedList, { layout: "horizontal", animation: "slideLeft", ...props }), "CarouselList"),
322
+ /**
323
+ * Grid with scale animation
324
+ */
325
+ GridList: /* @__PURE__ */ __name((props) => /* @__PURE__ */ jsx(AnimatedList, { layout: "grid", animation: "scale", ...props }), "GridList"),
326
+ /**
327
+ * Reorderable task list
328
+ */
329
+ TaskList: /* @__PURE__ */ __name((props) => /* @__PURE__ */ jsx(AnimatedList, { reorderable: true, animation: "slideUp", showHoverEffects: true, ...props }), "TaskList")
330
+ };
331
+ var list_default = AnimatedList;
332
+
333
+ export { AnimatedList, AnimatedListPresets, list_default as default };