sarveshpatel commited on
Commit
bb5d4f8
·
verified ·
1 Parent(s): d998e42

Upload 19 files

Browse files
.env.local ADDED
@@ -0,0 +1 @@
 
 
1
+ GEMINI_API_KEY=PLACEHOLDER_API_KEY
.gitignore ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Logs
2
+ logs
3
+ *.log
4
+ npm-debug.log*
5
+ yarn-debug.log*
6
+ yarn-error.log*
7
+ pnpm-debug.log*
8
+ lerna-debug.log*
9
+
10
+ node_modules
11
+ dist
12
+ dist-ssr
13
+ *.local
14
+
15
+ # Editor directories and files
16
+ .vscode/*
17
+ !.vscode/extensions.json
18
+ .idea
19
+ .DS_Store
20
+ *.suo
21
+ *.ntvs*
22
+ *.njsproj
23
+ *.sln
24
+ *.sw?
App.tsx ADDED
@@ -0,0 +1,142 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React, { useState, useEffect } from 'react';
2
+ import { PRESENTATION_DATA } from './data';
3
+ import { SlideRenderer } from './components/SlideRenderer';
4
+ import { ChevronRight, ChevronLeft } from 'lucide-react';
5
+ import { motion } from 'framer-motion';
6
+
7
+ const App: React.FC = () => {
8
+ const [currentSlideIdx, setCurrentSlideIdx] = useState(0);
9
+ const [direction, setDirection] = useState(0);
10
+
11
+ const totalSlides = PRESENTATION_DATA.slides.length;
12
+ const currentSlide = PRESENTATION_DATA.slides[currentSlideIdx];
13
+
14
+ const nextSlide = () => {
15
+ if (currentSlideIdx < totalSlides - 1) {
16
+ setDirection(1);
17
+ setCurrentSlideIdx(prev => prev + 1);
18
+ }
19
+ };
20
+
21
+ const prevSlide = () => {
22
+ if (currentSlideIdx > 0) {
23
+ setDirection(-1);
24
+ setCurrentSlideIdx(prev => prev - 1);
25
+ }
26
+ };
27
+
28
+ // Keyboard navigation
29
+ useEffect(() => {
30
+ const handleKeyDown = (e: KeyboardEvent) => {
31
+ if (e.key === 'ArrowRight' || e.key === 'Space') {
32
+ nextSlide();
33
+ } else if (e.key === 'ArrowLeft') {
34
+ prevSlide();
35
+ }
36
+ };
37
+ window.addEventListener('keydown', handleKeyDown);
38
+ return () => window.removeEventListener('keydown', handleKeyDown);
39
+ }, [currentSlideIdx]);
40
+
41
+ const progress = ((currentSlideIdx + 1) / totalSlides) * 100;
42
+
43
+ return (
44
+ <div className="w-screen h-screen relative overflow-hidden bg-background text-text selection:bg-primary/20">
45
+
46
+ {/* Background Yellow/Orange Blur Globe - Bottom Right */}
47
+ <motion.div
48
+ className="absolute -bottom-[25%] -right-[15%] w-[80vw] h-[80vw] max-w-[1200px] max-h-[1200px] rounded-full pointer-events-none"
49
+ style={{
50
+ background: 'radial-gradient(circle, rgba(250, 204, 21, 0.25) 0%, rgba(249, 115, 22, 0.15) 40%, transparent 70%)',
51
+ filter: 'blur(80px)',
52
+ transform: 'translateZ(0)', // Hardware acceleration
53
+ }}
54
+ animate={{
55
+ scale: [1, 1.15, 1],
56
+ opacity: [0.8, 1, 0.8],
57
+ x: [0, 20, 0],
58
+ y: [0, -20, 0],
59
+ }}
60
+ transition={{
61
+ duration: 15,
62
+ repeat: Infinity,
63
+ ease: "easeInOut"
64
+ }}
65
+ />
66
+
67
+ {/* Secondary accent orb - Top Left (Blue/Cyan to balance) */}
68
+ <motion.div
69
+ className="absolute -top-[15%] -left-[10%] w-[50vw] h-[50vw] rounded-full pointer-events-none"
70
+ style={{
71
+ background: 'radial-gradient(circle, rgba(14, 165, 233, 0.1) 0%, rgba(6, 182, 212, 0.05) 50%, transparent 70%)',
72
+ filter: 'blur(60px)',
73
+ }}
74
+ animate={{
75
+ scale: [1, 1.1, 1],
76
+ }}
77
+ transition={{
78
+ duration: 12,
79
+ repeat: Infinity,
80
+ ease: "easeInOut"
81
+ }}
82
+ />
83
+
84
+ {/* Subtle Noise Texture overlay */}
85
+ <div className="absolute inset-0 bg-[url('https://grainy-gradients.vercel.app/noise.svg')] opacity-20 pointer-events-none mix-blend-overlay"></div>
86
+
87
+ {/* Sticky Logo */}
88
+ <div className="absolute top-0 w-full z-50 flex justify-center pt-8 pb-4 pointer-events-none">
89
+ <div className="bg-white/70 backdrop-blur-md px-6 py-3 rounded-full border border-white/40 shadow-lg hover:shadow-xl hover:scale-105 transition-all duration-300 pointer-events-auto cursor-pointer">
90
+ <img
91
+ src="https://synthesys.co.in/wp-content/uploads/2021/05/SynthesysLOGO.png"
92
+ alt="Synthesys Logo"
93
+ className="h-8 md:h-10 w-auto object-contain opacity-90 hover:opacity-100 transition-opacity"
94
+ />
95
+ </div>
96
+ </div>
97
+
98
+ {/* Render Slide */}
99
+ <main className="relative w-full h-full z-10 pt-20">
100
+ <SlideRenderer slide={currentSlide} direction={direction} />
101
+ </main>
102
+
103
+ {/* Controls Overlay */}
104
+ <div className="absolute bottom-0 left-0 w-full z-50 p-6 flex items-center justify-between">
105
+
106
+ {/* Slide Counter */}
107
+ <div className="text-muted font-mono text-sm bg-white/50 px-3 py-1 rounded-full backdrop-blur-sm">
108
+ {currentSlideIdx + 1} <span className="text-slate-400">/</span> {totalSlides}
109
+ </div>
110
+
111
+ {/* Navigation Buttons */}
112
+ <div className="flex gap-4">
113
+ <button
114
+ onClick={prevSlide}
115
+ disabled={currentSlideIdx === 0}
116
+ className="p-3 rounded-full bg-white/80 hover:bg-white backdrop-blur-md border border-slate-200 text-slate-700 shadow-sm disabled:opacity-30 disabled:cursor-not-allowed transition-all active:scale-95 hover:shadow-md"
117
+ >
118
+ <ChevronLeft size={20} />
119
+ </button>
120
+ <button
121
+ onClick={nextSlide}
122
+ disabled={currentSlideIdx === totalSlides - 1}
123
+ className="p-3 rounded-full bg-white/80 hover:bg-white backdrop-blur-md border border-slate-200 text-slate-700 shadow-sm disabled:opacity-30 disabled:cursor-not-allowed transition-all active:scale-95 hover:shadow-md"
124
+ >
125
+ <ChevronRight size={20} />
126
+ </button>
127
+ </div>
128
+ </div>
129
+
130
+ {/* Progress Bar */}
131
+ <div className="absolute bottom-0 left-0 h-1.5 bg-slate-100 w-full z-50">
132
+ <div
133
+ className="h-full bg-gradient-to-r from-primary to-secondary"
134
+ style={{ width: `${progress}%`, transition: 'width 0.5s cubic-bezier(0.16, 1, 0.3, 1)' }}
135
+ />
136
+ </div>
137
+
138
+ </div>
139
+ );
140
+ };
141
+
142
+ export default App;
components/SlideRenderer.tsx ADDED
@@ -0,0 +1,94 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React from 'react';
2
+ import { Slide } from '../types';
3
+ import { HeroSlide } from './slides/HeroSlide';
4
+ import { ContentSlide } from './slides/ContentSlide';
5
+ import { SplitSlide } from './slides/SplitSlide';
6
+ import { ToolSlide } from './slides/ToolSlide';
7
+ import { ProcessSlide } from './slides/ProcessSlide';
8
+ import { AnimatePresence, motion } from 'framer-motion';
9
+
10
+ export const SlideRenderer: React.FC<{ slide: Slide, direction: number }> = ({ slide, direction }) => {
11
+ let Component;
12
+
13
+ switch (slide.type) {
14
+ case 'hero':
15
+ Component = HeroSlide;
16
+ break;
17
+ case 'problem':
18
+ case 'solution':
19
+ case 'vision':
20
+ case 'summary':
21
+ case 'closing':
22
+ case 'use-cases':
23
+ Component = ContentSlide;
24
+ break;
25
+ case 'comparison':
26
+ Component = SplitSlide;
27
+ break;
28
+ case 'tool-intro':
29
+ case 'features':
30
+ Component = ToolSlide;
31
+ break;
32
+ case 'process':
33
+ case 'diagram':
34
+ Component = ProcessSlide;
35
+ break;
36
+ default:
37
+ Component = ContentSlide;
38
+ }
39
+
40
+ // Premium animation variants: Modern Ease curves, opacity, scale, and blur for depth
41
+ const variants = {
42
+ enter: (direction: number) => ({
43
+ x: direction > 0 ? '100%' : '-100%',
44
+ opacity: 0,
45
+ scale: 0.9,
46
+ filter: 'blur(8px)',
47
+ zIndex: 0
48
+ }),
49
+ center: {
50
+ zIndex: 1,
51
+ x: 0,
52
+ opacity: 1,
53
+ scale: 1,
54
+ filter: 'blur(0px)',
55
+ transition: {
56
+ x: { type: "tween", ease: [0.16, 1, 0.3, 1], duration: 0.8 }, // "Apple-like" ease
57
+ opacity: { duration: 0.4 },
58
+ scale: { duration: 0.6, ease: [0.16, 1, 0.3, 1] },
59
+ filter: { duration: 0.4 }
60
+ }
61
+ },
62
+ exit: (direction: number) => ({
63
+ zIndex: 0,
64
+ x: direction < 0 ? '50%' : '-50%',
65
+ opacity: 0,
66
+ scale: 0.95,
67
+ filter: 'blur(4px)',
68
+ transition: {
69
+ x: { type: "tween", ease: [0.16, 1, 0.3, 1], duration: 0.6 },
70
+ opacity: { duration: 0.4 },
71
+ scale: { duration: 0.6 },
72
+ filter: { duration: 0.4 }
73
+ }
74
+ })
75
+ };
76
+
77
+ return (
78
+ <AnimatePresence initial={false} custom={direction} mode="popLayout">
79
+ <motion.div
80
+ key={slide.id}
81
+ custom={direction}
82
+ variants={variants}
83
+ initial="enter"
84
+ animate="center"
85
+ exit="exit"
86
+ className="w-full h-full absolute top-0 left-0 overflow-y-auto flex flex-col"
87
+ >
88
+ <div className="w-full flex-grow flex flex-col justify-center">
89
+ <Component slide={slide} />
90
+ </div>
91
+ </motion.div>
92
+ </AnimatePresence>
93
+ );
94
+ };
components/slides/ContentSlide.tsx ADDED
@@ -0,0 +1,143 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React from 'react';
2
+ import { Slide } from '../../types';
3
+ import { motion } from 'framer-motion';
4
+ import { Check, X, ExternalLink } from 'lucide-react';
5
+
6
+ export const ContentSlide: React.FC<{ slide: Slide }> = ({ slide }) => {
7
+ const isProblem = slide.type === 'problem';
8
+ const isVision = slide.type === 'vision';
9
+ const isClosing = slide.type === 'closing';
10
+
11
+ if (isClosing) {
12
+ return (
13
+ <div className="flex flex-col items-center justify-center h-full text-center">
14
+ <motion.h1
15
+ className="text-6xl md:text-7xl font-bold text-slate-900 mb-6"
16
+ initial={{ scale: 0.9, opacity: 0 }}
17
+ animate={{ scale: 1, opacity: 1 }}
18
+ transition={{ duration: 0.8 }}
19
+ >
20
+ {slide.content.title}
21
+ </motion.h1>
22
+ <motion.p
23
+ className="text-2xl text-slate-500 mb-8 font-light"
24
+ initial={{ y: 20, opacity: 0 }}
25
+ animate={{ y: 0, opacity: 1 }}
26
+ transition={{ delay: 0.3 }}
27
+ >
28
+ {slide.content.tagline}
29
+ </motion.p>
30
+ </div>
31
+ )
32
+ }
33
+
34
+ if (isVision) {
35
+ return (
36
+ <div className="flex flex-col items-center justify-center h-full text-center px-8 relative z-20">
37
+ <motion.div
38
+ className="bg-white/80 p-12 md:p-16 rounded-[2rem] border border-white shadow-xl max-w-5xl backdrop-blur-md relative overflow-hidden"
39
+ initial={{ scale: 0.9, opacity: 0, y: 20 }}
40
+ animate={{ scale: 1, opacity: 1, y: 0 }}
41
+ transition={{ duration: 1, ease: [0.16, 1, 0.3, 1] }}
42
+ >
43
+ {/* Decorative blob inside card */}
44
+ <div className="absolute -top-20 -right-20 w-64 h-64 bg-primary/10 rounded-full blur-3xl pointer-events-none" />
45
+
46
+ <motion.h2
47
+ className="text-sm font-bold text-primary uppercase tracking-[0.2em] mb-6"
48
+ initial={{ opacity: 0 }}
49
+ animate={{ opacity: 1 }}
50
+ transition={{ delay: 0.4 }}
51
+ >
52
+ {slide.content.heading}
53
+ </motion.h2>
54
+
55
+ <motion.h1
56
+ className="text-4xl md:text-6xl font-black text-slate-900 mb-8 leading-tight tracking-tight"
57
+ initial={{ opacity: 0, y: 10 }}
58
+ animate={{ opacity: 1, y: 0 }}
59
+ transition={{ delay: 0.5 }}
60
+ >
61
+ {slide.content.subheading}
62
+ </motion.h1>
63
+
64
+ <div className="w-24 h-1.5 bg-gradient-to-r from-primary to-secondary mx-auto mb-10 rounded-full opacity-100" />
65
+
66
+ <motion.p
67
+ className="text-xl md:text-2xl text-slate-600 font-normal leading-relaxed max-w-3xl mx-auto"
68
+ initial={{ opacity: 0 }}
69
+ animate={{ opacity: 1 }}
70
+ transition={{ delay: 0.7 }}
71
+ >
72
+ "{slide.content.description}"
73
+ </motion.p>
74
+ </motion.div>
75
+ </div>
76
+ )
77
+ }
78
+
79
+ return (
80
+ <div className="flex flex-col h-full justify-center px-8 max-w-5xl mx-auto relative z-10">
81
+ <motion.div
82
+ className="mb-10"
83
+ initial={{ opacity: 0, x: -20 }}
84
+ animate={{ opacity: 1, x: 0 }}
85
+ >
86
+ <h2 className={`text-5xl font-bold flex items-center gap-4 ${isProblem ? 'text-red-500' : 'text-slate-900'}`}>
87
+ {slide.title}
88
+ </h2>
89
+ </motion.div>
90
+
91
+ {slide.content.intro && (
92
+ <motion.p
93
+ className="text-2xl text-slate-500 mb-10 font-light border-l-4 border-primary/50 pl-6"
94
+ initial={{ opacity: 0 }}
95
+ animate={{ opacity: 1 }}
96
+ transition={{ delay: 0.2 }}
97
+ >
98
+ {slide.content.intro}
99
+ </motion.p>
100
+ )}
101
+
102
+ <div className="grid gap-4 mb-10">
103
+ {slide.content.bullets?.map((bullet, idx) => (
104
+ <motion.div
105
+ key={idx}
106
+ initial={{ opacity: 0, x: 20 }}
107
+ animate={{ opacity: 1, x: 0 }}
108
+ transition={{ delay: 0.3 + (idx * 0.1) }}
109
+ className={`flex items-start gap-4 p-5 rounded-xl border transition-all hover:shadow-sm ${
110
+ isProblem
111
+ ? 'bg-red-50 border-red-100'
112
+ : 'bg-white border-slate-100 shadow-sm'
113
+ }`}
114
+ >
115
+ <div className={`mt-1 flex-shrink-0 ${isProblem ? 'text-red-500' : 'text-primary'}`}>
116
+ {isProblem ? <X size={24} strokeWidth={3} /> : <Check size={24} strokeWidth={3} />}
117
+ </div>
118
+ <span className={`text-xl font-medium ${isProblem ? 'text-red-900' : 'text-slate-700'}`}>{bullet}</span>
119
+ </motion.div>
120
+ ))}
121
+ </div>
122
+
123
+ {slide.content.callToAction && (
124
+ <motion.div
125
+ initial={{ opacity: 0, y: 20 }}
126
+ animate={{ opacity: 1, y: 0 }}
127
+ transition={{ delay: 0.6 }}
128
+ >
129
+ <a
130
+ href={slide.content.callToAction.url}
131
+ target="_blank"
132
+ rel="noreferrer"
133
+ className="inline-flex items-center gap-2 px-8 py-4 bg-gradient-to-r from-primary to-accent hover:from-primary/90 hover:to-accent/90 text-white font-bold text-lg rounded-full shadow-lg shadow-primary/20 hover:shadow-primary/40 transition-all transform hover:-translate-y-1"
134
+ >
135
+ {slide.content.callToAction.icon && <span>{slide.content.callToAction.icon}</span>}
136
+ {slide.content.callToAction.text}
137
+ <ExternalLink size={20} />
138
+ </a>
139
+ </motion.div>
140
+ )}
141
+ </div>
142
+ );
143
+ };
components/slides/HeroSlide.tsx ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React from 'react';
2
+ import { Slide } from '../../types';
3
+ import { motion } from 'framer-motion';
4
+
5
+ export const HeroSlide: React.FC<{ slide: Slide }> = ({ slide }) => {
6
+ return (
7
+ <div className="flex flex-col items-center justify-center h-full text-center px-4">
8
+ <motion.div
9
+ initial={{ opacity: 0, scale: 0.8 }}
10
+ animate={{ opacity: 1, scale: 1 }}
11
+ transition={{ duration: 0.8, ease: "easeOut" }}
12
+ >
13
+ <span className="inline-block py-1.5 px-4 rounded-full bg-white border border-slate-200 text-secondary text-sm font-semibold mb-8 shadow-sm tracking-wide">
14
+ {slide.metadata?.date || '2025'} Presentation
15
+ </span>
16
+ </motion.div>
17
+
18
+ <motion.h1
19
+ className="text-5xl md:text-8xl font-black text-slate-900 mb-6 max-w-5xl tracking-tight"
20
+ initial={{ opacity: 0, y: 30 }}
21
+ animate={{ opacity: 1, y: 0 }}
22
+ transition={{ delay: 0.2, duration: 0.8 }}
23
+ >
24
+ {slide.title}
25
+ </motion.h1>
26
+
27
+ <motion.h2
28
+ className="text-2xl md:text-4xl text-slate-500 font-light mb-10 max-w-3xl"
29
+ initial={{ opacity: 0 }}
30
+ animate={{ opacity: 1 }}
31
+ transition={{ delay: 0.5, duration: 0.8 }}
32
+ >
33
+ {slide.subtitle}
34
+ </motion.h2>
35
+
36
+ <motion.p
37
+ className="text-slate-400 text-lg max-w-xl font-medium"
38
+ initial={{ opacity: 0 }}
39
+ animate={{ opacity: 1 }}
40
+ transition={{ delay: 0.7, duration: 0.8 }}
41
+ >
42
+ {slide.description}
43
+ </motion.p>
44
+ </div>
45
+ );
46
+ };
components/slides/ProcessSlide.tsx ADDED
@@ -0,0 +1,78 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React from 'react';
2
+ import { Slide } from '../../types';
3
+ import { motion } from 'framer-motion';
4
+ import { ArrowDown, ArrowRight } from 'lucide-react';
5
+
6
+ export const ProcessSlide: React.FC<{ slide: Slide }> = ({ slide }) => {
7
+ const isDiagram = slide.type === 'diagram';
8
+ const steps = slide.content.steps;
9
+
10
+ if (!steps) return null;
11
+
12
+ return (
13
+ <div className="flex flex-col h-full justify-center px-6 max-w-6xl mx-auto">
14
+ <h2 className="text-4xl font-bold text-center mb-16 text-slate-900">{slide.title}</h2>
15
+
16
+ {isDiagram ? (
17
+ // Horizontal Flow with Icons
18
+ <div className="flex flex-wrap md:flex-nowrap items-center justify-center gap-4 md:gap-2">
19
+ {steps.map((step: any, idx) => (
20
+ <React.Fragment key={idx}>
21
+ <motion.div
22
+ className="flex flex-col items-center gap-4 p-6"
23
+ initial={{ opacity: 0, scale: 0.5 }}
24
+ animate={{ opacity: 1, scale: 1 }}
25
+ transition={{ delay: 0.2 + (idx * 0.2) }}
26
+ >
27
+ <div className="w-20 h-20 rounded-3xl bg-white border border-slate-100 flex items-center justify-center text-4xl shadow-glow text-slate-700">
28
+ {step.icon}
29
+ </div>
30
+ <span className="text-base font-semibold text-slate-600 text-center">{step.label}</span>
31
+ </motion.div>
32
+
33
+ {idx < steps.length - 1 && (
34
+ <motion.div
35
+ className="text-slate-300 hidden md:block"
36
+ initial={{ width: 0, opacity: 0 }}
37
+ animate={{ width: 'auto', opacity: 1 }}
38
+ transition={{ delay: 0.3 + (idx * 0.2) }}
39
+ >
40
+ <ArrowRight size={24} />
41
+ </motion.div>
42
+ )}
43
+ {idx < steps.length - 1 && (
44
+ <div className="w-full flex justify-center md:hidden text-slate-300">
45
+ <ArrowDown size={24} />
46
+ </div>
47
+ )}
48
+ </React.Fragment>
49
+ ))}
50
+ </div>
51
+ ) : (
52
+ // Vertical Numbered List
53
+ <div className="max-w-3xl mx-auto w-full">
54
+ {steps.map((step, idx) => (
55
+ <motion.div
56
+ key={idx}
57
+ className="flex items-center gap-6 mb-6 relative"
58
+ initial={{ opacity: 0, x: -30 }}
59
+ animate={{ opacity: 1, x: 0 }}
60
+ transition={{ delay: 0.2 + (idx * 0.15) }}
61
+ >
62
+ <div className="flex-shrink-0 w-12 h-12 rounded-full bg-white border-2 border-secondary text-secondary flex items-center justify-center font-bold text-lg shadow-sm z-10">
63
+ {idx + 1}
64
+ </div>
65
+ {/* Connecting line */}
66
+ {idx < steps.length - 1 && (
67
+ <div className="absolute left-6 top-12 bottom-[-24px] w-0.5 bg-slate-200" />
68
+ )}
69
+ <div className="bg-white p-5 rounded-xl border border-slate-100 w-full hover:shadow-md transition-all shadow-sm">
70
+ <p className="text-xl text-slate-700 font-medium">{typeof step === 'string' ? step : (step as any).label}</p>
71
+ </div>
72
+ </motion.div>
73
+ ))}
74
+ </div>
75
+ )}
76
+ </div>
77
+ );
78
+ };
components/slides/SplitSlide.tsx ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React from 'react';
2
+ import { Slide } from '../../types';
3
+ import { motion } from 'framer-motion';
4
+ import GlowCard from '../ui/GlowCard';
5
+
6
+ export const SplitSlide: React.FC<{ slide: Slide }> = ({ slide }) => {
7
+ const { leftCard, rightCard, cards } = slide.content;
8
+
9
+ // Handle generic card list (Slide 12)
10
+ if (cards) {
11
+ return (
12
+ <div className="flex flex-col h-full justify-center px-6 max-w-6xl mx-auto">
13
+ <h2 className="text-4xl md:text-5xl font-bold text-center mb-16 text-slate-900">{slide.title}</h2>
14
+ <div className="grid md:grid-cols-2 gap-8">
15
+ {cards.map((card, idx) => (
16
+ <GlowCard key={idx} delay={0.2 + (idx * 0.2)} intensity="medium" className="h-full flex flex-col">
17
+ <div className="text-5xl mb-6">{card.icon}</div>
18
+ <h3 className="text-2xl font-bold text-slate-900 mb-3">{card.name}</h3>
19
+ <p className="text-slate-500 mb-6 flex-grow text-lg leading-relaxed">{card.description}</p>
20
+ <a href={card.url} target="_blank" rel="noreferrer" className="text-primary font-semibold hover:text-accent mt-auto inline-flex items-center gap-1">
21
+ Visit {card.name} &rarr;
22
+ </a>
23
+ </GlowCard>
24
+ ))}
25
+ </div>
26
+ </div>
27
+ )
28
+ }
29
+
30
+ // Handle Left/Right comparison (Slide 4)
31
+ return (
32
+ <div className="flex flex-col h-full justify-center px-6 max-w-6xl mx-auto">
33
+ <h2 className="text-4xl md:text-5xl font-bold text-center mb-16 text-slate-900">{slide.title}</h2>
34
+
35
+ <div className="grid md:grid-cols-2 gap-8 items-stretch">
36
+ {/* Left Side - Negative/Before */}
37
+ {leftCard && (
38
+ <motion.div
39
+ initial={{ x: -50, opacity: 0 }}
40
+ animate={{ x: 0, opacity: 1 }}
41
+ transition={{ duration: 0.6 }}
42
+ className="bg-slate-50 border border-slate-200 p-10 rounded-3xl relative overflow-hidden group hover:border-red-200 transition-colors"
43
+ >
44
+ <div className="absolute top-0 left-0 w-2 h-full bg-red-400" />
45
+ <div className="text-6xl mb-8 grayscale opacity-70 group-hover:grayscale-0 group-hover:opacity-100 transition-all">{leftCard.icon}</div>
46
+ <h3 className="text-3xl font-bold text-slate-800 mb-4">{leftCard.title}</h3>
47
+ <p className="text-slate-500 leading-relaxed text-lg">{leftCard.description}</p>
48
+ </motion.div>
49
+ )}
50
+
51
+ {/* Right Side - Positive/After */}
52
+ {rightCard && (
53
+ <GlowCard intensity="high" delay={0.3} className="h-full transform md:scale-105 z-10 shadow-xl border-primary/20">
54
+ <div className="text-6xl mb-8 animate-pulse">{rightCard.icon}</div>
55
+ <h3 className="text-3xl font-bold text-slate-900 mb-4">{rightCard.title}</h3>
56
+ <p className="text-slate-600 leading-relaxed text-lg">{rightCard.description}</p>
57
+ </GlowCard>
58
+ )}
59
+ </div>
60
+ </div>
61
+ );
62
+ };
components/slides/ToolSlide.tsx ADDED
@@ -0,0 +1,125 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React from 'react';
2
+ import { Slide } from '../../types';
3
+ import { motion } from 'framer-motion';
4
+ import { Cpu, Zap, Search, ExternalLink } from 'lucide-react';
5
+ import GlowCard from '../ui/GlowCard';
6
+
7
+ export const ToolSlide: React.FC<{ slide: Slide }> = ({ slide }) => {
8
+ const isMetrics = !!slide.content.metrics;
9
+ const isCategories = !!slide.content.categories;
10
+
11
+ return (
12
+ <div className="flex flex-col h-full justify-center px-6 max-w-6xl mx-auto">
13
+ <div className="flex items-center justify-between mb-12">
14
+ <motion.h2
15
+ className="text-5xl font-bold text-slate-900"
16
+ initial={{ opacity: 0, x: -20 }}
17
+ animate={{ opacity: 1, x: 0 }}
18
+ >
19
+ {slide.title}
20
+ </motion.h2>
21
+
22
+ {slide.images && slide.images.length > 0 && (
23
+ <motion.img
24
+ src={slide.images[0].src}
25
+ alt="Logo"
26
+ className="w-20 h-20 rounded-2xl shadow-lg"
27
+ initial={{ opacity: 0, scale: 0 }}
28
+ animate={{ opacity: 1, scale: 1 }}
29
+ transition={{ delay: 0.2 }}
30
+ />
31
+ )}
32
+ </div>
33
+
34
+ <div className="grid md:grid-cols-12 gap-12">
35
+ <div className="md:col-span-7 flex flex-col justify-center">
36
+ {slide.content.tagline && (
37
+ <p className="text-primary font-bold tracking-widest uppercase text-sm mb-6">{slide.content.tagline}</p>
38
+ )}
39
+
40
+ {slide.content.intro && (
41
+ <p className="text-2xl text-slate-600 mb-10 font-light leading-snug">{slide.content.intro}</p>
42
+ )}
43
+
44
+ <div className="space-y-6 mb-10">
45
+ {slide.content.bullets?.map((bullet, idx) => (
46
+ <motion.div
47
+ key={idx}
48
+ className="flex items-start gap-4"
49
+ initial={{ opacity: 0, x: 20 }}
50
+ animate={{ opacity: 1, x: 0 }}
51
+ transition={{ delay: 0.3 + (idx * 0.1) }}
52
+ >
53
+ <span className="w-2 h-2 rounded-full bg-primary mt-2.5 flex-shrink-0" />
54
+ <span className="text-xl text-slate-700">{bullet}</span>
55
+ </motion.div>
56
+ ))}
57
+ </div>
58
+
59
+ {slide.content.callToAction && (
60
+ <motion.div
61
+ initial={{ opacity: 0, y: 20 }}
62
+ animate={{ opacity: 1, y: 0 }}
63
+ transition={{ delay: 0.6 }}
64
+ >
65
+ <a
66
+ href={slide.content.callToAction.url}
67
+ target="_blank"
68
+ rel="noreferrer"
69
+ className="inline-flex items-center gap-2 px-6 py-3 bg-slate-900 text-white font-bold rounded-lg shadow-lg hover:shadow-xl transition-all transform hover:-translate-y-1 hover:bg-slate-800"
70
+ >
71
+ {slide.content.callToAction.icon && <span className="text-xl">{slide.content.callToAction.icon}</span>}
72
+ {slide.content.callToAction.text}
73
+ <ExternalLink size={18} className="text-slate-400" />
74
+ </a>
75
+ </motion.div>
76
+ )}
77
+ </div>
78
+
79
+ <div className="md:col-span-5 flex flex-col gap-6 justify-center">
80
+ {/* Metric Cards for Groq Slide */}
81
+ {isMetrics && slide.content.metrics?.map((metric, idx) => (
82
+ <GlowCard key={idx} delay={0.5 + (idx * 0.1)} intensity="low" className="flex items-center justify-between py-6">
83
+ <div className="flex items-center gap-4">
84
+ <span className="text-3xl">{metric.emoji}</span>
85
+ <span className="text-sm text-slate-500 font-bold uppercase tracking-wider">{metric.label}</span>
86
+ </div>
87
+ <span className="text-3xl font-black text-slate-900">{metric.value}</span>
88
+ </GlowCard>
89
+ ))}
90
+
91
+ {/* Category Cards for Image Gen Slide */}
92
+ {isCategories && slide.content.categories?.map((cat, idx) => (
93
+ <motion.div
94
+ key={idx}
95
+ className="bg-white p-6 rounded-xl border-l-4 border-primary shadow-sm"
96
+ initial={{ opacity: 0, y: 10 }}
97
+ animate={{ opacity: 1, y: 0 }}
98
+ transition={{ delay: 0.4 + (idx * 0.1) }}
99
+ >
100
+ <h4 className="font-bold text-slate-900 text-lg mb-1">{cat.name}</h4>
101
+ <p className="text-slate-500">{cat.description}</p>
102
+ </motion.div>
103
+ ))}
104
+
105
+ {/* Generic abstract visual if no specific side content */}
106
+ {!isMetrics && !isCategories && (
107
+ <div className="h-full min-h-[300px] flex items-center justify-center relative">
108
+ <motion.div
109
+ className="absolute inset-0 bg-gradient-to-tr from-primary/20 to-secondary/20 blur-[60px] rounded-full"
110
+ animate={{ scale: [1, 1.1, 1], opacity: [0.5, 0.7, 0.5] }}
111
+ transition={{ duration: 6, repeat: Infinity }}
112
+ />
113
+ <div className="z-10 text-primary drop-shadow-sm">
114
+ {slide.title.includes('Perplexity') && <Search size={100} strokeWidth={1.5} />}
115
+ {slide.title.includes('Groq') && <Zap size={100} strokeWidth={1.5} />}
116
+ {slide.title.includes('Arena') && <Cpu size={100} strokeWidth={1.5} />}
117
+ {slide.title.includes('MCP') && <Search size={100} strokeWidth={1.5} />}
118
+ </div>
119
+ </div>
120
+ )}
121
+ </div>
122
+ </div>
123
+ </div>
124
+ );
125
+ };
components/ui/GlowCard.tsx ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React from 'react';
2
+ import { motion } from 'framer-motion';
3
+
4
+ interface GlowCardProps {
5
+ children: React.ReactNode;
6
+ className?: string;
7
+ intensity?: 'low' | 'medium' | 'high';
8
+ delay?: number;
9
+ }
10
+
11
+ const GlowCard: React.FC<GlowCardProps> = ({ children, className = '', intensity = 'medium', delay = 0 }) => {
12
+ return (
13
+ <motion.div
14
+ initial={{ opacity: 0, y: 20 }}
15
+ animate={{ opacity: 1, y: 0 }}
16
+ transition={{ delay, duration: 0.5 }}
17
+ className={`relative bg-white border border-slate-100 rounded-2xl p-6 ${className} transition-all duration-300 shadow-sm`}
18
+ whileHover={{
19
+ scale: 1.02,
20
+ boxShadow: '0 20px 40px -5px rgba(14, 165, 233, 0.15)',
21
+ borderColor: 'rgba(14, 165, 233, 0.3)'
22
+ }}
23
+ >
24
+ <div className="absolute inset-0 bg-gradient-to-br from-primary/5 to-transparent opacity-0 hover:opacity-100 transition-opacity duration-500 rounded-2xl pointer-events-none" />
25
+ <div className="relative z-10">
26
+ {children}
27
+ </div>
28
+ </motion.div>
29
+ );
30
+ };
31
+
32
+ export default GlowCard;
data.ts ADDED
@@ -0,0 +1,476 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { PresentationData } from './types';
2
+
3
+ export const PRESENTATION_DATA: PresentationData = {
4
+ metadata: {
5
+ title: "Research & Analysis: Using AI for Scalable Development",
6
+ subtitle: "From Prompt Jumping to Structured Workflows",
7
+ author: "AI Researcher",
8
+ date: "2025",
9
+ description: "How to leverage modern AI tools for research-first development"
10
+ },
11
+
12
+ slides: [
13
+ {
14
+ id: 1,
15
+ title: "Research & Analysis",
16
+ subtitle: "Using AI for Scalable Development",
17
+ description: "From Prompt Jumping to Structured Workflows",
18
+ type: "hero",
19
+ animation: {
20
+ type: "title-fade-scale",
21
+ duration: 1.5,
22
+ },
23
+ background: "elevated",
24
+ backgroundImage: null,
25
+ content: {},
26
+ images: [],
27
+ transition: "spring"
28
+ },
29
+
30
+ {
31
+ id: 2,
32
+ title: "❌ The Old Way: Prompt Jumping",
33
+ type: "problem",
34
+ animation: {
35
+ type: "slide-left-shake",
36
+ duration: 1,
37
+ },
38
+ background: "base",
39
+ backgroundImage: null,
40
+ content: {
41
+ bullets: [
42
+ "Direct to Project: Skip research → jump to coding",
43
+ "Quick Prompts: Write prompt in ChatGPT → paste output",
44
+ "No Scalability: Copy-paste approach breaks with complexity",
45
+ "Missing Context: No research = poor architecture decisions",
46
+ "Tech Debt: Later refactoring becomes expensive"
47
+ ]
48
+ },
49
+ images: [],
50
+ transition: "none"
51
+ },
52
+
53
+ {
54
+ id: 3,
55
+ title: "✅ The New Way: Research First",
56
+ type: "solution",
57
+ animation: {
58
+ type: "slide-right-stagger",
59
+ duration: 1,
60
+ },
61
+ background: "base",
62
+ backgroundImage: null,
63
+ content: {
64
+ intro: "Module-by-module structured development with proper research phase",
65
+ bullets: [
66
+ "Deep Research: Understand requirements before coding",
67
+ "Compare Solutions: Evaluate multiple tools & approaches",
68
+ "Architecture First: Plan scalable components upfront",
69
+ "Reusable Patterns: Build with future extensibility"
70
+ ]
71
+ },
72
+ images: [],
73
+ transition: "spring"
74
+ },
75
+
76
+ {
77
+ id: 4,
78
+ title: "🎯 Why Research Matters",
79
+ type: "comparison",
80
+ animation: {
81
+ type: "split-screen-reveal",
82
+ duration: 1.2,
83
+ },
84
+ background: "base",
85
+ backgroundImage: null,
86
+ content: {
87
+ leftCard: {
88
+ title: "Without Research",
89
+ description: "Fragile code, technical debt, rewrites, lost time",
90
+ icon: "⚠️"
91
+ },
92
+ rightCard: {
93
+ title: "With Research",
94
+ description: "Solid architecture, scalable design, fewer rewrites",
95
+ icon: "✨"
96
+ }
97
+ },
98
+ images: [],
99
+ transition: "spring"
100
+ },
101
+
102
+ {
103
+ id: 5,
104
+ title: "🔍 Perplexity AI: The Research Engine",
105
+ type: "tool-intro",
106
+ animation: {
107
+ type: "slide-left-glow",
108
+ duration: 1.2,
109
+ },
110
+ background: "base",
111
+ backgroundImage: null,
112
+ content: {
113
+ tagline: "What It Does",
114
+ bullets: [
115
+ "100M+ queries weekly • 60% of AI research traffic",
116
+ "Real-time web search + LLM reasoning",
117
+ "Multi-model support (GPT-4, Claude, Gemini, Llama 3, DeepSeek)"
118
+ ]
119
+ },
120
+ images: [
121
+ {
122
+ src: "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSIBrpdL6g4drOoDUhkIx57WEFesnLH1Y-w8Q&s",
123
+ alt: "Perplexity Logo",
124
+ width: 80,
125
+ height: 80,
126
+ position: "top-right"
127
+ }
128
+ ],
129
+ transition: "spring"
130
+ },
131
+
132
+ {
133
+ id: 6,
134
+ title: "🚀 Perplexity Deep Research",
135
+ type: "features",
136
+ animation: {
137
+ type: "card-pop-sequence",
138
+ duration: 1.2,
139
+ },
140
+ background: "base",
141
+ backgroundImage: null,
142
+ content: {
143
+ bullets: [
144
+ "Expert-level analysis: 2-4 minutes vs hours of research",
145
+ "Automatic workflow: Dozens of searches + hundreds of sources",
146
+ "Report generation: Structured output ready to use",
147
+ "93.9% factual accuracy on SimpleQA benchmark",
148
+ "Perfect for: Tech stack decisions, library comparisons, best practices"
149
+ ]
150
+ },
151
+ images: [],
152
+ transition: "spring"
153
+ },
154
+
155
+ {
156
+ id: 7,
157
+ title: "⚖️ LM Arena: Test Different Models",
158
+ type: "tool-intro",
159
+ animation: {
160
+ type: "slide-right-pulse",
161
+ duration: 1.2,
162
+ },
163
+ background: "base",
164
+ backgroundImage: null,
165
+ content: {
166
+ intro: "Purpose: Compare LLMs side-by-side before deciding",
167
+ tagline: "Features",
168
+ bullets: [
169
+ "Battle mode: Two random models compete",
170
+ "Side-by-side: Compare specific models",
171
+ "Direct chat: Test single model quality",
172
+ "Leaderboard: See top models by category (coding, vision, webdev)"
173
+ ]
174
+ },
175
+ images: [
176
+ {
177
+ src: "https://media.licdn.com/dms/image/v2/D560BAQFN6nC2aa-L6Q/company-logo_200_200/B56Zbuv79gGoAI-/0/1747762266220/lmarena_logo?e=2147483647&v=beta&t=9CgVvvusqLzx8w2VhCxDLBmOSTCSPxIkVgjmLDCp6YI",
178
+ alt: "LM Arena Logo",
179
+ width: 80,
180
+ height: 80,
181
+ position: "top-right"
182
+ }
183
+ ],
184
+ transition: "spring"
185
+ },
186
+
187
+ {
188
+ id: 8,
189
+ title: "💡 LM Arena Workflow",
190
+ type: "process",
191
+ animation: {
192
+ type: "number-flow-animate",
193
+ duration: 1.5,
194
+ },
195
+ background: "base",
196
+ backgroundImage: null,
197
+ content: {
198
+ steps: [
199
+ "Define your task (coding, writing, analysis)",
200
+ "Write a test prompt matching your use case",
201
+ "Run side-by-side comparison with top models",
202
+ "Vote on best response (or view leaderboard)",
203
+ "Choose winner for your actual project"
204
+ ]
205
+ },
206
+ images: [],
207
+ transition: "spring"
208
+ },
209
+
210
+ {
211
+ id: 9,
212
+ title: "⚡ Groq API: The Speed King",
213
+ type: "tool-intro",
214
+ animation: {
215
+ type: "speed-line-animate",
216
+ duration: 1.5,
217
+ },
218
+ background: "base",
219
+ backgroundImage: null,
220
+ content: {
221
+ tagline: "Benchmark Results",
222
+ metrics: [
223
+ { label: "tokens/sec", value: "814", emoji: "⚡" },
224
+ { label: "latency (time to first token)", value: "0.3s", emoji: "🎯" },
225
+ { label: "pricing per 1M tokens", value: "$0.10", emoji: "💰" }
226
+ ]
227
+ },
228
+ images: [
229
+ {
230
+ src: "https://groq.com/favicon.ico",
231
+ alt: "Groq Logo",
232
+ width: 80,
233
+ height: 80,
234
+ position: "top-right"
235
+ }
236
+ ],
237
+ transition: "spring"
238
+ },
239
+
240
+ {
241
+ id: 10,
242
+ title: "🎯 When to Use Groq",
243
+ type: "use-cases",
244
+ animation: {
245
+ type: "list-reveal-parallax",
246
+ duration: 1.2,
247
+ },
248
+ background: "base",
249
+ backgroundImage: null,
250
+ content: {
251
+ bullets: [
252
+ "Real-time applications: Chat bots, live responses",
253
+ "High-volume inference: Processing thousands of queries",
254
+ "Cost-sensitive projects: Budget-friendly at scale",
255
+ "Fast prototyping: Quick API integration",
256
+ "Edge cases: When speed is critical requirement"
257
+ ]
258
+ },
259
+ images: [],
260
+ transition: "spring"
261
+ },
262
+
263
+ {
264
+ id: 11,
265
+ title: "🎨 AI Image Generation: Web/Mobile Assets",
266
+ type: "tool-intro",
267
+ animation: {
268
+ type: "image-reveal-center",
269
+ duration: 1.2,
270
+ },
271
+ background: "base",
272
+ backgroundImage: null,
273
+ content: {
274
+ intro: "Quick design iteration without designers",
275
+ categories: [
276
+ { name: "Mockups", description: "UI designs, prototypes" },
277
+ { name: "Hero Images", description: "Landing pages, banners" },
278
+ { name: "Icons", description: "UI elements, assets" }
279
+ ]
280
+ },
281
+ images: [
282
+ {
283
+ src: "https://picsum.photos/100/100",
284
+ alt: "Design Icon",
285
+ width: 60,
286
+ height: 60,
287
+ position: "center"
288
+ }
289
+ ],
290
+ transition: "spring"
291
+ },
292
+
293
+ {
294
+ id: 12,
295
+ title: "🆓 Best Free Image Generators",
296
+ type: "comparison",
297
+ animation: {
298
+ type: "card-flip-sequence",
299
+ duration: 1.5,
300
+ },
301
+ background: "base",
302
+ backgroundImage: null,
303
+ content: {
304
+ cards: [
305
+ {
306
+ name: "Freepik AI + Canva AI",
307
+ description: "Multiple models (Flux, Google Imagen, Ideogram), unlimited with premium",
308
+ url: "https://www.freepik.com",
309
+ icon: "🎨"
310
+ },
311
+ {
312
+ name: "Starry AI",
313
+ description: "5 free artworks daily, text-prompt driven, no paywall",
314
+ url: "https://starryai.com",
315
+ icon: "✨"
316
+ }
317
+ ]
318
+ },
319
+ images: [],
320
+ transition: "spring"
321
+ },
322
+
323
+ {
324
+ id: 13,
325
+ title: "👤 AI Avatars for Content",
326
+ type: "features",
327
+ animation: {
328
+ type: "avatar-float-glow",
329
+ duration: 1.5,
330
+ },
331
+ background: "base",
332
+ backgroundImage: null,
333
+ content: {
334
+ bullets: [
335
+ "HeyGen: Video avatars with lip-sync (175+ languages)",
336
+ "D-ID: Realistic talking avatars for presentations",
337
+ "Fotor: Static profile avatars (quick & free)",
338
+ "Synthesia: Professional video production at scale"
339
+ ]
340
+ },
341
+ images: [],
342
+ transition: "spring"
343
+ },
344
+
345
+ {
346
+ id: 14,
347
+ title: "🔗 Complete Workflow",
348
+ type: "diagram",
349
+ animation: {
350
+ type: "connection-flow-animate",
351
+ duration: 2,
352
+ },
353
+ background: "surface",
354
+ backgroundImage: null,
355
+ content: {
356
+ steps: [
357
+ { label: "Perplexity", icon: "🔍", delay: 0.2 },
358
+ { label: "LM Arena", icon: "⚖️", delay: 0.5 },
359
+ { label: "Groq/ChatGPT", icon: "🤖", delay: 0.8 },
360
+ { label: "AI Image Gen", icon: "🎨", delay: 1.1 },
361
+ { label: "Scalable Product", icon: "✨", delay: 1.4 }
362
+ ]
363
+ },
364
+ images: [],
365
+ transition: "spring"
366
+ },
367
+
368
+ {
369
+ id: 15,
370
+ title: "🌐 MCP: The Next Frontier",
371
+ type: "vision",
372
+ animation: {
373
+ type: "fade-scale-crescendo",
374
+ duration: 2,
375
+ },
376
+ background: "elevated",
377
+ backgroundImage: null,
378
+ content: {
379
+ heading: "Model Context Protocol",
380
+ subheading: "A Connected Universe",
381
+ description: "Imagine stepping into a world where artificial intelligence isn’t confined by its training data — a world where AI assistants are not just smart, but also connected, dynamic, and ready to interact with the real world."
382
+ },
383
+ images: [],
384
+ transition: "smooth"
385
+ },
386
+
387
+ {
388
+ id: 16,
389
+ title: "The Incredible Journey of MCP",
390
+ type: "tool-intro",
391
+ animation: {
392
+ type: "slide-up-glow",
393
+ duration: 1.5,
394
+ },
395
+ background: "base",
396
+ backgroundImage: null,
397
+ content: {
398
+ intro: "Unleashing AI's True Potential",
399
+ bullets: [
400
+ "Standardized protocol connecting AI to data sources",
401
+ "Breaks the silo of isolated model training",
402
+ "Enables secure, real-time context fetching",
403
+ "The backbone of future agentic workflows"
404
+ ],
405
+ callToAction: {
406
+ text: "Read Full Article on Medium",
407
+ url: "https://medium.com/@devarshia5/the-incredible-journey-of-mcp-unleashing-ais-true-potential-f386161c65e8",
408
+ icon: "📖"
409
+ }
410
+ },
411
+ images: [],
412
+ transition: "smooth"
413
+ },
414
+
415
+ {
416
+ id: 17,
417
+ title: "💡 Key Takeaways",
418
+ type: "summary",
419
+ animation: {
420
+ type: "list-highlight-bounce",
421
+ duration: 1.5,
422
+ },
423
+ background: "base",
424
+ backgroundImage: null,
425
+ content: {
426
+ bullets: [
427
+ "Research phase is NOT optional for scalable products",
428
+ "Use Perplexity Deep Research for expert-level analysis",
429
+ "Test models on LM Arena before production",
430
+ "Explore MCP for building connected AI agents",
431
+ "Generate assets quickly with free AI image tools"
432
+ ]
433
+ },
434
+ images: [],
435
+ transition: "spring"
436
+ },
437
+
438
+ {
439
+ id: 18,
440
+ title: "🚀 Scalable Development",
441
+ type: "vision",
442
+ animation: {
443
+ type: "fade-scale-crescendo",
444
+ duration: 1.5,
445
+ },
446
+ background: "elevated",
447
+ backgroundImage: null,
448
+ content: {
449
+ heading: "Scalable Development",
450
+ subheading: "Structured Research + Modern AI Tools",
451
+ description: "= Better Architecture + Faster Execution"
452
+ },
453
+ images: [],
454
+ transition: "spring"
455
+ },
456
+
457
+ {
458
+ id: 19,
459
+ title: "Thank You!",
460
+ type: "closing",
461
+ animation: {
462
+ type: "text-spring-fade",
463
+ duration: 1.5,
464
+ },
465
+ background: "elevated",
466
+ backgroundImage: null,
467
+ content: {
468
+ title: "Thank You!",
469
+ subtitle: "Questions?",
470
+ tagline: "Let's Build Scalable Systems Together"
471
+ },
472
+ images: [],
473
+ transition: "spring"
474
+ }
475
+ ]
476
+ };
index.html ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>AI Research & Analysis</title>
7
+ <script src="https://cdn.tailwindcss.com"></script>
8
+ <script>
9
+ tailwind.config = {
10
+ theme: {
11
+ extend: {
12
+ colors: {
13
+ background: "#f8fafc", // Slate 50
14
+ surface: "#ffffff", // White
15
+ primary: "#0ea5e9", // Sky 500
16
+ secondary: "#06b6d4", // Cyan 500
17
+ accent: "#0284c7", // Sky 600
18
+ text: "#0f172a", // Slate 900
19
+ muted: "#64748b", // Slate 500
20
+ },
21
+ fontFamily: {
22
+ sans: ['Inter', 'sans-serif'],
23
+ },
24
+ boxShadow: {
25
+ 'glow': '0 4px 20px -5px rgba(14, 165, 233, 0.3)',
26
+ 'glow-strong': '0 10px 40px -10px rgba(6, 182, 212, 0.4)',
27
+ 'glass': '0 8px 32px 0 rgba(31, 38, 135, 0.1)',
28
+ }
29
+ },
30
+ },
31
+ }
32
+ </script>
33
+ <style>
34
+ body {
35
+ background-color: #f8fafc;
36
+ color: #0f172a;
37
+ overflow: hidden; /* Prevent scrolling, presentation mode */
38
+ }
39
+ </style>
40
+ <script type="importmap">
41
+ {
42
+ "imports": {
43
+ "react-dom/": "https://aistudiocdn.com/react-dom@^19.2.0/",
44
+ "lucide-react": "https://aistudiocdn.com/lucide-react@^0.555.0",
45
+ "framer-motion": "https://aistudiocdn.com/framer-motion@^12.23.25",
46
+ "react/": "https://aistudiocdn.com/react@^19.2.0/",
47
+ "react": "https://aistudiocdn.com/react@^19.2.0"
48
+ }
49
+ }
50
+ </script>
51
+ <link rel="stylesheet" href="/index.css">
52
+ </head>
53
+ <body>
54
+ <div id="root"></div>
55
+ <script type="module" src="/index.tsx"></script>
56
+ </body>
57
+ </html>
index.tsx ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React from 'react';
2
+ import ReactDOM from 'react-dom/client';
3
+ import App from './App';
4
+
5
+ const rootElement = document.getElementById('root');
6
+ if (!rootElement) {
7
+ throw new Error("Could not find root element to mount to");
8
+ }
9
+
10
+ const root = ReactDOM.createRoot(rootElement);
11
+ root.render(
12
+ <React.StrictMode>
13
+ <App />
14
+ </React.StrictMode>
15
+ );
metadata.json ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ {
2
+ "name": "AI Research Workflow Presentation",
3
+ "description": "A dynamic, animated presentation about using AI tools for scalable development.",
4
+ "requestFramePermissions": []
5
+ }
package-lock.json ADDED
@@ -0,0 +1,1820 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "ai-research-workflow-presentation",
3
+ "version": "0.0.0",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "ai-research-workflow-presentation",
9
+ "version": "0.0.0",
10
+ "dependencies": {
11
+ "framer-motion": "^12.23.25",
12
+ "lucide-react": "^0.555.0",
13
+ "react": "^19.2.0",
14
+ "react-dom": "^19.2.0"
15
+ },
16
+ "devDependencies": {
17
+ "@types/node": "^22.14.0",
18
+ "@vitejs/plugin-react": "^5.0.0",
19
+ "typescript": "~5.8.2",
20
+ "vite": "^6.2.0"
21
+ }
22
+ },
23
+ "node_modules/@babel/code-frame": {
24
+ "version": "7.27.1",
25
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
26
+ "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==",
27
+ "dev": true,
28
+ "license": "MIT",
29
+ "dependencies": {
30
+ "@babel/helper-validator-identifier": "^7.27.1",
31
+ "js-tokens": "^4.0.0",
32
+ "picocolors": "^1.1.1"
33
+ },
34
+ "engines": {
35
+ "node": ">=6.9.0"
36
+ }
37
+ },
38
+ "node_modules/@babel/compat-data": {
39
+ "version": "7.28.5",
40
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz",
41
+ "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==",
42
+ "dev": true,
43
+ "license": "MIT",
44
+ "engines": {
45
+ "node": ">=6.9.0"
46
+ }
47
+ },
48
+ "node_modules/@babel/core": {
49
+ "version": "7.28.5",
50
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz",
51
+ "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==",
52
+ "dev": true,
53
+ "license": "MIT",
54
+ "dependencies": {
55
+ "@babel/code-frame": "^7.27.1",
56
+ "@babel/generator": "^7.28.5",
57
+ "@babel/helper-compilation-targets": "^7.27.2",
58
+ "@babel/helper-module-transforms": "^7.28.3",
59
+ "@babel/helpers": "^7.28.4",
60
+ "@babel/parser": "^7.28.5",
61
+ "@babel/template": "^7.27.2",
62
+ "@babel/traverse": "^7.28.5",
63
+ "@babel/types": "^7.28.5",
64
+ "@jridgewell/remapping": "^2.3.5",
65
+ "convert-source-map": "^2.0.0",
66
+ "debug": "^4.1.0",
67
+ "gensync": "^1.0.0-beta.2",
68
+ "json5": "^2.2.3",
69
+ "semver": "^6.3.1"
70
+ },
71
+ "engines": {
72
+ "node": ">=6.9.0"
73
+ },
74
+ "funding": {
75
+ "type": "opencollective",
76
+ "url": "https://opencollective.com/babel"
77
+ }
78
+ },
79
+ "node_modules/@babel/generator": {
80
+ "version": "7.28.5",
81
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz",
82
+ "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==",
83
+ "dev": true,
84
+ "license": "MIT",
85
+ "dependencies": {
86
+ "@babel/parser": "^7.28.5",
87
+ "@babel/types": "^7.28.5",
88
+ "@jridgewell/gen-mapping": "^0.3.12",
89
+ "@jridgewell/trace-mapping": "^0.3.28",
90
+ "jsesc": "^3.0.2"
91
+ },
92
+ "engines": {
93
+ "node": ">=6.9.0"
94
+ }
95
+ },
96
+ "node_modules/@babel/helper-compilation-targets": {
97
+ "version": "7.27.2",
98
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz",
99
+ "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==",
100
+ "dev": true,
101
+ "license": "MIT",
102
+ "dependencies": {
103
+ "@babel/compat-data": "^7.27.2",
104
+ "@babel/helper-validator-option": "^7.27.1",
105
+ "browserslist": "^4.24.0",
106
+ "lru-cache": "^5.1.1",
107
+ "semver": "^6.3.1"
108
+ },
109
+ "engines": {
110
+ "node": ">=6.9.0"
111
+ }
112
+ },
113
+ "node_modules/@babel/helper-globals": {
114
+ "version": "7.28.0",
115
+ "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz",
116
+ "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==",
117
+ "dev": true,
118
+ "license": "MIT",
119
+ "engines": {
120
+ "node": ">=6.9.0"
121
+ }
122
+ },
123
+ "node_modules/@babel/helper-module-imports": {
124
+ "version": "7.27.1",
125
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz",
126
+ "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==",
127
+ "dev": true,
128
+ "license": "MIT",
129
+ "dependencies": {
130
+ "@babel/traverse": "^7.27.1",
131
+ "@babel/types": "^7.27.1"
132
+ },
133
+ "engines": {
134
+ "node": ">=6.9.0"
135
+ }
136
+ },
137
+ "node_modules/@babel/helper-module-transforms": {
138
+ "version": "7.28.3",
139
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz",
140
+ "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==",
141
+ "dev": true,
142
+ "license": "MIT",
143
+ "dependencies": {
144
+ "@babel/helper-module-imports": "^7.27.1",
145
+ "@babel/helper-validator-identifier": "^7.27.1",
146
+ "@babel/traverse": "^7.28.3"
147
+ },
148
+ "engines": {
149
+ "node": ">=6.9.0"
150
+ },
151
+ "peerDependencies": {
152
+ "@babel/core": "^7.0.0"
153
+ }
154
+ },
155
+ "node_modules/@babel/helper-plugin-utils": {
156
+ "version": "7.27.1",
157
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz",
158
+ "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==",
159
+ "dev": true,
160
+ "license": "MIT",
161
+ "engines": {
162
+ "node": ">=6.9.0"
163
+ }
164
+ },
165
+ "node_modules/@babel/helper-string-parser": {
166
+ "version": "7.27.1",
167
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
168
+ "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
169
+ "dev": true,
170
+ "license": "MIT",
171
+ "engines": {
172
+ "node": ">=6.9.0"
173
+ }
174
+ },
175
+ "node_modules/@babel/helper-validator-identifier": {
176
+ "version": "7.28.5",
177
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
178
+ "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
179
+ "dev": true,
180
+ "license": "MIT",
181
+ "engines": {
182
+ "node": ">=6.9.0"
183
+ }
184
+ },
185
+ "node_modules/@babel/helper-validator-option": {
186
+ "version": "7.27.1",
187
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz",
188
+ "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==",
189
+ "dev": true,
190
+ "license": "MIT",
191
+ "engines": {
192
+ "node": ">=6.9.0"
193
+ }
194
+ },
195
+ "node_modules/@babel/helpers": {
196
+ "version": "7.28.4",
197
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz",
198
+ "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==",
199
+ "dev": true,
200
+ "license": "MIT",
201
+ "dependencies": {
202
+ "@babel/template": "^7.27.2",
203
+ "@babel/types": "^7.28.4"
204
+ },
205
+ "engines": {
206
+ "node": ">=6.9.0"
207
+ }
208
+ },
209
+ "node_modules/@babel/parser": {
210
+ "version": "7.28.5",
211
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz",
212
+ "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==",
213
+ "dev": true,
214
+ "license": "MIT",
215
+ "dependencies": {
216
+ "@babel/types": "^7.28.5"
217
+ },
218
+ "bin": {
219
+ "parser": "bin/babel-parser.js"
220
+ },
221
+ "engines": {
222
+ "node": ">=6.0.0"
223
+ }
224
+ },
225
+ "node_modules/@babel/plugin-transform-react-jsx-self": {
226
+ "version": "7.27.1",
227
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz",
228
+ "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==",
229
+ "dev": true,
230
+ "license": "MIT",
231
+ "dependencies": {
232
+ "@babel/helper-plugin-utils": "^7.27.1"
233
+ },
234
+ "engines": {
235
+ "node": ">=6.9.0"
236
+ },
237
+ "peerDependencies": {
238
+ "@babel/core": "^7.0.0-0"
239
+ }
240
+ },
241
+ "node_modules/@babel/plugin-transform-react-jsx-source": {
242
+ "version": "7.27.1",
243
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz",
244
+ "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==",
245
+ "dev": true,
246
+ "license": "MIT",
247
+ "dependencies": {
248
+ "@babel/helper-plugin-utils": "^7.27.1"
249
+ },
250
+ "engines": {
251
+ "node": ">=6.9.0"
252
+ },
253
+ "peerDependencies": {
254
+ "@babel/core": "^7.0.0-0"
255
+ }
256
+ },
257
+ "node_modules/@babel/template": {
258
+ "version": "7.27.2",
259
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz",
260
+ "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==",
261
+ "dev": true,
262
+ "license": "MIT",
263
+ "dependencies": {
264
+ "@babel/code-frame": "^7.27.1",
265
+ "@babel/parser": "^7.27.2",
266
+ "@babel/types": "^7.27.1"
267
+ },
268
+ "engines": {
269
+ "node": ">=6.9.0"
270
+ }
271
+ },
272
+ "node_modules/@babel/traverse": {
273
+ "version": "7.28.5",
274
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz",
275
+ "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==",
276
+ "dev": true,
277
+ "license": "MIT",
278
+ "dependencies": {
279
+ "@babel/code-frame": "^7.27.1",
280
+ "@babel/generator": "^7.28.5",
281
+ "@babel/helper-globals": "^7.28.0",
282
+ "@babel/parser": "^7.28.5",
283
+ "@babel/template": "^7.27.2",
284
+ "@babel/types": "^7.28.5",
285
+ "debug": "^4.3.1"
286
+ },
287
+ "engines": {
288
+ "node": ">=6.9.0"
289
+ }
290
+ },
291
+ "node_modules/@babel/types": {
292
+ "version": "7.28.5",
293
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz",
294
+ "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==",
295
+ "dev": true,
296
+ "license": "MIT",
297
+ "dependencies": {
298
+ "@babel/helper-string-parser": "^7.27.1",
299
+ "@babel/helper-validator-identifier": "^7.28.5"
300
+ },
301
+ "engines": {
302
+ "node": ">=6.9.0"
303
+ }
304
+ },
305
+ "node_modules/@esbuild/aix-ppc64": {
306
+ "version": "0.25.12",
307
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz",
308
+ "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==",
309
+ "cpu": [
310
+ "ppc64"
311
+ ],
312
+ "dev": true,
313
+ "license": "MIT",
314
+ "optional": true,
315
+ "os": [
316
+ "aix"
317
+ ],
318
+ "engines": {
319
+ "node": ">=18"
320
+ }
321
+ },
322
+ "node_modules/@esbuild/android-arm": {
323
+ "version": "0.25.12",
324
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz",
325
+ "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==",
326
+ "cpu": [
327
+ "arm"
328
+ ],
329
+ "dev": true,
330
+ "license": "MIT",
331
+ "optional": true,
332
+ "os": [
333
+ "android"
334
+ ],
335
+ "engines": {
336
+ "node": ">=18"
337
+ }
338
+ },
339
+ "node_modules/@esbuild/android-arm64": {
340
+ "version": "0.25.12",
341
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz",
342
+ "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==",
343
+ "cpu": [
344
+ "arm64"
345
+ ],
346
+ "dev": true,
347
+ "license": "MIT",
348
+ "optional": true,
349
+ "os": [
350
+ "android"
351
+ ],
352
+ "engines": {
353
+ "node": ">=18"
354
+ }
355
+ },
356
+ "node_modules/@esbuild/android-x64": {
357
+ "version": "0.25.12",
358
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz",
359
+ "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==",
360
+ "cpu": [
361
+ "x64"
362
+ ],
363
+ "dev": true,
364
+ "license": "MIT",
365
+ "optional": true,
366
+ "os": [
367
+ "android"
368
+ ],
369
+ "engines": {
370
+ "node": ">=18"
371
+ }
372
+ },
373
+ "node_modules/@esbuild/darwin-arm64": {
374
+ "version": "0.25.12",
375
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz",
376
+ "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==",
377
+ "cpu": [
378
+ "arm64"
379
+ ],
380
+ "dev": true,
381
+ "license": "MIT",
382
+ "optional": true,
383
+ "os": [
384
+ "darwin"
385
+ ],
386
+ "engines": {
387
+ "node": ">=18"
388
+ }
389
+ },
390
+ "node_modules/@esbuild/darwin-x64": {
391
+ "version": "0.25.12",
392
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz",
393
+ "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==",
394
+ "cpu": [
395
+ "x64"
396
+ ],
397
+ "dev": true,
398
+ "license": "MIT",
399
+ "optional": true,
400
+ "os": [
401
+ "darwin"
402
+ ],
403
+ "engines": {
404
+ "node": ">=18"
405
+ }
406
+ },
407
+ "node_modules/@esbuild/freebsd-arm64": {
408
+ "version": "0.25.12",
409
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz",
410
+ "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==",
411
+ "cpu": [
412
+ "arm64"
413
+ ],
414
+ "dev": true,
415
+ "license": "MIT",
416
+ "optional": true,
417
+ "os": [
418
+ "freebsd"
419
+ ],
420
+ "engines": {
421
+ "node": ">=18"
422
+ }
423
+ },
424
+ "node_modules/@esbuild/freebsd-x64": {
425
+ "version": "0.25.12",
426
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz",
427
+ "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==",
428
+ "cpu": [
429
+ "x64"
430
+ ],
431
+ "dev": true,
432
+ "license": "MIT",
433
+ "optional": true,
434
+ "os": [
435
+ "freebsd"
436
+ ],
437
+ "engines": {
438
+ "node": ">=18"
439
+ }
440
+ },
441
+ "node_modules/@esbuild/linux-arm": {
442
+ "version": "0.25.12",
443
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz",
444
+ "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==",
445
+ "cpu": [
446
+ "arm"
447
+ ],
448
+ "dev": true,
449
+ "license": "MIT",
450
+ "optional": true,
451
+ "os": [
452
+ "linux"
453
+ ],
454
+ "engines": {
455
+ "node": ">=18"
456
+ }
457
+ },
458
+ "node_modules/@esbuild/linux-arm64": {
459
+ "version": "0.25.12",
460
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz",
461
+ "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==",
462
+ "cpu": [
463
+ "arm64"
464
+ ],
465
+ "dev": true,
466
+ "license": "MIT",
467
+ "optional": true,
468
+ "os": [
469
+ "linux"
470
+ ],
471
+ "engines": {
472
+ "node": ">=18"
473
+ }
474
+ },
475
+ "node_modules/@esbuild/linux-ia32": {
476
+ "version": "0.25.12",
477
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz",
478
+ "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==",
479
+ "cpu": [
480
+ "ia32"
481
+ ],
482
+ "dev": true,
483
+ "license": "MIT",
484
+ "optional": true,
485
+ "os": [
486
+ "linux"
487
+ ],
488
+ "engines": {
489
+ "node": ">=18"
490
+ }
491
+ },
492
+ "node_modules/@esbuild/linux-loong64": {
493
+ "version": "0.25.12",
494
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz",
495
+ "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==",
496
+ "cpu": [
497
+ "loong64"
498
+ ],
499
+ "dev": true,
500
+ "license": "MIT",
501
+ "optional": true,
502
+ "os": [
503
+ "linux"
504
+ ],
505
+ "engines": {
506
+ "node": ">=18"
507
+ }
508
+ },
509
+ "node_modules/@esbuild/linux-mips64el": {
510
+ "version": "0.25.12",
511
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz",
512
+ "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==",
513
+ "cpu": [
514
+ "mips64el"
515
+ ],
516
+ "dev": true,
517
+ "license": "MIT",
518
+ "optional": true,
519
+ "os": [
520
+ "linux"
521
+ ],
522
+ "engines": {
523
+ "node": ">=18"
524
+ }
525
+ },
526
+ "node_modules/@esbuild/linux-ppc64": {
527
+ "version": "0.25.12",
528
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz",
529
+ "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==",
530
+ "cpu": [
531
+ "ppc64"
532
+ ],
533
+ "dev": true,
534
+ "license": "MIT",
535
+ "optional": true,
536
+ "os": [
537
+ "linux"
538
+ ],
539
+ "engines": {
540
+ "node": ">=18"
541
+ }
542
+ },
543
+ "node_modules/@esbuild/linux-riscv64": {
544
+ "version": "0.25.12",
545
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz",
546
+ "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==",
547
+ "cpu": [
548
+ "riscv64"
549
+ ],
550
+ "dev": true,
551
+ "license": "MIT",
552
+ "optional": true,
553
+ "os": [
554
+ "linux"
555
+ ],
556
+ "engines": {
557
+ "node": ">=18"
558
+ }
559
+ },
560
+ "node_modules/@esbuild/linux-s390x": {
561
+ "version": "0.25.12",
562
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz",
563
+ "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==",
564
+ "cpu": [
565
+ "s390x"
566
+ ],
567
+ "dev": true,
568
+ "license": "MIT",
569
+ "optional": true,
570
+ "os": [
571
+ "linux"
572
+ ],
573
+ "engines": {
574
+ "node": ">=18"
575
+ }
576
+ },
577
+ "node_modules/@esbuild/linux-x64": {
578
+ "version": "0.25.12",
579
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz",
580
+ "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==",
581
+ "cpu": [
582
+ "x64"
583
+ ],
584
+ "dev": true,
585
+ "license": "MIT",
586
+ "optional": true,
587
+ "os": [
588
+ "linux"
589
+ ],
590
+ "engines": {
591
+ "node": ">=18"
592
+ }
593
+ },
594
+ "node_modules/@esbuild/netbsd-arm64": {
595
+ "version": "0.25.12",
596
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz",
597
+ "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==",
598
+ "cpu": [
599
+ "arm64"
600
+ ],
601
+ "dev": true,
602
+ "license": "MIT",
603
+ "optional": true,
604
+ "os": [
605
+ "netbsd"
606
+ ],
607
+ "engines": {
608
+ "node": ">=18"
609
+ }
610
+ },
611
+ "node_modules/@esbuild/netbsd-x64": {
612
+ "version": "0.25.12",
613
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz",
614
+ "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==",
615
+ "cpu": [
616
+ "x64"
617
+ ],
618
+ "dev": true,
619
+ "license": "MIT",
620
+ "optional": true,
621
+ "os": [
622
+ "netbsd"
623
+ ],
624
+ "engines": {
625
+ "node": ">=18"
626
+ }
627
+ },
628
+ "node_modules/@esbuild/openbsd-arm64": {
629
+ "version": "0.25.12",
630
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz",
631
+ "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==",
632
+ "cpu": [
633
+ "arm64"
634
+ ],
635
+ "dev": true,
636
+ "license": "MIT",
637
+ "optional": true,
638
+ "os": [
639
+ "openbsd"
640
+ ],
641
+ "engines": {
642
+ "node": ">=18"
643
+ }
644
+ },
645
+ "node_modules/@esbuild/openbsd-x64": {
646
+ "version": "0.25.12",
647
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz",
648
+ "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==",
649
+ "cpu": [
650
+ "x64"
651
+ ],
652
+ "dev": true,
653
+ "license": "MIT",
654
+ "optional": true,
655
+ "os": [
656
+ "openbsd"
657
+ ],
658
+ "engines": {
659
+ "node": ">=18"
660
+ }
661
+ },
662
+ "node_modules/@esbuild/openharmony-arm64": {
663
+ "version": "0.25.12",
664
+ "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz",
665
+ "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==",
666
+ "cpu": [
667
+ "arm64"
668
+ ],
669
+ "dev": true,
670
+ "license": "MIT",
671
+ "optional": true,
672
+ "os": [
673
+ "openharmony"
674
+ ],
675
+ "engines": {
676
+ "node": ">=18"
677
+ }
678
+ },
679
+ "node_modules/@esbuild/sunos-x64": {
680
+ "version": "0.25.12",
681
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz",
682
+ "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==",
683
+ "cpu": [
684
+ "x64"
685
+ ],
686
+ "dev": true,
687
+ "license": "MIT",
688
+ "optional": true,
689
+ "os": [
690
+ "sunos"
691
+ ],
692
+ "engines": {
693
+ "node": ">=18"
694
+ }
695
+ },
696
+ "node_modules/@esbuild/win32-arm64": {
697
+ "version": "0.25.12",
698
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz",
699
+ "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==",
700
+ "cpu": [
701
+ "arm64"
702
+ ],
703
+ "dev": true,
704
+ "license": "MIT",
705
+ "optional": true,
706
+ "os": [
707
+ "win32"
708
+ ],
709
+ "engines": {
710
+ "node": ">=18"
711
+ }
712
+ },
713
+ "node_modules/@esbuild/win32-ia32": {
714
+ "version": "0.25.12",
715
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz",
716
+ "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==",
717
+ "cpu": [
718
+ "ia32"
719
+ ],
720
+ "dev": true,
721
+ "license": "MIT",
722
+ "optional": true,
723
+ "os": [
724
+ "win32"
725
+ ],
726
+ "engines": {
727
+ "node": ">=18"
728
+ }
729
+ },
730
+ "node_modules/@esbuild/win32-x64": {
731
+ "version": "0.25.12",
732
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz",
733
+ "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==",
734
+ "cpu": [
735
+ "x64"
736
+ ],
737
+ "dev": true,
738
+ "license": "MIT",
739
+ "optional": true,
740
+ "os": [
741
+ "win32"
742
+ ],
743
+ "engines": {
744
+ "node": ">=18"
745
+ }
746
+ },
747
+ "node_modules/@jridgewell/gen-mapping": {
748
+ "version": "0.3.13",
749
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
750
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
751
+ "dev": true,
752
+ "license": "MIT",
753
+ "dependencies": {
754
+ "@jridgewell/sourcemap-codec": "^1.5.0",
755
+ "@jridgewell/trace-mapping": "^0.3.24"
756
+ }
757
+ },
758
+ "node_modules/@jridgewell/remapping": {
759
+ "version": "2.3.5",
760
+ "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
761
+ "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
762
+ "dev": true,
763
+ "license": "MIT",
764
+ "dependencies": {
765
+ "@jridgewell/gen-mapping": "^0.3.5",
766
+ "@jridgewell/trace-mapping": "^0.3.24"
767
+ }
768
+ },
769
+ "node_modules/@jridgewell/resolve-uri": {
770
+ "version": "3.1.2",
771
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
772
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
773
+ "dev": true,
774
+ "license": "MIT",
775
+ "engines": {
776
+ "node": ">=6.0.0"
777
+ }
778
+ },
779
+ "node_modules/@jridgewell/sourcemap-codec": {
780
+ "version": "1.5.5",
781
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
782
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
783
+ "dev": true,
784
+ "license": "MIT"
785
+ },
786
+ "node_modules/@jridgewell/trace-mapping": {
787
+ "version": "0.3.31",
788
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
789
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
790
+ "dev": true,
791
+ "license": "MIT",
792
+ "dependencies": {
793
+ "@jridgewell/resolve-uri": "^3.1.0",
794
+ "@jridgewell/sourcemap-codec": "^1.4.14"
795
+ }
796
+ },
797
+ "node_modules/@rolldown/pluginutils": {
798
+ "version": "1.0.0-beta.47",
799
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.47.tgz",
800
+ "integrity": "sha512-8QagwMH3kNCuzD8EWL8R2YPW5e4OrHNSAHRFDdmFqEwEaD/KcNKjVoumo+gP2vW5eKB2UPbM6vTYiGZX0ixLnw==",
801
+ "dev": true,
802
+ "license": "MIT"
803
+ },
804
+ "node_modules/@rollup/rollup-android-arm-eabi": {
805
+ "version": "4.53.3",
806
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.3.tgz",
807
+ "integrity": "sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==",
808
+ "cpu": [
809
+ "arm"
810
+ ],
811
+ "dev": true,
812
+ "license": "MIT",
813
+ "optional": true,
814
+ "os": [
815
+ "android"
816
+ ]
817
+ },
818
+ "node_modules/@rollup/rollup-android-arm64": {
819
+ "version": "4.53.3",
820
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.3.tgz",
821
+ "integrity": "sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==",
822
+ "cpu": [
823
+ "arm64"
824
+ ],
825
+ "dev": true,
826
+ "license": "MIT",
827
+ "optional": true,
828
+ "os": [
829
+ "android"
830
+ ]
831
+ },
832
+ "node_modules/@rollup/rollup-darwin-arm64": {
833
+ "version": "4.53.3",
834
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.3.tgz",
835
+ "integrity": "sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==",
836
+ "cpu": [
837
+ "arm64"
838
+ ],
839
+ "dev": true,
840
+ "license": "MIT",
841
+ "optional": true,
842
+ "os": [
843
+ "darwin"
844
+ ]
845
+ },
846
+ "node_modules/@rollup/rollup-darwin-x64": {
847
+ "version": "4.53.3",
848
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.3.tgz",
849
+ "integrity": "sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==",
850
+ "cpu": [
851
+ "x64"
852
+ ],
853
+ "dev": true,
854
+ "license": "MIT",
855
+ "optional": true,
856
+ "os": [
857
+ "darwin"
858
+ ]
859
+ },
860
+ "node_modules/@rollup/rollup-freebsd-arm64": {
861
+ "version": "4.53.3",
862
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.3.tgz",
863
+ "integrity": "sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==",
864
+ "cpu": [
865
+ "arm64"
866
+ ],
867
+ "dev": true,
868
+ "license": "MIT",
869
+ "optional": true,
870
+ "os": [
871
+ "freebsd"
872
+ ]
873
+ },
874
+ "node_modules/@rollup/rollup-freebsd-x64": {
875
+ "version": "4.53.3",
876
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.3.tgz",
877
+ "integrity": "sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==",
878
+ "cpu": [
879
+ "x64"
880
+ ],
881
+ "dev": true,
882
+ "license": "MIT",
883
+ "optional": true,
884
+ "os": [
885
+ "freebsd"
886
+ ]
887
+ },
888
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
889
+ "version": "4.53.3",
890
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.3.tgz",
891
+ "integrity": "sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==",
892
+ "cpu": [
893
+ "arm"
894
+ ],
895
+ "dev": true,
896
+ "license": "MIT",
897
+ "optional": true,
898
+ "os": [
899
+ "linux"
900
+ ]
901
+ },
902
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
903
+ "version": "4.53.3",
904
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.3.tgz",
905
+ "integrity": "sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==",
906
+ "cpu": [
907
+ "arm"
908
+ ],
909
+ "dev": true,
910
+ "license": "MIT",
911
+ "optional": true,
912
+ "os": [
913
+ "linux"
914
+ ]
915
+ },
916
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
917
+ "version": "4.53.3",
918
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.3.tgz",
919
+ "integrity": "sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==",
920
+ "cpu": [
921
+ "arm64"
922
+ ],
923
+ "dev": true,
924
+ "license": "MIT",
925
+ "optional": true,
926
+ "os": [
927
+ "linux"
928
+ ]
929
+ },
930
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
931
+ "version": "4.53.3",
932
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.3.tgz",
933
+ "integrity": "sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==",
934
+ "cpu": [
935
+ "arm64"
936
+ ],
937
+ "dev": true,
938
+ "license": "MIT",
939
+ "optional": true,
940
+ "os": [
941
+ "linux"
942
+ ]
943
+ },
944
+ "node_modules/@rollup/rollup-linux-loong64-gnu": {
945
+ "version": "4.53.3",
946
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.3.tgz",
947
+ "integrity": "sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==",
948
+ "cpu": [
949
+ "loong64"
950
+ ],
951
+ "dev": true,
952
+ "license": "MIT",
953
+ "optional": true,
954
+ "os": [
955
+ "linux"
956
+ ]
957
+ },
958
+ "node_modules/@rollup/rollup-linux-ppc64-gnu": {
959
+ "version": "4.53.3",
960
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.3.tgz",
961
+ "integrity": "sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==",
962
+ "cpu": [
963
+ "ppc64"
964
+ ],
965
+ "dev": true,
966
+ "license": "MIT",
967
+ "optional": true,
968
+ "os": [
969
+ "linux"
970
+ ]
971
+ },
972
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
973
+ "version": "4.53.3",
974
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.3.tgz",
975
+ "integrity": "sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==",
976
+ "cpu": [
977
+ "riscv64"
978
+ ],
979
+ "dev": true,
980
+ "license": "MIT",
981
+ "optional": true,
982
+ "os": [
983
+ "linux"
984
+ ]
985
+ },
986
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
987
+ "version": "4.53.3",
988
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.3.tgz",
989
+ "integrity": "sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==",
990
+ "cpu": [
991
+ "riscv64"
992
+ ],
993
+ "dev": true,
994
+ "license": "MIT",
995
+ "optional": true,
996
+ "os": [
997
+ "linux"
998
+ ]
999
+ },
1000
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
1001
+ "version": "4.53.3",
1002
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.3.tgz",
1003
+ "integrity": "sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==",
1004
+ "cpu": [
1005
+ "s390x"
1006
+ ],
1007
+ "dev": true,
1008
+ "license": "MIT",
1009
+ "optional": true,
1010
+ "os": [
1011
+ "linux"
1012
+ ]
1013
+ },
1014
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
1015
+ "version": "4.53.3",
1016
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.3.tgz",
1017
+ "integrity": "sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==",
1018
+ "cpu": [
1019
+ "x64"
1020
+ ],
1021
+ "dev": true,
1022
+ "license": "MIT",
1023
+ "optional": true,
1024
+ "os": [
1025
+ "linux"
1026
+ ]
1027
+ },
1028
+ "node_modules/@rollup/rollup-linux-x64-musl": {
1029
+ "version": "4.53.3",
1030
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.3.tgz",
1031
+ "integrity": "sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==",
1032
+ "cpu": [
1033
+ "x64"
1034
+ ],
1035
+ "dev": true,
1036
+ "license": "MIT",
1037
+ "optional": true,
1038
+ "os": [
1039
+ "linux"
1040
+ ]
1041
+ },
1042
+ "node_modules/@rollup/rollup-openharmony-arm64": {
1043
+ "version": "4.53.3",
1044
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.3.tgz",
1045
+ "integrity": "sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==",
1046
+ "cpu": [
1047
+ "arm64"
1048
+ ],
1049
+ "dev": true,
1050
+ "license": "MIT",
1051
+ "optional": true,
1052
+ "os": [
1053
+ "openharmony"
1054
+ ]
1055
+ },
1056
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
1057
+ "version": "4.53.3",
1058
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.3.tgz",
1059
+ "integrity": "sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==",
1060
+ "cpu": [
1061
+ "arm64"
1062
+ ],
1063
+ "dev": true,
1064
+ "license": "MIT",
1065
+ "optional": true,
1066
+ "os": [
1067
+ "win32"
1068
+ ]
1069
+ },
1070
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
1071
+ "version": "4.53.3",
1072
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.3.tgz",
1073
+ "integrity": "sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==",
1074
+ "cpu": [
1075
+ "ia32"
1076
+ ],
1077
+ "dev": true,
1078
+ "license": "MIT",
1079
+ "optional": true,
1080
+ "os": [
1081
+ "win32"
1082
+ ]
1083
+ },
1084
+ "node_modules/@rollup/rollup-win32-x64-gnu": {
1085
+ "version": "4.53.3",
1086
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.3.tgz",
1087
+ "integrity": "sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==",
1088
+ "cpu": [
1089
+ "x64"
1090
+ ],
1091
+ "dev": true,
1092
+ "license": "MIT",
1093
+ "optional": true,
1094
+ "os": [
1095
+ "win32"
1096
+ ]
1097
+ },
1098
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
1099
+ "version": "4.53.3",
1100
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.3.tgz",
1101
+ "integrity": "sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==",
1102
+ "cpu": [
1103
+ "x64"
1104
+ ],
1105
+ "dev": true,
1106
+ "license": "MIT",
1107
+ "optional": true,
1108
+ "os": [
1109
+ "win32"
1110
+ ]
1111
+ },
1112
+ "node_modules/@types/babel__core": {
1113
+ "version": "7.20.5",
1114
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
1115
+ "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
1116
+ "dev": true,
1117
+ "license": "MIT",
1118
+ "dependencies": {
1119
+ "@babel/parser": "^7.20.7",
1120
+ "@babel/types": "^7.20.7",
1121
+ "@types/babel__generator": "*",
1122
+ "@types/babel__template": "*",
1123
+ "@types/babel__traverse": "*"
1124
+ }
1125
+ },
1126
+ "node_modules/@types/babel__generator": {
1127
+ "version": "7.27.0",
1128
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz",
1129
+ "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==",
1130
+ "dev": true,
1131
+ "license": "MIT",
1132
+ "dependencies": {
1133
+ "@babel/types": "^7.0.0"
1134
+ }
1135
+ },
1136
+ "node_modules/@types/babel__template": {
1137
+ "version": "7.4.4",
1138
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
1139
+ "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
1140
+ "dev": true,
1141
+ "license": "MIT",
1142
+ "dependencies": {
1143
+ "@babel/parser": "^7.1.0",
1144
+ "@babel/types": "^7.0.0"
1145
+ }
1146
+ },
1147
+ "node_modules/@types/babel__traverse": {
1148
+ "version": "7.28.0",
1149
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz",
1150
+ "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==",
1151
+ "dev": true,
1152
+ "license": "MIT",
1153
+ "dependencies": {
1154
+ "@babel/types": "^7.28.2"
1155
+ }
1156
+ },
1157
+ "node_modules/@types/estree": {
1158
+ "version": "1.0.8",
1159
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
1160
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
1161
+ "dev": true,
1162
+ "license": "MIT"
1163
+ },
1164
+ "node_modules/@types/node": {
1165
+ "version": "22.19.1",
1166
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.1.tgz",
1167
+ "integrity": "sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==",
1168
+ "dev": true,
1169
+ "license": "MIT",
1170
+ "dependencies": {
1171
+ "undici-types": "~6.21.0"
1172
+ }
1173
+ },
1174
+ "node_modules/@vitejs/plugin-react": {
1175
+ "version": "5.1.1",
1176
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.1.tgz",
1177
+ "integrity": "sha512-WQfkSw0QbQ5aJ2CHYw23ZGkqnRwqKHD/KYsMeTkZzPT4Jcf0DcBxBtwMJxnu6E7oxw5+JC6ZAiePgh28uJ1HBA==",
1178
+ "dev": true,
1179
+ "license": "MIT",
1180
+ "dependencies": {
1181
+ "@babel/core": "^7.28.5",
1182
+ "@babel/plugin-transform-react-jsx-self": "^7.27.1",
1183
+ "@babel/plugin-transform-react-jsx-source": "^7.27.1",
1184
+ "@rolldown/pluginutils": "1.0.0-beta.47",
1185
+ "@types/babel__core": "^7.20.5",
1186
+ "react-refresh": "^0.18.0"
1187
+ },
1188
+ "engines": {
1189
+ "node": "^20.19.0 || >=22.12.0"
1190
+ },
1191
+ "peerDependencies": {
1192
+ "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0"
1193
+ }
1194
+ },
1195
+ "node_modules/baseline-browser-mapping": {
1196
+ "version": "2.8.32",
1197
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.32.tgz",
1198
+ "integrity": "sha512-OPz5aBThlyLFgxyhdwf/s2+8ab3OvT7AdTNvKHBwpXomIYeXqpUUuT8LrdtxZSsWJ4R4CU1un4XGh5Ez3nlTpw==",
1199
+ "dev": true,
1200
+ "license": "Apache-2.0",
1201
+ "bin": {
1202
+ "baseline-browser-mapping": "dist/cli.js"
1203
+ }
1204
+ },
1205
+ "node_modules/browserslist": {
1206
+ "version": "4.28.0",
1207
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.0.tgz",
1208
+ "integrity": "sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==",
1209
+ "dev": true,
1210
+ "funding": [
1211
+ {
1212
+ "type": "opencollective",
1213
+ "url": "https://opencollective.com/browserslist"
1214
+ },
1215
+ {
1216
+ "type": "tidelift",
1217
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
1218
+ },
1219
+ {
1220
+ "type": "github",
1221
+ "url": "https://github.com/sponsors/ai"
1222
+ }
1223
+ ],
1224
+ "license": "MIT",
1225
+ "dependencies": {
1226
+ "baseline-browser-mapping": "^2.8.25",
1227
+ "caniuse-lite": "^1.0.30001754",
1228
+ "electron-to-chromium": "^1.5.249",
1229
+ "node-releases": "^2.0.27",
1230
+ "update-browserslist-db": "^1.1.4"
1231
+ },
1232
+ "bin": {
1233
+ "browserslist": "cli.js"
1234
+ },
1235
+ "engines": {
1236
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
1237
+ }
1238
+ },
1239
+ "node_modules/caniuse-lite": {
1240
+ "version": "1.0.30001757",
1241
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001757.tgz",
1242
+ "integrity": "sha512-r0nnL/I28Zi/yjk1el6ilj27tKcdjLsNqAOZr0yVjWPrSQyHgKI2INaEWw21bAQSv2LXRt1XuCS/GomNpWOxsQ==",
1243
+ "dev": true,
1244
+ "funding": [
1245
+ {
1246
+ "type": "opencollective",
1247
+ "url": "https://opencollective.com/browserslist"
1248
+ },
1249
+ {
1250
+ "type": "tidelift",
1251
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
1252
+ },
1253
+ {
1254
+ "type": "github",
1255
+ "url": "https://github.com/sponsors/ai"
1256
+ }
1257
+ ],
1258
+ "license": "CC-BY-4.0"
1259
+ },
1260
+ "node_modules/convert-source-map": {
1261
+ "version": "2.0.0",
1262
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
1263
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
1264
+ "dev": true,
1265
+ "license": "MIT"
1266
+ },
1267
+ "node_modules/debug": {
1268
+ "version": "4.4.3",
1269
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
1270
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
1271
+ "dev": true,
1272
+ "license": "MIT",
1273
+ "dependencies": {
1274
+ "ms": "^2.1.3"
1275
+ },
1276
+ "engines": {
1277
+ "node": ">=6.0"
1278
+ },
1279
+ "peerDependenciesMeta": {
1280
+ "supports-color": {
1281
+ "optional": true
1282
+ }
1283
+ }
1284
+ },
1285
+ "node_modules/electron-to-chromium": {
1286
+ "version": "1.5.262",
1287
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.262.tgz",
1288
+ "integrity": "sha512-NlAsMteRHek05jRUxUR0a5jpjYq9ykk6+kO0yRaMi5moe7u0fVIOeQ3Y30A8dIiWFBNUoQGi1ljb1i5VtS9WQQ==",
1289
+ "dev": true,
1290
+ "license": "ISC"
1291
+ },
1292
+ "node_modules/esbuild": {
1293
+ "version": "0.25.12",
1294
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz",
1295
+ "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==",
1296
+ "dev": true,
1297
+ "hasInstallScript": true,
1298
+ "license": "MIT",
1299
+ "bin": {
1300
+ "esbuild": "bin/esbuild"
1301
+ },
1302
+ "engines": {
1303
+ "node": ">=18"
1304
+ },
1305
+ "optionalDependencies": {
1306
+ "@esbuild/aix-ppc64": "0.25.12",
1307
+ "@esbuild/android-arm": "0.25.12",
1308
+ "@esbuild/android-arm64": "0.25.12",
1309
+ "@esbuild/android-x64": "0.25.12",
1310
+ "@esbuild/darwin-arm64": "0.25.12",
1311
+ "@esbuild/darwin-x64": "0.25.12",
1312
+ "@esbuild/freebsd-arm64": "0.25.12",
1313
+ "@esbuild/freebsd-x64": "0.25.12",
1314
+ "@esbuild/linux-arm": "0.25.12",
1315
+ "@esbuild/linux-arm64": "0.25.12",
1316
+ "@esbuild/linux-ia32": "0.25.12",
1317
+ "@esbuild/linux-loong64": "0.25.12",
1318
+ "@esbuild/linux-mips64el": "0.25.12",
1319
+ "@esbuild/linux-ppc64": "0.25.12",
1320
+ "@esbuild/linux-riscv64": "0.25.12",
1321
+ "@esbuild/linux-s390x": "0.25.12",
1322
+ "@esbuild/linux-x64": "0.25.12",
1323
+ "@esbuild/netbsd-arm64": "0.25.12",
1324
+ "@esbuild/netbsd-x64": "0.25.12",
1325
+ "@esbuild/openbsd-arm64": "0.25.12",
1326
+ "@esbuild/openbsd-x64": "0.25.12",
1327
+ "@esbuild/openharmony-arm64": "0.25.12",
1328
+ "@esbuild/sunos-x64": "0.25.12",
1329
+ "@esbuild/win32-arm64": "0.25.12",
1330
+ "@esbuild/win32-ia32": "0.25.12",
1331
+ "@esbuild/win32-x64": "0.25.12"
1332
+ }
1333
+ },
1334
+ "node_modules/escalade": {
1335
+ "version": "3.2.0",
1336
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
1337
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
1338
+ "dev": true,
1339
+ "license": "MIT",
1340
+ "engines": {
1341
+ "node": ">=6"
1342
+ }
1343
+ },
1344
+ "node_modules/fdir": {
1345
+ "version": "6.5.0",
1346
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
1347
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
1348
+ "dev": true,
1349
+ "license": "MIT",
1350
+ "engines": {
1351
+ "node": ">=12.0.0"
1352
+ },
1353
+ "peerDependencies": {
1354
+ "picomatch": "^3 || ^4"
1355
+ },
1356
+ "peerDependenciesMeta": {
1357
+ "picomatch": {
1358
+ "optional": true
1359
+ }
1360
+ }
1361
+ },
1362
+ "node_modules/framer-motion": {
1363
+ "version": "12.23.25",
1364
+ "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.23.25.tgz",
1365
+ "integrity": "sha512-gUHGl2e4VG66jOcH0JHhuJQr6ZNwrET9g31ZG0xdXzT0CznP7fHX4P8Bcvuc4MiUB90ysNnWX2ukHRIggkl6hQ==",
1366
+ "license": "MIT",
1367
+ "dependencies": {
1368
+ "motion-dom": "^12.23.23",
1369
+ "motion-utils": "^12.23.6",
1370
+ "tslib": "^2.4.0"
1371
+ },
1372
+ "peerDependencies": {
1373
+ "@emotion/is-prop-valid": "*",
1374
+ "react": "^18.0.0 || ^19.0.0",
1375
+ "react-dom": "^18.0.0 || ^19.0.0"
1376
+ },
1377
+ "peerDependenciesMeta": {
1378
+ "@emotion/is-prop-valid": {
1379
+ "optional": true
1380
+ },
1381
+ "react": {
1382
+ "optional": true
1383
+ },
1384
+ "react-dom": {
1385
+ "optional": true
1386
+ }
1387
+ }
1388
+ },
1389
+ "node_modules/fsevents": {
1390
+ "version": "2.3.3",
1391
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
1392
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
1393
+ "dev": true,
1394
+ "hasInstallScript": true,
1395
+ "license": "MIT",
1396
+ "optional": true,
1397
+ "os": [
1398
+ "darwin"
1399
+ ],
1400
+ "engines": {
1401
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
1402
+ }
1403
+ },
1404
+ "node_modules/gensync": {
1405
+ "version": "1.0.0-beta.2",
1406
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
1407
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
1408
+ "dev": true,
1409
+ "license": "MIT",
1410
+ "engines": {
1411
+ "node": ">=6.9.0"
1412
+ }
1413
+ },
1414
+ "node_modules/js-tokens": {
1415
+ "version": "4.0.0",
1416
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
1417
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
1418
+ "dev": true,
1419
+ "license": "MIT"
1420
+ },
1421
+ "node_modules/jsesc": {
1422
+ "version": "3.1.0",
1423
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
1424
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
1425
+ "dev": true,
1426
+ "license": "MIT",
1427
+ "bin": {
1428
+ "jsesc": "bin/jsesc"
1429
+ },
1430
+ "engines": {
1431
+ "node": ">=6"
1432
+ }
1433
+ },
1434
+ "node_modules/json5": {
1435
+ "version": "2.2.3",
1436
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
1437
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
1438
+ "dev": true,
1439
+ "license": "MIT",
1440
+ "bin": {
1441
+ "json5": "lib/cli.js"
1442
+ },
1443
+ "engines": {
1444
+ "node": ">=6"
1445
+ }
1446
+ },
1447
+ "node_modules/lru-cache": {
1448
+ "version": "5.1.1",
1449
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
1450
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
1451
+ "dev": true,
1452
+ "license": "ISC",
1453
+ "dependencies": {
1454
+ "yallist": "^3.0.2"
1455
+ }
1456
+ },
1457
+ "node_modules/lucide-react": {
1458
+ "version": "0.555.0",
1459
+ "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.555.0.tgz",
1460
+ "integrity": "sha512-D8FvHUGbxWBRQM90NZeIyhAvkFfsh3u9ekrMvJ30Z6gnpBHS6HC6ldLg7tL45hwiIz/u66eKDtdA23gwwGsAHA==",
1461
+ "license": "ISC",
1462
+ "peerDependencies": {
1463
+ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
1464
+ }
1465
+ },
1466
+ "node_modules/motion-dom": {
1467
+ "version": "12.23.23",
1468
+ "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.23.23.tgz",
1469
+ "integrity": "sha512-n5yolOs0TQQBRUFImrRfs/+6X4p3Q4n1dUEqt/H58Vx7OW6RF+foWEgmTVDhIWJIMXOuNNL0apKH2S16en9eiA==",
1470
+ "license": "MIT",
1471
+ "dependencies": {
1472
+ "motion-utils": "^12.23.6"
1473
+ }
1474
+ },
1475
+ "node_modules/motion-utils": {
1476
+ "version": "12.23.6",
1477
+ "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.23.6.tgz",
1478
+ "integrity": "sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ==",
1479
+ "license": "MIT"
1480
+ },
1481
+ "node_modules/ms": {
1482
+ "version": "2.1.3",
1483
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1484
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
1485
+ "dev": true,
1486
+ "license": "MIT"
1487
+ },
1488
+ "node_modules/nanoid": {
1489
+ "version": "3.3.11",
1490
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
1491
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
1492
+ "dev": true,
1493
+ "funding": [
1494
+ {
1495
+ "type": "github",
1496
+ "url": "https://github.com/sponsors/ai"
1497
+ }
1498
+ ],
1499
+ "license": "MIT",
1500
+ "bin": {
1501
+ "nanoid": "bin/nanoid.cjs"
1502
+ },
1503
+ "engines": {
1504
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
1505
+ }
1506
+ },
1507
+ "node_modules/node-releases": {
1508
+ "version": "2.0.27",
1509
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz",
1510
+ "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==",
1511
+ "dev": true,
1512
+ "license": "MIT"
1513
+ },
1514
+ "node_modules/picocolors": {
1515
+ "version": "1.1.1",
1516
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
1517
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
1518
+ "dev": true,
1519
+ "license": "ISC"
1520
+ },
1521
+ "node_modules/picomatch": {
1522
+ "version": "4.0.3",
1523
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
1524
+ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
1525
+ "dev": true,
1526
+ "license": "MIT",
1527
+ "engines": {
1528
+ "node": ">=12"
1529
+ },
1530
+ "funding": {
1531
+ "url": "https://github.com/sponsors/jonschlinkert"
1532
+ }
1533
+ },
1534
+ "node_modules/postcss": {
1535
+ "version": "8.5.6",
1536
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
1537
+ "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
1538
+ "dev": true,
1539
+ "funding": [
1540
+ {
1541
+ "type": "opencollective",
1542
+ "url": "https://opencollective.com/postcss/"
1543
+ },
1544
+ {
1545
+ "type": "tidelift",
1546
+ "url": "https://tidelift.com/funding/github/npm/postcss"
1547
+ },
1548
+ {
1549
+ "type": "github",
1550
+ "url": "https://github.com/sponsors/ai"
1551
+ }
1552
+ ],
1553
+ "license": "MIT",
1554
+ "dependencies": {
1555
+ "nanoid": "^3.3.11",
1556
+ "picocolors": "^1.1.1",
1557
+ "source-map-js": "^1.2.1"
1558
+ },
1559
+ "engines": {
1560
+ "node": "^10 || ^12 || >=14"
1561
+ }
1562
+ },
1563
+ "node_modules/react": {
1564
+ "version": "19.2.0",
1565
+ "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz",
1566
+ "integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==",
1567
+ "license": "MIT",
1568
+ "engines": {
1569
+ "node": ">=0.10.0"
1570
+ }
1571
+ },
1572
+ "node_modules/react-dom": {
1573
+ "version": "19.2.0",
1574
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.0.tgz",
1575
+ "integrity": "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==",
1576
+ "license": "MIT",
1577
+ "dependencies": {
1578
+ "scheduler": "^0.27.0"
1579
+ },
1580
+ "peerDependencies": {
1581
+ "react": "^19.2.0"
1582
+ }
1583
+ },
1584
+ "node_modules/react-refresh": {
1585
+ "version": "0.18.0",
1586
+ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz",
1587
+ "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==",
1588
+ "dev": true,
1589
+ "license": "MIT",
1590
+ "engines": {
1591
+ "node": ">=0.10.0"
1592
+ }
1593
+ },
1594
+ "node_modules/rollup": {
1595
+ "version": "4.53.3",
1596
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.3.tgz",
1597
+ "integrity": "sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==",
1598
+ "dev": true,
1599
+ "license": "MIT",
1600
+ "dependencies": {
1601
+ "@types/estree": "1.0.8"
1602
+ },
1603
+ "bin": {
1604
+ "rollup": "dist/bin/rollup"
1605
+ },
1606
+ "engines": {
1607
+ "node": ">=18.0.0",
1608
+ "npm": ">=8.0.0"
1609
+ },
1610
+ "optionalDependencies": {
1611
+ "@rollup/rollup-android-arm-eabi": "4.53.3",
1612
+ "@rollup/rollup-android-arm64": "4.53.3",
1613
+ "@rollup/rollup-darwin-arm64": "4.53.3",
1614
+ "@rollup/rollup-darwin-x64": "4.53.3",
1615
+ "@rollup/rollup-freebsd-arm64": "4.53.3",
1616
+ "@rollup/rollup-freebsd-x64": "4.53.3",
1617
+ "@rollup/rollup-linux-arm-gnueabihf": "4.53.3",
1618
+ "@rollup/rollup-linux-arm-musleabihf": "4.53.3",
1619
+ "@rollup/rollup-linux-arm64-gnu": "4.53.3",
1620
+ "@rollup/rollup-linux-arm64-musl": "4.53.3",
1621
+ "@rollup/rollup-linux-loong64-gnu": "4.53.3",
1622
+ "@rollup/rollup-linux-ppc64-gnu": "4.53.3",
1623
+ "@rollup/rollup-linux-riscv64-gnu": "4.53.3",
1624
+ "@rollup/rollup-linux-riscv64-musl": "4.53.3",
1625
+ "@rollup/rollup-linux-s390x-gnu": "4.53.3",
1626
+ "@rollup/rollup-linux-x64-gnu": "4.53.3",
1627
+ "@rollup/rollup-linux-x64-musl": "4.53.3",
1628
+ "@rollup/rollup-openharmony-arm64": "4.53.3",
1629
+ "@rollup/rollup-win32-arm64-msvc": "4.53.3",
1630
+ "@rollup/rollup-win32-ia32-msvc": "4.53.3",
1631
+ "@rollup/rollup-win32-x64-gnu": "4.53.3",
1632
+ "@rollup/rollup-win32-x64-msvc": "4.53.3",
1633
+ "fsevents": "~2.3.2"
1634
+ }
1635
+ },
1636
+ "node_modules/scheduler": {
1637
+ "version": "0.27.0",
1638
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
1639
+ "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==",
1640
+ "license": "MIT"
1641
+ },
1642
+ "node_modules/semver": {
1643
+ "version": "6.3.1",
1644
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
1645
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
1646
+ "dev": true,
1647
+ "license": "ISC",
1648
+ "bin": {
1649
+ "semver": "bin/semver.js"
1650
+ }
1651
+ },
1652
+ "node_modules/source-map-js": {
1653
+ "version": "1.2.1",
1654
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
1655
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
1656
+ "dev": true,
1657
+ "license": "BSD-3-Clause",
1658
+ "engines": {
1659
+ "node": ">=0.10.0"
1660
+ }
1661
+ },
1662
+ "node_modules/tinyglobby": {
1663
+ "version": "0.2.15",
1664
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
1665
+ "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
1666
+ "dev": true,
1667
+ "license": "MIT",
1668
+ "dependencies": {
1669
+ "fdir": "^6.5.0",
1670
+ "picomatch": "^4.0.3"
1671
+ },
1672
+ "engines": {
1673
+ "node": ">=12.0.0"
1674
+ },
1675
+ "funding": {
1676
+ "url": "https://github.com/sponsors/SuperchupuDev"
1677
+ }
1678
+ },
1679
+ "node_modules/tslib": {
1680
+ "version": "2.8.1",
1681
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
1682
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
1683
+ "license": "0BSD"
1684
+ },
1685
+ "node_modules/typescript": {
1686
+ "version": "5.8.3",
1687
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
1688
+ "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==",
1689
+ "dev": true,
1690
+ "license": "Apache-2.0",
1691
+ "bin": {
1692
+ "tsc": "bin/tsc",
1693
+ "tsserver": "bin/tsserver"
1694
+ },
1695
+ "engines": {
1696
+ "node": ">=14.17"
1697
+ }
1698
+ },
1699
+ "node_modules/undici-types": {
1700
+ "version": "6.21.0",
1701
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
1702
+ "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
1703
+ "dev": true,
1704
+ "license": "MIT"
1705
+ },
1706
+ "node_modules/update-browserslist-db": {
1707
+ "version": "1.1.4",
1708
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz",
1709
+ "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==",
1710
+ "dev": true,
1711
+ "funding": [
1712
+ {
1713
+ "type": "opencollective",
1714
+ "url": "https://opencollective.com/browserslist"
1715
+ },
1716
+ {
1717
+ "type": "tidelift",
1718
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
1719
+ },
1720
+ {
1721
+ "type": "github",
1722
+ "url": "https://github.com/sponsors/ai"
1723
+ }
1724
+ ],
1725
+ "license": "MIT",
1726
+ "dependencies": {
1727
+ "escalade": "^3.2.0",
1728
+ "picocolors": "^1.1.1"
1729
+ },
1730
+ "bin": {
1731
+ "update-browserslist-db": "cli.js"
1732
+ },
1733
+ "peerDependencies": {
1734
+ "browserslist": ">= 4.21.0"
1735
+ }
1736
+ },
1737
+ "node_modules/vite": {
1738
+ "version": "6.4.1",
1739
+ "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz",
1740
+ "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==",
1741
+ "dev": true,
1742
+ "license": "MIT",
1743
+ "dependencies": {
1744
+ "esbuild": "^0.25.0",
1745
+ "fdir": "^6.4.4",
1746
+ "picomatch": "^4.0.2",
1747
+ "postcss": "^8.5.3",
1748
+ "rollup": "^4.34.9",
1749
+ "tinyglobby": "^0.2.13"
1750
+ },
1751
+ "bin": {
1752
+ "vite": "bin/vite.js"
1753
+ },
1754
+ "engines": {
1755
+ "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
1756
+ },
1757
+ "funding": {
1758
+ "url": "https://github.com/vitejs/vite?sponsor=1"
1759
+ },
1760
+ "optionalDependencies": {
1761
+ "fsevents": "~2.3.3"
1762
+ },
1763
+ "peerDependencies": {
1764
+ "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
1765
+ "jiti": ">=1.21.0",
1766
+ "less": "*",
1767
+ "lightningcss": "^1.21.0",
1768
+ "sass": "*",
1769
+ "sass-embedded": "*",
1770
+ "stylus": "*",
1771
+ "sugarss": "*",
1772
+ "terser": "^5.16.0",
1773
+ "tsx": "^4.8.1",
1774
+ "yaml": "^2.4.2"
1775
+ },
1776
+ "peerDependenciesMeta": {
1777
+ "@types/node": {
1778
+ "optional": true
1779
+ },
1780
+ "jiti": {
1781
+ "optional": true
1782
+ },
1783
+ "less": {
1784
+ "optional": true
1785
+ },
1786
+ "lightningcss": {
1787
+ "optional": true
1788
+ },
1789
+ "sass": {
1790
+ "optional": true
1791
+ },
1792
+ "sass-embedded": {
1793
+ "optional": true
1794
+ },
1795
+ "stylus": {
1796
+ "optional": true
1797
+ },
1798
+ "sugarss": {
1799
+ "optional": true
1800
+ },
1801
+ "terser": {
1802
+ "optional": true
1803
+ },
1804
+ "tsx": {
1805
+ "optional": true
1806
+ },
1807
+ "yaml": {
1808
+ "optional": true
1809
+ }
1810
+ }
1811
+ },
1812
+ "node_modules/yallist": {
1813
+ "version": "3.1.1",
1814
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
1815
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
1816
+ "dev": true,
1817
+ "license": "ISC"
1818
+ }
1819
+ }
1820
+ }
package.json ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "ai-research-workflow-presentation",
3
+ "private": true,
4
+ "version": "0.0.0",
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "vite",
8
+ "build": "vite build",
9
+ "preview": "vite preview"
10
+ },
11
+ "dependencies": {
12
+ "react-dom": "^19.2.0",
13
+ "lucide-react": "^0.555.0",
14
+ "framer-motion": "^12.23.25",
15
+ "react": "^19.2.0"
16
+ },
17
+ "devDependencies": {
18
+ "@types/node": "^22.14.0",
19
+ "@vitejs/plugin-react": "^5.0.0",
20
+ "typescript": "~5.8.2",
21
+ "vite": "^6.2.0"
22
+ }
23
+ }
tsconfig.json ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "experimentalDecorators": true,
5
+ "useDefineForClassFields": false,
6
+ "module": "ESNext",
7
+ "lib": [
8
+ "ES2022",
9
+ "DOM",
10
+ "DOM.Iterable"
11
+ ],
12
+ "skipLibCheck": true,
13
+ "types": [
14
+ "node"
15
+ ],
16
+ "moduleResolution": "bundler",
17
+ "isolatedModules": true,
18
+ "moduleDetection": "force",
19
+ "allowJs": true,
20
+ "jsx": "react-jsx",
21
+ "paths": {
22
+ "@/*": [
23
+ "./*"
24
+ ]
25
+ },
26
+ "allowImportingTsExtensions": true,
27
+ "noEmit": true
28
+ }
29
+ }
types.ts ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ export interface SlideImage {
2
+ src: string;
3
+ alt: string;
4
+ width?: number;
5
+ height?: number;
6
+ position?: string;
7
+ }
8
+
9
+ export interface SlideContent {
10
+ intro?: string;
11
+ tagline?: string;
12
+ heading?: string;
13
+ subheading?: string;
14
+ description?: string;
15
+ bullets?: string[];
16
+ steps?: (string | { label: string; icon: string; delay: number })[];
17
+ leftCard?: { title: string; description: string; icon: string };
18
+ rightCard?: { title: string; description: string; icon: string };
19
+ metrics?: { label: string; value: string; emoji: string }[];
20
+ categories?: { name: string; description: string }[];
21
+ cards?: { name: string; description: string; url: string; icon: string }[];
22
+ callToAction?: { text: string; url: string; icon?: string };
23
+ title?: string;
24
+ subtitle?: string;
25
+ }
26
+
27
+ export interface SlideAnimation {
28
+ type: string;
29
+ duration: number;
30
+ stagger?: number;
31
+ [key: string]: any;
32
+ }
33
+
34
+ export interface Slide {
35
+ id: number;
36
+ title: string;
37
+ subtitle?: string;
38
+ description?: string;
39
+ type: 'hero' | 'problem' | 'solution' | 'comparison' | 'tool-intro' | 'features' | 'process' | 'use-cases' | 'diagram' | 'summary' | 'vision' | 'closing';
40
+ animation: SlideAnimation;
41
+ background: string;
42
+ backgroundImage: string | null;
43
+ content: SlideContent;
44
+ images: SlideImage[];
45
+ transition: string;
46
+ }
47
+
48
+ export interface PresentationData {
49
+ metadata: {
50
+ title: string;
51
+ subtitle: string;
52
+ author: string;
53
+ date: string;
54
+ description: string;
55
+ };
56
+ slides: Slide[];
57
+ // Tools and other extra data can be typed as needed, but for rendering we focus on slides
58
+ [key: string]: any;
59
+ }
vite.config.ts ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import path from 'path';
2
+ import { defineConfig, loadEnv } from 'vite';
3
+ import react from '@vitejs/plugin-react';
4
+
5
+ export default defineConfig(({ mode }) => {
6
+ const env = loadEnv(mode, '.', '');
7
+ return {
8
+ server: {
9
+ port: 3000,
10
+ host: '0.0.0.0',
11
+ },
12
+ plugins: [react()],
13
+ define: {
14
+ 'process.env.API_KEY': JSON.stringify(env.GEMINI_API_KEY),
15
+ 'process.env.GEMINI_API_KEY': JSON.stringify(env.GEMINI_API_KEY)
16
+ },
17
+ resolve: {
18
+ alias: {
19
+ '@': path.resolve(__dirname, '.'),
20
+ }
21
+ }
22
+ };
23
+ });