@digilogiclabs/create-saas-app 1.10.6 → 1.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +331 -350
- package/dist/.tsbuildinfo +1 -1
- package/dist/cli/commands/create.js +2 -2
- package/dist/cli/commands/create.js.map +1 -1
- package/dist/generators/template-generator.d.ts.map +1 -1
- package/dist/generators/template-generator.js +14 -2
- package/dist/generators/template-generator.js.map +1 -1
- package/dist/templates/web/ui-auth/template/.claude +21 -0
- package/dist/templates/web/ui-auth/template/context.md +105 -0
- package/dist/templates/web/ui-auth/template/src/app/dev-setup/page.tsx +801 -0
- package/dist/templates/web/ui-auth/template/src/app/setup/page.tsx +403 -0
- package/dist/templates/web/ui-auth-payments/template/src/app/dev-setup/page.tsx +801 -0
- package/dist/templates/web/ui-auth-payments/template/src/app/setup/page.tsx +507 -0
- package/dist/templates/web/ui-auth-payments/template/src/components/shared/header.tsx +127 -32
- package/dist/templates/web/ui-auth-payments-ai/template/.claude +21 -0
- package/dist/templates/web/ui-auth-payments-ai/template/.env.example +15 -0
- package/dist/templates/web/ui-auth-payments-ai/template/README.md +207 -0
- package/dist/templates/web/ui-auth-payments-ai/template/context.md +169 -0
- package/dist/templates/web/ui-auth-payments-ai/template/middleware.ts +68 -0
- package/dist/templates/web/ui-auth-payments-ai/template/next.config.js +12 -0
- package/dist/templates/web/ui-auth-payments-ai/template/package-lock.json +12241 -0
- package/dist/templates/web/ui-auth-payments-ai/template/package.json +55 -0
- package/dist/templates/web/ui-auth-payments-ai/template/postcss.config.js +7 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/ai/page.tsx +310 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/api/ai/audio/route.ts +56 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/api/ai/chat/route.ts +49 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/api/ai/text/route.ts +64 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/api/ai/video/route.ts +73 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/auth/callback/route.ts +12 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/billing/page.tsx +211 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/checkout/page.tsx +142 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/dashboard/layout.tsx +22 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/dashboard/page.tsx +183 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/dev-setup/page.tsx +801 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/error.tsx +67 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/globals.css +43 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/layout.tsx +35 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/loading.tsx +20 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/login/page.tsx +6 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/page.tsx +380 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/page.tsx.backup +391 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/page.tsx.bak +391 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/setup/page.tsx +640 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/signup/page.tsx +6 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/components/__tests__/example.test.tsx +49 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/components/client/auth-status.tsx +52 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/components/client/login-form.tsx +144 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/components/client/signup-form.tsx +185 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/components/providers/app-providers.tsx +36 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/components/providers/theme-provider.tsx +96 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/components/shared/footer.tsx +36 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/components/shared/header.tsx +246 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/components/ui/badge.tsx +36 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/components/ui/theme-toggle.tsx +34 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/lib/actions/auth.ts +246 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/lib/actions/index.ts +14 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/lib/auth-server.ts +177 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/lib/env.ts +49 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/lib/utils.ts +140 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/test/setup.ts +79 -0
- package/dist/templates/web/ui-auth-payments-ai/template/tailwind.config.js +77 -0
- package/dist/templates/web/ui-auth-payments-ai/template/tsconfig.json +33 -0
- package/dist/templates/web/ui-auth-payments-ai/template/tsconfig.tsbuildinfo +1 -0
- package/dist/templates/web/ui-auth-payments-ai/template/vitest.config.ts +17 -0
- package/dist/templates/web/ui-auth-payments-audio/template/src/app/page.tsx +28 -20
- package/dist/templates/web/ui-auth-payments-audio/template/src/app/page.tsx.backup +391 -0
- package/dist/templates/web/ui-auth-payments-audio/template/src/app/page.tsx.bak +391 -0
- package/dist/templates/web/ui-auth-payments-audio/template/src/app/setup/page.tsx +345 -0
- package/dist/templates/web/ui-auth-payments-audio/template/src/components/shared/header.tsx +122 -37
- package/dist/templates/web/ui-auth-payments-video/template/src/app/setup/page.tsx +351 -0
- package/dist/templates/web/ui-auth-payments-video/template/src/components/shared/header.tsx +122 -37
- package/package.json +1 -1
- package/src/templates/web/ui-auth/template/.claude +21 -0
- package/src/templates/web/ui-auth/template/context.md +105 -0
- package/src/templates/web/ui-auth/template/src/app/dev-setup/page.tsx +801 -0
- package/src/templates/web/ui-auth/template/src/app/setup/page.tsx +403 -0
- package/src/templates/web/ui-auth-payments/template/src/app/dev-setup/page.tsx +801 -0
- package/src/templates/web/ui-auth-payments/template/src/app/setup/page.tsx +507 -0
- package/src/templates/web/ui-auth-payments/template/src/components/shared/header.tsx +127 -32
- package/src/templates/web/ui-auth-payments-ai/template/.claude +21 -0
- package/src/templates/web/ui-auth-payments-ai/template/.env.example +15 -0
- package/src/templates/web/ui-auth-payments-ai/template/README.md +207 -0
- package/src/templates/web/ui-auth-payments-ai/template/context.md +169 -0
- package/src/templates/web/ui-auth-payments-ai/template/middleware.ts +68 -0
- package/src/templates/web/ui-auth-payments-ai/template/next.config.js +12 -0
- package/src/templates/web/ui-auth-payments-ai/template/package-lock.json +12241 -0
- package/src/templates/web/ui-auth-payments-ai/template/package.json +55 -0
- package/src/templates/web/ui-auth-payments-ai/template/postcss.config.js +7 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/app/ai/page.tsx +310 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/app/api/ai/audio/route.ts +56 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/app/api/ai/chat/route.ts +49 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/app/api/ai/text/route.ts +64 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/app/api/ai/video/route.ts +73 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/app/auth/callback/route.ts +12 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/app/billing/page.tsx +211 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/app/checkout/page.tsx +142 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/app/dashboard/layout.tsx +22 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/app/dashboard/page.tsx +183 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/app/dev-setup/page.tsx +801 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/app/error.tsx +67 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/app/globals.css +43 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/app/layout.tsx +35 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/app/loading.tsx +20 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/app/login/page.tsx +6 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/app/page.tsx +380 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/app/page.tsx.backup +391 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/app/page.tsx.bak +391 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/app/setup/page.tsx +640 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/app/signup/page.tsx +6 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/components/__tests__/example.test.tsx +49 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/components/client/auth-status.tsx +52 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/components/client/login-form.tsx +144 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/components/client/signup-form.tsx +185 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/components/providers/app-providers.tsx +36 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/components/providers/theme-provider.tsx +96 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/components/shared/footer.tsx +36 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/components/shared/header.tsx +246 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/components/ui/badge.tsx +36 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/components/ui/theme-toggle.tsx +34 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/lib/actions/auth.ts +246 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/lib/actions/index.ts +14 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/lib/auth-server.ts +177 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/lib/env.ts +49 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/lib/utils.ts +140 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/test/setup.ts +79 -0
- package/src/templates/web/ui-auth-payments-ai/template/tailwind.config.js +77 -0
- package/src/templates/web/ui-auth-payments-ai/template/tsconfig.json +33 -0
- package/src/templates/web/ui-auth-payments-ai/template/tsconfig.tsbuildinfo +1 -0
- package/src/templates/web/ui-auth-payments-ai/template/vitest.config.ts +17 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/app/page.tsx +28 -20
- package/src/templates/web/ui-auth-payments-audio/template/src/app/page.tsx.backup +391 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/app/page.tsx.bak +391 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/app/setup/page.tsx +345 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/components/shared/header.tsx +122 -37
- package/src/templates/web/ui-auth-payments-video/template/src/app/setup/page.tsx +351 -0
- package/src/templates/web/ui-auth-payments-video/template/src/components/shared/header.tsx +122 -37
- package/dist/cli/commands/add.d.ts +0 -6
- package/dist/cli/commands/add.d.ts.map +0 -1
- package/dist/cli/commands/add.js +0 -39
- package/dist/cli/commands/add.js.map +0 -1
- package/dist/cli/commands/index.d.ts +0 -4
- package/dist/cli/commands/index.d.ts.map +0 -1
- package/dist/cli/commands/index.js +0 -20
- package/dist/cli/commands/index.js.map +0 -1
- package/dist/cli/commands/update.d.ts +0 -6
- package/dist/cli/commands/update.d.ts.map +0 -1
- package/dist/cli/commands/update.js +0 -68
- package/dist/cli/commands/update.js.map +0 -1
- package/dist/cli/index.d.ts +0 -4
- package/dist/cli/index.d.ts.map +0 -1
- package/dist/cli/index.js +0 -61
- package/dist/cli/index.js.map +0 -1
- package/dist/cli/prompts/index.d.ts +0 -2
- package/dist/cli/prompts/index.d.ts.map +0 -1
- package/dist/cli/prompts/index.js +0 -18
- package/dist/cli/prompts/index.js.map +0 -1
- package/dist/cli/prompts/project-setup.d.ts +0 -5
- package/dist/cli/prompts/project-setup.d.ts.map +0 -1
- package/dist/cli/prompts/project-setup.js +0 -251
- package/dist/cli/prompts/project-setup.js.map +0 -1
- package/dist/cli/utils/git.d.ts +0 -9
- package/dist/cli/utils/git.d.ts.map +0 -1
- package/dist/cli/utils/git.js +0 -77
- package/dist/cli/utils/git.js.map +0 -1
- package/dist/cli/utils/index.d.ts +0 -5
- package/dist/cli/utils/index.d.ts.map +0 -1
- package/dist/cli/utils/index.js +0 -21
- package/dist/cli/utils/index.js.map +0 -1
- package/dist/cli/utils/logger.d.ts +0 -16
- package/dist/cli/utils/logger.d.ts.map +0 -1
- package/dist/cli/utils/logger.js +0 -55
- package/dist/cli/utils/logger.js.map +0 -1
- package/dist/cli/utils/package-manager.d.ts +0 -8
- package/dist/cli/utils/package-manager.d.ts.map +0 -1
- package/dist/cli/utils/package-manager.js +0 -92
- package/dist/cli/utils/package-manager.js.map +0 -1
- package/dist/cli/utils/spinner.d.ts +0 -7
- package/dist/cli/utils/spinner.d.ts.map +0 -1
- package/dist/cli/utils/spinner.js +0 -48
- package/dist/cli/utils/spinner.js.map +0 -1
- package/dist/cli/validators/dependencies.d.ts +0 -15
- package/dist/cli/validators/dependencies.d.ts.map +0 -1
- package/dist/cli/validators/dependencies.js +0 -108
- package/dist/cli/validators/dependencies.js.map +0 -1
- package/dist/cli/validators/index.d.ts +0 -3
- package/dist/cli/validators/index.d.ts.map +0 -1
- package/dist/cli/validators/index.js +0 -19
- package/dist/cli/validators/index.js.map +0 -1
- package/dist/cli/validators/project-name.d.ts +0 -5
- package/dist/cli/validators/project-name.d.ts.map +0 -1
- package/dist/cli/validators/project-name.js +0 -151
- package/dist/cli/validators/project-name.js.map +0 -1
- package/dist/generators/file-processor.d.ts +0 -28
- package/dist/generators/file-processor.d.ts.map +0 -1
- package/dist/generators/file-processor.js +0 -224
- package/dist/generators/file-processor.js.map +0 -1
- package/dist/generators/index.d.ts +0 -4
- package/dist/generators/index.d.ts.map +0 -1
- package/dist/generators/index.js +0 -20
- package/dist/generators/index.js.map +0 -1
- package/dist/generators/package-installer.d.ts +0 -29
- package/dist/generators/package-installer.d.ts.map +0 -1
- package/dist/generators/package-installer.js +0 -167
- package/dist/generators/package-installer.js.map +0 -1
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
Card,
|
|
5
|
+
Button,
|
|
6
|
+
PageTransition,
|
|
7
|
+
MobileContainer,
|
|
8
|
+
ResponsiveGrid,
|
|
9
|
+
useAnimationTokens,
|
|
10
|
+
useGlassmorphism
|
|
11
|
+
} from '@digilogiclabs/saas-factory-ui'
|
|
12
|
+
import {
|
|
13
|
+
ArrowLeft,
|
|
14
|
+
CheckCircle,
|
|
15
|
+
AlertCircle,
|
|
16
|
+
ExternalLink,
|
|
17
|
+
Copy,
|
|
18
|
+
Database,
|
|
19
|
+
CreditCard,
|
|
20
|
+
Shield,
|
|
21
|
+
Headphones,
|
|
22
|
+
Key,
|
|
23
|
+
Settings,
|
|
24
|
+
BookOpen,
|
|
25
|
+
Zap,
|
|
26
|
+
Code2,
|
|
27
|
+
FileText,
|
|
28
|
+
Music
|
|
29
|
+
} from 'lucide-react'
|
|
30
|
+
import Link from 'next/link'
|
|
31
|
+
import { useState } from 'react'
|
|
32
|
+
|
|
33
|
+
export default function SetupPage() {
|
|
34
|
+
const animations = useAnimationTokens()
|
|
35
|
+
const glass = useGlassmorphism()
|
|
36
|
+
const [copiedVar, setCopiedVar] = useState<string | null>(null)
|
|
37
|
+
|
|
38
|
+
const projectName = "{{projectName}}"
|
|
39
|
+
const templateName = "Audio Platform with Payments"
|
|
40
|
+
const templateDescription = "UI + Authentication + Payments + Audio Features"
|
|
41
|
+
|
|
42
|
+
const envVars = [
|
|
43
|
+
{ name: "NEXT_PUBLIC_SUPABASE_URL", example: "https://your-project.supabase.co", required: true },
|
|
44
|
+
{ name: "NEXT_PUBLIC_SUPABASE_ANON_KEY", example: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", required: true },
|
|
45
|
+
{ name: "SUPABASE_SERVICE_ROLE_KEY", example: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", required: false },
|
|
46
|
+
{ name: "NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY", example: "pk_test_51234567890abcdef...", required: true },
|
|
47
|
+
{ name: "STRIPE_SECRET_KEY", example: "sk_test_51234567890abcdef...", required: true },
|
|
48
|
+
{ name: "STRIPE_WEBHOOK_SECRET", example: "whsec_1234567890abcdef...", required: true },
|
|
49
|
+
{ name: "ELEVENLABS_API_KEY", example: "sk-1234567890abcdef...", required: false },
|
|
50
|
+
{ name: "OPENAI_API_KEY", example: "sk-1234567890abcdef...", required: false }
|
|
51
|
+
]
|
|
52
|
+
|
|
53
|
+
const copyToClipboard = async (text: string, varName: string) => {
|
|
54
|
+
await navigator.clipboard.writeText(text)
|
|
55
|
+
setCopiedVar(varName)
|
|
56
|
+
setTimeout(() => setCopiedVar(null), 2000)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return (
|
|
60
|
+
<PageTransition type="slide" direction="up" duration={300}>
|
|
61
|
+
<main className={`min-h-screen ${glass.background.primary} relative overflow-hidden`}>
|
|
62
|
+
<div className={`absolute inset-0 ${glass.background.accent} opacity-30`} />
|
|
63
|
+
<div className="relative z-10">
|
|
64
|
+
<MobileContainer className="py-8">
|
|
65
|
+
{/* Header */}
|
|
66
|
+
<div className="flex items-center justify-between mb-8">
|
|
67
|
+
<div className="flex items-center gap-4">
|
|
68
|
+
<Link href="/" className={`${glass.card} ${glass.border} p-2 rounded-xl ${animations.hover.scale}`}>
|
|
69
|
+
<ArrowLeft className="w-5 h-5" />
|
|
70
|
+
</Link>
|
|
71
|
+
<div>
|
|
72
|
+
<h1 className="text-2xl font-bold">Setup Guide</h1>
|
|
73
|
+
<p className="text-gray-600 dark:text-gray-300">{templateName}</p>
|
|
74
|
+
</div>
|
|
75
|
+
</div>
|
|
76
|
+
<div className={`${glass.card} ${glass.border} px-4 py-2 rounded-xl`}>
|
|
77
|
+
<span className="text-sm font-medium">{projectName}</span>
|
|
78
|
+
</div>
|
|
79
|
+
</div>
|
|
80
|
+
|
|
81
|
+
{/* Template Overview */}
|
|
82
|
+
<div className={`${glass.card} ${glass.border} rounded-2xl p-6 mb-8`}>
|
|
83
|
+
<div className="flex items-center gap-4 mb-4">
|
|
84
|
+
<div className={`w-12 h-12 rounded-xl bg-gradient-to-r from-purple-500 to-green-500 flex items-center justify-center`}>
|
|
85
|
+
<Headphones className="w-6 h-6 text-white" />
|
|
86
|
+
</div>
|
|
87
|
+
<div>
|
|
88
|
+
<h2 className="text-xl font-semibold">{templateName}</h2>
|
|
89
|
+
<p className="text-gray-600 dark:text-gray-300">{templateDescription}</p>
|
|
90
|
+
</div>
|
|
91
|
+
</div>
|
|
92
|
+
<div className="grid grid-cols-2 md:grid-cols-4 gap-4 mt-6">
|
|
93
|
+
<div className="text-center p-3 rounded-xl bg-blue-500/10">
|
|
94
|
+
<Shield className="w-6 h-6 text-blue-400 mx-auto mb-2" />
|
|
95
|
+
<div className="text-sm font-medium">Authentication</div>
|
|
96
|
+
</div>
|
|
97
|
+
<div className="text-center p-3 rounded-xl bg-green-500/10">
|
|
98
|
+
<CreditCard className="w-6 h-6 text-green-400 mx-auto mb-2" />
|
|
99
|
+
<div className="text-sm font-medium">Payments</div>
|
|
100
|
+
</div>
|
|
101
|
+
<div className="text-center p-3 rounded-xl bg-purple-500/10">
|
|
102
|
+
<Music className="w-6 h-6 text-purple-400 mx-auto mb-2" />
|
|
103
|
+
<div className="text-sm font-medium">Audio Platform</div>
|
|
104
|
+
</div>
|
|
105
|
+
<div className="text-center p-3 rounded-xl bg-orange-500/10">
|
|
106
|
+
<Code2 className="w-6 h-6 text-orange-400 mx-auto mb-2" />
|
|
107
|
+
<div className="text-sm font-medium">Modern UI</div>
|
|
108
|
+
</div>
|
|
109
|
+
</div>
|
|
110
|
+
</div>
|
|
111
|
+
|
|
112
|
+
{/* Quick Start */}
|
|
113
|
+
<div className={`${glass.card} ${glass.border} rounded-2xl p-6 mb-8`}>
|
|
114
|
+
<h3 className="text-lg font-semibold mb-4 flex items-center gap-2">
|
|
115
|
+
<Zap className="w-5 h-5 text-yellow-400" />
|
|
116
|
+
Quick Start
|
|
117
|
+
</h3>
|
|
118
|
+
<div className="space-y-3 text-sm">
|
|
119
|
+
<div className="flex items-center gap-3">
|
|
120
|
+
<CheckCircle className="w-5 h-5 text-green-400" />
|
|
121
|
+
<span>1. Set up Supabase for database and authentication</span>
|
|
122
|
+
</div>
|
|
123
|
+
<div className="flex items-center gap-3">
|
|
124
|
+
<CheckCircle className="w-5 h-5 text-green-400" />
|
|
125
|
+
<span>2. Configure Stripe for payment processing</span>
|
|
126
|
+
</div>
|
|
127
|
+
<div className="flex items-center gap-3">
|
|
128
|
+
<CheckCircle className="w-5 h-5 text-green-400" />
|
|
129
|
+
<span>3. (Optional) Add audio AI providers like ElevenLabs</span>
|
|
130
|
+
</div>
|
|
131
|
+
<div className="flex items-center gap-3">
|
|
132
|
+
<CheckCircle className="w-5 h-5 text-green-400" />
|
|
133
|
+
<span>4. Configure environment variables below</span>
|
|
134
|
+
</div>
|
|
135
|
+
<div className="flex items-center gap-3">
|
|
136
|
+
<CheckCircle className="w-5 h-5 text-green-400" />
|
|
137
|
+
<span>5. Run <code className="px-2 py-1 bg-gray-800 rounded text-green-400">npm run dev</code></span>
|
|
138
|
+
</div>
|
|
139
|
+
</div>
|
|
140
|
+
</div>
|
|
141
|
+
|
|
142
|
+
{/* Environment Variables */}
|
|
143
|
+
<div className={`${glass.card} ${glass.border} rounded-2xl p-6 mb-8`}>
|
|
144
|
+
<h3 className="text-lg font-semibold mb-4 flex items-center gap-2">
|
|
145
|
+
<Key className="w-5 h-5 text-blue-400" />
|
|
146
|
+
Environment Variables
|
|
147
|
+
</h3>
|
|
148
|
+
<p className="text-sm text-gray-600 dark:text-gray-300 mb-4">
|
|
149
|
+
Copy these to your <code className="px-2 py-1 bg-gray-800 rounded">.env.local</code> file:
|
|
150
|
+
</p>
|
|
151
|
+
<div className="bg-gray-900 rounded-xl p-4 overflow-x-auto">
|
|
152
|
+
<pre className="text-sm text-green-400">
|
|
153
|
+
{envVars.map(envVar => (
|
|
154
|
+
`${envVar.name}=${envVar.example}${envVar.required ? ' # Required' : ' # Optional'}`
|
|
155
|
+
)).join('\n')}
|
|
156
|
+
</pre>
|
|
157
|
+
<button
|
|
158
|
+
onClick={() => copyToClipboard(
|
|
159
|
+
envVars.map(envVar => `${envVar.name}=${envVar.example}`).join('\n'),
|
|
160
|
+
'all-env-vars'
|
|
161
|
+
)}
|
|
162
|
+
className="mt-3 flex items-center gap-2 text-xs text-gray-400 hover:text-white transition-colors"
|
|
163
|
+
>
|
|
164
|
+
<Copy className="w-4 h-4" />
|
|
165
|
+
{copiedVar === 'all-env-vars' ? 'Copied!' : 'Copy all environment variables'}
|
|
166
|
+
</button>
|
|
167
|
+
</div>
|
|
168
|
+
</div>
|
|
169
|
+
|
|
170
|
+
{/* Services Overview */}
|
|
171
|
+
<div className={`${glass.card} ${glass.border} rounded-2xl p-6 mb-8`}>
|
|
172
|
+
<h3 className="text-lg font-semibold mb-4 flex items-center gap-2">
|
|
173
|
+
<Settings className="w-5 h-5 text-gray-400" />
|
|
174
|
+
Required Services
|
|
175
|
+
</h3>
|
|
176
|
+
<div className="space-y-4">
|
|
177
|
+
{/* Supabase */}
|
|
178
|
+
<div className="flex items-center gap-4 p-4 bg-blue-500/10 rounded-xl">
|
|
179
|
+
<Database className="w-8 h-8 text-blue-400" />
|
|
180
|
+
<div className="flex-1">
|
|
181
|
+
<h4 className="font-semibold">Supabase</h4>
|
|
182
|
+
<p className="text-sm text-gray-600 dark:text-gray-300">Database and authentication</p>
|
|
183
|
+
</div>
|
|
184
|
+
<span className="px-3 py-1 bg-red-500/20 text-red-400 rounded-full text-xs">Required</span>
|
|
185
|
+
<a href="https://supabase.com/dashboard" className="text-blue-400 hover:text-blue-300">
|
|
186
|
+
<ExternalLink className="w-4 h-4" />
|
|
187
|
+
</a>
|
|
188
|
+
</div>
|
|
189
|
+
|
|
190
|
+
{/* Stripe */}
|
|
191
|
+
<div className="flex items-center gap-4 p-4 bg-green-500/10 rounded-xl">
|
|
192
|
+
<CreditCard className="w-8 h-8 text-green-400" />
|
|
193
|
+
<div className="flex-1">
|
|
194
|
+
<h4 className="font-semibold">Stripe</h4>
|
|
195
|
+
<p className="text-sm text-gray-600 dark:text-gray-300">Payment processing</p>
|
|
196
|
+
</div>
|
|
197
|
+
<span className="px-3 py-1 bg-red-500/20 text-red-400 rounded-full text-xs">Required</span>
|
|
198
|
+
<a href="https://dashboard.stripe.com" className="text-green-400 hover:text-green-300">
|
|
199
|
+
<ExternalLink className="w-4 h-4" />
|
|
200
|
+
</a>
|
|
201
|
+
</div>
|
|
202
|
+
|
|
203
|
+
{/* Audio Services */}
|
|
204
|
+
<div className="flex items-center gap-4 p-4 bg-purple-500/10 rounded-xl">
|
|
205
|
+
<Headphones className="w-8 h-8 text-purple-400" />
|
|
206
|
+
<div className="flex-1">
|
|
207
|
+
<h4 className="font-semibold">Audio Services</h4>
|
|
208
|
+
<p className="text-sm text-gray-600 dark:text-gray-300">ElevenLabs, OpenAI for audio generation</p>
|
|
209
|
+
</div>
|
|
210
|
+
<span className="px-3 py-1 bg-yellow-500/20 text-yellow-400 rounded-full text-xs">Optional</span>
|
|
211
|
+
</div>
|
|
212
|
+
</div>
|
|
213
|
+
</div>
|
|
214
|
+
|
|
215
|
+
{/* Database Setup */}
|
|
216
|
+
<div className={`${glass.card} ${glass.border} rounded-2xl p-6 mb-8`}>
|
|
217
|
+
<h3 className="text-lg font-semibold mb-4">Database Setup</h3>
|
|
218
|
+
<p className="text-sm text-gray-600 dark:text-gray-300 mb-4">
|
|
219
|
+
Run this SQL in your Supabase SQL editor to set up the required tables:
|
|
220
|
+
</p>
|
|
221
|
+
<div className="bg-gray-900 rounded-xl p-4 overflow-x-auto">
|
|
222
|
+
<pre className="text-xs text-green-400">
|
|
223
|
+
{`-- User profiles table
|
|
224
|
+
CREATE TABLE profiles (
|
|
225
|
+
id UUID REFERENCES auth.users(id) PRIMARY KEY,
|
|
226
|
+
email TEXT,
|
|
227
|
+
full_name TEXT,
|
|
228
|
+
avatar_url TEXT,
|
|
229
|
+
stripe_customer_id TEXT,
|
|
230
|
+
subscription_status TEXT DEFAULT 'inactive',
|
|
231
|
+
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
|
232
|
+
);
|
|
233
|
+
|
|
234
|
+
-- Audio content table
|
|
235
|
+
CREATE TABLE audio_content (
|
|
236
|
+
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
|
|
237
|
+
user_id UUID REFERENCES profiles(id),
|
|
238
|
+
title TEXT NOT NULL,
|
|
239
|
+
description TEXT,
|
|
240
|
+
audio_url TEXT,
|
|
241
|
+
duration INTEGER,
|
|
242
|
+
file_size BIGINT,
|
|
243
|
+
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
|
244
|
+
);
|
|
245
|
+
|
|
246
|
+
-- Enable RLS
|
|
247
|
+
ALTER TABLE profiles ENABLE ROW LEVEL SECURITY;
|
|
248
|
+
ALTER TABLE audio_content ENABLE ROW LEVEL SECURITY;
|
|
249
|
+
|
|
250
|
+
-- RLS Policies
|
|
251
|
+
CREATE POLICY "Users can view own profile" ON profiles FOR SELECT USING (auth.uid() = id);
|
|
252
|
+
CREATE POLICY "Users can update own profile" ON profiles FOR UPDATE USING (auth.uid() = id);
|
|
253
|
+
CREATE POLICY "Users can manage own audio content" ON audio_content FOR ALL USING (auth.uid() = user_id);`}
|
|
254
|
+
</pre>
|
|
255
|
+
<button
|
|
256
|
+
onClick={() => copyToClipboard(`-- User profiles table
|
|
257
|
+
CREATE TABLE profiles (
|
|
258
|
+
id UUID REFERENCES auth.users(id) PRIMARY KEY,
|
|
259
|
+
email TEXT,
|
|
260
|
+
full_name TEXT,
|
|
261
|
+
avatar_url TEXT,
|
|
262
|
+
stripe_customer_id TEXT,
|
|
263
|
+
subscription_status TEXT DEFAULT 'inactive',
|
|
264
|
+
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
|
265
|
+
);
|
|
266
|
+
|
|
267
|
+
-- Audio content table
|
|
268
|
+
CREATE TABLE audio_content (
|
|
269
|
+
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
|
|
270
|
+
user_id UUID REFERENCES profiles(id),
|
|
271
|
+
title TEXT NOT NULL,
|
|
272
|
+
description TEXT,
|
|
273
|
+
audio_url TEXT,
|
|
274
|
+
duration INTEGER,
|
|
275
|
+
file_size BIGINT,
|
|
276
|
+
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
|
277
|
+
);
|
|
278
|
+
|
|
279
|
+
-- Enable RLS
|
|
280
|
+
ALTER TABLE profiles ENABLE ROW LEVEL SECURITY;
|
|
281
|
+
ALTER TABLE audio_content ENABLE ROW LEVEL SECURITY;
|
|
282
|
+
|
|
283
|
+
-- RLS Policies
|
|
284
|
+
CREATE POLICY "Users can view own profile" ON profiles FOR SELECT USING (auth.uid() = id);
|
|
285
|
+
CREATE POLICY "Users can update own profile" ON profiles FOR UPDATE USING (auth.uid() = id);
|
|
286
|
+
CREATE POLICY "Users can manage own audio content" ON audio_content FOR ALL USING (auth.uid() = user_id);`, 'sql-setup')}
|
|
287
|
+
className="mt-3 flex items-center gap-2 text-xs text-gray-400 hover:text-white transition-colors"
|
|
288
|
+
>
|
|
289
|
+
<Copy className="w-4 h-4" />
|
|
290
|
+
{copiedVar === 'sql-setup' ? 'Copied!' : 'Copy SQL setup'}
|
|
291
|
+
</button>
|
|
292
|
+
</div>
|
|
293
|
+
</div>
|
|
294
|
+
|
|
295
|
+
{/* Additional Resources */}
|
|
296
|
+
<div className={`${glass.card} ${glass.border} rounded-2xl p-6 mt-8`}>
|
|
297
|
+
<h3 className="text-lg font-semibold mb-4 flex items-center gap-2">
|
|
298
|
+
<BookOpen className="w-5 h-5 text-green-400" />
|
|
299
|
+
Additional Resources
|
|
300
|
+
</h3>
|
|
301
|
+
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
|
|
302
|
+
<a
|
|
303
|
+
href="https://docs.digilogiclabs.com"
|
|
304
|
+
className={`${glass.card} ${glass.border} p-4 rounded-xl ${animations.hover.scale} block`}
|
|
305
|
+
>
|
|
306
|
+
<FileText className="w-8 h-8 text-blue-400 mb-2" />
|
|
307
|
+
<h4 className="font-medium">Documentation</h4>
|
|
308
|
+
<p className="text-sm text-gray-600 dark:text-gray-300">Complete guides and API reference</p>
|
|
309
|
+
</a>
|
|
310
|
+
<a
|
|
311
|
+
href="https://github.com/digilogiclabs/examples"
|
|
312
|
+
className={`${glass.card} ${glass.border} p-4 rounded-xl ${animations.hover.scale} block`}
|
|
313
|
+
>
|
|
314
|
+
<Code2 className="w-8 h-8 text-purple-400 mb-2" />
|
|
315
|
+
<h4 className="font-medium">Examples</h4>
|
|
316
|
+
<p className="text-sm text-gray-600 dark:text-gray-300">Sample projects and code snippets</p>
|
|
317
|
+
</a>
|
|
318
|
+
</div>
|
|
319
|
+
</div>
|
|
320
|
+
|
|
321
|
+
{/* Support */}
|
|
322
|
+
<div className={`${glass.card} ${glass.border} rounded-2xl p-6 mt-8 text-center`}>
|
|
323
|
+
<h3 className="text-lg font-semibold mb-4">Need Help?</h3>
|
|
324
|
+
<p className="text-gray-600 dark:text-gray-300 mb-4">
|
|
325
|
+
Our community and support team are here to help you get started.
|
|
326
|
+
</p>
|
|
327
|
+
<div className="flex justify-center gap-4">
|
|
328
|
+
<Button variant="outline" size="sm" asChild>
|
|
329
|
+
<a href="https://discord.gg/digilogiclabs" target="_blank" rel="noopener noreferrer">
|
|
330
|
+
Join Discord
|
|
331
|
+
</a>
|
|
332
|
+
</Button>
|
|
333
|
+
<Button size="sm" asChild>
|
|
334
|
+
<a href="https://docs.digilogiclabs.com/support" target="_blank" rel="noopener noreferrer">
|
|
335
|
+
Get Support
|
|
336
|
+
</a>
|
|
337
|
+
</Button>
|
|
338
|
+
</div>
|
|
339
|
+
</div>
|
|
340
|
+
</MobileContainer>
|
|
341
|
+
</div>
|
|
342
|
+
</main>
|
|
343
|
+
</PageTransition>
|
|
344
|
+
)
|
|
345
|
+
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
-
import React from 'react';
|
|
3
|
+
import React, { useState } from 'react';
|
|
4
4
|
import Link from 'next/link';
|
|
5
|
-
import { LogOut, CreditCard, User, Settings, Home, Music, Headphones } from 'lucide-react';
|
|
5
|
+
import { LogOut, CreditCard, User, Settings, Home, Music, Headphones, Menu, X } from 'lucide-react';
|
|
6
6
|
import { useAuth } from '@digilogiclabs/saas-factory-auth';
|
|
7
7
|
import {
|
|
8
8
|
ResponsiveHeader,
|
|
@@ -17,27 +17,10 @@ export function Header() {
|
|
|
17
17
|
const { user, signOut } = useAuth();
|
|
18
18
|
const networkInfo = useNetworkInfo();
|
|
19
19
|
const isOnline = useOfflineState();
|
|
20
|
+
const [mobileMenuOpen, setMobileMenuOpen] = useState(false);
|
|
20
21
|
|
|
21
22
|
const projectName = "{{titleCaseName}}";
|
|
22
23
|
|
|
23
|
-
const headerConfig = {
|
|
24
|
-
logo: {
|
|
25
|
-
text: projectName,
|
|
26
|
-
href: '/',
|
|
27
|
-
className: 'text-2xl font-bold flex items-center gap-2',
|
|
28
|
-
icon: <Music className="w-6 h-6" />
|
|
29
|
-
},
|
|
30
|
-
networkStatus: {
|
|
31
|
-
isOnline,
|
|
32
|
-
connectionType: networkInfo?.effectiveType,
|
|
33
|
-
showIndicator: true,
|
|
34
|
-
customLabels: {
|
|
35
|
-
online: 'Streaming Ready',
|
|
36
|
-
offline: 'Offline Mode'
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
};
|
|
40
|
-
|
|
41
24
|
const handleSignOut = async () => {
|
|
42
25
|
try {
|
|
43
26
|
await signOut();
|
|
@@ -111,6 +94,9 @@ export function Header() {
|
|
|
111
94
|
}
|
|
112
95
|
];
|
|
113
96
|
|
|
97
|
+
// Filter navigation items based on user authentication
|
|
98
|
+
const visibleNavItems = navigationItems.filter(item => !item.protected || user);
|
|
99
|
+
|
|
114
100
|
return (
|
|
115
101
|
<>
|
|
116
102
|
{/* Network Status Banner */}
|
|
@@ -138,23 +124,122 @@ export function Header() {
|
|
|
138
124
|
</div>
|
|
139
125
|
)}
|
|
140
126
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
127
|
+
{/* Responsive Header */}
|
|
128
|
+
<header className="bg-white dark:bg-gray-800 shadow-md border-b">
|
|
129
|
+
<div className="container mx-auto px-4">
|
|
130
|
+
<div className="flex justify-between items-center h-16">
|
|
131
|
+
{/* Logo */}
|
|
132
|
+
<Link href="/" className="text-2xl font-bold text-gray-900 dark:text-white flex items-center gap-2">
|
|
133
|
+
<Music className="w-6 h-6" />
|
|
134
|
+
{projectName}
|
|
135
|
+
</Link>
|
|
136
|
+
|
|
137
|
+
{/* Desktop Navigation */}
|
|
138
|
+
<nav className="hidden md:flex items-center gap-6">
|
|
139
|
+
{visibleNavItems.map((item) => (
|
|
140
|
+
<Link
|
|
141
|
+
key={item.href}
|
|
142
|
+
href={item.href}
|
|
143
|
+
className="flex items-center gap-2 text-gray-600 dark:text-gray-300 hover:text-gray-900 dark:hover:text-white transition-colors"
|
|
144
|
+
>
|
|
145
|
+
<item.icon className="w-4 h-4" />
|
|
146
|
+
{item.label}
|
|
147
|
+
</Link>
|
|
148
|
+
))}
|
|
149
|
+
|
|
150
|
+
{/* Auth Actions */}
|
|
151
|
+
<div className="flex items-center gap-2 ml-4 pl-4 border-l border-gray-200 dark:border-gray-600">
|
|
152
|
+
<ThemeToggle />
|
|
153
|
+
{user ? (
|
|
154
|
+
<button
|
|
155
|
+
onClick={handleSignOut}
|
|
156
|
+
className="flex items-center gap-2 px-3 py-2 text-gray-600 dark:text-gray-300 hover:text-gray-900 dark:hover:text-white transition-colors"
|
|
157
|
+
>
|
|
158
|
+
<LogOut className="w-4 h-4" />
|
|
159
|
+
Sign Out
|
|
160
|
+
</button>
|
|
161
|
+
) : (
|
|
162
|
+
<div className="flex items-center gap-2">
|
|
163
|
+
<Link
|
|
164
|
+
href="/login"
|
|
165
|
+
className="text-gray-600 dark:text-gray-300 hover:text-gray-900 dark:hover:text-white transition-colors"
|
|
166
|
+
>
|
|
167
|
+
Login
|
|
168
|
+
</Link>
|
|
169
|
+
<Link
|
|
170
|
+
href="/signup"
|
|
171
|
+
className="px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700 transition-colors"
|
|
172
|
+
>
|
|
173
|
+
Sign Up
|
|
174
|
+
</Link>
|
|
175
|
+
</div>
|
|
176
|
+
)}
|
|
177
|
+
</div>
|
|
178
|
+
</nav>
|
|
179
|
+
|
|
180
|
+
{/* Mobile Menu Button */}
|
|
181
|
+
<button
|
|
182
|
+
onClick={() => setMobileMenuOpen(!mobileMenuOpen)}
|
|
183
|
+
className="md:hidden p-2 text-gray-600 dark:text-gray-300 hover:text-gray-900 dark:hover:text-white"
|
|
184
|
+
>
|
|
185
|
+
{mobileMenuOpen ? <X className="w-6 h-6" /> : <Menu className="w-6 h-6" />}
|
|
186
|
+
</button>
|
|
187
|
+
</div>
|
|
188
|
+
|
|
189
|
+
{/* Mobile Menu */}
|
|
190
|
+
{mobileMenuOpen && (
|
|
191
|
+
<div className="md:hidden border-t border-gray-200 dark:border-gray-600 py-4">
|
|
192
|
+
<nav className="flex flex-col space-y-3">
|
|
193
|
+
{visibleNavItems.map((item) => (
|
|
194
|
+
<Link
|
|
195
|
+
key={item.href}
|
|
196
|
+
href={item.href}
|
|
197
|
+
onClick={() => setMobileMenuOpen(false)}
|
|
198
|
+
className="flex items-center gap-3 px-3 py-2 text-gray-600 dark:text-gray-300 hover:text-gray-900 dark:hover:text-white hover:bg-gray-100 dark:hover:bg-gray-700 rounded transition-colors"
|
|
199
|
+
>
|
|
200
|
+
<item.icon className="w-4 h-4" />
|
|
201
|
+
{item.label}
|
|
202
|
+
</Link>
|
|
203
|
+
))}
|
|
204
|
+
|
|
205
|
+
{/* Mobile Auth Actions */}
|
|
206
|
+
<div className="flex items-center gap-3 px-3 pt-3 border-t border-gray-200 dark:border-gray-600">
|
|
207
|
+
<ThemeToggle />
|
|
208
|
+
{user ? (
|
|
209
|
+
<button
|
|
210
|
+
onClick={() => {
|
|
211
|
+
handleSignOut();
|
|
212
|
+
setMobileMenuOpen(false);
|
|
213
|
+
}}
|
|
214
|
+
className="flex items-center gap-2 px-3 py-2 text-gray-600 dark:text-gray-300 hover:text-gray-900 dark:hover:text-white hover:bg-gray-100 dark:hover:bg-gray-700 rounded transition-colors"
|
|
215
|
+
>
|
|
216
|
+
<LogOut className="w-4 h-4" />
|
|
217
|
+
Sign Out
|
|
218
|
+
</button>
|
|
219
|
+
) : (
|
|
220
|
+
<div className="flex flex-col gap-2 w-full">
|
|
221
|
+
<Link
|
|
222
|
+
href="/login"
|
|
223
|
+
onClick={() => setMobileMenuOpen(false)}
|
|
224
|
+
className="text-center py-2 text-gray-600 dark:text-gray-300 hover:text-gray-900 dark:hover:text-white hover:bg-gray-100 dark:hover:bg-gray-700 rounded transition-colors"
|
|
225
|
+
>
|
|
226
|
+
Login
|
|
227
|
+
</Link>
|
|
228
|
+
<Link
|
|
229
|
+
href="/signup"
|
|
230
|
+
onClick={() => setMobileMenuOpen(false)}
|
|
231
|
+
className="text-center py-2 bg-blue-600 text-white rounded hover:bg-blue-700 transition-colors"
|
|
232
|
+
>
|
|
233
|
+
Sign Up
|
|
234
|
+
</Link>
|
|
235
|
+
</div>
|
|
236
|
+
)}
|
|
237
|
+
</div>
|
|
238
|
+
</nav>
|
|
239
|
+
</div>
|
|
240
|
+
)}
|
|
241
|
+
</div>
|
|
242
|
+
</header>
|
|
158
243
|
</>
|
|
159
244
|
);
|
|
160
245
|
}
|