@catalystsoftware/ui 1.0.5 → 1.0.6

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 (155) hide show
  1. package/dist/data/data.tsx +29 -29
  2. package/dist/data/tailwind.config.js +3821 -261
  3. package/dist/data.tsx +29 -29
  4. package/package.json +4 -3
  5. package/components/catalyst-ui/buttons/burger.tsx +0 -207
  6. package/components/catalyst-ui/core/data-display/timeline.tsx +0 -210
  7. package/components/catalyst-ui/core/feedback/alert.tsx +0 -491
  8. package/components/catalyst-ui/core/feedback/spinner-1.tsx +0 -65
  9. package/components/catalyst-ui/core/feedback/toast.tsx +0 -1857
  10. package/components/catalyst-ui/core/navigation/menu.tsx +0 -164
  11. package/components/catalyst-ui/forms/toggle-class.tsx +0 -176
  12. package/components/catalyst-ui/hooks/use-copy-to-clipboard.tsx +0 -419
  13. package/components/catalyst-ui/hooks/use-counter.tsx +0 -13
  14. package/components/catalyst-ui/hooks/use-event-listener.tsx +0 -23
  15. package/components/catalyst-ui/hooks/use-export-markdown.tsx +0 -47
  16. package/components/catalyst-ui/hooks/use-focus.tsx +0 -17
  17. package/components/catalyst-ui/hooks/use-interval.tsx +0 -23
  18. package/components/catalyst-ui/hooks/use-is-client.tsx +0 -16
  19. package/components/catalyst-ui/hooks/use-media-query.tsx +0 -19
  20. package/components/catalyst-ui/hooks/use-mobile.tsx +0 -19
  21. package/components/catalyst-ui/hooks/use-resize-observer.tsx +0 -81
  22. package/components/catalyst-ui/hooks/use-timeout.tsx +0 -21
  23. package/components/catalyst-ui/hooks/use-timer.tsx +0 -209
  24. package/components/catalyst-ui/hooks/use-toggle.tsx +0 -12
  25. package/components/catalyst-ui/media/image.tsx +0 -13
  26. package/components/catalyst-ui/overlays/dual-sidebar.tsx +0 -4142
  27. package/components/catalyst-ui/overlays/sidebar-original.tsx +0 -726
  28. package/components/catalyst-ui/primitives/accordion.tsx +0 -250
  29. package/components/catalyst-ui/primitives/alert-dialog.tsx +0 -126
  30. package/components/catalyst-ui/primitives/aspect-ratio.tsx +0 -9
  31. package/components/catalyst-ui/primitives/avatar.tsx +0 -296
  32. package/components/catalyst-ui/primitives/badge.tsx +0 -57
  33. package/components/catalyst-ui/primitives/breadcrumb.tsx +0 -101
  34. package/components/catalyst-ui/primitives/button.tsx +0 -265
  35. package/components/catalyst-ui/primitives/calendar-v4.tsx +0 -208
  36. package/components/catalyst-ui/primitives/calendar.tsx +0 -295
  37. package/components/catalyst-ui/primitives/card.tsx +0 -618
  38. package/components/catalyst-ui/primitives/carousel.tsx +0 -238
  39. package/components/catalyst-ui/primitives/chart.tsx +0 -347
  40. package/components/catalyst-ui/primitives/checkbox.tsx +0 -225
  41. package/components/catalyst-ui/primitives/collapsible.tsx +0 -212
  42. package/components/catalyst-ui/primitives/command.tsx +0 -393
  43. package/components/catalyst-ui/primitives/context-menu.tsx +0 -236
  44. package/components/catalyst-ui/primitives/dialog.tsx +0 -471
  45. package/components/catalyst-ui/primitives/drawer.tsx +0 -761
  46. package/components/catalyst-ui/primitives/dropdown-menu.tsx +0 -290
  47. package/components/catalyst-ui/primitives/empty.tsx +0 -104
  48. package/components/catalyst-ui/primitives/field.tsx +0 -244
  49. package/components/catalyst-ui/primitives/hover-card.tsx +0 -124
  50. package/components/catalyst-ui/primitives/input-otp.tsx +0 -76
  51. package/components/catalyst-ui/primitives/input.tsx +0 -64
  52. package/components/catalyst-ui/primitives/item.tsx +0 -196
  53. package/components/catalyst-ui/primitives/kbd.tsx +0 -75
  54. package/components/catalyst-ui/primitives/label.tsx +0 -24
  55. package/components/catalyst-ui/primitives/navigation-menu.tsx +0 -150
  56. package/components/catalyst-ui/primitives/pagination.tsx +0 -198
  57. package/components/catalyst-ui/primitives/popover.tsx +0 -232
  58. package/components/catalyst-ui/primitives/progress.tsx +0 -34
  59. package/components/catalyst-ui/primitives/radio-group.tsx +0 -43
  60. package/components/catalyst-ui/primitives/resizable.tsx +0 -56
  61. package/components/catalyst-ui/primitives/select.tsx +0 -155
  62. package/components/catalyst-ui/primitives/separator.tsx +0 -74
  63. package/components/catalyst-ui/primitives/sheet.tsx +0 -126
  64. package/components/catalyst-ui/primitives/skeleton.tsx +0 -15
  65. package/components/catalyst-ui/primitives/slider.tsx +0 -27
  66. package/components/catalyst-ui/primitives/switch.tsx +0 -187
  67. package/components/catalyst-ui/primitives/tabs.tsx +0 -335
  68. package/components/catalyst-ui/primitives/textarea.tsx +0 -24
  69. package/components/catalyst-ui/primitives/toggle-group.tsx +0 -55
  70. package/components/catalyst-ui/primitives/toggle.tsx +0 -42
  71. package/components/catalyst-ui/primitives/tooltip.tsx +0 -116
  72. package/components/catalyst-ui/utils/basic-auth.tsx +0 -40
  73. package/components/catalyst-ui/utils/context-storage.tsx +0 -19
  74. package/components/catalyst-ui/utils/cors-middleware.tsx +0 -71
  75. package/components/catalyst-ui/utils/deferred-content.tsx +0 -595
  76. package/components/catalyst-ui/utils/honeypot-middleware.tsx +0 -38
  77. package/components/catalyst-ui/utils/incId.tsx +0 -75
  78. package/components/catalyst-ui/utils/jwk-auth.tsx +0 -36
  79. package/components/catalyst-ui/utils/request-id.tsx +0 -14
  80. package/components/catalyst-ui/utils/secure-headers.tsx +0 -37
  81. package/components/catalyst-ui/utils/server-timing.tsx +0 -23
  82. package/components/catalyst-ui/utils/utils.ts +0 -43
  83. package/components/catalyst-ui/utils/with-cookie.tsx +0 -43
  84. package/components/catalyst-ui/x/accordian-x.tsx +0 -428
  85. package/components/catalyst-ui/x/alert-x.tsx +0 -413
  86. package/components/catalyst-ui/x/animated-text-x.tsx +0 -2242
  87. package/components/catalyst-ui/x/avatar-x.tsx +0 -515
  88. package/components/catalyst-ui/x/badge-x.tsx +0 -670
  89. package/components/catalyst-ui/x/button-X.tsx +0 -2857
  90. package/components/catalyst-ui/x/button-group-x.tsx +0 -847
  91. package/components/catalyst-ui/x/calendar-x.tsx +0 -1910
  92. package/components/catalyst-ui/x/card-x.tsx +0 -2597
  93. package/components/catalyst-ui/x/checkbox-x.tsx +0 -656
  94. package/components/catalyst-ui/x/collapsible-x.tsx +0 -1360
  95. package/components/catalyst-ui/x/combobox-x.tsx +0 -911
  96. package/components/catalyst-ui/x/data-table-x.tsx +0 -1753
  97. package/components/catalyst-ui/x/date-picker-x.tsx +0 -648
  98. package/components/catalyst-ui/x/dialog-x.tsx +0 -659
  99. package/components/catalyst-ui/x/dropdown-menu-x.tsx +0 -612
  100. package/components/catalyst-ui/x/hover-card-x.tsx +0 -375
  101. package/components/catalyst-ui/x/icon-x.tsx +0 -840
  102. package/components/catalyst-ui/x/input-mask-x.tsx +0 -981
  103. package/components/catalyst-ui/x/input-otp-x.tsx +0 -659
  104. package/components/catalyst-ui/x/loader-x.tsx +0 -1757
  105. package/components/catalyst-ui/x/pagination-x.tsx +0 -622
  106. package/components/catalyst-ui/x/popover-x.tsx +0 -744
  107. package/components/catalyst-ui/x/radio-group-x.tsx +0 -499
  108. package/components/catalyst-ui/x/select-x.tsx +0 -1127
  109. package/components/catalyst-ui/x/sheet-x.tsx +0 -668
  110. package/components/catalyst-ui/x/switch-x.tsx +0 -681
  111. package/components/catalyst-ui/x/table-x.tsx +0 -574
  112. package/components/catalyst-ui/x/tabs-x.tsx +0 -839
  113. package/components/catalyst-ui/x/textarea-x.tsx +0 -1263
  114. package/components/catalyst-ui/x/tooltip-x.tsx +0 -396
  115. package/components/catalyst-ui/x/tracker-x.tsx +0 -560
  116. package/data/bg-data.tsx +0 -901
  117. package/data/buttons-data.tsx +0 -2327
  118. package/data/charts-data.tsx +0 -102
  119. package/data/chat-data.tsx +0 -83
  120. package/data/code-data.tsx +0 -1040
  121. package/data/comboboxes-data.tsx +0 -1843
  122. package/data/command-data.tsx +0 -1381
  123. package/data/core-data.tsx +0 -15953
  124. package/data/crm-data.tsx +0 -47
  125. package/data/data.tsx +0 -159
  126. package/data/date-and-time-data.tsx +0 -554
  127. package/data/dependencies.tsx +0 -7
  128. package/data/ecommerce-data.tsx +0 -1387
  129. package/data/forms-data.tsx +0 -7890
  130. package/data/hooks-data.tsx +0 -5487
  131. package/data/index.ts +0 -34
  132. package/data/inputs-data.tsx +0 -557
  133. package/data/interactive-data.tsx +0 -5394
  134. package/data/lofi-data.tsx +0 -18295
  135. package/data/marketing-data.tsx +0 -2546
  136. package/data/media-data.tsx +0 -1510
  137. package/data/motion-data.tsx +0 -5801
  138. package/data/overlay-data.tsx +0 -4136
  139. package/data/pdf-data.tsx +0 -124
  140. package/data/pos-data.tsx +0 -213
  141. package/data/postcss.config.js +0 -6
  142. package/data/primitive-data.tsx +0 -5170
  143. package/data/prompt-data.tsx +0 -1226
  144. package/data/requiredLibs.ts +0 -4
  145. package/data/sandbox-data.tsx +0 -1
  146. package/data/sidebars-data.tsx +0 -5421
  147. package/data/stacks-data.tsx +0 -32
  148. package/data/table-data.tsx +0 -706
  149. package/data/tailwind.config.js +0 -270
  150. package/data/tailwind.config.ngin.js +0 -3830
  151. package/data/tailwind.css +0 -431
  152. package/data/tools-data.tsx +0 -6910
  153. package/data/typography-data.tsx +0 -2050
  154. package/data/utils-data.tsx +0 -6500
  155. package/data/x-data.tsx +0 -1171
