@digilogiclabs/create-saas-app 1.14.1 → 1.17.1

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 (147) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/README.md +285 -39
  3. package/bin/index.js +1 -1
  4. package/dist/.tsbuildinfo +1 -1
  5. package/dist/cli/prompts/project-setup.d.ts.map +1 -1
  6. package/dist/cli/prompts/project-setup.js +49 -12
  7. package/dist/cli/prompts/project-setup.js.map +1 -1
  8. package/dist/generators/template-generator.d.ts.map +1 -1
  9. package/dist/generators/template-generator.js +27 -4
  10. package/dist/generators/template-generator.js.map +1 -1
  11. package/dist/templates/mobile/base/template/App.tsx +2 -0
  12. package/dist/templates/mobile/ui-auth-payments/template/.env.example +20 -0
  13. package/dist/templates/mobile/ui-auth-payments/template/README.md +218 -0
  14. package/dist/templates/mobile/ui-auth-payments/template/app/(tabs)/_layout.tsx +153 -0
  15. package/dist/templates/mobile/ui-auth-payments/template/app/(tabs)/analytics.tsx +668 -0
  16. package/dist/templates/mobile/ui-auth-payments/template/app/(tabs)/billing.tsx +743 -0
  17. package/dist/templates/mobile/ui-auth-payments/template/app/(tabs)/index.tsx +757 -0
  18. package/dist/templates/mobile/ui-auth-payments/template/app/(tabs)/orders.tsx +402 -0
  19. package/dist/templates/mobile/ui-auth-payments/template/app/(tabs)/profile.tsx +580 -0
  20. package/dist/templates/mobile/ui-auth-payments/template/app/_layout.tsx +127 -0
  21. package/dist/templates/mobile/ui-auth-payments/template/app/auth/login.tsx +246 -0
  22. package/dist/templates/mobile/ui-auth-payments/template/app/auth/signup.tsx +362 -0
  23. package/dist/templates/mobile/ui-auth-payments/template/app/onboarding/index.tsx +193 -0
  24. package/dist/templates/mobile/ui-auth-payments/template/app/tour/index.tsx +272 -0
  25. package/dist/templates/mobile/ui-auth-payments/template/app.json +93 -0
  26. package/dist/templates/mobile/ui-auth-payments/template/babel.config.js +23 -0
  27. package/dist/templates/mobile/ui-auth-payments/template/eas.json +45 -0
  28. package/dist/templates/mobile/ui-auth-payments/template/expo-env.d.ts +3 -0
  29. package/dist/templates/mobile/ui-auth-payments/template/jest-setup.ts +74 -0
  30. package/dist/templates/mobile/ui-auth-payments/template/metro.config.js +11 -0
  31. package/dist/templates/mobile/ui-auth-payments/template/package.json +106 -0
  32. package/dist/templates/mobile/ui-auth-payments/template/tsconfig.json +31 -0
  33. package/dist/templates/mobile/ui-auth-payments-ai/template/.env.example +23 -0
  34. package/dist/templates/mobile/ui-auth-payments-ai/template/README.md +254 -0
  35. package/dist/templates/mobile/ui-auth-payments-ai/template/app/(tabs)/_layout.tsx +169 -0
  36. package/dist/templates/mobile/ui-auth-payments-ai/template/app/(tabs)/ai.tsx +522 -0
  37. package/dist/templates/mobile/ui-auth-payments-ai/template/app/(tabs)/analytics.tsx +668 -0
  38. package/dist/templates/mobile/ui-auth-payments-ai/template/app/(tabs)/billing.tsx +743 -0
  39. package/dist/templates/mobile/ui-auth-payments-ai/template/app/(tabs)/index.tsx +676 -0
  40. package/dist/templates/mobile/ui-auth-payments-ai/template/app/(tabs)/orders.tsx +402 -0
  41. package/dist/templates/mobile/ui-auth-payments-ai/template/app/(tabs)/profile.tsx +580 -0
  42. package/dist/templates/mobile/ui-auth-payments-ai/template/app/_layout.tsx +127 -0
  43. package/dist/templates/mobile/ui-auth-payments-ai/template/app/auth/login.tsx +246 -0
  44. package/dist/templates/mobile/ui-auth-payments-ai/template/app/auth/signup.tsx +362 -0
  45. package/dist/templates/mobile/ui-auth-payments-ai/template/app/onboarding/index.tsx +193 -0
  46. package/dist/templates/mobile/ui-auth-payments-ai/template/app/tour/index.tsx +272 -0
  47. package/dist/templates/mobile/ui-auth-payments-ai/template/app.json +93 -0
  48. package/dist/templates/mobile/ui-auth-payments-ai/template/babel.config.js +23 -0
  49. package/dist/templates/mobile/ui-auth-payments-ai/template/eas.json +45 -0
  50. package/dist/templates/mobile/ui-auth-payments-ai/template/expo-env.d.ts +3 -0
  51. package/dist/templates/mobile/ui-auth-payments-ai/template/jest-setup.ts +74 -0
  52. package/dist/templates/mobile/ui-auth-payments-ai/template/metro.config.js +11 -0
  53. package/dist/templates/mobile/ui-auth-payments-ai/template/package.json +108 -0
  54. package/dist/templates/mobile/ui-auth-payments-ai/template/tsconfig.json +31 -0
  55. package/dist/templates/web/base/template/src/app/dashboard/page.tsx +62 -20
  56. package/dist/templates/web/base/template/src/app/loading.tsx +45 -27
  57. package/dist/templates/web/base/template/src/components/providers/app-providers.tsx +2 -0
  58. package/dist/templates/web/ui-auth/template/package.json +1 -1
  59. package/dist/templates/web/ui-auth/template/src/app/loading.tsx +30 -12
  60. package/dist/templates/web/ui-auth/template/src/components/providers/app-providers.tsx +2 -0
  61. package/dist/templates/web/ui-auth/template/src/components/shared/header.tsx +43 -2
  62. package/dist/templates/web/ui-auth-ai/template/package.json +1 -1
  63. package/dist/templates/web/ui-auth-payments/template/package.json +1 -1
  64. package/dist/templates/web/ui-auth-payments/template/src/app/dashboard/page.tsx +69 -17
  65. package/dist/templates/web/ui-auth-payments/template/src/components/providers/app-providers.tsx +2 -0
  66. package/dist/templates/web/ui-auth-payments-ai/template/package.json +1 -1
  67. package/dist/templates/web/ui-auth-payments-ai/template/src/app/billing/page.tsx +218 -7
  68. package/dist/templates/web/ui-auth-payments-ai/template/src/app/dashboard/page.tsx +62 -9
  69. package/dist/templates/web/ui-auth-payments-ai/template/src/app/onboarding/page.tsx +364 -0
  70. package/dist/templates/web/ui-auth-payments-ai/template/src/app/settings/page.tsx +532 -0
  71. package/dist/templates/web/ui-auth-payments-ai/template/src/components/client/login-form.tsx +70 -51
  72. package/dist/templates/web/ui-auth-payments-ai/template/src/components/client/signup-form.tsx +76 -60
  73. package/dist/templates/web/ui-auth-payments-ai/template/src/components/providers/app-providers.tsx +2 -0
  74. package/dist/templates/web/ui-auth-payments-audio/template/package.json +1 -1
  75. package/dist/templates/web/ui-auth-payments-audio/template/src/app/dashboard/page.tsx +71 -17
  76. package/dist/templates/web/ui-auth-payments-audio/template/src/components/providers/app-providers.tsx +2 -0
  77. package/dist/templates/web/ui-auth-payments-video/template/package.json +1 -1
  78. package/dist/templates/web/ui-auth-payments-video/template/src/components/providers/app-providers.tsx +2 -0
  79. package/package.json +1 -1
  80. package/src/templates/mobile/base/template/App.tsx +2 -0
  81. package/src/templates/mobile/ui-auth-payments/template/.env.example +20 -0
  82. package/src/templates/mobile/ui-auth-payments/template/README.md +218 -0
  83. package/src/templates/mobile/ui-auth-payments/template/app/(tabs)/_layout.tsx +153 -0
  84. package/src/templates/mobile/ui-auth-payments/template/app/(tabs)/analytics.tsx +668 -0
  85. package/src/templates/mobile/ui-auth-payments/template/app/(tabs)/billing.tsx +743 -0
  86. package/src/templates/mobile/ui-auth-payments/template/app/(tabs)/index.tsx +757 -0
  87. package/src/templates/mobile/ui-auth-payments/template/app/(tabs)/orders.tsx +402 -0
  88. package/src/templates/mobile/ui-auth-payments/template/app/(tabs)/profile.tsx +580 -0
  89. package/src/templates/mobile/ui-auth-payments/template/app/_layout.tsx +127 -0
  90. package/src/templates/mobile/ui-auth-payments/template/app/auth/login.tsx +246 -0
  91. package/src/templates/mobile/ui-auth-payments/template/app/auth/signup.tsx +362 -0
  92. package/src/templates/mobile/ui-auth-payments/template/app/onboarding/index.tsx +193 -0
  93. package/src/templates/mobile/ui-auth-payments/template/app/tour/index.tsx +272 -0
  94. package/src/templates/mobile/ui-auth-payments/template/app.json +93 -0
  95. package/src/templates/mobile/ui-auth-payments/template/babel.config.js +23 -0
  96. package/src/templates/mobile/ui-auth-payments/template/eas.json +45 -0
  97. package/src/templates/mobile/ui-auth-payments/template/expo-env.d.ts +3 -0
  98. package/src/templates/mobile/ui-auth-payments/template/jest-setup.ts +74 -0
  99. package/src/templates/mobile/ui-auth-payments/template/metro.config.js +11 -0
  100. package/src/templates/mobile/ui-auth-payments/template/package.json +106 -0
  101. package/src/templates/mobile/ui-auth-payments/template/tsconfig.json +31 -0
  102. package/src/templates/mobile/ui-auth-payments-ai/template/.env.example +23 -0
  103. package/src/templates/mobile/ui-auth-payments-ai/template/README.md +254 -0
  104. package/src/templates/mobile/ui-auth-payments-ai/template/app/(tabs)/_layout.tsx +169 -0
  105. package/src/templates/mobile/ui-auth-payments-ai/template/app/(tabs)/ai.tsx +522 -0
  106. package/src/templates/mobile/ui-auth-payments-ai/template/app/(tabs)/analytics.tsx +668 -0
  107. package/src/templates/mobile/ui-auth-payments-ai/template/app/(tabs)/billing.tsx +743 -0
  108. package/src/templates/mobile/ui-auth-payments-ai/template/app/(tabs)/index.tsx +676 -0
  109. package/src/templates/mobile/ui-auth-payments-ai/template/app/(tabs)/orders.tsx +402 -0
  110. package/src/templates/mobile/ui-auth-payments-ai/template/app/(tabs)/profile.tsx +580 -0
  111. package/src/templates/mobile/ui-auth-payments-ai/template/app/_layout.tsx +127 -0
  112. package/src/templates/mobile/ui-auth-payments-ai/template/app/auth/login.tsx +246 -0
  113. package/src/templates/mobile/ui-auth-payments-ai/template/app/auth/signup.tsx +362 -0
  114. package/src/templates/mobile/ui-auth-payments-ai/template/app/onboarding/index.tsx +193 -0
  115. package/src/templates/mobile/ui-auth-payments-ai/template/app/tour/index.tsx +272 -0
  116. package/src/templates/mobile/ui-auth-payments-ai/template/app.json +93 -0
  117. package/src/templates/mobile/ui-auth-payments-ai/template/babel.config.js +23 -0
  118. package/src/templates/mobile/ui-auth-payments-ai/template/eas.json +45 -0
  119. package/src/templates/mobile/ui-auth-payments-ai/template/expo-env.d.ts +3 -0
  120. package/src/templates/mobile/ui-auth-payments-ai/template/jest-setup.ts +74 -0
  121. package/src/templates/mobile/ui-auth-payments-ai/template/metro.config.js +11 -0
  122. package/src/templates/mobile/ui-auth-payments-ai/template/package.json +108 -0
  123. package/src/templates/mobile/ui-auth-payments-ai/template/tsconfig.json +31 -0
  124. package/src/templates/web/base/template/src/app/dashboard/page.tsx +62 -20
  125. package/src/templates/web/base/template/src/app/loading.tsx +45 -27
  126. package/src/templates/web/base/template/src/components/providers/app-providers.tsx +2 -0
  127. package/src/templates/web/ui-auth/template/package.json +1 -1
  128. package/src/templates/web/ui-auth/template/src/app/loading.tsx +30 -12
  129. package/src/templates/web/ui-auth/template/src/components/providers/app-providers.tsx +2 -0
  130. package/src/templates/web/ui-auth/template/src/components/shared/header.tsx +43 -2
  131. package/src/templates/web/ui-auth-ai/template/package.json +1 -1
  132. package/src/templates/web/ui-auth-payments/template/package.json +1 -1
  133. package/src/templates/web/ui-auth-payments/template/src/app/dashboard/page.tsx +69 -17
  134. package/src/templates/web/ui-auth-payments/template/src/components/providers/app-providers.tsx +2 -0
  135. package/src/templates/web/ui-auth-payments-ai/template/package.json +1 -1
  136. package/src/templates/web/ui-auth-payments-ai/template/src/app/billing/page.tsx +218 -7
  137. package/src/templates/web/ui-auth-payments-ai/template/src/app/dashboard/page.tsx +62 -9
  138. package/src/templates/web/ui-auth-payments-ai/template/src/app/onboarding/page.tsx +364 -0
  139. package/src/templates/web/ui-auth-payments-ai/template/src/app/settings/page.tsx +532 -0
  140. package/src/templates/web/ui-auth-payments-ai/template/src/components/client/login-form.tsx +70 -51
  141. package/src/templates/web/ui-auth-payments-ai/template/src/components/client/signup-form.tsx +76 -60
  142. package/src/templates/web/ui-auth-payments-ai/template/src/components/providers/app-providers.tsx +2 -0
  143. package/src/templates/web/ui-auth-payments-audio/template/package.json +1 -1
  144. package/src/templates/web/ui-auth-payments-audio/template/src/app/dashboard/page.tsx +71 -17
  145. package/src/templates/web/ui-auth-payments-audio/template/src/components/providers/app-providers.tsx +2 -0
  146. package/src/templates/web/ui-auth-payments-video/template/package.json +1 -1
  147. package/src/templates/web/ui-auth-payments-video/template/src/components/providers/app-providers.tsx +2 -0
