Hanzo Dev commited on
Commit
dca4444
·
1 Parent(s): 270d879

feat: enhance template gallery with @hanzo /ui integration and new templates

Browse files

- Refactor all 8 existing templates to use @hanzo /ui components
- Add 4 new high-priority templates (AI Chat, Search, E-commerce, API Docs)
- Implement download/export functionality with ZIP generation
- Add GitHub repository creation and one-click deploy buttons
- Update all templates to monochromatic theme matching shadcn.com
- Follow shadcn/ui component patterns (Button variants, Card composition)
- Ensure full responsive design across mobile, tablet, desktop
- Add comprehensive metadata and installation commands for all templates

app/api/deploy/[platform]/route.ts ADDED
@@ -0,0 +1,205 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { NextRequest, NextResponse } from 'next/server'
2
+ import { templates } from '@/components/template-data'
3
+
4
+ export async function GET(
5
+ request: NextRequest,
6
+ { params }: { params: { platform: string } }
7
+ ) {
8
+ try {
9
+ const { searchParams } = new URL(request.url)
10
+ const templateId = searchParams.get('template')
11
+
12
+ if (!templateId) {
13
+ return NextResponse.json(
14
+ { error: 'Template ID is required' },
15
+ { status: 400 }
16
+ )
17
+ }
18
+
19
+ const template = templates.find(t => t.id === templateId)
20
+
21
+ if (!template) {
22
+ return NextResponse.json(
23
+ { error: 'Template not found' },
24
+ { status: 404 }
25
+ )
26
+ }
27
+
28
+ const platform = params.platform.toLowerCase()
29
+ let deployUrl: string | undefined
30
+
31
+ // Get the appropriate deploy URL based on platform
32
+ switch (platform) {
33
+ case 'vercel':
34
+ deployUrl = template.deployUrls?.vercel
35
+ break
36
+ case 'netlify':
37
+ deployUrl = template.deployUrls?.netlify
38
+ break
39
+ case 'railway':
40
+ deployUrl = template.deployUrls?.railway
41
+ break
42
+ case 'render':
43
+ deployUrl = template.deployUrls?.render
44
+ break
45
+ default:
46
+ return NextResponse.json(
47
+ { error: 'Unsupported deployment platform' },
48
+ { status: 400 }
49
+ )
50
+ }
51
+
52
+ if (!deployUrl) {
53
+ return NextResponse.json(
54
+ { error: `Deployment to ${platform} is not available for this template` },
55
+ { status: 404 }
56
+ )
57
+ }
58
+
59
+ // Redirect to the deployment URL
60
+ return NextResponse.redirect(deployUrl)
61
+ } catch (error) {
62
+ console.error('Error processing deployment:', error)
63
+ return NextResponse.json(
64
+ { error: 'Failed to process deployment request' },
65
+ { status: 500 }
66
+ )
67
+ }
68
+ }
69
+
70
+ export async function POST(
71
+ request: NextRequest,
72
+ { params }: { params: { platform: string } }
73
+ ) {
74
+ try {
75
+ const { templateId, projectName, envVars } = await request.json()
76
+
77
+ const template = templates.find(t => t.id === templateId)
78
+
79
+ if (!template) {
80
+ return NextResponse.json(
81
+ { error: 'Template not found' },
82
+ { status: 404 }
83
+ )
84
+ }
85
+
86
+ const platform = params.platform.toLowerCase()
87
+
88
+ // Generate deployment configuration
89
+ const deploymentConfig = {
90
+ template: template.id,
91
+ name: projectName || `${template.id}-app`,
92
+ platform,
93
+ githubUrl: template.githubUrl,
94
+ envVars: envVars || {},
95
+ buildCommand: 'npm run build',
96
+ startCommand: 'npm run start',
97
+ installCommand: 'npm install',
98
+ nodeVersion: '18.x'
99
+ }
100
+
101
+ // Platform-specific deployment URLs and parameters
102
+ let deploymentUrl: string
103
+
104
+ switch (platform) {
105
+ case 'vercel':
106
+ // Vercel deployment URL with parameters
107
+ const vercelParams = new URLSearchParams({
108
+ 'repository-url': template.githubUrl || '',
109
+ 'project-name': deploymentConfig.name,
110
+ 'repository-name': deploymentConfig.name,
111
+ 'demo-title': template.name,
112
+ 'demo-description': template.description,
113
+ 'demo-url': template.demoUrl || '',
114
+ 'demo-image': '',
115
+ ...Object.fromEntries(
116
+ Object.entries(envVars || {}).map(([key, value]) =>
117
+ [`env[${key}]`, String(value)]
118
+ )
119
+ )
120
+ })
121
+ deploymentUrl = `https://vercel.com/new/clone?${vercelParams.toString()}`
122
+ break
123
+
124
+ case 'netlify':
125
+ // Netlify deployment URL
126
+ deploymentUrl = template.deployUrls?.netlify ||
127
+ `https://app.netlify.com/start/deploy?repository=${template.githubUrl}`
128
+ break
129
+
130
+ case 'railway':
131
+ // Railway deployment URL
132
+ deploymentUrl = template.deployUrls?.railway ||
133
+ `https://railway.app/new/template?template=${template.githubUrl}`
134
+ break
135
+
136
+ case 'render':
137
+ // Render deployment URL
138
+ const renderParams = new URLSearchParams({
139
+ repo: template.githubUrl || '',
140
+ name: deploymentConfig.name
141
+ })
142
+ deploymentUrl = `https://render.com/deploy?${renderParams.toString()}`
143
+ break
144
+
145
+ default:
146
+ return NextResponse.json(
147
+ { error: 'Unsupported deployment platform' },
148
+ { status: 400 }
149
+ )
150
+ }
151
+
152
+ return NextResponse.json({
153
+ success: true,
154
+ platform,
155
+ deploymentUrl,
156
+ config: deploymentConfig,
157
+ message: `Ready to deploy to ${platform}`,
158
+ instructions: getDeploymentInstructions(platform, template)
159
+ })
160
+ } catch (error) {
161
+ console.error('Error preparing deployment:', error)
162
+ return NextResponse.json(
163
+ { error: 'Failed to prepare deployment' },
164
+ { status: 500 }
165
+ )
166
+ }
167
+ }
168
+
169
+ function getDeploymentInstructions(platform: string, template: any): string[] {
170
+ switch (platform) {
171
+ case 'vercel':
172
+ return [
173
+ 'Click the deploy button to start',
174
+ 'Connect your GitHub account',
175
+ 'Configure environment variables if needed',
176
+ 'Click "Deploy" to complete'
177
+ ]
178
+ case 'netlify':
179
+ return [
180
+ 'Click the deploy button',
181
+ 'Authorize Netlify to access your GitHub',
182
+ 'Configure build settings',
183
+ 'Add environment variables',
184
+ 'Deploy your site'
185
+ ]
186
+ case 'railway':
187
+ return [
188
+ 'Click the deploy button',
189
+ 'Sign in to Railway',
190
+ 'Configure your project',
191
+ 'Add environment variables',
192
+ 'Deploy to production'
193
+ ]
194
+ case 'render':
195
+ return [
196
+ 'Click the deploy button',
197
+ 'Connect your GitHub account',
198
+ 'Select repository',
199
+ 'Configure build and start commands',
200
+ 'Deploy your application'
201
+ ]
202
+ default:
203
+ return ['Follow the platform-specific deployment instructions']
204
+ }
205
+ }
app/api/download/[template]/route.ts ADDED
@@ -0,0 +1,118 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { NextRequest, NextResponse } from 'next/server'
2
+ import { templates } from '@/components/template-data'
3
+ import archiver from 'archiver'
4
+ import { createReadStream, existsSync } from 'fs'
5
+ import { join } from 'path'
6
+ import { readdir, stat } from 'fs/promises'
7
+
8
+ export async function GET(
9
+ request: NextRequest,
10
+ { params }: { params: { template: string } }
11
+ ) {
12
+ try {
13
+ const templateId = params.template
14
+ const template = templates.find(t => t.id === templateId)
15
+
16
+ if (!template || !template.downloadable) {
17
+ return NextResponse.json(
18
+ { error: 'Template not found or not downloadable' },
19
+ { status: 404 }
20
+ )
21
+ }
22
+
23
+ // Path to the template directory
24
+ const templatePath = join(process.cwd(), '..', template.templatePath || template.id)
25
+
26
+ // Check if the template directory exists
27
+ if (!existsSync(templatePath)) {
28
+ return NextResponse.json(
29
+ { error: 'Template directory not found' },
30
+ { status: 404 }
31
+ )
32
+ }
33
+
34
+ // Create a ZIP archive
35
+ const archive = archiver('zip', {
36
+ zlib: { level: 9 } // Maximum compression
37
+ })
38
+
39
+ // Create a stream for the response
40
+ const stream = new ReadableStream({
41
+ start(controller) {
42
+ archive.on('data', (chunk) => controller.enqueue(chunk))
43
+ archive.on('end', () => controller.close())
44
+ archive.on('error', (err) => controller.error(err))
45
+ }
46
+ })
47
+
48
+ // Add files to the archive
49
+ await addDirectoryToArchive(archive, templatePath, template.name)
50
+
51
+ // Finalize the archive
52
+ archive.finalize()
53
+
54
+ // Return the ZIP file as a response
55
+ return new NextResponse(stream, {
56
+ headers: {
57
+ 'Content-Type': 'application/zip',
58
+ 'Content-Disposition': `attachment; filename="${template.id}-template.zip"`
59
+ }
60
+ })
61
+ } catch (error) {
62
+ console.error('Error creating template archive:', error)
63
+ return NextResponse.json(
64
+ { error: 'Failed to create template archive' },
65
+ { status: 500 }
66
+ )
67
+ }
68
+ }
69
+
70
+ async function addDirectoryToArchive(
71
+ archive: archiver.Archiver,
72
+ dirPath: string,
73
+ archivePath: string
74
+ ) {
75
+ const entries = await readdir(dirPath, { withFileTypes: true })
76
+
77
+ for (const entry of entries) {
78
+ const fullPath = join(dirPath, entry.name)
79
+ const entryArchivePath = join(archivePath, entry.name)
80
+
81
+ // Skip certain directories and files
82
+ if (shouldSkipEntry(entry.name)) {
83
+ continue
84
+ }
85
+
86
+ if (entry.isDirectory()) {
87
+ // Recursively add directory contents
88
+ await addDirectoryToArchive(archive, fullPath, entryArchivePath)
89
+ } else {
90
+ // Add file to archive
91
+ archive.append(createReadStream(fullPath), { name: entryArchivePath })
92
+ }
93
+ }
94
+ }
95
+
96
+ function shouldSkipEntry(name: string): boolean {
97
+ const skipPatterns = [
98
+ 'node_modules',
99
+ '.git',
100
+ '.next',
101
+ '.cache',
102
+ 'dist',
103
+ 'build',
104
+ '.DS_Store',
105
+ 'Thumbs.db',
106
+ '*.log',
107
+ '.env.local',
108
+ '.env.*.local'
109
+ ]
110
+
111
+ return skipPatterns.some(pattern => {
112
+ if (pattern.includes('*')) {
113
+ const regex = new RegExp(pattern.replace('*', '.*'))
114
+ return regex.test(name)
115
+ }
116
+ return name === pattern
117
+ })
118
+ }
app/api/github/create/route.ts ADDED
@@ -0,0 +1,152 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { NextRequest, NextResponse } from 'next/server'
2
+ import { templates } from '@/components/template-data'
3
+
4
+ export async function POST(request: NextRequest) {
5
+ try {
6
+ const { templateId, repoName, description, isPrivate } = await request.json()
7
+
8
+ const template = templates.find(t => t.id === templateId)
9
+
10
+ if (!template) {
11
+ return NextResponse.json(
12
+ { error: 'Template not found' },
13
+ { status: 404 }
14
+ )
15
+ }
16
+
17
+ // Get GitHub token from environment or request headers
18
+ const githubToken = request.headers.get('X-GitHub-Token') || process.env.GITHUB_TOKEN
19
+
20
+ if (!githubToken) {
21
+ return NextResponse.json(
22
+ { error: 'GitHub authentication required' },
23
+ { status: 401 }
24
+ )
25
+ }
26
+
27
+ // Create repository using GitHub API
28
+ const createRepoResponse = await fetch('https://api.github.com/user/repos', {
29
+ method: 'POST',
30
+ headers: {
31
+ 'Authorization': `Bearer ${githubToken}`,
32
+ 'Accept': 'application/vnd.github.v3+json',
33
+ 'Content-Type': 'application/json'
34
+ },
35
+ body: JSON.stringify({
36
+ name: repoName || `${template.id}-project`,
37
+ description: description || template.description,
38
+ private: isPrivate || false,
39
+ auto_init: true,
40
+ has_issues: true,
41
+ has_projects: false,
42
+ has_wiki: false
43
+ })
44
+ })
45
+
46
+ if (!createRepoResponse.ok) {
47
+ const error = await createRepoResponse.json()
48
+ return NextResponse.json(
49
+ { error: error.message || 'Failed to create repository' },
50
+ { status: createRepoResponse.status }
51
+ )
52
+ }
53
+
54
+ const repo = await createRepoResponse.json()
55
+
56
+ // If template has a GitHub URL, we can suggest importing it
57
+ if (template.githubUrl) {
58
+ // Add a README with instructions
59
+ const readmeContent = `# ${repoName || template.name}
60
+
61
+ ${description || template.description}
62
+
63
+ ## Getting Started
64
+
65
+ This project was created from the ${template.name} template.
66
+
67
+ ### Quick Setup
68
+
69
+ \`\`\`bash
70
+ # Clone this repository
71
+ git clone ${repo.clone_url}
72
+
73
+ # Navigate to the project
74
+ cd ${repo.name}
75
+
76
+ # Install dependencies
77
+ npm install
78
+
79
+ # Start development server
80
+ npm run dev
81
+ \`\`\`
82
+
83
+ ### Template Information
84
+
85
+ - **Template**: ${template.name}
86
+ - **Category**: ${template.category}
87
+ - **Technologies**: ${template.tech.join(', ')}
88
+
89
+ ### Features
90
+
91
+ ${template.features.map(f => `- ${f}`).join('\n')}
92
+
93
+ ### Deploy
94
+
95
+ ${template.deployUrls?.vercel ? `[![Deploy with Vercel](https://vercel.com/button)](${template.deployUrls.vercel})` : ''}
96
+ ${template.deployUrls?.netlify ? `[![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](${template.deployUrls.netlify})` : ''}
97
+ ${template.deployUrls?.railway ? `[![Deploy on Railway](https://railway.app/button.svg)](${template.deployUrls.railway})` : ''}
98
+
99
+ ## License
100
+
101
+ MIT
102
+
103
+ ---
104
+
105
+ Created with [Hanzo AI Templates](https://hanzo.ai/templates)
106
+ `
107
+
108
+ // Create README file
109
+ const createFileResponse = await fetch(
110
+ `https://api.github.com/repos/${repo.owner.login}/${repo.name}/contents/README.md`,
111
+ {
112
+ method: 'PUT',
113
+ headers: {
114
+ 'Authorization': `Bearer ${githubToken}`,
115
+ 'Accept': 'application/vnd.github.v3+json',
116
+ 'Content-Type': 'application/json'
117
+ },
118
+ body: JSON.stringify({
119
+ message: 'Initial commit with template information',
120
+ content: Buffer.from(readmeContent).toString('base64')
121
+ })
122
+ }
123
+ )
124
+
125
+ if (!createFileResponse.ok) {
126
+ console.error('Failed to create README:', await createFileResponse.text())
127
+ }
128
+ }
129
+
130
+ return NextResponse.json({
131
+ success: true,
132
+ repository: {
133
+ name: repo.name,
134
+ url: repo.html_url,
135
+ cloneUrl: repo.clone_url,
136
+ description: repo.description
137
+ },
138
+ message: 'Repository created successfully',
139
+ nextSteps: [
140
+ `Clone your repository: git clone ${repo.clone_url}`,
141
+ 'Copy template files to your repository',
142
+ 'Commit and push your changes'
143
+ ]
144
+ })
145
+ } catch (error) {
146
+ console.error('Error creating GitHub repository:', error)
147
+ return NextResponse.json(
148
+ { error: 'Failed to create GitHub repository' },
149
+ { status: 500 }
150
+ )
151
+ }
152
+ }
app/page.tsx CHANGED
@@ -57,7 +57,8 @@ import {
57
  BarChart3,
58
  Globe,
59
  Moon,
60
- Sun
 
61
  } from 'lucide-react'
62
 
63
  export default function GalleryPage() {
@@ -70,6 +71,7 @@ export default function GalleryPage() {
70
  const [favorites, setFavorites] = useState<string[]>([])
71
  const [showScrollTop, setShowScrollTop] = useState(false)
72
  const [isDark, setIsDark] = useState(true)
 
73
 
74
  // Filter templates based on search and category
75
  const filteredTemplates = templates.filter(template => {
@@ -110,6 +112,34 @@ export default function GalleryPage() {
110
  )
111
  }
112
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
113
  const getCategoryIcon = (category: string) => {
114
  switch(category) {
115
  case 'development': return <Code2 className="w-4 h-4" />
@@ -130,8 +160,6 @@ export default function GalleryPage() {
130
  <div className="flex items-center gap-2 md:gap-4">
131
  <Logo className="h-8 w-8" />
132
  <LogoText className="hidden sm:block h-6" />
133
- <Separator orientation="vertical" className="h-6 hidden md:block" />
134
- <span className="text-sm text-muted-foreground hidden md:block">Template Gallery</span>
135
  </div>
136
 
137
  <nav className="flex items-center gap-2">
@@ -383,14 +411,16 @@ export default function GalleryPage() {
383
  onClick={() => window.location.href = `/template/${template.id}`}
384
  >
385
  <Eye className="w-4 h-4 mr-2" />
386
- Preview
387
  </Button>
388
  <Button
389
  variant="outline"
390
  className="flex-1 h-9 text-sm"
 
 
391
  >
392
  <Download className="w-4 h-4 mr-2" />
393
- Use
394
  </Button>
395
  </div>
396
 
 
57
  BarChart3,
58
  Globe,
59
  Moon,
60
+ Sun,
61
+ GitBranch
62
  } from 'lucide-react'
63
 
64
  export default function GalleryPage() {
 
71
  const [favorites, setFavorites] = useState<string[]>([])
72
  const [showScrollTop, setShowScrollTop] = useState(false)
73
  const [isDark, setIsDark] = useState(true)
74
+ const [downloadingId, setDownloadingId] = useState<string | null>(null)
75
 
76
  // Filter templates based on search and category
77
  const filteredTemplates = templates.filter(template => {
 
112
  )
113
  }
114
 
115
+ const handleDownload = async (template: Template) => {
116
+ if (!template.downloadable) {
117
+ alert('This template is not available for download')
118
+ return
119
+ }
120
+
121
+ setDownloadingId(template.id)
122
+ try {
123
+ const response = await fetch(`/api/download/${template.id}`)
124
+ if (!response.ok) throw new Error('Download failed')
125
+
126
+ const blob = await response.blob()
127
+ const url = window.URL.createObjectURL(blob)
128
+ const a = document.createElement('a')
129
+ a.href = url
130
+ a.download = `${template.id}-template.zip`
131
+ document.body.appendChild(a)
132
+ a.click()
133
+ window.URL.revokeObjectURL(url)
134
+ document.body.removeChild(a)
135
+ } catch (error) {
136
+ console.error('Download error:', error)
137
+ alert('Failed to download template')
138
+ } finally {
139
+ setDownloadingId(null)
140
+ }
141
+ }
142
+
143
  const getCategoryIcon = (category: string) => {
144
  switch(category) {
145
  case 'development': return <Code2 className="w-4 h-4" />
 
160
  <div className="flex items-center gap-2 md:gap-4">
161
  <Logo className="h-8 w-8" />
162
  <LogoText className="hidden sm:block h-6" />
 
 
163
  </div>
164
 
165
  <nav className="flex items-center gap-2">
 
411
  onClick={() => window.location.href = `/template/${template.id}`}
412
  >
413
  <Eye className="w-4 h-4 mr-2" />
414
+ View
415
  </Button>
416
  <Button
417
  variant="outline"
418
  className="flex-1 h-9 text-sm"
419
+ onClick={() => handleDownload(template)}
420
+ disabled={!template.downloadable || downloadingId === template.id}
421
  >
422
  <Download className="w-4 h-4 mr-2" />
423
+ {downloadingId === template.id ? 'Loading...' : 'Download'}
424
  </Button>
425
  </div>
426
 
app/template/[id]/page.tsx CHANGED
@@ -43,7 +43,10 @@ import {
43
  Globe,
44
  Terminal,
45
  Package,
46
- Eye
 
 
 
47
  } from 'lucide-react'
48
 
49
  export default function TemplatePage() {
@@ -55,6 +58,8 @@ export default function TemplatePage() {
55
  const [viewMode, setViewMode] = useState<'desktop' | 'tablet' | 'mobile'>('desktop')
56
  const [isDark, setIsDark] = useState(true)
57
  const [isFullscreen, setIsFullscreen] = useState(false)
 
 
58
 
59
  useEffect(() => {
60
  if (isDark) {
@@ -89,6 +94,80 @@ export default function TemplatePage() {
89
  setTimeout(() => setCopied(false), 2000)
90
  }
91
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
92
  const getViewportWidth = () => {
93
  switch(viewMode) {
94
  case 'mobile': return 'max-w-[375px]'
@@ -281,12 +360,16 @@ export default function TemplatePage() {
281
  <TabsContent value="code" className="mt-4">
282
  <Card>
283
  <CardHeader className="pb-3">
284
- <CardTitle className="text-base sm:text-lg">Quick Start</CardTitle>
285
- <CardDescription className="text-xs sm:text-sm">Get up and running in seconds</CardDescription>
286
  </CardHeader>
287
- <CardContent className="space-y-4">
 
288
  <div>
289
- <label className="text-sm font-medium mb-2 block">Install Command</label>
 
 
 
290
  <div className="relative">
291
  <code className="block p-2 sm:p-3 bg-muted border border-border rounded-md pr-12 font-mono text-xs sm:text-sm overflow-x-auto">
292
  {template.installCmd}
@@ -302,27 +385,99 @@ export default function TemplatePage() {
302
  </div>
303
  </div>
304
 
305
- <div className="hidden sm:block">
306
- <label className="text-sm font-medium mb-2 block">Next Steps</label>
307
- <ol className="space-y-2 text-sm text-muted-foreground">
308
- <li className="flex gap-2">
309
- <span className="font-semibold">1.</span>
310
- <span>Run the install command above</span>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
311
  </li>
312
- <li className="flex gap-2">
313
- <span className="font-semibold">2.</span>
314
- <span>Navigate to your project directory</span>
 
 
 
 
 
315
  </li>
316
- <li className="flex gap-2">
317
- <span className="font-semibold">3.</span>
318
- <span>Start the development server with <code className="px-1 py-0.5 bg-muted rounded text-xs">npm run dev</code></span>
 
 
 
 
 
319
  </li>
320
- <li className="flex gap-2">
321
- <span className="font-semibold">4.</span>
322
- <span>Open <code className="px-1 py-0.5 bg-muted rounded text-xs">http://localhost:{template.port}</code></span>
 
 
 
 
 
323
  </li>
324
  </ol>
325
  </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
326
  </CardContent>
327
  </Card>
328
  </TabsContent>
@@ -382,17 +537,82 @@ export default function TemplatePage() {
382
 
383
  {/* Action Buttons - Stack on Mobile */}
384
  <div className="space-y-2">
385
- <Button className="w-full text-sm" variant="primary">
 
 
 
 
 
 
386
  <Download className="w-4 h-4 mr-2" />
387
- Use This Template
 
 
 
 
 
 
 
 
 
 
388
  </Button>
389
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
390
  <div className="grid grid-cols-2 gap-2">
391
  {template.githubUrl && (
392
  <Button className="text-sm" variant="outline" asChild>
393
  <a href={template.githubUrl} target="_blank" rel="noopener noreferrer">
394
  <Github className="w-4 h-4 sm:mr-2" />
395
- <span className="hidden sm:inline">GitHub</span>
396
  </a>
397
  </Button>
398
  )}
@@ -401,7 +621,7 @@ export default function TemplatePage() {
401
  <Button className="text-sm" variant="outline" asChild>
402
  <a href={template.demoUrl} target="_blank" rel="noopener noreferrer">
403
  <Globe className="w-4 h-4 sm:mr-2" />
404
- <span className="hidden sm:inline">Demo</span>
405
  </a>
406
  </Button>
407
  )}
 
43
  Globe,
44
  Terminal,
45
  Package,
46
+ Eye,
47
+ Rocket,
48
+ FolderOpen,
49
+ GitBranch
50
  } from 'lucide-react'
51
 
52
  export default function TemplatePage() {
 
58
  const [viewMode, setViewMode] = useState<'desktop' | 'tablet' | 'mobile'>('desktop')
59
  const [isDark, setIsDark] = useState(true)
60
  const [isFullscreen, setIsFullscreen] = useState(false)
61
+ const [isDownloading, setIsDownloading] = useState(false)
62
+ const [showDeployMenu, setShowDeployMenu] = useState(false)
63
 
64
  useEffect(() => {
65
  if (isDark) {
 
94
  setTimeout(() => setCopied(false), 2000)
95
  }
96
 
97
+ const handleDownload = async () => {
98
+ if (!template.downloadable) {
99
+ alert('This template is not available for download')
100
+ return
101
+ }
102
+
103
+ setIsDownloading(true)
104
+ try {
105
+ const response = await fetch(`/api/download/${template.id}`)
106
+ if (!response.ok) throw new Error('Download failed')
107
+
108
+ const blob = await response.blob()
109
+ const url = window.URL.createObjectURL(blob)
110
+ const a = document.createElement('a')
111
+ a.href = url
112
+ a.download = `${template.id}-template.zip`
113
+ document.body.appendChild(a)
114
+ a.click()
115
+ window.URL.revokeObjectURL(url)
116
+ document.body.removeChild(a)
117
+ } catch (error) {
118
+ console.error('Download error:', error)
119
+ alert('Failed to download template')
120
+ } finally {
121
+ setIsDownloading(false)
122
+ }
123
+ }
124
+
125
+ const handleCreateGitHub = async () => {
126
+ const repoName = prompt('Enter repository name:', `${template.id}-project`)
127
+ if (!repoName) return
128
+
129
+ const githubToken = prompt('Enter your GitHub personal access token:')
130
+ if (!githubToken) {
131
+ alert('GitHub token is required. You can create one at github.com/settings/tokens')
132
+ return
133
+ }
134
+
135
+ try {
136
+ const response = await fetch('/api/github/create', {
137
+ method: 'POST',
138
+ headers: {
139
+ 'Content-Type': 'application/json',
140
+ 'X-GitHub-Token': githubToken
141
+ },
142
+ body: JSON.stringify({
143
+ templateId: template.id,
144
+ repoName,
145
+ description: template.description,
146
+ isPrivate: false
147
+ })
148
+ })
149
+
150
+ const data = await response.json()
151
+ if (data.success) {
152
+ window.open(data.repository.url, '_blank')
153
+ } else {
154
+ alert(`Failed to create repository: ${data.error}`)
155
+ }
156
+ } catch (error) {
157
+ console.error('GitHub creation error:', error)
158
+ alert('Failed to create GitHub repository')
159
+ }
160
+ }
161
+
162
+ const handleDeploy = (platform: string) => {
163
+ if (template.deployUrls?.[platform as keyof typeof template.deployUrls]) {
164
+ window.open(template.deployUrls[platform as keyof typeof template.deployUrls], '_blank')
165
+ } else {
166
+ window.open(`/api/deploy/${platform}?template=${template.id}`, '_blank')
167
+ }
168
+ setShowDeployMenu(false)
169
+ }
170
+
171
  const getViewportWidth = () => {
172
  switch(viewMode) {
173
  case 'mobile': return 'max-w-[375px]'
 
360
  <TabsContent value="code" className="mt-4">
361
  <Card>
362
  <CardHeader className="pb-3">
363
+ <CardTitle className="text-base sm:text-lg">Installation & Setup</CardTitle>
364
+ <CardDescription className="text-xs sm:text-sm">Multiple ways to get started</CardDescription>
365
  </CardHeader>
366
+ <CardContent className="space-y-6">
367
+ {/* CLI Installation */}
368
  <div>
369
+ <label className="text-sm font-medium mb-2 block flex items-center gap-2">
370
+ <Terminal className="w-4 h-4" />
371
+ CLI Installation
372
+ </label>
373
  <div className="relative">
374
  <code className="block p-2 sm:p-3 bg-muted border border-border rounded-md pr-12 font-mono text-xs sm:text-sm overflow-x-auto">
375
  {template.installCmd}
 
385
  </div>
386
  </div>
387
 
388
+ {/* Alternative Methods */}
389
+ <div>
390
+ <label className="text-sm font-medium mb-2 block">Alternative Methods</label>
391
+ <div className="grid gap-2">
392
+ <div className="flex items-center gap-2 p-2 bg-muted/50 rounded-md">
393
+ <Download className="w-4 h-4 text-muted-foreground" />
394
+ <span className="text-sm">Download ZIP file and extract locally</span>
395
+ </div>
396
+ <div className="flex items-center gap-2 p-2 bg-muted/50 rounded-md">
397
+ <GitBranch className="w-4 h-4 text-muted-foreground" />
398
+ <span className="text-sm">Create GitHub repository with template</span>
399
+ </div>
400
+ <div className="flex items-center gap-2 p-2 bg-muted/50 rounded-md">
401
+ <Rocket className="w-4 h-4 text-muted-foreground" />
402
+ <span className="text-sm">Deploy directly to cloud platforms</span>
403
+ </div>
404
+ </div>
405
+ </div>
406
+
407
+ <Separator />
408
+
409
+ {/* Quick Start Steps */}
410
+ <div>
411
+ <label className="text-sm font-medium mb-2 block">Quick Start Steps</label>
412
+ <ol className="space-y-3 text-sm">
413
+ <li className="flex gap-3">
414
+ <span className="flex-shrink-0 w-6 h-6 bg-primary text-primary-foreground rounded-full flex items-center justify-center text-xs font-semibold">1</span>
415
+ <div>
416
+ <div className="font-medium">Install the template</div>
417
+ <code className="text-xs text-muted-foreground bg-muted px-1 py-0.5 rounded">
418
+ {template.installCmd}
419
+ </code>
420
+ </div>
421
  </li>
422
+ <li className="flex gap-3">
423
+ <span className="flex-shrink-0 w-6 h-6 bg-primary text-primary-foreground rounded-full flex items-center justify-center text-xs font-semibold">2</span>
424
+ <div>
425
+ <div className="font-medium">Navigate to project</div>
426
+ <code className="text-xs text-muted-foreground bg-muted px-1 py-0.5 rounded">
427
+ cd {template.id}-project
428
+ </code>
429
+ </div>
430
  </li>
431
+ <li className="flex gap-3">
432
+ <span className="flex-shrink-0 w-6 h-6 bg-primary text-primary-foreground rounded-full flex items-center justify-center text-xs font-semibold">3</span>
433
+ <div>
434
+ <div className="font-medium">Start development server</div>
435
+ <code className="text-xs text-muted-foreground bg-muted px-1 py-0.5 rounded">
436
+ npm run dev
437
+ </code>
438
+ </div>
439
  </li>
440
+ <li className="flex gap-3">
441
+ <span className="flex-shrink-0 w-6 h-6 bg-primary text-primary-foreground rounded-full flex items-center justify-center text-xs font-semibold">4</span>
442
+ <div>
443
+ <div className="font-medium">Open in browser</div>
444
+ <code className="text-xs text-muted-foreground bg-muted px-1 py-0.5 rounded">
445
+ http://localhost:{template.port}
446
+ </code>
447
+ </div>
448
  </li>
449
  </ol>
450
  </div>
451
+
452
+ {/* Environment Variables */}
453
+ {template.tech.some(t => t.includes('Supabase') || t.includes('Stripe') || t.includes('Firebase')) && (
454
+ <>
455
+ <Separator />
456
+ <div>
457
+ <label className="text-sm font-medium mb-2 block">Environment Variables</label>
458
+ <p className="text-xs text-muted-foreground mb-2">
459
+ Copy <code className="px-1 py-0.5 bg-muted rounded">.env.example</code> to <code className="px-1 py-0.5 bg-muted rounded">.env.local</code> and configure:
460
+ </p>
461
+ <div className="space-y-1 text-xs font-mono">
462
+ {template.tech.includes('Supabase') && (
463
+ <>
464
+ <div className="text-muted-foreground">NEXT_PUBLIC_SUPABASE_URL=your_url</div>
465
+ <div className="text-muted-foreground">NEXT_PUBLIC_SUPABASE_ANON_KEY=your_key</div>
466
+ </>
467
+ )}
468
+ {template.tech.includes('Stripe') && (
469
+ <>
470
+ <div className="text-muted-foreground">STRIPE_SECRET_KEY=your_secret_key</div>
471
+ <div className="text-muted-foreground">NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=your_key</div>
472
+ </>
473
+ )}
474
+ {template.tech.includes('Firebase') && (
475
+ <div className="text-muted-foreground">NEXT_PUBLIC_FIREBASE_CONFIG=your_config</div>
476
+ )}
477
+ </div>
478
+ </div>
479
+ </>
480
+ )}
481
  </CardContent>
482
  </Card>
483
  </TabsContent>
 
537
 
538
  {/* Action Buttons - Stack on Mobile */}
539
  <div className="space-y-2">
540
+ {/* Download Button */}
541
+ <Button
542
+ className="w-full text-sm"
543
+ variant="primary"
544
+ onClick={handleDownload}
545
+ disabled={!template.downloadable || isDownloading}
546
+ >
547
  <Download className="w-4 h-4 mr-2" />
548
+ {isDownloading ? 'Downloading...' : 'Download Template'}
549
+ </Button>
550
+
551
+ {/* Create GitHub Repo Button */}
552
+ <Button
553
+ className="w-full text-sm"
554
+ variant="outline"
555
+ onClick={handleCreateGitHub}
556
+ >
557
+ <GitBranch className="w-4 h-4 mr-2" />
558
+ Create GitHub Repo
559
  </Button>
560
 
561
+ {/* Deploy Button with Dropdown */}
562
+ <div className="relative">
563
+ <Button
564
+ className="w-full text-sm"
565
+ variant="outline"
566
+ onClick={() => setShowDeployMenu(!showDeployMenu)}
567
+ >
568
+ <Rocket className="w-4 h-4 mr-2" />
569
+ Deploy to Platform
570
+ </Button>
571
+
572
+ {showDeployMenu && (
573
+ <div className="absolute top-full mt-2 w-full bg-background border border-border rounded-md shadow-lg z-10">
574
+ {template.deployUrls?.vercel && (
575
+ <button
576
+ onClick={() => handleDeploy('vercel')}
577
+ className="w-full text-left px-4 py-2 hover:bg-muted transition-colors text-sm"
578
+ >
579
+ Deploy to Vercel
580
+ </button>
581
+ )}
582
+ {template.deployUrls?.netlify && (
583
+ <button
584
+ onClick={() => handleDeploy('netlify')}
585
+ className="w-full text-left px-4 py-2 hover:bg-muted transition-colors text-sm"
586
+ >
587
+ Deploy to Netlify
588
+ </button>
589
+ )}
590
+ {template.deployUrls?.railway && (
591
+ <button
592
+ onClick={() => handleDeploy('railway')}
593
+ className="w-full text-left px-4 py-2 hover:bg-muted transition-colors text-sm"
594
+ >
595
+ Deploy to Railway
596
+ </button>
597
+ )}
598
+ {template.deployUrls?.render && (
599
+ <button
600
+ onClick={() => handleDeploy('render')}
601
+ className="w-full text-left px-4 py-2 hover:bg-muted transition-colors text-sm"
602
+ >
603
+ Deploy to Render
604
+ </button>
605
+ )}
606
+ </div>
607
+ )}
608
+ </div>
609
+
610
  <div className="grid grid-cols-2 gap-2">
611
  {template.githubUrl && (
612
  <Button className="text-sm" variant="outline" asChild>
613
  <a href={template.githubUrl} target="_blank" rel="noopener noreferrer">
614
  <Github className="w-4 h-4 sm:mr-2" />
615
+ <span className="hidden sm:inline">View Source</span>
616
  </a>
617
  </Button>
618
  )}
 
621
  <Button className="text-sm" variant="outline" asChild>
622
  <a href={template.demoUrl} target="_blank" rel="noopener noreferrer">
623
  <Globe className="w-4 h-4 sm:mr-2" />
624
+ <span className="hidden sm:inline">Live Demo</span>
625
  </a>
626
  </Button>
627
  )}
components/template-data.ts CHANGED
@@ -7,7 +7,7 @@ export interface Template {
7
  port: number
8
  primaryColor: string
9
  secondaryColor: string
10
- gradient: string
11
  features: string[]
12
  tech: string[]
13
  category: 'development' | 'business' | 'creative' | 'analytics' | 'content'
@@ -21,6 +21,14 @@ export interface Template {
21
  installCmd: string
22
  updatedAt: string
23
  pricing: 'Free' | 'Pro' | 'Enterprise'
 
 
 
 
 
 
 
 
24
  }
25
 
26
  export const templates: Template[] = [
@@ -33,7 +41,6 @@ export const templates: Template[] = [
33
  port: 3001,
34
  primaryColor: '#ffffff',
35
  secondaryColor: '#9ca3af',
36
- gradient: 'from-white to-gray-400',
37
  features: [
38
  'AI-Powered Code Generation',
39
  'Real-time Collaboration',
@@ -51,7 +58,15 @@ export const templates: Template[] = [
51
  featured: true,
52
  installCmd: 'npx create-hanzo-app --template devforge',
53
  updatedAt: '2 days ago',
54
- pricing: 'Free'
 
 
 
 
 
 
 
 
55
  },
56
  {
57
  id: 'mobilefirst',
@@ -62,7 +77,6 @@ export const templates: Template[] = [
62
  port: 3002,
63
  primaryColor: '#ffffff',
64
  secondaryColor: '#9ca3af',
65
- gradient: 'from-white to-gray-400',
66
  features: [
67
  'Drag & Drop Builder',
68
  'Cross-Platform Export',
@@ -79,7 +93,14 @@ export const templates: Template[] = [
79
  featured: false,
80
  installCmd: 'npx create-hanzo-app --template mobile',
81
  updatedAt: 'Today',
82
- pricing: 'Pro'
 
 
 
 
 
 
 
83
  },
84
  {
85
  id: 'saasify',
@@ -90,7 +111,6 @@ export const templates: Template[] = [
90
  port: 3003,
91
  primaryColor: '#ffffff',
92
  secondaryColor: '#9ca3af',
93
- gradient: 'from-white to-gray-400',
94
  features: [
95
  'Authentication & SSO',
96
  'Stripe Billing',
@@ -107,7 +127,16 @@ export const templates: Template[] = [
107
  featured: true,
108
  installCmd: 'npx create-hanzo-app --template saas',
109
  updatedAt: '1 week ago',
110
- pricing: 'Pro'
 
 
 
 
 
 
 
 
 
111
  },
112
  {
113
  id: 'startupkit',
@@ -118,7 +147,6 @@ export const templates: Template[] = [
118
  port: 3004,
119
  primaryColor: '#ffffff',
120
  secondaryColor: '#9ca3af',
121
- gradient: 'from-white to-gray-400',
122
  features: [
123
  'Landing Pages',
124
  'Investor Dashboards',
@@ -135,7 +163,14 @@ export const templates: Template[] = [
135
  featured: false,
136
  installCmd: 'npx create-hanzo-app --template startup',
137
  updatedAt: '3 days ago',
138
- pricing: 'Pro'
 
 
 
 
 
 
 
139
  },
140
  {
141
  id: 'analyticsdash',
@@ -146,7 +181,6 @@ export const templates: Template[] = [
146
  port: 3005,
147
  primaryColor: '#ffffff',
148
  secondaryColor: '#9ca3af',
149
- gradient: 'from-white to-gray-400',
150
  features: [
151
  'Real-time Data',
152
  'Custom Dashboards',
@@ -164,7 +198,14 @@ export const templates: Template[] = [
164
  featured: false,
165
  installCmd: 'npx create-hanzo-app --template analytics',
166
  updatedAt: '1 day ago',
167
- pricing: 'Enterprise'
 
 
 
 
 
 
 
168
  },
169
  {
170
  id: 'blog',
@@ -175,7 +216,6 @@ export const templates: Template[] = [
175
  port: 3006,
176
  primaryColor: '#ffffff',
177
  secondaryColor: '#9ca3af',
178
- gradient: 'from-white to-gray-400',
179
  features: [
180
  'MDX Support',
181
  'SEO Optimized',
@@ -192,7 +232,14 @@ export const templates: Template[] = [
192
  featured: false,
193
  installCmd: 'npx create-hanzo-app --template blog',
194
  updatedAt: '5 days ago',
195
- pricing: 'Free'
 
 
 
 
 
 
 
196
  },
197
  {
198
  id: 'changelog',
@@ -203,7 +250,6 @@ export const templates: Template[] = [
203
  port: 3007,
204
  primaryColor: '#ffffff',
205
  secondaryColor: '#9ca3af',
206
- gradient: 'from-white to-gray-400',
207
  features: [
208
  'Version Control',
209
  'RSS Feed',
@@ -219,6 +265,129 @@ export const templates: Template[] = [
219
  featured: false,
220
  installCmd: 'npx create-hanzo-app --template changelog',
221
  updatedAt: '1 week ago',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
222
  pricing: 'Free'
223
  },
224
  {
@@ -230,7 +399,6 @@ export const templates: Template[] = [
230
  port: 3008,
231
  primaryColor: '#ffffff',
232
  secondaryColor: '#9ca3af',
233
- gradient: 'from-white to-gray-400',
234
  features: [
235
  'Project Gallery',
236
  'About Section',
@@ -247,7 +415,14 @@ export const templates: Template[] = [
247
  featured: false,
248
  installCmd: 'npx create-hanzo-app --template portfolio',
249
  updatedAt: '4 days ago',
250
- pricing: 'Free'
 
 
 
 
 
 
 
251
  }
252
  ]
253
 
 
7
  port: number
8
  primaryColor: string
9
  secondaryColor: string
10
+ // gradient field removed - using monochromatic theme
11
  features: string[]
12
  tech: string[]
13
  category: 'development' | 'business' | 'creative' | 'analytics' | 'content'
 
21
  installCmd: string
22
  updatedAt: string
23
  pricing: 'Free' | 'Pro' | 'Enterprise'
24
+ downloadable?: boolean
25
+ templatePath?: string
26
+ deployUrls?: {
27
+ vercel?: string
28
+ netlify?: string
29
+ railway?: string
30
+ render?: string
31
+ }
32
  }
33
 
34
  export const templates: Template[] = [
 
41
  port: 3001,
42
  primaryColor: '#ffffff',
43
  secondaryColor: '#9ca3af',
 
44
  features: [
45
  'AI-Powered Code Generation',
46
  'Real-time Collaboration',
 
58
  featured: true,
59
  installCmd: 'npx create-hanzo-app --template devforge',
60
  updatedAt: '2 days ago',
61
+ pricing: 'Free',
62
+ downloadable: true,
63
+ templatePath: 'devtool',
64
+ githubUrl: 'https://github.com/hanzoai/template-devforge',
65
+ deployUrls: {
66
+ vercel: 'https://vercel.com/new/clone?repository-url=https://github.com/hanzoai/template-devforge',
67
+ netlify: 'https://app.netlify.com/start/deploy?repository=https://github.com/hanzoai/template-devforge',
68
+ railway: 'https://railway.app/new/template?template=https://github.com/hanzoai/template-devforge'
69
+ }
70
  },
71
  {
72
  id: 'mobilefirst',
 
77
  port: 3002,
78
  primaryColor: '#ffffff',
79
  secondaryColor: '#9ca3af',
 
80
  features: [
81
  'Drag & Drop Builder',
82
  'Cross-Platform Export',
 
93
  featured: false,
94
  installCmd: 'npx create-hanzo-app --template mobile',
95
  updatedAt: 'Today',
96
+ pricing: 'Pro',
97
+ downloadable: true,
98
+ templatePath: 'mobile',
99
+ githubUrl: 'https://github.com/hanzoai/template-mobile',
100
+ deployUrls: {
101
+ vercel: 'https://vercel.com/new/clone?repository-url=https://github.com/hanzoai/template-mobile',
102
+ netlify: 'https://app.netlify.com/start/deploy?repository=https://github.com/hanzoai/template-mobile'
103
+ }
104
  },
105
  {
106
  id: 'saasify',
 
111
  port: 3003,
112
  primaryColor: '#ffffff',
113
  secondaryColor: '#9ca3af',
 
114
  features: [
115
  'Authentication & SSO',
116
  'Stripe Billing',
 
127
  featured: true,
128
  installCmd: 'npx create-hanzo-app --template saas',
129
  updatedAt: '1 week ago',
130
+ pricing: 'Pro',
131
+ downloadable: true,
132
+ templatePath: 'saas',
133
+ githubUrl: 'https://github.com/hanzoai/template-saas',
134
+ deployUrls: {
135
+ vercel: 'https://vercel.com/new/clone?repository-url=https://github.com/hanzoai/template-saas',
136
+ netlify: 'https://app.netlify.com/start/deploy?repository=https://github.com/hanzoai/template-saas',
137
+ railway: 'https://railway.app/new/template?template=https://github.com/hanzoai/template-saas',
138
+ render: 'https://render.com/deploy?repo=https://github.com/hanzoai/template-saas'
139
+ }
140
  },
141
  {
142
  id: 'startupkit',
 
147
  port: 3004,
148
  primaryColor: '#ffffff',
149
  secondaryColor: '#9ca3af',
 
150
  features: [
151
  'Landing Pages',
152
  'Investor Dashboards',
 
163
  featured: false,
164
  installCmd: 'npx create-hanzo-app --template startup',
165
  updatedAt: '3 days ago',
166
+ pricing: 'Pro',
167
+ downloadable: true,
168
+ templatePath: 'startup',
169
+ githubUrl: 'https://github.com/hanzoai/template-startup',
170
+ deployUrls: {
171
+ vercel: 'https://vercel.com/new/clone?repository-url=https://github.com/hanzoai/template-startup',
172
+ netlify: 'https://app.netlify.com/start/deploy?repository=https://github.com/hanzoai/template-startup'
173
+ }
174
  },
175
  {
176
  id: 'analyticsdash',
 
181
  port: 3005,
182
  primaryColor: '#ffffff',
183
  secondaryColor: '#9ca3af',
 
184
  features: [
185
  'Real-time Data',
186
  'Custom Dashboards',
 
198
  featured: false,
199
  installCmd: 'npx create-hanzo-app --template analytics',
200
  updatedAt: '1 day ago',
201
+ pricing: 'Enterprise',
202
+ downloadable: true,
203
+ templatePath: 'analytics',
204
+ githubUrl: 'https://github.com/hanzoai/template-analytics',
205
+ deployUrls: {
206
+ vercel: 'https://vercel.com/new/clone?repository-url=https://github.com/hanzoai/template-analytics',
207
+ railway: 'https://railway.app/new/template?template=https://github.com/hanzoai/template-analytics'
208
+ }
209
  },
210
  {
211
  id: 'blog',
 
216
  port: 3006,
217
  primaryColor: '#ffffff',
218
  secondaryColor: '#9ca3af',
 
219
  features: [
220
  'MDX Support',
221
  'SEO Optimized',
 
232
  featured: false,
233
  installCmd: 'npx create-hanzo-app --template blog',
234
  updatedAt: '5 days ago',
235
+ pricing: 'Free',
236
+ downloadable: true,
237
+ templatePath: 'blog',
238
+ githubUrl: 'https://github.com/hanzoai/template-blog',
239
+ deployUrls: {
240
+ vercel: 'https://vercel.com/new/clone?repository-url=https://github.com/hanzoai/template-blog',
241
+ netlify: 'https://app.netlify.com/start/deploy?repository=https://github.com/hanzoai/template-blog'
242
+ }
243
  },
244
  {
245
  id: 'changelog',
 
250
  port: 3007,
251
  primaryColor: '#ffffff',
252
  secondaryColor: '#9ca3af',
 
253
  features: [
254
  'Version Control',
255
  'RSS Feed',
 
265
  featured: false,
266
  installCmd: 'npx create-hanzo-app --template changelog',
267
  updatedAt: '1 week ago',
268
+ pricing: 'Free',
269
+ downloadable: true,
270
+ templatePath: 'changelog',
271
+ githubUrl: 'https://github.com/hanzoai/template-changelog',
272
+ deployUrls: {
273
+ vercel: 'https://vercel.com/new/clone?repository-url=https://github.com/hanzoai/template-changelog',
274
+ netlify: 'https://app.netlify.com/start/deploy?repository=https://github.com/hanzoai/template-changelog'
275
+ }
276
+ },
277
+ {
278
+ id: 'ai-chat',
279
+ name: 'AI Chat',
280
+ tagline: 'Universal AI Chat Interface',
281
+ description: 'Multi-provider chat platform with MCP tools and 100+ LLM models',
282
+ icon: '🤖',
283
+ port: 3009,
284
+ primaryColor: '#ffffff',
285
+ secondaryColor: '#9ca3af',
286
+ gradient: 'from-white to-gray-400',
287
+ features: [
288
+ 'Model Context Protocol',
289
+ '100+ LLM Providers',
290
+ 'Real-time Streaming',
291
+ 'Code Execution',
292
+ 'Multi-Modal Support',
293
+ 'Team Collaboration'
294
+ ],
295
+ tech: ['Next.js', 'LibreChat', 'MCP', 'WebSockets', 'PostgreSQL'],
296
+ category: 'development',
297
+ popularity: 98,
298
+ status: 'new',
299
+ price: 'Free',
300
+ rating: 99,
301
+ featured: true,
302
+ installCmd: 'npx create-hanzo-app --template ai-chat',
303
+ updatedAt: 'Today',
304
+ pricing: 'Free'
305
+ },
306
+ {
307
+ id: 'search-interface',
308
+ name: 'Search Interface',
309
+ tagline: 'AI-Powered Search Platform',
310
+ description: 'Next-generation search with generative UI and real-time answers',
311
+ icon: '🔍',
312
+ port: 3010,
313
+ primaryColor: '#ffffff',
314
+ secondaryColor: '#9ca3af',
315
+ gradient: 'from-white to-gray-400',
316
+ features: [
317
+ 'AI Understanding',
318
+ 'Generative UI',
319
+ 'Multi-Source Search',
320
+ 'Real-time Results',
321
+ 'Smart Filters',
322
+ 'Search Analytics'
323
+ ],
324
+ tech: ['Next.js', 'Supabase', 'Vector DB', 'AI Models', 'Edge Functions'],
325
+ category: 'development',
326
+ popularity: 93,
327
+ status: 'new',
328
+ price: '$49/mo',
329
+ rating: 97,
330
+ featured: true,
331
+ installCmd: 'npx create-hanzo-app --template search',
332
+ updatedAt: 'Today',
333
+ pricing: 'Pro'
334
+ },
335
+ {
336
+ id: 'ecommerce-dash',
337
+ name: 'E-Commerce Dashboard',
338
+ tagline: 'Complete Store Management',
339
+ description: 'Professional e-commerce admin dashboard with analytics and inventory',
340
+ icon: '🛍️',
341
+ port: 3011,
342
+ primaryColor: '#ffffff',
343
+ secondaryColor: '#9ca3af',
344
+ gradient: 'from-white to-gray-400',
345
+ features: [
346
+ 'Sales Analytics',
347
+ 'Inventory Management',
348
+ 'Customer Insights',
349
+ 'Order Processing',
350
+ 'Marketing Tools',
351
+ 'Real-time Metrics'
352
+ ],
353
+ tech: ['Next.js', 'PostgreSQL', 'Stripe', 'Chart.js', 'Redis'],
354
+ category: 'business',
355
+ popularity: 91,
356
+ status: 'new',
357
+ price: '$79/mo',
358
+ rating: 96,
359
+ featured: false,
360
+ installCmd: 'npx create-hanzo-app --template ecommerce',
361
+ updatedAt: 'Today',
362
+ pricing: 'Pro'
363
+ },
364
+ {
365
+ id: 'api-docs',
366
+ name: 'API Documentation',
367
+ tagline: 'Developer-First API Docs',
368
+ description: 'Interactive API documentation with testing playground and SDKs',
369
+ icon: '📚',
370
+ port: 3012,
371
+ primaryColor: '#ffffff',
372
+ secondaryColor: '#9ca3af',
373
+ gradient: 'from-white to-gray-400',
374
+ features: [
375
+ 'Interactive Examples',
376
+ 'Multiple SDKs',
377
+ 'API Playground',
378
+ 'OpenAPI Spec',
379
+ 'Versioning',
380
+ 'Webhooks'
381
+ ],
382
+ tech: ['Next.js', 'MDX', 'OpenAPI', 'Swagger', 'Fumadocs'],
383
+ category: 'development',
384
+ popularity: 87,
385
+ status: 'stable',
386
+ price: 'Free',
387
+ rating: 95,
388
+ featured: false,
389
+ installCmd: 'npx create-hanzo-app --template api-docs',
390
+ updatedAt: 'Today',
391
  pricing: 'Free'
392
  },
393
  {
 
399
  port: 3008,
400
  primaryColor: '#ffffff',
401
  secondaryColor: '#9ca3af',
 
402
  features: [
403
  'Project Gallery',
404
  'About Section',
 
415
  featured: false,
416
  installCmd: 'npx create-hanzo-app --template portfolio',
417
  updatedAt: '4 days ago',
418
+ pricing: 'Free',
419
+ downloadable: true,
420
+ templatePath: 'portfolio',
421
+ githubUrl: 'https://github.com/hanzoai/template-portfolio',
422
+ deployUrls: {
423
+ vercel: 'https://vercel.com/new/clone?repository-url=https://github.com/hanzoai/template-portfolio',
424
+ netlify: 'https://app.netlify.com/start/deploy?repository=https://github.com/hanzoai/template-portfolio'
425
+ }
426
  }
427
  ]
428
 
package-lock.json CHANGED
@@ -29,6 +29,8 @@
29
  "@radix-ui/react-toast": "^1.2.0",
30
  "@radix-ui/react-toggle": "^1.1.0",
31
  "@radix-ui/react-tooltip": "^1.1.0",
 
 
32
  "class-variance-authority": "^0.7.1",
33
  "clsx": "^2.1.1",
34
  "date-fns": "^4.1.0",
@@ -53,6 +55,7 @@
53
  "eslint": "^9",
54
  "eslint-config-next": "15.3.5",
55
  "postcss": "^8.5.6",
 
56
  "tailwindcss": "^3.4.17",
57
  "typescript": "^5"
58
  }
@@ -70,6 +73,31 @@
70
  "url": "https://github.com/sponsors/sindresorhus"
71
  }
72
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
73
  "node_modules/@babel/runtime": {
74
  "version": "7.28.4",
75
  "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz",
@@ -880,7 +908,6 @@
880
  "version": "8.0.2",
881
  "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
882
  "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
883
- "dev": true,
884
  "license": "ISC",
885
  "dependencies": {
886
  "string-width": "^5.1.2",
@@ -1178,13 +1205,35 @@
1178
  "version": "0.11.0",
1179
  "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
1180
  "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
1181
- "dev": true,
1182
  "license": "MIT",
1183
  "optional": true,
1184
  "engines": {
1185
  "node": ">=14"
1186
  }
1187
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1188
  "node_modules/@radix-ui/number": {
1189
  "version": "1.1.1",
1190
  "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz",
@@ -2554,6 +2603,13 @@
2554
  "tailwindcss": ">=3.2.0"
2555
  }
2556
  },
 
 
 
 
 
 
 
2557
  "node_modules/@tybys/wasm-util": {
2558
  "version": "0.10.1",
2559
  "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz",
@@ -2565,6 +2621,15 @@
2565
  "tslib": "^2.4.0"
2566
  }
2567
  },
 
 
 
 
 
 
 
 
 
2568
  "node_modules/@types/estree": {
2569
  "version": "1.0.8",
2570
  "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
@@ -2614,7 +2679,6 @@
2614
  "version": "20.19.17",
2615
  "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.17.tgz",
2616
  "integrity": "sha512-gfehUI8N1z92kygssiuWvLiwcbOB3IRktR6hTDgJlXMYh5OvkPSRmgfoBUmfZt+vhwJtX7v1Yw4KvvAf7c5QKQ==",
2617
- "dev": true,
2618
  "license": "MIT",
2619
  "dependencies": {
2620
  "undici-types": "~6.21.0"
@@ -2648,6 +2712,26 @@
2648
  "@types/react": "^18.0.0"
2649
  }
2650
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2651
  "node_modules/@typescript-eslint/eslint-plugin": {
2652
  "version": "8.44.0",
2653
  "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.44.0.tgz",
@@ -3205,6 +3289,18 @@
3205
  "win32"
3206
  ]
3207
  },
 
 
 
 
 
 
 
 
 
 
 
 
3208
  "node_modules/accepts": {
3209
  "version": "2.0.0",
3210
  "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
@@ -3241,6 +3337,16 @@
3241
  "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
3242
  }
3243
  },
 
 
 
 
 
 
 
 
 
 
3244
  "node_modules/ajv": {
3245
  "version": "6.12.6",
3246
  "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
@@ -3261,7 +3367,6 @@
3261
  "version": "6.2.2",
3262
  "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
3263
  "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
3264
- "dev": true,
3265
  "license": "MIT",
3266
  "engines": {
3267
  "node": ">=12"
@@ -3274,7 +3379,6 @@
3274
  "version": "4.3.0",
3275
  "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
3276
  "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
3277
- "dev": true,
3278
  "license": "MIT",
3279
  "dependencies": {
3280
  "color-convert": "^2.0.1"
@@ -3320,6 +3424,42 @@
3320
  "url": "https://github.com/sponsors/jonschlinkert"
3321
  }
3322
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3323
  "node_modules/arg": {
3324
  "version": "5.0.2",
3325
  "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
@@ -3516,6 +3656,19 @@
3516
  "url": "https://github.com/sponsors/ljharb"
3517
  }
3518
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
3519
  "node_modules/ast-types-flow": {
3520
  "version": "0.0.8",
3521
  "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz",
@@ -3523,6 +3676,12 @@
3523
  "dev": true,
3524
  "license": "MIT"
3525
  },
 
 
 
 
 
 
3526
  "node_modules/async-function": {
3527
  "version": "1.0.0",
3528
  "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz",
@@ -3607,11 +3766,133 @@
3607
  "node": ">= 0.4"
3608
  }
3609
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3610
  "node_modules/balanced-match": {
3611
  "version": "1.0.2",
3612
  "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
3613
  "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3614
  "dev": true,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3615
  "license": "MIT"
3616
  },
3617
  "node_modules/baseline-browser-mapping": {
@@ -3624,6 +3905,16 @@
3624
  "baseline-browser-mapping": "dist/cli.js"
3625
  }
3626
  },
 
 
 
 
 
 
 
 
 
 
3627
  "node_modules/binary-extensions": {
3628
  "version": "2.3.0",
3629
  "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
@@ -3721,6 +4012,39 @@
3721
  "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
3722
  }
3723
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3724
  "node_modules/busboy": {
3725
  "version": "1.6.0",
3726
  "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
@@ -3884,6 +4208,31 @@
3884
  "node": ">= 6"
3885
  }
3886
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3887
  "node_modules/class-variance-authority": {
3888
  "version": "0.7.1",
3889
  "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz",
@@ -3902,35 +4251,113 @@
3902
  "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==",
3903
  "license": "MIT"
3904
  },
3905
- "node_modules/clsx": {
3906
- "version": "2.1.1",
3907
- "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
3908
- "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3909
  "license": "MIT",
3910
  "engines": {
3911
- "node": ">=6"
3912
  }
3913
  },
3914
- "node_modules/cmdk": {
3915
- "version": "0.2.1",
3916
- "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-0.2.1.tgz",
3917
- "integrity": "sha512-U6//9lQ6JvT47+6OF6Gi8BvkxYQ8SCRRSKIJkthIMsFsLZRG0cKvTtuTaefyIKMQb8rvvXy0wGdpTNq/jPtm+g==",
 
 
 
 
 
 
 
 
3918
  "license": "MIT",
3919
  "dependencies": {
3920
- "@radix-ui/react-dialog": "1.0.0"
 
 
3921
  },
3922
- "peerDependencies": {
3923
- "react": "^18.0.0",
3924
- "react-dom": "^18.0.0"
3925
  }
3926
  },
3927
- "node_modules/cmdk/node_modules/@radix-ui/primitive": {
3928
- "version": "1.0.0",
3929
- "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.0.tgz",
3930
- "integrity": "sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==",
 
3931
  "license": "MIT",
3932
  "dependencies": {
3933
- "@babel/runtime": "^7.13.10"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3934
  }
3935
  },
3936
  "node_modules/cmdk/node_modules/@radix-ui/react-compose-refs": {
@@ -4178,7 +4605,6 @@
4178
  "version": "2.0.1",
4179
  "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
4180
  "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
4181
- "dev": true,
4182
  "license": "MIT",
4183
  "dependencies": {
4184
  "color-name": "~1.1.4"
@@ -4191,7 +4617,6 @@
4191
  "version": "1.1.4",
4192
  "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
4193
  "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
4194
- "dev": true,
4195
  "license": "MIT"
4196
  },
4197
  "node_modules/commander": {
@@ -4204,6 +4629,22 @@
4204
  "node": ">= 6"
4205
  }
4206
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4207
  "node_modules/concat-map": {
4208
  "version": "0.0.1",
4209
  "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -4250,6 +4691,12 @@
4250
  "node": ">=6.6.0"
4251
  }
4252
  },
 
 
 
 
 
 
4253
  "node_modules/cors": {
4254
  "version": "2.8.5",
4255
  "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
@@ -4263,6 +4710,58 @@
4263
  "node": ">= 0.10"
4264
  }
4265
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4266
  "node_modules/cross-spawn": {
4267
  "version": "7.0.6",
4268
  "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
@@ -4302,6 +4801,16 @@
4302
  "dev": true,
4303
  "license": "BSD-2-Clause"
4304
  },
 
 
 
 
 
 
 
 
 
 
4305
  "node_modules/data-view-buffer": {
4306
  "version": "1.0.2",
4307
  "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz",
@@ -4426,6 +4935,21 @@
4426
  "url": "https://github.com/sponsors/ljharb"
4427
  }
4428
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4429
  "node_modules/depd": {
4430
  "version": "2.0.0",
4431
  "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
@@ -4451,6 +4975,13 @@
4451
  "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==",
4452
  "license": "MIT"
4453
  },
 
 
 
 
 
 
 
4454
  "node_modules/didyoumean": {
4455
  "version": "1.2.2",
4456
  "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
@@ -4496,7 +5027,6 @@
4496
  "version": "0.2.0",
4497
  "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
4498
  "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
4499
- "dev": true,
4500
  "license": "MIT"
4501
  },
4502
  "node_modules/ee-first": {
@@ -4544,7 +5074,6 @@
4544
  "version": "9.2.2",
4545
  "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
4546
  "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
4547
- "dev": true,
4548
  "license": "MIT"
4549
  },
4550
  "node_modules/encodeurl": {
@@ -4556,6 +5085,36 @@
4556
  "node": ">= 0.8"
4557
  }
4558
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4559
  "node_modules/es-abstract": {
4560
  "version": "1.24.0",
4561
  "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz",
@@ -4759,6 +5318,28 @@
4759
  "url": "https://github.com/sponsors/sindresorhus"
4760
  }
4761
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4762
  "node_modules/eslint": {
4763
  "version": "9.35.0",
4764
  "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.35.0.tgz",
@@ -5139,6 +5720,20 @@
5139
  "url": "https://opencollective.com/eslint"
5140
  }
5141
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5142
  "node_modules/esquery": {
5143
  "version": "1.6.0",
5144
  "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
@@ -5194,6 +5789,24 @@
5194
  "node": ">= 0.6"
5195
  }
5196
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5197
  "node_modules/eventsource": {
5198
  "version": "3.0.7",
5199
  "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz",
@@ -5272,12 +5885,39 @@
5272
  "express": ">= 4.11"
5273
  }
5274
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5275
  "node_modules/fast-deep-equal": {
5276
  "version": "3.1.3",
5277
  "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
5278
  "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
5279
  "license": "MIT"
5280
  },
 
 
 
 
 
 
5281
  "node_modules/fast-glob": {
5282
  "version": "3.3.1",
5283
  "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz",
@@ -5331,6 +5971,16 @@
5331
  "reusify": "^1.0.4"
5332
  }
5333
  },
 
 
 
 
 
 
 
 
 
 
5334
  "node_modules/fdir": {
5335
  "version": "6.5.0",
5336
  "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
@@ -5450,7 +6100,6 @@
5450
  "version": "3.3.1",
5451
  "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
5452
  "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
5453
- "dev": true,
5454
  "license": "ISC",
5455
  "dependencies": {
5456
  "cross-spawn": "^7.0.6",
@@ -5577,6 +6226,16 @@
5577
  "url": "https://github.com/sponsors/ljharb"
5578
  }
5579
  },
 
 
 
 
 
 
 
 
 
 
5580
  "node_modules/get-intrinsic": {
5581
  "version": "1.3.0",
5582
  "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
@@ -5623,6 +6282,22 @@
5623
  "node": ">= 0.4"
5624
  }
5625
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5626
  "node_modules/get-symbol-description": {
5627
  "version": "1.1.0",
5628
  "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz",
@@ -5654,11 +6329,25 @@
5654
  "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
5655
  }
5656
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5657
  "node_modules/glob": {
5658
  "version": "10.4.5",
5659
  "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
5660
  "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
5661
- "dev": true,
5662
  "license": "ISC",
5663
  "dependencies": {
5664
  "foreground-child": "^3.1.0",
@@ -5692,7 +6381,6 @@
5692
  "version": "2.0.2",
5693
  "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
5694
  "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
5695
- "dev": true,
5696
  "license": "MIT",
5697
  "dependencies": {
5698
  "balanced-match": "^1.0.0"
@@ -5702,7 +6390,6 @@
5702
  "version": "9.0.5",
5703
  "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
5704
  "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
5705
- "dev": true,
5706
  "license": "ISC",
5707
  "dependencies": {
5708
  "brace-expansion": "^2.0.1"
@@ -5765,6 +6452,12 @@
5765
  "url": "https://github.com/sponsors/ljharb"
5766
  }
5767
  },
 
 
 
 
 
 
5768
  "node_modules/graphemer": {
5769
  "version": "1.4.0",
5770
  "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
@@ -5889,42 +6582,90 @@
5889
  "node": ">= 0.8"
5890
  }
5891
  },
5892
- "node_modules/iconv-lite": {
5893
- "version": "0.6.3",
5894
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
5895
- "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
 
5896
  "license": "MIT",
5897
  "dependencies": {
5898
- "safer-buffer": ">= 2.1.2 < 3.0.0"
 
5899
  },
5900
  "engines": {
5901
- "node": ">=0.10.0"
5902
  }
5903
  },
5904
- "node_modules/ignore": {
5905
- "version": "5.3.2",
5906
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
5907
- "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
5908
  "dev": true,
5909
  "license": "MIT",
 
 
 
 
5910
  "engines": {
5911
- "node": ">= 4"
5912
  }
5913
  },
5914
- "node_modules/import-fresh": {
5915
- "version": "3.3.1",
5916
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
5917
- "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
5918
- "dev": true,
5919
  "license": "MIT",
5920
  "dependencies": {
5921
- "parent-module": "^1.0.0",
5922
- "resolve-from": "^4.0.0"
5923
  },
5924
  "engines": {
5925
- "node": ">=6"
5926
- },
5927
- "funding": {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5928
  "url": "https://github.com/sponsors/sindresorhus"
5929
  }
5930
  },
@@ -5969,6 +6710,16 @@
5969
  "node": ">= 0.4"
5970
  }
5971
  },
 
 
 
 
 
 
 
 
 
 
5972
  "node_modules/ipaddr.js": {
5973
  "version": "1.9.1",
5974
  "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
@@ -5996,6 +6747,13 @@
5996
  "url": "https://github.com/sponsors/ljharb"
5997
  }
5998
  },
 
 
 
 
 
 
 
5999
  "node_modules/is-async-function": {
6000
  "version": "2.1.1",
6001
  "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz",
@@ -6166,7 +6924,6 @@
6166
  "version": "3.0.0",
6167
  "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
6168
  "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
6169
- "dev": true,
6170
  "license": "MIT",
6171
  "engines": {
6172
  "node": ">=8"
@@ -6311,6 +7068,18 @@
6311
  "url": "https://github.com/sponsors/ljharb"
6312
  }
6313
  },
 
 
 
 
 
 
 
 
 
 
 
 
6314
  "node_modules/is-string": {
6315
  "version": "1.1.1",
6316
  "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz",
@@ -6443,7 +7212,6 @@
6443
  "version": "3.4.3",
6444
  "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
6445
  "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
6446
- "dev": true,
6447
  "license": "BlueOak-1.0.0",
6448
  "dependencies": {
6449
  "@isaacs/cliui": "^8.0.2"
@@ -6491,6 +7259,13 @@
6491
  "dev": true,
6492
  "license": "MIT"
6493
  },
 
 
 
 
 
 
 
6494
  "node_modules/json-schema-traverse": {
6495
  "version": "0.4.1",
6496
  "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
@@ -6563,6 +7338,54 @@
6563
  "node": ">=0.10"
6564
  }
6565
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6566
  "node_modules/levn": {
6567
  "version": "0.4.1",
6568
  "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
@@ -6613,6 +7436,12 @@
6613
  "url": "https://github.com/sponsors/sindresorhus"
6614
  }
6615
  },
 
 
 
 
 
 
6616
  "node_modules/lodash.castarray": {
6617
  "version": "4.4.0",
6618
  "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz",
@@ -6653,7 +7482,6 @@
6653
  "version": "10.4.3",
6654
  "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
6655
  "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
6656
- "dev": true,
6657
  "license": "ISC"
6658
  },
6659
  "node_modules/lucide-react": {
@@ -6792,12 +7620,18 @@
6792
  "version": "7.1.2",
6793
  "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
6794
  "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
6795
- "dev": true,
6796
  "license": "ISC",
6797
  "engines": {
6798
  "node": ">=16 || 14 >=14.17"
6799
  }
6800
  },
 
 
 
 
 
 
 
6801
  "node_modules/motion-dom": {
6802
  "version": "11.18.1",
6803
  "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-11.18.1.tgz",
@@ -6881,6 +7715,16 @@
6881
  "node": ">= 0.6"
6882
  }
6883
  },
 
 
 
 
 
 
 
 
 
 
6884
  "node_modules/next": {
6885
  "version": "15.3.5",
6886
  "resolved": "https://registry.npmjs.org/next/-/next-15.3.5.tgz",
@@ -6984,7 +7828,6 @@
6984
  "version": "3.0.0",
6985
  "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
6986
  "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
6987
- "dev": true,
6988
  "license": "MIT",
6989
  "engines": {
6990
  "node": ">=0.10.0"
@@ -7232,11 +8075,44 @@
7232
  "url": "https://github.com/sponsors/sindresorhus"
7233
  }
7234
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7235
  "node_modules/package-json-from-dist": {
7236
  "version": "1.0.1",
7237
  "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
7238
  "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
7239
- "dev": true,
7240
  "license": "BlueOak-1.0.0"
7241
  },
7242
  "node_modules/parent-module": {
@@ -7252,6 +8128,25 @@
7252
  "node": ">=6"
7253
  }
7254
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7255
  "node_modules/parseurl": {
7256
  "version": "1.3.3",
7257
  "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
@@ -7291,7 +8186,6 @@
7291
  "version": "1.11.1",
7292
  "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
7293
  "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
7294
- "dev": true,
7295
  "license": "BlueOak-1.0.0",
7296
  "dependencies": {
7297
  "lru-cache": "^10.2.0",
@@ -7314,6 +8208,13 @@
7314
  "url": "https://opencollective.com/express"
7315
  }
7316
  },
 
 
 
 
 
 
 
7317
  "node_modules/picocolors": {
7318
  "version": "1.1.1",
7319
  "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
@@ -7537,6 +8438,31 @@
7537
  "node": ">= 0.8.0"
7538
  }
7539
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7540
  "node_modules/prop-types": {
7541
  "version": "15.8.1",
7542
  "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
@@ -7562,6 +8488,54 @@
7562
  "node": ">= 0.10"
7563
  }
7564
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7565
  "node_modules/punycode": {
7566
  "version": "2.3.1",
7567
  "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
@@ -7571,6 +8545,44 @@
7571
  "node": ">=6"
7572
  }
7573
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7574
  "node_modules/qs": {
7575
  "version": "6.14.0",
7576
  "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
@@ -7830,6 +8842,52 @@
7830
  "pify": "^2.3.0"
7831
  }
7832
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7833
  "node_modules/readdirp": {
7834
  "version": "3.6.0",
7835
  "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
@@ -7900,6 +8958,16 @@
7900
  "url": "https://github.com/sponsors/ljharb"
7901
  }
7902
  },
 
 
 
 
 
 
 
 
 
 
7903
  "node_modules/resolve": {
7904
  "version": "1.22.10",
7905
  "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
@@ -8333,7 +9401,6 @@
8333
  "version": "4.1.0",
8334
  "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
8335
  "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
8336
- "dev": true,
8337
  "license": "ISC",
8338
  "engines": {
8339
  "node": ">=14"
@@ -8342,6 +9409,47 @@
8342
  "url": "https://github.com/sponsors/isaacs"
8343
  }
8344
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8345
  "node_modules/sonner": {
8346
  "version": "1.7.4",
8347
  "resolved": "https://registry.npmjs.org/sonner/-/sonner-1.7.4.tgz",
@@ -8352,6 +9460,17 @@
8352
  "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc"
8353
  }
8354
  },
 
 
 
 
 
 
 
 
 
 
 
8355
  "node_modules/source-map-js": {
8356
  "version": "1.2.1",
8357
  "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
@@ -8399,11 +9518,32 @@
8399
  "node": ">=10.0.0"
8400
  }
8401
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8402
  "node_modules/string-width": {
8403
  "version": "5.1.2",
8404
  "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
8405
  "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
8406
- "dev": true,
8407
  "license": "MIT",
8408
  "dependencies": {
8409
  "eastasianwidth": "^0.2.0",
@@ -8422,7 +9562,6 @@
8422
  "version": "4.2.3",
8423
  "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
8424
  "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
8425
- "dev": true,
8426
  "license": "MIT",
8427
  "dependencies": {
8428
  "emoji-regex": "^8.0.0",
@@ -8437,7 +9576,6 @@
8437
  "version": "5.0.1",
8438
  "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
8439
  "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
8440
- "dev": true,
8441
  "license": "MIT",
8442
  "engines": {
8443
  "node": ">=8"
@@ -8447,14 +9585,12 @@
8447
  "version": "8.0.0",
8448
  "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
8449
  "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
8450
- "dev": true,
8451
  "license": "MIT"
8452
  },
8453
  "node_modules/string-width-cjs/node_modules/strip-ansi": {
8454
  "version": "6.0.1",
8455
  "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
8456
  "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
8457
- "dev": true,
8458
  "license": "MIT",
8459
  "dependencies": {
8460
  "ansi-regex": "^5.0.1"
@@ -8580,7 +9716,6 @@
8580
  "version": "7.1.2",
8581
  "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz",
8582
  "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==",
8583
- "dev": true,
8584
  "license": "MIT",
8585
  "dependencies": {
8586
  "ansi-regex": "^6.0.1"
@@ -8597,7 +9732,6 @@
8597
  "version": "6.0.1",
8598
  "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
8599
  "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
8600
- "dev": true,
8601
  "license": "MIT",
8602
  "dependencies": {
8603
  "ansi-regex": "^5.0.1"
@@ -8610,7 +9744,6 @@
8610
  "version": "5.0.1",
8611
  "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
8612
  "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
8613
- "dev": true,
8614
  "license": "MIT",
8615
  "engines": {
8616
  "node": ">=8"
@@ -8804,6 +9937,41 @@
8804
  "node": ">= 6"
8805
  }
8806
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8807
  "node_modules/thenify": {
8808
  "version": "3.3.1",
8809
  "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
@@ -8833,6 +10001,13 @@
8833
  "integrity": "sha512-oB7yIimd8SuGptespDAZnNkzIz+NWaJCu2RMsbs4Wmp9zSDUM8Nhi3s2OOcqYuv3mN4hitXc8DVx+LyUmbUDiA==",
8834
  "license": "ISC"
8835
  },
 
 
 
 
 
 
 
8836
  "node_modules/thumbhash": {
8837
  "version": "0.1.1",
8838
  "resolved": "https://registry.npmjs.org/thumbhash/-/thumbhash-0.1.1.tgz",
@@ -9055,11 +10230,46 @@
9055
  "url": "https://github.com/sponsors/ljharb"
9056
  }
9057
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9058
  "node_modules/undici-types": {
9059
  "version": "6.21.0",
9060
  "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
9061
  "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
9062
- "dev": true,
9063
  "license": "MIT"
9064
  },
9065
  "node_modules/unpipe": {
@@ -9146,6 +10356,13 @@
9146
  "punycode": "^2.1.0"
9147
  }
9148
  },
 
 
 
 
 
 
 
9149
  "node_modules/use-callback-ref": {
9150
  "version": "1.3.3",
9151
  "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz",
@@ -9346,7 +10563,6 @@
9346
  "version": "8.1.0",
9347
  "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
9348
  "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
9349
- "dev": true,
9350
  "license": "MIT",
9351
  "dependencies": {
9352
  "ansi-styles": "^6.1.0",
@@ -9365,7 +10581,6 @@
9365
  "version": "7.0.0",
9366
  "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
9367
  "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
9368
- "dev": true,
9369
  "license": "MIT",
9370
  "dependencies": {
9371
  "ansi-styles": "^4.0.0",
@@ -9383,7 +10598,6 @@
9383
  "version": "5.0.1",
9384
  "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
9385
  "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
9386
- "dev": true,
9387
  "license": "MIT",
9388
  "engines": {
9389
  "node": ">=8"
@@ -9393,14 +10607,12 @@
9393
  "version": "8.0.0",
9394
  "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
9395
  "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
9396
- "dev": true,
9397
  "license": "MIT"
9398
  },
9399
  "node_modules/wrap-ansi-cjs/node_modules/string-width": {
9400
  "version": "4.2.3",
9401
  "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
9402
  "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
9403
- "dev": true,
9404
  "license": "MIT",
9405
  "dependencies": {
9406
  "emoji-regex": "^8.0.0",
@@ -9415,7 +10627,6 @@
9415
  "version": "6.0.1",
9416
  "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
9417
  "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
9418
- "dev": true,
9419
  "license": "MIT",
9420
  "dependencies": {
9421
  "ansi-regex": "^5.0.1"
@@ -9428,7 +10639,6 @@
9428
  "version": "6.2.3",
9429
  "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
9430
  "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
9431
- "dev": true,
9432
  "license": "MIT",
9433
  "engines": {
9434
  "node": ">=12"
@@ -9443,6 +10653,38 @@
9443
  "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
9444
  "license": "ISC"
9445
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9446
  "node_modules/yaml": {
9447
  "version": "2.8.1",
9448
  "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz",
@@ -9456,6 +10698,101 @@
9456
  "node": ">= 14.6"
9457
  }
9458
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9459
  "node_modules/yocto-queue": {
9460
  "version": "0.1.0",
9461
  "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
@@ -9469,6 +10806,20 @@
9469
  "url": "https://github.com/sponsors/sindresorhus"
9470
  }
9471
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9472
  "node_modules/zod": {
9473
  "version": "3.25.76",
9474
  "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
 
29
  "@radix-ui/react-toast": "^1.2.0",
30
  "@radix-ui/react-toggle": "^1.1.0",
31
  "@radix-ui/react-tooltip": "^1.1.0",
32
+ "@types/archiver": "^6.0.3",
33
+ "archiver": "^7.0.1",
34
  "class-variance-authority": "^0.7.1",
35
  "clsx": "^2.1.1",
36
  "date-fns": "^4.1.0",
 
55
  "eslint": "^9",
56
  "eslint-config-next": "15.3.5",
57
  "postcss": "^8.5.6",
58
+ "puppeteer": "^22.0.0",
59
  "tailwindcss": "^3.4.17",
60
  "typescript": "^5"
61
  }
 
73
  "url": "https://github.com/sponsors/sindresorhus"
74
  }
75
  },
76
+ "node_modules/@babel/code-frame": {
77
+ "version": "7.27.1",
78
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
79
+ "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==",
80
+ "dev": true,
81
+ "license": "MIT",
82
+ "dependencies": {
83
+ "@babel/helper-validator-identifier": "^7.27.1",
84
+ "js-tokens": "^4.0.0",
85
+ "picocolors": "^1.1.1"
86
+ },
87
+ "engines": {
88
+ "node": ">=6.9.0"
89
+ }
90
+ },
91
+ "node_modules/@babel/helper-validator-identifier": {
92
+ "version": "7.27.1",
93
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
94
+ "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==",
95
+ "dev": true,
96
+ "license": "MIT",
97
+ "engines": {
98
+ "node": ">=6.9.0"
99
+ }
100
+ },
101
  "node_modules/@babel/runtime": {
102
  "version": "7.28.4",
103
  "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz",
 
908
  "version": "8.0.2",
909
  "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
910
  "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
 
911
  "license": "ISC",
912
  "dependencies": {
913
  "string-width": "^5.1.2",
 
1205
  "version": "0.11.0",
1206
  "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
1207
  "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
 
1208
  "license": "MIT",
1209
  "optional": true,
1210
  "engines": {
1211
  "node": ">=14"
1212
  }
1213
  },
1214
+ "node_modules/@puppeteer/browsers": {
1215
+ "version": "2.3.0",
1216
+ "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.3.0.tgz",
1217
+ "integrity": "sha512-ioXoq9gPxkss4MYhD+SFaU9p1IHFUX0ILAWFPyjGaBdjLsYAlZw6j1iLA0N/m12uVHLFDfSYNF7EQccjinIMDA==",
1218
+ "dev": true,
1219
+ "license": "Apache-2.0",
1220
+ "dependencies": {
1221
+ "debug": "^4.3.5",
1222
+ "extract-zip": "^2.0.1",
1223
+ "progress": "^2.0.3",
1224
+ "proxy-agent": "^6.4.0",
1225
+ "semver": "^7.6.3",
1226
+ "tar-fs": "^3.0.6",
1227
+ "unbzip2-stream": "^1.4.3",
1228
+ "yargs": "^17.7.2"
1229
+ },
1230
+ "bin": {
1231
+ "browsers": "lib/cjs/main-cli.js"
1232
+ },
1233
+ "engines": {
1234
+ "node": ">=18"
1235
+ }
1236
+ },
1237
  "node_modules/@radix-ui/number": {
1238
  "version": "1.1.1",
1239
  "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz",
 
2603
  "tailwindcss": ">=3.2.0"
2604
  }
2605
  },
2606
+ "node_modules/@tootallnate/quickjs-emscripten": {
2607
+ "version": "0.23.0",
2608
+ "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz",
2609
+ "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==",
2610
+ "dev": true,
2611
+ "license": "MIT"
2612
+ },
2613
  "node_modules/@tybys/wasm-util": {
2614
  "version": "0.10.1",
2615
  "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz",
 
2621
  "tslib": "^2.4.0"
2622
  }
2623
  },
2624
+ "node_modules/@types/archiver": {
2625
+ "version": "6.0.3",
2626
+ "resolved": "https://registry.npmjs.org/@types/archiver/-/archiver-6.0.3.tgz",
2627
+ "integrity": "sha512-a6wUll6k3zX6qs5KlxIggs1P1JcYJaTCx2gnlr+f0S1yd2DoaEwoIK10HmBaLnZwWneBz+JBm0dwcZu0zECBcQ==",
2628
+ "license": "MIT",
2629
+ "dependencies": {
2630
+ "@types/readdir-glob": "*"
2631
+ }
2632
+ },
2633
  "node_modules/@types/estree": {
2634
  "version": "1.0.8",
2635
  "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
 
2679
  "version": "20.19.17",
2680
  "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.17.tgz",
2681
  "integrity": "sha512-gfehUI8N1z92kygssiuWvLiwcbOB3IRktR6hTDgJlXMYh5OvkPSRmgfoBUmfZt+vhwJtX7v1Yw4KvvAf7c5QKQ==",
 
2682
  "license": "MIT",
2683
  "dependencies": {
2684
  "undici-types": "~6.21.0"
 
2712
  "@types/react": "^18.0.0"
2713
  }
2714
  },
2715
+ "node_modules/@types/readdir-glob": {
2716
+ "version": "1.1.5",
2717
+ "resolved": "https://registry.npmjs.org/@types/readdir-glob/-/readdir-glob-1.1.5.tgz",
2718
+ "integrity": "sha512-raiuEPUYqXu+nvtY2Pe8s8FEmZ3x5yAH4VkLdihcPdalvsHltomrRC9BzuStrJ9yk06470hS0Crw0f1pXqD+Hg==",
2719
+ "license": "MIT",
2720
+ "dependencies": {
2721
+ "@types/node": "*"
2722
+ }
2723
+ },
2724
+ "node_modules/@types/yauzl": {
2725
+ "version": "2.10.3",
2726
+ "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz",
2727
+ "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==",
2728
+ "dev": true,
2729
+ "license": "MIT",
2730
+ "optional": true,
2731
+ "dependencies": {
2732
+ "@types/node": "*"
2733
+ }
2734
+ },
2735
  "node_modules/@typescript-eslint/eslint-plugin": {
2736
  "version": "8.44.0",
2737
  "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.44.0.tgz",
 
3289
  "win32"
3290
  ]
3291
  },
3292
+ "node_modules/abort-controller": {
3293
+ "version": "3.0.0",
3294
+ "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
3295
+ "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
3296
+ "license": "MIT",
3297
+ "dependencies": {
3298
+ "event-target-shim": "^5.0.0"
3299
+ },
3300
+ "engines": {
3301
+ "node": ">=6.5"
3302
+ }
3303
+ },
3304
  "node_modules/accepts": {
3305
  "version": "2.0.0",
3306
  "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
 
3337
  "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
3338
  }
3339
  },
3340
+ "node_modules/agent-base": {
3341
+ "version": "7.1.4",
3342
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
3343
+ "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
3344
+ "dev": true,
3345
+ "license": "MIT",
3346
+ "engines": {
3347
+ "node": ">= 14"
3348
+ }
3349
+ },
3350
  "node_modules/ajv": {
3351
  "version": "6.12.6",
3352
  "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
 
3367
  "version": "6.2.2",
3368
  "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
3369
  "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
 
3370
  "license": "MIT",
3371
  "engines": {
3372
  "node": ">=12"
 
3379
  "version": "4.3.0",
3380
  "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
3381
  "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
 
3382
  "license": "MIT",
3383
  "dependencies": {
3384
  "color-convert": "^2.0.1"
 
3424
  "url": "https://github.com/sponsors/jonschlinkert"
3425
  }
3426
  },
3427
+ "node_modules/archiver": {
3428
+ "version": "7.0.1",
3429
+ "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz",
3430
+ "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==",
3431
+ "license": "MIT",
3432
+ "dependencies": {
3433
+ "archiver-utils": "^5.0.2",
3434
+ "async": "^3.2.4",
3435
+ "buffer-crc32": "^1.0.0",
3436
+ "readable-stream": "^4.0.0",
3437
+ "readdir-glob": "^1.1.2",
3438
+ "tar-stream": "^3.0.0",
3439
+ "zip-stream": "^6.0.1"
3440
+ },
3441
+ "engines": {
3442
+ "node": ">= 14"
3443
+ }
3444
+ },
3445
+ "node_modules/archiver-utils": {
3446
+ "version": "5.0.2",
3447
+ "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz",
3448
+ "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==",
3449
+ "license": "MIT",
3450
+ "dependencies": {
3451
+ "glob": "^10.0.0",
3452
+ "graceful-fs": "^4.2.0",
3453
+ "is-stream": "^2.0.1",
3454
+ "lazystream": "^1.0.0",
3455
+ "lodash": "^4.17.15",
3456
+ "normalize-path": "^3.0.0",
3457
+ "readable-stream": "^4.0.0"
3458
+ },
3459
+ "engines": {
3460
+ "node": ">= 14"
3461
+ }
3462
+ },
3463
  "node_modules/arg": {
3464
  "version": "5.0.2",
3465
  "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
 
3656
  "url": "https://github.com/sponsors/ljharb"
3657
  }
3658
  },
3659
+ "node_modules/ast-types": {
3660
+ "version": "0.13.4",
3661
+ "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz",
3662
+ "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==",
3663
+ "dev": true,
3664
+ "license": "MIT",
3665
+ "dependencies": {
3666
+ "tslib": "^2.0.1"
3667
+ },
3668
+ "engines": {
3669
+ "node": ">=4"
3670
+ }
3671
+ },
3672
  "node_modules/ast-types-flow": {
3673
  "version": "0.0.8",
3674
  "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz",
 
3676
  "dev": true,
3677
  "license": "MIT"
3678
  },
3679
+ "node_modules/async": {
3680
+ "version": "3.2.6",
3681
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
3682
+ "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
3683
+ "license": "MIT"
3684
+ },
3685
  "node_modules/async-function": {
3686
  "version": "1.0.0",
3687
  "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz",
 
3766
  "node": ">= 0.4"
3767
  }
3768
  },
3769
+ "node_modules/b4a": {
3770
+ "version": "1.7.1",
3771
+ "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.1.tgz",
3772
+ "integrity": "sha512-ZovbrBV0g6JxK5cGUF1Suby1vLfKjv4RWi8IxoaO/Mon8BDD9I21RxjHFtgQ+kskJqLAVyQZly3uMBui+vhc8Q==",
3773
+ "license": "Apache-2.0",
3774
+ "peerDependencies": {
3775
+ "react-native-b4a": "*"
3776
+ },
3777
+ "peerDependenciesMeta": {
3778
+ "react-native-b4a": {
3779
+ "optional": true
3780
+ }
3781
+ }
3782
+ },
3783
  "node_modules/balanced-match": {
3784
  "version": "1.0.2",
3785
  "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
3786
  "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
3787
+ "license": "MIT"
3788
+ },
3789
+ "node_modules/bare-events": {
3790
+ "version": "2.7.0",
3791
+ "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.7.0.tgz",
3792
+ "integrity": "sha512-b3N5eTW1g7vXkw+0CXh/HazGTcO5KYuu/RCNaJbDMPI6LHDi+7qe8EmxKUVe1sUbY2KZOVZFyj62x0OEz9qyAA==",
3793
+ "license": "Apache-2.0",
3794
+ "optional": true
3795
+ },
3796
+ "node_modules/bare-fs": {
3797
+ "version": "4.4.4",
3798
+ "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.4.4.tgz",
3799
+ "integrity": "sha512-Q8yxM1eLhJfuM7KXVP3zjhBvtMJCYRByoTT+wHXjpdMELv0xICFJX+1w4c7csa+WZEOsq4ItJ4RGwvzid6m/dw==",
3800
+ "dev": true,
3801
+ "license": "Apache-2.0",
3802
+ "optional": true,
3803
+ "dependencies": {
3804
+ "bare-events": "^2.5.4",
3805
+ "bare-path": "^3.0.0",
3806
+ "bare-stream": "^2.6.4",
3807
+ "bare-url": "^2.2.2",
3808
+ "fast-fifo": "^1.3.2"
3809
+ },
3810
+ "engines": {
3811
+ "bare": ">=1.16.0"
3812
+ },
3813
+ "peerDependencies": {
3814
+ "bare-buffer": "*"
3815
+ },
3816
+ "peerDependenciesMeta": {
3817
+ "bare-buffer": {
3818
+ "optional": true
3819
+ }
3820
+ }
3821
+ },
3822
+ "node_modules/bare-os": {
3823
+ "version": "3.6.2",
3824
+ "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.2.tgz",
3825
+ "integrity": "sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==",
3826
+ "dev": true,
3827
+ "license": "Apache-2.0",
3828
+ "optional": true,
3829
+ "engines": {
3830
+ "bare": ">=1.14.0"
3831
+ }
3832
+ },
3833
+ "node_modules/bare-path": {
3834
+ "version": "3.0.0",
3835
+ "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz",
3836
+ "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==",
3837
+ "dev": true,
3838
+ "license": "Apache-2.0",
3839
+ "optional": true,
3840
+ "dependencies": {
3841
+ "bare-os": "^3.0.1"
3842
+ }
3843
+ },
3844
+ "node_modules/bare-stream": {
3845
+ "version": "2.7.0",
3846
+ "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.7.0.tgz",
3847
+ "integrity": "sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==",
3848
+ "dev": true,
3849
+ "license": "Apache-2.0",
3850
+ "optional": true,
3851
+ "dependencies": {
3852
+ "streamx": "^2.21.0"
3853
+ },
3854
+ "peerDependencies": {
3855
+ "bare-buffer": "*",
3856
+ "bare-events": "*"
3857
+ },
3858
+ "peerDependenciesMeta": {
3859
+ "bare-buffer": {
3860
+ "optional": true
3861
+ },
3862
+ "bare-events": {
3863
+ "optional": true
3864
+ }
3865
+ }
3866
+ },
3867
+ "node_modules/bare-url": {
3868
+ "version": "2.2.2",
3869
+ "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.2.2.tgz",
3870
+ "integrity": "sha512-g+ueNGKkrjMazDG3elZO1pNs3HY5+mMmOet1jtKyhOaCnkLzitxf26z7hoAEkDNgdNmnc1KIlt/dw6Po6xZMpA==",
3871
  "dev": true,
3872
+ "license": "Apache-2.0",
3873
+ "optional": true,
3874
+ "dependencies": {
3875
+ "bare-path": "^3.0.0"
3876
+ }
3877
+ },
3878
+ "node_modules/base64-js": {
3879
+ "version": "1.5.1",
3880
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
3881
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
3882
+ "funding": [
3883
+ {
3884
+ "type": "github",
3885
+ "url": "https://github.com/sponsors/feross"
3886
+ },
3887
+ {
3888
+ "type": "patreon",
3889
+ "url": "https://www.patreon.com/feross"
3890
+ },
3891
+ {
3892
+ "type": "consulting",
3893
+ "url": "https://feross.org/support"
3894
+ }
3895
+ ],
3896
  "license": "MIT"
3897
  },
3898
  "node_modules/baseline-browser-mapping": {
 
3905
  "baseline-browser-mapping": "dist/cli.js"
3906
  }
3907
  },
3908
+ "node_modules/basic-ftp": {
3909
+ "version": "5.0.5",
3910
+ "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz",
3911
+ "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==",
3912
+ "dev": true,
3913
+ "license": "MIT",
3914
+ "engines": {
3915
+ "node": ">=10.0.0"
3916
+ }
3917
+ },
3918
  "node_modules/binary-extensions": {
3919
  "version": "2.3.0",
3920
  "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
 
4012
  "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
4013
  }
4014
  },
4015
+ "node_modules/buffer": {
4016
+ "version": "6.0.3",
4017
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
4018
+ "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
4019
+ "funding": [
4020
+ {
4021
+ "type": "github",
4022
+ "url": "https://github.com/sponsors/feross"
4023
+ },
4024
+ {
4025
+ "type": "patreon",
4026
+ "url": "https://www.patreon.com/feross"
4027
+ },
4028
+ {
4029
+ "type": "consulting",
4030
+ "url": "https://feross.org/support"
4031
+ }
4032
+ ],
4033
+ "license": "MIT",
4034
+ "dependencies": {
4035
+ "base64-js": "^1.3.1",
4036
+ "ieee754": "^1.2.1"
4037
+ }
4038
+ },
4039
+ "node_modules/buffer-crc32": {
4040
+ "version": "1.0.0",
4041
+ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz",
4042
+ "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==",
4043
+ "license": "MIT",
4044
+ "engines": {
4045
+ "node": ">=8.0.0"
4046
+ }
4047
+ },
4048
  "node_modules/busboy": {
4049
  "version": "1.6.0",
4050
  "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
 
4208
  "node": ">= 6"
4209
  }
4210
  },
4211
+ "node_modules/chromium-bidi": {
4212
+ "version": "0.6.3",
4213
+ "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.6.3.tgz",
4214
+ "integrity": "sha512-qXlsCmpCZJAnoTYI83Iu6EdYQpMYdVkCfq08KDh2pmlVqK5t5IA9mGs4/LwCwp4fqisSOMXZxP3HIh8w8aRn0A==",
4215
+ "dev": true,
4216
+ "license": "Apache-2.0",
4217
+ "dependencies": {
4218
+ "mitt": "3.0.1",
4219
+ "urlpattern-polyfill": "10.0.0",
4220
+ "zod": "3.23.8"
4221
+ },
4222
+ "peerDependencies": {
4223
+ "devtools-protocol": "*"
4224
+ }
4225
+ },
4226
+ "node_modules/chromium-bidi/node_modules/zod": {
4227
+ "version": "3.23.8",
4228
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz",
4229
+ "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==",
4230
+ "dev": true,
4231
+ "license": "MIT",
4232
+ "funding": {
4233
+ "url": "https://github.com/sponsors/colinhacks"
4234
+ }
4235
+ },
4236
  "node_modules/class-variance-authority": {
4237
  "version": "0.7.1",
4238
  "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz",
 
4251
  "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==",
4252
  "license": "MIT"
4253
  },
4254
+ "node_modules/cliui": {
4255
+ "version": "8.0.1",
4256
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
4257
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
4258
+ "dev": true,
4259
+ "license": "ISC",
4260
+ "dependencies": {
4261
+ "string-width": "^4.2.0",
4262
+ "strip-ansi": "^6.0.1",
4263
+ "wrap-ansi": "^7.0.0"
4264
+ },
4265
+ "engines": {
4266
+ "node": ">=12"
4267
+ }
4268
+ },
4269
+ "node_modules/cliui/node_modules/ansi-regex": {
4270
+ "version": "5.0.1",
4271
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
4272
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
4273
+ "dev": true,
4274
  "license": "MIT",
4275
  "engines": {
4276
+ "node": ">=8"
4277
  }
4278
  },
4279
+ "node_modules/cliui/node_modules/emoji-regex": {
4280
+ "version": "8.0.0",
4281
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
4282
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
4283
+ "dev": true,
4284
+ "license": "MIT"
4285
+ },
4286
+ "node_modules/cliui/node_modules/string-width": {
4287
+ "version": "4.2.3",
4288
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
4289
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
4290
+ "dev": true,
4291
  "license": "MIT",
4292
  "dependencies": {
4293
+ "emoji-regex": "^8.0.0",
4294
+ "is-fullwidth-code-point": "^3.0.0",
4295
+ "strip-ansi": "^6.0.1"
4296
  },
4297
+ "engines": {
4298
+ "node": ">=8"
 
4299
  }
4300
  },
4301
+ "node_modules/cliui/node_modules/strip-ansi": {
4302
+ "version": "6.0.1",
4303
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
4304
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
4305
+ "dev": true,
4306
  "license": "MIT",
4307
  "dependencies": {
4308
+ "ansi-regex": "^5.0.1"
4309
+ },
4310
+ "engines": {
4311
+ "node": ">=8"
4312
+ }
4313
+ },
4314
+ "node_modules/cliui/node_modules/wrap-ansi": {
4315
+ "version": "7.0.0",
4316
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
4317
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
4318
+ "dev": true,
4319
+ "license": "MIT",
4320
+ "dependencies": {
4321
+ "ansi-styles": "^4.0.0",
4322
+ "string-width": "^4.1.0",
4323
+ "strip-ansi": "^6.0.0"
4324
+ },
4325
+ "engines": {
4326
+ "node": ">=10"
4327
+ },
4328
+ "funding": {
4329
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
4330
+ }
4331
+ },
4332
+ "node_modules/clsx": {
4333
+ "version": "2.1.1",
4334
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
4335
+ "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
4336
+ "license": "MIT",
4337
+ "engines": {
4338
+ "node": ">=6"
4339
+ }
4340
+ },
4341
+ "node_modules/cmdk": {
4342
+ "version": "0.2.1",
4343
+ "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-0.2.1.tgz",
4344
+ "integrity": "sha512-U6//9lQ6JvT47+6OF6Gi8BvkxYQ8SCRRSKIJkthIMsFsLZRG0cKvTtuTaefyIKMQb8rvvXy0wGdpTNq/jPtm+g==",
4345
+ "license": "MIT",
4346
+ "dependencies": {
4347
+ "@radix-ui/react-dialog": "1.0.0"
4348
+ },
4349
+ "peerDependencies": {
4350
+ "react": "^18.0.0",
4351
+ "react-dom": "^18.0.0"
4352
+ }
4353
+ },
4354
+ "node_modules/cmdk/node_modules/@radix-ui/primitive": {
4355
+ "version": "1.0.0",
4356
+ "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.0.tgz",
4357
+ "integrity": "sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==",
4358
+ "license": "MIT",
4359
+ "dependencies": {
4360
+ "@babel/runtime": "^7.13.10"
4361
  }
4362
  },
4363
  "node_modules/cmdk/node_modules/@radix-ui/react-compose-refs": {
 
4605
  "version": "2.0.1",
4606
  "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
4607
  "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
 
4608
  "license": "MIT",
4609
  "dependencies": {
4610
  "color-name": "~1.1.4"
 
4617
  "version": "1.1.4",
4618
  "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
4619
  "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
 
4620
  "license": "MIT"
4621
  },
4622
  "node_modules/commander": {
 
4629
  "node": ">= 6"
4630
  }
4631
  },
4632
+ "node_modules/compress-commons": {
4633
+ "version": "6.0.2",
4634
+ "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz",
4635
+ "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==",
4636
+ "license": "MIT",
4637
+ "dependencies": {
4638
+ "crc-32": "^1.2.0",
4639
+ "crc32-stream": "^6.0.0",
4640
+ "is-stream": "^2.0.1",
4641
+ "normalize-path": "^3.0.0",
4642
+ "readable-stream": "^4.0.0"
4643
+ },
4644
+ "engines": {
4645
+ "node": ">= 14"
4646
+ }
4647
+ },
4648
  "node_modules/concat-map": {
4649
  "version": "0.0.1",
4650
  "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
 
4691
  "node": ">=6.6.0"
4692
  }
4693
  },
4694
+ "node_modules/core-util-is": {
4695
+ "version": "1.0.3",
4696
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
4697
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
4698
+ "license": "MIT"
4699
+ },
4700
  "node_modules/cors": {
4701
  "version": "2.8.5",
4702
  "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
 
4710
  "node": ">= 0.10"
4711
  }
4712
  },
4713
+ "node_modules/cosmiconfig": {
4714
+ "version": "9.0.0",
4715
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz",
4716
+ "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==",
4717
+ "dev": true,
4718
+ "license": "MIT",
4719
+ "dependencies": {
4720
+ "env-paths": "^2.2.1",
4721
+ "import-fresh": "^3.3.0",
4722
+ "js-yaml": "^4.1.0",
4723
+ "parse-json": "^5.2.0"
4724
+ },
4725
+ "engines": {
4726
+ "node": ">=14"
4727
+ },
4728
+ "funding": {
4729
+ "url": "https://github.com/sponsors/d-fischer"
4730
+ },
4731
+ "peerDependencies": {
4732
+ "typescript": ">=4.9.5"
4733
+ },
4734
+ "peerDependenciesMeta": {
4735
+ "typescript": {
4736
+ "optional": true
4737
+ }
4738
+ }
4739
+ },
4740
+ "node_modules/crc-32": {
4741
+ "version": "1.2.2",
4742
+ "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz",
4743
+ "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==",
4744
+ "license": "Apache-2.0",
4745
+ "bin": {
4746
+ "crc32": "bin/crc32.njs"
4747
+ },
4748
+ "engines": {
4749
+ "node": ">=0.8"
4750
+ }
4751
+ },
4752
+ "node_modules/crc32-stream": {
4753
+ "version": "6.0.0",
4754
+ "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz",
4755
+ "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==",
4756
+ "license": "MIT",
4757
+ "dependencies": {
4758
+ "crc-32": "^1.2.0",
4759
+ "readable-stream": "^4.0.0"
4760
+ },
4761
+ "engines": {
4762
+ "node": ">= 14"
4763
+ }
4764
+ },
4765
  "node_modules/cross-spawn": {
4766
  "version": "7.0.6",
4767
  "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
 
4801
  "dev": true,
4802
  "license": "BSD-2-Clause"
4803
  },
4804
+ "node_modules/data-uri-to-buffer": {
4805
+ "version": "6.0.2",
4806
+ "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz",
4807
+ "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==",
4808
+ "dev": true,
4809
+ "license": "MIT",
4810
+ "engines": {
4811
+ "node": ">= 14"
4812
+ }
4813
+ },
4814
  "node_modules/data-view-buffer": {
4815
  "version": "1.0.2",
4816
  "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz",
 
4935
  "url": "https://github.com/sponsors/ljharb"
4936
  }
4937
  },
4938
+ "node_modules/degenerator": {
4939
+ "version": "5.0.1",
4940
+ "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz",
4941
+ "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==",
4942
+ "dev": true,
4943
+ "license": "MIT",
4944
+ "dependencies": {
4945
+ "ast-types": "^0.13.4",
4946
+ "escodegen": "^2.1.0",
4947
+ "esprima": "^4.0.1"
4948
+ },
4949
+ "engines": {
4950
+ "node": ">= 14"
4951
+ }
4952
+ },
4953
  "node_modules/depd": {
4954
  "version": "2.0.0",
4955
  "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
 
4975
  "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==",
4976
  "license": "MIT"
4977
  },
4978
+ "node_modules/devtools-protocol": {
4979
+ "version": "0.0.1312386",
4980
+ "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1312386.tgz",
4981
+ "integrity": "sha512-DPnhUXvmvKT2dFA/j7B+riVLUt9Q6RKJlcppojL5CoRywJJKLDYnRlw0gTFKfgDPHP5E04UoB71SxoJlVZy8FA==",
4982
+ "dev": true,
4983
+ "license": "BSD-3-Clause"
4984
+ },
4985
  "node_modules/didyoumean": {
4986
  "version": "1.2.2",
4987
  "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
 
5027
  "version": "0.2.0",
5028
  "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
5029
  "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
 
5030
  "license": "MIT"
5031
  },
5032
  "node_modules/ee-first": {
 
5074
  "version": "9.2.2",
5075
  "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
5076
  "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
 
5077
  "license": "MIT"
5078
  },
5079
  "node_modules/encodeurl": {
 
5085
  "node": ">= 0.8"
5086
  }
5087
  },
5088
+ "node_modules/end-of-stream": {
5089
+ "version": "1.4.5",
5090
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz",
5091
+ "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==",
5092
+ "dev": true,
5093
+ "license": "MIT",
5094
+ "dependencies": {
5095
+ "once": "^1.4.0"
5096
+ }
5097
+ },
5098
+ "node_modules/env-paths": {
5099
+ "version": "2.2.1",
5100
+ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
5101
+ "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
5102
+ "dev": true,
5103
+ "license": "MIT",
5104
+ "engines": {
5105
+ "node": ">=6"
5106
+ }
5107
+ },
5108
+ "node_modules/error-ex": {
5109
+ "version": "1.3.4",
5110
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz",
5111
+ "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==",
5112
+ "dev": true,
5113
+ "license": "MIT",
5114
+ "dependencies": {
5115
+ "is-arrayish": "^0.2.1"
5116
+ }
5117
+ },
5118
  "node_modules/es-abstract": {
5119
  "version": "1.24.0",
5120
  "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz",
 
5318
  "url": "https://github.com/sponsors/sindresorhus"
5319
  }
5320
  },
5321
+ "node_modules/escodegen": {
5322
+ "version": "2.1.0",
5323
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz",
5324
+ "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==",
5325
+ "dev": true,
5326
+ "license": "BSD-2-Clause",
5327
+ "dependencies": {
5328
+ "esprima": "^4.0.1",
5329
+ "estraverse": "^5.2.0",
5330
+ "esutils": "^2.0.2"
5331
+ },
5332
+ "bin": {
5333
+ "escodegen": "bin/escodegen.js",
5334
+ "esgenerate": "bin/esgenerate.js"
5335
+ },
5336
+ "engines": {
5337
+ "node": ">=6.0"
5338
+ },
5339
+ "optionalDependencies": {
5340
+ "source-map": "~0.6.1"
5341
+ }
5342
+ },
5343
  "node_modules/eslint": {
5344
  "version": "9.35.0",
5345
  "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.35.0.tgz",
 
5720
  "url": "https://opencollective.com/eslint"
5721
  }
5722
  },
5723
+ "node_modules/esprima": {
5724
+ "version": "4.0.1",
5725
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
5726
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
5727
+ "dev": true,
5728
+ "license": "BSD-2-Clause",
5729
+ "bin": {
5730
+ "esparse": "bin/esparse.js",
5731
+ "esvalidate": "bin/esvalidate.js"
5732
+ },
5733
+ "engines": {
5734
+ "node": ">=4"
5735
+ }
5736
+ },
5737
  "node_modules/esquery": {
5738
  "version": "1.6.0",
5739
  "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
 
5789
  "node": ">= 0.6"
5790
  }
5791
  },
5792
+ "node_modules/event-target-shim": {
5793
+ "version": "5.0.1",
5794
+ "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
5795
+ "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
5796
+ "license": "MIT",
5797
+ "engines": {
5798
+ "node": ">=6"
5799
+ }
5800
+ },
5801
+ "node_modules/events": {
5802
+ "version": "3.3.0",
5803
+ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
5804
+ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
5805
+ "license": "MIT",
5806
+ "engines": {
5807
+ "node": ">=0.8.x"
5808
+ }
5809
+ },
5810
  "node_modules/eventsource": {
5811
  "version": "3.0.7",
5812
  "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz",
 
5885
  "express": ">= 4.11"
5886
  }
5887
  },
5888
+ "node_modules/extract-zip": {
5889
+ "version": "2.0.1",
5890
+ "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
5891
+ "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
5892
+ "dev": true,
5893
+ "license": "BSD-2-Clause",
5894
+ "dependencies": {
5895
+ "debug": "^4.1.1",
5896
+ "get-stream": "^5.1.0",
5897
+ "yauzl": "^2.10.0"
5898
+ },
5899
+ "bin": {
5900
+ "extract-zip": "cli.js"
5901
+ },
5902
+ "engines": {
5903
+ "node": ">= 10.17.0"
5904
+ },
5905
+ "optionalDependencies": {
5906
+ "@types/yauzl": "^2.9.1"
5907
+ }
5908
+ },
5909
  "node_modules/fast-deep-equal": {
5910
  "version": "3.1.3",
5911
  "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
5912
  "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
5913
  "license": "MIT"
5914
  },
5915
+ "node_modules/fast-fifo": {
5916
+ "version": "1.3.2",
5917
+ "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz",
5918
+ "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==",
5919
+ "license": "MIT"
5920
+ },
5921
  "node_modules/fast-glob": {
5922
  "version": "3.3.1",
5923
  "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz",
 
5971
  "reusify": "^1.0.4"
5972
  }
5973
  },
5974
+ "node_modules/fd-slicer": {
5975
+ "version": "1.1.0",
5976
+ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
5977
+ "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
5978
+ "dev": true,
5979
+ "license": "MIT",
5980
+ "dependencies": {
5981
+ "pend": "~1.2.0"
5982
+ }
5983
+ },
5984
  "node_modules/fdir": {
5985
  "version": "6.5.0",
5986
  "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
 
6100
  "version": "3.3.1",
6101
  "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
6102
  "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
 
6103
  "license": "ISC",
6104
  "dependencies": {
6105
  "cross-spawn": "^7.0.6",
 
6226
  "url": "https://github.com/sponsors/ljharb"
6227
  }
6228
  },
6229
+ "node_modules/get-caller-file": {
6230
+ "version": "2.0.5",
6231
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
6232
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
6233
+ "dev": true,
6234
+ "license": "ISC",
6235
+ "engines": {
6236
+ "node": "6.* || 8.* || >= 10.*"
6237
+ }
6238
+ },
6239
  "node_modules/get-intrinsic": {
6240
  "version": "1.3.0",
6241
  "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
 
6282
  "node": ">= 0.4"
6283
  }
6284
  },
6285
+ "node_modules/get-stream": {
6286
+ "version": "5.2.0",
6287
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
6288
+ "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
6289
+ "dev": true,
6290
+ "license": "MIT",
6291
+ "dependencies": {
6292
+ "pump": "^3.0.0"
6293
+ },
6294
+ "engines": {
6295
+ "node": ">=8"
6296
+ },
6297
+ "funding": {
6298
+ "url": "https://github.com/sponsors/sindresorhus"
6299
+ }
6300
+ },
6301
  "node_modules/get-symbol-description": {
6302
  "version": "1.1.0",
6303
  "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz",
 
6329
  "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
6330
  }
6331
  },
6332
+ "node_modules/get-uri": {
6333
+ "version": "6.0.5",
6334
+ "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz",
6335
+ "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==",
6336
+ "dev": true,
6337
+ "license": "MIT",
6338
+ "dependencies": {
6339
+ "basic-ftp": "^5.0.2",
6340
+ "data-uri-to-buffer": "^6.0.2",
6341
+ "debug": "^4.3.4"
6342
+ },
6343
+ "engines": {
6344
+ "node": ">= 14"
6345
+ }
6346
+ },
6347
  "node_modules/glob": {
6348
  "version": "10.4.5",
6349
  "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
6350
  "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
 
6351
  "license": "ISC",
6352
  "dependencies": {
6353
  "foreground-child": "^3.1.0",
 
6381
  "version": "2.0.2",
6382
  "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
6383
  "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
 
6384
  "license": "MIT",
6385
  "dependencies": {
6386
  "balanced-match": "^1.0.0"
 
6390
  "version": "9.0.5",
6391
  "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
6392
  "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
 
6393
  "license": "ISC",
6394
  "dependencies": {
6395
  "brace-expansion": "^2.0.1"
 
6452
  "url": "https://github.com/sponsors/ljharb"
6453
  }
6454
  },
6455
+ "node_modules/graceful-fs": {
6456
+ "version": "4.2.11",
6457
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
6458
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
6459
+ "license": "ISC"
6460
+ },
6461
  "node_modules/graphemer": {
6462
  "version": "1.4.0",
6463
  "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
 
6582
  "node": ">= 0.8"
6583
  }
6584
  },
6585
+ "node_modules/http-proxy-agent": {
6586
+ "version": "7.0.2",
6587
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
6588
+ "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
6589
+ "dev": true,
6590
  "license": "MIT",
6591
  "dependencies": {
6592
+ "agent-base": "^7.1.0",
6593
+ "debug": "^4.3.4"
6594
  },
6595
  "engines": {
6596
+ "node": ">= 14"
6597
  }
6598
  },
6599
+ "node_modules/https-proxy-agent": {
6600
+ "version": "7.0.6",
6601
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
6602
+ "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
6603
  "dev": true,
6604
  "license": "MIT",
6605
+ "dependencies": {
6606
+ "agent-base": "^7.1.2",
6607
+ "debug": "4"
6608
+ },
6609
  "engines": {
6610
+ "node": ">= 14"
6611
  }
6612
  },
6613
+ "node_modules/iconv-lite": {
6614
+ "version": "0.6.3",
6615
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
6616
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
 
6617
  "license": "MIT",
6618
  "dependencies": {
6619
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
 
6620
  },
6621
  "engines": {
6622
+ "node": ">=0.10.0"
6623
+ }
6624
+ },
6625
+ "node_modules/ieee754": {
6626
+ "version": "1.2.1",
6627
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
6628
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
6629
+ "funding": [
6630
+ {
6631
+ "type": "github",
6632
+ "url": "https://github.com/sponsors/feross"
6633
+ },
6634
+ {
6635
+ "type": "patreon",
6636
+ "url": "https://www.patreon.com/feross"
6637
+ },
6638
+ {
6639
+ "type": "consulting",
6640
+ "url": "https://feross.org/support"
6641
+ }
6642
+ ],
6643
+ "license": "BSD-3-Clause"
6644
+ },
6645
+ "node_modules/ignore": {
6646
+ "version": "5.3.2",
6647
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
6648
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
6649
+ "dev": true,
6650
+ "license": "MIT",
6651
+ "engines": {
6652
+ "node": ">= 4"
6653
+ }
6654
+ },
6655
+ "node_modules/import-fresh": {
6656
+ "version": "3.3.1",
6657
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
6658
+ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
6659
+ "dev": true,
6660
+ "license": "MIT",
6661
+ "dependencies": {
6662
+ "parent-module": "^1.0.0",
6663
+ "resolve-from": "^4.0.0"
6664
+ },
6665
+ "engines": {
6666
+ "node": ">=6"
6667
+ },
6668
+ "funding": {
6669
  "url": "https://github.com/sponsors/sindresorhus"
6670
  }
6671
  },
 
6710
  "node": ">= 0.4"
6711
  }
6712
  },
6713
+ "node_modules/ip-address": {
6714
+ "version": "10.0.1",
6715
+ "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz",
6716
+ "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==",
6717
+ "dev": true,
6718
+ "license": "MIT",
6719
+ "engines": {
6720
+ "node": ">= 12"
6721
+ }
6722
+ },
6723
  "node_modules/ipaddr.js": {
6724
  "version": "1.9.1",
6725
  "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
 
6747
  "url": "https://github.com/sponsors/ljharb"
6748
  }
6749
  },
6750
+ "node_modules/is-arrayish": {
6751
+ "version": "0.2.1",
6752
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
6753
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
6754
+ "dev": true,
6755
+ "license": "MIT"
6756
+ },
6757
  "node_modules/is-async-function": {
6758
  "version": "2.1.1",
6759
  "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz",
 
6924
  "version": "3.0.0",
6925
  "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
6926
  "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
 
6927
  "license": "MIT",
6928
  "engines": {
6929
  "node": ">=8"
 
7068
  "url": "https://github.com/sponsors/ljharb"
7069
  }
7070
  },
7071
+ "node_modules/is-stream": {
7072
+ "version": "2.0.1",
7073
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
7074
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
7075
+ "license": "MIT",
7076
+ "engines": {
7077
+ "node": ">=8"
7078
+ },
7079
+ "funding": {
7080
+ "url": "https://github.com/sponsors/sindresorhus"
7081
+ }
7082
+ },
7083
  "node_modules/is-string": {
7084
  "version": "1.1.1",
7085
  "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz",
 
7212
  "version": "3.4.3",
7213
  "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
7214
  "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
 
7215
  "license": "BlueOak-1.0.0",
7216
  "dependencies": {
7217
  "@isaacs/cliui": "^8.0.2"
 
7259
  "dev": true,
7260
  "license": "MIT"
7261
  },
7262
+ "node_modules/json-parse-even-better-errors": {
7263
+ "version": "2.3.1",
7264
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
7265
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
7266
+ "dev": true,
7267
+ "license": "MIT"
7268
+ },
7269
  "node_modules/json-schema-traverse": {
7270
  "version": "0.4.1",
7271
  "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
 
7338
  "node": ">=0.10"
7339
  }
7340
  },
7341
+ "node_modules/lazystream": {
7342
+ "version": "1.0.1",
7343
+ "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz",
7344
+ "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==",
7345
+ "license": "MIT",
7346
+ "dependencies": {
7347
+ "readable-stream": "^2.0.5"
7348
+ },
7349
+ "engines": {
7350
+ "node": ">= 0.6.3"
7351
+ }
7352
+ },
7353
+ "node_modules/lazystream/node_modules/isarray": {
7354
+ "version": "1.0.0",
7355
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
7356
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
7357
+ "license": "MIT"
7358
+ },
7359
+ "node_modules/lazystream/node_modules/readable-stream": {
7360
+ "version": "2.3.8",
7361
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
7362
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
7363
+ "license": "MIT",
7364
+ "dependencies": {
7365
+ "core-util-is": "~1.0.0",
7366
+ "inherits": "~2.0.3",
7367
+ "isarray": "~1.0.0",
7368
+ "process-nextick-args": "~2.0.0",
7369
+ "safe-buffer": "~5.1.1",
7370
+ "string_decoder": "~1.1.1",
7371
+ "util-deprecate": "~1.0.1"
7372
+ }
7373
+ },
7374
+ "node_modules/lazystream/node_modules/safe-buffer": {
7375
+ "version": "5.1.2",
7376
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
7377
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
7378
+ "license": "MIT"
7379
+ },
7380
+ "node_modules/lazystream/node_modules/string_decoder": {
7381
+ "version": "1.1.1",
7382
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
7383
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
7384
+ "license": "MIT",
7385
+ "dependencies": {
7386
+ "safe-buffer": "~5.1.0"
7387
+ }
7388
+ },
7389
  "node_modules/levn": {
7390
  "version": "0.4.1",
7391
  "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
 
7436
  "url": "https://github.com/sponsors/sindresorhus"
7437
  }
7438
  },
7439
+ "node_modules/lodash": {
7440
+ "version": "4.17.21",
7441
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
7442
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
7443
+ "license": "MIT"
7444
+ },
7445
  "node_modules/lodash.castarray": {
7446
  "version": "4.4.0",
7447
  "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz",
 
7482
  "version": "10.4.3",
7483
  "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
7484
  "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
 
7485
  "license": "ISC"
7486
  },
7487
  "node_modules/lucide-react": {
 
7620
  "version": "7.1.2",
7621
  "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
7622
  "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
 
7623
  "license": "ISC",
7624
  "engines": {
7625
  "node": ">=16 || 14 >=14.17"
7626
  }
7627
  },
7628
+ "node_modules/mitt": {
7629
+ "version": "3.0.1",
7630
+ "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz",
7631
+ "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==",
7632
+ "dev": true,
7633
+ "license": "MIT"
7634
+ },
7635
  "node_modules/motion-dom": {
7636
  "version": "11.18.1",
7637
  "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-11.18.1.tgz",
 
7715
  "node": ">= 0.6"
7716
  }
7717
  },
7718
+ "node_modules/netmask": {
7719
+ "version": "2.0.2",
7720
+ "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz",
7721
+ "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==",
7722
+ "dev": true,
7723
+ "license": "MIT",
7724
+ "engines": {
7725
+ "node": ">= 0.4.0"
7726
+ }
7727
+ },
7728
  "node_modules/next": {
7729
  "version": "15.3.5",
7730
  "resolved": "https://registry.npmjs.org/next/-/next-15.3.5.tgz",
 
7828
  "version": "3.0.0",
7829
  "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
7830
  "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
 
7831
  "license": "MIT",
7832
  "engines": {
7833
  "node": ">=0.10.0"
 
8075
  "url": "https://github.com/sponsors/sindresorhus"
8076
  }
8077
  },
8078
+ "node_modules/pac-proxy-agent": {
8079
+ "version": "7.2.0",
8080
+ "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz",
8081
+ "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==",
8082
+ "dev": true,
8083
+ "license": "MIT",
8084
+ "dependencies": {
8085
+ "@tootallnate/quickjs-emscripten": "^0.23.0",
8086
+ "agent-base": "^7.1.2",
8087
+ "debug": "^4.3.4",
8088
+ "get-uri": "^6.0.1",
8089
+ "http-proxy-agent": "^7.0.0",
8090
+ "https-proxy-agent": "^7.0.6",
8091
+ "pac-resolver": "^7.0.1",
8092
+ "socks-proxy-agent": "^8.0.5"
8093
+ },
8094
+ "engines": {
8095
+ "node": ">= 14"
8096
+ }
8097
+ },
8098
+ "node_modules/pac-resolver": {
8099
+ "version": "7.0.1",
8100
+ "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz",
8101
+ "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==",
8102
+ "dev": true,
8103
+ "license": "MIT",
8104
+ "dependencies": {
8105
+ "degenerator": "^5.0.0",
8106
+ "netmask": "^2.0.2"
8107
+ },
8108
+ "engines": {
8109
+ "node": ">= 14"
8110
+ }
8111
+ },
8112
  "node_modules/package-json-from-dist": {
8113
  "version": "1.0.1",
8114
  "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
8115
  "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
 
8116
  "license": "BlueOak-1.0.0"
8117
  },
8118
  "node_modules/parent-module": {
 
8128
  "node": ">=6"
8129
  }
8130
  },
8131
+ "node_modules/parse-json": {
8132
+ "version": "5.2.0",
8133
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
8134
+ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
8135
+ "dev": true,
8136
+ "license": "MIT",
8137
+ "dependencies": {
8138
+ "@babel/code-frame": "^7.0.0",
8139
+ "error-ex": "^1.3.1",
8140
+ "json-parse-even-better-errors": "^2.3.0",
8141
+ "lines-and-columns": "^1.1.6"
8142
+ },
8143
+ "engines": {
8144
+ "node": ">=8"
8145
+ },
8146
+ "funding": {
8147
+ "url": "https://github.com/sponsors/sindresorhus"
8148
+ }
8149
+ },
8150
  "node_modules/parseurl": {
8151
  "version": "1.3.3",
8152
  "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
 
8186
  "version": "1.11.1",
8187
  "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
8188
  "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
 
8189
  "license": "BlueOak-1.0.0",
8190
  "dependencies": {
8191
  "lru-cache": "^10.2.0",
 
8208
  "url": "https://opencollective.com/express"
8209
  }
8210
  },
8211
+ "node_modules/pend": {
8212
+ "version": "1.2.0",
8213
+ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
8214
+ "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
8215
+ "dev": true,
8216
+ "license": "MIT"
8217
+ },
8218
  "node_modules/picocolors": {
8219
  "version": "1.1.1",
8220
  "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
 
8438
  "node": ">= 0.8.0"
8439
  }
8440
  },
8441
+ "node_modules/process": {
8442
+ "version": "0.11.10",
8443
+ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
8444
+ "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
8445
+ "license": "MIT",
8446
+ "engines": {
8447
+ "node": ">= 0.6.0"
8448
+ }
8449
+ },
8450
+ "node_modules/process-nextick-args": {
8451
+ "version": "2.0.1",
8452
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
8453
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
8454
+ "license": "MIT"
8455
+ },
8456
+ "node_modules/progress": {
8457
+ "version": "2.0.3",
8458
+ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
8459
+ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
8460
+ "dev": true,
8461
+ "license": "MIT",
8462
+ "engines": {
8463
+ "node": ">=0.4.0"
8464
+ }
8465
+ },
8466
  "node_modules/prop-types": {
8467
  "version": "15.8.1",
8468
  "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
 
8488
  "node": ">= 0.10"
8489
  }
8490
  },
8491
+ "node_modules/proxy-agent": {
8492
+ "version": "6.5.0",
8493
+ "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz",
8494
+ "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==",
8495
+ "dev": true,
8496
+ "license": "MIT",
8497
+ "dependencies": {
8498
+ "agent-base": "^7.1.2",
8499
+ "debug": "^4.3.4",
8500
+ "http-proxy-agent": "^7.0.1",
8501
+ "https-proxy-agent": "^7.0.6",
8502
+ "lru-cache": "^7.14.1",
8503
+ "pac-proxy-agent": "^7.1.0",
8504
+ "proxy-from-env": "^1.1.0",
8505
+ "socks-proxy-agent": "^8.0.5"
8506
+ },
8507
+ "engines": {
8508
+ "node": ">= 14"
8509
+ }
8510
+ },
8511
+ "node_modules/proxy-agent/node_modules/lru-cache": {
8512
+ "version": "7.18.3",
8513
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
8514
+ "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
8515
+ "dev": true,
8516
+ "license": "ISC",
8517
+ "engines": {
8518
+ "node": ">=12"
8519
+ }
8520
+ },
8521
+ "node_modules/proxy-from-env": {
8522
+ "version": "1.1.0",
8523
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
8524
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
8525
+ "dev": true,
8526
+ "license": "MIT"
8527
+ },
8528
+ "node_modules/pump": {
8529
+ "version": "3.0.3",
8530
+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz",
8531
+ "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==",
8532
+ "dev": true,
8533
+ "license": "MIT",
8534
+ "dependencies": {
8535
+ "end-of-stream": "^1.1.0",
8536
+ "once": "^1.3.1"
8537
+ }
8538
+ },
8539
  "node_modules/punycode": {
8540
  "version": "2.3.1",
8541
  "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
 
8545
  "node": ">=6"
8546
  }
8547
  },
8548
+ "node_modules/puppeteer": {
8549
+ "version": "22.15.0",
8550
+ "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-22.15.0.tgz",
8551
+ "integrity": "sha512-XjCY1SiSEi1T7iSYuxS82ft85kwDJUS7wj1Z0eGVXKdtr5g4xnVcbjwxhq5xBnpK/E7x1VZZoJDxpjAOasHT4Q==",
8552
+ "deprecated": "< 24.10.2 is no longer supported",
8553
+ "dev": true,
8554
+ "hasInstallScript": true,
8555
+ "license": "Apache-2.0",
8556
+ "dependencies": {
8557
+ "@puppeteer/browsers": "2.3.0",
8558
+ "cosmiconfig": "^9.0.0",
8559
+ "devtools-protocol": "0.0.1312386",
8560
+ "puppeteer-core": "22.15.0"
8561
+ },
8562
+ "bin": {
8563
+ "puppeteer": "lib/esm/puppeteer/node/cli.js"
8564
+ },
8565
+ "engines": {
8566
+ "node": ">=18"
8567
+ }
8568
+ },
8569
+ "node_modules/puppeteer-core": {
8570
+ "version": "22.15.0",
8571
+ "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-22.15.0.tgz",
8572
+ "integrity": "sha512-cHArnywCiAAVXa3t4GGL2vttNxh7GqXtIYGym99egkNJ3oG//wL9LkvO4WE8W1TJe95t1F1ocu9X4xWaGsOKOA==",
8573
+ "dev": true,
8574
+ "license": "Apache-2.0",
8575
+ "dependencies": {
8576
+ "@puppeteer/browsers": "2.3.0",
8577
+ "chromium-bidi": "0.6.3",
8578
+ "debug": "^4.3.6",
8579
+ "devtools-protocol": "0.0.1312386",
8580
+ "ws": "^8.18.0"
8581
+ },
8582
+ "engines": {
8583
+ "node": ">=18"
8584
+ }
8585
+ },
8586
  "node_modules/qs": {
8587
  "version": "6.14.0",
8588
  "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
 
8842
  "pify": "^2.3.0"
8843
  }
8844
  },
8845
+ "node_modules/readable-stream": {
8846
+ "version": "4.7.0",
8847
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz",
8848
+ "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==",
8849
+ "license": "MIT",
8850
+ "dependencies": {
8851
+ "abort-controller": "^3.0.0",
8852
+ "buffer": "^6.0.3",
8853
+ "events": "^3.3.0",
8854
+ "process": "^0.11.10",
8855
+ "string_decoder": "^1.3.0"
8856
+ },
8857
+ "engines": {
8858
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
8859
+ }
8860
+ },
8861
+ "node_modules/readdir-glob": {
8862
+ "version": "1.1.3",
8863
+ "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz",
8864
+ "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==",
8865
+ "license": "Apache-2.0",
8866
+ "dependencies": {
8867
+ "minimatch": "^5.1.0"
8868
+ }
8869
+ },
8870
+ "node_modules/readdir-glob/node_modules/brace-expansion": {
8871
+ "version": "2.0.2",
8872
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
8873
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
8874
+ "license": "MIT",
8875
+ "dependencies": {
8876
+ "balanced-match": "^1.0.0"
8877
+ }
8878
+ },
8879
+ "node_modules/readdir-glob/node_modules/minimatch": {
8880
+ "version": "5.1.6",
8881
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
8882
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
8883
+ "license": "ISC",
8884
+ "dependencies": {
8885
+ "brace-expansion": "^2.0.1"
8886
+ },
8887
+ "engines": {
8888
+ "node": ">=10"
8889
+ }
8890
+ },
8891
  "node_modules/readdirp": {
8892
  "version": "3.6.0",
8893
  "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
 
8958
  "url": "https://github.com/sponsors/ljharb"
8959
  }
8960
  },
8961
+ "node_modules/require-directory": {
8962
+ "version": "2.1.1",
8963
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
8964
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
8965
+ "dev": true,
8966
+ "license": "MIT",
8967
+ "engines": {
8968
+ "node": ">=0.10.0"
8969
+ }
8970
+ },
8971
  "node_modules/resolve": {
8972
  "version": "1.22.10",
8973
  "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
 
9401
  "version": "4.1.0",
9402
  "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
9403
  "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
 
9404
  "license": "ISC",
9405
  "engines": {
9406
  "node": ">=14"
 
9409
  "url": "https://github.com/sponsors/isaacs"
9410
  }
9411
  },
9412
+ "node_modules/smart-buffer": {
9413
+ "version": "4.2.0",
9414
+ "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
9415
+ "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
9416
+ "dev": true,
9417
+ "license": "MIT",
9418
+ "engines": {
9419
+ "node": ">= 6.0.0",
9420
+ "npm": ">= 3.0.0"
9421
+ }
9422
+ },
9423
+ "node_modules/socks": {
9424
+ "version": "2.8.7",
9425
+ "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz",
9426
+ "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==",
9427
+ "dev": true,
9428
+ "license": "MIT",
9429
+ "dependencies": {
9430
+ "ip-address": "^10.0.1",
9431
+ "smart-buffer": "^4.2.0"
9432
+ },
9433
+ "engines": {
9434
+ "node": ">= 10.0.0",
9435
+ "npm": ">= 3.0.0"
9436
+ }
9437
+ },
9438
+ "node_modules/socks-proxy-agent": {
9439
+ "version": "8.0.5",
9440
+ "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz",
9441
+ "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==",
9442
+ "dev": true,
9443
+ "license": "MIT",
9444
+ "dependencies": {
9445
+ "agent-base": "^7.1.2",
9446
+ "debug": "^4.3.4",
9447
+ "socks": "^2.8.3"
9448
+ },
9449
+ "engines": {
9450
+ "node": ">= 14"
9451
+ }
9452
+ },
9453
  "node_modules/sonner": {
9454
  "version": "1.7.4",
9455
  "resolved": "https://registry.npmjs.org/sonner/-/sonner-1.7.4.tgz",
 
9460
  "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc"
9461
  }
9462
  },
9463
+ "node_modules/source-map": {
9464
+ "version": "0.6.1",
9465
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
9466
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
9467
+ "dev": true,
9468
+ "license": "BSD-3-Clause",
9469
+ "optional": true,
9470
+ "engines": {
9471
+ "node": ">=0.10.0"
9472
+ }
9473
+ },
9474
  "node_modules/source-map-js": {
9475
  "version": "1.2.1",
9476
  "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
 
9518
  "node": ">=10.0.0"
9519
  }
9520
  },
9521
+ "node_modules/streamx": {
9522
+ "version": "2.22.1",
9523
+ "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.1.tgz",
9524
+ "integrity": "sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==",
9525
+ "license": "MIT",
9526
+ "dependencies": {
9527
+ "fast-fifo": "^1.3.2",
9528
+ "text-decoder": "^1.1.0"
9529
+ },
9530
+ "optionalDependencies": {
9531
+ "bare-events": "^2.2.0"
9532
+ }
9533
+ },
9534
+ "node_modules/string_decoder": {
9535
+ "version": "1.3.0",
9536
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
9537
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
9538
+ "license": "MIT",
9539
+ "dependencies": {
9540
+ "safe-buffer": "~5.2.0"
9541
+ }
9542
+ },
9543
  "node_modules/string-width": {
9544
  "version": "5.1.2",
9545
  "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
9546
  "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
 
9547
  "license": "MIT",
9548
  "dependencies": {
9549
  "eastasianwidth": "^0.2.0",
 
9562
  "version": "4.2.3",
9563
  "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
9564
  "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
 
9565
  "license": "MIT",
9566
  "dependencies": {
9567
  "emoji-regex": "^8.0.0",
 
9576
  "version": "5.0.1",
9577
  "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
9578
  "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
 
9579
  "license": "MIT",
9580
  "engines": {
9581
  "node": ">=8"
 
9585
  "version": "8.0.0",
9586
  "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
9587
  "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
 
9588
  "license": "MIT"
9589
  },
9590
  "node_modules/string-width-cjs/node_modules/strip-ansi": {
9591
  "version": "6.0.1",
9592
  "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
9593
  "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
 
9594
  "license": "MIT",
9595
  "dependencies": {
9596
  "ansi-regex": "^5.0.1"
 
9716
  "version": "7.1.2",
9717
  "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz",
9718
  "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==",
 
9719
  "license": "MIT",
9720
  "dependencies": {
9721
  "ansi-regex": "^6.0.1"
 
9732
  "version": "6.0.1",
9733
  "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
9734
  "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
 
9735
  "license": "MIT",
9736
  "dependencies": {
9737
  "ansi-regex": "^5.0.1"
 
9744
  "version": "5.0.1",
9745
  "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
9746
  "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
 
9747
  "license": "MIT",
9748
  "engines": {
9749
  "node": ">=8"
 
9937
  "node": ">= 6"
9938
  }
9939
  },
9940
+ "node_modules/tar-fs": {
9941
+ "version": "3.1.1",
9942
+ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz",
9943
+ "integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==",
9944
+ "dev": true,
9945
+ "license": "MIT",
9946
+ "dependencies": {
9947
+ "pump": "^3.0.0",
9948
+ "tar-stream": "^3.1.5"
9949
+ },
9950
+ "optionalDependencies": {
9951
+ "bare-fs": "^4.0.1",
9952
+ "bare-path": "^3.0.0"
9953
+ }
9954
+ },
9955
+ "node_modules/tar-stream": {
9956
+ "version": "3.1.7",
9957
+ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz",
9958
+ "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==",
9959
+ "license": "MIT",
9960
+ "dependencies": {
9961
+ "b4a": "^1.6.4",
9962
+ "fast-fifo": "^1.2.0",
9963
+ "streamx": "^2.15.0"
9964
+ }
9965
+ },
9966
+ "node_modules/text-decoder": {
9967
+ "version": "1.2.3",
9968
+ "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz",
9969
+ "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==",
9970
+ "license": "Apache-2.0",
9971
+ "dependencies": {
9972
+ "b4a": "^1.6.4"
9973
+ }
9974
+ },
9975
  "node_modules/thenify": {
9976
  "version": "3.3.1",
9977
  "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
 
10001
  "integrity": "sha512-oB7yIimd8SuGptespDAZnNkzIz+NWaJCu2RMsbs4Wmp9zSDUM8Nhi3s2OOcqYuv3mN4hitXc8DVx+LyUmbUDiA==",
10002
  "license": "ISC"
10003
  },
10004
+ "node_modules/through": {
10005
+ "version": "2.3.8",
10006
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
10007
+ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
10008
+ "dev": true,
10009
+ "license": "MIT"
10010
+ },
10011
  "node_modules/thumbhash": {
10012
  "version": "0.1.1",
10013
  "resolved": "https://registry.npmjs.org/thumbhash/-/thumbhash-0.1.1.tgz",
 
10230
  "url": "https://github.com/sponsors/ljharb"
10231
  }
10232
  },
10233
+ "node_modules/unbzip2-stream": {
10234
+ "version": "1.4.3",
10235
+ "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz",
10236
+ "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==",
10237
+ "dev": true,
10238
+ "license": "MIT",
10239
+ "dependencies": {
10240
+ "buffer": "^5.2.1",
10241
+ "through": "^2.3.8"
10242
+ }
10243
+ },
10244
+ "node_modules/unbzip2-stream/node_modules/buffer": {
10245
+ "version": "5.7.1",
10246
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
10247
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
10248
+ "dev": true,
10249
+ "funding": [
10250
+ {
10251
+ "type": "github",
10252
+ "url": "https://github.com/sponsors/feross"
10253
+ },
10254
+ {
10255
+ "type": "patreon",
10256
+ "url": "https://www.patreon.com/feross"
10257
+ },
10258
+ {
10259
+ "type": "consulting",
10260
+ "url": "https://feross.org/support"
10261
+ }
10262
+ ],
10263
+ "license": "MIT",
10264
+ "dependencies": {
10265
+ "base64-js": "^1.3.1",
10266
+ "ieee754": "^1.1.13"
10267
+ }
10268
+ },
10269
  "node_modules/undici-types": {
10270
  "version": "6.21.0",
10271
  "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
10272
  "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
 
10273
  "license": "MIT"
10274
  },
10275
  "node_modules/unpipe": {
 
10356
  "punycode": "^2.1.0"
10357
  }
10358
  },
10359
+ "node_modules/urlpattern-polyfill": {
10360
+ "version": "10.0.0",
10361
+ "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz",
10362
+ "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==",
10363
+ "dev": true,
10364
+ "license": "MIT"
10365
+ },
10366
  "node_modules/use-callback-ref": {
10367
  "version": "1.3.3",
10368
  "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz",
 
10563
  "version": "8.1.0",
10564
  "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
10565
  "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
 
10566
  "license": "MIT",
10567
  "dependencies": {
10568
  "ansi-styles": "^6.1.0",
 
10581
  "version": "7.0.0",
10582
  "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
10583
  "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
 
10584
  "license": "MIT",
10585
  "dependencies": {
10586
  "ansi-styles": "^4.0.0",
 
10598
  "version": "5.0.1",
10599
  "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
10600
  "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
 
10601
  "license": "MIT",
10602
  "engines": {
10603
  "node": ">=8"
 
10607
  "version": "8.0.0",
10608
  "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
10609
  "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
 
10610
  "license": "MIT"
10611
  },
10612
  "node_modules/wrap-ansi-cjs/node_modules/string-width": {
10613
  "version": "4.2.3",
10614
  "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
10615
  "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
 
10616
  "license": "MIT",
10617
  "dependencies": {
10618
  "emoji-regex": "^8.0.0",
 
10627
  "version": "6.0.1",
10628
  "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
10629
  "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
 
10630
  "license": "MIT",
10631
  "dependencies": {
10632
  "ansi-regex": "^5.0.1"
 
10639
  "version": "6.2.3",
10640
  "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
10641
  "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
 
10642
  "license": "MIT",
10643
  "engines": {
10644
  "node": ">=12"
 
10653
  "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
10654
  "license": "ISC"
10655
  },
10656
+ "node_modules/ws": {
10657
+ "version": "8.18.3",
10658
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz",
10659
+ "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==",
10660
+ "dev": true,
10661
+ "license": "MIT",
10662
+ "engines": {
10663
+ "node": ">=10.0.0"
10664
+ },
10665
+ "peerDependencies": {
10666
+ "bufferutil": "^4.0.1",
10667
+ "utf-8-validate": ">=5.0.2"
10668
+ },
10669
+ "peerDependenciesMeta": {
10670
+ "bufferutil": {
10671
+ "optional": true
10672
+ },
10673
+ "utf-8-validate": {
10674
+ "optional": true
10675
+ }
10676
+ }
10677
+ },
10678
+ "node_modules/y18n": {
10679
+ "version": "5.0.8",
10680
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
10681
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
10682
+ "dev": true,
10683
+ "license": "ISC",
10684
+ "engines": {
10685
+ "node": ">=10"
10686
+ }
10687
+ },
10688
  "node_modules/yaml": {
10689
  "version": "2.8.1",
10690
  "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz",
 
10698
  "node": ">= 14.6"
10699
  }
10700
  },
10701
+ "node_modules/yargs": {
10702
+ "version": "17.7.2",
10703
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
10704
+ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
10705
+ "dev": true,
10706
+ "license": "MIT",
10707
+ "dependencies": {
10708
+ "cliui": "^8.0.1",
10709
+ "escalade": "^3.1.1",
10710
+ "get-caller-file": "^2.0.5",
10711
+ "require-directory": "^2.1.1",
10712
+ "string-width": "^4.2.3",
10713
+ "y18n": "^5.0.5",
10714
+ "yargs-parser": "^21.1.1"
10715
+ },
10716
+ "engines": {
10717
+ "node": ">=12"
10718
+ }
10719
+ },
10720
+ "node_modules/yargs-parser": {
10721
+ "version": "21.1.1",
10722
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
10723
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
10724
+ "dev": true,
10725
+ "license": "ISC",
10726
+ "engines": {
10727
+ "node": ">=12"
10728
+ }
10729
+ },
10730
+ "node_modules/yargs/node_modules/ansi-regex": {
10731
+ "version": "5.0.1",
10732
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
10733
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
10734
+ "dev": true,
10735
+ "license": "MIT",
10736
+ "engines": {
10737
+ "node": ">=8"
10738
+ }
10739
+ },
10740
+ "node_modules/yargs/node_modules/emoji-regex": {
10741
+ "version": "8.0.0",
10742
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
10743
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
10744
+ "dev": true,
10745
+ "license": "MIT"
10746
+ },
10747
+ "node_modules/yargs/node_modules/string-width": {
10748
+ "version": "4.2.3",
10749
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
10750
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
10751
+ "dev": true,
10752
+ "license": "MIT",
10753
+ "dependencies": {
10754
+ "emoji-regex": "^8.0.0",
10755
+ "is-fullwidth-code-point": "^3.0.0",
10756
+ "strip-ansi": "^6.0.1"
10757
+ },
10758
+ "engines": {
10759
+ "node": ">=8"
10760
+ }
10761
+ },
10762
+ "node_modules/yargs/node_modules/strip-ansi": {
10763
+ "version": "6.0.1",
10764
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
10765
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
10766
+ "dev": true,
10767
+ "license": "MIT",
10768
+ "dependencies": {
10769
+ "ansi-regex": "^5.0.1"
10770
+ },
10771
+ "engines": {
10772
+ "node": ">=8"
10773
+ }
10774
+ },
10775
+ "node_modules/yauzl": {
10776
+ "version": "2.10.0",
10777
+ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
10778
+ "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
10779
+ "dev": true,
10780
+ "license": "MIT",
10781
+ "dependencies": {
10782
+ "buffer-crc32": "~0.2.3",
10783
+ "fd-slicer": "~1.1.0"
10784
+ }
10785
+ },
10786
+ "node_modules/yauzl/node_modules/buffer-crc32": {
10787
+ "version": "0.2.13",
10788
+ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
10789
+ "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
10790
+ "dev": true,
10791
+ "license": "MIT",
10792
+ "engines": {
10793
+ "node": "*"
10794
+ }
10795
+ },
10796
  "node_modules/yocto-queue": {
10797
  "version": "0.1.0",
10798
  "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
 
10806
  "url": "https://github.com/sponsors/sindresorhus"
10807
  }
10808
  },
10809
+ "node_modules/zip-stream": {
10810
+ "version": "6.0.1",
10811
+ "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz",
10812
+ "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==",
10813
+ "license": "MIT",
10814
+ "dependencies": {
10815
+ "archiver-utils": "^5.0.0",
10816
+ "compress-commons": "^6.0.2",
10817
+ "readable-stream": "^4.0.0"
10818
+ },
10819
+ "engines": {
10820
+ "node": ">= 14"
10821
+ }
10822
+ },
10823
  "node_modules/zod": {
10824
  "version": "3.25.76",
10825
  "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
package.json CHANGED
@@ -32,6 +32,8 @@
32
  "@radix-ui/react-toast": "^1.2.0",
33
  "@radix-ui/react-toggle": "^1.1.0",
34
  "@radix-ui/react-tooltip": "^1.1.0",
 
 
35
  "class-variance-authority": "^0.7.1",
36
  "clsx": "^2.1.1",
37
  "date-fns": "^4.1.0",
 
32
  "@radix-ui/react-toast": "^1.2.0",
33
  "@radix-ui/react-toggle": "^1.1.0",
34
  "@radix-ui/react-tooltip": "^1.1.0",
35
+ "@types/archiver": "^6.0.3",
36
+ "archiver": "^7.0.1",
37
  "class-variance-authority": "^0.7.1",
38
  "clsx": "^2.1.1",
39
  "date-fns": "^4.1.0",
templates/ai-chat.tsx ADDED
@@ -0,0 +1,223 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { motion } from 'framer-motion'
2
+ import { Button, Card, CardContent, CardDescription, CardHeader, CardTitle, Badge } from '@hanzo/ui/primitives'
3
+ import { HanzoLogo } from '@/components/logo'
4
+ import { Bot, MessageSquare, Sparkles, Zap, Code2, Brain, Globe, Shield, Sliders, Terminal, Cloud, Users } from 'lucide-react'
5
+
6
+ export default function AIChatTemplate() {
7
+ return (
8
+ <div className="min-h-screen bg-black text-white">
9
+ {/* Animated Background */}
10
+ <div className="fixed inset-0 overflow-hidden">
11
+ <div className="absolute inset-0 bg-gradient-to-br from-gray-950 via-black to-gray-950" />
12
+ <div className="absolute inset-0">
13
+ {[...Array(40)].map((_, i) => (
14
+ <motion.div
15
+ key={i}
16
+ className="absolute w-1 h-1 bg-white/20 rounded-full"
17
+ animate={{
18
+ y: [0, -30, 0],
19
+ opacity: [0, 1, 0]
20
+ }}
21
+ transition={{
22
+ duration: 3 + Math.random() * 2,
23
+ repeat: Infinity,
24
+ delay: Math.random() * 3
25
+ }}
26
+ style={{
27
+ left: `${Math.random() * 100}%`,
28
+ bottom: '0'
29
+ }}
30
+ />
31
+ ))}
32
+ </div>
33
+ </div>
34
+
35
+ {/* Header */}
36
+ <header className="relative z-10 p-8">
37
+ <nav className="flex justify-between items-center">
38
+ <div className="flex items-center gap-3">
39
+ <div className="w-10 h-10 bg-white rounded-lg flex items-center justify-center">
40
+ <HanzoLogo className="w-6 h-6 text-black" />
41
+ </div>
42
+ <span className="text-xl font-bold">Hanzo Chat</span>
43
+ </div>
44
+ <div className="flex gap-2">
45
+ <Button variant="ghost" className="text-white hover:text-black hover:bg-white">
46
+ Models
47
+ </Button>
48
+ <Button variant="ghost" className="text-white hover:text-black hover:bg-white">
49
+ Documentation
50
+ </Button>
51
+ <Button className="bg-white text-black hover:bg-gray-200">
52
+ Launch Chat
53
+ </Button>
54
+ </div>
55
+ </nav>
56
+ </header>
57
+
58
+ {/* Hero Section */}
59
+ <section className="relative z-10 px-8 py-16 text-center">
60
+ <motion.div
61
+ initial={{ opacity: 0, y: 20 }}
62
+ animate={{ opacity: 1, y: 0 }}
63
+ >
64
+ <Badge variant="secondary" className="mb-6 bg-white/10 text-white border-white/20">
65
+ <Bot className="w-4 h-4 mr-2" />
66
+ 100+ LLM Providers
67
+ </Badge>
68
+
69
+ <h1 className="text-6xl md:text-7xl font-bold mb-6">
70
+ <span className="bg-gradient-to-r from-white to-gray-400 bg-clip-text text-transparent">
71
+ Universal AI
72
+ </span>
73
+ <br />
74
+ <span className="text-white">Chat Interface</span>
75
+ </h1>
76
+
77
+ <p className="text-xl text-gray-400 mb-12 max-w-2xl mx-auto">
78
+ One interface to rule them all. Access OpenAI, Anthropic, Google, and 100+ AI models
79
+ with Model Context Protocol support.
80
+ </p>
81
+
82
+ {/* Chat Preview */}
83
+ <Card className="max-w-4xl mx-auto bg-gray-950/80 border-gray-800 backdrop-blur-xl">
84
+ <CardHeader className="bg-gray-900/80 border-b border-gray-800">
85
+ <div className="flex items-center justify-between">
86
+ <div className="flex items-center gap-3">
87
+ <MessageSquare className="w-5 h-5 text-white" />
88
+ <span className="text-sm text-white">Chat with Claude 3.5 Sonnet</span>
89
+ </div>
90
+ <Badge className="bg-green-500/20 text-green-400 border-green-500/30">
91
+ Connected
92
+ </Badge>
93
+ </div>
94
+ </CardHeader>
95
+ <CardContent className="p-6">
96
+ <div className="space-y-4">
97
+ <div className="flex gap-3">
98
+ <div className="w-8 h-8 bg-gray-800 rounded-full flex items-center justify-center flex-shrink-0">
99
+ <span className="text-xs">👤</span>
100
+ </div>
101
+ <div className="bg-gray-900 rounded-lg p-3 flex-1">
102
+ <p className="text-sm text-gray-300">
103
+ Can you help me implement a real-time chat system with WebSockets?
104
+ </p>
105
+ </div>
106
+ </div>
107
+ <div className="flex gap-3">
108
+ <div className="w-8 h-8 bg-gradient-to-br from-gray-700 to-gray-800 rounded-full flex items-center justify-center flex-shrink-0">
109
+ <Bot className="w-4 h-4 text-white" />
110
+ </div>
111
+ <div className="bg-gray-800/50 rounded-lg p-3 flex-1">
112
+ <p className="text-sm text-gray-300">
113
+ I'll help you implement a real-time chat system with WebSockets. Here's a complete solution using Node.js and Socket.io...
114
+ </p>
115
+ <div className="mt-3 bg-gray-900 rounded p-2">
116
+ <code className="text-xs text-gray-400">
117
+ <span className="text-white">const</span> io = <span className="text-white">require</span>(<span className="text-gray-300">'socket.io'</span>)
118
+ </code>
119
+ </div>
120
+ </div>
121
+ </div>
122
+ </div>
123
+ </CardContent>
124
+ </Card>
125
+ </motion.div>
126
+ </section>
127
+
128
+ {/* Features Grid */}
129
+ <section className="relative z-10 px-8 py-16">
130
+ <div className="max-w-6xl mx-auto">
131
+ <h2 className="text-3xl font-bold text-center mb-12">
132
+ <span className="bg-gradient-to-r from-white to-gray-400 bg-clip-text text-transparent">
133
+ Everything You Need for AI Conversations
134
+ </span>
135
+ </h2>
136
+ <div className="grid md:grid-cols-3 gap-6">
137
+ {[
138
+ { icon: Brain, title: "MCP Tools", desc: "260+ tools with Model Context Protocol" },
139
+ { icon: Zap, title: "Instant Switch", desc: "Switch models mid-conversation" },
140
+ { icon: Globe, title: "Multi-Provider", desc: "OpenAI, Anthropic, Google, and more" },
141
+ { icon: Code2, title: "Code Execution", desc: "Run code directly in chat" },
142
+ { icon: Shield, title: "Privacy First", desc: "Your data stays private" },
143
+ { icon: Sliders, title: "Custom Models", desc: "Fine-tune and deploy custom models" },
144
+ { icon: Terminal, title: "API Access", desc: "Full API for integrations" },
145
+ { icon: Cloud, title: "Cloud Sync", desc: "Sync chats across devices" },
146
+ { icon: Users, title: "Team Collaboration", desc: "Share and collaborate on chats" }
147
+ ].map((feature, i) => (
148
+ <motion.div
149
+ key={i}
150
+ initial={{ opacity: 0, y: 20 }}
151
+ animate={{ opacity: 1, y: 0 }}
152
+ transition={{ delay: 0.05 * i }}
153
+ >
154
+ <Card className="bg-gray-950/50 border-gray-800 hover:border-white/20 transition-all hover:bg-gray-900/50 backdrop-blur-xl">
155
+ <CardHeader>
156
+ <feature.icon className="w-8 h-8 text-white mb-2" />
157
+ <CardTitle className="text-white">{feature.title}</CardTitle>
158
+ </CardHeader>
159
+ <CardContent>
160
+ <CardDescription className="text-gray-400">{feature.desc}</CardDescription>
161
+ </CardContent>
162
+ </Card>
163
+ </motion.div>
164
+ ))}
165
+ </div>
166
+ </div>
167
+ </section>
168
+
169
+ {/* Model Showcase */}
170
+ <section className="relative z-10 px-8 py-16">
171
+ <Card className="max-w-6xl mx-auto bg-gray-950/80 border-gray-800 backdrop-blur-xl">
172
+ <CardHeader className="text-center">
173
+ <CardTitle className="text-3xl text-white">Supported Models</CardTitle>
174
+ <CardDescription className="text-gray-400">
175
+ Access the latest AI models from leading providers
176
+ </CardDescription>
177
+ </CardHeader>
178
+ <CardContent className="p-8">
179
+ <div className="grid grid-cols-2 md:grid-cols-4 gap-4">
180
+ {[
181
+ 'GPT-4 Turbo', 'Claude 3.5', 'Gemini Pro', 'Llama 3',
182
+ 'Mistral Large', 'Command R+', 'Qwen 2.5', 'DeepSeek',
183
+ ].map((model, i) => (
184
+ <motion.div
185
+ key={i}
186
+ initial={{ opacity: 0, scale: 0.9 }}
187
+ animate={{ opacity: 1, scale: 1 }}
188
+ transition={{ delay: 0.05 * i }}
189
+ className="bg-gray-900/50 border border-gray-800 rounded-lg p-3 text-center hover:border-white/20 transition-colors"
190
+ >
191
+ <span className="text-sm text-gray-300">{model}</span>
192
+ </motion.div>
193
+ ))}
194
+ </div>
195
+ </CardContent>
196
+ </Card>
197
+ </section>
198
+
199
+ {/* CTA Section */}
200
+ <section className="relative z-10 px-8 py-16 text-center">
201
+ <Card className="max-w-4xl mx-auto bg-gradient-to-r from-gray-900 to-gray-950 border-gray-800">
202
+ <CardContent className="p-12">
203
+ <Sparkles className="w-12 h-12 text-white mx-auto mb-6" />
204
+ <h2 className="text-4xl font-bold text-white mb-6">
205
+ Start Chatting with AI Today
206
+ </h2>
207
+ <p className="text-xl text-gray-400 mb-8">
208
+ Free tier includes 100 messages per day across all models
209
+ </p>
210
+ <div className="flex gap-4 justify-center">
211
+ <Button size="lg" className="bg-white text-black hover:bg-gray-200">
212
+ Get Started Free
213
+ </Button>
214
+ <Button size="lg" variant="outline" className="border-white text-white hover:bg-white hover:text-black">
215
+ View Documentation
216
+ </Button>
217
+ </div>
218
+ </CardContent>
219
+ </Card>
220
+ </section>
221
+ </div>
222
+ )
223
+ }
templates/analyticsdash.tsx CHANGED
@@ -1,19 +1,29 @@
1
  import { motion } from 'framer-motion'
 
 
 
 
 
 
 
 
 
 
2
  import {
3
  BarChart3, TrendingUp, Users, DollarSign, Activity,
4
  Calendar, Filter, Download, Settings, Bell, Search,
5
  ArrowUp, ArrowDown, MoreVertical
6
  } from 'lucide-react'
7
 
8
- export default function AnalyticsDashTemplate() {
9
  return (
10
- <div className="min-h-screen bg-gray-50 dark:bg-gray-950">
11
  {/* Sidebar */}
12
- <aside className="fixed left-0 top-0 h-full w-64 bg-white dark:bg-gray-900 border-r border-gray-200 dark:border-gray-800">
13
  <div className="p-6">
14
  <div className="flex items-center gap-3 mb-8">
15
- <div className="w-10 h-10 bg-gradient-to-br from-white to-gray-400 rounded-lg flex items-center justify-center">
16
- <BarChart3 className="w-6 h-6 text-white" />
17
  </div>
18
  <span className="text-xl font-bold">Analytics Pro</span>
19
  </div>
@@ -31,8 +41,8 @@ export default function AnalyticsDashTemplate() {
31
  key={i}
32
  className={`w-full flex items-center gap-3 px-3 py-2 rounded-lg transition-colors ${
33
  item.active
34
- ? 'bg-gray-800 dark:bg-gray-800/20 text-gray-400 dark:text-gray-400'
35
- : 'hover:bg-gray-100 dark:hover:bg-gray-800'
36
  }`}
37
  >
38
  <item.icon className="w-5 h-5" />
@@ -46,34 +56,34 @@ export default function AnalyticsDashTemplate() {
46
  {/* Main Content */}
47
  <main className="ml-64">
48
  {/* Top Bar */}
49
- <header className="bg-white dark:bg-gray-900 border-b border-gray-200 dark:border-gray-800">
50
  <div className="px-8 py-4 flex items-center justify-between">
51
  <div className="flex items-center gap-4 flex-1">
52
  <div className="relative flex-1 max-w-md">
53
- <Search className="absolute left-3 top-1/2 -translate-y-1/2 w-5 h-5 text-gray-400" />
54
  <input
55
  type="text"
56
  placeholder="Search..."
57
- className="w-full pl-10 pr-4 py-2 bg-gray-100 dark:bg-gray-800 rounded-lg"
58
  />
59
  </div>
60
- <button className="flex items-center gap-2 px-4 py-2 bg-gray-100 dark:bg-gray-800 rounded-lg">
61
  <Calendar className="w-4 h-4" />
62
  <span>Last 30 days</span>
63
- </button>
64
- <button className="p-2 hover:bg-gray-100 dark:hover:bg-gray-800 rounded-lg">
65
  <Filter className="w-5 h-5" />
66
- </button>
67
  </div>
68
  <div className="flex items-center gap-3">
69
- <button className="relative p-2 hover:bg-gray-100 dark:hover:bg-gray-800 rounded-lg">
70
  <Bell className="w-5 h-5" />
71
- <div className="absolute top-1 right-1 w-2 h-2 bg-gray-700 rounded-full" />
72
- </button>
73
- <button className="px-4 py-2 bg-gray-800 text-white rounded-lg font-semibold flex items-center gap-2">
74
  <Download className="w-4 h-4" />
75
  Export
76
- </button>
77
  </div>
78
  </div>
79
  </header>
@@ -88,32 +98,28 @@ export default function AnalyticsDashTemplate() {
88
  value: "$45,231",
89
  change: "+20.1%",
90
  trend: "up",
91
- icon: DollarSign,
92
- color: "from-gray-200 to-gray-500"
93
  },
94
  {
95
  title: "Active Users",
96
  value: "2,543",
97
  change: "+18.2%",
98
  trend: "up",
99
- icon: Users,
100
- color: "from-white to-gray-500"
101
  },
102
  {
103
- title: "Conversion Rate",
104
- value: "3.2%",
105
  change: "-5.4%",
106
  trend: "down",
107
- icon: TrendingUp,
108
- color: "from-white to-gray-400"
109
  },
110
  {
111
  title: "Avg. Session",
112
  value: "4m 32s",
113
  change: "+12.3%",
114
  trend: "up",
115
- icon: Activity,
116
- color: "from-gray-200 to-gray-500"
117
  }
118
  ].map((stat, i) => (
119
  <motion.div
@@ -121,169 +127,105 @@ export default function AnalyticsDashTemplate() {
121
  initial={{ opacity: 0, y: 20 }}
122
  animate={{ opacity: 1, y: 0 }}
123
  transition={{ delay: i * 0.1 }}
124
- className="bg-white dark:bg-gray-900 rounded-xl p-6 shadow-sm"
125
  >
126
- <div className="flex items-center justify-between mb-4">
127
- <div className={`w-10 h-10 bg-gradient-to-br ${stat.color} rounded-lg flex items-center justify-center`}>
128
- <stat.icon className="w-5 h-5 text-white" />
129
- </div>
130
- <button className="p-1 hover:bg-gray-100 dark:hover:bg-gray-800 rounded">
131
- <MoreVertical className="w-4 h-4 text-gray-400" />
132
- </button>
133
- </div>
134
- <h3 className="text-sm text-gray-600 dark:text-gray-400 mb-1">{stat.title}</h3>
135
- <div className="flex items-end justify-between">
136
- <span className="text-2xl font-bold">{stat.value}</span>
137
- <div className={`flex items-center gap-1 text-sm ${
138
- stat.trend === 'up' ? 'text-gray-300' : 'text-gray-500'
139
- }`}>
140
- {stat.trend === 'up' ? (
141
- <ArrowUp className="w-3 h-3" />
142
- ) : (
143
- <ArrowDown className="w-3 h-3" />
144
- )}
145
- <span>{stat.change}</span>
146
- </div>
147
- </div>
 
 
 
 
 
148
  </motion.div>
149
  ))}
150
  </div>
151
 
152
  {/* Charts */}
153
- <div className="grid grid-cols-2 gap-6 mb-8">
154
- {/* Traffic Chart */}
155
  <motion.div
156
  initial={{ opacity: 0, scale: 0.95 }}
157
  animate={{ opacity: 1, scale: 1 }}
158
  transition={{ delay: 0.4 }}
159
- className="bg-white dark:bg-gray-900 rounded-xl p-6 shadow-sm"
160
  >
161
- <div className="flex items-center justify-between mb-6">
162
- <h3 className="text-lg font-semibold">Traffic Overview</h3>
163
- <button className="text-sm text-gray-600 dark:text-gray-400">View Details →</button>
164
- </div>
165
- <div className="space-y-4">
166
- {/* Chart Bars */}
167
- {[...Array(7)].map((_, i) => (
168
- <div key={i} className="flex items-center gap-4">
169
- <span className="text-xs text-gray-500 w-10">Day {i + 1}</span>
170
- <div className="flex-1 bg-gray-100 dark:bg-gray-800 rounded-full h-6 overflow-hidden">
171
- <motion.div
172
- initial={{ width: 0 }}
173
- animate={{ width: `${Math.random() * 80 + 20}%` }}
174
- transition={{ duration: 0.5, delay: 0.6 + i * 0.1 }}
175
- className="h-full bg-gradient-to-r from-white to-gray-400 rounded-full"
176
- />
177
  </div>
 
178
  </div>
179
- ))}
180
- </div>
 
 
 
 
 
 
 
 
 
 
 
181
  </motion.div>
182
 
183
- {/* Pie Chart */}
184
  <motion.div
185
  initial={{ opacity: 0, scale: 0.95 }}
186
  animate={{ opacity: 1, scale: 1 }}
187
  transition={{ delay: 0.5 }}
188
- className="bg-white dark:bg-gray-900 rounded-xl p-6 shadow-sm"
189
  >
190
- <div className="flex items-center justify-between mb-6">
191
- <h3 className="text-lg font-semibold">Traffic Sources</h3>
192
- <button className="text-sm text-gray-600 dark:text-gray-400">View Details →</button>
193
- </div>
194
- <div className="flex items-center justify-center">
195
- <div className="relative w-48 h-48">
196
- <svg className="w-48 h-48 transform -rotate-90">
197
- <circle
198
- cx="96"
199
- cy="96"
200
- r="80"
201
- stroke="currentColor"
202
- strokeWidth="32"
203
- fill="none"
204
- className="text-gray-400"
205
- strokeDasharray="251 251"
206
- />
207
- <circle
208
- cx="96"
209
- cy="96"
210
- r="80"
211
- stroke="currentColor"
212
- strokeWidth="32"
213
- fill="none"
214
- className="text-gray-400"
215
- strokeDasharray="150 251"
216
- strokeDashoffset="-251"
217
- />
218
- <circle
219
- cx="96"
220
- cy="96"
221
- r="80"
222
- stroke="currentColor"
223
- strokeWidth="32"
224
- fill="none"
225
- className="text-gray-300"
226
- strokeDasharray="75 251"
227
- strokeDashoffset="-401"
228
- />
229
- </svg>
230
- <div className="absolute inset-0 flex items-center justify-center">
231
- <div className="text-center">
232
- <div className="text-2xl font-bold">100%</div>
233
- <div className="text-sm text-gray-500">Total</div>
234
- </div>
235
- </div>
236
- </div>
237
- </div>
238
- <div className="mt-6 space-y-2">
239
- <div className="flex items-center justify-between">
240
- <div className="flex items-center gap-2">
241
- <div className="w-3 h-3 bg-gray-800 rounded-full" />
242
- <span className="text-sm">Direct</span>
243
- </div>
244
- <span className="text-sm font-semibold">45%</span>
245
- </div>
246
- <div className="flex items-center justify-between">
247
- <div className="flex items-center gap-2">
248
- <div className="w-3 h-3 bg-gray-800 rounded-full" />
249
- <span className="text-sm">Social</span>
250
  </div>
251
- <span className="text-sm font-semibold">30%</span>
252
- </div>
253
- <div className="flex items-center justify-between">
254
- <div className="flex items-center gap-2">
255
- <div className="w-3 h-3 bg-gray-700 rounded-full" />
256
- <span className="text-sm">Referral</span>
257
- </div>
258
- <span className="text-sm font-semibold">25%</span>
259
- </div>
260
- </div>
261
  </motion.div>
262
  </div>
263
-
264
- {/* Recent Activity */}
265
- <motion.div
266
- initial={{ opacity: 0, y: 20 }}
267
- animate={{ opacity: 1, y: 0 }}
268
- transition={{ delay: 0.6 }}
269
- className="bg-white dark:bg-gray-900 rounded-xl p-6 shadow-sm"
270
- >
271
- <h3 className="text-lg font-semibold mb-4">Recent Activity</h3>
272
- <div className="space-y-4">
273
- {[...Array(5)].map((_, i) => (
274
- <div key={i} className="flex items-center gap-4 pb-4 border-b border-gray-100 dark:border-gray-800 last:border-0">
275
- <div className="w-10 h-10 bg-gray-100 dark:bg-gray-800 rounded-full" />
276
- <div className="flex-1">
277
- <p className="font-medium">User action occurred</p>
278
- <p className="text-sm text-gray-500">2 minutes ago</p>
279
- </div>
280
- <button className="text-sm text-gray-400 dark:text-gray-400">View</button>
281
- </div>
282
- ))}
283
- </div>
284
- </motion.div>
285
  </div>
286
  </main>
287
  </div>
288
  )
289
- }
 
 
 
1
  import { motion } from 'framer-motion'
2
+ import {
3
+ Button,
4
+ Card,
5
+ CardContent,
6
+ CardDescription,
7
+ CardHeader,
8
+ CardTitle,
9
+ Badge
10
+ } from '@hanzo/ui/primitives'
11
+ import { HanzoLogo } from '@/components/logo'
12
  import {
13
  BarChart3, TrendingUp, Users, DollarSign, Activity,
14
  Calendar, Filter, Download, Settings, Bell, Search,
15
  ArrowUp, ArrowDown, MoreVertical
16
  } from 'lucide-react'
17
 
18
+ const AnalyticsDashTemplate: React.FC = () => {
19
  return (
20
+ <div className="min-h-screen bg-background">
21
  {/* Sidebar */}
22
+ <aside className="fixed left-0 top-0 h-full w-64 bg-card border-r border-border">
23
  <div className="p-6">
24
  <div className="flex items-center gap-3 mb-8">
25
+ <div className="w-10 h-10 bg-gradient-to-br from-foreground to-muted-foreground rounded-lg flex items-center justify-center">
26
+ <BarChart3 className="w-6 h-6 text-background" />
27
  </div>
28
  <span className="text-xl font-bold">Analytics Pro</span>
29
  </div>
 
41
  key={i}
42
  className={`w-full flex items-center gap-3 px-3 py-2 rounded-lg transition-colors ${
43
  item.active
44
+ ? 'bg-muted text-foreground'
45
+ : 'hover:bg-muted/50'
46
  }`}
47
  >
48
  <item.icon className="w-5 h-5" />
 
56
  {/* Main Content */}
57
  <main className="ml-64">
58
  {/* Top Bar */}
59
+ <header className="bg-card border-b border-border">
60
  <div className="px-8 py-4 flex items-center justify-between">
61
  <div className="flex items-center gap-4 flex-1">
62
  <div className="relative flex-1 max-w-md">
63
+ <Search className="absolute left-3 top-1/2 -translate-y-1/2 w-5 h-5 text-muted-foreground" />
64
  <input
65
  type="text"
66
  placeholder="Search..."
67
+ className="w-full pl-10 pr-4 py-2 bg-muted rounded-lg"
68
  />
69
  </div>
70
+ <Button variant="outline" className="flex items-center gap-2">
71
  <Calendar className="w-4 h-4" />
72
  <span>Last 30 days</span>
73
+ </Button>
74
+ <Button variant="ghost" size="square">
75
  <Filter className="w-5 h-5" />
76
+ </Button>
77
  </div>
78
  <div className="flex items-center gap-3">
79
+ <Button variant="ghost" size="square" className="relative">
80
  <Bell className="w-5 h-5" />
81
+ <div className="absolute top-1 right-1 w-2 h-2 bg-foreground rounded-full" />
82
+ </Button>
83
+ <Button variant="default" className="flex items-center gap-2">
84
  <Download className="w-4 h-4" />
85
  Export
86
+ </Button>
87
  </div>
88
  </div>
89
  </header>
 
98
  value: "$45,231",
99
  change: "+20.1%",
100
  trend: "up",
101
+ icon: DollarSign
 
102
  },
103
  {
104
  title: "Active Users",
105
  value: "2,543",
106
  change: "+18.2%",
107
  trend: "up",
108
+ icon: Users
 
109
  },
110
  {
111
+ title: "Conversion",
112
+ value: "3.42%",
113
  change: "-5.4%",
114
  trend: "down",
115
+ icon: TrendingUp
 
116
  },
117
  {
118
  title: "Avg. Session",
119
  value: "4m 32s",
120
  change: "+12.3%",
121
  trend: "up",
122
+ icon: Activity
 
123
  }
124
  ].map((stat, i) => (
125
  <motion.div
 
127
  initial={{ opacity: 0, y: 20 }}
128
  animate={{ opacity: 1, y: 0 }}
129
  transition={{ delay: i * 0.1 }}
 
130
  >
131
+ <Card>
132
+ <CardContent className="p-6">
133
+ <div className="flex items-start justify-between mb-4">
134
+ <div className="w-12 h-12 bg-gradient-to-br from-foreground/10 to-foreground/20 rounded-lg flex items-center justify-center">
135
+ <stat.icon className="w-6 h-6 text-foreground" />
136
+ </div>
137
+ <Button variant="ghost" size="square" className="h-8 w-8">
138
+ <MoreVertical className="w-4 h-4" />
139
+ </Button>
140
+ </div>
141
+ <h3 className="text-2xl font-bold mb-1">{stat.value}</h3>
142
+ <p className="text-sm text-muted-foreground mb-2">{stat.title}</p>
143
+ <div className="flex items-center gap-1">
144
+ {stat.trend === "up" ? (
145
+ <ArrowUp className="w-4 h-4 text-green-500" />
146
+ ) : (
147
+ <ArrowDown className="w-4 h-4 text-red-500" />
148
+ )}
149
+ <span className={`text-sm font-medium ${
150
+ stat.trend === "up" ? "text-green-500" : "text-red-500"
151
+ }`}>
152
+ {stat.change}
153
+ </span>
154
+ <span className="text-sm text-muted-foreground">vs last month</span>
155
+ </div>
156
+ </CardContent>
157
+ </Card>
158
  </motion.div>
159
  ))}
160
  </div>
161
 
162
  {/* Charts */}
163
+ <div className="grid grid-cols-3 gap-6">
 
164
  <motion.div
165
  initial={{ opacity: 0, scale: 0.95 }}
166
  animate={{ opacity: 1, scale: 1 }}
167
  transition={{ delay: 0.4 }}
168
+ className="col-span-2"
169
  >
170
+ <Card>
171
+ <CardHeader>
172
+ <div className="flex items-center justify-between">
173
+ <div>
174
+ <CardTitle>Revenue Overview</CardTitle>
175
+ <CardDescription>Monthly revenue trends</CardDescription>
 
 
 
 
 
 
 
 
 
 
176
  </div>
177
+ <Button variant="outline" size="sm">View Details</Button>
178
  </div>
179
+ </CardHeader>
180
+ <CardContent>
181
+ <div className="h-[300px] flex items-end gap-2">
182
+ {[...Array(12)].map((_, i) => (
183
+ <div
184
+ key={i}
185
+ className="flex-1 bg-gradient-to-t from-foreground/20 to-foreground/10 rounded-t"
186
+ style={{ height: `${Math.random() * 80 + 20}%` }}
187
+ />
188
+ ))}
189
+ </div>
190
+ </CardContent>
191
+ </Card>
192
  </motion.div>
193
 
 
194
  <motion.div
195
  initial={{ opacity: 0, scale: 0.95 }}
196
  animate={{ opacity: 1, scale: 1 }}
197
  transition={{ delay: 0.5 }}
 
198
  >
199
+ <Card className="h-full">
200
+ <CardHeader>
201
+ <CardTitle>Top Products</CardTitle>
202
+ <CardDescription>Best performing items</CardDescription>
203
+ </CardHeader>
204
+ <CardContent>
205
+ <div className="space-y-4">
206
+ {[
207
+ { name: "Product A", sales: 234, revenue: "$12,345" },
208
+ { name: "Product B", sales: 189, revenue: "$9,876" },
209
+ { name: "Product C", sales: 156, revenue: "$7,654" },
210
+ { name: "Product D", sales: 123, revenue: "$5,432" }
211
+ ].map((product, i) => (
212
+ <div key={i} className="flex items-center justify-between">
213
+ <div>
214
+ <p className="font-medium">{product.name}</p>
215
+ <p className="text-sm text-muted-foreground">{product.sales} sales</p>
216
+ </div>
217
+ <p className="font-bold">{product.revenue}</p>
218
+ </div>
219
+ ))}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
220
  </div>
221
+ </CardContent>
222
+ </Card>
 
 
 
 
 
 
 
 
223
  </motion.div>
224
  </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
225
  </div>
226
  </main>
227
  </div>
228
  )
229
+ }
230
+
231
+ export default AnalyticsDashTemplate
templates/api-docs.tsx ADDED
@@ -0,0 +1,311 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { motion } from 'framer-motion'
2
+ import { Button, Card, CardContent, CardDescription, CardHeader, CardTitle, Badge } from '@hanzo/ui/primitives'
3
+ import { HanzoLogo } from '@/components/logo'
4
+ import { Book, Code2, Terminal, FileJson, Key, Shield, Zap, Globe, GitBranch, Clock, CheckCircle, Copy, ChevronRight, Database, Cloud } from 'lucide-react'
5
+
6
+ export default function ApiDocsTemplate() {
7
+ return (
8
+ <div className="min-h-screen bg-black text-white">
9
+ {/* Animated Background */}
10
+ <div className="fixed inset-0 overflow-hidden">
11
+ <div className="absolute inset-0 bg-gradient-to-br from-gray-950 via-black to-gray-950" />
12
+ {/* Grid pattern */}
13
+ <div className="absolute inset-0 opacity-10">
14
+ <div className="absolute inset-0" style={{
15
+ backgroundImage: `linear-gradient(to right, white 1px, transparent 1px),
16
+ linear-gradient(to bottom, white 1px, transparent 1px)`,
17
+ backgroundSize: '50px 50px'
18
+ }} />
19
+ </div>
20
+ </div>
21
+
22
+ {/* Header */}
23
+ <header className="relative z-10 p-8">
24
+ <nav className="flex justify-between items-center">
25
+ <div className="flex items-center gap-3">
26
+ <div className="w-10 h-10 bg-white rounded-lg flex items-center justify-center">
27
+ <HanzoLogo className="w-6 h-6 text-black" />
28
+ </div>
29
+ <span className="text-xl font-bold">Hanzo API</span>
30
+ </div>
31
+ <div className="flex gap-2">
32
+ <Button variant="ghost" className="text-white hover:text-black hover:bg-white">
33
+ Guides
34
+ </Button>
35
+ <Button variant="ghost" className="text-white hover:text-black hover:bg-white">
36
+ Reference
37
+ </Button>
38
+ <Button className="bg-white text-black hover:bg-gray-200">
39
+ Get API Key
40
+ </Button>
41
+ </div>
42
+ </nav>
43
+ </header>
44
+
45
+ {/* Hero Section */}
46
+ <section className="relative z-10 px-8 py-16">
47
+ <motion.div
48
+ initial={{ opacity: 0, y: 20 }}
49
+ animate={{ opacity: 1, y: 0 }}
50
+ className="max-w-4xl mx-auto text-center"
51
+ >
52
+ <Badge variant="secondary" className="mb-6 bg-white/10 text-white border-white/20">
53
+ <Terminal className="w-4 h-4 mr-2" />
54
+ RESTful & GraphQL APIs
55
+ </Badge>
56
+
57
+ <h1 className="text-6xl md:text-7xl font-bold mb-6">
58
+ <span className="bg-gradient-to-r from-white to-gray-400 bg-clip-text text-transparent">
59
+ Developer-First
60
+ </span>
61
+ <br />
62
+ <span className="text-white">API Platform</span>
63
+ </h1>
64
+
65
+ <p className="text-xl text-gray-400 mb-12 max-w-2xl mx-auto">
66
+ Comprehensive API documentation with interactive examples, SDKs for every language,
67
+ and real-time testing playground.
68
+ </p>
69
+
70
+ {/* Code Example */}
71
+ <Card className="bg-gray-950/80 border-gray-800 backdrop-blur-xl text-left">
72
+ <CardHeader className="bg-gray-900/80 border-b border-gray-800">
73
+ <div className="flex items-center justify-between">
74
+ <div className="flex gap-4">
75
+ <button className="text-white text-sm font-medium">cURL</button>
76
+ <button className="text-gray-500 text-sm">JavaScript</button>
77
+ <button className="text-gray-500 text-sm">Python</button>
78
+ <button className="text-gray-500 text-sm">Go</button>
79
+ </div>
80
+ <Button size="sm" variant="ghost" className="text-gray-400 hover:text-white">
81
+ <Copy className="w-4 h-4" />
82
+ </Button>
83
+ </div>
84
+ </CardHeader>
85
+ <CardContent className="p-6">
86
+ <pre className="text-sm font-mono">
87
+ <code>
88
+ <span className="text-gray-400">curl</span> <span className="text-gray-300">-X POST</span> <span className="text-white">https://api.hanzo.ai/v1/chat</span> \{"\n"}
89
+ {" "}<span className="text-gray-300">-H</span> <span className="text-gray-400">"Authorization: Bearer $HANZO_API_KEY"</span> \{"\n"}
90
+ {" "}<span className="text-gray-300">-H</span> <span className="text-gray-400">"Content-Type: application/json"</span> \{"\n"}
91
+ {" "}<span className="text-gray-300">-d</span> <span className="text-gray-400">'{"{"}</span>{"\n"}
92
+ {" "}<span className="text-gray-400">"model":</span> <span className="text-gray-300">"gpt-4"</span>,{"\n"}
93
+ {" "}<span className="text-gray-400">"messages":</span> [{"{"}{"\n"}
94
+ {" "}<span className="text-gray-400">"role":</span> <span className="text-gray-300">"user"</span>,{"\n"}
95
+ {" "}<span className="text-gray-400">"content":</span> <span className="text-gray-300">"Hello, API!"</span>{"\n"}
96
+ {" "}{"}"]}]{"\n"}
97
+ {" "}{"}'"}
98
+ </code>
99
+ </pre>
100
+ </CardContent>
101
+ </Card>
102
+ </motion.div>
103
+ </section>
104
+
105
+ {/* Quick Start */}
106
+ <section className="relative z-10 px-8 py-16">
107
+ <div className="max-w-6xl mx-auto">
108
+ <h2 className="text-3xl font-bold text-center mb-12">
109
+ <span className="bg-gradient-to-r from-white to-gray-400 bg-clip-text text-transparent">
110
+ Get Started in Minutes
111
+ </span>
112
+ </h2>
113
+ <div className="grid md:grid-cols-3 gap-6">
114
+ {[
115
+ {
116
+ step: "1",
117
+ title: "Get Your API Key",
118
+ desc: "Sign up and generate your API key from the dashboard",
119
+ icon: Key
120
+ },
121
+ {
122
+ step: "2",
123
+ title: "Install SDK",
124
+ desc: "Choose from our official SDKs or use REST directly",
125
+ icon: Code2
126
+ },
127
+ {
128
+ step: "3",
129
+ title: "Make Your First Call",
130
+ desc: "Start making API calls with our interactive examples",
131
+ icon: Zap
132
+ }
133
+ ].map((item, i) => (
134
+ <motion.div
135
+ key={i}
136
+ initial={{ opacity: 0, y: 20 }}
137
+ animate={{ opacity: 1, y: 0 }}
138
+ transition={{ delay: 0.1 * i }}
139
+ >
140
+ <Card className="bg-gray-950/50 border-gray-800 hover:border-white/20 transition-all backdrop-blur-xl h-full">
141
+ <CardContent className="p-6">
142
+ <div className="flex items-center gap-4 mb-4">
143
+ <div className="w-12 h-12 bg-gradient-to-br from-gray-700 to-gray-800 rounded-full flex items-center justify-center text-white font-bold">
144
+ {item.step}
145
+ </div>
146
+ <item.icon className="w-6 h-6 text-white" />
147
+ </div>
148
+ <h3 className="text-lg font-semibold text-white mb-2">{item.title}</h3>
149
+ <p className="text-sm text-gray-400">{item.desc}</p>
150
+ </CardContent>
151
+ </Card>
152
+ </motion.div>
153
+ ))}
154
+ </div>
155
+ </div>
156
+ </section>
157
+
158
+ {/* API Endpoints */}
159
+ <section className="relative z-10 px-8 py-16">
160
+ <div className="max-w-6xl mx-auto">
161
+ <Card className="bg-gray-950/80 border-gray-800 backdrop-blur-xl">
162
+ <CardHeader>
163
+ <CardTitle className="text-2xl text-white">Popular Endpoints</CardTitle>
164
+ <CardDescription className="text-gray-400">
165
+ Explore our most-used API endpoints
166
+ </CardDescription>
167
+ </CardHeader>
168
+ <CardContent className="space-y-4">
169
+ {[
170
+ { method: "POST", path: "/v1/chat/completions", desc: "Generate chat completions", status: "stable" },
171
+ { method: "POST", path: "/v1/embeddings", desc: "Create text embeddings", status: "stable" },
172
+ { method: "GET", path: "/v1/models", desc: "List available models", status: "stable" },
173
+ { method: "POST", path: "/v1/images/generations", desc: "Generate images from text", status: "beta" },
174
+ { method: "POST", path: "/v1/audio/transcriptions", desc: "Transcribe audio to text", status: "stable" },
175
+ { method: "GET", path: "/v1/usage", desc: "Get usage statistics", status: "stable" }
176
+ ].map((endpoint, i) => (
177
+ <motion.div
178
+ key={i}
179
+ initial={{ opacity: 0, x: -20 }}
180
+ animate={{ opacity: 1, x: 0 }}
181
+ transition={{ delay: 0.05 * i }}
182
+ className="flex items-center justify-between p-4 bg-gray-900/50 border border-gray-800 rounded-lg hover:border-white/20 transition-colors group"
183
+ >
184
+ <div className="flex items-center gap-4">
185
+ <Badge className={`
186
+ ${endpoint.method === 'GET' ? 'bg-blue-500/20 text-blue-400' : 'bg-green-500/20 text-green-400'}
187
+ border-0 font-mono
188
+ `}>
189
+ {endpoint.method}
190
+ </Badge>
191
+ <div>
192
+ <code className="text-sm text-white">{endpoint.path}</code>
193
+ <p className="text-xs text-gray-500 mt-1">{endpoint.desc}</p>
194
+ </div>
195
+ </div>
196
+ <div className="flex items-center gap-2">
197
+ <Badge className={`
198
+ ${endpoint.status === 'stable' ? 'bg-green-500/20 text-green-400' : 'bg-yellow-500/20 text-yellow-400'}
199
+ border-0 text-xs
200
+ `}>
201
+ {endpoint.status}
202
+ </Badge>
203
+ <ChevronRight className="w-4 h-4 text-gray-500 group-hover:text-white transition-colors" />
204
+ </div>
205
+ </motion.div>
206
+ ))}
207
+ </CardContent>
208
+ </Card>
209
+ </div>
210
+ </section>
211
+
212
+ {/* Features */}
213
+ <section className="relative z-10 px-8 py-16">
214
+ <div className="max-w-6xl mx-auto">
215
+ <h2 className="text-3xl font-bold text-center mb-12">
216
+ <span className="bg-gradient-to-r from-white to-gray-400 bg-clip-text text-transparent">
217
+ Enterprise-Grade Features
218
+ </span>
219
+ </h2>
220
+ <div className="grid md:grid-cols-4 gap-4">
221
+ {[
222
+ { icon: Shield, title: "Authentication", desc: "OAuth 2.0 & API Keys" },
223
+ { icon: Clock, title: "Rate Limiting", desc: "Configurable limits" },
224
+ { icon: Globe, title: "Global CDN", desc: "Low latency worldwide" },
225
+ { icon: GitBranch, title: "Versioning", desc: "Stable API versions" },
226
+ { icon: FileJson, title: "JSON & GraphQL", desc: "Multiple formats" },
227
+ { icon: Database, title: "Webhooks", desc: "Real-time events" },
228
+ { icon: Cloud, title: "99.9% Uptime", desc: "High availability" },
229
+ { icon: CheckCircle, title: "Type Safety", desc: "OpenAPI 3.0 spec" }
230
+ ].map((feature, i) => (
231
+ <motion.div
232
+ key={i}
233
+ initial={{ opacity: 0, scale: 0.9 }}
234
+ animate={{ opacity: 1, scale: 1 }}
235
+ transition={{ delay: 0.03 * i }}
236
+ >
237
+ <Card className="bg-gray-950/50 border-gray-800 hover:border-white/20 transition-all backdrop-blur-xl h-full">
238
+ <CardContent className="p-4">
239
+ <feature.icon className="w-6 h-6 text-white mb-2" />
240
+ <div className="text-sm font-semibold text-white">{feature.title}</div>
241
+ <div className="text-xs text-gray-400 mt-1">{feature.desc}</div>
242
+ </CardContent>
243
+ </Card>
244
+ </motion.div>
245
+ ))}
246
+ </div>
247
+ </div>
248
+ </section>
249
+
250
+ {/* SDK Section */}
251
+ <section className="relative z-10 px-8 py-16">
252
+ <Card className="max-w-4xl mx-auto bg-gray-950/80 border-gray-800 backdrop-blur-xl">
253
+ <CardHeader className="text-center">
254
+ <CardTitle className="text-2xl text-white">Official SDKs</CardTitle>
255
+ <CardDescription className="text-gray-400">
256
+ Native libraries for your favorite language
257
+ </CardDescription>
258
+ </CardHeader>
259
+ <CardContent>
260
+ <div className="grid grid-cols-2 md:grid-cols-4 gap-4">
261
+ {[
262
+ { name: 'Python', cmd: 'pip install hanzo' },
263
+ { name: 'JavaScript', cmd: 'npm install @hanzo/sdk' },
264
+ { name: 'Go', cmd: 'go get github.com/hanzo/go' },
265
+ { name: 'Rust', cmd: 'cargo add hanzo' },
266
+ { name: 'Ruby', cmd: 'gem install hanzo' },
267
+ { name: 'PHP', cmd: 'composer require hanzo/sdk' },
268
+ { name: 'Java', cmd: 'implementation "ai.hanzo:sdk"' },
269
+ { name: '.NET', cmd: 'dotnet add package Hanzo' }
270
+ ].map((sdk, i) => (
271
+ <motion.div
272
+ key={i}
273
+ initial={{ opacity: 0, y: 10 }}
274
+ animate={{ opacity: 1, y: 0 }}
275
+ transition={{ delay: 0.03 * i }}
276
+ className="bg-gray-900/50 border border-gray-800 rounded-lg p-3 hover:border-white/20 transition-colors"
277
+ >
278
+ <div className="text-sm font-semibold text-white mb-1">{sdk.name}</div>
279
+ <code className="text-xs text-gray-500">{sdk.cmd}</code>
280
+ </motion.div>
281
+ ))}
282
+ </div>
283
+ </CardContent>
284
+ </Card>
285
+ </section>
286
+
287
+ {/* CTA Section */}
288
+ <section className="relative z-10 px-8 py-16 text-center">
289
+ <Card className="max-w-4xl mx-auto bg-gradient-to-r from-gray-900 to-gray-950 border-gray-800">
290
+ <CardContent className="p-12">
291
+ <Book className="w-12 h-12 text-white mx-auto mb-6" />
292
+ <h2 className="text-4xl font-bold text-white mb-6">
293
+ Build Something Amazing
294
+ </h2>
295
+ <p className="text-xl text-gray-400 mb-8">
296
+ Start with 1M free API calls per month. No credit card required.
297
+ </p>
298
+ <div className="flex gap-4 justify-center">
299
+ <Button size="lg" className="bg-white text-black hover:bg-gray-200">
300
+ Start Building
301
+ </Button>
302
+ <Button size="lg" variant="outline" className="border-white text-white hover:bg-white hover:text-black">
303
+ View Full Docs
304
+ </Button>
305
+ </div>
306
+ </CardContent>
307
+ </Card>
308
+ </section>
309
+ </div>
310
+ )
311
+ }
templates/devforge.tsx CHANGED
@@ -1,18 +1,26 @@
1
  import { motion } from 'framer-motion'
2
- import { Button, Card, CardContent, CardDescription, CardHeader, CardTitle, Badge } from '@hanzo/ui/primitives'
 
 
 
 
 
 
 
 
3
  import { HanzoLogo } from '@/components/logo'
4
  import { Code2, Zap, Shield, Globe, Users, Terminal, Cloud, Sparkles } from 'lucide-react'
5
 
6
- export default function DevForgeTemplate() {
7
  return (
8
- <div className="min-h-screen bg-black text-white">
9
  {/* Animated Background */}
10
  <div className="fixed inset-0 overflow-hidden">
11
- <div className="absolute inset-0 bg-gradient-to-br from-gray-950 via-black to-gray-950" />
12
  {[...Array(30)].map((_, i) => (
13
  <div
14
  key={i}
15
- className="absolute w-2 h-2 bg-white/10 rounded-full animate-pulse"
16
  style={{
17
  left: `${Math.random() * 100}%`,
18
  top: `${Math.random() * 100}%`,
@@ -27,19 +35,19 @@ export default function DevForgeTemplate() {
27
  <header className="relative z-10 p-8">
28
  <nav className="flex justify-between items-center">
29
  <div className="flex items-center gap-3">
30
- <div className="w-10 h-10 bg-white rounded-lg flex items-center justify-center">
31
- <HanzoLogo className="w-6 h-6 text-black" />
32
  </div>
33
  <span className="text-xl font-bold">Hanzo DevForge</span>
34
  </div>
35
  <div className="flex gap-2">
36
- <Button variant="ghost" className="text-white hover:text-black hover:bg-white">
37
  Features
38
  </Button>
39
- <Button variant="ghost" className="text-white hover:text-black hover:bg-white">
40
  Pricing
41
  </Button>
42
- <Button className="bg-white text-black hover:bg-gray-200">
43
  Get Started
44
  </Button>
45
  </div>
@@ -52,58 +60,58 @@ export default function DevForgeTemplate() {
52
  initial={{ opacity: 0, y: 20 }}
53
  animate={{ opacity: 1, y: 0 }}
54
  >
55
- <Badge variant="secondary" className="mb-6 bg-white/10 text-white border-white/20">
56
  <Sparkles className="w-4 h-4 mr-2" />
57
  AI-Powered Development
58
  </Badge>
59
 
60
  <h1 className="text-6xl md:text-7xl font-bold mb-6">
61
- <span className="bg-gradient-to-r from-white to-gray-400 bg-clip-text text-transparent">
62
  Code Smarter
63
  </span>
64
  <br />
65
- <span className="text-white">Ship Faster</span>
66
  </h1>
67
 
68
- <p className="text-xl text-gray-400 mb-12 max-w-2xl mx-auto">
69
  The ultimate developer platform with AI-powered tools, real-time collaboration,
70
  and lightning-fast deployment.
71
  </p>
72
 
73
  {/* Code Preview */}
74
- <Card className="max-w-4xl mx-auto bg-gray-950/80 border-gray-800 backdrop-blur-xl">
75
- <CardHeader className="bg-gray-900/80 border-b border-gray-800">
76
  <div className="flex items-center gap-2">
77
  <div className="flex gap-2">
78
- <div className="w-3 h-3 bg-gray-600 rounded-full" />
79
- <div className="w-3 h-3 bg-gray-500 rounded-full" />
80
- <div className="w-3 h-3 bg-gray-400 rounded-full" />
81
  </div>
82
- <span className="text-sm text-gray-400 ml-auto">main.tsx</span>
83
  </div>
84
  </CardHeader>
85
  <CardContent className="p-6">
86
  <pre className="text-sm font-mono">
87
  <code>
88
- <span className="text-gray-400">import</span>{" "}
89
- <span className="text-white">{'{ HanzoAI }'}</span>{" "}
90
- <span className="text-gray-400">from</span>{" "}
91
- <span className="text-gray-300">'@hanzo/ai'</span>
92
  {"\n\n"}
93
- <span className="text-gray-400">function</span>{" "}
94
- <span className="text-white">App</span>() {"{"}
95
  {"\n "}
96
- <span className="text-gray-400">const</span> ai ={" "}
97
- <span className="text-white">new HanzoAI</span>()
98
  {"\n "}
99
  {"\n "}
100
- <span className="text-gray-500">// Generate code with AI</span>
101
  {"\n "}
102
- <span className="text-gray-400">const</span> code ={" "}
103
- <span className="text-gray-400">await</span> ai.
104
- <span className="text-white">generate</span>({"{"}
105
- {"\n "}prompt: <span className="text-gray-300">"Create a REST API"</span>,
106
- {"\n "}language: <span className="text-gray-300">"typescript"</span>
107
  {"\n "}{"}"})
108
  {"\n}"}
109
  </code>
@@ -130,13 +138,13 @@ export default function DevForgeTemplate() {
130
  animate={{ opacity: 1, y: 0 }}
131
  transition={{ delay: 0.1 * i }}
132
  >
133
- <Card className="bg-gray-950/50 border-gray-800 hover:border-white/20 transition-colors backdrop-blur-xl">
134
  <CardHeader>
135
- <feature.icon className="w-8 h-8 text-white mb-2" />
136
- <CardTitle className="text-white">{feature.title}</CardTitle>
137
  </CardHeader>
138
  <CardContent>
139
- <CardDescription className="text-gray-400">{feature.desc}</CardDescription>
140
  </CardContent>
141
  </Card>
142
  </motion.div>
@@ -146,15 +154,15 @@ export default function DevForgeTemplate() {
146
 
147
  {/* CTA Section */}
148
  <section className="relative z-10 px-8 py-16 text-center">
149
- <Card className="max-w-4xl mx-auto bg-gradient-to-r from-gray-900 to-gray-950 border-gray-800">
150
  <CardContent className="p-12">
151
- <h2 className="text-4xl font-bold text-white mb-6">
152
  Ready to 100x Your Development Speed?
153
  </h2>
154
- <p className="text-xl text-gray-400 mb-8">
155
  Join thousands of developers building the future with Hanzo DevForge
156
  </p>
157
- <Button size="lg" className="bg-white text-black hover:bg-gray-200">
158
  Start Free Trial
159
  </Button>
160
  </CardContent>
@@ -162,4 +170,6 @@ export default function DevForgeTemplate() {
162
  </section>
163
  </div>
164
  )
165
- }
 
 
 
1
  import { motion } from 'framer-motion'
2
+ import {
3
+ Button,
4
+ Card,
5
+ CardContent,
6
+ CardDescription,
7
+ CardHeader,
8
+ CardTitle,
9
+ Badge
10
+ } from '@hanzo/ui/primitives'
11
  import { HanzoLogo } from '@/components/logo'
12
  import { Code2, Zap, Shield, Globe, Users, Terminal, Cloud, Sparkles } from 'lucide-react'
13
 
14
+ const DevForgeTemplate: React.FC = () => {
15
  return (
16
+ <div className="min-h-screen bg-background text-foreground">
17
  {/* Animated Background */}
18
  <div className="fixed inset-0 overflow-hidden">
19
+ <div className="absolute inset-0 bg-gradient-to-br from-background via-background/95 to-background" />
20
  {[...Array(30)].map((_, i) => (
21
  <div
22
  key={i}
23
+ className="absolute w-2 h-2 bg-foreground/10 rounded-full animate-pulse"
24
  style={{
25
  left: `${Math.random() * 100}%`,
26
  top: `${Math.random() * 100}%`,
 
35
  <header className="relative z-10 p-8">
36
  <nav className="flex justify-between items-center">
37
  <div className="flex items-center gap-3">
38
+ <div className="w-10 h-10 bg-foreground rounded-lg flex items-center justify-center">
39
+ <HanzoLogo className="w-6 h-6 text-background" />
40
  </div>
41
  <span className="text-xl font-bold">Hanzo DevForge</span>
42
  </div>
43
  <div className="flex gap-2">
44
+ <Button variant="ghost">
45
  Features
46
  </Button>
47
+ <Button variant="ghost">
48
  Pricing
49
  </Button>
50
+ <Button variant="default">
51
  Get Started
52
  </Button>
53
  </div>
 
60
  initial={{ opacity: 0, y: 20 }}
61
  animate={{ opacity: 1, y: 0 }}
62
  >
63
+ <Badge variant="secondary" className="mb-6">
64
  <Sparkles className="w-4 h-4 mr-2" />
65
  AI-Powered Development
66
  </Badge>
67
 
68
  <h1 className="text-6xl md:text-7xl font-bold mb-6">
69
+ <span className="bg-gradient-to-r from-foreground to-muted-foreground bg-clip-text text-transparent">
70
  Code Smarter
71
  </span>
72
  <br />
73
+ <span className="text-foreground">Ship Faster</span>
74
  </h1>
75
 
76
+ <p className="text-xl text-muted-foreground mb-12 max-w-2xl mx-auto">
77
  The ultimate developer platform with AI-powered tools, real-time collaboration,
78
  and lightning-fast deployment.
79
  </p>
80
 
81
  {/* Code Preview */}
82
+ <Card className="max-w-4xl mx-auto bg-card/80 border-border backdrop-blur-xl">
83
+ <CardHeader className="bg-card/50 border-b border-border">
84
  <div className="flex items-center gap-2">
85
  <div className="flex gap-2">
86
+ <div className="w-3 h-3 bg-muted rounded-full" />
87
+ <div className="w-3 h-3 bg-muted rounded-full" />
88
+ <div className="w-3 h-3 bg-muted rounded-full" />
89
  </div>
90
+ <span className="text-sm text-muted-foreground ml-auto">main.tsx</span>
91
  </div>
92
  </CardHeader>
93
  <CardContent className="p-6">
94
  <pre className="text-sm font-mono">
95
  <code>
96
+ <span className="text-muted-foreground">import</span>{" "}
97
+ <span className="text-foreground">{'{ HanzoAI }'}</span>{" "}
98
+ <span className="text-muted-foreground">from</span>{" "}
99
+ <span className="text-muted-foreground">'@hanzo/ai'</span>
100
  {"\n\n"}
101
+ <span className="text-muted-foreground">function</span>{" "}
102
+ <span className="text-foreground">App</span>() {"{"}
103
  {"\n "}
104
+ <span className="text-muted-foreground">const</span> ai ={" "}
105
+ <span className="text-foreground">new HanzoAI</span>()
106
  {"\n "}
107
  {"\n "}
108
+ <span className="text-muted">// Generate code with AI</span>
109
  {"\n "}
110
+ <span className="text-muted-foreground">const</span> code ={" "}
111
+ <span className="text-muted-foreground">await</span> ai.
112
+ <span className="text-foreground">generate</span>({"{"}
113
+ {"\n "}prompt: <span className="text-muted-foreground">"Create a REST API"</span>,
114
+ {"\n "}language: <span className="text-muted-foreground">"typescript"</span>
115
  {"\n "}{"}"})
116
  {"\n}"}
117
  </code>
 
138
  animate={{ opacity: 1, y: 0 }}
139
  transition={{ delay: 0.1 * i }}
140
  >
141
+ <Card className="bg-card/50 border-border hover:border-foreground/20 transition-colors backdrop-blur-xl">
142
  <CardHeader>
143
+ <feature.icon className="w-8 h-8 text-foreground mb-2" />
144
+ <CardTitle className="text-foreground">{feature.title}</CardTitle>
145
  </CardHeader>
146
  <CardContent>
147
+ <CardDescription className="text-muted-foreground">{feature.desc}</CardDescription>
148
  </CardContent>
149
  </Card>
150
  </motion.div>
 
154
 
155
  {/* CTA Section */}
156
  <section className="relative z-10 px-8 py-16 text-center">
157
+ <Card className="max-w-4xl mx-auto bg-gradient-to-r from-card to-background border-border">
158
  <CardContent className="p-12">
159
+ <h2 className="text-4xl font-bold text-foreground mb-6">
160
  Ready to 100x Your Development Speed?
161
  </h2>
162
+ <p className="text-xl text-muted-foreground mb-8">
163
  Join thousands of developers building the future with Hanzo DevForge
164
  </p>
165
+ <Button size="lg" variant="default">
166
  Start Free Trial
167
  </Button>
168
  </CardContent>
 
170
  </section>
171
  </div>
172
  )
173
+ }
174
+
175
+ export default DevForgeTemplate
templates/ecommerce-dash.tsx ADDED
@@ -0,0 +1,278 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { motion } from 'framer-motion'
2
+ import { Button, Card, CardContent, CardDescription, CardHeader, CardTitle, Badge } from '@hanzo/ui/primitives'
3
+ import { HanzoLogo } from '@/components/logo'
4
+ import { ShoppingBag, TrendingUp, Users, Package, DollarSign, BarChart3, ShoppingCart, CreditCard, Truck, Store, Settings, Bell, ArrowUp, ArrowDown, Activity } from 'lucide-react'
5
+
6
+ export default function EcommerceDashTemplate() {
7
+ return (
8
+ <div className="min-h-screen bg-black text-white">
9
+ {/* Animated Background */}
10
+ <div className="fixed inset-0 overflow-hidden">
11
+ <div className="absolute inset-0 bg-gradient-to-br from-gray-950 via-black to-gray-950" />
12
+ <div className="absolute inset-0">
13
+ <div className="absolute top-1/4 left-1/4 w-96 h-96 bg-white/5 rounded-full blur-3xl animate-pulse" />
14
+ <div className="absolute bottom-1/4 right-1/4 w-96 h-96 bg-white/5 rounded-full blur-3xl animate-pulse" style={{ animationDelay: '2s' }} />
15
+ </div>
16
+ </div>
17
+
18
+ {/* Header */}
19
+ <header className="relative z-10 p-8">
20
+ <nav className="flex justify-between items-center">
21
+ <div className="flex items-center gap-3">
22
+ <div className="w-10 h-10 bg-white rounded-lg flex items-center justify-center">
23
+ <HanzoLogo className="w-6 h-6 text-black" />
24
+ </div>
25
+ <span className="text-xl font-bold">Hanzo Commerce</span>
26
+ </div>
27
+ <div className="flex gap-2">
28
+ <Button variant="ghost" className="text-white hover:text-black hover:bg-white">
29
+ <Bell className="w-4 h-4" />
30
+ </Button>
31
+ <Button variant="ghost" className="text-white hover:text-black hover:bg-white">
32
+ <Settings className="w-4 h-4" />
33
+ </Button>
34
+ <Button className="bg-white text-black hover:bg-gray-200">
35
+ View Store
36
+ </Button>
37
+ </div>
38
+ </nav>
39
+ </header>
40
+
41
+ {/* Hero Stats */}
42
+ <section className="relative z-10 px-8 py-8">
43
+ <motion.div
44
+ initial={{ opacity: 0, y: 20 }}
45
+ animate={{ opacity: 1, y: 0 }}
46
+ >
47
+ <div className="mb-8">
48
+ <h1 className="text-4xl font-bold mb-2">
49
+ <span className="bg-gradient-to-r from-white to-gray-400 bg-clip-text text-transparent">
50
+ Dashboard Overview
51
+ </span>
52
+ </h1>
53
+ <p className="text-gray-400">Welcome back! Here's what's happening with your store today.</p>
54
+ </div>
55
+
56
+ {/* Key Metrics */}
57
+ <div className="grid md:grid-cols-4 gap-6 mb-8">
58
+ {[
59
+ {
60
+ icon: DollarSign,
61
+ title: "Total Revenue",
62
+ value: "$48,392",
63
+ change: "+12.3%",
64
+ trend: "up",
65
+ color: "from-green-500 to-green-600"
66
+ },
67
+ {
68
+ icon: ShoppingCart,
69
+ title: "Orders",
70
+ value: "892",
71
+ change: "+5.7%",
72
+ trend: "up",
73
+ color: "from-blue-500 to-blue-600"
74
+ },
75
+ {
76
+ icon: Users,
77
+ title: "Customers",
78
+ value: "3,421",
79
+ change: "+18.2%",
80
+ trend: "up",
81
+ color: "from-purple-500 to-purple-600"
82
+ },
83
+ {
84
+ icon: Package,
85
+ title: "Products",
86
+ value: "156",
87
+ change: "-2.1%",
88
+ trend: "down",
89
+ color: "from-orange-500 to-orange-600"
90
+ }
91
+ ].map((stat, i) => (
92
+ <motion.div
93
+ key={i}
94
+ initial={{ opacity: 0, y: 20 }}
95
+ animate={{ opacity: 1, y: 0 }}
96
+ transition={{ delay: 0.1 * i }}
97
+ >
98
+ <Card className="bg-gray-950/50 border-gray-800 backdrop-blur-xl hover:border-white/20 transition-all">
99
+ <CardContent className="p-6">
100
+ <div className="flex items-center justify-between mb-4">
101
+ <div className={`w-12 h-12 bg-gradient-to-r ${stat.color} rounded-lg flex items-center justify-center`}>
102
+ <stat.icon className="w-6 h-6 text-white" />
103
+ </div>
104
+ <Badge className={`${stat.trend === 'up' ? 'bg-green-500/20 text-green-400' : 'bg-red-500/20 text-red-400'} border-0`}>
105
+ {stat.trend === 'up' ? <ArrowUp className="w-3 h-3 mr-1" /> : <ArrowDown className="w-3 h-3 mr-1" />}
106
+ {stat.change}
107
+ </Badge>
108
+ </div>
109
+ <div className="text-2xl font-bold text-white mb-1">{stat.value}</div>
110
+ <div className="text-sm text-gray-400">{stat.title}</div>
111
+ </CardContent>
112
+ </Card>
113
+ </motion.div>
114
+ ))}
115
+ </div>
116
+
117
+ {/* Charts Section */}
118
+ <div className="grid md:grid-cols-2 gap-6 mb-8">
119
+ {/* Sales Chart */}
120
+ <Card className="bg-gray-950/50 border-gray-800 backdrop-blur-xl">
121
+ <CardHeader>
122
+ <div className="flex items-center justify-between">
123
+ <div>
124
+ <CardTitle className="text-white">Sales Overview</CardTitle>
125
+ <CardDescription className="text-gray-400">Last 7 days performance</CardDescription>
126
+ </div>
127
+ <BarChart3 className="w-5 h-5 text-gray-400" />
128
+ </div>
129
+ </CardHeader>
130
+ <CardContent>
131
+ <div className="h-48 flex items-end justify-between gap-2">
132
+ {[65, 45, 78, 52, 89, 72, 95].map((height, i) => (
133
+ <motion.div
134
+ key={i}
135
+ className="flex-1 bg-gradient-to-t from-white/20 to-white/5 rounded-t"
136
+ initial={{ height: 0 }}
137
+ animate={{ height: `${height}%` }}
138
+ transition={{ delay: 0.1 * i, duration: 0.5 }}
139
+ />
140
+ ))}
141
+ </div>
142
+ <div className="flex justify-between mt-2">
143
+ {['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'].map((day) => (
144
+ <span key={day} className="text-xs text-gray-500">{day}</span>
145
+ ))}
146
+ </div>
147
+ </CardContent>
148
+ </Card>
149
+
150
+ {/* Activity Feed */}
151
+ <Card className="bg-gray-950/50 border-gray-800 backdrop-blur-xl">
152
+ <CardHeader>
153
+ <div className="flex items-center justify-between">
154
+ <div>
155
+ <CardTitle className="text-white">Recent Activity</CardTitle>
156
+ <CardDescription className="text-gray-400">Latest store events</CardDescription>
157
+ </div>
158
+ <Activity className="w-5 h-5 text-gray-400" />
159
+ </div>
160
+ </CardHeader>
161
+ <CardContent>
162
+ <div className="space-y-4">
163
+ {[
164
+ { icon: ShoppingBag, text: "New order #1234", time: "2 min ago", color: "text-green-400" },
165
+ { icon: Users, text: "New customer registered", time: "15 min ago", color: "text-blue-400" },
166
+ { icon: Package, text: "Product stock low", time: "1 hour ago", color: "text-yellow-400" },
167
+ { icon: CreditCard, text: "Payment received", time: "2 hours ago", color: "text-green-400" },
168
+ { icon: Truck, text: "Order shipped", time: "3 hours ago", color: "text-purple-400" }
169
+ ].map((activity, i) => (
170
+ <motion.div
171
+ key={i}
172
+ initial={{ opacity: 0, x: -20 }}
173
+ animate={{ opacity: 1, x: 0 }}
174
+ transition={{ delay: 0.1 * i }}
175
+ className="flex items-center gap-3"
176
+ >
177
+ <div className="w-8 h-8 bg-gray-900 rounded-full flex items-center justify-center">
178
+ <activity.icon className={`w-4 h-4 ${activity.color}`} />
179
+ </div>
180
+ <div className="flex-1">
181
+ <p className="text-sm text-gray-300">{activity.text}</p>
182
+ <p className="text-xs text-gray-500">{activity.time}</p>
183
+ </div>
184
+ </motion.div>
185
+ ))}
186
+ </div>
187
+ </CardContent>
188
+ </Card>
189
+ </div>
190
+
191
+ {/* Quick Actions */}
192
+ <div className="grid md:grid-cols-3 gap-6">
193
+ {[
194
+ { icon: Package, title: "Add Product", desc: "List new items in your store", action: "Add New" },
195
+ { icon: TrendingUp, title: "Marketing", desc: "Create campaigns and promotions", action: "Create" },
196
+ { icon: Store, title: "Store Settings", desc: "Customize your storefront", action: "Configure" }
197
+ ].map((action, i) => (
198
+ <motion.div
199
+ key={i}
200
+ initial={{ opacity: 0, y: 20 }}
201
+ animate={{ opacity: 1, y: 0 }}
202
+ transition={{ delay: 0.1 * i }}
203
+ >
204
+ <Card className="bg-gradient-to-br from-gray-900 to-gray-950 border-gray-800 hover:border-white/20 transition-all backdrop-blur-xl">
205
+ <CardContent className="p-6">
206
+ <action.icon className="w-8 h-8 text-white mb-4" />
207
+ <h3 className="text-lg font-semibold text-white mb-2">{action.title}</h3>
208
+ <p className="text-sm text-gray-400 mb-4">{action.desc}</p>
209
+ <Button size="sm" className="bg-white text-black hover:bg-gray-200">
210
+ {action.action}
211
+ </Button>
212
+ </CardContent>
213
+ </Card>
214
+ </motion.div>
215
+ ))}
216
+ </div>
217
+ </motion.div>
218
+ </section>
219
+
220
+ {/* Footer Stats */}
221
+ <section className="relative z-10 px-8 py-16">
222
+ <Card className="max-w-6xl mx-auto bg-gray-950/80 border-gray-800 backdrop-blur-xl">
223
+ <CardContent className="p-8">
224
+ <div className="text-center mb-6">
225
+ <h2 className="text-2xl font-bold text-white">Platform Performance</h2>
226
+ <p className="text-gray-400">Real-time metrics across all channels</p>
227
+ </div>
228
+ <div className="grid grid-cols-2 md:grid-cols-4 gap-6">
229
+ {[
230
+ { label: "Conversion Rate", value: "3.2%", change: "+0.5%" },
231
+ { label: "Avg Order Value", value: "$142", change: "+$12" },
232
+ { label: "Cart Abandonment", value: "68%", change: "-2%" },
233
+ { label: "Return Rate", value: "5.2%", change: "-0.3%" }
234
+ ].map((metric, i) => (
235
+ <motion.div
236
+ key={i}
237
+ initial={{ opacity: 0, scale: 0.9 }}
238
+ animate={{ opacity: 1, scale: 1 }}
239
+ transition={{ delay: 0.05 * i }}
240
+ className="text-center"
241
+ >
242
+ <div className="text-2xl font-bold text-white mb-1">{metric.value}</div>
243
+ <div className="text-sm text-gray-400 mb-1">{metric.label}</div>
244
+ <Badge className="bg-white/10 text-white border-white/20 text-xs">
245
+ {metric.change}
246
+ </Badge>
247
+ </motion.div>
248
+ ))}
249
+ </div>
250
+ </CardContent>
251
+ </Card>
252
+ </section>
253
+
254
+ {/* CTA Section */}
255
+ <section className="relative z-10 px-8 pb-16 text-center">
256
+ <Card className="max-w-4xl mx-auto bg-gradient-to-r from-gray-900 to-gray-950 border-gray-800">
257
+ <CardContent className="p-12">
258
+ <ShoppingBag className="w-12 h-12 text-white mx-auto mb-6" />
259
+ <h2 className="text-4xl font-bold text-white mb-6">
260
+ Grow Your Business with Hanzo
261
+ </h2>
262
+ <p className="text-xl text-gray-400 mb-8">
263
+ Everything you need to run a successful online store
264
+ </p>
265
+ <div className="flex gap-4 justify-center">
266
+ <Button size="lg" className="bg-white text-black hover:bg-gray-200">
267
+ Start Free Trial
268
+ </Button>
269
+ <Button size="lg" variant="outline" className="border-white text-white hover:bg-white hover:text-black">
270
+ Schedule Demo
271
+ </Button>
272
+ </div>
273
+ </CardContent>
274
+ </Card>
275
+ </section>
276
+ </div>
277
+ )
278
+ }
templates/index.tsx CHANGED
@@ -10,6 +10,36 @@ export { default as blog } from './blog'
10
  export { default as changelog } from './changelog'
11
  export { default as portfolio } from './portfolio'
12
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13
  // Fallback component for templates not yet implemented
14
  export const fallback = () => {
15
  return (
 
10
  export { default as changelog } from './changelog'
11
  export { default as portfolio } from './portfolio'
12
 
13
+ // New templates with hyphenated names
14
+ import AiChatTemplate from './ai-chat'
15
+ import SearchInterfaceTemplate from './search-interface'
16
+ import EcommerceDashTemplate from './ecommerce-dash'
17
+ import ApiDocsTemplate from './api-docs'
18
+
19
+ // Export with keys matching template IDs in template-data.ts
20
+ export const templates = {
21
+ 'devforge': devforge,
22
+ 'mobilefirst': mobilefirst,
23
+ 'saasify': saasify,
24
+ 'startupkit': startupkit,
25
+ 'analyticsdash': analyticsdash,
26
+ 'blog': blog,
27
+ 'changelog': changelog,
28
+ 'portfolio': portfolio,
29
+ 'ai-chat': AiChatTemplate,
30
+ 'search-interface': SearchInterfaceTemplate,
31
+ 'ecommerce-dash': EcommerceDashTemplate,
32
+ 'api-docs': ApiDocsTemplate
33
+ }
34
+
35
+ // Re-export for backward compatibility
36
+ export {
37
+ AiChatTemplate as aichat,
38
+ SearchInterfaceTemplate as searchinterface,
39
+ EcommerceDashTemplate as ecommercedash,
40
+ ApiDocsTemplate as apidocs
41
+ }
42
+
43
  // Fallback component for templates not yet implemented
44
  export const fallback = () => {
45
  return (
templates/mobilefirst.tsx CHANGED
@@ -1,22 +1,29 @@
1
  import { motion } from 'framer-motion'
2
- import { Button, Card, CardContent, CardHeader, CardTitle, Badge } from '@hanzo/ui/primitives'
 
 
 
 
 
 
 
3
  import { HanzoLogo } from '@/components/logo'
4
  import { Smartphone, Palette, Layers, Zap, Download, Share2 } from 'lucide-react'
5
 
6
- export default function MobileFirstTemplate() {
7
  return (
8
- <div className="min-h-screen bg-black text-white">
9
- <div className="min-h-screen bg-gradient-to-br from-gray-950 via-black to-gray-950">
10
  {/* Header */}
11
  <header className="p-8">
12
  <nav className="flex justify-between items-center">
13
  <div className="flex items-center gap-3">
14
- <div className="w-10 h-10 bg-white rounded-lg flex items-center justify-center">
15
- <HanzoLogo className="w-6 h-6 text-black" />
16
  </div>
17
- <span className="text-xl font-bold text-white">Hanzo MobileFirst</span>
18
  </div>
19
- <Button className="bg-white text-black hover:bg-gray-200">
20
  Start Building
21
  </Button>
22
  </nav>
@@ -31,28 +38,28 @@ export default function MobileFirstTemplate() {
31
  <h1 className="text-6xl font-bold mb-6">
32
  Build Native Apps
33
  <br />
34
- <span className="bg-gradient-to-r from-white to-gray-400 bg-clip-text text-transparent">
35
  Without Code
36
  </span>
37
  </h1>
38
- <p className="text-xl text-gray-400 mb-12 max-w-2xl mx-auto">
39
  Drag, drop, and deploy. Create stunning mobile apps with Hanzo's visual builder.
40
  </p>
41
 
42
  {/* Phone Mockup */}
43
  <div className="relative max-w-sm mx-auto">
44
- <div className="bg-gray-900 rounded-[3rem] p-2 shadow-2xl border border-gray-800">
45
- <div className="bg-gradient-to-br from-gray-800 to-gray-900 rounded-[2.5rem] h-[600px] flex items-center justify-center">
46
  <div className="text-center p-8">
47
  <motion.div
48
  animate={{ rotate: 360 }}
49
  transition={{ duration: 20, repeat: Infinity, ease: "linear" }}
50
- className="w-32 h-32 bg-white/10 backdrop-blur rounded-3xl mx-auto mb-6 flex items-center justify-center"
51
  >
52
- <HanzoLogo className="w-16 h-16 text-white" />
53
  </motion.div>
54
- <h3 className="text-2xl font-bold text-white mb-2">Your Hanzo App</h3>
55
- <p className="text-gray-400">Design beautiful mobile experiences</p>
56
  </div>
57
  </div>
58
  </div>
@@ -74,10 +81,10 @@ export default function MobileFirstTemplate() {
74
  animate={{ opacity: 1, y: 0 }}
75
  transition={{ delay: i * 0.1 }}
76
  >
77
- <Card className="bg-gray-950/50 border-gray-800 hover:border-white/20 transition-colors text-center">
78
  <CardHeader>
79
- <feature.icon className="w-12 h-12 mx-auto text-white" />
80
- <CardTitle className="text-white">{feature.title}</CardTitle>
81
  </CardHeader>
82
  </Card>
83
  </motion.div>
@@ -87,4 +94,6 @@ export default function MobileFirstTemplate() {
87
  </div>
88
  </div>
89
  )
90
- }
 
 
 
1
  import { motion } from 'framer-motion'
2
+ import {
3
+ Button,
4
+ Card,
5
+ CardContent,
6
+ CardHeader,
7
+ CardTitle,
8
+ Badge
9
+ } from '@hanzo/ui/primitives'
10
  import { HanzoLogo } from '@/components/logo'
11
  import { Smartphone, Palette, Layers, Zap, Download, Share2 } from 'lucide-react'
12
 
13
+ const MobileFirstTemplate: React.FC = () => {
14
  return (
15
+ <div className="min-h-screen bg-background text-foreground">
16
+ <div className="min-h-screen bg-gradient-to-br from-background via-background/95 to-background">
17
  {/* Header */}
18
  <header className="p-8">
19
  <nav className="flex justify-between items-center">
20
  <div className="flex items-center gap-3">
21
+ <div className="w-10 h-10 bg-foreground rounded-lg flex items-center justify-center">
22
+ <HanzoLogo className="w-6 h-6 text-background" />
23
  </div>
24
+ <span className="text-xl font-bold">Hanzo MobileFirst</span>
25
  </div>
26
+ <Button variant="default">
27
  Start Building
28
  </Button>
29
  </nav>
 
38
  <h1 className="text-6xl font-bold mb-6">
39
  Build Native Apps
40
  <br />
41
+ <span className="bg-gradient-to-r from-foreground to-muted-foreground bg-clip-text text-transparent">
42
  Without Code
43
  </span>
44
  </h1>
45
+ <p className="text-xl text-muted-foreground mb-12 max-w-2xl mx-auto">
46
  Drag, drop, and deploy. Create stunning mobile apps with Hanzo's visual builder.
47
  </p>
48
 
49
  {/* Phone Mockup */}
50
  <div className="relative max-w-sm mx-auto">
51
+ <div className="bg-card rounded-[3rem] p-2 shadow-2xl border border-border">
52
+ <div className="bg-gradient-to-br from-card/80 to-card rounded-[2.5rem] h-[600px] flex items-center justify-center">
53
  <div className="text-center p-8">
54
  <motion.div
55
  animate={{ rotate: 360 }}
56
  transition={{ duration: 20, repeat: Infinity, ease: "linear" }}
57
+ className="w-32 h-32 bg-foreground/10 backdrop-blur rounded-3xl mx-auto mb-6 flex items-center justify-center"
58
  >
59
+ <HanzoLogo className="w-16 h-16 text-foreground" />
60
  </motion.div>
61
+ <h3 className="text-2xl font-bold text-foreground mb-2">Your Hanzo App</h3>
62
+ <p className="text-muted-foreground">Design beautiful mobile experiences</p>
63
  </div>
64
  </div>
65
  </div>
 
81
  animate={{ opacity: 1, y: 0 }}
82
  transition={{ delay: i * 0.1 }}
83
  >
84
+ <Card className="bg-card/50 border-border hover:border-foreground/20 transition-colors text-center">
85
  <CardHeader>
86
+ <feature.icon className="w-12 h-12 mx-auto text-foreground" />
87
+ <CardTitle className="text-foreground">{feature.title}</CardTitle>
88
  </CardHeader>
89
  </Card>
90
  </motion.div>
 
94
  </div>
95
  </div>
96
  )
97
+ }
98
+
99
+ export default MobileFirstTemplate
templates/saasify.tsx CHANGED
@@ -1,21 +1,29 @@
1
  import { motion } from 'framer-motion'
2
- import { Button, Card, CardContent, CardDescription, CardHeader, CardTitle, Badge } from '@hanzo/ui/primitives'
 
 
 
 
 
 
 
 
3
  import { HanzoLogo } from '@/components/logo'
4
  import { CreditCard, Users, BarChart3, Shield, Zap, Globe } from 'lucide-react'
5
 
6
- export default function SaaSifyTemplate() {
7
  return (
8
- <div className="min-h-screen bg-black text-white">
9
  {/* Header */}
10
  <header className="p-8">
11
  <nav className="flex justify-between items-center">
12
  <div className="flex items-center gap-3">
13
- <div className="w-10 h-10 bg-white rounded-lg flex items-center justify-center">
14
- <HanzoLogo className="w-6 h-6 text-black" />
15
  </div>
16
- <span className="text-xl font-bold text-white">Hanzo SaaSify</span>
17
  </div>
18
- <Button className="bg-white text-black hover:bg-gray-200">
19
  Start Free Trial
20
  </Button>
21
  </nav>
@@ -28,13 +36,13 @@ export default function SaaSifyTemplate() {
28
  animate={{ opacity: 1, y: 0 }}
29
  >
30
  <h1 className="text-6xl font-bold mb-6">
31
- <span className="bg-gradient-to-r from-white to-gray-400 bg-clip-text text-transparent">
32
  Launch Your SaaS
33
  </span>
34
  <br />
35
- <span className="text-white">In Days, Not Months</span>
36
  </h1>
37
- <p className="text-xl text-gray-400 mb-12 max-w-2xl mx-auto">
38
  Complete SaaS boilerplate with authentication, billing, and everything you need to go to market 100x faster with Hanzo.
39
  </p>
40
  </motion.div>
@@ -52,13 +60,13 @@ export default function SaaSifyTemplate() {
52
  animate={{ opacity: 1, scale: 1 }}
53
  transition={{ delay: i * 0.1 }}
54
  >
55
- <Card className="bg-gray-950/50 border-gray-800 hover:border-white/20 transition-colors backdrop-blur-xl">
56
  <CardHeader>
57
- <feature.icon className="w-12 h-12 text-white mb-4" />
58
- <CardTitle className="text-white">{feature.title}</CardTitle>
59
  </CardHeader>
60
  <CardContent>
61
- <CardDescription className="text-gray-400">{feature.desc}</CardDescription>
62
  </CardContent>
63
  </Card>
64
  </motion.div>
@@ -80,12 +88,14 @@ export default function SaaSifyTemplate() {
80
  animate={{ opacity: 1, y: 0 }}
81
  transition={{ delay: 0.3 + i * 0.1 }}
82
  >
83
- <h3 className="text-4xl font-bold text-white mb-2">{stat.value}</h3>
84
- <p className="text-gray-400">{stat.label}</p>
85
  </motion.div>
86
  ))}
87
  </div>
88
  </section>
89
  </div>
90
  )
91
- }
 
 
 
1
  import { motion } from 'framer-motion'
2
+ import {
3
+ Button,
4
+ Card,
5
+ CardContent,
6
+ CardDescription,
7
+ CardHeader,
8
+ CardTitle,
9
+ Badge
10
+ } from '@hanzo/ui/primitives'
11
  import { HanzoLogo } from '@/components/logo'
12
  import { CreditCard, Users, BarChart3, Shield, Zap, Globe } from 'lucide-react'
13
 
14
+ const SaaSifyTemplate: React.FC = () => {
15
  return (
16
+ <div className="min-h-screen bg-background text-foreground">
17
  {/* Header */}
18
  <header className="p-8">
19
  <nav className="flex justify-between items-center">
20
  <div className="flex items-center gap-3">
21
+ <div className="w-10 h-10 bg-foreground rounded-lg flex items-center justify-center">
22
+ <HanzoLogo className="w-6 h-6 text-background" />
23
  </div>
24
+ <span className="text-xl font-bold">Hanzo SaaSify</span>
25
  </div>
26
+ <Button variant="default">
27
  Start Free Trial
28
  </Button>
29
  </nav>
 
36
  animate={{ opacity: 1, y: 0 }}
37
  >
38
  <h1 className="text-6xl font-bold mb-6">
39
+ <span className="bg-gradient-to-r from-foreground to-muted-foreground bg-clip-text text-transparent">
40
  Launch Your SaaS
41
  </span>
42
  <br />
43
+ <span className="text-foreground">In Days, Not Months</span>
44
  </h1>
45
+ <p className="text-xl text-muted-foreground mb-12 max-w-2xl mx-auto">
46
  Complete SaaS boilerplate with authentication, billing, and everything you need to go to market 100x faster with Hanzo.
47
  </p>
48
  </motion.div>
 
60
  animate={{ opacity: 1, scale: 1 }}
61
  transition={{ delay: i * 0.1 }}
62
  >
63
+ <Card className="bg-card/50 border-border hover:border-foreground/20 transition-colors backdrop-blur-xl">
64
  <CardHeader>
65
+ <feature.icon className="w-12 h-12 text-foreground mb-4" />
66
+ <CardTitle className="text-foreground">{feature.title}</CardTitle>
67
  </CardHeader>
68
  <CardContent>
69
+ <CardDescription className="text-muted-foreground">{feature.desc}</CardDescription>
70
  </CardContent>
71
  </Card>
72
  </motion.div>
 
88
  animate={{ opacity: 1, y: 0 }}
89
  transition={{ delay: 0.3 + i * 0.1 }}
90
  >
91
+ <h3 className="text-4xl font-bold text-foreground mb-2">{stat.value}</h3>
92
+ <p className="text-muted-foreground">{stat.label}</p>
93
  </motion.div>
94
  ))}
95
  </div>
96
  </section>
97
  </div>
98
  )
99
+ }
100
+
101
+ export default SaaSifyTemplate
templates/search-interface.tsx ADDED
@@ -0,0 +1,286 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { motion } from 'framer-motion'
2
+ import { Button, Card, CardContent, CardDescription, CardHeader, CardTitle, Badge } from '@hanzo/ui/primitives'
3
+ import { HanzoLogo } from '@/components/logo'
4
+ import { Search, Sparkles, Globe, Filter, History, TrendingUp, FileText, Image, Video, Music, Map, Calendar, BarChart, Shield, Zap } from 'lucide-react'
5
+
6
+ export default function SearchInterfaceTemplate() {
7
+ return (
8
+ <div className="min-h-screen bg-black text-white">
9
+ {/* Animated Background */}
10
+ <div className="fixed inset-0 overflow-hidden">
11
+ <div className="absolute inset-0 bg-gradient-to-br from-gray-950 via-black to-gray-950" />
12
+ <div className="absolute inset-0">
13
+ {[...Array(20)].map((_, i) => (
14
+ <motion.div
15
+ key={i}
16
+ className="absolute"
17
+ animate={{
18
+ x: [0, 100, 0],
19
+ y: [0, -50, 0],
20
+ opacity: [0.1, 0.3, 0.1]
21
+ }}
22
+ transition={{
23
+ duration: 10 + Math.random() * 10,
24
+ repeat: Infinity,
25
+ delay: Math.random() * 5
26
+ }}
27
+ style={{
28
+ left: `${Math.random() * 100}%`,
29
+ top: `${Math.random() * 100}%`
30
+ }}
31
+ >
32
+ <div className="w-64 h-64 bg-white/5 rounded-full blur-3xl" />
33
+ </motion.div>
34
+ ))}
35
+ </div>
36
+ </div>
37
+
38
+ {/* Header */}
39
+ <header className="relative z-10 p-8">
40
+ <nav className="flex justify-between items-center">
41
+ <div className="flex items-center gap-3">
42
+ <div className="w-10 h-10 bg-white rounded-lg flex items-center justify-center">
43
+ <HanzoLogo className="w-6 h-6 text-black" />
44
+ </div>
45
+ <span className="text-xl font-bold">Hanzo Search</span>
46
+ </div>
47
+ <div className="flex gap-2">
48
+ <Button variant="ghost" className="text-white hover:text-black hover:bg-white">
49
+ Features
50
+ </Button>
51
+ <Button variant="ghost" className="text-white hover:text-black hover:bg-white">
52
+ API
53
+ </Button>
54
+ <Button className="bg-white text-black hover:bg-gray-200">
55
+ Try Search
56
+ </Button>
57
+ </div>
58
+ </nav>
59
+ </header>
60
+
61
+ {/* Hero Section */}
62
+ <section className="relative z-10 px-8 py-16">
63
+ <motion.div
64
+ initial={{ opacity: 0, y: 20 }}
65
+ animate={{ opacity: 1, y: 0 }}
66
+ className="max-w-4xl mx-auto text-center"
67
+ >
68
+ <Badge variant="secondary" className="mb-6 bg-white/10 text-white border-white/20">
69
+ <Sparkles className="w-4 h-4 mr-2" />
70
+ AI-Powered Search
71
+ </Badge>
72
+
73
+ <h1 className="text-6xl md:text-7xl font-bold mb-6">
74
+ <span className="bg-gradient-to-r from-white to-gray-400 bg-clip-text text-transparent">
75
+ Search That
76
+ </span>
77
+ <br />
78
+ <span className="text-white">Understands You</span>
79
+ </h1>
80
+
81
+ <p className="text-xl text-gray-400 mb-12 max-w-2xl mx-auto">
82
+ Next-generation search with AI understanding, generative UI components,
83
+ and real-time answers from multiple sources.
84
+ </p>
85
+
86
+ {/* Search Bar */}
87
+ <Card className="bg-gray-950/80 border-gray-800 backdrop-blur-xl">
88
+ <CardContent className="p-2">
89
+ <div className="flex items-center gap-2">
90
+ <Search className="w-5 h-5 text-gray-400 ml-4" />
91
+ <input
92
+ type="text"
93
+ placeholder="Ask anything..."
94
+ className="flex-1 bg-transparent text-white placeholder-gray-500 outline-none py-4 text-lg"
95
+ />
96
+ <div className="flex gap-1 mr-2">
97
+ <Button size="sm" variant="ghost" className="text-gray-400 hover:text-white">
98
+ <Image className="w-4 h-4" />
99
+ </Button>
100
+ <Button size="sm" variant="ghost" className="text-gray-400 hover:text-white">
101
+ <FileText className="w-4 h-4" />
102
+ </Button>
103
+ </div>
104
+ <Button className="bg-white text-black hover:bg-gray-200">
105
+ Search
106
+ </Button>
107
+ </div>
108
+ </CardContent>
109
+ </Card>
110
+
111
+ {/* Quick Actions */}
112
+ <div className="flex gap-2 justify-center mt-4">
113
+ {['Weather today', 'Latest AI news', 'Stock NVDA', 'Recipe pasta'].map((query, i) => (
114
+ <motion.button
115
+ key={i}
116
+ initial={{ opacity: 0, y: 10 }}
117
+ animate={{ opacity: 1, y: 0 }}
118
+ transition={{ delay: 0.1 * i }}
119
+ className="px-3 py-1 bg-gray-900/50 border border-gray-800 rounded-full text-sm text-gray-400 hover:text-white hover:border-gray-600 transition-colors"
120
+ >
121
+ {query}
122
+ </motion.button>
123
+ ))}
124
+ </div>
125
+ </motion.div>
126
+ </section>
127
+
128
+ {/* Search Results Preview */}
129
+ <section className="relative z-10 px-8 py-16">
130
+ <div className="max-w-6xl mx-auto">
131
+ <div className="grid md:grid-cols-3 gap-6">
132
+ {/* Web Results */}
133
+ <Card className="bg-gray-950/50 border-gray-800 backdrop-blur-xl">
134
+ <CardHeader>
135
+ <Globe className="w-6 h-6 text-white mb-2" />
136
+ <CardTitle className="text-white">Web Results</CardTitle>
137
+ </CardHeader>
138
+ <CardContent className="space-y-3">
139
+ {[1, 2, 3].map((i) => (
140
+ <div key={i} className="border-l-2 border-gray-700 pl-3">
141
+ <div className="text-sm text-white mb-1">Result Title {i}</div>
142
+ <div className="text-xs text-gray-500">example.com</div>
143
+ <div className="text-xs text-gray-400 mt-1">
144
+ Brief preview of the search result content...
145
+ </div>
146
+ </div>
147
+ ))}
148
+ </CardContent>
149
+ </Card>
150
+
151
+ {/* AI Answer */}
152
+ <Card className="bg-gradient-to-br from-gray-900 to-gray-950 border-gray-800 backdrop-blur-xl">
153
+ <CardHeader>
154
+ <Sparkles className="w-6 h-6 text-white mb-2" />
155
+ <CardTitle className="text-white">AI Answer</CardTitle>
156
+ </CardHeader>
157
+ <CardContent>
158
+ <div className="space-y-3">
159
+ <p className="text-sm text-gray-300">
160
+ Based on multiple sources, here's a comprehensive answer to your question...
161
+ </p>
162
+ <div className="bg-gray-900/50 rounded p-3 border border-gray-800">
163
+ <code className="text-xs text-gray-400">
164
+ Generated from 15 sources
165
+ </code>
166
+ </div>
167
+ <div className="flex gap-2">
168
+ <Badge className="bg-white/10 text-white border-white/20 text-xs">
169
+ Verified
170
+ </Badge>
171
+ <Badge className="bg-white/10 text-white border-white/20 text-xs">
172
+ Up-to-date
173
+ </Badge>
174
+ </div>
175
+ </div>
176
+ </CardContent>
177
+ </Card>
178
+
179
+ {/* Media Results */}
180
+ <Card className="bg-gray-950/50 border-gray-800 backdrop-blur-xl">
181
+ <CardHeader>
182
+ <Image className="w-6 h-6 text-white mb-2" />
183
+ <CardTitle className="text-white">Media</CardTitle>
184
+ </CardHeader>
185
+ <CardContent>
186
+ <div className="grid grid-cols-2 gap-2">
187
+ {[Image, Video, Music, Map].map((Icon, i) => (
188
+ <div key={i} className="bg-gray-900/50 border border-gray-800 rounded p-4 flex items-center justify-center hover:border-white/20 transition-colors">
189
+ <Icon className="w-6 h-6 text-gray-400" />
190
+ </div>
191
+ ))}
192
+ </div>
193
+ </CardContent>
194
+ </Card>
195
+ </div>
196
+ </div>
197
+ </section>
198
+
199
+ {/* Features */}
200
+ <section className="relative z-10 px-8 py-16">
201
+ <div className="max-w-6xl mx-auto">
202
+ <h2 className="text-3xl font-bold text-center mb-12">
203
+ <span className="bg-gradient-to-r from-white to-gray-400 bg-clip-text text-transparent">
204
+ Search Features That Matter
205
+ </span>
206
+ </h2>
207
+ <div className="grid md:grid-cols-4 gap-4">
208
+ {[
209
+ { icon: Filter, title: "Smart Filters", desc: "AI-powered filtering" },
210
+ { icon: History, title: "Search History", desc: "Track your searches" },
211
+ { icon: TrendingUp, title: "Trending", desc: "See what's popular" },
212
+ { icon: Calendar, title: "Time-Aware", desc: "Temporal understanding" },
213
+ { icon: BarChart, title: "Analytics", desc: "Search insights" },
214
+ { icon: Shield, title: "Privacy", desc: "No tracking mode" },
215
+ { icon: Zap, title: "Instant", desc: "Sub-second results" },
216
+ { icon: Globe, title: "Multi-Source", desc: "Web, docs, APIs" }
217
+ ].map((feature, i) => (
218
+ <motion.div
219
+ key={i}
220
+ initial={{ opacity: 0, scale: 0.9 }}
221
+ animate={{ opacity: 1, scale: 1 }}
222
+ transition={{ delay: 0.05 * i }}
223
+ >
224
+ <Card className="bg-gray-950/50 border-gray-800 hover:border-white/20 transition-all backdrop-blur-xl h-full">
225
+ <CardContent className="p-4">
226
+ <feature.icon className="w-6 h-6 text-white mb-2" />
227
+ <div className="text-sm font-semibold text-white">{feature.title}</div>
228
+ <div className="text-xs text-gray-400 mt-1">{feature.desc}</div>
229
+ </CardContent>
230
+ </Card>
231
+ </motion.div>
232
+ ))}
233
+ </div>
234
+ </div>
235
+ </section>
236
+
237
+ {/* Stats Section */}
238
+ <section className="relative z-10 px-8 py-16">
239
+ <Card className="max-w-4xl mx-auto bg-gray-950/80 border-gray-800 backdrop-blur-xl">
240
+ <CardContent className="p-8">
241
+ <div className="grid grid-cols-3 gap-8 text-center">
242
+ {[
243
+ { value: "50ms", label: "Average Response" },
244
+ { value: "100M+", label: "Documents Indexed" },
245
+ { value: "99.9%", label: "Uptime" }
246
+ ].map((stat, i) => (
247
+ <motion.div
248
+ key={i}
249
+ initial={{ opacity: 0, y: 20 }}
250
+ animate={{ opacity: 1, y: 0 }}
251
+ transition={{ delay: 0.1 * i }}
252
+ >
253
+ <div className="text-3xl font-bold text-white mb-2">{stat.value}</div>
254
+ <div className="text-sm text-gray-400">{stat.label}</div>
255
+ </motion.div>
256
+ ))}
257
+ </div>
258
+ </CardContent>
259
+ </Card>
260
+ </section>
261
+
262
+ {/* CTA Section */}
263
+ <section className="relative z-10 px-8 py-16 text-center">
264
+ <Card className="max-w-4xl mx-auto bg-gradient-to-r from-gray-900 to-gray-950 border-gray-800">
265
+ <CardContent className="p-12">
266
+ <Search className="w-12 h-12 text-white mx-auto mb-6" />
267
+ <h2 className="text-4xl font-bold text-white mb-6">
268
+ Experience the Future of Search
269
+ </h2>
270
+ <p className="text-xl text-gray-400 mb-8">
271
+ Free for personal use. API available for developers.
272
+ </p>
273
+ <div className="flex gap-4 justify-center">
274
+ <Button size="lg" className="bg-white text-black hover:bg-gray-200">
275
+ Start Searching
276
+ </Button>
277
+ <Button size="lg" variant="outline" className="border-white text-white hover:bg-white hover:text-black">
278
+ API Access
279
+ </Button>
280
+ </div>
281
+ </CardContent>
282
+ </Card>
283
+ </section>
284
+ </div>
285
+ )
286
+ }
templates/startupkit.tsx CHANGED
@@ -1,32 +1,42 @@
1
  import { motion } from 'framer-motion'
 
 
 
 
 
 
 
 
 
 
2
  import { Rocket, ChevronRight, Star, Globe, Shield, Zap, Users, TrendingUp, Award } from 'lucide-react'
3
 
4
- export default function StartupKitTemplate() {
5
  return (
6
- <div className="min-h-screen bg-gradient-to-br from-white via-white to-gray-500 dark:from-gray-950 dark:via-slate-900 dark:to-gray-400">
7
  {/* Header */}
8
  <header className="relative overflow-hidden">
9
  <div className="absolute inset-0">
10
- <div className="absolute inset-0 bg-gradient-to-br from-white/10 to-gray-500/10" />
11
- <div className="absolute top-0 left-1/4 w-96 h-96 bg-gray-800/20 rounded-full blur-3xl" />
12
- <div className="absolute bottom-0 right-1/4 w-96 h-96 bg-gray-800/20 rounded-full blur-3xl" />
13
  </div>
14
 
15
  <nav className="relative z-10 p-6">
16
  <div className="max-w-7xl mx-auto flex justify-between items-center">
17
  <div className="flex items-center gap-3">
18
- <div className="w-10 h-10 bg-gradient-to-br from-white to-gray-500 rounded-xl flex items-center justify-center">
19
- <Rocket className="w-6 h-6 text-white" />
20
  </div>
21
  <span className="text-xl font-bold">StartupKit</span>
22
  </div>
23
  <div className="flex items-center gap-6">
24
- <button className="text-gray-600 hover:text-gray-900 font-medium">Features</button>
25
- <button className="text-gray-600 hover:text-gray-900 font-medium">Pricing</button>
26
- <button className="text-gray-600 hover:text-gray-900 font-medium">Docs</button>
27
- <button className="px-4 py-2 bg-gradient-to-r from-white to-gray-500 text-white rounded-lg font-semibold">
28
  Get Started
29
- </button>
30
  </div>
31
  </div>
32
  </nav>
@@ -39,32 +49,30 @@ export default function StartupKitTemplate() {
39
  animate={{ opacity: 1, x: 0 }}
40
  transition={{ duration: 0.5 }}
41
  >
42
- <div className="inline-flex items-center gap-2 px-3 py-1 bg-gray-800 dark:bg-gray-800/30 rounded-full mb-6">
43
- <Star className="w-4 h-4 text-gray-400 dark:text-gray-400" />
44
- <span className="text-sm font-semibold text-gray-400 dark:text-gray-400">
45
- #1 Product of the Week
46
- </span>
47
- </div>
48
 
49
  <h1 className="text-5xl md:text-6xl font-bold mb-6">
50
  Launch Your Startup
51
- <span className="bg-gradient-to-r from-white to-gray-500 bg-clip-text text-transparent">
52
  {" "}in Days
53
  </span>
54
  </h1>
55
 
56
- <p className="text-xl text-gray-600 dark:text-gray-400 mb-8">
57
  Complete SaaS boilerplate with authentication, payments, database, and UI components.
58
  Stop coding from scratch.
59
  </p>
60
 
61
  <div className="flex gap-4 mb-12">
62
- <button className="px-6 py-3 bg-gradient-to-r from-white to-gray-500 text-white rounded-lg font-semibold flex items-center gap-2">
63
  Start Building <ChevronRight className="w-4 h-4" />
64
- </button>
65
- <button className="px-6 py-3 border-2 border-gray-300 dark:border-gray-700 rounded-lg font-semibold">
66
  View Demo
67
- </button>
68
  </div>
69
 
70
  <div className="flex items-center gap-6">
@@ -72,17 +80,17 @@ export default function StartupKitTemplate() {
72
  {[...Array(4)].map((_, i) => (
73
  <div
74
  key={i}
75
- className="w-10 h-10 rounded-full bg-gradient-to-br from-white to-gray-500 border-2 border-white dark:border-slate-900"
76
  />
77
  ))}
78
  </div>
79
  <div>
80
- <div className="flex text-white">
81
  {[...Array(5)].map((_, i) => (
82
  <Star key={i} className="w-4 h-4 fill-current" />
83
  ))}
84
  </div>
85
- <p className="text-sm text-gray-600 dark:text-gray-400">2,500+ developers</p>
86
  </div>
87
  </div>
88
  </motion.div>
@@ -94,22 +102,22 @@ export default function StartupKitTemplate() {
94
  className="relative"
95
  >
96
  <div className="relative rounded-2xl overflow-hidden shadow-2xl">
97
- <div className="absolute inset-0 bg-gradient-to-br from-white to-gray-500" />
98
- <div className="relative bg-white/10 backdrop-blur-xl p-8">
99
  <div className="space-y-4">
100
  {/* Dashboard Preview */}
101
- <div className="bg-white/20 backdrop-blur rounded-xl p-4">
102
  <div className="flex items-center gap-2 mb-3">
103
- <div className="w-3 h-3 bg-gray-700 rounded-full" />
104
- <div className="w-3 h-3 bg-gray-600 rounded-full" />
105
- <div className="w-3 h-3 bg-gray-700 rounded-full" />
106
  </div>
107
  <div className="space-y-3">
108
- <div className="h-3 bg-white/40 rounded w-3/4" />
109
- <div className="h-3 bg-white/40 rounded w-1/2" />
110
  <div className="grid grid-cols-3 gap-2">
111
  {[...Array(6)].map((_, i) => (
112
- <div key={i} className="h-20 bg-white/30 rounded" />
113
  ))}
114
  </div>
115
  </div>
@@ -122,17 +130,17 @@ export default function StartupKitTemplate() {
122
  <motion.div
123
  animate={{ y: [0, -10, 0] }}
124
  transition={{ duration: 2, repeat: Infinity }}
125
- className="absolute -top-4 -right-4 w-24 h-24 bg-gradient-to-br from-gray-100 to-gray-500 rounded-2xl flex items-center justify-center shadow-xl"
126
  >
127
- <Award className="w-12 h-12 text-white" />
128
  </motion.div>
129
 
130
  <motion.div
131
  animate={{ y: [0, 10, 0] }}
132
  transition={{ duration: 2, repeat: Infinity, delay: 0.5 }}
133
- className="absolute -bottom-4 -left-4 w-20 h-20 bg-gradient-to-br from-white to-gray-400 rounded-xl flex items-center justify-center shadow-xl"
134
  >
135
- <TrendingUp className="w-10 h-10 text-white" />
136
  </motion.div>
137
  </motion.div>
138
  </div>
@@ -144,7 +152,7 @@ export default function StartupKitTemplate() {
144
  <div className="max-w-7xl mx-auto">
145
  <div className="text-center mb-12">
146
  <h2 className="text-4xl font-bold mb-4">Everything You Need</h2>
147
- <p className="text-xl text-gray-600 dark:text-gray-400">
148
  Built with modern technologies and best practices
149
  </p>
150
  </div>
@@ -163,13 +171,18 @@ export default function StartupKitTemplate() {
163
  initial={{ opacity: 0, y: 20 }}
164
  animate={{ opacity: 1, y: 0 }}
165
  transition={{ delay: i * 0.1 }}
166
- className="bg-white dark:bg-slate-800 rounded-xl p-6 shadow-lg hover:shadow-xl transition-shadow"
167
  >
168
- <div className="w-12 h-12 bg-gradient-to-br from-white to-gray-500 rounded-lg flex items-center justify-center mb-4">
169
- <feature.icon className="w-6 h-6 text-white" />
170
- </div>
171
- <h3 className="text-lg font-semibold mb-2">{feature.title}</h3>
172
- <p className="text-gray-600 dark:text-gray-400">{feature.desc}</p>
 
 
 
 
 
 
173
  </motion.div>
174
  ))}
175
  </div>
@@ -177,4 +190,6 @@ export default function StartupKitTemplate() {
177
  </section>
178
  </div>
179
  )
180
- }
 
 
 
1
  import { motion } from 'framer-motion'
2
+ import {
3
+ Button,
4
+ Card,
5
+ CardContent,
6
+ CardDescription,
7
+ CardHeader,
8
+ CardTitle,
9
+ Badge
10
+ } from '@hanzo/ui/primitives'
11
+ import { HanzoLogo } from '@/components/logo'
12
  import { Rocket, ChevronRight, Star, Globe, Shield, Zap, Users, TrendingUp, Award } from 'lucide-react'
13
 
14
+ const StartupKitTemplate: React.FC = () => {
15
  return (
16
+ <div className="min-h-screen bg-gradient-to-br from-background via-background/95 to-background">
17
  {/* Header */}
18
  <header className="relative overflow-hidden">
19
  <div className="absolute inset-0">
20
+ <div className="absolute inset-0 bg-gradient-to-br from-foreground/5 to-foreground/10" />
21
+ <div className="absolute top-0 left-1/4 w-96 h-96 bg-foreground/10 rounded-full blur-3xl" />
22
+ <div className="absolute bottom-0 right-1/4 w-96 h-96 bg-foreground/10 rounded-full blur-3xl" />
23
  </div>
24
 
25
  <nav className="relative z-10 p-6">
26
  <div className="max-w-7xl mx-auto flex justify-between items-center">
27
  <div className="flex items-center gap-3">
28
+ <div className="w-10 h-10 bg-foreground rounded-xl flex items-center justify-center">
29
+ <Rocket className="w-6 h-6 text-background" />
30
  </div>
31
  <span className="text-xl font-bold">StartupKit</span>
32
  </div>
33
  <div className="flex items-center gap-6">
34
+ <Button variant="ghost">Features</Button>
35
+ <Button variant="ghost">Pricing</Button>
36
+ <Button variant="ghost">Docs</Button>
37
+ <Button variant="default">
38
  Get Started
39
+ </Button>
40
  </div>
41
  </div>
42
  </nav>
 
49
  animate={{ opacity: 1, x: 0 }}
50
  transition={{ duration: 0.5 }}
51
  >
52
+ <Badge variant="secondary" className="mb-6">
53
+ <Star className="w-4 h-4 mr-2" />
54
+ #1 Product of the Week
55
+ </Badge>
 
 
56
 
57
  <h1 className="text-5xl md:text-6xl font-bold mb-6">
58
  Launch Your Startup
59
+ <span className="bg-gradient-to-r from-foreground to-muted-foreground bg-clip-text text-transparent">
60
  {" "}in Days
61
  </span>
62
  </h1>
63
 
64
+ <p className="text-xl text-muted-foreground mb-8">
65
  Complete SaaS boilerplate with authentication, payments, database, and UI components.
66
  Stop coding from scratch.
67
  </p>
68
 
69
  <div className="flex gap-4 mb-12">
70
+ <Button variant="default" className="flex items-center gap-2">
71
  Start Building <ChevronRight className="w-4 h-4" />
72
+ </Button>
73
+ <Button variant="outline">
74
  View Demo
75
+ </Button>
76
  </div>
77
 
78
  <div className="flex items-center gap-6">
 
80
  {[...Array(4)].map((_, i) => (
81
  <div
82
  key={i}
83
+ className="w-10 h-10 rounded-full bg-gradient-to-br from-foreground to-muted-foreground border-2 border-background"
84
  />
85
  ))}
86
  </div>
87
  <div>
88
+ <div className="flex text-foreground">
89
  {[...Array(5)].map((_, i) => (
90
  <Star key={i} className="w-4 h-4 fill-current" />
91
  ))}
92
  </div>
93
+ <p className="text-sm text-muted-foreground">2,500+ developers</p>
94
  </div>
95
  </div>
96
  </motion.div>
 
102
  className="relative"
103
  >
104
  <div className="relative rounded-2xl overflow-hidden shadow-2xl">
105
+ <div className="absolute inset-0 bg-gradient-to-br from-foreground/10 to-foreground/20" />
106
+ <div className="relative bg-card/80 backdrop-blur-xl p-8">
107
  <div className="space-y-4">
108
  {/* Dashboard Preview */}
109
+ <div className="bg-card/50 backdrop-blur rounded-xl p-4">
110
  <div className="flex items-center gap-2 mb-3">
111
+ <div className="w-3 h-3 bg-muted rounded-full" />
112
+ <div className="w-3 h-3 bg-muted rounded-full" />
113
+ <div className="w-3 h-3 bg-muted rounded-full" />
114
  </div>
115
  <div className="space-y-3">
116
+ <div className="h-3 bg-foreground/20 rounded w-3/4" />
117
+ <div className="h-3 bg-foreground/20 rounded w-1/2" />
118
  <div className="grid grid-cols-3 gap-2">
119
  {[...Array(6)].map((_, i) => (
120
+ <div key={i} className="h-20 bg-foreground/10 rounded" />
121
  ))}
122
  </div>
123
  </div>
 
130
  <motion.div
131
  animate={{ y: [0, -10, 0] }}
132
  transition={{ duration: 2, repeat: Infinity }}
133
+ className="absolute -top-4 -right-4 w-24 h-24 bg-gradient-to-br from-foreground to-muted-foreground rounded-2xl flex items-center justify-center shadow-xl"
134
  >
135
+ <Award className="w-12 h-12 text-background" />
136
  </motion.div>
137
 
138
  <motion.div
139
  animate={{ y: [0, 10, 0] }}
140
  transition={{ duration: 2, repeat: Infinity, delay: 0.5 }}
141
+ className="absolute -bottom-4 -left-4 w-20 h-20 bg-gradient-to-br from-foreground to-muted-foreground rounded-xl flex items-center justify-center shadow-xl"
142
  >
143
+ <TrendingUp className="w-10 h-10 text-background" />
144
  </motion.div>
145
  </motion.div>
146
  </div>
 
152
  <div className="max-w-7xl mx-auto">
153
  <div className="text-center mb-12">
154
  <h2 className="text-4xl font-bold mb-4">Everything You Need</h2>
155
+ <p className="text-xl text-muted-foreground">
156
  Built with modern technologies and best practices
157
  </p>
158
  </div>
 
171
  initial={{ opacity: 0, y: 20 }}
172
  animate={{ opacity: 1, y: 0 }}
173
  transition={{ delay: i * 0.1 }}
 
174
  >
175
+ <Card className="hover:shadow-xl transition-shadow">
176
+ <CardHeader>
177
+ <div className="w-12 h-12 bg-gradient-to-br from-foreground to-muted-foreground rounded-lg flex items-center justify-center mb-4">
178
+ <feature.icon className="w-6 h-6 text-background" />
179
+ </div>
180
+ <CardTitle>{feature.title}</CardTitle>
181
+ </CardHeader>
182
+ <CardContent>
183
+ <CardDescription>{feature.desc}</CardDescription>
184
+ </CardContent>
185
+ </Card>
186
  </motion.div>
187
  ))}
188
  </div>
 
190
  </section>
191
  </div>
192
  )
193
+ }
194
+
195
+ export default StartupKitTemplate