@@ -1,1757 +0,0 @@
1
-
2
- import { motion } from "motion/react";
3
- import React, { useState, useEffect, ComponentProps, useCallback, useRef } from "react";
4
- import { cva, type VariantProps } from 'class-variance-authority'
5
- import { cn, Card, SpinnerV2 } from "~/components/catalyst-ui"
6
- import { Loader2, LoaderCircleIcon, LoaderIcon, LoaderPinwheelIcon, type LucideProps, } from 'lucide-react';
7
- // @devsearch app/components/catalyst-ui/data/core-data.tsx:loaderX
8
-
9
- export type LoaderProps = LucideProps & {
10
- variant?: 'default' | 'circle' | 'pinwheel' | 'circle-filled' | 'ellipsis' | 'ring' | 'bars' | 'infinite';
11
- size?: number | string;
12
- strokeWidth?: number;
13
- fill?: string;
14
- animationDuration?: string;
15
- style?: React.CSSProperties;
16
- spinning?: boolean;
17
- delay?: number;
18
- tip?: string;
19
- indicator?: React.ReactNode;
20
- text?: string;
21
- subText?: string;
22
- frames?: number[][];
23
- dotClassName?: string;
24
- isPlaying?: boolean;
25
- duration?: number;
26
- repeatCount?: number;
27
- onComplete?: () => void;
28
- outerSize?: string;
29
- childSize?: string;
30
- className?: string;
31
- wrapperClassName?: string;
32
- children?: React.ReactNode;
33
- };
34
-
35
- export const loaderVariants = cva(
36
- "animate-spin rounded-full border-2 border-solid border-current border-r-transparent",
37
- {
38
- variants: {
39
- size: {
40
- default: {
41
- container: "size-8",
42
- titleClass: "text-sm/tight font-medium",
43
- subtitleClass: "text-xs/relaxed",
44
- spacing: "space-y-2",
45
- maxWidth: "max-w-8",
46
- },
47
- sm: {
48
- container: "size-20",
49
- titleClass: "text-sm/tight font-medium",
50
- subtitleClass: "text-xs/relaxed",
51
- spacing: "space-y-2",
52
- maxWidth: "max-w-48",
53
- },
54
- md: {
55
- container: "size-32",
56
- titleClass: "text-base/snug font-medium",
57
- subtitleClass: "text-sm/relaxed",
58
- spacing: "space-y-3",
59
- maxWidth: "max-w-56",
60
- },
61
- lg: {
62
- container: "size-40",
63
- titleClass: "text-lg/tight font-semibold",
64
- subtitleClass: "text-base/relaxed",
65
- spacing: "space-y-4",
66
- maxWidth: "max-w-64",
67
- },
68
- }
69
- },
70
- defaultVariants: {
71
- size: "default",
72
- },
73
- }
74
- )
75
-
76
- export function LoaderX({ variant = 'default', ...props }: LoaderProps) {
77
- switch (variant) {
78
- case 'circle':
79
- return <Circle {...props} />;
80
- case 'pinwheel':
81
- return <Pinwheel {...props} />;
82
- case 'circle-filled':
83
- return <CircleFilled {...props} />;
84
- case 'ellipsis':
85
- return <Ellipsis {...props} />;
86
- case 'ring':
87
- return <Ring {...props} />;
88
- case 'bars':
89
- return <Bars {...props} />;
90
- case 'infinite':
91
- return <Infinite {...props} />;
92
- case '1':
93
- return <LoaderOne {...props} />;
94
- case '2':
95
- return <LoaderTwo {...props} />;
96
- case '3':
97
- return <LoaderThree {...props} />;
98
- case '4':
99
- return <LoaderFour {...props} />;
100
- case '5':
101
- return <LoaderFive {...props} />;
102
- case '6':
103
- return <LoaderSix {...props} />;
104
- case '7':
105
- return <LoaderSeven {...props} />;
106
- case '8':
107
- return <LoaderEight {...props} />;
108
- case '9':
109
- return <LoaderNine {...props} />;
110
- case '10':
111
- return <LoaderTen {...props} />;
112
- case '11':
113
- return <LoaderEleven {...props} />;
114
- case '12':
115
- return <LoaderTwelve {...props} />;
116
- case '13':
117
- return <LoaderThirteen {...props} />;
118
- case '14':
119
- return <LoaderFourteen {...props} />;
120
- case '15':
121
- return <LoaderFifteen {...props} />;
122
- case '16':
123
- return <LoaderSixteen {...props} />;
124
- case '17':
125
- return <LoaderSeventeen {...props} />;
126
- case '18':
127
- return <LoaderEighteen {...props} />;
128
- case '19':
129
- return <LoaderNineteen {...props} />;
130
- case '20':
131
- return <LoaderTwenty {...props} />;
132
- case '21':
133
- return <LoaderTwentyOne {...props} />;
134
- case '22':
135
- return <LoaderTwentyTwo {...props} />;
136
- case 'default':
137
- default:
138
- return <Default {...props} />;
139
- }
140
- }
141
-
142
-
143
-
144
-
145
- function LoaderTwentyTwo({
146
- title = "Configuring your account...",
147
- subtitle = "Please wait while we prepare everything for you",
148
- size = "md",
149
- className,
150
- ...props
151
- }: LoaderProps) {
152
- const sizeConfig = {
153
- sm: {
154
- container: "size-20",
155
- titleClass: "text-sm/tight font-medium",
156
- subtitleClass: "text-xs/relaxed",
157
- spacing: "space-y-2",
158
- maxWidth: "max-w-48",
159
- },
160
- md: {
161
- container: "size-32",
162
- titleClass: "text-base/snug font-medium",
163
- subtitleClass: "text-sm/relaxed",
164
- spacing: "space-y-3",
165
- maxWidth: "max-w-56",
166
- },
167
- lg: {
168
- container: "size-40",
169
- titleClass: "text-lg/tight font-semibold",
170
- subtitleClass: "text-base/relaxed",
171
- spacing: "space-y-4",
172
- maxWidth: "max-w-64",
173
- },
174
- };
175
-
176
- const config = sizeConfig[size];
177
-
178
- return (
179
- <div
180
- className={cn(
181
- "flex flex-col items-center justify-center gap-8 p-8",
182
- className
183
- )}
184
- {...props}
185
- >
186
- {/* Enhanced Monochrome Loader */}
187
- <motion.div
188
- className={cn("relative", config.container)}
189
- animate={{
190
- scale: [1, 1.02, 1],
191
- }}
192
- transition={{
193
- duration: 4,
194
- repeat: Number.POSITIVE_INFINITY,
195
- ease: [0.4, 0, 0.6, 1],
196
- }}
197
- >
198
- {/* Outer elegant ring with shimmer */}
199
- <motion.div
200
- className="absolute inset-0 rounded-full"
201
- style={{
202
- background: `conic-gradient(from 0deg, transparent 0deg, rgb(0, 0, 0) 90deg, transparent 180deg)`,
203
- mask: `radial-gradient(circle at 50% 50%, transparent 35%, black 37%, black 39%, transparent 41%)`,
204
- WebkitMask: `radial-gradient(circle at 50% 50%, transparent 35%, black 37%, black 39%, transparent 41%)`,
205
- opacity: 0.8,
206
- }}
207
- animate={{
208
- rotate: [0, 360],
209
- }}
210
- transition={{
211
- duration: 3,
212
- repeat: Number.POSITIVE_INFINITY,
213
- ease: "linear",
214
- }}
215
- />
216
-
217
- {/* Primary animated ring with gradient */}
218
- <motion.div
219
- className="absolute inset-0 rounded-full"
220
- style={{
221
- background: `conic-gradient(from 0deg, transparent 0deg, rgb(0, 0, 0) 120deg, rgba(0, 0, 0, 0.5) 240deg, transparent 360deg)`,
222
- mask: `radial-gradient(circle at 50% 50%, transparent 42%, black 44%, black 48%, transparent 50%)`,
223
- WebkitMask: `radial-gradient(circle at 50% 50%, transparent 42%, black 44%, black 48%, transparent 50%)`,
224
- opacity: 0.9,
225
- }}
226
- animate={{
227
- rotate: [0, 360],
228
- }}
229
- transition={{
230
- duration: 2.5,
231
- repeat: Number.POSITIVE_INFINITY,
232
- ease: [0.4, 0, 0.6, 1],
233
- }}
234
- />
235
-
236
- {/* Secondary elegant ring - counter rotation */}
237
- <motion.div
238
- className="absolute inset-0 rounded-full"
239
- style={{
240
- background: `conic-gradient(from 180deg, transparent 0deg, rgba(0, 0, 0, 0.6) 45deg, transparent 90deg)`,
241
- mask: `radial-gradient(circle at 50% 50%, transparent 52%, black 54%, black 56%, transparent 58%)`,
242
- WebkitMask: `radial-gradient(circle at 50% 50%, transparent 52%, black 54%, black 56%, transparent 58%)`,
243
- opacity: 0.35,
244
- }}
245
- animate={{
246
- rotate: [0, -360],
247
- }}
248
- transition={{
249
- duration: 4,
250
- repeat: Number.POSITIVE_INFINITY,
251
- ease: [0.4, 0, 0.6, 1],
252
- }}
253
- />
254
-
255
- {/* Accent particles */}
256
- <motion.div
257
- className="absolute inset-0 rounded-full"
258
- style={{
259
- background: `conic-gradient(from 270deg, transparent 0deg, rgba(0, 0, 0, 0.4) 20deg, transparent 40deg)`,
260
- mask: `radial-gradient(circle at 50% 50%, transparent 61%, black 62%, black 63%, transparent 64%)`,
261
- WebkitMask: `radial-gradient(circle at 50% 50%, transparent 61%, black 62%, black 63%, transparent 64%)`,
262
- opacity: 0.5,
263
- }}
264
- animate={{
265
- rotate: [0, 360],
266
- }}
267
- transition={{
268
- duration: 3.5,
269
- repeat: Number.POSITIVE_INFINITY,
270
- ease: "linear",
271
- }}
272
- />
273
-
274
- {/* Dark mode variants */}
275
- <motion.div
276
- className="absolute inset-0 rounded-full dark:block hidden"
277
- style={{
278
- background: `conic-gradient(from 0deg, transparent 0deg, rgb(255, 255, 255) 90deg, transparent 180deg)`,
279
- mask: `radial-gradient(circle at 50% 50%, transparent 35%, black 37%, black 39%, transparent 41%)`,
280
- WebkitMask: `radial-gradient(circle at 50% 50%, transparent 35%, black 37%, black 39%, transparent 41%)`,
281
- opacity: 0.8,
282
- }}
283
- animate={{
284
- rotate: [0, 360],
285
- }}
286
- transition={{
287
- duration: 3,
288
- repeat: Number.POSITIVE_INFINITY,
289
- ease: "linear",
290
- }}
291
- />
292
-
293
- <motion.div
294
- className="absolute inset-0 rounded-full dark:block hidden"
295
- style={{
296
- background: `conic-gradient(from 0deg, transparent 0deg, rgb(255, 255, 255) 120deg, rgba(255, 255, 255, 0.5) 240deg, transparent 360deg)`,
297
- mask: `radial-gradient(circle at 50% 50%, transparent 42%, black 44%, black 48%, transparent 50%)`,
298
- WebkitMask: `radial-gradient(circle at 50% 50%, transparent 42%, black 44%, black 48%, transparent 50%)`,
299
- opacity: 0.9,
300
- }}
301
- animate={{
302
- rotate: [0, 360],
303
- }}
304
- transition={{
305
- duration: 2.5,
306
- repeat: Number.POSITIVE_INFINITY,
307
- ease: [0.4, 0, 0.6, 1],
308
- }}
309
- />
310
-
311
- <motion.div
312
- className="absolute inset-0 rounded-full dark:block hidden"
313
- style={{
314
- background: `conic-gradient(from 180deg, transparent 0deg, rgba(255, 255, 255, 0.6) 45deg, transparent 90deg)`,
315
- mask: `radial-gradient(circle at 50% 50%, transparent 52%, black 54%, black 56%, transparent 58%)`,
316
- WebkitMask: `radial-gradient(circle at 50% 50%, transparent 52%, black 54%, black 56%, transparent 58%)`,
317
- opacity: 0.35,
318
- }}
319
- animate={{
320
- rotate: [0, -360],
321
- }}
322
- transition={{
323
- duration: 4,
324
- repeat: Number.POSITIVE_INFINITY,
325
- ease: [0.4, 0, 0.6, 1],
326
- }}
327
- />
328
-
329
- <motion.div
330
- className="absolute inset-0 rounded-full dark:block hidden"
331
- style={{
332
- background: `conic-gradient(from 270deg, transparent 0deg, rgba(255, 255, 255, 0.4) 20deg, transparent 40deg)`,
333
- mask: `radial-gradient(circle at 50% 50%, transparent 61%, black 62%, black 63%, transparent 64%)`,
334
- WebkitMask: `radial-gradient(circle at 50% 50%, transparent 61%, black 62%, black 63%, transparent 64%)`,
335
- opacity: 0.5,
336
- }}
337
- animate={{
338
- rotate: [0, 360],
339
- }}
340
- transition={{
341
- duration: 3.5,
342
- repeat: Number.POSITIVE_INFINITY,
343
- ease: "linear",
344
- }}
345
- />
346
- </motion.div>
347
-
348
- {/* Enhanced Typography with Breathing Animation */}
349
- <motion.div
350
- className={cn("text-center", config.spacing, config.maxWidth)}
351
- initial={{ opacity: 0, y: 12 }}
352
- animate={{
353
- opacity: 1,
354
- y: 0,
355
- }}
356
- transition={{
357
- delay: 0.4,
358
- duration: 1,
359
- ease: [0.4, 0, 0.2, 1],
360
- }}
361
- >
362
- {/* Clean title with subtle animation */}
363
- <motion.h1
364
- className={cn(
365
- config.titleClass,
366
- "text-black/90 dark:text-white/90 font-medium tracking-[-0.02em] leading-[1.15] antialiased"
367
- )}
368
- initial={{ opacity: 0, y: 12 }}
369
- animate={{
370
- opacity: 1,
371
- y: 0,
372
- }}
373
- transition={{
374
- delay: 0.6,
375
- duration: 0.8,
376
- ease: [0.4, 0, 0.2, 1],
377
- }}
378
- >
379
- <motion.span
380
- animate={{
381
- opacity: [0.9, 0.7, 0.9],
382
- }}
383
- transition={{
384
- duration: 3,
385
- repeat: Number.POSITIVE_INFINITY,
386
- ease: [0.4, 0, 0.6, 1],
387
- }}
388
- >
389
- {title}
390
- </motion.span>
391
- </motion.h1>
392
-
393
- {/* Clean subtitle with subtle animation */}
394
- <motion.p
395
- className={cn(
396
- config.subtitleClass,
397
- "text-black/60 dark:text-white/60 font-normal tracking-[-0.01em] leading-[1.45] antialiased"
398
- )}
399
- initial={{ opacity: 0, y: 8 }}
400
- animate={{
401
- opacity: 1,
402
- y: 0,
403
- }}
404
- transition={{
405
- delay: 0.8,
406
- duration: 0.8,
407
- ease: [0.4, 0, 0.2, 1],
408
- }}
409
- >
410
- <motion.span
411
- animate={{
412
- opacity: [0.6, 0.4, 0.6],
413
- }}
414
- transition={{
415
- duration: 4,
416
- repeat: Number.POSITIVE_INFINITY,
417
- ease: [0.4, 0, 0.6, 1],
418
- }}
419
- >
420
- {subtitle}
421
- </motion.span>
422
- </motion.p>
423
- </motion.div>
424
- </div>
425
- );
426
- }
427
- const Default = ({ className, ...props }: LoaderProps) => (
428
- <LoaderIcon className={cn('animate-spin', className)} {...(props as any)} />
429
- );
430
-
431
- const Circle = ({ className, ...props }: LoaderProps) => (
432
- <LoaderCircleIcon className={cn('animate-spin', className)} {...(props as any)} />
433
- );
434
-
435
- const Pinwheel = ({ className, ...props }: LoaderProps) => (
436
- <LoaderPinwheelIcon className={cn('animate-spin', className)} {...(props as any)} />
437
- );
438
-
439
- const CircleFilled = ({
440
- className,
441
- size = 24,
442
- ...props
443
- }: LoaderProps) => (
444
- <div className="relative" style={{ width: size, height: size }}>
445
- <div className="absolute inset-0 rotate-180">
446
- <LoaderCircleIcon
447
- className={cn('animate-spin', className, 'text-foreground opacity-20')}
448
- size={size}
449
- {...(props as any)}
450
- />
451
- </div>
452
- <LoaderCircleIcon
453
- className={cn('relative animate-spin', className)}
454
- size={size}
455
- {...(props as any)}
456
- />
457
- </div>
458
- );
459
-
460
- const Ellipsis = ({ size = 24, ...props }: LoaderProps) => {
461
- return (
462
- <svg
463
- height={size}
464
- viewBox="0 0 24 24"
465
- width={size}
466
- xmlns="http://www.w3.org/2000/svg"
467
- {...(props as any)}
468
- >
469
- <circle cx="4" cy="12" fill="currentColor" r="2">
470
- <animate
471
- attributeName="cy"
472
- begin="0;ellipsis3.end+0.25s"
473
- calcMode="spline"
474
- dur="0.6s"
475
- id="ellipsis1"
476
- keySplines=".33,.66,.66,1;.33,0,.66,.33"
477
- values="12;6;12"
478
- />
479
- </circle>
480
- <circle cx="12" cy="12" fill="currentColor" r="2">
481
- <animate
482
- attributeName="cy"
483
- begin="ellipsis1.begin+0.1s"
484
- calcMode="spline"
485
- dur="0.6s"
486
- keySplines=".33,.66,.66,1;.33,0,.66,.33"
487
- values="12;6;12"
488
- />
489
- </circle>
490
- <circle cx="20" cy="12" fill="currentColor" r="2">
491
- <animate
492
- attributeName="cy"
493
- begin="ellipsis1.begin+0.2s"
494
- calcMode="spline"
495
- dur="0.6s"
496
- id="ellipsis3"
497
- keySplines=".33,.66,.66,1;.33,0,.66,.33"
498
- values="12;6;12"
499
- />
500
- </circle>
501
- </svg>
502
- );
503
- };
504
-
505
- const Ring = ({ size = 24, ...props }: LoaderProps) => (
506
- <svg
507
- height={size}
508
- stroke="currentColor"
509
- viewBox="0 0 44 44"
510
- width={size}
511
- xmlns="http://www.w3.org/2000/svg"
512
- {...(props as any)}
513
- >
514
- <g fill="none" fillRule="evenodd" strokeWidth="2">
515
- <circle cx="22" cy="22" r="1">
516
- <animate
517
- attributeName="r"
518
- begin="0s"
519
- calcMode="spline"
520
- dur="1.8s"
521
- keySplines="0.165, 0.84, 0.44, 1"
522
- keyTimes="0; 1"
523
- repeatCount="indefinite"
524
- values="1; 20"
525
- />
526
- <animate
527
- attributeName="stroke-opacity"
528
- begin="0s"
529
- calcMode="spline"
530
- dur="1.8s"
531
- keySplines="0.3, 0.61, 0.355, 1"
532
- keyTimes="0; 1"
533
- repeatCount="indefinite"
534
- values="1; 0"
535
- />
536
- </circle>
537
- <circle cx="22" cy="22" r="1">
538
- <animate
539
- attributeName="r"
540
- begin="-0.9s"
541
- calcMode="spline"
542
- dur="1.8s"
543
- keySplines="0.165, 0.84, 0.44, 1"
544
- keyTimes="0; 1"
545
- repeatCount="indefinite"
546
- values="1; 20"
547
- />
548
- <animate
549
- attributeName="stroke-opacity"
550
- begin="-0.9s"
551
- calcMode="spline"
552
- dur="1.8s"
553
- keySplines="0.3, 0.61, 0.355, 1"
554
- keyTimes="0; 1"
555
- repeatCount="indefinite"
556
- values="1; 0"
557
- />
558
- </circle>
559
- </g>
560
- </svg>
561
- );
562
-
563
- const Bars = ({ size = 24, ...props }: LoaderProps) => (
564
- <svg
565
- height={size}
566
- viewBox="0 0 24 24"
567
- width={size}
568
- xmlns="http://www.w3.org/2000/svg"
569
- {...(props as any)}
570
- >
571
- <style>{`
572
- .spinner-bar {
573
- animation: spinner-bars-animation .8s linear infinite;
574
- animation-delay: -.8s;
575
- }
576
- .spinner-bars-2 {
577
- animation-delay: -.65s;
578
- }
579
- .spinner-bars-3 {
580
- animation-delay: -0.5s;
581
- }
582
- @keyframes spinner-bars-animation {
583
- 0% {
584
- y: 1px;
585
- height: 22px;
586
- }
587
- 93.75% {
588
- y: 5px;
589
- height: 14px;
590
- opacity: 0.2;
591
- }
592
- }
593
- `}</style>
594
- <rect
595
- className="spinner-bar"
596
- fill="currentColor"
597
- height="22"
598
- width="6"
599
- x="1"
600
- y="1"
601
- />
602
- <rect
603
- className="spinner-bar spinner-bars-2"
604
- fill="currentColor"
605
- height="22"
606
- width="6"
607
- x="9"
608
- y="1"
609
- />
610
- <rect
611
- className="spinner-bar spinner-bars-3"
612
- fill="currentColor"
613
- height="22"
614
- width="6"
615
- x="17"
616
- y="1"
617
- />
618
- </svg>
619
- );
620
-
621
- const Infinite = ({ size = 24, ...props }: LoaderProps) => (
622
- <svg
623
- height={size}
624
- preserveAspectRatio="xMidYMid"
625
- viewBox="0 0 100 100"
626
- width={size}
627
- xmlns="http://www.w3.org/2000/svg"
628
- {...(props as any)}
629
- >
630
- <path
631
- d="M24.3 30C11.4 30 5 43.3 5 50s6.4 20 19.3 20c19.3 0 32.1-40 51.4-40 C88.6 30 95 43.3 95 50s-6.4 20-19.3 20C56.4 70 43.6 30 24.3 30z"
632
- fill="none"
633
- stroke="currentColor"
634
- strokeDasharray="205.271142578125 51.317785644531256"
635
- strokeLinecap="round"
636
- strokeWidth="10"
637
- style={{
638
- transform: 'scale(0.8)',
639
- transformOrigin: '50px 50px',
640
- }}
641
- >
642
- <animate
643
- attributeName="stroke-dashoffset"
644
- dur="2s"
645
- keyTimes="0;1"
646
- repeatCount="indefinite"
647
- values="0;256.58892822265625"
648
- />
649
- </path>
650
- </svg>
651
- );
652
-
653
- function LoaderOne() {
654
- const transition = (x: number) => {
655
- return {
656
- duration: 1,
657
- repeat: Infinity,
658
- repeatType: "loop" as const,
659
- delay: x * 0.2,
660
- ease: "easeInOut",
661
- };
662
- };
663
- return (
664
- <div className="flex items-center gap-2">
665
- <motion.div
666
- initial={{ y: 0 }}
667
- animate={{ y: [0, 10, 0] }}
668
- transition={transition(0)}
669
- className="h-4 w-4 rounded-full border border-neutral-300 bg-gradient-to-b from-neutral-400 to-neutral-300"
670
- />
671
- <motion.div
672
- initial={{ y: 0 }}
673
- animate={{ y: [0, 10, 0] }}
674
- transition={transition(1)}
675
- className="h-4 w-4 rounded-full border border-neutral-300 bg-gradient-to-b from-neutral-400 to-neutral-300"
676
- />
677
- <motion.div
678
- initial={{ y: 0 }}
679
- animate={{ y: [0, 10, 0] }}
680
- transition={transition(2)}
681
- className="h-4 w-4 rounded-full border border-neutral-300 bg-gradient-to-b from-neutral-400 to-neutral-300"
682
- />
683
- </div>
684
- );
685
- }
686
-
687
- function LoaderTwo() {
688
- const transition = (x: number) => {
689
- return {
690
- duration: 2,
691
- repeat: Infinity,
692
- repeatType: "loop" as const,
693
- delay: x * 0.2,
694
- ease: "easeInOut",
695
- };
696
- };
697
- return (
698
- <div className="flex items-center">
699
- <motion.div
700
- transition={transition(0)}
701
- initial={{ x: 0 }}
702
- animate={{ x: [0, 20, 0] }}
703
- className="h-4 w-4 rounded-full bg-neutral-200 shadow-md dark:bg-neutral-500"
704
- />
705
- <motion.div
706
- initial={{ x: 0 }}
707
- animate={{ x: [0, 20, 0] }}
708
- transition={transition(0.4)}
709
- className="h-4 w-4 -translate-x-2 rounded-full bg-neutral-200 shadow-md dark:bg-neutral-500"
710
- />
711
- <motion.div
712
- initial={{ x: 0 }}
713
- animate={{ x: [0, 20, 0] }}
714
- transition={transition(0.8)}
715
- className="h-4 w-4 -translate-x-4 rounded-full bg-neutral-200 shadow-md dark:bg-neutral-500"
716
- />
717
- </div>
718
- );
719
- }
720
-
721
- function LoaderThree() {
722
- return (
723
- <motion.svg
724
- xmlns="http://www.w3.org/2000/svg"
725
- width="24"
726
- height="24"
727
- viewBox="0 0 24 24"
728
- fill="none"
729
- stroke="currentColor"
730
- strokeWidth="1"
731
- strokeLinecap="round"
732
- strokeLinejoin="round"
733
- className="h-20 w-20 stroke-neutral-500 [--fill-final:var(--color-yellow-300)] [--fill-initial:var(--color-neutral-50)] dark:stroke-neutral-100 dark:[--fill-final:var(--color-yellow-500)] dark:[--fill-initial:var(--color-neutral-800)]"
734
- >
735
- <motion.path stroke="none" d="M0 0h24v24H0z" fill="none" />
736
- <motion.path
737
- initial={{ pathLength: 0, fill: "var(--fill-initial)" }}
738
- animate={{ pathLength: 1, fill: "var(--fill-final)" }}
739
- transition={{
740
- duration: 2,
741
- ease: "easeInOut",
742
- repeat: Infinity,
743
- repeatType: "reverse",
744
- }}
745
- d="M13 3l0 7l6 0l-8 11l0 -7l-6 0l8 -11"
746
- />
747
- </motion.svg>
748
- );
749
- }
750
-
751
- function LoaderFour({ text = "Loading..." }: { text?: string }) {
752
- return (
753
- <div className="relative font-bold text-black [perspective:1000px] dark:text-white">
754
- <motion.span
755
- animate={{
756
- skew: [0, -40, 0],
757
- scaleX: [1, 2, 1],
758
- }}
759
- transition={{
760
- duration: 0.05,
761
- repeat: Infinity,
762
- repeatType: "reverse",
763
- repeatDelay: 2,
764
- ease: "linear",
765
- times: [0, 0.2, 0.5, 0.8, 1],
766
- }}
767
- className="relative z-20 inline-block"
768
- >
769
- {text}
770
- </motion.span>
771
- <motion.span
772
- className="absolute inset-0 text-[#00e571]/50 blur-[0.5px] dark:text-[#00e571]"
773
- animate={{
774
- x: [-2, 4, -3, 1.5, -2],
775
- y: [-2, 4, -3, 1.5, -2],
776
- opacity: [0.3, 0.9, 0.4, 0.8, 0.3],
777
- }}
778
- transition={{
779
- duration: 0.5,
780
- repeat: Infinity,
781
- repeatType: "reverse",
782
- ease: "linear",
783
- times: [0, 0.2, 0.5, 0.8, 1],
784
- }}
785
- >
786
- {text}
787
- </motion.span>
788
- <motion.span
789
- className="absolute inset-0 text-[#8b00ff]/50 dark:text-[#8b00ff]"
790
- animate={{
791
- x: [0, 1, -1.5, 1.5, -1, 0],
792
- y: [0, -1, 1.5, -0.5, 0],
793
- opacity: [0.4, 0.8, 0.3, 0.9, 0.4],
794
- }}
795
- transition={{
796
- duration: 0.8,
797
- repeat: Infinity,
798
- repeatType: "reverse",
799
- ease: "linear",
800
- times: [0, 0.3, 0.6, 0.8, 1],
801
- }}
802
- >
803
- {text}
804
- </motion.span>
805
- </div>
806
- );
807
- }
808
-
809
- function LoaderFive({ text }: { text: string }) {
810
- return (
811
- <div className="font-sans font-bold [--shadow-color:var(--color-neutral-500)] dark:[--shadow-color:var(--color-neutral-100)]">
812
- {text.split("").map((char, i) => (
813
- <motion.span
814
- key={i}
815
- className="inline-block"
816
- initial={{ scale: 1, opacity: 0.5 }}
817
- animate={{
818
- scale: [1, 1.1, 1],
819
- textShadow: [
820
- "0 0 0 var(--shadow-color)",
821
- "0 0 1px var(--shadow-color)",
822
- "0 0 0 var(--shadow-color)",
823
- ],
824
- opacity: [0.5, 1, 0.5],
825
- }}
826
- transition={{
827
- duration: 0.5,
828
- repeat: Infinity,
829
- repeatType: "loop",
830
- delay: i * 0.05,
831
- ease: "easeInOut",
832
- repeatDelay: 2,
833
- }}
834
- >
835
- {char === " " ? "\u00A0" : char}
836
- </motion.span>
837
- ))}
838
- </div>
839
- );
840
- }
841
-
842
- function LoaderSix({ text = 'Loading...' }) {
843
- return (
844
- <div className='flex flex-col items-center gap-3'>
845
- <SpinnerV2 />
846
- <p className='ml-3'>{text}</p>
847
- </div>
848
- );
849
- }
850
-
851
- function LoaderSeven({ className, size, ...props }: React.ComponentProps<"div"> & VariantProps<typeof loaderVariants>) {
852
- const config = loaderVariants({ size }) as any;
853
-
854
- return (
855
- <div
856
- role="status"
857
- aria-label="Loading"
858
- className={cn(config.container, className)}
859
- {...props}
860
- />
861
- )
862
- }
863
- function LoaderEight() {
864
- return (
865
- <div className="relative w-24 h-24">
866
- <div className="absolute inset-0 border-4 border-primary/30 rounded-full animate-ping"></div>
867
- <div className="absolute inset-2 border-4 border-t-primary border-r-transparent border-b-transparent border-l-transparent rounded-full animate-spin"></div>
868
- </div>
869
- );
870
- }
871
-
872
- function LoaderNine({
873
- spinning = true,
874
- delay = 0,
875
- size = "lg",
876
- tip,
877
- className,
878
- children,
879
- wrapperClassName
880
- }: LoaderProps) {
881
- const [shouldShow, setShouldShow] = useState(!delay);
882
-
883
- useEffect(() => {
884
- if (!spinning || !delay) {
885
- setShouldShow(spinning);
886
- return;
887
- }
888
-
889
- const timer = setTimeout(() => {
890
- setShouldShow(spinning);
891
- }, delay);
892
-
893
- return () => clearTimeout(timer);
894
- }, [spinning, delay]);
895
-
896
- if (!shouldShow) {
897
- return children ? <div className={wrapperClassName}>{children}</div> : null;
898
- }
899
-
900
- return (
901
- <div className={cn("relative", wrapperClassName)}>
902
- <div className={cn("absolute inset-0 flex items-center justify-center bg-background/80 backdrop-blur-sm transition-opacity", spinning ? "opacity-100 z-10" : "opacity-0 -z-10")}>
903
- <div className={cn("flex flex-col items-center justify-center gap-2", !children && "p-4")}>
904
- <Loader2 className={cn("animate-spin text-primary", loaderVariants({ size: size as any, className }))} />
905
- {tip && <span className="text-sm text-muted-foreground">{tip}</span>}
906
- </div>
907
- </div>
908
- <div className={spinning ? "opacity-50 pointer-events-none" : ""}>
909
- {children}
910
- </div>
911
- </div>
912
- );
913
- }
914
-
915
- function LoaderTen({
916
- text = null,
917
- subText = null,
918
- size = "md",
919
- className,
920
- ...props
921
- }: LoaderProps) {
922
-
923
- const config = loaderVariants({ size }) as any;
924
-
925
- return (
926
- <div className={cn("flex flex-col items-center justify-center gap-8 p-8", className)} {...props} >
927
- <div
928
- className={cn("relative", config.container)}
929
- style={{
930
- animation: "spinnerPulse 4s cubic-bezier(0.4, 0, 0.6, 1) infinite",
931
- }}
932
- >
933
- <div
934
- className="absolute inset-0 rounded-full dark:hidden"
935
- style={{
936
- background: `conic-gradient(from 0deg, transparent 0deg, rgb(0, 0, 0) 90deg, transparent 180deg)`,
937
- mask: `radial-gradient(circle at 50% 50%, transparent 35%, black 37%, black 39%, transparent 41%)`,
938
- WebkitMask: `radial-gradient(circle at 50% 50%, transparent 35%, black 37%, black 39%, transparent 41%)`,
939
- opacity: 0.8,
940
- animation: "spinnerRotate 3s linear infinite",
941
- }}
942
- />
943
-
944
- <div
945
- className="absolute inset-0 rounded-full dark:hidden"
946
- style={{
947
- background: `conic-gradient(from 0deg, transparent 0deg, rgb(0, 0, 0) 120deg, rgba(0, 0, 0, 0.5) 240deg, transparent 360deg)`,
948
- mask: `radial-gradient(circle at 50% 50%, transparent 42%, black 44%, black 48%, transparent 50%)`,
949
- WebkitMask: `radial-gradient(circle at 50% 50%, transparent 42%, black 44%, black 48%, transparent 50%)`,
950
- opacity: 0.9,
951
- animation: "spinnerRotate 2.5s cubic-bezier(0.4, 0, 0.6, 1) infinite",
952
- }}
953
- />
954
-
955
- <div
956
- className="absolute inset-0 rounded-full dark:hidden"
957
- style={{
958
- background: `conic-gradient(from 180deg, transparent 0deg, rgba(0, 0, 0, 0.6) 45deg, transparent 90deg)`,
959
- mask: `radial-gradient(circle at 50% 50%, transparent 52%, black 54%, black 56%, transparent 58%)`,
960
- WebkitMask: `radial-gradient(circle at 50% 50%, transparent 52%, black 54%, black 56%, transparent 58%)`,
961
- opacity: 0.35,
962
- animation: "spinnerRotateReverse 4s cubic-bezier(0.4, 0, 0.6, 1) infinite",
963
- }}
964
- />
965
-
966
- <div
967
- className="absolute inset-0 rounded-full dark:hidden"
968
- style={{
969
- background: `conic-gradient(from 270deg, transparent 0deg, rgba(0, 0, 0, 0.4) 20deg, transparent 40deg)`,
970
- mask: `radial-gradient(circle at 50% 50%, transparent 61%, black 62%, black 63%, transparent 64%)`,
971
- WebkitMask: `radial-gradient(circle at 50% 50%, transparent 61%, black 62%, black 63%, transparent 64%)`,
972
- opacity: 0.5,
973
- animation: "spinnerRotate 3.5s linear infinite",
974
- }}
975
- />
976
-
977
- <div
978
- className="absolute inset-0 rounded-full hidden dark:block"
979
- style={{
980
- background: `conic-gradient(from 0deg, transparent 0deg, rgb(255, 255, 255) 90deg, transparent 180deg)`,
981
- mask: `radial-gradient(circle at 50% 50%, transparent 35%, black 37%, black 39%, transparent 41%)`,
982
- WebkitMask: `radial-gradient(circle at 50% 50%, transparent 35%, black 37%, black 39%, transparent 41%)`,
983
- opacity: 0.8,
984
- animation: "spinnerRotate 3s linear infinite",
985
- }}
986
- />
987
-
988
- <div
989
- className="absolute inset-0 rounded-full hidden dark:block"
990
- style={{
991
- background: `conic-gradient(from 0deg, transparent 0deg, rgb(255, 255, 255) 120deg, rgba(255, 255, 255, 0.5) 240deg, transparent 360deg)`,
992
- mask: `radial-gradient(circle at 50% 50%, transparent 42%, black 44%, black 48%, transparent 50%)`,
993
- WebkitMask: `radial-gradient(circle at 50% 50%, transparent 42%, black 44%, black 48%, transparent 50%)`,
994
- opacity: 0.9,
995
- animation: "spinnerRotate 2.5s cubic-bezier(0.4, 0, 0.6, 1) infinite",
996
- }}
997
- />
998
-
999
- <div
1000
- className="absolute inset-0 rounded-full hidden dark:block"
1001
- style={{
1002
- background: `conic-gradient(from 180deg, transparent 0deg, rgba(255, 255, 255, 0.6) 45deg, transparent 90deg)`,
1003
- mask: `radial-gradient(circle at 50% 50%, transparent 52%, black 54%, black 56%, transparent 58%)`,
1004
- WebkitMask: `radial-gradient(circle at 50% 50%, transparent 52%, black 54%, black 56%, transparent 58%)`,
1005
- opacity: 0.35,
1006
- animation: "spinnerRotateReverse 4s cubic-bezier(0.4, 0, 0.6, 1) infinite",
1007
- }}
1008
- />
1009
-
1010
- <div
1011
- className="absolute inset-0 rounded-full hidden dark:block"
1012
- style={{
1013
- background: `conic-gradient(from 270deg, transparent 0deg, rgba(255, 255, 255, 0.4) 20deg, transparent 40deg)`,
1014
- mask: `radial-gradient(circle at 50% 50%, transparent 61%, black 62%, black 63%, transparent 64%)`,
1015
- WebkitMask: `radial-gradient(circle at 50% 50%, transparent 61%, black 62%, black 63%, transparent 64%)`,
1016
- opacity: 0.5,
1017
- animation: "spinnerRotate 3.5s linear infinite",
1018
- }}
1019
- />
1020
- </div>
1021
-
1022
- <div
1023
- className={cn("text-center", config.spacing, config.maxWidth)}
1024
- style={{
1025
- animation: "spinnerFadeIn 1s cubic-bezier(0.4, 0, 0.2, 1) 0.4s backwards",
1026
- }}
1027
- >
1028
- <h1
1029
- className={cn(
1030
- config.titleClass,
1031
- "text-black/90 dark:text-white/90 font-medium tracking-[-0.02em] leading-[1.15] antialiased"
1032
- )}
1033
- style={{
1034
- animation: "spinnerFadeIn 0.8s cubic-bezier(0.4, 0, 0.2, 1) 0.6s backwards",
1035
- }}
1036
- >
1037
- <span
1038
- style={{
1039
- animation: "spinnerBreath 3s cubic-bezier(0.4, 0, 0.6, 1) infinite",
1040
- }}
1041
- >
1042
- {text}
1043
- </span>
1044
- </h1>
1045
-
1046
- <p
1047
- className={cn(
1048
- config.subtitleClass,
1049
- "text-black/60 dark:text-white/60 font-normal tracking-[-0.01em] leading-[1.45] antialiased"
1050
- )}
1051
- style={{
1052
- animation: "spinnerFadeIn 0.8s cubic-bezier(0.4, 0, 0.2, 1) 0.8s backwards",
1053
- }}
1054
- >
1055
- <span
1056
- style={{
1057
- animation: "spinnerBreathSubtle 4s cubic-bezier(0.4, 0, 0.6, 1) infinite",
1058
- }}
1059
- >
1060
- {subText}
1061
- </span>
1062
- </p>
1063
- </div>
1064
-
1065
- <style jsx>{`
1066
- @keyframes spinnerRotate {
1067
- from {
1068
- transform: rotate(0deg);
1069
- }
1070
- to {
1071
- transform: rotate(360deg);
1072
- }
1073
- }
1074
-
1075
- @keyframes spinnerRotateReverse {
1076
- from {
1077
- transform: rotate(0deg);
1078
- }
1079
- to {
1080
- transform: rotate(-360deg);
1081
- }
1082
- }
1083
-
1084
- @keyframes spinnerPulse {
1085
- 0%, 100% {
1086
- transform: scale(1);
1087
- }
1088
- 50% {
1089
- transform: scale(1.02);
1090
- }
1091
- }
1092
-
1093
- @keyframes spinnerFadeIn {
1094
- from {
1095
- opacity: 0;
1096
- transform: translateY(12px);
1097
- }
1098
- to {
1099
- opacity: 1;
1100
- transform: translateY(0);
1101
- }
1102
- }
1103
-
1104
- @keyframes spinnerBreath {
1105
- 0%, 100% {
1106
- opacity: 0.9;
1107
- }
1108
- 50% {
1109
- opacity: 0.7;
1110
- }
1111
- }
1112
-
1113
- @keyframes spinnerBreathSubtle {
1114
- 0%, 100% {
1115
- opacity: 0.6;
1116
- }
1117
- 50% {
1118
- opacity: 0.4;
1119
- }
1120
- }
1121
- `}</style>
1122
- </div>
1123
- )
1124
- }
1125
- function LoaderEleven({
1126
- size = "2em",
1127
- strokeWidth = 2,
1128
- fill = "transparent",
1129
- animationDuration = "2s",
1130
- className,
1131
- style,
1132
- ...props
1133
- }: LoaderProps) {
1134
- const sizeValue = typeof size === "number" ? size + 'px' : size;
1135
-
1136
- return (
1137
- <div
1138
- className={cn("inline-block", className)}
1139
- style={{
1140
- width: sizeValue,
1141
- height: sizeValue,
1142
- ...style,
1143
- }}
1144
- role="progressbar"
1145
- {...props}
1146
- >
1147
- <svg
1148
- className="animate-spin"
1149
- width="100%"
1150
- height="100%"
1151
- viewBox="0 0 50 50"
1152
- style={{ animationDuration }}
1153
- >
1154
- <circle
1155
- cx="25"
1156
- cy="25"
1157
- r="20"
1158
- fill={fill}
1159
- stroke="currentColor"
1160
- strokeWidth={strokeWidth}
1161
- strokeLinecap="round"
1162
- strokeDasharray="31.416"
1163
- strokeDashoffset="31.416"
1164
- className="opacity-25"
1165
- />
1166
- <circle
1167
- cx="25"
1168
- cy="25"
1169
- r="20"
1170
- fill={fill}
1171
- stroke="currentColor"
1172
- strokeWidth={strokeWidth}
1173
- strokeLinecap="round"
1174
- strokeDasharray="31.416"
1175
- strokeDashoffset="7.854"
1176
- className="opacity-100"
1177
- />
1178
- </svg>
1179
- </div>
1180
- );
1181
- }
1182
-
1183
- const game = [
1184
- [14, 7, 0, 8, 6, 13, 20],
1185
- [14, 7, 13, 20, 16, 27, 21],
1186
- [14, 20, 27, 21, 34, 24, 28],
1187
- [27, 21, 34, 28, 41, 32, 35],
1188
- [34, 28, 41, 35, 48, 40, 42],
1189
- [34, 28, 41, 35, 48, 42, 46],
1190
- [34, 28, 41, 35, 48, 42, 38],
1191
- [34, 28, 41, 35, 48, 30, 21],
1192
- [34, 28, 41, 48, 21, 22, 14],
1193
- [34, 28, 41, 21, 14, 16, 27],
1194
- [34, 28, 21, 14, 10, 20, 27],
1195
- [28, 21, 14, 4, 13, 20, 27],
1196
- [28, 21, 14, 12, 6, 13, 20],
1197
- [28, 21, 14, 6, 13, 20, 11],
1198
- [28, 21, 14, 6, 13, 20, 10],
1199
- [14, 6, 13, 20, 9, 7, 21],
1200
- ];
1201
-
1202
- function LoaderTwelve({
1203
- frames = game,
1204
- isPlaying = true,
1205
- duration = 100,
1206
- dotClassName,
1207
- className,
1208
- repeatCount = -1,
1209
- onComplete,
1210
- ...props
1211
- }: LoaderProps) {
1212
- const gridRef = useRef<HTMLDivElement>(null);
1213
- const currentIndex = useRef(0);
1214
- const repeats = useRef(0);
1215
- const interval = useRef<NodeJS.Timeout | null>(null);
1216
-
1217
- const applyFrameToDots = useCallback(
1218
- (dots: HTMLDivElement[], frameIndex: number) => {
1219
- const frame = frames[frameIndex];
1220
- if (!frame) return;
1221
-
1222
- dots.forEach((dot, index) => {
1223
- dot.classList.toggle("active", frame.includes(index));
1224
- });
1225
- },
1226
- [frames],
1227
- );
1228
-
1229
- useEffect(() => {
1230
- currentIndex.current = 0;
1231
- repeats.current = 0;
1232
- }, [frames]);
1233
-
1234
- useEffect(() => {
1235
- if (isPlaying) {
1236
- if (currentIndex.current >= frames.length) {
1237
- currentIndex.current = 0;
1238
- }
1239
- const dotElements = gridRef.current?.children;
1240
- if (!dotElements) return;
1241
- const dots = Array.from(dotElements) as HTMLDivElement[];
1242
- interval.current = setInterval(() => {
1243
- applyFrameToDots(dots, currentIndex.current);
1244
- if (currentIndex.current + 1 >= frames.length) {
1245
- if (repeatCount != -1 && repeats.current + 1 >= repeatCount) {
1246
- clearInterval(interval.current!);
1247
- onComplete?.();
1248
- }
1249
- repeats.current++;
1250
- }
1251
- currentIndex.current = (currentIndex.current + 1) % frames.length;
1252
- }, duration);
1253
- } else {
1254
- if (interval.current) clearInterval(interval.current);
1255
- }
1256
-
1257
- return () => {
1258
- if (interval.current) clearInterval(interval.current);
1259
- };
1260
- }, [frames, isPlaying, applyFrameToDots, duration, repeatCount, onComplete]);
1261
-
1262
- return (
1263
- <div {...props} ref={gridRef} className={cn("grid w-fit grid-cols-7 gap-0.5", className)}>
1264
- {Array.from({ length: 49 }).map((_, i) => (
1265
- <div key={i} className={cn("h-1.5 w-1.5 rounded-sm bg-muted-foreground/20", dotClassName, "[&.active]:bg-foreground")} />
1266
- ))}
1267
- </div>
1268
- );
1269
- }
1270
-
1271
- function LoaderThirteen({ variant = 'circle', ...props }: LoaderProps) {
1272
- return <Loader variant={variant} {...props} />;
1273
- }
1274
-
1275
- function LoaderFourteen({ variant = 'pinwheel', ...props }: LoaderProps) {
1276
- return <Loader variant={variant} {...props} />;
1277
- }
1278
-
1279
- function LoaderFifteen({ variant = 'circle-filled', ...props }: LoaderProps) {
1280
- return <Loader variant={variant} {...props} />;
1281
- }
1282
-
1283
- function LoaderSixteen({ variant = 'ellipsis', ...props }: LoaderProps) {
1284
- return <Loader variant={variant} {...props} />;
1285
- }
1286
-
1287
- function LoaderSeventeen({ variant = 'ring', ...props }: LoaderProps) {
1288
- return <Loader variant={variant} {...props} />;
1289
- }
1290
-
1291
- function LoaderEighteen({ variant = 'bars', ...props }: LoaderProps) {
1292
- return <Loader variant={variant} {...props} />;
1293
- }
1294
-
1295
- function LoaderNineteen({ variant = 'infinite', ...props }: LoaderProps) {
1296
- return <Loader variant={variant} {...props} />;
1297
- }
1298
-
1299
- function LoaderTwenty({ variant = 'default', ...props }: LoaderProps) {
1300
- return <Loader variant={variant} {...props} />;
1301
- }
1302
-
1303
- function LoaderTwentyOne({ className, outerSize, childSize }: LoaderProps) {
1304
- return (
1305
- <div
1306
- className={cn(
1307
- "m-2 h-8 w-8 animate-spin items-center justify-center rounded-full bg-gradient-to-bl from-pink-500 to-blue-600 p-0.5",
1308
- className,
1309
- outerSize,
1310
- )}
1311
- >
1312
- <div className={cn("h-6 w-6 rounded-full bg-white", childSize)} />
1313
- </div>
1314
- );
1315
- }
1316
-
1317
- export function LoaderOneDemo() {
1318
- return <LoaderOne />;
1319
- }
1320
- export function LoaderTwoDemo() {
1321
- return <LoaderTwo />;
1322
- }
1323
- export function LoaderThreeDemo() {
1324
- return <LoaderThree />;
1325
- }
1326
- export function LoaderFourDemo() {
1327
- return <LoaderFour />;
1328
- }
1329
- export function LoaderFiveDemo() {
1330
- return <LoaderFive text="Generating chat..." />;
1331
- }
1332
- export function LoaderSixDemo() {
1333
- return (
1334
- <div>
1335
- <LoaderSix />
1336
- </div>
1337
- );
1338
- }
1339
- export function LoaderSevenDemo() {
1340
- return (
1341
- <div className="space-y-8 p-6 max-w-2xl mx-auto">
1342
- <div>
1343
- <h2 className="text-2xl font-bold mb-4">SpinnerV1 Sizes</h2>
1344
- <div className="flex items-center gap-4">
1345
- <LoaderSeven size="sm" />
1346
- <LoaderSeven size="default" />
1347
- <LoaderSeven size="lg" />
1348
- <LoaderSeven size="xl" />
1349
- </div>
1350
- </div>
1351
- <div>
1352
- <h2 className="text-2xl font-bold mb-4">Custom Color</h2>
1353
- <div className="flex items-center gap-4">
1354
- <LoaderSeven className="text-primary" />
1355
- <LoaderSeven className="text-destructive" />
1356
- </div>
1357
- </div>
1358
- </div>
1359
- )
1360
- }
1361
- export function LoaderEightDemo() {
1362
- return (
1363
- <div>
1364
- <LoaderEight />
1365
- </div>
1366
- );
1367
- }
1368
- export function LoaderNineDemo() {
1369
- const [spinning, setSpinning] = useState(true);
1370
-
1371
- return (
1372
- <div className="p-8 space-y-8">
1373
- <div className="space-y-4">
1374
- <h3 className="text-lg font-semibold">Basic Usage</h3>
1375
- <LoaderNine spinning={spinning}>
1376
- <div className="p-6 border rounded-lg bg-card">
1377
- <h4 className="text-lg font-medium mb-2">Content Section</h4>
1378
- <p className="text-muted-foreground">
1379
- This content will be blurred when spinning is active.
1380
- </p>
1381
- </div>
1382
- </LoaderNine>
1383
- <button
1384
- onClick={() => setSpinning(!spinning)}
1385
- className="px-4 py-2 bg-primary text-primary-foreground rounded-md"
1386
- >
1387
- {spinning ? "Stop" : "Start"} Spinning
1388
- </button>
1389
- </div>
1390
-
1391
- <div className="space-y-4">
1392
- <h3 className="text-lg font-semibold">With Tip</h3>
1393
- <LoaderNine spinning tip="Loading..." size="large">
1394
- <div className="p-6 border rounded-lg bg-card">
1395
- <h4 className="text-lg font-medium mb-2">Another Section</h4>
1396
- <p className="text-muted-foreground">
1397
- This demonstrates the tip prop functionality.
1398
- </p>
1399
- </div>
1400
- </LoaderNine>
1401
- </div>
1402
-
1403
- <div className="space-y-4">
1404
- <h3 className="text-lg font-semibold">Different Sizes</h3>
1405
- <div className="flex gap-4 items-center">
1406
- <LoaderNine spinning size="small">
1407
- <div className="w-20 h-20 border rounded-lg bg-card"></div>
1408
- </LoaderNine>
1409
- <LoaderNine spinning size="default">
1410
- <div className="w-20 h-20 border rounded-lg bg-card"></div>
1411
- </LoaderNine>
1412
- <LoaderNine spinning size="large">
1413
- <div className="w-20 h-20 border rounded-lg bg-card"></div>
1414
- </LoaderNine>
1415
- </div>
1416
- </div>
1417
-
1418
- <div className="space-y-4">
1419
- <h3 className="text-lg font-semibold">Standalone</h3>
1420
- <LoaderNine spinning tip="Processing..." />
1421
- </div>
1422
-
1423
- <div className="space-y-4">
1424
- <h3 className="text-lg font-semibold">With Delay</h3>
1425
- <LoaderNine spinning delay={500} tip="Delayed loading...">
1426
- <div className="p-6 border rounded-lg bg-card">
1427
- <h4 className="text-lg font-medium mb-2">Delayed Content</h4>
1428
- <p className="text-muted-foreground">
1429
- This spinner will appear after 500ms delay.
1430
- </p>
1431
- </div>
1432
- </LoaderNine>
1433
- </div>
1434
- </div>
1435
- );
1436
- }
1437
- export function LoaderTenDemo() {
1438
- return (
1439
- <div className="space-y-8 p-6">
1440
- <div>
1441
- <h2 className="text-2xl font-bold mb-4">Loader Ten</h2>
1442
- <LoaderTen text="Configuring your account..." subText="Please wait while we prepare everything for you" />
1443
- </div>
1444
- </div>
1445
- )
1446
- }
1447
- export function LoaderElevenDemo() {
1448
- return (
1449
- <div className="min-h-screen bg-background text-foreground p-8">
1450
- <div className="max-w-6xl mx-auto space-y-8">
1451
- <div className="space-y-2">
1452
- <h1 className="text-3xl font-bold">Spinner</h1>
1453
- <p className="text-muted-foreground">
1454
- Spinner is a process status indicator.
1455
- </p>
1456
- </div>
1457
-
1458
- <div className="grid gap-8">
1459
- <Card className="p-6">
1460
- <div className="space-y-4">
1461
- <h2 className="text-xl font-semibold">Basic</h2>
1462
- <p className="text-muted-foreground">
1463
- An infinite spin animation is displayed by default.
1464
- </p>
1465
- <div className="flex items-center justify-center p-8 border rounded-lg bg-muted/50">
1466
- <LoaderEleven />
1467
- </div>
1468
- <div className="bg-muted/30 p-4 rounded-lg">
1469
- <code className="text-sm">
1470
- {`<Spinner />`}
1471
- </code>
1472
- </div>
1473
- </div>
1474
- </Card>
1475
-
1476
- <Card className="p-6">
1477
- <div className="space-y-4">
1478
- <h2 className="text-xl font-semibold">Custom</h2>
1479
- <p className="text-muted-foreground">
1480
- Spinner can be customized with styling property like style, strokeWidth and fill.
1481
- </p>
1482
- <div className="flex items-center justify-center p-8 border rounded-lg bg-muted/50">
1483
- <LoaderEleven
1484
- size={50}
1485
- strokeWidth={8}
1486
- fill="hsl(var(--background))"
1487
- animationDuration="0.5s"
1488
- />
1489
- </div>
1490
- <div className="bg-muted/30 p-4 rounded-lg">
1491
- <code className="text-sm">
1492
- {`<Spinner
1493
- size={50}
1494
- strokeWidth={8}
1495
- fill="hsl(var(--background))"
1496
- animationDuration="0.5s"
1497
- />`}
1498
- </code>
1499
- </div>
1500
- </div>
1501
- </Card>
1502
-
1503
- <Card className="p-6">
1504
- <div className="space-y-4">
1505
- <h2 className="text-xl font-semibold">Sizes</h2>
1506
- <p className="text-muted-foreground">
1507
- Different sizes can be specified using the size property.
1508
- </p>
1509
- <div className="flex items-center justify-center gap-8 p-8 border rounded-lg bg-muted/50">
1510
- <div className="text-center space-y-2">
1511
- <LoaderEleven size={20} />
1512
- <p className="text-xs text-muted-foreground">Small</p>
1513
- </div>
1514
- <div className="text-center space-y-2">
1515
- <LoaderEleven size={32} />
1516
- <p className="text-xs text-muted-foreground">Default</p>
1517
- </div>
1518
- <div className="text-center space-y-2">
1519
- <LoaderEleven size={48} />
1520
- <p className="text-xs text-muted-foreground">Large</p>
1521
- </div>
1522
- </div>
1523
- <div className="bg-muted/30 p-4 rounded-lg">
1524
- <code className="text-sm">
1525
- {`<Spinner size={20} />
1526
- <Spinner size={32} />
1527
- <Spinner size={48} />`}
1528
- </code>
1529
- </div>
1530
- </div>
1531
- </Card>
1532
-
1533
- <Card className="p-6">
1534
- <div className="space-y-4">
1535
- <h2 className="text-xl font-semibold">Colors</h2>
1536
- <p className="text-muted-foreground">
1537
- Custom colors can be applied using CSS variables or direct color values.
1538
- </p>
1539
- <div className="flex items-center justify-center gap-8 p-8 border rounded-lg bg-muted/50">
1540
- <div className="text-center space-y-2">
1541
- <div className="text-red-500">
1542
- <LoaderEleven size={32} />
1543
- </div>
1544
- <p className="text-xs text-muted-foreground">Red</p>
1545
- </div>
1546
- <div className="text-center space-y-2">
1547
- <div className="text-green-500">
1548
- <LoaderEleven size={32} />
1549
- </div>
1550
- <p className="text-xs text-muted-foreground">Green</p>
1551
- </div>
1552
- <div className="text-center space-y-2">
1553
- <div className="text-blue-500">
1554
- <LoaderEleven size={32} />
1555
- </div>
1556
- <p className="text-xs text-muted-foreground">Blue</p>
1557
- </div>
1558
- <div className="text-center space-y-2">
1559
- <div className="text-purple-500">
1560
- <LoaderEleven size={32} />
1561
- </div>
1562
- <p className="text-xs text-muted-foreground">Purple</p>
1563
- </div>
1564
- </div>
1565
- <div className="bg-muted/30 p-4 rounded-lg">
1566
- <code className="text-sm">
1567
- {`<div className="text-red-500">
1568
- <Spinner size={32} />
1569
- </div>`}
1570
- </code>
1571
- </div>
1572
- </div>
1573
- </Card>
1574
-
1575
- <Card className="p-6">
1576
- <div className="space-y-4">
1577
- <h2 className="text-xl font-semibold">Animation Speed</h2>
1578
- <p className="text-muted-foreground">
1579
- Control the animation speed with the animationDuration property.
1580
- </p>
1581
- <div className="flex items-center justify-center gap-8 p-8 border rounded-lg bg-muted/50">
1582
- <div className="text-center space-y-2">
1583
- <LoaderEleven size={32} animationDuration="0.5s" />
1584
- <p className="text-xs text-muted-foreground">Fast (0.5s)</p>
1585
- </div>
1586
- <div className="text-center space-y-2">
1587
- <LoaderEleven size={32} animationDuration="1s" />
1588
- <p className="text-xs text-muted-foreground">Normal (1s)</p>
1589
- </div>
1590
- <div className="text-center space-y-2">
1591
- <LoaderEleven size={32} animationDuration="3s" />
1592
- <p className="text-xs text-muted-foreground">Slow (3s)</p>
1593
- </div>
1594
- </div>
1595
- <div className="bg-muted/30 p-4 rounded-lg">
1596
- <code className="text-sm">
1597
- {`<Spinner animationDuration="0.5s" />
1598
- <Spinner animationDuration="1s" />
1599
- <Spinner animationDuration="3s" />`}
1600
- </code>
1601
- </div>
1602
- </div>
1603
- </Card>
1604
-
1605
- <Card className="p-6">
1606
- <div className="space-y-4">
1607
- <h2 className="text-xl font-semibold">Stroke Width</h2>
1608
- <p className="text-muted-foreground">
1609
- Customize the thickness of the spinner with strokeWidth property.
1610
- </p>
1611
- <div className="flex items-center justify-center gap-8 p-8 border rounded-lg bg-muted/50">
1612
- <div className="text-center space-y-2">
1613
- <LoaderEleven size={32} strokeWidth={1} />
1614
- <p className="text-xs text-muted-foreground">Thin (1px)</p>
1615
- </div>
1616
- <div className="text-center space-y-2">
1617
- <LoaderEleven size={32} strokeWidth={3} />
1618
- <p className="text-xs text-muted-foreground">Normal (3px)</p>
1619
- </div>
1620
- <div className="text-center space-y-2">
1621
- <LoaderEleven size={32} strokeWidth={6} />
1622
- <p className="text-xs text-muted-foreground">Thick (6px)</p>
1623
- </div>
1624
- </div>
1625
- <div className="bg-muted/30 p-4 rounded-lg">
1626
- <code className="text-sm">
1627
- {`<Spinner strokeWidth={1} />
1628
- <Spinner strokeWidth={3} />
1629
- <Spinner strokeWidth={6} />`}
1630
- </code>
1631
- </div>
1632
- </div>
1633
- </Card>
1634
-
1635
- <Card className="p-6">
1636
- <div className="space-y-4">
1637
- <h2 className="text-xl font-semibold">Accessibility</h2>
1638
- <p className="text-muted-foreground">
1639
- Spinner components uses progressbar role. Value to describe the component can be defined using aria-labelledby and aria-label props.
1640
- </p>
1641
- <div className="flex items-center justify-center p-8 border rounded-lg bg-muted/50">
1642
- <LoaderEleven aria-label="Loading content" />
1643
- </div>
1644
- <div className="bg-muted/30 p-4 rounded-lg">
1645
- <code className="text-sm">
1646
- {`<Spinner aria-label="Loading content" />`}
1647
- </code>
1648
- </div>
1649
- <p className="text-sm text-muted-foreground">
1650
- Component does not include any interactive elements.
1651
- </p>
1652
- </div>
1653
- </Card>
1654
- </div>
1655
- </div>
1656
- </div>
1657
- )
1658
- }
1659
- export function LoadertwelveDemo() {
1660
- return (
1661
- <div className="flex items-center gap-5 rounded bg-black px-4 py-3 text-white">
1662
- <div className="">
1663
- <LoaderTwelve
1664
- frames={game}
1665
- className="gap-0.5"
1666
- dotClassName="bg-white/15 [&.active]:bg-white size-1.5"></LoaderTwelve>
1667
- </div>
1668
- <p className="font-medium">Loading...</p>
1669
- </div>
1670
- );
1671
- };
1672
- export function LoaderThirteenDemo() {
1673
- return (
1674
- <div className="min-h-screen bg-background text-foreground p-8">
1675
- <div className="max-w-6xl mx-auto space-y-8">
1676
- <LoaderThirteen />
1677
- </div>
1678
- </div>
1679
- )
1680
- }
1681
- export function LoaderFourteenDemo() {
1682
- return (
1683
- <div className="min-h-screen bg-background text-foreground p-8">
1684
- <div className="max-w-6xl mx-auto space-y-8">
1685
- <LoaderFourteen />
1686
- </div>
1687
- </div>
1688
- )
1689
- }
1690
- export function LoaderFifthteenDemo() {
1691
- return (
1692
- <div className="min-h-screen bg-background text-foreground p-8">
1693
- <div className="max-w-6xl mx-auto space-y-8">
1694
- <LoaderFifteen />
1695
- </div>
1696
- </div>
1697
- )
1698
- }
1699
- export function LoaderSixteenDemo() {
1700
- return (
1701
- <div className="min-h-screen bg-background text-foreground p-8">
1702
- <div className="max-w-6xl mx-auto space-y-8">
1703
- <LoaderSixteen />
1704
- </div>
1705
- </div>
1706
- )
1707
- }
1708
- export function LoaderSeventeenDemo() {
1709
- return (
1710
- <div className="min-h-screen bg-background text-foreground p-8">
1711
- <div className="max-w-6xl mx-auto space-y-8">
1712
- <LoaderSeventeen />
1713
- </div>
1714
- </div>
1715
- )
1716
- }
1717
- export function LoaderEightteenDemo() {
1718
- return (
1719
- <div className="min-h-screen bg-background text-foreground p-8">
1720
- <div className="max-w-6xl mx-auto space-y-8">
1721
- <LoaderEighteen />
1722
- </div>
1723
- </div>
1724
- )
1725
- }
1726
- export function LoaderNineteenDemo() {
1727
- return (
1728
- <div className="min-h-screen bg-background text-foreground p-8">
1729
- <div className="max-w-6xl mx-auto space-y-8">
1730
- <LoaderNineteen />
1731
- </div>
1732
- </div>
1733
- )
1734
- }
1735
- export function LoaderTwentyDemo() {
1736
- return (
1737
- <div className="min-h-screen bg-background text-foreground p-8">
1738
- <div className="max-w-6xl mx-auto space-y-8">
1739
- <LoaderTwenty />
1740
- </div>
1741
- </div>
1742
- )
1743
- }
1744
- export function LoaderTwentyOneDemo() {
1745
- return (
1746
- <div className="min-h-screen bg-background text-foreground p-8">
1747
- <div className="max-w-6xl mx-auto space-y-8">
1748
- <LoaderTwentyOne />
1749
- </div>
1750
- </div>
1751
- )
1752
- }
1753
-
1754
-
1755
-
1756
-
1757
-