@digilogiclabs/create-saas-app 2.8.0 → 2.9.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 (94) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/generators/template-generator.js +8 -8
  3. package/dist/generators/template-generator.js.map +1 -1
  4. package/dist/templates/shared/quality/web/src/__tests__/accessibility.test.tsx +3 -3
  5. package/dist/templates/web/ai-platform/template/src/app/page.tsx +207 -207
  6. package/dist/templates/web/base/template/package.json +1 -3
  7. package/dist/templates/web/base/template/src/app/auth/callback/route.ts +32 -18
  8. package/dist/templates/web/base/template/src/app/dashboard/page.tsx +6 -43
  9. package/dist/templates/web/base/template/src/app/globals.css +158 -157
  10. package/dist/templates/web/base/template/src/app/page.tsx +2 -2
  11. package/dist/templates/web/ui-auth/template/src/app/dev-setup/page.tsx +800 -800
  12. package/dist/templates/web/ui-auth/template/src/app/globals.css +96 -95
  13. package/dist/templates/web/ui-auth/template/src/app/login/page.tsx +109 -109
  14. package/dist/templates/web/ui-auth/template/src/app/page.tsx +4 -3
  15. package/dist/templates/web/ui-auth/template/src/app/signup/page.tsx +128 -128
  16. package/dist/templates/web/ui-auth-ai/template/src/app/globals.css +35 -40
  17. package/dist/templates/web/ui-auth-ai/template/src/app/layout.tsx +1 -0
  18. package/dist/templates/web/ui-auth-payments/template/src/app/checkout/page.tsx +3 -3
  19. package/dist/templates/web/ui-auth-payments/template/src/app/dashboard/page.tsx +10 -49
  20. package/dist/templates/web/ui-auth-payments/template/src/app/dev-setup/page.tsx +800 -800
  21. package/dist/templates/web/ui-auth-payments/template/src/app/globals.css +212 -211
  22. package/dist/templates/web/ui-auth-payments/template/src/app/login/page.tsx +109 -109
  23. package/dist/templates/web/ui-auth-payments/template/src/app/page.tsx +350 -350
  24. package/dist/templates/web/ui-auth-payments/template/src/app/setup/page.tsx +506 -506
  25. package/dist/templates/web/ui-auth-payments/template/src/app/signup/page.tsx +128 -128
  26. package/dist/templates/web/ui-auth-payments/template/src/components/client/login-form.tsx +143 -143
  27. package/dist/templates/web/ui-auth-payments/template/src/components/client/signup-form.tsx +184 -184
  28. package/dist/templates/web/ui-auth-payments-ai/template/src/app/billing/page.tsx +143 -233
  29. package/dist/templates/web/ui-auth-payments-ai/template/src/app/dashboard/page.tsx +10 -50
  30. package/dist/templates/web/ui-auth-payments-ai/template/src/app/dev-setup/page.tsx +800 -800
  31. package/dist/templates/web/ui-auth-payments-ai/template/src/app/globals.css +97 -96
  32. package/dist/templates/web/ui-auth-payments-ai/template/src/app/onboarding/page.tsx +325 -364
  33. package/dist/templates/web/ui-auth-payments-ai/template/src/app/page.tsx +1 -1
  34. package/dist/templates/web/ui-auth-payments-ai/template/src/app/settings/page.tsx +389 -532
  35. package/dist/templates/web/ui-auth-payments-ai/template/src/app/setup/page.tsx +644 -644
  36. package/dist/templates/web/ui-auth-payments-ai/template/src/components/client/login-form.tsx +119 -163
  37. package/dist/templates/web/ui-auth-payments-ai/template/src/components/client/signup-form.tsx +158 -201
  38. package/dist/templates/web/ui-auth-payments-ai-rag/template/package.json +1 -2
  39. package/dist/templates/web/ui-auth-payments-audio/template/src/app/dashboard/page.tsx +10 -51
  40. package/dist/templates/web/ui-auth-payments-audio/template/src/app/globals.css +97 -96
  41. package/dist/templates/web/ui-auth-payments-audio/template/src/app/page.tsx +402 -403
  42. package/dist/templates/web/ui-auth-payments-audio/template/src/components/client/login-form.tsx +143 -143
  43. package/dist/templates/web/ui-auth-payments-audio/template/src/components/client/signup-form.tsx +184 -184
  44. package/dist/templates/web/ui-auth-payments-video/template/src/app/globals.css +229 -228
  45. package/dist/templates/web/ui-auth-payments-video/template/src/app/login/page.tsx +1 -1
  46. package/dist/templates/web/ui-auth-payments-video/template/src/app/page.tsx +4 -7
  47. package/dist/templates/web/ui-auth-payments-video/template/src/app/signup/page.tsx +1 -1
  48. package/dist/templates/web/ui-only/template/src/app/globals.css +43 -42
  49. package/package.json +1 -1
  50. package/src/templates/shared/quality/web/src/__tests__/accessibility.test.tsx +3 -3
  51. package/src/templates/web/ai-platform/template/src/app/page.tsx +207 -207
  52. package/src/templates/web/base/template/package.json +1 -3
  53. package/src/templates/web/base/template/src/app/auth/callback/route.ts +32 -18
  54. package/src/templates/web/base/template/src/app/dashboard/page.tsx +6 -43
  55. package/src/templates/web/base/template/src/app/globals.css +158 -157
  56. package/src/templates/web/base/template/src/app/page.tsx +2 -2
  57. package/src/templates/web/ui-auth/template/src/app/dev-setup/page.tsx +800 -800
  58. package/src/templates/web/ui-auth/template/src/app/globals.css +96 -95
  59. package/src/templates/web/ui-auth/template/src/app/login/page.tsx +109 -109
  60. package/src/templates/web/ui-auth/template/src/app/page.tsx +4 -3
  61. package/src/templates/web/ui-auth/template/src/app/signup/page.tsx +128 -128
  62. package/src/templates/web/ui-auth-ai/template/src/app/globals.css +35 -40
  63. package/src/templates/web/ui-auth-ai/template/src/app/layout.tsx +1 -0
  64. package/src/templates/web/ui-auth-payments/template/src/app/checkout/page.tsx +3 -3
  65. package/src/templates/web/ui-auth-payments/template/src/app/dashboard/page.tsx +10 -49
  66. package/src/templates/web/ui-auth-payments/template/src/app/dev-setup/page.tsx +800 -800
  67. package/src/templates/web/ui-auth-payments/template/src/app/globals.css +212 -211
  68. package/src/templates/web/ui-auth-payments/template/src/app/login/page.tsx +109 -109
  69. package/src/templates/web/ui-auth-payments/template/src/app/page.tsx +350 -350
  70. package/src/templates/web/ui-auth-payments/template/src/app/setup/page.tsx +506 -506
  71. package/src/templates/web/ui-auth-payments/template/src/app/signup/page.tsx +128 -128
  72. package/src/templates/web/ui-auth-payments/template/src/components/client/login-form.tsx +143 -143
  73. package/src/templates/web/ui-auth-payments/template/src/components/client/signup-form.tsx +184 -184
  74. package/src/templates/web/ui-auth-payments-ai/template/src/app/billing/page.tsx +143 -233
  75. package/src/templates/web/ui-auth-payments-ai/template/src/app/dashboard/page.tsx +10 -50
  76. package/src/templates/web/ui-auth-payments-ai/template/src/app/dev-setup/page.tsx +800 -800
  77. package/src/templates/web/ui-auth-payments-ai/template/src/app/globals.css +97 -96
  78. package/src/templates/web/ui-auth-payments-ai/template/src/app/onboarding/page.tsx +325 -364
  79. package/src/templates/web/ui-auth-payments-ai/template/src/app/page.tsx +1 -1
  80. package/src/templates/web/ui-auth-payments-ai/template/src/app/settings/page.tsx +389 -532
  81. package/src/templates/web/ui-auth-payments-ai/template/src/app/setup/page.tsx +644 -644
  82. package/src/templates/web/ui-auth-payments-ai/template/src/components/client/login-form.tsx +119 -163
  83. package/src/templates/web/ui-auth-payments-ai/template/src/components/client/signup-form.tsx +158 -201
  84. package/src/templates/web/ui-auth-payments-ai-rag/template/package.json +1 -2
  85. package/src/templates/web/ui-auth-payments-audio/template/src/app/dashboard/page.tsx +10 -51
  86. package/src/templates/web/ui-auth-payments-audio/template/src/app/globals.css +97 -96
  87. package/src/templates/web/ui-auth-payments-audio/template/src/app/page.tsx +402 -403
  88. package/src/templates/web/ui-auth-payments-audio/template/src/components/client/login-form.tsx +143 -143
  89. package/src/templates/web/ui-auth-payments-audio/template/src/components/client/signup-form.tsx +184 -184
  90. package/src/templates/web/ui-auth-payments-video/template/src/app/globals.css +229 -228
  91. package/src/templates/web/ui-auth-payments-video/template/src/app/login/page.tsx +1 -1
  92. package/src/templates/web/ui-auth-payments-video/template/src/app/page.tsx +4 -7
  93. package/src/templates/web/ui-auth-payments-video/template/src/app/signup/page.tsx +1 -1
  94. package/src/templates/web/ui-only/template/src/app/globals.css +43 -42
