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 +205 -0
- app/api/download/[template]/route.ts +118 -0
- app/api/github/create/route.ts +152 -0
- app/page.tsx +35 -5
- app/template/[id]/page.tsx +244 -24
- components/template-data.ts +191 -16
- package-lock.json +1427 -76
- package.json +2 -0
- templates/ai-chat.tsx +223 -0
- templates/analyticsdash.tsx +110 -168
- templates/api-docs.tsx +311 -0
- templates/devforge.tsx +53 -43
- templates/ecommerce-dash.tsx +278 -0
- templates/index.tsx +30 -0
- templates/mobilefirst.tsx +29 -20
- templates/saasify.tsx +27 -17
- templates/search-interface.tsx +286 -0
- templates/startupkit.tsx +63 -48
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 ? `[](${template.deployUrls.vercel})` : ''}
|
| 96 |
+
${template.deployUrls?.netlify ? `[](${template.deployUrls.netlify})` : ''}
|
| 97 |
+
${template.deployUrls?.railway ? `[](${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 |
-
|
| 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 |
-
|
| 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">
|
| 285 |
-
<CardDescription className="text-xs sm:text-sm">
|
| 286 |
</CardHeader>
|
| 287 |
-
<CardContent className="space-y-
|
|
|
|
| 288 |
<div>
|
| 289 |
-
<label className="text-sm font-medium mb-2 block">
|
|
|
|
|
|
|
|
|
|
| 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 |
-
|
| 306 |
-
|
| 307 |
-
<
|
| 308 |
-
|
| 309 |
-
|
| 310 |
-
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 311 |
</li>
|
| 312 |
-
<li className="flex gap-
|
| 313 |
-
<span className="font-semibold">2
|
| 314 |
-
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 315 |
</li>
|
| 316 |
-
<li className="flex gap-
|
| 317 |
-
<span className="font-semibold">3
|
| 318 |
-
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 319 |
</li>
|
| 320 |
-
<li className="flex gap-
|
| 321 |
-
<span className="font-semibold">4
|
| 322 |
-
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 386 |
<Download className="w-4 h-4 mr-2" />
|
| 387 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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">
|
| 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
|
| 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/
|
| 3906 |
-
"version": "
|
| 3907 |
-
"resolved": "https://registry.npmjs.org/
|
| 3908 |
-
"integrity": "sha512-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3909 |
"license": "MIT",
|
| 3910 |
"engines": {
|
| 3911 |
-
"node": ">=
|
| 3912 |
}
|
| 3913 |
},
|
| 3914 |
-
"node_modules/
|
| 3915 |
-
"version": "0.
|
| 3916 |
-
"resolved": "https://registry.npmjs.org/
|
| 3917 |
-
"integrity": "sha512-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3918 |
"license": "MIT",
|
| 3919 |
"dependencies": {
|
| 3920 |
-
"
|
|
|
|
|
|
|
| 3921 |
},
|
| 3922 |
-
"
|
| 3923 |
-
"
|
| 3924 |
-
"react-dom": "^18.0.0"
|
| 3925 |
}
|
| 3926 |
},
|
| 3927 |
-
"node_modules/
|
| 3928 |
-
"version": "
|
| 3929 |
-
"resolved": "https://registry.npmjs.org/
|
| 3930 |
-
"integrity": "sha512-
|
|
|
|
| 3931 |
"license": "MIT",
|
| 3932 |
"dependencies": {
|
| 3933 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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/
|
| 5893 |
-
"version": "0.
|
| 5894 |
-
"resolved": "https://registry.npmjs.org/
|
| 5895 |
-
"integrity": "sha512-
|
|
|
|
| 5896 |
"license": "MIT",
|
| 5897 |
"dependencies": {
|
| 5898 |
-
"
|
|
|
|
| 5899 |
},
|
| 5900 |
"engines": {
|
| 5901 |
-
"node": ">=
|
| 5902 |
}
|
| 5903 |
},
|
| 5904 |
-
"node_modules/
|
| 5905 |
-
"version": "
|
| 5906 |
-
"resolved": "https://registry.npmjs.org/
|
| 5907 |
-
"integrity": "sha512-
|
| 5908 |
"dev": true,
|
| 5909 |
"license": "MIT",
|
|
|
|
|
|
|
|
|
|
|
|
|
| 5910 |
"engines": {
|
| 5911 |
-
"node": ">=
|
| 5912 |
}
|
| 5913 |
},
|
| 5914 |
-
"node_modules/
|
| 5915 |
-
"version": "
|
| 5916 |
-
"resolved": "https://registry.npmjs.org/
|
| 5917 |
-
"integrity": "sha512-
|
| 5918 |
-
"dev": true,
|
| 5919 |
"license": "MIT",
|
| 5920 |
"dependencies": {
|
| 5921 |
-
"
|
| 5922 |
-
"resolve-from": "^4.0.0"
|
| 5923 |
},
|
| 5924 |
"engines": {
|
| 5925 |
-
"node": ">=
|
| 5926 |
-
}
|
| 5927 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
-
|
| 9 |
return (
|
| 10 |
-
<div className="min-h-screen bg-
|
| 11 |
{/* Sidebar */}
|
| 12 |
-
<aside className="fixed left-0 top-0 h-full w-64 bg-
|
| 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-
|
| 16 |
-
<BarChart3 className="w-6 h-6 text-
|
| 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-
|
| 35 |
-
: 'hover:bg-
|
| 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-
|
| 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-
|
| 54 |
<input
|
| 55 |
type="text"
|
| 56 |
placeholder="Search..."
|
| 57 |
-
className="w-full pl-10 pr-4 py-2 bg-
|
| 58 |
/>
|
| 59 |
</div>
|
| 60 |
-
<
|
| 61 |
<Calendar className="w-4 h-4" />
|
| 62 |
<span>Last 30 days</span>
|
| 63 |
-
</
|
| 64 |
-
<
|
| 65 |
<Filter className="w-5 h-5" />
|
| 66 |
-
</
|
| 67 |
</div>
|
| 68 |
<div className="flex items-center gap-3">
|
| 69 |
-
<
|
| 70 |
<Bell className="w-5 h-5" />
|
| 71 |
-
<div className="absolute top-1 right-1 w-2 h-2 bg-
|
| 72 |
-
</
|
| 73 |
-
<
|
| 74 |
<Download className="w-4 h-4" />
|
| 75 |
Export
|
| 76 |
-
</
|
| 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
|
| 104 |
-
value: "3.
|
| 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 |
-
<
|
| 127 |
-
<
|
| 128 |
-
<
|
| 129 |
-
|
| 130 |
-
|
| 131 |
-
|
| 132 |
-
|
| 133 |
-
|
| 134 |
-
|
| 135 |
-
|
| 136 |
-
|
| 137 |
-
|
| 138 |
-
|
| 139 |
-
|
| 140 |
-
|
| 141 |
-
|
| 142 |
-
|
| 143 |
-
|
| 144 |
-
|
| 145 |
-
|
| 146 |
-
|
| 147 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 148 |
</motion.div>
|
| 149 |
))}
|
| 150 |
</div>
|
| 151 |
|
| 152 |
{/* Charts */}
|
| 153 |
-
<div className="grid grid-cols-
|
| 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="
|
| 160 |
>
|
| 161 |
-
<
|
| 162 |
-
<
|
| 163 |
-
|
| 164 |
-
|
| 165 |
-
|
| 166 |
-
|
| 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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
-
<
|
| 191 |
-
<
|
| 192 |
-
|
| 193 |
-
|
| 194 |
-
|
| 195 |
-
<
|
| 196 |
-
<
|
| 197 |
-
|
| 198 |
-
|
| 199 |
-
|
| 200 |
-
|
| 201 |
-
|
| 202 |
-
|
| 203 |
-
|
| 204 |
-
|
| 205 |
-
|
| 206 |
-
|
| 207 |
-
|
| 208 |
-
|
| 209 |
-
|
| 210 |
-
|
| 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 |
-
|
| 252 |
-
|
| 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 {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3 |
import { HanzoLogo } from '@/components/logo'
|
| 4 |
import { Code2, Zap, Shield, Globe, Users, Terminal, Cloud, Sparkles } from 'lucide-react'
|
| 5 |
|
| 6 |
-
|
| 7 |
return (
|
| 8 |
-
<div className="min-h-screen bg-
|
| 9 |
{/* Animated Background */}
|
| 10 |
<div className="fixed inset-0 overflow-hidden">
|
| 11 |
-
<div className="absolute inset-0 bg-gradient-to-br from-
|
| 12 |
{[...Array(30)].map((_, i) => (
|
| 13 |
<div
|
| 14 |
key={i}
|
| 15 |
-
className="absolute w-2 h-2 bg-
|
| 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-
|
| 31 |
-
<HanzoLogo className="w-6 h-6 text-
|
| 32 |
</div>
|
| 33 |
<span className="text-xl font-bold">Hanzo DevForge</span>
|
| 34 |
</div>
|
| 35 |
<div className="flex gap-2">
|
| 36 |
-
<Button variant="ghost"
|
| 37 |
Features
|
| 38 |
</Button>
|
| 39 |
-
<Button variant="ghost"
|
| 40 |
Pricing
|
| 41 |
</Button>
|
| 42 |
-
<Button
|
| 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
|
| 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-
|
| 62 |
Code Smarter
|
| 63 |
</span>
|
| 64 |
<br />
|
| 65 |
-
<span className="text-
|
| 66 |
</h1>
|
| 67 |
|
| 68 |
-
<p className="text-xl text-
|
| 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-
|
| 75 |
-
<CardHeader className="bg-
|
| 76 |
<div className="flex items-center gap-2">
|
| 77 |
<div className="flex gap-2">
|
| 78 |
-
<div className="w-3 h-3 bg-
|
| 79 |
-
<div className="w-3 h-3 bg-
|
| 80 |
-
<div className="w-3 h-3 bg-
|
| 81 |
</div>
|
| 82 |
-
<span className="text-sm text-
|
| 83 |
</div>
|
| 84 |
</CardHeader>
|
| 85 |
<CardContent className="p-6">
|
| 86 |
<pre className="text-sm font-mono">
|
| 87 |
<code>
|
| 88 |
-
<span className="text-
|
| 89 |
-
<span className="text-
|
| 90 |
-
<span className="text-
|
| 91 |
-
<span className="text-
|
| 92 |
{"\n\n"}
|
| 93 |
-
<span className="text-
|
| 94 |
-
<span className="text-
|
| 95 |
{"\n "}
|
| 96 |
-
<span className="text-
|
| 97 |
-
<span className="text-
|
| 98 |
{"\n "}
|
| 99 |
{"\n "}
|
| 100 |
-
<span className="text-
|
| 101 |
{"\n "}
|
| 102 |
-
<span className="text-
|
| 103 |
-
<span className="text-
|
| 104 |
-
<span className="text-
|
| 105 |
-
{"\n "}prompt: <span className="text-
|
| 106 |
-
{"\n "}language: <span className="text-
|
| 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-
|
| 134 |
<CardHeader>
|
| 135 |
-
<feature.icon className="w-8 h-8 text-
|
| 136 |
-
<CardTitle className="text-
|
| 137 |
</CardHeader>
|
| 138 |
<CardContent>
|
| 139 |
-
<CardDescription className="text-
|
| 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-
|
| 150 |
<CardContent className="p-12">
|
| 151 |
-
<h2 className="text-4xl font-bold text-
|
| 152 |
Ready to 100x Your Development Speed?
|
| 153 |
</h2>
|
| 154 |
-
<p className="text-xl text-
|
| 155 |
Join thousands of developers building the future with Hanzo DevForge
|
| 156 |
</p>
|
| 157 |
-
<Button size="lg"
|
| 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 {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3 |
import { HanzoLogo } from '@/components/logo'
|
| 4 |
import { Smartphone, Palette, Layers, Zap, Download, Share2 } from 'lucide-react'
|
| 5 |
|
| 6 |
-
|
| 7 |
return (
|
| 8 |
-
<div className="min-h-screen bg-
|
| 9 |
-
<div className="min-h-screen bg-gradient-to-br from-
|
| 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-
|
| 15 |
-
<HanzoLogo className="w-6 h-6 text-
|
| 16 |
</div>
|
| 17 |
-
<span className="text-xl font-bold
|
| 18 |
</div>
|
| 19 |
-
<Button
|
| 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-
|
| 35 |
Without Code
|
| 36 |
</span>
|
| 37 |
</h1>
|
| 38 |
-
<p className="text-xl text-
|
| 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-
|
| 45 |
-
<div className="bg-gradient-to-br from-
|
| 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-
|
| 51 |
>
|
| 52 |
-
<HanzoLogo className="w-16 h-16 text-
|
| 53 |
</motion.div>
|
| 54 |
-
<h3 className="text-2xl font-bold text-
|
| 55 |
-
<p className="text-
|
| 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-
|
| 78 |
<CardHeader>
|
| 79 |
-
<feature.icon className="w-12 h-12 mx-auto text-
|
| 80 |
-
<CardTitle className="text-
|
| 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 {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3 |
import { HanzoLogo } from '@/components/logo'
|
| 4 |
import { CreditCard, Users, BarChart3, Shield, Zap, Globe } from 'lucide-react'
|
| 5 |
|
| 6 |
-
|
| 7 |
return (
|
| 8 |
-
<div className="min-h-screen bg-
|
| 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-
|
| 14 |
-
<HanzoLogo className="w-6 h-6 text-
|
| 15 |
</div>
|
| 16 |
-
<span className="text-xl font-bold
|
| 17 |
</div>
|
| 18 |
-
<Button
|
| 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-
|
| 32 |
Launch Your SaaS
|
| 33 |
</span>
|
| 34 |
<br />
|
| 35 |
-
<span className="text-
|
| 36 |
</h1>
|
| 37 |
-
<p className="text-xl text-
|
| 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-
|
| 56 |
<CardHeader>
|
| 57 |
-
<feature.icon className="w-12 h-12 text-
|
| 58 |
-
<CardTitle className="text-
|
| 59 |
</CardHeader>
|
| 60 |
<CardContent>
|
| 61 |
-
<CardDescription className="text-
|
| 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-
|
| 84 |
-
<p className="text-
|
| 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 |
-
|
| 5 |
return (
|
| 6 |
-
<div className="min-h-screen bg-gradient-to-br from-
|
| 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-
|
| 11 |
-
<div className="absolute top-0 left-1/4 w-96 h-96 bg-
|
| 12 |
-
<div className="absolute bottom-0 right-1/4 w-96 h-96 bg-
|
| 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-
|
| 19 |
-
<Rocket className="w-6 h-6 text-
|
| 20 |
</div>
|
| 21 |
<span className="text-xl font-bold">StartupKit</span>
|
| 22 |
</div>
|
| 23 |
<div className="flex items-center gap-6">
|
| 24 |
-
<
|
| 25 |
-
<
|
| 26 |
-
<
|
| 27 |
-
<
|
| 28 |
Get Started
|
| 29 |
-
</
|
| 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 |
-
<
|
| 43 |
-
<Star className="w-4 h-4
|
| 44 |
-
|
| 45 |
-
|
| 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-
|
| 52 |
{" "}in Days
|
| 53 |
</span>
|
| 54 |
</h1>
|
| 55 |
|
| 56 |
-
<p className="text-xl text-
|
| 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 |
-
<
|
| 63 |
Start Building <ChevronRight className="w-4 h-4" />
|
| 64 |
-
</
|
| 65 |
-
<
|
| 66 |
View Demo
|
| 67 |
-
</
|
| 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-
|
| 76 |
/>
|
| 77 |
))}
|
| 78 |
</div>
|
| 79 |
<div>
|
| 80 |
-
<div className="flex text-
|
| 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-
|
| 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-
|
| 98 |
-
<div className="relative bg-
|
| 99 |
<div className="space-y-4">
|
| 100 |
{/* Dashboard Preview */}
|
| 101 |
-
<div className="bg-
|
| 102 |
<div className="flex items-center gap-2 mb-3">
|
| 103 |
-
<div className="w-3 h-3 bg-
|
| 104 |
-
<div className="w-3 h-3 bg-
|
| 105 |
-
<div className="w-3 h-3 bg-
|
| 106 |
</div>
|
| 107 |
<div className="space-y-3">
|
| 108 |
-
<div className="h-3 bg-
|
| 109 |
-
<div className="h-3 bg-
|
| 110 |
<div className="grid grid-cols-3 gap-2">
|
| 111 |
{[...Array(6)].map((_, i) => (
|
| 112 |
-
<div key={i} className="h-20 bg-
|
| 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-
|
| 126 |
>
|
| 127 |
-
<Award className="w-12 h-12 text-
|
| 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-
|
| 134 |
>
|
| 135 |
-
<TrendingUp className="w-10 h-10 text-
|
| 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-
|
| 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 |
-
<
|
| 169 |
-
<
|
| 170 |
-
|
| 171 |
-
|
| 172 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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
|