@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.
- package/dist/.tsbuildinfo +1 -1
- package/dist/generators/template-generator.js +8 -8
- package/dist/generators/template-generator.js.map +1 -1
- package/dist/templates/shared/quality/web/src/__tests__/accessibility.test.tsx +3 -3
- package/dist/templates/web/ai-platform/template/src/app/page.tsx +207 -207
- package/dist/templates/web/base/template/package.json +1 -3
- package/dist/templates/web/base/template/src/app/auth/callback/route.ts +32 -18
- package/dist/templates/web/base/template/src/app/dashboard/page.tsx +6 -43
- package/dist/templates/web/base/template/src/app/globals.css +158 -157
- package/dist/templates/web/base/template/src/app/page.tsx +2 -2
- package/dist/templates/web/ui-auth/template/src/app/dev-setup/page.tsx +800 -800
- package/dist/templates/web/ui-auth/template/src/app/globals.css +96 -95
- package/dist/templates/web/ui-auth/template/src/app/login/page.tsx +109 -109
- package/dist/templates/web/ui-auth/template/src/app/page.tsx +4 -3
- package/dist/templates/web/ui-auth/template/src/app/signup/page.tsx +128 -128
- package/dist/templates/web/ui-auth-ai/template/src/app/globals.css +35 -40
- package/dist/templates/web/ui-auth-ai/template/src/app/layout.tsx +1 -0
- package/dist/templates/web/ui-auth-payments/template/src/app/checkout/page.tsx +3 -3
- package/dist/templates/web/ui-auth-payments/template/src/app/dashboard/page.tsx +10 -49
- package/dist/templates/web/ui-auth-payments/template/src/app/dev-setup/page.tsx +800 -800
- package/dist/templates/web/ui-auth-payments/template/src/app/globals.css +212 -211
- package/dist/templates/web/ui-auth-payments/template/src/app/login/page.tsx +109 -109
- package/dist/templates/web/ui-auth-payments/template/src/app/page.tsx +350 -350
- package/dist/templates/web/ui-auth-payments/template/src/app/setup/page.tsx +506 -506
- package/dist/templates/web/ui-auth-payments/template/src/app/signup/page.tsx +128 -128
- package/dist/templates/web/ui-auth-payments/template/src/components/client/login-form.tsx +143 -143
- package/dist/templates/web/ui-auth-payments/template/src/components/client/signup-form.tsx +184 -184
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/billing/page.tsx +143 -233
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/dashboard/page.tsx +10 -50
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/dev-setup/page.tsx +800 -800
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/globals.css +97 -96
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/onboarding/page.tsx +325 -364
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/page.tsx +1 -1
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/settings/page.tsx +389 -532
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/setup/page.tsx +644 -644
- package/dist/templates/web/ui-auth-payments-ai/template/src/components/client/login-form.tsx +119 -163
- package/dist/templates/web/ui-auth-payments-ai/template/src/components/client/signup-form.tsx +158 -201
- package/dist/templates/web/ui-auth-payments-ai-rag/template/package.json +1 -2
- package/dist/templates/web/ui-auth-payments-audio/template/src/app/dashboard/page.tsx +10 -51
- package/dist/templates/web/ui-auth-payments-audio/template/src/app/globals.css +97 -96
- package/dist/templates/web/ui-auth-payments-audio/template/src/app/page.tsx +402 -403
- package/dist/templates/web/ui-auth-payments-audio/template/src/components/client/login-form.tsx +143 -143
- package/dist/templates/web/ui-auth-payments-audio/template/src/components/client/signup-form.tsx +184 -184
- package/dist/templates/web/ui-auth-payments-video/template/src/app/globals.css +229 -228
- package/dist/templates/web/ui-auth-payments-video/template/src/app/login/page.tsx +1 -1
- package/dist/templates/web/ui-auth-payments-video/template/src/app/page.tsx +4 -7
- package/dist/templates/web/ui-auth-payments-video/template/src/app/signup/page.tsx +1 -1
- package/dist/templates/web/ui-only/template/src/app/globals.css +43 -42
- package/package.json +1 -1
- package/src/templates/shared/quality/web/src/__tests__/accessibility.test.tsx +3 -3
- package/src/templates/web/ai-platform/template/src/app/page.tsx +207 -207
- package/src/templates/web/base/template/package.json +1 -3
- package/src/templates/web/base/template/src/app/auth/callback/route.ts +32 -18
- package/src/templates/web/base/template/src/app/dashboard/page.tsx +6 -43
- package/src/templates/web/base/template/src/app/globals.css +158 -157
- package/src/templates/web/base/template/src/app/page.tsx +2 -2
- package/src/templates/web/ui-auth/template/src/app/dev-setup/page.tsx +800 -800
- package/src/templates/web/ui-auth/template/src/app/globals.css +96 -95
- package/src/templates/web/ui-auth/template/src/app/login/page.tsx +109 -109
- package/src/templates/web/ui-auth/template/src/app/page.tsx +4 -3
- package/src/templates/web/ui-auth/template/src/app/signup/page.tsx +128 -128
- package/src/templates/web/ui-auth-ai/template/src/app/globals.css +35 -40
- package/src/templates/web/ui-auth-ai/template/src/app/layout.tsx +1 -0
- package/src/templates/web/ui-auth-payments/template/src/app/checkout/page.tsx +3 -3
- package/src/templates/web/ui-auth-payments/template/src/app/dashboard/page.tsx +10 -49
- package/src/templates/web/ui-auth-payments/template/src/app/dev-setup/page.tsx +800 -800
- package/src/templates/web/ui-auth-payments/template/src/app/globals.css +212 -211
- package/src/templates/web/ui-auth-payments/template/src/app/login/page.tsx +109 -109
- package/src/templates/web/ui-auth-payments/template/src/app/page.tsx +350 -350
- package/src/templates/web/ui-auth-payments/template/src/app/setup/page.tsx +506 -506
- package/src/templates/web/ui-auth-payments/template/src/app/signup/page.tsx +128 -128
- package/src/templates/web/ui-auth-payments/template/src/components/client/login-form.tsx +143 -143
- package/src/templates/web/ui-auth-payments/template/src/components/client/signup-form.tsx +184 -184
- package/src/templates/web/ui-auth-payments-ai/template/src/app/billing/page.tsx +143 -233
- package/src/templates/web/ui-auth-payments-ai/template/src/app/dashboard/page.tsx +10 -50
- package/src/templates/web/ui-auth-payments-ai/template/src/app/dev-setup/page.tsx +800 -800
- package/src/templates/web/ui-auth-payments-ai/template/src/app/globals.css +97 -96
- package/src/templates/web/ui-auth-payments-ai/template/src/app/onboarding/page.tsx +325 -364
- package/src/templates/web/ui-auth-payments-ai/template/src/app/page.tsx +1 -1
- package/src/templates/web/ui-auth-payments-ai/template/src/app/settings/page.tsx +389 -532
- package/src/templates/web/ui-auth-payments-ai/template/src/app/setup/page.tsx +644 -644
- package/src/templates/web/ui-auth-payments-ai/template/src/components/client/login-form.tsx +119 -163
- package/src/templates/web/ui-auth-payments-ai/template/src/components/client/signup-form.tsx +158 -201
- package/src/templates/web/ui-auth-payments-ai-rag/template/package.json +1 -2
- package/src/templates/web/ui-auth-payments-audio/template/src/app/dashboard/page.tsx +10 -51
- package/src/templates/web/ui-auth-payments-audio/template/src/app/globals.css +97 -96
- package/src/templates/web/ui-auth-payments-audio/template/src/app/page.tsx +402 -403
- package/src/templates/web/ui-auth-payments-audio/template/src/components/client/login-form.tsx +143 -143
- package/src/templates/web/ui-auth-payments-audio/template/src/components/client/signup-form.tsx +184 -184
- package/src/templates/web/ui-auth-payments-video/template/src/app/globals.css +229 -228
- package/src/templates/web/ui-auth-payments-video/template/src/app/login/page.tsx +1 -1
- package/src/templates/web/ui-auth-payments-video/template/src/app/page.tsx +4 -7
- package/src/templates/web/ui-auth-payments-video/template/src/app/signup/page.tsx +1 -1
- package/src/templates/web/ui-only/template/src/app/globals.css +43 -42
|
@@ -1,18 +1,32 @@
|
|
|
1
|
-
import {
|
|
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
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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=
|
|
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=
|
|
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=
|
|
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
|
-
|
|
2
|
-
@
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
@
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
--
|
|
12
|
-
--
|
|
13
|
-
--card
|
|
14
|
-
--
|
|
15
|
-
--popover
|
|
16
|
-
--
|
|
17
|
-
--primary
|
|
18
|
-
--
|
|
19
|
-
--secondary
|
|
20
|
-
--
|
|
21
|
-
--muted
|
|
22
|
-
--
|
|
23
|
-
--accent
|
|
24
|
-
--
|
|
25
|
-
--destructive
|
|
26
|
-
--
|
|
27
|
-
--
|
|
28
|
-
--
|
|
29
|
-
--
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
--
|
|
35
|
-
--
|
|
36
|
-
--card
|
|
37
|
-
--
|
|
38
|
-
--popover
|
|
39
|
-
--
|
|
40
|
-
--primary
|
|
41
|
-
--
|
|
42
|
-
--secondary
|
|
43
|
-
--
|
|
44
|
-
--muted
|
|
45
|
-
--
|
|
46
|
-
--accent
|
|
47
|
-
--
|
|
48
|
-
--destructive
|
|
49
|
-
--
|
|
50
|
-
--
|
|
51
|
-
--
|
|
52
|
-
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
min-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
-
|
|
86
|
-
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
*::
|
|
101
|
-
|
|
102
|
-
animation-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
background
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
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=
|
|
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=
|
|
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">
|