@@ -0,0 +1,11 @@
1
+ const { getDefaultConfig } = require('expo/metro-config');
2
+
3
+ /** @type {import('expo/metro-config').MetroConfig} */
4
+ const config = getDefaultConfig(__dirname);
5
+
6
+ // Add SVG support
7
+ config.transformer.babelTransformerPath = require.resolve('react-native-svg-transformer');
8
+ config.resolver.assetExts = config.resolver.assetExts.filter((ext) => ext !== 'svg');
9
+ config.resolver.sourceExts = [...config.resolver.sourceExts, 'svg'];
10
+
11
+ module.exports = config;
@@ -0,0 +1,108 @@
1
+ {
2
+ "name": "{{packageName}}",
3
+ "version": "1.0.0",
4
+ "description": "{{description}} - Mobile AI App with UI, Auth, Payments, and AI Generation",
5
+ "main": "node_modules/expo/AppEntry.js",
6
+ "scripts": {
7
+ "start": "expo start",
8
+ "dev": "expo start --dev-client",
9
+ "android": "expo start --android",
10
+ "ios": "expo start --ios",
11
+ "web": "expo start --web",
12
+ "build": "eas build",
13
+ "build:android": "eas build --platform android",
14
+ "build:ios": "eas build --platform ios",
15
+ "preview": "eas build --profile preview",
16
+ "submit": "eas submit",
17
+ "test": "jest",
18
+ "lint": "expo lint",
19
+ "type-check": "tsc --noEmit"
20
+ },
21
+ "dependencies": {
22
+ "expo": "~50.0.0",
23
+ "react": "18.2.0",
24
+ "react-native": "0.73.4",
25
+
26
+ "@expo/vector-icons": "^14.0.0",
27
+ "@expo/config-plugins": "~7.8.0",
28
+
29
+ "@react-navigation/native": "^6.1.9",
30
+ "@react-navigation/stack": "^6.3.20",
31
+ "@react-navigation/bottom-tabs": "^6.5.11",
32
+ "@react-navigation/drawer": "^6.6.6",
33
+ "react-native-screens": "~3.29.0",
34
+ "react-native-safe-area-context": "4.8.2",
35
+ "react-native-gesture-handler": "~2.14.0",
36
+ "react-native-reanimated": "~3.6.2",
37
+
38
+ "@digilogiclabs/saas-factory-ui": "^0.22.0",
39
+ "@digilogiclabs/saas-factory-auth": "^1.0.1",
40
+ "@digilogiclabs/saas-factory-payments": "^1.1.0",
41
+ "@digilogiclabs/saas-factory-ai": "^3.0.0",
42
+ "@digilogiclabs/saas-factory-ai-types": "^3.0.0",
43
+
44
+ "@supabase/supabase-js": "^2.39.0",
45
+ "@react-native-async-storage/async-storage": "1.21.0",
46
+
47
+ "@stripe/stripe-react-native": "0.37.2",
48
+
49
+ "expo-router": "~3.4.0",
50
+ "expo-font": "~11.10.0",
51
+ "expo-linking": "~6.2.2",
52
+ "expo-constants": "~15.4.0",
53
+ "expo-status-bar": "~1.11.1",
54
+ "expo-splash-screen": "~0.26.4",
55
+ "expo-system-ui": "~2.9.3",
56
+ "expo-web-browser": "~12.8.2",
57
+ "expo-haptics": "~12.8.1",
58
+ "expo-device": "~5.9.3",
59
+ "expo-location": "~16.5.3",
60
+ "expo-image-picker": "~14.7.1",
61
+ "expo-camera": "~14.1.3",
62
+ "expo-barcode-scanner": "~12.9.3",
63
+ "expo-notifications": "~0.27.6",
64
+ "expo-secure-store": "~12.8.1",
65
+ "expo-file-system": "~16.0.6",
66
+ "expo-updates": "~0.24.11",
67
+ "expo-linear-gradient": "~12.7.2",
68
+ "expo-blur": "~12.9.2",
69
+
70
+ "@react-native-community/netinfo": "11.2.1",
71
+ "react-native-mmkv": "^2.12.2",
72
+ "react-native-svg": "14.1.0",
73
+ "react-native-url-polyfill": "^2.0.0",
74
+
75
+ "zustand": "^4.4.7",
76
+ "react-hook-form": "^7.48.2",
77
+ "@hookform/resolvers": "^3.3.2",
78
+ "zod": "^3.22.4",
79
+ "date-fns": "^3.0.6",
80
+ "react-native-heroicons": "^4.0.0"
81
+ },
82
+ "devDependencies": {
83
+ "@babel/core": "^7.23.6",
84
+ "@types/react": "~18.2.45",
85
+ "@types/react-native": "~0.73.0",
86
+ "typescript": "~5.3.3",
87
+ "jest": "^29.7.0",
88
+ "@testing-library/react-native": "^12.4.2",
89
+ "@testing-library/jest-native": "^5.4.3",
90
+ "babel-plugin-module-resolver": "^5.0.0",
91
+ "eslint": "^8.57.0",
92
+ "eslint-config-expo": "^7.0.0",
93
+ "prettier": "^3.1.1"
94
+ },
95
+ "jest": {
96
+ "preset": "jest-expo",
97
+ "setupFilesAfterEnv": ["<rootDir>/jest-setup.ts"],
98
+ "transformIgnorePatterns": [
99
+ "node_modules/(?!((jest-)?react-native|@react-native(-community)?)|expo(nent)?|@expo(nent)?/.*|@expo-google-fonts/.*|react-navigation|@react-navigation/.*|@unimodules/.*|unimodules|sentry-expo|native-base|react-native-svg)"
100
+ ]
101
+ },
102
+ "private": true,
103
+ "expo": {
104
+ "install": {
105
+ "exclude": ["react-native-safe-area-context"]
106
+ }
107
+ }
108
+ }
@@ -0,0 +1,31 @@
1
+ {
2
+ "extends": "expo/tsconfig.base",
3
+ "compilerOptions": {
4
+ "strict": true,
5
+ "baseUrl": "./",
6
+ "paths": {
7
+ "@/*": ["./*"],
8
+ "@/components/*": ["./components/*"],
9
+ "@/hooks/*": ["./hooks/*"],
10
+ "@/utils/*": ["./utils/*"],
11
+ "@/types/*": ["./types/*"],
12
+ "@/constants/*": ["./constants/*"]
13
+ },
14
+ "skipLibCheck": true,
15
+ "allowSyntheticDefaultImports": true,
16
+ "esModuleInterop": true,
17
+ "moduleResolution": "node",
18
+ "resolveJsonModule": true,
19
+ "noEmit": true,
20
+ "jsx": "react-jsx"
21
+ },
22
+ "include": [
23
+ "**/*.ts",
24
+ "**/*.tsx",
25
+ ".expo/types/**/*.ts",
26
+ "expo-env.d.ts"
27
+ ],
28
+ "exclude": [
29
+ "node_modules"
30
+ ]
31
+ }
@@ -15,7 +15,10 @@ import {
15
15
  NetworkAwareContent,
16
16
  OfflineWrapper,
17
17
  useNetworkInfo,
18
- useOfflineState
18
+ useOfflineState,
19
+ DashboardLayout,
20
+ CommandPalette,
21
+ Tour
19
22
  } from '@digilogiclabs/saas-factory-ui';
