@aiready/components 0.11.13 → 0.11.15

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.
@@ -0,0 +1,409 @@
1
+ import React from 'react';
2
+
3
+ export function RocketIcon({
4
+ className = 'w-6 h-6',
5
+ ...props
6
+ }: { className?: string } & React.SVGProps<SVGSVGElement>) {
7
+ return (
8
+ <svg
9
+ viewBox="0 0 24 24"
10
+ fill="none"
11
+ stroke="currentColor"
12
+ className={className}
13
+ {...props}
14
+ xmlns="http://www.w3.org/2000/svg"
15
+ >
16
+ <path
17
+ d="M12 2c1.5 0 3 1 3 1s1.2 1.8 1.2 4.2c0 2.4-1.2 5-3.6 7.4-2.4 2.4-5 3.6-7.4 3.6C3.8 18.2 2 17 2 17S3 15.5 3 14c0-2.1 1.5-3.6 1.5-3.6S7.5 9 9 9c2.4 0 3-7 3-7z"
18
+ strokeWidth="0"
19
+ fill="currentColor"
20
+ />
21
+ <path
22
+ d="M14 10c.8.8 2 2 3 3"
23
+ strokeWidth="1.5"
24
+ strokeLinecap="round"
25
+ strokeLinejoin="round"
26
+ />
27
+ </svg>
28
+ );
29
+ }
30
+
31
+ export function ChartIcon({
32
+ className = 'w-6 h-6',
33
+ ...props
34
+ }: { className?: string } & React.SVGProps<SVGSVGElement>) {
35
+ return (
36
+ <svg
37
+ viewBox="0 0 24 24"
38
+ fill="none"
39
+ stroke="currentColor"
40
+ className={className}
41
+ {...props}
42
+ xmlns="http://www.w3.org/2000/svg"
43
+ >
44
+ <rect x="3" y="3" width="18" height="18" rx="2" strokeWidth="1.2" />
45
+ <rect x="7" y="11" width="2" height="6" fill="currentColor" />
46
+ <rect x="11" y="8" width="2" height="9" fill="currentColor" />
47
+ <rect x="15" y="5" width="2" height="12" fill="currentColor" />
48
+ </svg>
49
+ );
50
+ }
51
+
52
+ export function TargetIcon({
53
+ className = 'w-6 h-6',
54
+ ...props
55
+ }: { className?: string } & React.SVGProps<SVGSVGElement>) {
56
+ return (
57
+ <svg
58
+ viewBox="0 0 24 24"
59
+ fill="none"
60
+ stroke="currentColor"
61
+ className={className}
62
+ {...props}
63
+ xmlns="http://www.w3.org/2000/svg"
64
+ >
65
+ <circle cx="12" cy="12" r="10" strokeWidth="1.2" />
66
+ <circle cx="12" cy="12" r="5" fill="currentColor" />
67
+ <path
68
+ d="M22 12h-3M5 12H2M12 2v3M12 19v3"
69
+ strokeWidth="1.2"
70
+ strokeLinecap="round"
71
+ />
72
+ </svg>
73
+ );
74
+ }
75
+
76
+ export function RobotIcon({
77
+ className = 'w-6 h-6',
78
+ ...props
79
+ }: { className?: string } & React.SVGProps<SVGSVGElement>) {
80
+ return (
81
+ <svg
82
+ viewBox="0 0 24 24"
83
+ fill="none"
84
+ stroke="currentColor"
85
+ className={className}
86
+ {...props}
87
+ xmlns="http://www.w3.org/2000/svg"
88
+ >
89
+ <rect x="3" y="7" width="18" height="11" rx="2" strokeWidth="1.2" />
90
+ <rect x="7" y="10" width="2" height="2" fill="currentColor" />
91
+ <rect x="15" y="10" width="2" height="2" fill="currentColor" />
92
+ <path d="M9 3v2M15 3v2" strokeWidth="1.2" strokeLinecap="round" />
93
+ </svg>
94
+ );
95
+ }
96
+
97
+ export function FileIcon({
98
+ className = 'w-6 h-6',
99
+ ...props
100
+ }: { className?: string } & React.SVGProps<SVGSVGElement>) {
101
+ return (
102
+ <svg
103
+ viewBox="0 0 24 24"
104
+ fill="none"
105
+ stroke="currentColor"
106
+ strokeWidth="2"
107
+ strokeLinecap="round"
108
+ strokeLinejoin="round"
109
+ className={className}
110
+ {...props}
111
+ xmlns="http://www.w3.org/2000/svg"
112
+ >
113
+ <path d="M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z" />
114
+ <polyline points="14 2 14 8 20 8" />
115
+ </svg>
116
+ );
117
+ }
118
+
119
+ export function ShieldIcon({
120
+ className = 'w-6 h-6',
121
+ ...props
122
+ }: { className?: string } & React.SVGProps<SVGSVGElement>) {
123
+ return (
124
+ <svg
125
+ viewBox="0 0 24 24"
126
+ fill="none"
127
+ stroke="currentColor"
128
+ strokeWidth="2"
129
+ strokeLinecap="round"
130
+ strokeLinejoin="round"
131
+ className={className}
132
+ {...props}
133
+ xmlns="http://www.w3.org/2000/svg"
134
+ >
135
+ <path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z" />
136
+ </svg>
137
+ );
138
+ }
139
+
140
+ export function TrendingUpIcon({
141
+ className = 'w-6 h-6',
142
+ ...props
143
+ }: { className?: string } & React.SVGProps<SVGSVGElement>) {
144
+ return (
145
+ <svg
146
+ viewBox="0 0 24 24"
147
+ fill="none"
148
+ stroke="currentColor"
149
+ strokeWidth="2"
150
+ strokeLinecap="round"
151
+ strokeLinejoin="round"
152
+ className={className}
153
+ {...props}
154
+ xmlns="http://www.w3.org/2000/svg"
155
+ >
156
+ <polyline points="23 6 13.5 15.5 8.5 10.5 1 18" />
157
+ <polyline points="17 6 23 6 23 12" />
158
+ </svg>
159
+ );
160
+ }
161
+
162
+ export function TrashIcon({
163
+ className = 'w-6 h-6',
164
+ ...props
165
+ }: { className?: string } & React.SVGProps<SVGSVGElement>) {
166
+ return (
167
+ <svg
168
+ viewBox="0 0 24 24"
169
+ fill="none"
170
+ stroke="currentColor"
171
+ strokeWidth="2"
172
+ strokeLinecap="round"
173
+ strokeLinejoin="round"
174
+ className={className}
175
+ {...props}
176
+ xmlns="http://www.w3.org/2000/svg"
177
+ >
178
+ <polyline points="3 6 5 6 21 6" />
179
+ <path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" />
180
+ </svg>
181
+ );
182
+ }
183
+
184
+ export function PlayIcon({
185
+ className = 'w-6 h-6',
186
+ ...props
187
+ }: { className?: string } & React.SVGProps<SVGSVGElement>) {
188
+ return (
189
+ <svg
190
+ viewBox="0 0 24 24"
191
+ fill="none"
192
+ stroke="currentColor"
193
+ strokeWidth="2"
194
+ strokeLinecap="round"
195
+ strokeLinejoin="round"
196
+ className={className}
197
+ {...props}
198
+ xmlns="http://www.w3.org/2000/svg"
199
+ >
200
+ <polygon points="5 3 19 12 5 21 5 3" />
201
+ </svg>
202
+ );
203
+ }
204
+
205
+ export function UploadIcon({
206
+ className = 'w-6 h-6',
207
+ ...props
208
+ }: { className?: string } & React.SVGProps<SVGSVGElement>) {
209
+ return (
210
+ <svg
211
+ viewBox="0 0 24 24"
212
+ fill="none"
213
+ stroke="currentColor"
214
+ strokeWidth="2"
215
+ strokeLinecap="round"
216
+ strokeLinejoin="round"
217
+ className={className}
218
+ {...props}
219
+ xmlns="http://www.w3.org/2000/svg"
220
+ >
221
+ <path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v4" />
222
+ <polyline points="17 8 12 3 7 8" />
223
+ <line x1="12" y1="3" x2="12" y2="15" />
224
+ </svg>
225
+ );
226
+ }
227
+
228
+ export function AlertCircleIcon({
229
+ className = 'w-6 h-6',
230
+ ...props
231
+ }: { className?: string } & React.SVGProps<SVGSVGElement>) {
232
+ return (
233
+ <svg
234
+ viewBox="0 0 24 24"
235
+ fill="none"
236
+ stroke="currentColor"
237
+ strokeWidth="2"
238
+ strokeLinecap="round"
239
+ strokeLinejoin="round"
240
+ className={className}
241
+ {...props}
242
+ xmlns="http://www.w3.org/2000/svg"
243
+ >
244
+ <circle cx="12" cy="12" r="10" />
245
+ <line x1="12" y1="8" x2="12" y2="12" />
246
+ <line x1="12" y1="16" x2="12.01" y2="16" />
247
+ </svg>
248
+ );
249
+ }
250
+
251
+ export function InfoIcon({
252
+ className = 'w-6 h-6',
253
+ ...props
254
+ }: { className?: string } & React.SVGProps<SVGSVGElement>) {
255
+ return (
256
+ <svg
257
+ viewBox="0 0 24 24"
258
+ fill="none"
259
+ stroke="currentColor"
260
+ strokeWidth="2"
261
+ strokeLinecap="round"
262
+ strokeLinejoin="round"
263
+ className={className}
264
+ {...props}
265
+ xmlns="http://www.w3.org/2000/svg"
266
+ >
267
+ <circle cx="12" cy="12" r="10" />
268
+ <line x1="12" y1="16" x2="12" y2="12" />
269
+ <line x1="12" y1="8" x2="12.01" y2="8" />
270
+ </svg>
271
+ );
272
+ }
273
+
274
+ export function BrainIcon({
275
+ className = 'w-6 h-6',
276
+ ...props
277
+ }: { className?: string } & React.SVGProps<SVGSVGElement>) {
278
+ return (
279
+ <svg
280
+ viewBox="0 0 24 24"
281
+ fill="none"
282
+ stroke="currentColor"
283
+ strokeWidth="2"
284
+ strokeLinecap="round"
285
+ strokeLinejoin="round"
286
+ className={className}
287
+ {...props}
288
+ xmlns="http://www.w3.org/2000/svg"
289
+ >
290
+ <path d="M9.5 2A2.5 2.5 0 0 1 12 4.5v15a2.5 2.5 0 0 1-4.96.44 2.5 2.5 0 0 1-2.74-3.41A2.5 2.5 0 0 1 2 14c0-1.5 1-2 1-2s-1-.5-1-2a2.5 2.5 0 0 1 2.3-2.48A2.5 2.5 0 0 1 7 5.5a2.5 2.5 0 0 1 2.5-3.5z" />
291
+ <path d="M14.5 2A2.5 2.5 0 0 0 12 4.5v15a2.5 2.5 0 0 0 4.96.44 2.5 2.5 0 0 0 2.74-3.41A2.5 2.5 0 0 0 22 14c0-1.5-1-2-1-2s1-.5 1-2a2.5 2.5 0 0 0-2.3-2.48A2.5 2.5 0 0 0 17 5.5a2.5 2.5 0 0 0-2.5-3.5z" />
292
+ </svg>
293
+ );
294
+ }
295
+
296
+ export function TerminalIcon({
297
+ className = 'w-6 h-6',
298
+ ...props
299
+ }: { className?: string } & React.SVGProps<SVGSVGElement>) {
300
+ return (
301
+ <svg
302
+ viewBox="0 0 24 24"
303
+ fill="none"
304
+ stroke="currentColor"
305
+ strokeWidth="2"
306
+ strokeLinecap="round"
307
+ strokeLinejoin="round"
308
+ className={className}
309
+ {...props}
310
+ xmlns="http://www.w3.org/2000/svg"
311
+ >
312
+ <polyline points="4 17 10 11 4 5" />
313
+ <line x1="12" y1="19" x2="20" y2="19" />
314
+ </svg>
315
+ );
316
+ }
317
+
318
+ export function CommandLineIcon(
319
+ props: { className?: string } & React.SVGProps<SVGSVGElement>
320
+ ) {
321
+ return <TerminalIcon {...props} />;
322
+ }
323
+
324
+ export function SettingsIcon({
325
+ className = 'w-6 h-6',
326
+ ...props
327
+ }: { className?: string } & React.SVGProps<SVGSVGElement>) {
328
+ return (
329
+ <svg
330
+ viewBox="0 0 24 24"
331
+ fill="none"
332
+ stroke="currentColor"
333
+ strokeWidth="2"
334
+ strokeLinecap="round"
335
+ strokeLinejoin="round"
336
+ className={className}
337
+ {...props}
338
+ xmlns="http://www.w3.org/2000/svg"
339
+ >
340
+ <path d="M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.38a2 2 0 0 0-.73-2.73l-.15-.1a2 2 0 0 1-1-1.72v-.51a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z" />
341
+ <circle cx="12" cy="12" r="3" />
342
+ </svg>
343
+ );
344
+ }
345
+
346
+ export function SaveIcon({
347
+ className = 'w-6 h-6',
348
+ ...props
349
+ }: { className?: string } & React.SVGProps<SVGSVGElement>) {
350
+ return (
351
+ <svg
352
+ viewBox="0 0 24 24"
353
+ fill="none"
354
+ stroke="currentColor"
355
+ strokeWidth="2"
356
+ strokeLinecap="round"
357
+ strokeLinejoin="round"
358
+ className={className}
359
+ {...props}
360
+ xmlns="http://www.w3.org/2000/svg"
361
+ >
362
+ <path d="M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z" />
363
+ <polyline points="17 21 17 13 7 13 7 21" />
364
+ <polyline points="7 3 7 8 15 8" />
365
+ </svg>
366
+ );
367
+ }
368
+
369
+ export function RefreshCwIcon({
370
+ className = 'w-6 h-6',
371
+ ...props
372
+ }: { className?: string } & React.SVGProps<SVGSVGElement>) {
373
+ return (
374
+ <svg
375
+ viewBox="0 0 24 24"
376
+ fill="none"
377
+ stroke="currentColor"
378
+ strokeWidth="2"
379
+ strokeLinecap="round"
380
+ strokeLinejoin="round"
381
+ className={className}
382
+ {...props}
383
+ xmlns="http://www.w3.org/2000/svg"
384
+ >
385
+ <path d="M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8" />
386
+ <path d="M21 3v5h-5" />
387
+ <path d="M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16" />
388
+ <path d="M3 21v-5h5" />
389
+ </svg>
390
+ );
391
+ }
392
+
393
+ export default {
394
+ RocketIcon,
395
+ ChartIcon,
396
+ TargetIcon,
397
+ RobotIcon,
398
+ FileIcon,
399
+ ShieldIcon,
400
+ TrendingUpIcon,
401
+ TrashIcon,
402
+ PlayIcon,
403
+ UploadIcon,
404
+ AlertCircleIcon,
405
+ InfoIcon,
406
+ BrainIcon,
407
+ TerminalIcon,
408
+ CommandLineIcon,
409
+ };
@@ -0,0 +1,96 @@
1
+ 'use client';
2
+
3
+ import * as React from 'react';
4
+ import { motion, AnimatePresence } from 'framer-motion';
5
+ import { X } from 'lucide-react';
6
+ import { useEffect } from 'react';
7
+ import { cn } from '../utils/cn';
8
+
9
+ export interface ModalProps {
10
+ isOpen: boolean;
11
+ onClose: () => void;
12
+ children: React.ReactNode;
13
+ maxWidth?: string;
14
+ showClose?: boolean;
15
+ variant?: 'default' | 'glass';
16
+ }
17
+
18
+ export function Modal({
19
+ isOpen,
20
+ onClose,
21
+ children,
22
+ maxWidth = 'max-w-4xl',
23
+ showClose = true,
24
+ variant = 'glass',
25
+ }: ModalProps) {
26
+ // Prevent scrolling when modal is open
27
+ useEffect(() => {
28
+ if (isOpen) {
29
+ document.body.style.overflow = 'hidden';
30
+ } else {
31
+ document.body.style.overflow = 'unset';
32
+ }
33
+ return () => {
34
+ document.body.style.overflow = 'unset';
35
+ };
36
+ }, [isOpen]);
37
+
38
+ // Close on escape key
39
+ useEffect(() => {
40
+ const handleEsc = (e: KeyboardEvent) => {
41
+ if (e.key === 'Escape') onClose();
42
+ };
43
+ window.addEventListener('keydown', handleEsc);
44
+ return () => window.removeEventListener('keydown', handleEsc);
45
+ }, [onClose]);
46
+
47
+ return (
48
+ <AnimatePresence>
49
+ {isOpen && (
50
+ <div className="fixed inset-0 z-[100] flex items-center justify-center p-4">
51
+ {/* Backdrop */}
52
+ <motion.div
53
+ initial={{ opacity: 0 }}
54
+ animate={{ opacity: 1 }}
55
+ exit={{ opacity: 0 }}
56
+ onClick={onClose}
57
+ className="absolute inset-0 bg-slate-950/60 backdrop-blur-md"
58
+ />
59
+
60
+ {/* Modal Content */}
61
+ <motion.div
62
+ initial={{ opacity: 0, scale: 0.95, y: 20 }}
63
+ animate={{ opacity: 1, scale: 1, y: 0 }}
64
+ exit={{ opacity: 0, scale: 0.95, y: 20 }}
65
+ className={cn(
66
+ 'relative w-full max-h-[90vh] overflow-y-auto shadow-2xl transition-all',
67
+ maxWidth,
68
+ variant === 'glass'
69
+ ? 'bg-slate-900/90 backdrop-blur-xl rounded-3xl border border-indigo-500/30'
70
+ : 'bg-white rounded-3xl',
71
+ 'scrollbar-thin scrollbar-thumb-slate-700'
72
+ )}
73
+ >
74
+ {/* Close Button */}
75
+ {showClose && (
76
+ <button
77
+ onClick={onClose}
78
+ className={cn(
79
+ 'absolute top-6 right-6 p-2 rounded-full transition-colors z-50',
80
+ variant === 'glass'
81
+ ? 'text-slate-400 hover:text-white hover:bg-slate-800'
82
+ : 'bg-white/80 backdrop-blur-sm text-slate-500 hover:bg-slate-100'
83
+ )}
84
+ aria-label="Close modal"
85
+ >
86
+ <X className="w-6 h-6" />
87
+ </button>
88
+ )}
89
+
90
+ <div className="p-2 sm:p-4">{children}</div>
91
+ </motion.div>
92
+ </div>
93
+ )}
94
+ </AnimatePresence>
95
+ );
96
+ }
@@ -0,0 +1,144 @@
1
+ 'use client';
2
+
3
+ import { motion } from 'framer-motion';
4
+ import { cn } from '../utils/cn';
5
+
6
+ export interface ScoreCircleProps {
7
+ score: number;
8
+ progress?: number;
9
+ isInView?: boolean;
10
+ size?: 'sm' | 'md' | 'lg' | 'xl';
11
+ showLabel?: boolean;
12
+ className?: string;
13
+ }
14
+
15
+ export function ScoreCircle({
16
+ score,
17
+ progress: customProgress,
18
+ isInView = true,
19
+ size = 'md',
20
+ showLabel = true,
21
+ className,
22
+ }: ScoreCircleProps) {
23
+ const progress = customProgress ?? score;
24
+
25
+ const getScoreColor = () => {
26
+ if (score >= 80)
27
+ return { stroke: '#10b981', glow: 'rgba(16, 185, 129, 0.3)' };
28
+ if (score >= 60)
29
+ return { stroke: '#eab308', glow: 'rgba(234, 179, 8, 0.3)' };
30
+ return { stroke: '#ef4444', glow: 'rgba(239, 68, 68, 0.3)' };
31
+ };
32
+
33
+ const scoreColor = getScoreColor();
34
+
35
+ const sizeMap = {
36
+ sm: 'w-32 h-32',
37
+ md: 'w-48 h-48',
38
+ lg: 'w-64 h-64',
39
+ xl: 'w-80 h-80',
40
+ };
41
+
42
+ const textMap = {
43
+ sm: { score: 'text-3xl', label: 'text-[8px]', title: 'text-sm' },
44
+ md: { score: 'text-5xl', label: 'text-[10px]', title: 'text-lg' },
45
+ lg: { score: 'text-6xl', label: 'text-xs', title: 'text-xl' },
46
+ xl: { score: 'text-7xl', label: 'text-sm', title: 'text-2xl' },
47
+ };
48
+
49
+ const currentSize = sizeMap[size];
50
+ const currentText = textMap[size];
51
+
52
+ return (
53
+ <div className={cn('relative', currentSize, className)}>
54
+ <div
55
+ className="absolute inset-0 rounded-full blur-2xl opacity-50 transition-all duration-500"
56
+ style={{ backgroundColor: scoreColor.glow }}
57
+ />
58
+
59
+ <svg
60
+ className="w-full h-full transform -rotate-90 relative z-10"
61
+ viewBox="0 0 100 100"
62
+ >
63
+ {Array.from({ length: 20 }).map((_, i) => {
64
+ const angle = (i * 360) / 20;
65
+ const startAngle = angle - 85;
66
+ const radius = 42; // Out of 50
67
+ const strokeWidth = 6;
68
+ const gapAngle = 4;
69
+
70
+ const startX = 50 + radius * Math.cos((startAngle * Math.PI) / 180);
71
+ const startY = 50 + radius * Math.sin((startAngle * Math.PI) / 180);
72
+ const endX =
73
+ 50 +
74
+ radius *
75
+ Math.cos(((startAngle + 360 / 20 - gapAngle) * Math.PI) / 180);
76
+ const endY =
77
+ 50 +
78
+ radius *
79
+ Math.sin(((startAngle + 360 / 20 - gapAngle) * Math.PI) / 180);
80
+
81
+ const isActive = (i / 20) * 100 <= progress;
82
+
83
+ return (
84
+ <motion.line
85
+ key={i}
86
+ x1={`${startX}`}
87
+ y1={`${startY}`}
88
+ x2={`${endX}`}
89
+ y2={`${endY}`}
90
+ stroke={isActive ? scoreColor.stroke : '#334155'}
91
+ strokeWidth={strokeWidth}
92
+ strokeLinecap="round"
93
+ initial={{ opacity: 0.3 }}
94
+ animate={{
95
+ opacity: isActive ? 1 : 0.3,
96
+ filter: isActive
97
+ ? `drop-shadow(0 0 2px ${scoreColor.stroke})`
98
+ : 'none',
99
+ }}
100
+ transition={{ duration: 0.3 }}
101
+ />
102
+ );
103
+ })}
104
+ </svg>
105
+
106
+ <div className="absolute inset-0 flex flex-col items-center justify-center z-20">
107
+ <motion.div
108
+ initial={{ scale: 0 }}
109
+ animate={isInView ? { scale: 1 } : { scale: 0 }}
110
+ transition={{ duration: 0.5, delay: 0.3 }}
111
+ className="text-center"
112
+ >
113
+ <motion.div
114
+ className={cn('font-black mb-1', currentText.score)}
115
+ style={{ color: scoreColor.stroke }}
116
+ animate={{
117
+ textShadow: `0 0 20px ${scoreColor.glow}, 0 0 40px ${scoreColor.glow}`,
118
+ }}
119
+ >
120
+ {score}
121
+ </motion.div>
122
+ {showLabel && (
123
+ <>
124
+ <div
125
+ className={cn(
126
+ 'font-bold uppercase tracking-wider text-slate-400 mb-0.5',
127
+ currentText.label
128
+ )}
129
+ >
130
+ AI Readiness
131
+ </div>
132
+ <div
133
+ className={cn('font-black tracking-tight', currentText.title)}
134
+ style={{ color: scoreColor.stroke }}
135
+ >
136
+ SCORE
137
+ </div>
138
+ </>
139
+ )}
140
+ </motion.div>
141
+ </div>
142
+ </div>
143
+ );
144
+ }
@@ -1,7 +1,2 @@
1
- export {
2
- ScoreBar,
3
- ScoreCard,
4
- type ScoreBarProps,
5
- type ScoreCardProps,
6
- type ScoreRating,
7
- } from './ScoreBar';
1
+ export * from './ScoreBar';
2
+ export * from './ScoreCircle';