@@ -1,18 +1,32 @@
1
- import { createRouteHandlerClient } from '@supabase/auth-helpers-nextjs';
2
- import { cookies } from 'next/headers';
3
- import { NextResponse } from 'next/server';
4
-
5
- import type { NextRequest } from 'next/server';
6
-
7
- export async function GET(request: NextRequest) {
8
- const requestUrl = new URL(request.url);
9
- const code = requestUrl.searchParams.get('code');
10
-
11
- if (code) {
12
- const supabase = createRouteHandlerClient({ cookies });
13
- await supabase.auth.exchangeCodeForSession(code);
14
- }
15
-
16
- // URL to redirect to after sign in process completes
17
- return NextResponse.redirect(requestUrl.origin);
18
- }
1
+ import { createServerClient } from '@supabase/ssr';
2
+ import { cookies } from 'next/headers';
3
+ import { NextResponse } from 'next/server';
4
+
5
+ import type { NextRequest } from 'next/server';
6
+
7
+ export async function GET(request: NextRequest) {
8
+ const requestUrl = new URL(request.url);
9
+ const code = requestUrl.searchParams.get('code');
10
+
11
+ if (code) {
12
+ const cookieStore = await cookies();
13
+ const supabase = createServerClient(
14
+ process.env.NEXT_PUBLIC_SUPABASE_URL!,
15
+ process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
16
+ {
17
+ cookies: {
18
+ getAll: () => cookieStore.getAll(),
19
+ setAll: (cookiesToSet) => {
20
+ cookiesToSet.forEach(({ name, value, options }) =>
21
+ cookieStore.set(name, value, options)
22
+ );
23
+ },
24
+ },
25
+ }
26
+ );
27
+ await supabase.auth.exchangeCodeForSession(code);
28
+ }
29
+
30
+ // URL to redirect to after sign in process completes
31
+ return NextResponse.redirect(requestUrl.origin);
32
+ }
@@ -16,9 +16,7 @@ import {
16
16
  OfflineWrapper,
17
17
  useNetworkInfo,
18
18
  useOfflineState,
19
- DashboardLayout,
20
- CommandPalette,
21
- Tour
19
+ DashboardLayout
22
20
  } from '@digilogiclabs/saas-factory-ui';
