@digilogiclabs/create-saas-app 1.17.0 → 1.18.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 (119) hide show
  1. package/CHANGELOG.md +82 -0
  2. package/README.md +153 -12
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/cli/commands/create.d.ts.map +1 -1
  5. package/dist/cli/commands/create.js +6 -2
  6. package/dist/cli/commands/create.js.map +1 -1
  7. package/dist/cli/index.js +1 -1
  8. package/dist/cli/index.js.map +1 -1
  9. package/dist/cli/prompts/project-setup.d.ts.map +1 -1
  10. package/dist/cli/prompts/project-setup.js +4 -0
  11. package/dist/cli/prompts/project-setup.js.map +1 -1
  12. package/dist/generators/template-generator.d.ts.map +1 -1
  13. package/dist/generators/template-generator.js +13 -7
  14. package/dist/generators/template-generator.js.map +1 -1
  15. package/dist/templates/mobile/base/template/App.tsx +2 -0
  16. package/dist/templates/mobile/ui-auth-payments/template/app/(tabs)/index.tsx +85 -4
  17. package/dist/templates/mobile/ui-auth-payments/template/app/_layout.tsx +2 -0
  18. package/dist/templates/mobile/ui-auth-payments-ai/template/.env.example +23 -0
  19. package/dist/templates/mobile/ui-auth-payments-ai/template/README.md +254 -0
  20. package/dist/templates/mobile/ui-auth-payments-ai/template/app/(tabs)/_layout.tsx +169 -0
  21. package/dist/templates/mobile/ui-auth-payments-ai/template/app/(tabs)/ai.tsx +522 -0
  22. package/dist/templates/mobile/ui-auth-payments-ai/template/app/(tabs)/analytics.tsx +668 -0
  23. package/dist/templates/mobile/ui-auth-payments-ai/template/app/(tabs)/billing.tsx +743 -0
  24. package/dist/templates/mobile/ui-auth-payments-ai/template/app/(tabs)/index.tsx +676 -0
  25. package/dist/templates/mobile/ui-auth-payments-ai/template/app/(tabs)/orders.tsx +402 -0
  26. package/dist/templates/mobile/ui-auth-payments-ai/template/app/(tabs)/profile.tsx +580 -0
  27. package/dist/templates/mobile/ui-auth-payments-ai/template/app/_layout.tsx +127 -0
  28. package/dist/templates/mobile/ui-auth-payments-ai/template/app/auth/login.tsx +246 -0
  29. package/dist/templates/mobile/ui-auth-payments-ai/template/app/auth/signup.tsx +362 -0
  30. package/dist/templates/mobile/ui-auth-payments-ai/template/app/onboarding/index.tsx +193 -0
  31. package/dist/templates/mobile/ui-auth-payments-ai/template/app/tour/index.tsx +272 -0
  32. package/dist/templates/mobile/ui-auth-payments-ai/template/app.json +93 -0
  33. package/dist/templates/mobile/ui-auth-payments-ai/template/babel.config.js +23 -0
  34. package/dist/templates/mobile/ui-auth-payments-ai/template/eas.json +45 -0
  35. package/dist/templates/mobile/ui-auth-payments-ai/template/expo-env.d.ts +3 -0
  36. package/dist/templates/mobile/ui-auth-payments-ai/template/jest-setup.ts +74 -0
  37. package/dist/templates/mobile/ui-auth-payments-ai/template/metro.config.js +11 -0
  38. package/dist/templates/mobile/ui-auth-payments-ai/template/package.json +108 -0
  39. package/dist/templates/mobile/ui-auth-payments-ai/template/tsconfig.json +31 -0
  40. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/README.md +655 -0
  41. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/app/(tabs)/ai.tsx +683 -0
  42. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/docs/MOBILE-SETUP.md +787 -0
  43. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/hooks/useRAGSystem.ts +346 -0
  44. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/lib/rag/config.ts +180 -0
  45. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/package.json +113 -0
  46. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/scripts/setup-rag.js +599 -0
  47. package/dist/templates/web/base/template/src/app/loading.tsx +45 -27
  48. package/dist/templates/web/base/template/src/components/providers/app-providers.tsx +2 -0
  49. package/dist/templates/web/ui-auth/template/src/app/loading.tsx +30 -12
  50. package/dist/templates/web/ui-auth/template/src/components/providers/app-providers.tsx +2 -0
  51. package/dist/templates/web/ui-auth/template/src/components/shared/header.tsx +43 -2
  52. package/dist/templates/web/ui-auth-ai/template/package.json +1 -1
  53. package/dist/templates/web/ui-auth-payments/template/src/components/providers/app-providers.tsx +2 -0
  54. package/dist/templates/web/ui-auth-payments-ai/template/src/components/providers/app-providers.tsx +2 -0
  55. package/dist/templates/web/ui-auth-payments-ai-rag/template/README.md +434 -0
  56. package/dist/templates/web/ui-auth-payments-ai-rag/template/components/rag/KnowledgeManager.tsx +642 -0
  57. package/dist/templates/web/ui-auth-payments-ai-rag/template/components/rag/RAGAnalytics.tsx +466 -0
  58. package/dist/templates/web/ui-auth-payments-ai-rag/template/components/rag/RAGChatInterface.tsx +393 -0
  59. package/dist/templates/web/ui-auth-payments-ai-rag/template/docs/GETTING-STARTED.md +457 -0
  60. package/dist/templates/web/ui-auth-payments-ai-rag/template/hooks/useRAGSystem.ts +478 -0
  61. package/dist/templates/web/ui-auth-payments-ai-rag/template/lib/rag/config.ts +250 -0
  62. package/dist/templates/web/ui-auth-payments-ai-rag/template/package.json +74 -0
  63. package/dist/templates/web/ui-auth-payments-ai-rag/template/scripts/setup-rag.js +622 -0
  64. package/dist/templates/web/ui-auth-payments-ai-rag/template/src/app/ai/page.tsx +396 -0
  65. package/dist/templates/web/ui-auth-payments-audio/template/src/components/providers/app-providers.tsx +2 -0
  66. package/dist/templates/web/ui-auth-payments-video/template/src/components/providers/app-providers.tsx +2 -0
  67. package/package.json +1 -1
  68. package/src/templates/mobile/base/template/App.tsx +2 -0
  69. package/src/templates/mobile/ui-auth-payments/template/app/(tabs)/index.tsx +85 -4
  70. package/src/templates/mobile/ui-auth-payments/template/app/_layout.tsx +2 -0
  71. package/src/templates/mobile/ui-auth-payments-ai/template/.env.example +23 -0
  72. package/src/templates/mobile/ui-auth-payments-ai/template/README.md +254 -0
  73. package/src/templates/mobile/ui-auth-payments-ai/template/app/(tabs)/_layout.tsx +169 -0
  74. package/src/templates/mobile/ui-auth-payments-ai/template/app/(tabs)/ai.tsx +522 -0
  75. package/src/templates/mobile/ui-auth-payments-ai/template/app/(tabs)/analytics.tsx +668 -0
  76. package/src/templates/mobile/ui-auth-payments-ai/template/app/(tabs)/billing.tsx +743 -0
  77. package/src/templates/mobile/ui-auth-payments-ai/template/app/(tabs)/index.tsx +676 -0
  78. package/src/templates/mobile/ui-auth-payments-ai/template/app/(tabs)/orders.tsx +402 -0
  79. package/src/templates/mobile/ui-auth-payments-ai/template/app/(tabs)/profile.tsx +580 -0
  80. package/src/templates/mobile/ui-auth-payments-ai/template/app/_layout.tsx +127 -0
  81. package/src/templates/mobile/ui-auth-payments-ai/template/app/auth/login.tsx +246 -0
  82. package/src/templates/mobile/ui-auth-payments-ai/template/app/auth/signup.tsx +362 -0
  83. package/src/templates/mobile/ui-auth-payments-ai/template/app/onboarding/index.tsx +193 -0
  84. package/src/templates/mobile/ui-auth-payments-ai/template/app/tour/index.tsx +272 -0
  85. package/src/templates/mobile/ui-auth-payments-ai/template/app.json +93 -0
  86. package/src/templates/mobile/ui-auth-payments-ai/template/babel.config.js +23 -0
  87. package/src/templates/mobile/ui-auth-payments-ai/template/eas.json +45 -0
  88. package/src/templates/mobile/ui-auth-payments-ai/template/expo-env.d.ts +3 -0
  89. package/src/templates/mobile/ui-auth-payments-ai/template/jest-setup.ts +74 -0
  90. package/src/templates/mobile/ui-auth-payments-ai/template/metro.config.js +11 -0
  91. package/src/templates/mobile/ui-auth-payments-ai/template/package.json +108 -0
  92. package/src/templates/mobile/ui-auth-payments-ai/template/tsconfig.json +31 -0
  93. package/src/templates/mobile/ui-auth-payments-ai-rag/template/README.md +655 -0
  94. package/src/templates/mobile/ui-auth-payments-ai-rag/template/app/(tabs)/ai.tsx +683 -0
  95. package/src/templates/mobile/ui-auth-payments-ai-rag/template/docs/MOBILE-SETUP.md +787 -0
  96. package/src/templates/mobile/ui-auth-payments-ai-rag/template/hooks/useRAGSystem.ts +346 -0
  97. package/src/templates/mobile/ui-auth-payments-ai-rag/template/lib/rag/config.ts +180 -0
  98. package/src/templates/mobile/ui-auth-payments-ai-rag/template/package.json +113 -0
  99. package/src/templates/mobile/ui-auth-payments-ai-rag/template/scripts/setup-rag.js +599 -0
  100. package/src/templates/web/base/template/src/app/loading.tsx +45 -27
  101. package/src/templates/web/base/template/src/components/providers/app-providers.tsx +2 -0
  102. package/src/templates/web/ui-auth/template/src/app/loading.tsx +30 -12
  103. package/src/templates/web/ui-auth/template/src/components/providers/app-providers.tsx +2 -0
  104. package/src/templates/web/ui-auth/template/src/components/shared/header.tsx +43 -2
  105. package/src/templates/web/ui-auth-ai/template/package.json +1 -1
  106. package/src/templates/web/ui-auth-payments/template/src/components/providers/app-providers.tsx +2 -0
  107. package/src/templates/web/ui-auth-payments-ai/template/src/components/providers/app-providers.tsx +2 -0
  108. package/src/templates/web/ui-auth-payments-ai-rag/template/README.md +434 -0
  109. package/src/templates/web/ui-auth-payments-ai-rag/template/components/rag/KnowledgeManager.tsx +642 -0
  110. package/src/templates/web/ui-auth-payments-ai-rag/template/components/rag/RAGAnalytics.tsx +466 -0
  111. package/src/templates/web/ui-auth-payments-ai-rag/template/components/rag/RAGChatInterface.tsx +393 -0
  112. package/src/templates/web/ui-auth-payments-ai-rag/template/docs/GETTING-STARTED.md +457 -0
  113. package/src/templates/web/ui-auth-payments-ai-rag/template/hooks/useRAGSystem.ts +478 -0
  114. package/src/templates/web/ui-auth-payments-ai-rag/template/lib/rag/config.ts +250 -0
  115. package/src/templates/web/ui-auth-payments-ai-rag/template/package.json +74 -0
  116. package/src/templates/web/ui-auth-payments-ai-rag/template/scripts/setup-rag.js +622 -0
  117. package/src/templates/web/ui-auth-payments-ai-rag/template/src/app/ai/page.tsx +396 -0
  118. package/src/templates/web/ui-auth-payments-audio/template/src/components/providers/app-providers.tsx +2 -0
  119. package/src/templates/web/ui-auth-payments-video/template/src/components/providers/app-providers.tsx +2 -0
