@digilogiclabs/create-saas-app 1.10.7 → 1.13.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.
Files changed (146) hide show
  1. package/README.md +331 -350
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/cli/commands/create.js +2 -2
  4. package/dist/cli/commands/create.js.map +1 -1
  5. package/dist/generators/template-generator.d.ts.map +1 -1
  6. package/dist/generators/template-generator.js +14 -2
  7. package/dist/generators/template-generator.js.map +1 -1
  8. package/dist/templates/web/ui-auth/template/.claude +21 -0
  9. package/dist/templates/web/ui-auth/template/context.md +105 -0
  10. package/dist/templates/web/ui-auth/template/package.json +2 -2
  11. package/dist/templates/web/ui-auth/template/src/app/dev-setup/page.tsx +801 -0
  12. package/dist/templates/web/ui-auth/template/src/app/setup/page.tsx +403 -0
  13. package/dist/templates/web/ui-auth-payments/template/package.json +3 -3
  14. package/dist/templates/web/ui-auth-payments/template/src/app/dev-setup/page.tsx +801 -0
  15. package/dist/templates/web/ui-auth-payments/template/src/app/setup/page.tsx +507 -0
  16. package/dist/templates/web/ui-auth-payments/template/src/components/shared/header.tsx +127 -32
  17. package/dist/templates/web/ui-auth-payments-ai/template/.claude +21 -0
  18. package/dist/templates/web/ui-auth-payments-ai/template/.env.example +22 -0
  19. package/dist/templates/web/ui-auth-payments-ai/template/README.md +207 -0
  20. package/dist/templates/web/ui-auth-payments-ai/template/context.md +169 -0
  21. package/dist/templates/web/ui-auth-payments-ai/template/middleware.ts +68 -0
  22. package/dist/templates/web/ui-auth-payments-ai/template/next.config.js +12 -0
  23. package/dist/templates/web/ui-auth-payments-ai/template/package-lock.json +12241 -0
  24. package/dist/templates/web/ui-auth-payments-ai/template/package.json +55 -0
  25. package/dist/templates/web/ui-auth-payments-ai/template/postcss.config.js +7 -0
  26. package/dist/templates/web/ui-auth-payments-ai/template/src/app/ai/page.tsx +310 -0
  27. package/dist/templates/web/ui-auth-payments-ai/template/src/app/api/ai/audio/route.ts +56 -0
  28. package/dist/templates/web/ui-auth-payments-ai/template/src/app/api/ai/chat/route.ts +49 -0
  29. package/dist/templates/web/ui-auth-payments-ai/template/src/app/api/ai/text/route.ts +64 -0
  30. package/dist/templates/web/ui-auth-payments-ai/template/src/app/api/ai/video/route.ts +73 -0
  31. package/dist/templates/web/ui-auth-payments-ai/template/src/app/auth/callback/route.ts +12 -0
  32. package/dist/templates/web/ui-auth-payments-ai/template/src/app/billing/page.tsx +211 -0
  33. package/dist/templates/web/ui-auth-payments-ai/template/src/app/checkout/page.tsx +142 -0
  34. package/dist/templates/web/ui-auth-payments-ai/template/src/app/dashboard/layout.tsx +22 -0
  35. package/dist/templates/web/ui-auth-payments-ai/template/src/app/dashboard/page.tsx +183 -0
  36. package/dist/templates/web/ui-auth-payments-ai/template/src/app/dev-setup/page.tsx +801 -0
  37. package/dist/templates/web/ui-auth-payments-ai/template/src/app/error.tsx +67 -0
  38. package/dist/templates/web/ui-auth-payments-ai/template/src/app/globals.css +43 -0
  39. package/dist/templates/web/ui-auth-payments-ai/template/src/app/layout.tsx +35 -0
  40. package/dist/templates/web/ui-auth-payments-ai/template/src/app/loading.tsx +20 -0
  41. package/dist/templates/web/ui-auth-payments-ai/template/src/app/login/page.tsx +6 -0
  42. package/dist/templates/web/ui-auth-payments-ai/template/src/app/page.tsx +384 -0
  43. package/dist/templates/web/ui-auth-payments-ai/template/src/app/page.tsx.backup +391 -0
  44. package/dist/templates/web/ui-auth-payments-ai/template/src/app/page.tsx.bak +391 -0
  45. package/dist/templates/web/ui-auth-payments-ai/template/src/app/setup/page.tsx +645 -0
  46. package/dist/templates/web/ui-auth-payments-ai/template/src/app/signup/page.tsx +6 -0
  47. package/dist/templates/web/ui-auth-payments-ai/template/src/components/__tests__/example.test.tsx +49 -0
  48. package/dist/templates/web/ui-auth-payments-ai/template/src/components/client/auth-status.tsx +52 -0
  49. package/dist/templates/web/ui-auth-payments-ai/template/src/components/client/login-form.tsx +144 -0
  50. package/dist/templates/web/ui-auth-payments-ai/template/src/components/client/signup-form.tsx +185 -0
  51. package/dist/templates/web/ui-auth-payments-ai/template/src/components/providers/app-providers.tsx +36 -0
  52. package/dist/templates/web/ui-auth-payments-ai/template/src/components/providers/theme-provider.tsx +96 -0
  53. package/dist/templates/web/ui-auth-payments-ai/template/src/components/shared/footer.tsx +36 -0
  54. package/dist/templates/web/ui-auth-payments-ai/template/src/components/shared/header.tsx +246 -0
  55. package/dist/templates/web/ui-auth-payments-ai/template/src/components/ui/badge.tsx +36 -0
  56. package/dist/templates/web/ui-auth-payments-ai/template/src/components/ui/theme-toggle.tsx +34 -0
  57. package/dist/templates/web/ui-auth-payments-ai/template/src/lib/actions/auth.ts +246 -0
  58. package/dist/templates/web/ui-auth-payments-ai/template/src/lib/actions/index.ts +14 -0
  59. package/dist/templates/web/ui-auth-payments-ai/template/src/lib/auth-server.ts +177 -0
  60. package/dist/templates/web/ui-auth-payments-ai/template/src/lib/env.ts +49 -0
  61. package/dist/templates/web/ui-auth-payments-ai/template/src/lib/supabase/server.ts +72 -0
  62. package/dist/templates/web/ui-auth-payments-ai/template/src/lib/utils.ts +140 -0
  63. package/dist/templates/web/ui-auth-payments-ai/template/src/test/setup.ts +79 -0
  64. package/dist/templates/web/ui-auth-payments-ai/template/tailwind.config.js +77 -0
  65. package/dist/templates/web/ui-auth-payments-ai/template/tsconfig.json +33 -0
  66. package/dist/templates/web/ui-auth-payments-ai/template/tsconfig.tsbuildinfo +1 -0
  67. package/dist/templates/web/ui-auth-payments-ai/template/vitest.config.ts +17 -0
  68. package/dist/templates/web/ui-auth-payments-audio/template/package.json +3 -3
  69. package/dist/templates/web/ui-auth-payments-audio/template/src/app/page.tsx +22 -20
  70. package/dist/templates/web/ui-auth-payments-audio/template/src/app/page.tsx.backup +391 -0
  71. package/dist/templates/web/ui-auth-payments-audio/template/src/app/page.tsx.bak +391 -0
  72. package/dist/templates/web/ui-auth-payments-audio/template/src/app/setup/page.tsx +345 -0
  73. package/dist/templates/web/ui-auth-payments-audio/template/src/components/shared/header.tsx +122 -37
  74. package/dist/templates/web/ui-auth-payments-video/template/package.json +3 -3
  75. package/dist/templates/web/ui-auth-payments-video/template/src/app/setup/page.tsx +351 -0
  76. package/dist/templates/web/ui-auth-payments-video/template/src/components/shared/header.tsx +122 -37
  77. package/package.json +1 -1
  78. package/src/templates/web/ui-auth/template/.claude +21 -0
  79. package/src/templates/web/ui-auth/template/context.md +105 -0
  80. package/src/templates/web/ui-auth/template/package.json +2 -2
  81. package/src/templates/web/ui-auth/template/src/app/dev-setup/page.tsx +801 -0
  82. package/src/templates/web/ui-auth/template/src/app/setup/page.tsx +403 -0
  83. package/src/templates/web/ui-auth-payments/template/package.json +3 -3
  84. package/src/templates/web/ui-auth-payments/template/src/app/dev-setup/page.tsx +801 -0
  85. package/src/templates/web/ui-auth-payments/template/src/app/setup/page.tsx +507 -0
  86. package/src/templates/web/ui-auth-payments/template/src/components/shared/header.tsx +127 -32
  87. package/src/templates/web/ui-auth-payments-ai/template/.claude +21 -0
  88. package/src/templates/web/ui-auth-payments-ai/template/.env.example +22 -0
  89. package/src/templates/web/ui-auth-payments-ai/template/README.md +207 -0
  90. package/src/templates/web/ui-auth-payments-ai/template/context.md +169 -0
  91. package/src/templates/web/ui-auth-payments-ai/template/middleware.ts +68 -0
  92. package/src/templates/web/ui-auth-payments-ai/template/next.config.js +12 -0
  93. package/src/templates/web/ui-auth-payments-ai/template/package-lock.json +12241 -0
  94. package/src/templates/web/ui-auth-payments-ai/template/package.json +55 -0
  95. package/src/templates/web/ui-auth-payments-ai/template/postcss.config.js +7 -0
  96. package/src/templates/web/ui-auth-payments-ai/template/src/app/ai/page.tsx +310 -0
  97. package/src/templates/web/ui-auth-payments-ai/template/src/app/api/ai/audio/route.ts +56 -0
  98. package/src/templates/web/ui-auth-payments-ai/template/src/app/api/ai/chat/route.ts +49 -0
  99. package/src/templates/web/ui-auth-payments-ai/template/src/app/api/ai/text/route.ts +64 -0
  100. package/src/templates/web/ui-auth-payments-ai/template/src/app/api/ai/video/route.ts +73 -0
  101. package/src/templates/web/ui-auth-payments-ai/template/src/app/auth/callback/route.ts +12 -0
  102. package/src/templates/web/ui-auth-payments-ai/template/src/app/billing/page.tsx +211 -0
  103. package/src/templates/web/ui-auth-payments-ai/template/src/app/checkout/page.tsx +142 -0
  104. package/src/templates/web/ui-auth-payments-ai/template/src/app/dashboard/layout.tsx +22 -0
  105. package/src/templates/web/ui-auth-payments-ai/template/src/app/dashboard/page.tsx +183 -0
  106. package/src/templates/web/ui-auth-payments-ai/template/src/app/dev-setup/page.tsx +801 -0
  107. package/src/templates/web/ui-auth-payments-ai/template/src/app/error.tsx +67 -0
  108. package/src/templates/web/ui-auth-payments-ai/template/src/app/globals.css +43 -0
  109. package/src/templates/web/ui-auth-payments-ai/template/src/app/layout.tsx +35 -0
  110. package/src/templates/web/ui-auth-payments-ai/template/src/app/loading.tsx +20 -0
  111. package/src/templates/web/ui-auth-payments-ai/template/src/app/login/page.tsx +6 -0
  112. package/src/templates/web/ui-auth-payments-ai/template/src/app/page.tsx +384 -0
  113. package/src/templates/web/ui-auth-payments-ai/template/src/app/page.tsx.backup +391 -0
  114. package/src/templates/web/ui-auth-payments-ai/template/src/app/page.tsx.bak +391 -0
  115. package/src/templates/web/ui-auth-payments-ai/template/src/app/setup/page.tsx +645 -0
  116. package/src/templates/web/ui-auth-payments-ai/template/src/app/signup/page.tsx +6 -0
  117. package/src/templates/web/ui-auth-payments-ai/template/src/components/__tests__/example.test.tsx +49 -0
  118. package/src/templates/web/ui-auth-payments-ai/template/src/components/client/auth-status.tsx +52 -0
  119. package/src/templates/web/ui-auth-payments-ai/template/src/components/client/login-form.tsx +144 -0
  120. package/src/templates/web/ui-auth-payments-ai/template/src/components/client/signup-form.tsx +185 -0
  121. package/src/templates/web/ui-auth-payments-ai/template/src/components/providers/app-providers.tsx +36 -0
  122. package/src/templates/web/ui-auth-payments-ai/template/src/components/providers/theme-provider.tsx +96 -0
  123. package/src/templates/web/ui-auth-payments-ai/template/src/components/shared/footer.tsx +36 -0
  124. package/src/templates/web/ui-auth-payments-ai/template/src/components/shared/header.tsx +246 -0
  125. package/src/templates/web/ui-auth-payments-ai/template/src/components/ui/badge.tsx +36 -0
  126. package/src/templates/web/ui-auth-payments-ai/template/src/components/ui/theme-toggle.tsx +34 -0
  127. package/src/templates/web/ui-auth-payments-ai/template/src/lib/actions/auth.ts +246 -0
  128. package/src/templates/web/ui-auth-payments-ai/template/src/lib/actions/index.ts +14 -0
  129. package/src/templates/web/ui-auth-payments-ai/template/src/lib/auth-server.ts +177 -0
  130. package/src/templates/web/ui-auth-payments-ai/template/src/lib/env.ts +49 -0
  131. package/src/templates/web/ui-auth-payments-ai/template/src/lib/supabase/server.ts +72 -0
  132. package/src/templates/web/ui-auth-payments-ai/template/src/lib/utils.ts +140 -0
  133. package/src/templates/web/ui-auth-payments-ai/template/src/test/setup.ts +79 -0
  134. package/src/templates/web/ui-auth-payments-ai/template/tailwind.config.js +77 -0
  135. package/src/templates/web/ui-auth-payments-ai/template/tsconfig.json +33 -0
  136. package/src/templates/web/ui-auth-payments-ai/template/tsconfig.tsbuildinfo +1 -0
  137. package/src/templates/web/ui-auth-payments-ai/template/vitest.config.ts +17 -0
  138. package/src/templates/web/ui-auth-payments-audio/template/package.json +3 -3
  139. package/src/templates/web/ui-auth-payments-audio/template/src/app/page.tsx +22 -20
  140. package/src/templates/web/ui-auth-payments-audio/template/src/app/page.tsx.backup +391 -0
  141. package/src/templates/web/ui-auth-payments-audio/template/src/app/page.tsx.bak +391 -0
  142. package/src/templates/web/ui-auth-payments-audio/template/src/app/setup/page.tsx +345 -0
  143. package/src/templates/web/ui-auth-payments-audio/template/src/components/shared/header.tsx +122 -37
  144. package/src/templates/web/ui-auth-payments-video/template/package.json +3 -3
  145. package/src/templates/web/ui-auth-payments-video/template/src/app/setup/page.tsx +351 -0
  146. package/src/templates/web/ui-auth-payments-video/template/src/components/shared/header.tsx +122 -37