20
23
  import {
21
24
  BarChart3,
@@ -27,7 +30,10 @@ import {
27
30
  Star,
28
31
  Trash2,
29
32
  Wifi,
30
- WifiOff
33
+ WifiOff,
34
+ Home,
35
+ FileText,
36
+ Activity
31
37
  } from 'lucide-react';
32
38
 
33
39
  // Mock data for demonstration
@@ -43,6 +49,32 @@ const mockActivityData = Array.from({ length: 50 }, (_, i) => ({
43
49
  export default function DashboardPage() {
44
50
  const { user } = useAuth();
45
51
 
52
+ const sidebarNavigation = [
53
+ { name: 'Dashboard', href: '/dashboard', icon: Home, current: true },
54
+ { name: 'Analytics', href: '/dashboard/analytics', icon: BarChart3 },
55
+ { name: 'Reports', href: '/dashboard/reports', icon: FileText },
56
+ { name: 'Activity', href: '/dashboard/activity', icon: Activity },
57
+ { name: 'Settings', href: '/settings', icon: Settings }
58
+ ]
59
+
60
+ const tourSteps = [
61
+ {
62
+ target: '[data-tour="overview"]',
63
+ title: 'Mobile-First Dashboard',
64
+ content: 'This dashboard is optimized for mobile devices with offline support and responsive design.'
65
+ },
66
+ {
67
+ target: '[data-tour="stats"]',
68
+ title: 'Network-Aware Stats',
69
+ content: 'Statistics automatically adapt based on your network connection speed.'
70
+ },
71
+ {
72
+ target: '[data-tour="activity"]',
73
+ title: 'Interactive Activity Feed',
74
+ content: 'Swipe left or right on activity items to archive, star, or delete them.'
75
+ }
76
+ ]
77
+
46
78
  const lazyImageConfig = {
47
79
  mobileOptimization: {
48
80
  quality: 80,
@@ -116,23 +148,30 @@ export default function DashboardPage() {
116
148
 
117
149
 
118
150
  return (
119
- <PageTransition type="slide" direction="horizontal" duration={300}>
120
- <OfflineWrapper
121
- cacheStrategy="stale-while-revalidate"
122
- showOfflineIndicator={true}
123
- backgroundSync={true}
124
- >
125
- <PullToRefresh
126
- onRefresh={handleRefresh}
127
- threshold={80}
128
- loadingIndicator="spinner"
129
- hapticOnTrigger={true}
130
- networkAware={true}
151
+ <DashboardLayout
152
+ navigation={sidebarNavigation}
153
+ headerActions={[
154
+ <CommandPalette key="command-palette" />,
155
+ <Tour key="tour" steps={tourSteps} />
156
+ ]}
157
+ >
158
+ <PageTransition type="slide" direction="horizontal" duration={300}>
159
+ <OfflineWrapper
160
+ cacheStrategy="stale-while-revalidate"
161
+ showOfflineIndicator={true}
162
+ backgroundSync={true}
131
163
  >
132
- <div className="min-h-screen bg-gray-50">
133
- <MobileContainer className="py-6">
134
- {/* Header */}
135
- <div className="mb-6">
164
+ <PullToRefresh
165
+ onRefresh={handleRefresh}
166
+ threshold={80}
167
+ loadingIndicator="spinner"
168
+ hapticOnTrigger={true}
169
+ networkAware={true}
170
+ >
171
+ <div className="min-h-screen bg-gray-50">
172
+ <MobileContainer className="py-6">
173
+ {/* Header */}
174
+ <div className="mb-6" data-tour="overview">
136
175
  <div className="flex items-center justify-between">
137
176
  <div>
138
177
  <h1 className="text-2xl font-bold text-gray-900">
@@ -164,7 +203,8 @@ export default function DashboardPage() {
164
203
  </div>
165
204
 
166
205
  {/* Stats Grid */}
167
- <NetworkAwareContent
206
+ <div data-tour="stats">
207
+ <NetworkAwareContent
168
208
  showOnSlow={
169
209
  <ResponsiveGrid columns={gridConfig.columns_2_2} gap="sm" className="mb-6">
170
210
  {stats.slice(0, 2).map((stat, index) => (
@@ -202,9 +242,10 @@ export default function DashboardPage() {
202
242
  ))}
203
243
  </ResponsiveGrid>
204
244
  </NetworkAwareContent>
245
+ </div>
205
246
 
206
247
  {/* Activity Feed */}
207
- <Card className="mb-6">
248
+ <Card className="mb-6" data-tour="activity">
208
249
  <CardHeader>
209
250
  <CardTitle className="flex items-center gap-2">
210
251
  <BarChart3 className="h-5 w-5" />
@@ -320,5 +361,6 @@ export default function DashboardPage() {
320
361
  </PullToRefresh>
321
362
  </OfflineWrapper>
322
363
  </PageTransition>
364
+ </DashboardLayout>
323
365
  );
324
366
  }
@@ -1,34 +1,52 @@
1
- import { Card } from '@digilogiclabs/saas-factory-ui'
1
+ import { Card, SkeletonCard, SkeletonText } from '@digilogiclabs/saas-factory-ui'
2
2
 
3
3
  export default function Loading() {
4
4
  return (
5
- <div className="min-h-screen bg-gradient-to-br from-blue-50 to-indigo-100 dark:from-gray-900 dark:to-gray-800 flex items-center justify-center">
6
- <Card className="p-8 max-w-sm w-full mx-4">
7
- <div className="flex flex-col items-center space-y-4">
8
- {/* Animated spinner */}
9
- <div className="relative">
10
- <div className="w-12 h-12 border-4 border-gray-200 dark:border-gray-700 rounded-full animate-spin"></div>
11
- <div className="absolute top-0 left-0 w-12 h-12 border-4 border-blue-600 border-t-transparent rounded-full animate-spin"></div>
12
- </div>
13
-
14
- {/* Loading text */}
15
- <div className="text-center">
16
- <h2 className="text-lg font-semibold text-gray-900 dark:text-white mb-2">
17
- Loading...
18
- </h2>
19
- <p className="text-sm text-gray-600 dark:text-gray-300">
20
- Please wait while we prepare your content
21
- </p>
22
- </div>
23
-
24
- {/* Pulsing dots */}
25
- <div className="flex space-x-1">
26
- <div className="w-2 h-2 bg-blue-600 rounded-full animate-pulse"></div>
27
- <div className="w-2 h-2 bg-blue-600 rounded-full animate-pulse" style={{ animationDelay: '0.2s' }}></div>
28
- <div className="w-2 h-2 bg-blue-600 rounded-full animate-pulse" style={{ animationDelay: '0.4s' }}></div>
29
- </div>
5
+ <div className="min-h-screen bg-gradient-to-br from-blue-50 to-indigo-100 dark:from-gray-900 dark:to-gray-800">
6
+ <div className="container mx-auto px-4 py-8">
7
+ {/* Header skeleton */}
8
+ <div className="mb-8">
9
+ <SkeletonText className="h-8 w-64 mb-4" />
10
+ <SkeletonText className="h-4 w-96" />
30
11
  </div>
31
- </Card>
12
+
13
+ {/* Cards grid skeleton */}
14
+ <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6 mb-8">
15
+ {Array.from({ length: 6 }).map((_, i) => (
16
+ <SkeletonCard key={i} />
17
+ ))}
18
+ </div>
19
+
20
+ {/* Centered loading spinner */}
21
+ <div className="flex justify-center">
22
+ <Card className="p-8 max-w-sm w-full mx-4">
23
+ <div className="flex flex-col items-center space-y-4">
24
+ {/* Animated spinner */}
25
+ <div className="relative">
26
+ <div className="w-12 h-12 border-4 border-gray-200 dark:border-gray-700 rounded-full animate-spin"></div>
27
+ <div className="absolute top-0 left-0 w-12 h-12 border-4 border-blue-600 border-t-transparent rounded-full animate-spin"></div>
28
+ </div>
29
+
30
+ {/* Loading text */}
31
+ <div className="text-center">
32
+ <h2 className="text-lg font-semibold text-gray-900 dark:text-white mb-2">
33
+ Loading...
34
+ </h2>
35
+ <p className="text-sm text-gray-600 dark:text-gray-300">
36
+ Please wait while we prepare your content
37
+ </p>
38
+ </div>
39
+
40
+ {/* Pulsing dots */}
41
+ <div className="flex space-x-1">
42
+ <div className="w-2 h-2 bg-blue-600 rounded-full animate-pulse"></div>
43
+ <div className="w-2 h-2 bg-blue-600 rounded-full animate-pulse" style={{ animationDelay: '0.2s' }}></div>
44
+ <div className="w-2 h-2 bg-blue-600 rounded-full animate-pulse" style={{ animationDelay: '0.4s' }}></div>
45
+ </div>
46
+ </div>
47
+ </Card>
48
+ </div>
49
+ </div>
32
50
  </div>
33
51
  )
34
52
  }
@@ -4,6 +4,7 @@ import React from 'react'
4
4
  import { AuthProvider } from '@digilogiclabs/saas-factory-auth'
5
5
  import { ThemeProvider } from 'next-themes'
6
6
  import { StripeProvider } 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 {
@@ -25,6 +26,7 @@ export function AppProviders({ children }: AppProvidersProps) {
25
26
  >
26
27
  <AppThemeProvider themeColor="{{themeColor}}">
27
28
  {children}
29
+ <Toaster />
28
30
  </AppThemeProvider>
29
31
  </ThemeProvider>
30
32
  </StripeProvider>
@@ -17,7 +17,7 @@
17
17
  "next": "^15.0.0",
18
18
  "react": "^19.0.0",
19
19
  "react-dom": "^19.0.0",
20
- "@digilogiclabs/saas-factory-ui": "^0.18.4",
20
+ "@digilogiclabs/saas-factory-ui": "^0.21.0",
21
21
  "@digilogiclabs/saas-factory-auth": "^1.0.1",
22
22
  "tailwindcss": "^3.3.0",
23
23
  "autoprefixer": "^10.4.16",
@@ -1,20 +1,38 @@
1
- import { Card } from '@digilogiclabs/saas-factory-ui'
1
+ import { Card, SkeletonCard, SkeletonText } from '@digilogiclabs/saas-factory-ui'
2
2
  import { Loader2 } from 'lucide-react'
3
3
 
4
4
  export default function Loading() {
5
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>
6
+ <div className="min-h-screen bg-gray-50 dark:bg-gray-900">
7
+ <div className="container mx-auto px-4 py-8">
8
+ {/* Header skeleton */}
9
+ <div className="mb-8">
10
+ <SkeletonText className="h-8 w-64 mb-4" />
11
+ <SkeletonText className="h-4 w-96" />
16
12
  </div>
17
- </Card>
13
+
14
+ {/* Cards grid skeleton */}
15
+ <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6 mb-8">
16
+ {Array.from({ length: 6 }).map((_, i) => (
17
+ <SkeletonCard key={i} />
18
+ ))}
19
+ </div>
20
+
21
+ {/* Centered loading spinner */}
22
+ <div className="flex justify-center">
23
+ <Card className="w-full max-w-md p-8 text-center">
24
+ <div className="flex flex-col items-center">
25
+ <Loader2 className="h-8 w-8 animate-spin text-blue-600 dark:text-blue-400 mb-4" />
26
+ <h2 className="text-lg font-medium text-gray-900 dark:text-white mb-2">
27
+ Loading
28
+ </h2>
29
+ <p className="text-sm text-gray-600 dark:text-gray-300">
30
+ Please wait while we load your content...
31
+ </p>
32
+ </div>
33
+ </Card>
34
+ </div>
35
+ </div>
18
36
  </div>
19
37
  )
20
38
  }
@@ -3,6 +3,7 @@
3
3
  import React from 'react'
4
4
  import { ThemeProvider } from 'next-themes'
5
5
  import { AuthProvider } from '@digilogiclabs/saas-factory-auth'
6
+ import { Toaster } from '@digilogiclabs/saas-factory-ui'
6
7
  import { AppThemeProvider } from './theme-provider'
7
8
 
8
9
  interface AppProvidersProps {
@@ -21,6 +22,7 @@ export function AppProviders({ children }: AppProvidersProps) {
21
22
  <AuthProvider>
22
23
  <AppThemeProvider themeColor="{{themeColor}}">
23
24
  {children}
25
+ <Toaster />
24
26
  </AppThemeProvider>
25
27
  </AuthProvider>
26
28
  </ThemeProvider>
@@ -1,17 +1,27 @@
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 } from 'lucide-react';
5
+ import { LogOut, Search, Command } from 'lucide-react';
6
+ import { SearchBar, CommandPalette, useToast } from '@digilogiclabs/saas-factory-ui';
6
7
  import { ThemeToggle } from '../ui/theme-toggle';
7
8
 
8
9
  export function Header() {
9
10
  const user = null; // Placeholder for auth state
11
+ const [showSearch, setShowSearch] = useState(false);
12
+ const { toast } = useToast();
10
13
 
11
14
  const handleSignOut = () => {
12
15
  alert('Sign out functionality requires @digilogiclabs/saas-factory-auth package');
13
16
  };
14
17
 
18
+ const handleSearch = (query: string) => {
19
+ toast({
20
+ title: "Search",
21
+ description: `Searching for: ${query}`,
22
+ });
23
+ };
24
+
15
25
  return (
16
26
  <header className="bg-white dark:bg-gray-800 shadow-md">
17
27
  <div className="container mx-auto px-4 py-4 flex justify-between items-center">
@@ -19,6 +29,25 @@ export function Header() {
19
29
  {{titleCaseName}}
20
30
  </Link>
21
31
  <nav className="flex items-center gap-4">
32
+ {/* Search Bar */}
33
+ <div className="hidden md:block">
34
+ <SearchBar
35
+ placeholder="Search..."
36
+ onSearch={handleSearch}
37
+ debounceMs={300}
38
+ className="w-64"
39
+ />
40
+ </div>
41
+
42
+ {/* Mobile search toggle */}
43
+ <button
44
+ onClick={() => setShowSearch(!showSearch)}
45
+ className="md:hidden p-2 text-gray-600 dark:text-gray-300 hover:text-gray-900 dark:hover:text-white"
46
+ >
47
+ <Search className="h-5 w-5" />
48
+ </button>
49
+
50
+ <CommandPalette />
22
51
  <ThemeToggle />
23
52
  {user ? (
24
53
  <>
@@ -46,6 +75,18 @@ export function Header() {
46
75
  </>
47
76
  )}
48
77
  </nav>
78
+
79
+ {/* Mobile search bar */}
80
+ {showSearch && (
81
+ <div className="md:hidden absolute top-full left-0 right-0 p-4 bg-white dark:bg-gray-800 border-t">
82
+ <SearchBar
83
+ placeholder="Search..."
84
+ onSearch={handleSearch}
85
+ debounceMs={300}
86
+ autoFocus
87
+ />
88
+ </div>
89
+ )}
49
90
  </div>
50
91
  </header>
51
92
  );
@@ -19,7 +19,7 @@
19
19
  "clsx": "^2.0.0",
20
20
  "tailwindcss": "^3.3.0",
21
21
  "autoprefixer": "^10.4.16",
22
- "postcss": "^8.4.31"{{#ai.enabled}},
22
+ "postcss": "^8.4.31",{{#ai.enabled}}
23
23
  "@digilogiclabs/saas-factory-ai": "^3.0.0",
24
24
  "@digilogiclabs/saas-factory-ai-types": "^3.0.0"{{/ai.enabled}}
25
25
  },
@@ -17,7 +17,7 @@
17
17
  "next": "^15.0.0",
18
18
  "react": "^19.0.0",
19
19
  "react-dom": "^19.0.0",
20
- "@digilogiclabs/saas-factory-ui": "^0.18.4",
20
+ "@digilogiclabs/saas-factory-ui": "^0.21.0",
21
21
  "@digilogiclabs/saas-factory-auth": "^1.0.1",
22
22
  "@digilogiclabs/saas-factory-payments": "^1.1.0",
23
23
  "stripe": "^14.0.0",
@@ -1,6 +1,21 @@
1
1
  import { Suspense } from 'react'
2
- import { Button, Card } from '@digilogiclabs/saas-factory-ui'
3
- import { User, Settings, CreditCard, Activity } from 'lucide-react'
2
+ import {
3
+ Button,
4
+ Card,
5
+ DashboardLayout,
6
+ CommandPalette,
7
+ Tour
8
+ } from '@digilogiclabs/saas-factory-ui'
9
+ import {
10
+ User,
11
+ Settings,
12
+ CreditCard,
13
+ Activity,
14
+ Home,
15
+ BarChart,
16
+ FileText,
17
+ ShoppingCart
18
+ } from 'lucide-react'
4
19
  import { requireAuth } from '@/lib/auth-server'
5
20
  import Link from 'next/link'
6
21
 
@@ -90,26 +105,62 @@ export default async function DashboardPage() {
90
105
  // Server-side authentication requirement
91
106
  const user = await requireAuth()
92
107
 
108
+ const sidebarNavigation = [
109
+ { name: 'Overview', href: '/dashboard', icon: Home, current: true },
110
+ { name: 'Orders', href: '/dashboard/orders', icon: ShoppingCart },
111
+ { name: 'Analytics', href: '/dashboard/analytics', icon: BarChart },
112
+ { name: 'Reports', href: '/dashboard/reports', icon: FileText },
113
+ { name: 'Settings', href: '/settings', icon: Settings },
114
+ { name: 'Billing', href: '/billing', icon: CreditCard }
115
+ ]
116
+
117
+ const tourSteps = [
118
+ {
119
+ target: '[data-tour="overview"]',
120
+ title: 'Dashboard Overview',
121
+ content: 'Get a comprehensive view of your business metrics and activity.'
122
+ },
123
+ {
124
+ target: '[data-tour="stats"]',
125
+ title: 'Key Statistics',
126
+ content: 'Monitor your most important business metrics at a glance.'
127
+ },
128
+ {
129
+ target: '[data-tour="actions"]',
130
+ title: 'Quick Actions',
131
+ content: 'Access your most frequently used features and settings.'
132
+ }
133
+ ]
134
+
93
135
  return (
94
- <div className="min-h-screen bg-gray-50 dark:bg-gray-900">
95
- <div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8">
96
- {/* Header */}
97
- <div className="mb-8">
98
- <h1 className="text-3xl font-bold text-gray-900 dark:text-white">
99
- Welcome back, {user.name || user.email}!
100
- </h1>
101
- <p className="text-gray-600 dark:text-gray-300 mt-2">
102
- Here's what's happening with your account today.
103
- </p>
104
- </div>
136
+ <DashboardLayout
137
+ navigation={sidebarNavigation}
138
+ headerActions={[
139
+ <CommandPalette key="command-palette" />,
140
+ <Tour key="tour" steps={tourSteps} />
141
+ ]}
142
+ >
143
+ <div className="min-h-screen bg-gray-50 dark:bg-gray-900">
144
+ <div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8">
145
+ {/* Header */}
146
+ <div className="mb-8" data-tour="overview">
147
+ <h1 className="text-3xl font-bold text-gray-900 dark:text-white">
148
+ Welcome back, {user.name || user.email}!
149
+ </h1>
150
+ <p className="text-gray-600 dark:text-gray-300 mt-2">
151
+ Here's what's happening with your account today.
152
+ </p>
153
+ </div>
105
154
 
106
155
  {/* Stats - Streaming with Suspense */}
107
- <Suspense fallback={<UserStatsSkeleton />}>
108
- <UserStats userId={user.id} />
109
- </Suspense>
156
+ <div data-tour="stats">
157
+ <Suspense fallback={<UserStatsSkeleton />}>
158
+ <UserStats userId={user.id} />
159
+ </Suspense>
160
+ </div>
110
161
 
111
162
  {/* Quick Actions */}
112
- <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6 mb-8">
163
+ <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6 mb-8" data-tour="actions">
113
164
  <Card className="p-6">
114
165
  <div className="flex items-center mb-4">
115
166
  <User className="h-6 w-6 text-blue-600 dark:text-blue-400 mr-3" />
@@ -179,5 +230,6 @@ export default async function DashboardPage() {
179
230
  </Card>
180
231
  </div>
181
232
  </div>
233
+ </DashboardLayout>
182
234
  )
183
235
  }