@@ -0,0 +1,396 @@
1
+ 'use client'
2
+
3
+ import { useState } from 'react'
4
+ import {
5
+ Card,
6
+ PageTransition,
7
+ MobileContainer,
8
+ ResponsiveGrid,
9
+ useAnimationTokens,
10
+ useGlassmorphism
11
+ } from '@digilogiclabs/saas-factory-ui'
12
+ import {
13
+ ArrowLeft,
14
+ MessageSquare,
15
+ Database,
16
+ BookOpen,
17
+ BarChart3,
18
+ Settings,
19
+ Search,
20
+ Plus,
21
+ Zap,
22
+ Brain,
23
+ Activity,
24
+ FileText,
25
+ Lightbulb,
26
+ Sparkles,
27
+ Clock,
28
+ TrendingUp,
29
+ Users,
30
+ Download,
31
+ Share2,
32
+ RefreshCw,
33
+ AlertCircle,
34
+ CheckCircle,
35
+ Loader2
36
+ } from 'lucide-react'
37
+ import { useAuth } from '@digilogiclabs/saas-factory-auth'
38
+ import Link from 'next/link'
39
+ import { useRAGSystem } from '../../../hooks/useRAGSystem'
40
+ import { RAGChatInterface } from '../../../components/rag/RAGChatInterface'
41
+ import { KnowledgeManager } from '../../../components/rag/KnowledgeManager'
42
+ import { RAGAnalytics } from '../../../components/rag/RAGAnalytics'
43
+ import type { GenericRAGDocumentSchema } from '@digilogiclabs/saas-factory-ai-types'
44
+ import { toast } from 'sonner'
45
+
46
+ export default function AIPage() {
47
+ const { user, loading } = useAuth()
48
+ const [activeTab, setActiveTab] = useState<'dashboard' | 'chat' | 'knowledge' | 'analytics' | 'settings'>('dashboard')
49
+
50
+ const animations = useAnimationTokens()
51
+ const glass = useGlassmorphism()
52
+
53
+ // Initialize RAG system
54
+ const ragSystem = useRAGSystem<GenericRAGDocumentSchema>({
55
+ domain: 'generic', // Can be configured: 'plants', 'ecommerce', 'education'
56
+ enableStreaming: true,
57
+ enableCache: true,
58
+ autoInitialize: true
59
+ })
60
+
61
+ const handleSync = async () => {
62
+ try {
63
+ await ragSystem.syncKnowledgeBase()
64
+ } catch (error) {
65
+ console.error('Sync failed:', error)
66
+ }
67
+ }
68
+
69
+ const getHealthColor = (health: string) => {
70
+ switch (health) {
71
+ case 'healthy': return 'text-green-500'
72
+ case 'degraded': return 'text-yellow-500'
73
+ case 'down': return 'text-red-500'
74
+ default: return 'text-gray-500'
75
+ }
76
+ }
77
+
78
+ const getHealthIcon = (health: string) => {
79
+ switch (health) {
80
+ case 'healthy': return CheckCircle
81
+ case 'degraded': return AlertCircle
82
+ case 'down': return AlertCircle
83
+ default: return Loader2
84
+ }
85
+ }
86
+
87
+ if (loading) {
88
+ return (
89
+ <div className="min-h-screen flex items-center justify-center">
90
+ <div className="animate-spin rounded-full h-8 w-8 border-b-2 border-blue-500"></div>
91
+ </div>
92
+ )
93
+ }
94
+
95
+ if (!user) {
96
+ return (
97
+ <div className="min-h-screen flex items-center justify-center">
98
+ <div className="text-center">
99
+ <h2 className="text-2xl font-bold mb-4">Access Denied</h2>
100
+ <p className="mb-4">You need to sign in to access the AI dashboard.</p>
101
+ <Link href="/login" className="text-blue-500 hover:underline">
102
+ Sign In
103
+ </Link>
104
+ </div>
105
+ </div>
106
+ )
107
+ }
108
+
109
+ const renderDashboard = () => {
110
+ const HealthIcon = getHealthIcon(ragSystem.health)
111
+
112
+ return (
113
+ <div className="space-y-6">
114
+ {/* System Status */}
115
+ <Card className={`${glass.card} ${glass.border} p-6`}>
116
+ <div className="flex items-center justify-between mb-4">
117
+ <h3 className="text-xl font-semibold">System Status</h3>
118
+ <button
119
+ onClick={handleSync}
120
+ disabled={ragSystem.isLoading}
121
+ className={`p-2 rounded-xl ${glass.card} ${glass.border} ${animations.hover.scale} disabled:opacity-50`}
122
+ >
123
+ {ragSystem.isLoading ? (
124
+ <Loader2 className="w-4 h-4 animate-spin" />
125
+ ) : (
126
+ <RefreshCw className="w-4 h-4" />
127
+ )}
128
+ </button>
129
+ </div>
130
+
131
+ <div className="grid grid-cols-1 md:grid-cols-3 gap-4">
132
+ <div className="flex items-center gap-3">
133
+ <HealthIcon className={`w-5 h-5 ${getHealthColor(ragSystem.health)}`} />
134
+ <div>
135
+ <p className="font-medium">System Health</p>
136
+ <p className="text-sm text-gray-600 dark:text-gray-300 capitalize">
137
+ {ragSystem.health}
138
+ </p>
139
+ </div>
140
+ </div>
141
+
142
+ <div className="flex items-center gap-3">
143
+ <Activity className="w-5 h-5 text-blue-500" />
144
+ <div>
145
+ <p className="font-medium">Status</p>
146
+ <p className="text-sm text-gray-600 dark:text-gray-300">
147
+ {ragSystem.isReady ? 'Ready' : 'Initializing...'}
148
+ </p>
149
+ </div>
150
+ </div>
151
+
152
+ <div className="flex items-center gap-3">
153
+ <Clock className="w-5 h-5 text-purple-500" />
154
+ <div>
155
+ <p className="font-medium">Last Sync</p>
156
+ <p className="text-sm text-gray-600 dark:text-gray-300">
157
+ {ragSystem.lastSyncAt
158
+ ? ragSystem.lastSyncAt.toLocaleString()
159
+ : 'Never'
160
+ }
161
+ </p>
162
+ </div>
163
+ </div>
164
+ </div>
165
+ </Card>
166
+
167
+ {/* Statistics Overview */}
168
+ <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6">
169
+ <Card className={`${glass.card} ${glass.border} p-6 text-center ${animations.hover.lift}`}>
170
+ <div className="text-3xl font-bold text-blue-500 mb-2">
171
+ {ragSystem.totalQueries}
172
+ </div>
173
+ <div className="text-sm text-gray-600 dark:text-gray-300">Total Queries</div>
174
+ </Card>
175
+
176
+ <Card className={`${glass.card} ${glass.border} p-6 text-center ${animations.hover.lift}`}>
177
+ <div className="text-3xl font-bold text-green-500 mb-2">
178
+ {ragSystem.totalDocuments}
179
+ </div>
180
+ <div className="text-sm text-gray-600 dark:text-gray-300">Knowledge Docs</div>
181
+ </Card>
182
+
183
+ <Card className={`${glass.card} ${glass.border} p-6 text-center ${animations.hover.lift}`}>
184
+ <div className="text-3xl font-bold text-purple-500 mb-2">
185
+ {ragSystem.cacheSize}
186
+ </div>
187
+ <div className="text-sm text-gray-600 dark:text-gray-300">Cached Responses</div>
188
+ </Card>
189
+
190
+ <Card className={`${glass.card} ${glass.border} p-6 text-center ${animations.hover.lift}`}>
191
+ <div className="text-3xl font-bold text-orange-500 mb-2">
192
+ {ragSystem.queryHistory.length}
193
+ </div>
194
+ <div className="text-sm text-gray-600 dark:text-gray-300">Recent Queries</div>
195
+ </Card>
196
+ </div>
197
+
198
+ {/* Quick Actions */}
199
+ <Card className={`${glass.card} ${glass.border} p-6`}>
200
+ <h3 className="text-xl font-semibold mb-4">Quick Actions</h3>
201
+
202
+ <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4">
203
+ <button
204
+ onClick={() => setActiveTab('chat')}
205
+ disabled={!ragSystem.canQuery}
206
+ className={`p-4 rounded-xl ${glass.card} ${glass.border} ${animations.hover.lift} ${animations.transition.smooth} disabled:opacity-50 text-left`}
207
+ >
208
+ <MessageSquare className="w-8 h-8 text-blue-500 mb-3" />
209
+ <h4 className="font-semibold mb-1">AI Chat</h4>
210
+ <p className="text-sm text-gray-600 dark:text-gray-300">
211
+ Chat with your knowledge base
212
+ </p>
213
+ </button>
214
+
215
+ <button
216
+ onClick={() => setActiveTab('knowledge')}
217
+ className={`p-4 rounded-xl ${glass.card} ${glass.border} ${animations.hover.lift} ${animations.transition.smooth} text-left`}
218
+ >
219
+ <Database className="w-8 h-8 text-green-500 mb-3" />
220
+ <h4 className="font-semibold mb-1">Knowledge Base</h4>
221
+ <p className="text-sm text-gray-600 dark:text-gray-300">
222
+ Manage your documents
223
+ </p>
224
+ </button>
225
+
226
+ <button
227
+ onClick={() => setActiveTab('analytics')}
228
+ className={`p-4 rounded-xl ${glass.card} ${glass.border} ${animations.hover.lift} ${animations.transition.smooth} text-left`}
229
+ >
230
+ <BarChart3 className="w-8 h-8 text-purple-500 mb-3" />
231
+ <h4 className="font-semibold mb-1">Analytics</h4>
232
+ <p className="text-sm text-gray-600 dark:text-gray-300">
233
+ View usage insights
234
+ </p>
235
+ </button>
236
+
237
+ <button
238
+ onClick={() => ragSystem.clearCache()}
239
+ className={`p-4 rounded-xl ${glass.card} ${glass.border} ${animations.hover.lift} ${animations.transition.smooth} text-left`}
240
+ >
241
+ <RefreshCw className="w-8 h-8 text-orange-500 mb-3" />
242
+ <h4 className="font-semibold mb-1">Clear Cache</h4>
243
+ <p className="text-sm text-gray-600 dark:text-gray-300">
244
+ Reset cached responses
245
+ </p>
246
+ </button>
247
+ </div>
248
+ </Card>
249
+
250
+ {/* Recent Query History */}
251
+ {ragSystem.queryHistory.length > 0 && (
252
+ <Card className={`${glass.card} ${glass.border} p-6`}>
253
+ <h3 className="text-xl font-semibold mb-4">Recent Queries</h3>
254
+
255
+ <div className="space-y-3">
256
+ {ragSystem.queryHistory.slice(0, 5).map((query, index) => (
257
+ <div
258
+ key={index}
259
+ className={`p-3 rounded-lg bg-gray-50 dark:bg-gray-800/50 ${animations.hover.lift}`}
260
+ >
261
+ <div className="flex items-start justify-between">
262
+ <div className="flex-1">
263
+ <p className="font-medium line-clamp-1">{query.query}</p>
264
+ <div className="flex items-center gap-2 mt-1 text-sm text-gray-600 dark:text-gray-300">
265
+ <Clock className="w-3 h-3" />
266
+ {new Date(query.timestamp).toLocaleTimeString()}
267
+ {query.category && (
268
+ <>
269
+ <span>•</span>
270
+ <span className="capitalize">{query.category}</span>
271
+ </>
272
+ )}
273
+ </div>
274
+ </div>
275
+ <button
276
+ onClick={() => {
277
+ setActiveTab('chat')
278
+ // Would trigger a new query with this text
279
+ }}
280
+ className={`p-1 rounded ${animations.hover.scale}`}
281
+ >
282
+ <RefreshCw className="w-4 h-4" />
283
+ </button>
284
+ </div>
285
+ </div>
286
+ ))}
287
+ </div>
288
+ </Card>
289
+ )}
290
+ </div>
291
+ )
292
+ }
293
+
294
+ const renderChat = () => (
295
+ <Card className={`${glass.card} ${glass.border} p-6 h-[calc(100vh-200px)]`}>
296
+ <RAGChatInterface
297
+ ragSystem={ragSystem}
298
+ enableStreaming={true}
299
+ showSources={true}
300
+ showConfidence={true}
301
+ onError={(error) => toast.error(error.message)}
302
+ />
303
+ </Card>
304
+ )
305
+
306
+ const renderKnowledge = () => (
307
+ <Card className={`${glass.card} ${glass.border} p-6`}>
308
+ <KnowledgeManager
309
+ ragSystem={ragSystem}
310
+ enableBulkOperations={true}
311
+ enableExport={true}
312
+ onSuccess={(message) => toast.success(message)}
313
+ onError={(error) => toast.error(error)}
314
+ />
315
+ </Card>
316
+ )
317
+
318
+ const renderAnalytics = () => (
319
+ <Card className={`${glass.card} ${glass.border} p-6`}>
320
+ <RAGAnalytics
321
+ ragSystem={ragSystem}
322
+ timeRange="7d"
323
+ showDetailedMetrics={true}
324
+ />
325
+ </Card>
326
+ )
327
+
328
+ const tabs = [
329
+ { id: 'dashboard', label: 'Dashboard', icon: Brain },
330
+ { id: 'chat', label: 'AI Chat', icon: MessageSquare },
331
+ { id: 'knowledge', label: 'Knowledge', icon: BookOpen },
332
+ { id: 'analytics', label: 'Analytics', icon: BarChart3 },
333
+ ]
334
+
335
+ return (
336
+ <PageTransition type="slide" direction="up" duration={300}>
337
+ <main className={`min-h-screen ${glass.background.primary} relative overflow-hidden`}>
338
+ <div className={`absolute inset-0 ${glass.background.accent} opacity-30`} />
339
+ <div className="relative z-10">
340
+ <MobileContainer className="py-8">
341
+ {/* Header */}
342
+ <div className="flex items-center justify-between mb-8">
343
+ <div className="flex items-center gap-4">
344
+ <Link href="/" className={`${glass.card} ${glass.border} p-2 rounded-xl ${animations.hover.scale}`}>
345
+ <ArrowLeft className="w-5 h-5" />
346
+ </Link>
347
+ <div>
348
+ <h1 className="text-2xl font-bold">AI Knowledge Assistant</h1>
349
+ <p className="text-gray-600 dark:text-gray-300">
350
+ Powered by RAG v4.0.0
351
+ </p>
352
+ </div>
353
+ </div>
354
+
355
+ {ragSystem.hasError && (
356
+ <div className="flex items-center gap-2 text-red-500">
357
+ <AlertCircle className="w-5 h-5" />
358
+ <span className="text-sm">System Error</span>
359
+ </div>
360
+ )}
361
+ </div>
362
+
363
+ {/* Tab Navigation */}
364
+ <div className={`${glass.card} ${glass.border} rounded-2xl p-1 mb-8 inline-flex`}>
365
+ {tabs.map((tab) => {
366
+ const Icon = tab.icon
367
+ return (
368
+ <button
369
+ key={tab.id}
370
+ onClick={() => setActiveTab(tab.id as any)}
371
+ className={`flex items-center gap-2 px-4 py-2 rounded-xl text-sm font-medium transition-all duration-200 ${
372
+ activeTab === tab.id
373
+ ? 'bg-blue-500 text-white shadow-lg'
374
+ : 'text-gray-600 dark:text-gray-300 hover:bg-white/10'
375
+ }`}
376
+ >
377
+ <Icon className="w-4 h-4" />
378
+ {tab.label}
379
+ </button>
380
+ )
381
+ })}
382
+ </div>
383
+
384
+ {/* Tab Content */}
385
+ <div className="space-y-6">
386
+ {activeTab === 'dashboard' && renderDashboard()}
387
+ {activeTab === 'chat' && renderChat()}
388
+ {activeTab === 'knowledge' && renderKnowledge()}
389
+ {activeTab === 'analytics' && renderAnalytics()}
390
+ </div>
391
+ </MobileContainer>
392
+ </div>
393
+ </main>
394
+ </PageTransition>
395
+ )
396
+ }
@@ -4,6 +4,7 @@ import React from 'react'
4
4
  import { ThemeProvider } from 'next-themes'
