@catalystsoftware/ui 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -0
- package/components/catalyst-ui/buttons/burger.tsx +207 -0
- package/components/catalyst-ui/core/data-display/timeline.tsx +210 -0
- package/components/catalyst-ui/core/feedback/alert.tsx +491 -0
- package/components/catalyst-ui/core/feedback/spinner-1.tsx +65 -0
- package/components/catalyst-ui/core/feedback/toast.tsx +1857 -0
- package/components/catalyst-ui/core/navigation/menu.tsx +164 -0
- package/components/catalyst-ui/forms/toggle-class.tsx +176 -0
- package/components/catalyst-ui/hooks/use-copy-to-clipboard.tsx +419 -0
- package/components/catalyst-ui/hooks/use-counter.tsx +13 -0
- package/components/catalyst-ui/hooks/use-event-listener.tsx +23 -0
- package/components/catalyst-ui/hooks/use-export-markdown.tsx +47 -0
- package/components/catalyst-ui/hooks/use-focus.tsx +17 -0
- package/components/catalyst-ui/hooks/use-interval.tsx +23 -0
- package/components/catalyst-ui/hooks/use-is-client.tsx +16 -0
- package/components/catalyst-ui/hooks/use-media-query.tsx +19 -0
- package/components/catalyst-ui/hooks/use-mobile.tsx +19 -0
- package/components/catalyst-ui/hooks/use-resize-observer.tsx +81 -0
- package/components/catalyst-ui/hooks/use-timeout.tsx +21 -0
- package/components/catalyst-ui/hooks/use-timer.tsx +209 -0
- package/components/catalyst-ui/hooks/use-toggle.tsx +12 -0
- package/components/catalyst-ui/media/image.tsx +13 -0
- package/components/catalyst-ui/overlays/dual-sidebar.tsx +4142 -0
- package/components/catalyst-ui/overlays/sidebar-original.tsx +726 -0
- package/components/catalyst-ui/primitives/accordion.tsx +250 -0
- package/components/catalyst-ui/primitives/alert-dialog.tsx +126 -0
- package/components/catalyst-ui/primitives/aspect-ratio.tsx +9 -0
- package/components/catalyst-ui/primitives/avatar.tsx +296 -0
- package/components/catalyst-ui/primitives/badge.tsx +57 -0
- package/components/catalyst-ui/primitives/breadcrumb.tsx +101 -0
- package/components/catalyst-ui/primitives/button.tsx +265 -0
- package/components/catalyst-ui/primitives/calendar-v4.tsx +208 -0
- package/components/catalyst-ui/primitives/calendar.tsx +295 -0
- package/components/catalyst-ui/primitives/card.tsx +618 -0
- package/components/catalyst-ui/primitives/carousel.tsx +238 -0
- package/components/catalyst-ui/primitives/chart.tsx +347 -0
- package/components/catalyst-ui/primitives/checkbox.tsx +225 -0
- package/components/catalyst-ui/primitives/collapsible.tsx +212 -0
- package/components/catalyst-ui/primitives/command.tsx +393 -0
- package/components/catalyst-ui/primitives/context-menu.tsx +236 -0
- package/components/catalyst-ui/primitives/dialog.tsx +471 -0
- package/components/catalyst-ui/primitives/drawer.tsx +761 -0
- package/components/catalyst-ui/primitives/dropdown-menu.tsx +290 -0
- package/components/catalyst-ui/primitives/empty.tsx +104 -0
- package/components/catalyst-ui/primitives/field.tsx +244 -0
- package/components/catalyst-ui/primitives/hover-card.tsx +124 -0
- package/components/catalyst-ui/primitives/input-otp.tsx +76 -0
- package/components/catalyst-ui/primitives/input.tsx +64 -0
- package/components/catalyst-ui/primitives/item.tsx +196 -0
- package/components/catalyst-ui/primitives/kbd.tsx +75 -0
- package/components/catalyst-ui/primitives/label.tsx +24 -0
- package/components/catalyst-ui/primitives/navigation-menu.tsx +150 -0
- package/components/catalyst-ui/primitives/pagination.tsx +198 -0
- package/components/catalyst-ui/primitives/popover.tsx +232 -0
- package/components/catalyst-ui/primitives/progress.tsx +34 -0
- package/components/catalyst-ui/primitives/radio-group.tsx +43 -0
- package/components/catalyst-ui/primitives/resizable.tsx +56 -0
- package/components/catalyst-ui/primitives/select.tsx +155 -0
- package/components/catalyst-ui/primitives/separator.tsx +74 -0
- package/components/catalyst-ui/primitives/sheet.tsx +126 -0
- package/components/catalyst-ui/primitives/skeleton.tsx +15 -0
- package/components/catalyst-ui/primitives/slider.tsx +27 -0
- package/components/catalyst-ui/primitives/switch.tsx +187 -0
- package/components/catalyst-ui/primitives/tabs.tsx +335 -0
- package/components/catalyst-ui/primitives/textarea.tsx +24 -0
- package/components/catalyst-ui/primitives/toggle-group.tsx +55 -0
- package/components/catalyst-ui/primitives/toggle.tsx +42 -0
- package/components/catalyst-ui/primitives/tooltip.tsx +116 -0
- package/components/catalyst-ui/utils/basic-auth.tsx +40 -0
- package/components/catalyst-ui/utils/context-storage.tsx +19 -0
- package/components/catalyst-ui/utils/cors-middleware.tsx +71 -0
- package/components/catalyst-ui/utils/deferred-content.tsx +595 -0
- package/components/catalyst-ui/utils/honeypot-middleware.tsx +38 -0
- package/components/catalyst-ui/utils/incId.tsx +75 -0
- package/components/catalyst-ui/utils/jwk-auth.tsx +36 -0
- package/components/catalyst-ui/utils/request-id.tsx +14 -0
- package/components/catalyst-ui/utils/secure-headers.tsx +37 -0
- package/components/catalyst-ui/utils/server-timing.tsx +23 -0
- package/components/catalyst-ui/utils/utils.ts +43 -0
- package/components/catalyst-ui/utils/with-cookie.tsx +43 -0
- package/components/catalyst-ui/x/accordian-x.tsx +428 -0
- package/components/catalyst-ui/x/alert-x.tsx +413 -0
- package/components/catalyst-ui/x/animated-text-x.tsx +2242 -0
- package/components/catalyst-ui/x/avatar-x.tsx +515 -0
- package/components/catalyst-ui/x/badge-x.tsx +670 -0
- package/components/catalyst-ui/x/button-X.tsx +2857 -0
- package/components/catalyst-ui/x/button-group-x.tsx +847 -0
- package/components/catalyst-ui/x/calendar-x.tsx +1910 -0
- package/components/catalyst-ui/x/card-x.tsx +2597 -0
- package/components/catalyst-ui/x/checkbox-x.tsx +656 -0
- package/components/catalyst-ui/x/collapsible-x.tsx +1360 -0
- package/components/catalyst-ui/x/combobox-x.tsx +911 -0
- package/components/catalyst-ui/x/data-table-x.tsx +1753 -0
- package/components/catalyst-ui/x/date-picker-x.tsx +648 -0
- package/components/catalyst-ui/x/dialog-x.tsx +659 -0
- package/components/catalyst-ui/x/dropdown-menu-x.tsx +612 -0
- package/components/catalyst-ui/x/hover-card-x.tsx +375 -0
- package/components/catalyst-ui/x/icon-x.tsx +840 -0
- package/components/catalyst-ui/x/input-mask-x.tsx +981 -0
- package/components/catalyst-ui/x/input-otp-x.tsx +659 -0
- package/components/catalyst-ui/x/loader-x.tsx +1757 -0
- package/components/catalyst-ui/x/pagination-x.tsx +622 -0
- package/components/catalyst-ui/x/popover-x.tsx +744 -0
- package/components/catalyst-ui/x/radio-group-x.tsx +499 -0
- package/components/catalyst-ui/x/select-x.tsx +1127 -0
- package/components/catalyst-ui/x/sheet-x.tsx +668 -0
- package/components/catalyst-ui/x/switch-x.tsx +681 -0
- package/components/catalyst-ui/x/table-x.tsx +574 -0
- package/components/catalyst-ui/x/tabs-x.tsx +839 -0
- package/components/catalyst-ui/x/textarea-x.tsx +1263 -0
- package/components/catalyst-ui/x/tooltip-x.tsx +396 -0
- package/components/catalyst-ui/x/tracker-x.tsx +560 -0
- package/data/bg-data.tsx +901 -0
- package/data/buttons-data.tsx +2327 -0
- package/data/charts-data.tsx +102 -0
- package/data/chat-data.tsx +83 -0
- package/data/code-data.tsx +1040 -0
- package/data/comboboxes-data.tsx +1843 -0
- package/data/command-data.tsx +1381 -0
- package/data/core-data.tsx +15953 -0
- package/data/crm-data.tsx +47 -0
- package/data/data.tsx +159 -0
- package/data/date-and-time-data.tsx +554 -0
- package/data/dependencies.tsx +7 -0
- package/data/ecommerce-data.tsx +1387 -0
- package/data/forms-data.tsx +7890 -0
- package/data/hooks-data.tsx +5487 -0
- package/data/index.ts +34 -0
- package/data/inputs-data.tsx +557 -0
- package/data/interactive-data.tsx +5394 -0
- package/data/lofi-data.tsx +18295 -0
- package/data/marketing-data.tsx +2546 -0
- package/data/media-data.tsx +1510 -0
- package/data/motion-data.tsx +5801 -0
- package/data/overlay-data.tsx +4136 -0
- package/data/pdf-data.tsx +124 -0
- package/data/pos-data.tsx +213 -0
- package/data/postcss.config.js +6 -0
- package/data/primitive-data.tsx +5170 -0
- package/data/prompt-data.tsx +1226 -0
- package/data/requiredLibs.ts +4 -0
- package/data/sandbox-data.tsx +1 -0
- package/data/sidebars-data.tsx +5421 -0
- package/data/stacks-data.tsx +32 -0
- package/data/table-data.tsx +706 -0
- package/data/tailwind.config.js +3830 -0
- package/data/tailwind.config.ngin.js +3830 -0
- package/data/tailwind.css +431 -0
- package/data/tools-data.tsx +6910 -0
- package/data/typography-data.tsx +2050 -0
- package/data/utils-data.tsx +6500 -0
- package/data/x-data.tsx +1171 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30245 -0
- package/dist/index.js.map +362 -0
- package/package.json +50 -0
|
@@ -0,0 +1,1757 @@
|
|
|
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
|
+
|