23
21
  import {
24
22
  BarChart3,
@@ -30,10 +28,7 @@ import {
30
28
  Star,
31
29
  Trash2,
32
30
  Wifi,
33
- WifiOff,
34
- Home,
35
- FileText,
36
- Activity
31
+ WifiOff
37
32
  } from 'lucide-react';
38
33
 
39
34
  // Mock data for demonstration
@@ -49,32 +44,6 @@ const mockActivityData = Array.from({ length: 50 }, (_, i) => ({
49
44
  export default function DashboardPage() {
50
45
  const { user } = useAuth();
51
46
 
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
-
78
47
  const lazyImageConfig = {
79
48
  mobileOptimization: {
80
49
  quality: 80,
@@ -148,13 +117,7 @@ export default function DashboardPage() {
148
117
 
149
118
 
150
119
  return (
151
- <DashboardLayout
152
- navigation={sidebarNavigation}
153
- headerActions={[
154
- <CommandPalette key="command-palette" />,
155
- <Tour key="tour" steps={tourSteps} />
156
- ]}
157
- >
120
+ <DashboardLayout>
158
121
  <PageTransition type="slide" direction="horizontal" duration={300}>
159
122
  <OfflineWrapper
160
123
  cacheStrategy="stale-while-revalidate"
@@ -206,7 +169,7 @@ export default function DashboardPage() {
206
169
  <div data-tour="stats">
207
170
  <NetworkAwareContent
208
171
  showOnSlow={
209
- <ResponsiveGrid columns={gridConfig.columns_2_2} gap="sm" className="mb-6">
172
+ <ResponsiveGrid columns={gridConfig.columns_2_2} gap={2} className="mb-6">
210
173
  {stats.slice(0, 2).map((stat, index) => (
211
174
  <Card key={index}>
212
175
  <CardContent className="p-4">
@@ -223,7 +186,7 @@ export default function DashboardPage() {
223
186
  </ResponsiveGrid>
224
187
  }
225
188
  >
226
- <ResponsiveGrid columns={gridConfig.columns_2_md4} gap="md" className="mb-6">
189
+ <ResponsiveGrid columns={gridConfig.columns_2_md4} gap={4} className="mb-6">
227
190
  {stats.map((stat, index) => (
228
191
  <Card key={index}>
229
192
  <CardContent className="p-4">
@@ -340,7 +303,7 @@ export default function DashboardPage() {
340
303
  </CardDescription>
341
304
  </CardHeader>
342
305
  <CardContent>
343
- <ResponsiveGrid columns={gridConfig.columns_2_md3} gap="sm">
306
+ <ResponsiveGrid columns={gridConfig.columns_2_md3} gap={2}>
344
307
  <Button variant="outline" className="h-20 flex flex-col gap-2">
345
308
  <Users className="h-5 w-5" />
346
309
  <span className="text-xs">Manage Users</span>
@@ -1,157 +1,158 @@
1
- @tailwind base;
2
- @tailwind components;
3
- @tailwind utilities;
4
-
5
- /* Import SaaS Factory UI styles */
6
- @import '@digilogiclabs/saas-factory-ui/styles.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
- --popover: 0 0% 100%;
15
- --popover-foreground: 222.2 84% 4.9%;
16
- --primary: 221.2 83.2% 53.3%;
17
- --primary-foreground: 210 40% 98%;
18
- --secondary: 210 40% 96%;
19
- --secondary-foreground: 222.2 84% 4.9%;
20
- --muted: 210 40% 96%;
21
- --muted-foreground: 215.4 16.3% 46.9%;
22
- --accent: 210 40% 96%;
23
- --accent-foreground: 222.2 84% 4.9%;
24
- --destructive: 0 84.2% 60.2%;
25
- --destructive-foreground: 210 40% 98%;
26
- --border: 214.3 31.8% 91.4%;
27
- --input: 214.3 31.8% 91.4%;
28
- --ring: 221.2 83.2% 53.3%;
29
- --radius: 0.5rem;
30
- }
31
-
32
- .dark {
33
- --background: 222.2 84% 4.9%;
34
- --foreground: 210 40% 98%;
35
- --card: 222.2 84% 4.9%;
36
- --card-foreground: 210 40% 98%;
37
- --popover: 222.2 84% 4.9%;
38
- --popover-foreground: 210 40% 98%;
39
- --primary: 217.2 91.2% 59.8%;
40
- --primary-foreground: 222.2 84% 4.9%;
41
- --secondary: 217.2 32.6% 17.5%;
42
- --secondary-foreground: 210 40% 98%;
43
- --muted: 217.2 32.6% 17.5%;
44
- --muted-foreground: 215 20.2% 65.1%;
45
- --accent: 217.2 32.6% 17.5%;
46
- --accent-foreground: 210 40% 98%;
47
- --destructive: 0 62.8% 30.6%;
48
- --destructive-foreground: 210 40% 98%;
49
- --border: 217.2 32.6% 17.5%;
50
- --input: 217.2 32.6% 17.5%;
51
- --ring: 224.3 76.3% 94.1%;
52
- }
53
- }
54
-
55
- @layer base {
56
- * {
57
- @apply border-border;
58
- }
59
-
60
- body {
61
- @apply bg-background text-foreground;
62
- }
63
- }
64
-
65
- /* Mobile-first optimizations */
66
- @media (max-width: 768px) {
67
- .mobile-optimized {
68
- touch-action: manipulation;
69
- -webkit-tap-highlight-color: transparent;
70
- }
71
-
72
- /* Better touch targets */
73
- button,
74
- a,
75
- input,
76
- select,
77
- textarea {
78
- min-height: 44px;
79
- min-width: 44px;
80
- }
81
-
82
- /* Smooth scrolling for mobile */
83
- html {
84
- scroll-behavior: smooth;
85
- -webkit-overflow-scrolling: touch;
86
- }
87
- }
88
-
89
- /* Network-aware styles */
90
- @media (prefers-reduced-data: reduce) {
91
- .high-bandwidth-content {
92
- display: none;
93
- }
94
- }
95
-
96
- /* Reduced motion preferences */
97
- @media (prefers-reduced-motion: reduce) {
98
- *,
99
- *::before,
100
- *::after {
101
- animation-duration: 0.01ms !important;
102
- animation-iteration-count: 1 !important;
103
- transition-duration: 0.01ms !important;
104
- }
105
- }
106
-
107
- /* Custom animations for mobile interactions */
108
- @keyframes haptic-feedback {
109
- 0% { transform: scale(1); }
110
- 50% { transform: scale(0.95); }
111
- 100% { transform: scale(1); }
112
- }
113
-
114
- .haptic-feedback {
115
- animation: haptic-feedback 0.1s ease-in-out;
116
- }
117
-
118
- /* Offline indicator styles */
119
- .offline-indicator {
120
- position: fixed;
121
- top: 0;
122
- left: 0;
123
- right: 0;
124
- background: #f59e0b;
125
- color: white;
126
- text-align: center;
127
- padding: 8px;
128
- font-size: 14px;
129
- z-index: 9999;
130
- }
131
-
132
- /* Loading states */
133
- .loading-skeleton {
134
- background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%);
135
- background-size: 200% 100%;
136
- animation: loading 1.5s infinite;
137
- }
138
-
139
- @keyframes loading {
140
- 0% {
141
- background-position: 200% 0;
142
- }
143
- 100% {
144
- background-position: -200% 0;
145
- }
146
- }
147
-
148
- /* Progressive image loading */
149
- .progressive-image {
150
- filter: blur(5px);
151
- transition: filter 0.3s;
152
- }
153
-
154
- .progressive-image.loaded {
155
- filter: blur(0);
156
- }
157
-
1
+ /* Import SaaS Factory UI styles */
2
+ @import '@digilogiclabs/saas-factory-ui/styles.css';
3
+
4
+ @tailwind base;
5
+ @tailwind components;
6
+ @tailwind utilities;
7
+
8
+
9
+ @layer base {
10
+ :root {
11
+ --background: 0 0% 100%;
12
+ --foreground: 222.2 84% 4.9%;
13
+ --card: 0 0% 100%;
14
+ --card-foreground: 222.2 84% 4.9%;
15
+ --popover: 0 0% 100%;
16
+ --popover-foreground: 222.2 84% 4.9%;
17
+ --primary: 221.2 83.2% 53.3%;
18
+ --primary-foreground: 210 40% 98%;
19
+ --secondary: 210 40% 96%;
20
+ --secondary-foreground: 222.2 84% 4.9%;
21
+ --muted: 210 40% 96%;
22
+ --muted-foreground: 215.4 16.3% 46.9%;
23
+ --accent: 210 40% 96%;
24
+ --accent-foreground: 222.2 84% 4.9%;
25
+ --destructive: 0 84.2% 60.2%;
26
+ --destructive-foreground: 210 40% 98%;
27
+ --border: 214.3 31.8% 91.4%;
28
+ --input: 214.3 31.8% 91.4%;
29
+ --ring: 221.2 83.2% 53.3%;
30
+ --radius: 0.5rem;
31
+ }
32
+
33
+ .dark {
34
+ --background: 222.2 84% 4.9%;
35
+ --foreground: 210 40% 98%;
36
+ --card: 222.2 84% 4.9%;
37
+ --card-foreground: 210 40% 98%;
38
+ --popover: 222.2 84% 4.9%;
39
+ --popover-foreground: 210 40% 98%;
40
+ --primary: 217.2 91.2% 59.8%;
41
+ --primary-foreground: 222.2 84% 4.9%;
42
+ --secondary: 217.2 32.6% 17.5%;
43
+ --secondary-foreground: 210 40% 98%;
44
+ --muted: 217.2 32.6% 17.5%;
45
+ --muted-foreground: 215 20.2% 65.1%;
46
+ --accent: 217.2 32.6% 17.5%;
47
+ --accent-foreground: 210 40% 98%;
48
+ --destructive: 0 62.8% 30.6%;
49
+ --destructive-foreground: 210 40% 98%;
50
+ --border: 217.2 32.6% 17.5%;
51
+ --input: 217.2 32.6% 17.5%;
52
+ --ring: 224.3 76.3% 94.1%;
53
+ }
54
+ }
55
+
56
+ @layer base {
57
+ * {
58
+ @apply border-border;
59
+ }
60
+
61
+ body {
62
+ @apply bg-background text-foreground;
63
+ }
64
+ }
65
+
66
+ /* Mobile-first optimizations */
67
+ @media (max-width: 768px) {
68
+ .mobile-optimized {
69
+ touch-action: manipulation;
70
+ -webkit-tap-highlight-color: transparent;
71
+ }
72
+
73
+ /* Better touch targets */
74
+ button,
75
+ a,
76
+ input,
77
+ select,
78
+ textarea {
79
+ min-height: 44px;
80
+ min-width: 44px;
81
+ }
82
+
83
+ /* Smooth scrolling for mobile */
84
+ html {
85
+ scroll-behavior: smooth;
86
+ -webkit-overflow-scrolling: touch;
87
+ }
88
+ }
89
+
90
+ /* Network-aware styles */
91
+ @media (prefers-reduced-data: reduce) {
92
+ .high-bandwidth-content {
93
+ display: none;
94
+ }
95
+ }
96
+
97
+ /* Reduced motion preferences */
98
+ @media (prefers-reduced-motion: reduce) {
99
+ *,
100
+ *::before,
101
+ *::after {
102
+ animation-duration: 0.01ms !important;
103
+ animation-iteration-count: 1 !important;
104
+ transition-duration: 0.01ms !important;
105
+ }
106
+ }
107
+
108
+ /* Custom animations for mobile interactions */
109
+ @keyframes haptic-feedback {
110
+ 0% { transform: scale(1); }
111
+ 50% { transform: scale(0.95); }
112
+ 100% { transform: scale(1); }
113
+ }
114
+
115
+ .haptic-feedback {
116
+ animation: haptic-feedback 0.1s ease-in-out;
117
+ }
118
+
119
+ /* Offline indicator styles */
120
+ .offline-indicator {
121
+ position: fixed;
122
+ top: 0;
123
+ left: 0;
124
+ right: 0;
125
+ background: #f59e0b;
126
+ color: white;
127
+ text-align: center;
128
+ padding: 8px;
129
+ font-size: 14px;
130
+ z-index: 9999;
131
+ }
132
+
133
+ /* Loading states */
134
+ .loading-skeleton {
135
+ background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%);
136
+ background-size: 200% 100%;
137
+ animation: loading 1.5s infinite;
138
+ }
139
+
140
+ @keyframes loading {
141
+ 0% {
142
+ background-position: 200% 0;
143
+ }
144
+ 100% {
145
+ background-position: -200% 0;
146
+ }
147
+ }
148
+
149
+ /* Progressive image loading */
150
+ .progressive-image {
151
+ filter: blur(5px);
152
+ transition: filter 0.3s;
153
+ }
154
+
155
+ .progressive-image.loaded {
156
+ filter: blur(0);
157
+ }
158
+
@@ -92,7 +92,7 @@ export default function Home() {
92
92
  {/* Features Grid */}
93
93
  <NetworkAwareContent
94
94
  showOnSlow={
95
- <ResponsiveGrid columns={gridConfig.columns_1_2} gap="md" className="mb-16">
95
+ <ResponsiveGrid columns={gridConfig.columns_1_2} gap={4} className="mb-16">
96
96
  <Card className="text-center">
97
97
  <CardHeader>
98
98
  <div className="mx-auto w-12 h-12 bg-blue-100 dark:bg-blue-900 rounded-lg flex items-center justify-center mb-4">
@@ -118,7 +118,7 @@ export default function Home() {
118
118
  </ResponsiveGrid>
119
119
  }
120
120
  >
121
- <ResponsiveGrid columns={gridConfig.columns_1_3} gap="lg" className="mb-16">
121
+ <ResponsiveGrid columns={gridConfig.columns_1_3} gap={6} className="mb-16">
122
122
  <Card className="text-center">
123
123
  <CardHeader>
124
124
  <div className="mx-auto w-12 h-12 bg-blue-100 dark:bg-blue-900 rounded-lg flex items-center justify-center mb-4">