5
5
  import { AuthProvider } from '@digilogiclabs/saas-factory-auth'
6
6
  import { PaymentsProvider } from '@digilogiclabs/saas-factory-payments'
7
+ import { Toaster } from '@digilogiclabs/saas-factory-ui'
7
8
  import { AppThemeProvider } from './theme-provider'
8
9
 
9
10
  interface AppProvidersProps {
@@ -27,6 +28,7 @@ export function AppProviders({ children }: AppProvidersProps) {
27
28
  <PaymentsProvider>
28
29
  <AppThemeProvider themeColor={themeColor}>
29
30
  {children}
31
+ <Toaster />
30
32
  </AppThemeProvider>
31
33
  </PaymentsProvider>
32
34
  </AuthProvider>
@@ -4,6 +4,7 @@ import React from 'react'
4
4
  import { ThemeProvider } from 'next-themes'
5
5
  import { AuthProvider } from '@digilogiclabs/saas-factory-auth'
6
6
  import { PaymentsProvider } from '@digilogiclabs/saas-factory-payments'
7
+ import { Toaster } from '@digilogiclabs/saas-factory-ui'
7
8
  import { AppThemeProvider } from './theme-provider'
8
9
 
9
10
  interface AppProvidersProps {
@@ -23,6 +24,7 @@ export function AppProviders({ children }: AppProvidersProps) {
23
24
  <PaymentsProvider>
24
25
  <AppThemeProvider themeColor="{{themeColor}}">
25
26
  {children}
27
+ <Toaster />
26
28
  </AppThemeProvider>
27
29
  </PaymentsProvider>
28
30
  </AuthProvider>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@digilogiclabs/create-saas-app",
3
- "version": "1.17.0",
3
+ "version": "1.18.0",
4
4
  "description": "Create modern SaaS applications with Digi Logic Labs packages",
5
5
  "main": "dist/cli/index.js",
6
6
  "bin": {
@@ -11,6 +11,7 @@ import {
11
11
  NativeMobileContainer as MobileContainer,
12
12
  NativeNetworkAwareContent as NetworkAwareContent,
13
13
  NativeOfflineWrapper as OfflineWrapper,
14
+ NativeToast as Toast,
14
15
  useNetworkInfo,
15
16
  useOfflineState
16
17
  } from '@digilogiclabs/saas-factory-ui/native';
@@ -89,6 +90,7 @@ function AppContent() {
89
90
  </NetworkAwareContent>
90
91
  </MobileContainer>
91
92
  </OfflineWrapper>
93
+ <Toast />
92
94
  <StatusBar style="auto" />
93
95
  </PageTransition>
94
96
  );
@@ -13,6 +13,8 @@ import {
13
13
  NativeProgressRing as ProgressRing,
14
14
  NativeChart as Chart,
15
15
  NativeStatCard as StatCard,
16
+ NativeSkeletonCard as SkeletonCard,
17
+ NativeSkeletonText as SkeletonText,
16
18
  PageTransition,
17
19
  NetworkAwareContent,
18
20
  NativeMobileHero as MobileHero,
@@ -188,11 +190,59 @@ export default function HomeScreen() {
188
190
 
189
191
  if (loading && !data) {
190
192
  return (
191
- <MobileContainer style={styles.container}>
192
- <View style={styles.loadingContainer}>
193
- <Text style={styles.loadingText}>Loading dashboard...</Text>
193
+ <PageTransition type="fade">
194
+ <View style={styles.container}>
195
+ <LinearGradient
196
+ colors={
197
+ isDark
198
+ ? ['#0F172A', '#1E293B', '#334155']
199
+ : ['#F8FAFC', '#E2E8F0', '#CBD5E1']
200
+ }
201
+ style={styles.gradientBackground}
202
+ />
203
+
204
+ <ScrollView style={styles.scrollView} contentContainerStyle={styles.scrollContent}>
205
+ <MobileContainer style={styles.content}>
206
+ {/* Hero skeleton */}
207
+ <View style={styles.heroSkeleton}>
208
+ <SkeletonText style={{ width: '60%', height: 24, marginBottom: 16 }} />
209
+ <SkeletonText style={{ width: '80%', height: 16, marginBottom: 24 }} />
210
+ <View style={styles.buttonSkeletonRow}>
211
+ <SkeletonCard style={styles.buttonSkeleton} />
212
+ <SkeletonCard style={styles.buttonSkeleton} />
213
+ </View>
214
+ </View>
215
+
216
+ {/* Stats skeleton */}
217
+ <View style={styles.statsGrid}>
218
+ {Array.from({ length: 4 }).map((_, i) => (
219
+ <SkeletonCard key={i} style={styles.statCard} />
220
+ ))}
221
+ </View>
222
+
223
+ {/* Chart skeleton */}
224
+ <SkeletonCard style={styles.chartCard} />
225
+
226
+ {/* Actions skeleton */}
227
+ <SkeletonCard style={styles.actionsCard} />
228
+
229
+ {/* Activity skeleton */}
230
+ <View style={styles.activitySkeleton}>
231
+ <SkeletonCard style={styles.activityCard} />
232
+ {Array.from({ length: 3 }).map((_, i) => (
233
+ <View key={i} style={styles.activityItemSkeleton}>
234
+ <SkeletonCard style={styles.activityIconSkeleton} />
235
+ <View style={styles.activityContentSkeleton}>
236
+ <SkeletonText style={{ width: '70%', height: 14, marginBottom: 4 }} />
237
+ <SkeletonText style={{ width: '40%', height: 12 }} />
238
+ </View>
239
+ </View>
240
+ ))}
241
+ </View>
242
+ </MobileContainer>
243
+ </ScrollView>
194
244
  </View>
195
- </MobileContainer>
245
+ </PageTransition>
196
246
  );
197
247
  }
198
248
 
@@ -673,4 +723,35 @@ const styles = StyleSheet.create({
673
723
  color: '#64748b',
674
724
  marginTop: 2,
675
725
  },
726
+ // Skeleton styles
727
+ heroSkeleton: {
728
+ marginBottom: 32,
729
+ paddingHorizontal: 20,
730
+ },
731
+ buttonSkeletonRow: {
732
+ flexDirection: 'row',
733
+ gap: 12,
734
+ },
735
+ buttonSkeleton: {
736
+ flex: 1,
737
+ height: 44,
738
+ borderRadius: 22,
739
+ },
740
+ activitySkeleton: {
741
+ padding: 16,
742
+ },
743
+ activityItemSkeleton: {
744
+ flexDirection: 'row',
745
+ alignItems: 'center',
746
+ gap: 12,
747
+ marginBottom: 16,
748
+ },
749
+ activityIconSkeleton: {
750
+ width: 32,
751
+ height: 32,
752
+ borderRadius: 16,
753
+ },
754
+ activityContentSkeleton: {
755
+ flex: 1,
756
+ },
676
757
  });
@@ -12,6 +12,7 @@ import {
12
12
  OfflineWrapper,
13
13
  NetworkAwareContent,
14
14
  NativeHapticsProvider as HapticsProvider,
15
+ NativeToast as Toast,
15
16
  AppShell
16
17
  } from '@digilogiclabs/saas-factory-ui/native';
17
18
 
@@ -112,6 +113,7 @@ export default function RootLayout() {
112
113
  />
113
114
  </Stack>
114
115
  </AppShell>
116
+ <Toast />
115
117
  <StatusBar style="auto" />
116
118
  </StripeProvider>
117
119
  </AuthProvider>
@@ -0,0 +1,23 @@
1
+ # Supabase Configuration
2
+ EXPO_PUBLIC_SUPABASE_URL=your_supabase_project_url
3
+ EXPO_PUBLIC_SUPABASE_ANON_KEY=your_supabase_anon_key
4
+
5
+ # Stripe Configuration
6
+ EXPO_PUBLIC_STRIPE_PUBLISHABLE_KEY=your_stripe_publishable_key
7
+
8
+ # AI Configuration - OpenAI
9
+ EXPO_PUBLIC_OPENAI_API_KEY=your_openai_api_key
10
+
11
+ # AI Configuration - ElevenLabs (for audio generation)
12
+ EXPO_PUBLIC_ELEVENLABS_API_KEY=your_elevenlabs_api_key
13
+
14
+ # AI Configuration - Replicate (for video/image generation)
15
+ EXPO_PUBLIC_REPLICATE_API_TOKEN=your_replicate_api_token
16
+
17
+ # Optional: Custom AI model configurations
18
+ EXPO_PUBLIC_AI_MODEL_TEXT=gpt-4
19
+ EXPO_PUBLIC_AI_MODEL_AUDIO=tts-1
20
+ EXPO_PUBLIC_AI_MODEL_VIDEO=stability-ai/stable-video-diffusion
21
+
22
+ # Development
23
+ EXPO_PUBLIC_DEV_MODE=true