@@ -0,0 +1,67 @@
1
+ 'use client'
2
+
3
+ import { useEffect } from 'react'
4
+ import { Button, Card } from '@digilogiclabs/saas-factory-ui'
5
+ import { RefreshCw, Home, AlertCircle } from 'lucide-react'
6
+
7
+ interface ErrorProps {
8
+ error: Error & { digest?: string }
9
+ reset: () => void
10
+ }
11
+
12
+ export default function Error({ error, reset }: ErrorProps) {
13
+ useEffect(() => {
14
+ // Log the error to an error reporting service
15
+ console.error('Application error:', error)
16
+ }, [error])
17
+
18
+ return (
19
+ <div className="min-h-screen bg-gray-50 dark:bg-gray-900 flex items-center justify-center p-4">
20
+ <Card className="w-full max-w-md p-8 text-center">
21
+ <div className="mb-6">
22
+ <div className="mx-auto w-16 h-16 bg-red-100 dark:bg-red-900 rounded-full flex items-center justify-center mb-4">
23
+ <AlertCircle className="h-8 w-8 text-red-600 dark:text-red-400" />
24
+ </div>
25
+ <h1 className="text-2xl font-bold text-gray-900 dark:text-white mb-2">
26
+ Something went wrong
27
+ </h1>
28
+ <p className="text-gray-600 dark:text-gray-300 mb-6">
29
+ We apologize for the inconvenience. Please try again or return to the home page.
30
+ </p>
31
+ </div>
32
+
33
+ <div className="space-y-3">
34
+ <Button
35
+ onClick={reset}
36
+ className="w-full"
37
+ variant="default"
38
+ >
39
+ <RefreshCw className="w-4 h-4 mr-2" />
40
+ Try Again
41
+ </Button>
42
+
43
+ <Button
44
+ onClick={() => window.location.href = '/'}
45
+ variant="outline"
46
+ className="w-full"
47
+ >
48
+ <Home className="w-4 h-4 mr-2" />
49
+ Go Home
50
+ </Button>
51
+ </div>
52
+
53
+ {process.env.NODE_ENV === 'development' && (
54
+ <details className="mt-6 text-left">
55
+ <summary className="text-sm font-medium text-gray-500 cursor-pointer hover:text-gray-700 dark:hover:text-gray-300">
56
+ Error Details (Development)
57
+ </summary>
58
+ <pre className="mt-2 text-xs bg-gray-100 dark:bg-gray-800 p-3 rounded-md overflow-auto">
59
+ {error.message}
60
+ {error.stack}
61
+ </pre>
62
+ </details>
63
+ )}
64
+ </Card>
65
+ </div>
66
+ )
67
+ }
@@ -0,0 +1,43 @@
1
+ @tailwind base;
2
+ @tailwind components;
3
+ @tailwind utilities;
4
+
5
+ /* Import SaaS Factory UI styles */
6
+ @import '@digilogiclabs/saas-factory-ui/dist/index.css';
7
+
8
+ @layer base {
9
+ :root {
10
+ --background: 0 0% 100%;
11
+ --foreground: 222.2 84% 4.9%;
12
+ --card: 0 0% 100%;
13
+ --card-foreground: 222.2 84% 4.9%;
14
+ --primary: 221.2 83.2% 53.3%;
15
+ --primary-foreground: 210 40% 98%;
16
+ --secondary: 210 40% 96%;
17
+ --secondary-foreground: 222.2 84% 4.9%;
18
+ --border: 214.3 31.8% 91.4%;
19
+ --radius: 0.5rem;
20
+ }
21
+
22
+ .dark {
23
+ --background: 222.2 84% 4.9%;
24
+ --foreground: 210 40% 98%;
25
+ --card: 222.2 84% 4.9%;
26
+ --card-foreground: 210 40% 98%;
27
+ --primary: 217.2 91.2% 59.8%;
28
+ --primary-foreground: 222.2 84% 4.9%;
29
+ --secondary: 217.2 32.6% 17.5%;
30
+ --secondary-foreground: 210 40% 98%;
31
+ --border: 217.2 32.6% 17.5%;
32
+ }
33
+ }
34
+
35
+ @layer base {
36
+ * {
37
+ @apply border-border;
38
+ }
39
+ body {
40
+ @apply bg-background text-foreground;
41
+ }
42
+ }
43
+
@@ -0,0 +1,35 @@
1
+ import type { Metadata } from 'next'
2
+ import { Inter } from 'next/font/google'
3
+ import './globals.css'
4
+ import { AppProviders } from '@/components/providers/app-providers'
5
+ import { Header } from '@/components/shared/header'
6
+ import { Footer } from '@/components/shared/footer'
7
+
8
+ const inter = Inter({ subsets: ['latin'] })
9
+
10
+ export const metadata: Metadata = {
11
+ title: '{{titleCaseName}}',
12
+ description: '{{description}}',
13
+ }
14
+
15
+ export default function RootLayout({
16
+ children,
17
+ }: {
18
+ children: React.ReactNode
19
+ }) {
20
+ return (
21
+ <html lang="en" suppressHydrationWarning>
22
+ <body className={inter.className}>
23
+ <AppProviders>
24
+ <div className="min-h-screen flex flex-col">
25
+ <Header />
26
+ <main className="flex-1">
27
+ {children}
28
+ </main>
29
+ <Footer />
30
+ </div>
31
+ </AppProviders>
32
+ </body>
33
+ </html>
34
+ )
35
+ }
@@ -0,0 +1,20 @@
1
+ import { Card } from '@digilogiclabs/saas-factory-ui'
2
+ import { Loader2 } from 'lucide-react'
3
+
4
+ export default function Loading() {
5
+ return (
6
+ <div className="min-h-screen bg-gray-50 dark:bg-gray-900 flex items-center justify-center p-4">
7
+ <Card className="w-full max-w-md p-8 text-center">
8
+ <div className="flex flex-col items-center">
9
+ <Loader2 className="h-8 w-8 animate-spin text-blue-600 dark:text-blue-400 mb-4" />
10
+ <h2 className="text-lg font-medium text-gray-900 dark:text-white mb-2">
11
+ Loading
12
+ </h2>
13
+ <p className="text-sm text-gray-600 dark:text-gray-300">
14
+ Please wait while we load your content...
15
+ </p>
16
+ </div>
17
+ </Card>
18
+ </div>
19
+ )
20
+ }
@@ -0,0 +1,6 @@
1
+ import { LoginForm } from '@/components/client/login-form'
2
+
3
+ export default function LoginPage() {
4
+ return <LoginForm />
5
+ }
6
+
@@ -0,0 +1,384 @@
1
+ 'use client'
2
+
3
+ import {
4
+ Button,
5
+ Card,
6
+ PageTransition,
7
+ MobileContainer,
8
+ MobileHero,
9
+ ResponsiveGrid,
10
+ NetworkAwareContent,
11
+ OfflineWrapper,
12
+ SwipeableCard,
13
+ PullToRefresh,
14
+ useNetworkInfo,
15
+ useOfflineState,
16
+ useAnimationTokens,
17
+ useGlassmorphism
18
+ } from '@digilogiclabs/saas-factory-ui'
19
+ import {
20
+ ArrowRight,
21
+ Zap,
22
+ Shield,
23
+ Rocket,
24
+ CheckCircle,
25
+ LogOut,
26
+ User,
27
+ MessageSquare,
28
+ Mic,
29
+ Video,
30
+ Image as ImageIcon,
31
+ Brain,
32
+ Sparkles,
33
+ Wand2,
34
+ Headphones,
35
+ Monitor,
36
+ FileText
37
+ } from 'lucide-react'
38
+ import { useAuth } from '@digilogiclabs/saas-factory-auth'
39
+ import {
40
+ AIProvider,
41
+ AIChat,
42
+ AITextGenerator,
43
+ AIAudioGenerator,
44
+ AIVideoGenerator,
45
+ AISetupStatus,
46
+ getAIConfigFromEnv,
47
+ validateAIConfig,
48
+ type ChatMessage,
49
+ type QuickStartOptions
50
+ } from '@digilogiclabs/saas-factory-ai'
51
+ import Link from 'next/link'
52
+ import { useState } from 'react'
53
+
54
+ export default function Home() {
55
+ const { user, signOut, loading } = useAuth()
56
+ const networkInfo = useNetworkInfo()
57
+ const isOnline = useOfflineState()
58
+ const [isRefreshing, setIsRefreshing] = useState(false)
59
+ const [activeAITool, setActiveAITool] = useState<'text' | 'audio' | 'video' | 'chat'>('chat')
60
+
61
+ // Modern design tokens
62
+ const animations = useAnimationTokens()
63
+ const glass = useGlassmorphism({ intensity: 'medium', border: true, accent: true })
64
+
65
+ const projectName = "{{projectName}}"
66
+ const projectDescription = "{{description}}"
67
+
68
+ const heroConfig = {
69
+ badge: {
70
+ text: "🤖 AI-Powered Platform",
71
+ variant: "secondary" as const,
72
+ icon: Brain
73
+ },
74
+ title: {
75
+ text: "Welcome to " + projectName,
76
+ highlight: projectName,
77
+ size: "xl" as const
78
+ },
79
+ description: projectDescription + ". Harness the power of AI for text generation, audio creation, video production, and intelligent conversations."
80
+ }
81
+
82
+ const handleSignOut = async () => {
83
+ try {
84
+ await signOut()
85
+ } catch (err) {
86
+ console.error('Sign out error:', err)
87
+ }
88
+ }
89
+
90
+ const handleRefresh = async () => {
91
+ setIsRefreshing(true)
92
+ // Simulate refresh
93
+ await new Promise(resolve => setTimeout(resolve, 1500))
94
+ setIsRefreshing(false)
95
+ }
96
+
97
+ const aiTools = [
98
+ {
99
+ id: 'chat' as const,
100
+ title: 'AI Chat',
101
+ description: 'Intelligent conversations and assistance',
102
+ icon: MessageSquare,
103
+ color: 'blue',
104
+ gradient: 'from-blue-500 to-cyan-500'
105
+ },
106
+ {
107
+ id: 'text' as const,
108
+ title: 'Text Generation',
109
+ description: 'Create content, articles, and copy',
110
+ icon: FileText,
111
+ color: 'purple',
112
+ gradient: 'from-purple-500 to-pink-500'
113
+ },
114
+ {
115
+ id: 'audio' as const,
116
+ title: 'Audio Generation',
117
+ description: 'Generate music, voices, and sound effects',
118
+ icon: Headphones,
119
+ color: 'green',
120
+ gradient: 'from-green-500 to-emerald-500'
121
+ },
122
+ {
123
+ id: 'video' as const,
124
+ title: 'Video Generation',
125
+ description: 'Create videos, animations, and visual content',
126
+ icon: Monitor,
127
+ color: 'orange',
128
+ gradient: 'from-orange-500 to-red-500'
129
+ }
130
+ ]
131
+
132
+ const aiConfig = getAIConfigFromEnv()
133
+
134
+ const renderAITool = () => {
135
+ switch (activeAITool) {
136
+ case 'chat':
137
+ return (
138
+ <div className={`${glass.card} ${glass.border} rounded-2xl p-6 h-96`}>
139
+ <AIChat
140
+ placeholder="Ask me anything..."
141
+ showTypingIndicator={true}
142
+ enableFileUpload={true}
143
+ maxMessages={50}
144
+ className="h-full"
145
+ />
146
+ </div>
147
+ )
148
+ case 'text':
149
+ return (
150
+ <div className={`${glass.card} ${glass.border} rounded-2xl p-6`}>
151
+ <AITextGenerator
152
+ placeholder="Describe what you want to generate..."
153
+ maxLength={2000}
154
+ showWordCount={true}
155
+ templates={[
156
+ 'Blog post',
157
+ 'Product description',
158
+ 'Email',
159
+ 'Social media post',
160
+ 'Technical documentation'
161
+ ]}
162
+ className="min-h-64"
163
+ />
164
+ </div>
165
+ )
166
+ case 'audio':
167
+ return (
168
+ <div className={`${glass.card} ${glass.border} rounded-2xl p-6`}>
169
+ <AIAudioGenerator
170
+ placeholder="Describe the audio you want to create..."
171
+ supportedFormats={['mp3', 'wav', 'ogg']}
172
+ maxDuration={300}
173
+ showWaveform={true}
174
+ className="min-h-64"
175
+ />
176
+ </div>
177
+ )
178
+ case 'video':
179
+ return (
180
+ <div className={`${glass.card} ${glass.border} rounded-2xl p-6`}>
181
+ <AIVideoGenerator
182
+ placeholder="Describe the video you want to create..."
183
+ supportedFormats={['mp4', 'webm']}
184
+ maxDuration={60}
185
+ resolution="1080p"
186
+ showPreview={true}
187
+ className="min-h-64"
188
+ />
189
+ </div>
190
+ )
191
+ default:
192
+ return null
193
+ }
194
+ }
195
+
196
+ return (
197
+ <AIProvider config={aiConfig}>
198
+ <PageTransition type="fade" duration={300}>
199
+ <OfflineWrapper
200
+ cacheStrategy="stale-while-revalidate"
201
+ showOfflineIndicator={true}
202
+ backgroundSync={true}
203
+ >
204
+ <PullToRefresh
205
+ onRefresh={handleRefresh}
206
+ threshold={80}
207
+ loadingIndicator="spinner"
208
+ hapticOnTrigger={true}
209
+ networkAware={true}
210
+ >
211
+ <main className={`min-h-screen ${glass.background.primary} relative overflow-hidden`}>
212
+ {/* Glassmorphism background overlay */}
213
+ <div className={`absolute inset-0 ${glass.background.accent} opacity-30`} />
214
+ <div className="relative z-10">
215
+ <MobileContainer className="py-8">
216
+ {/* AI Configuration Status */}
217
+ <AISetupStatus className="mb-6" />
218
+
219
+ {/* Simple Auth Status */}
220
+ {user && (
221
+ <div className="flex justify-end mb-8">
222
+ <div className="flex items-center gap-4">
223
+ <span className="text-sm text-gray-600 dark:text-gray-300">
224
+ Welcome, {user.email?.split('@')[0]}
225
+ </span>
226
+ <Button variant="outline" size="sm" onClick={handleSignOut}>
227
+ <LogOut className="w-4 h-4 mr-2" />
228
+ Sign Out
229
+ </Button>
230
+ </div>
231
+ </div>
232
+ )}
233
+
234
+ {!user && !loading && (
235
+ <div className="flex justify-end mb-8">
236
+ <div className="flex gap-2">
237
+ <Link href="/login">
238
+ <Button variant="outline" size="sm">Sign In</Button>
239
+ </Link>
240
+ <Link href="/signup">
241
+ <Button size="sm">Sign Up</Button>
242
+ </Link>
243
+ </div>
244
+ </div>
245
+ )}
246
+
247
+ {/* Hero Section */}
248
+ <MobileHero
249
+ badge={heroConfig.badge}
250
+ title={heroConfig.title}
251
+ description={heroConfig.description}
252
+ actions={[
253
+ {
254
+ label: "View Pricing",
255
+ href: "/checkout",
256
+ icon: ArrowRight,
257
+ variant: "default",
258
+ size: "lg"
259
+ },
260
+ {
261
+ label: "Learn More",
262
+ variant: "outline",
263
+ size: "lg"
264
+ }
265
+ ]}
266
+ className="text-center mb-12"
267
+ />
268
+
269
+ {/* AI Tool Selector */}
270
+ <div className="mb-8">
271
+ <h2 className="text-2xl font-bold text-center mb-6 bg-gradient-to-r from-purple-400 to-pink-400 bg-clip-text text-transparent">
272
+ Choose Your AI Tool
273
+ </h2>
274
+ <div className="grid grid-cols-2 lg:grid-cols-4 gap-4 mb-8">
275
+ {aiTools.map((tool) => {
276
+ const Icon = tool.icon
277
+ const isActive = activeAITool === tool.id
278
+ return (
279
+ <button
280
+ key={tool.id}
281
+ onClick={() => setActiveAITool(tool.id)}
282
+ className={`
283
+ ${glass.card} ${glass.border}
284
+ rounded-2xl p-4 text-center transition-all duration-300
285
+ ${isActive
286
+ ? `bg-gradient-to-r ${tool.gradient} text-white shadow-lg scale-105`
287
+ : `${animations.hover.scale} hover:shadow-lg`
288
+ }
289
+ `}
290
+ >
291
+ <div className={`mx-auto w-12 h-12 rounded-xl flex items-center justify-center mb-3 ${
292
+ isActive ? 'bg-white/20' : glass.accent
293
+ }`}>
294
+ <Icon className={`h-6 w-6 ${isActive ? 'text-white' : `text-${tool.color}-400`}`} />
295
+ </div>
296
+ <h3 className="font-semibold text-sm mb-1">{tool.title}</h3>
297
+ <p className={`text-xs ${isActive ? 'text-white/80' : 'text-gray-600 dark:text-gray-300'}`}>
298
+ {tool.description}
299
+ </p>
300
+ </button>
301
+ )
302
+ })}
303
+ </div>
304
+ </div>
305
+
306
+ {/* AI Tool Interface */}
307
+ <div className="mb-12">
308
+ {renderAITool()}
309
+ </div>
310
+
311
+ {/* Features Overview */}
312
+ <ResponsiveGrid columns={{ base: 1, sm: 2, md: 4 }} gap="lg" className="mb-16">
313
+ <div className={`${glass.card} ${glass.border} text-center p-6 rounded-2xl ${animations.hover.scale} ${animations.transition.smooth}`}>
314
+ <div className={`mx-auto w-12 h-12 ${glass.accent} rounded-xl flex items-center justify-center mb-4 ${animations.hover.glow}`}>
315
+ <Brain className="h-6 w-6 text-purple-400" />
316
+ </div>
317
+ <h3 className="text-lg font-semibold mb-2">Advanced AI Models</h3>
318
+ <p className="text-sm text-gray-600 dark:text-gray-300">
319
+ Powered by the latest AI technology for superior results
320
+ </p>
321
+ </div>
322
+
323
+ <div className={`${glass.card} ${glass.border} text-center p-6 rounded-2xl ${animations.hover.scale} ${animations.transition.smooth}`}>
324
+ <div className={`mx-auto w-12 h-12 ${glass.accent} rounded-xl flex items-center justify-center mb-4 ${animations.hover.glow}`}>
325
+ <Zap className="h-6 w-6 text-yellow-400" />
326
+ </div>
327
+ <h3 className="text-lg font-semibold mb-2">Lightning Fast</h3>
328
+ <p className="text-sm text-gray-600 dark:text-gray-300">
329
+ Generate content in seconds with optimized processing
330
+ </p>
331
+ </div>
332
+
333
+ <div className={`${glass.card} ${glass.border} text-center p-6 rounded-2xl ${animations.hover.scale} ${animations.transition.smooth}`}>
334
+ <div className={`mx-auto w-12 h-12 ${glass.accent} rounded-xl flex items-center justify-center mb-4 ${animations.hover.glow}`}>
335
+ <Shield className="h-6 w-6 text-green-400" />
336
+ </div>
337
+ <h3 className="text-lg font-semibold mb-2">Secure & Private</h3>
338
+ <p className="text-sm text-gray-600 dark:text-gray-300">
339
+ Your data and creations are always protected and private
340
+ </p>
341
+ </div>
342
+
343
+ <div className={`${glass.card} ${glass.border} text-center p-6 rounded-2xl ${animations.hover.scale} ${animations.transition.smooth}`}>
344
+ <div className={`mx-auto w-12 h-12 ${glass.accent} rounded-xl flex items-center justify-center mb-4 ${animations.hover.glow}`}>
345
+ <Sparkles className="h-6 w-6 text-pink-400" />
346
+ </div>
347
+ <h3 className="text-lg font-semibold mb-2">Creative Freedom</h3>
348
+ <p className="text-sm text-gray-600 dark:text-gray-300">
349
+ Unlimited possibilities for your creative projects
350
+ </p>
351
+ </div>
352
+ </ResponsiveGrid>
353
+
354
+ {/* Usage Stats */}
355
+ <div className={`${glass.card} ${glass.border} rounded-2xl p-6 mb-16`}>
356
+ <h2 className="text-xl font-bold text-center mb-6">Your AI Usage</h2>
357
+ <div className="grid grid-cols-2 lg:grid-cols-4 gap-6">
358
+ <div className="text-center">
359
+ <div className="text-3xl font-bold text-purple-400 mb-2">1,247</div>
360
+ <div className="text-sm text-gray-600 dark:text-gray-300">Text Generated</div>
361
+ </div>
362
+ <div className="text-center">
363
+ <div className="text-3xl font-bold text-green-400 mb-2">23</div>
364
+ <div className="text-sm text-gray-600 dark:text-gray-300">Audio Created</div>
365
+ </div>
366
+ <div className="text-center">
367
+ <div className="text-3xl font-bold text-orange-400 mb-2">8</div>
368
+ <div className="text-sm text-gray-600 dark:text-gray-300">Videos Made</div>
369
+ </div>
370
+ <div className="text-center">
371
+ <div className="text-3xl font-bold text-blue-400 mb-2">5.2k</div>
372
+ <div className="text-sm text-gray-600 dark:text-gray-300">Chat Messages</div>
373
+ </div>
374
+ </div>
375
+ </div>
376
+ </MobileContainer>
377
+ </div>
378
+ </main>
379
+ </PullToRefresh>
380
+ </OfflineWrapper>
381
+ </PageTransition>
382
+ </AIProvider>
383
+ )
384
+ }