@devvistatech/devvista-kit 0.0.12 → 0.0.13
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/README.md +40 -0
- package/app/ClientLayout.tsx +66 -0
- package/app/about/page.tsx +11 -248
- package/app/adRequest/page.tsx +101 -25
- package/app/admin-profile/page.tsx +123 -0
- package/app/analytics/page.tsx +41 -5
- package/app/api/about/route.ts +2 -18
- package/app/api/adRequest/route.ts +7 -27
- package/app/api/analytics/[reportType]/route.ts +1 -64
- package/app/api/bio/route.ts +1 -17
- package/app/api/blog/route.ts +1 -19
- package/app/api/contacts/route.ts +1 -46
- package/app/api/files/route.ts +1 -15
- package/app/api/gallery-data/route.ts +53 -61
- package/app/api/schedule/route.ts +5 -21
- package/app/api/signup/route.ts +129 -0
- package/app/api/sync-user/route.ts +268 -94
- package/app/api/verify-admin/route.ts +46 -0
- package/app/blog/[id]/page.tsx +71 -52
- package/app/blog/page.tsx +43 -10
- package/app/favicon.ico +0 -0
- package/app/gallery/page.tsx +27 -6
- package/app/layout.tsx +31 -82
- package/app/page.tsx +20 -311
- package/app/products/constants/product.ts +27 -0
- package/app/products/page.tsx +296 -0
- package/app/products/productOne/page.tsx +266 -0
- package/app/products/productTwo/page.tsx +272 -0
- package/app/schedule/page.tsx +78 -40
- package/bin/init.js +0 -12
- package/components/addOns/functional/ClassList.tsx +21 -17
- package/components/addOns/functional/ProductList.tsx +1027 -0
- package/components/addOns/functional/aboutSections/AboutSection.tsx +107 -70
- package/components/addOns/functional/aboutSections/constants/aboutSection.ts +9 -4
- package/components/addOns/functional/banner/Banner.tsx +150 -0
- package/components/addOns/functional/banner/BannerDashboard.tsx +283 -0
- package/components/addOns/functional/bioSections/BioEditor.tsx +471 -0
- package/components/addOns/functional/bioSections/constants/bioEditor.ts +36 -0
- package/components/addOns/functional/blogSections/BlogDashboard.tsx +1 -1
- package/components/addOns/functional/blogSections/BlogFormPopUp.tsx +2 -1
- package/components/addOns/functional/{ImageDescCarousel.tsx → carousels/ImageDescCarousel.tsx} +166 -57
- package/components/addOns/functional/carousels/ProductDescCarousel.tsx +1129 -0
- package/components/addOns/functional/{ScheduleCarousel.tsx → carousels/ScheduleCarousel.tsx} +110 -50
- package/components/addOns/functional/carousels/constants.ts/productDescCarousel.ts +197 -0
- package/components/addOns/functional/carousels/constants.ts/scheduleCarousel.ts +20 -0
- package/components/addOns/functional/contactsDashboard/ContactsDashboard.tsx +1 -1
- package/components/addOns/functional/fileUploaders/FileUploader.tsx +437 -0
- package/components/addOns/functional/fileUploaders/constants/fileUploader.ts +45 -0
- package/components/addOns/functional/galleries/GalleryComplex.tsx +468 -267
- package/components/addOns/functional/galleries/GallerySimple.tsx +78 -50
- package/components/addOns/functional/galleries/ThreeSetGallery.tsx +260 -0
- package/components/addOns/functional/schedules/ScheduleGridOne.tsx +22 -8
- package/components/addOns/functional/schedules/ScheduleGridTwo.tsx +12 -7
- package/components/addOns/functional/schedules/ScheduleGridTwoBasic.tsx +12 -7
- package/components/addOns/non-functional/SampleCarousel.tsx +3 -3
- package/components/addOns/non-functional/ThreeSetGallery.tsx +3 -3
- package/components/addOns/non-functional/featureSections/FeaturesSection.tsx +74 -0
- package/components/addOns/non-functional/featureSections/constants/featuresSection.ts +30 -0
- package/components/addOns/non-functional/{Heros/HeroSection.tsx → heros/HomeHero.tsx} +17 -15
- package/components/addOns/non-functional/heros/ProductHero.tsx +111 -0
- package/components/addOns/non-functional/heros/constants/hero.ts +62 -0
- package/components/addOns/non-functional/imageCarousels/ProductSlider.tsx +6 -6
- package/components/addOns/non-functional/imageCarousels/ProgramCarousel.tsx +10 -10
- package/components/footers/footer.tsx +161 -198
- package/components/other/admin-menu.tsx +1 -1
- package/lib/auth/auth-context.tsx +225 -0
- package/lib/auth/auth-utils.tsx +30 -0
- package/lib/constants/adRequest.ts +199 -56
- package/lib/constants/admin-profile.ts +12 -0
- package/lib/constants/page.ts +15 -15
- package/lib/google/google-analytics-tracking.tsx +44 -0
- package/lib/types.ts +235 -0
- package/lib/utils/compressImage.tsx +32 -0
- package/middleware.ts +9 -5
- package/next.config.js +1 -1
- package/package.json +3 -2
- package/public/images/test.png +0 -0
- package/components/addOns/functional/BioEditor.tsx +0 -447
- package/components/addOns/functional/FileUploader.tsx +0 -295
- package/components/addOns/non-functional/FeaturesSection.tsx +0 -63
- package/components/types.ts +0 -50
- package/lib/auth-context.tsx +0 -131
- package/lib/verify-user.ts +0 -118
- /package/lib/{google-analytics.tsx → google/google-analytics.tsx} +0 -0
|
@@ -2,23 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
import Link from "next/link";
|
|
4
4
|
import Image from "next/image";
|
|
5
|
-
import { Mail, Phone, MapPin, Facebook,
|
|
6
|
-
import { useState, useEffect } from "react";
|
|
7
|
-
import { SignIn, SignUp, SignedIn, SignedOut, SignOutButton as ClerkSignOutButton, useAuth } from "@clerk/nextjs";
|
|
8
|
-
import { useStrapiAuth } from "@/lib/auth-context";
|
|
5
|
+
import { Mail, Phone, MapPin, Facebook, X, Linkedin } from "lucide-react";
|
|
6
|
+
import { useState, useEffect, useRef } from "react";
|
|
7
|
+
import { SignIn, SignUp, SignedIn, SignedOut, SignOutButton as ClerkSignOutButton, useAuth, useSignUp } from "@clerk/nextjs";
|
|
8
|
+
import { useStrapiAuth } from "@/lib/auth/auth-context";
|
|
9
9
|
import { motion, AnimatePresence } from "framer-motion";
|
|
10
10
|
import AdminMenu from "../other/admin-menu";
|
|
11
11
|
import { SignInButton, SignUpButton, SignOutButton, SettingsButton } from "../other/button";
|
|
12
12
|
|
|
13
|
-
interface StrapiUser {
|
|
14
|
-
id: number;
|
|
15
|
-
authId: string;
|
|
16
|
-
email: string;
|
|
17
|
-
username: string;
|
|
18
|
-
businessAdminId?: string;
|
|
19
|
-
userRole?: string;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
13
|
const baseLinks = [
|
|
23
14
|
{ href: "/", label: "Home" },
|
|
24
15
|
{ href: "/about", label: "About" },
|
|
@@ -30,17 +21,19 @@ const baseLinks = [
|
|
|
30
21
|
|
|
31
22
|
export default function Footer() {
|
|
32
23
|
const { isSignedIn } = useAuth();
|
|
33
|
-
const { user, authLoading,
|
|
24
|
+
const { user, authLoading, error, handlePostSignUp } = useStrapiAuth();
|
|
25
|
+
const { signUp, isLoaded: isSignUpLoaded } = useSignUp();
|
|
34
26
|
const [isLoginOpen, setIsLoginOpen] = useState(false);
|
|
35
27
|
const [isSignupOpen, setIsSignupOpen] = useState(false);
|
|
36
28
|
const [isAdminMenuOpen, setIsAdminMenuOpen] = useState(false);
|
|
37
|
-
const
|
|
29
|
+
const hasSignedUp = useRef(false);
|
|
38
30
|
|
|
39
31
|
useEffect(() => {
|
|
40
32
|
if (isSignedIn) {
|
|
41
33
|
setIsLoginOpen(false);
|
|
42
34
|
setIsSignupOpen(false);
|
|
43
35
|
setIsAdminMenuOpen(false);
|
|
36
|
+
hasSignedUp.current = false;
|
|
44
37
|
}
|
|
45
38
|
}, [isSignedIn]);
|
|
46
39
|
|
|
@@ -49,6 +42,7 @@ export default function Footer() {
|
|
|
49
42
|
document.body.style.overflow = "hidden";
|
|
50
43
|
} else {
|
|
51
44
|
document.body.style.overflow = "auto";
|
|
45
|
+
hasSignedUp.current = false;
|
|
52
46
|
}
|
|
53
47
|
return () => {
|
|
54
48
|
document.body.style.overflow = "auto";
|
|
@@ -63,51 +57,59 @@ export default function Footer() {
|
|
|
63
57
|
}, [isLoginOpen, isSignupOpen, isAdminMenuOpen]);
|
|
64
58
|
|
|
65
59
|
useEffect(() => {
|
|
66
|
-
if (
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
60
|
+
if (
|
|
61
|
+
isSignUpLoaded &&
|
|
62
|
+
signUp?.status === "complete" &&
|
|
63
|
+
signUp?.createdUserId &&
|
|
64
|
+
signUp?.emailAddress &&
|
|
65
|
+
!hasSignedUp.current
|
|
66
|
+
) {
|
|
67
|
+
hasSignedUp.current = true;
|
|
68
|
+
|
|
69
|
+
handlePostSignUp(
|
|
70
|
+
signUp.createdUserId,
|
|
71
|
+
signUp.emailAddress,
|
|
72
|
+
signUp.username || `user_${signUp.createdUserId.slice(0, 8)}`
|
|
73
|
+
)
|
|
74
|
+
.then(() => {
|
|
75
|
+
|
|
76
|
+
setIsSignupOpen(false);
|
|
77
|
+
})
|
|
78
|
+
.catch((error) => {
|
|
79
|
+
console.error("handlePostSignUp failed:", error, {
|
|
80
|
+
timestamp: new Date().toISOString(),
|
|
81
|
+
});
|
|
71
82
|
});
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
83
|
+
} else if (isSignUpLoaded) {
|
|
84
|
+
console.warn("SignUp conditions not met:", {
|
|
85
|
+
isSignUpLoaded,
|
|
86
|
+
status: signUp?.status,
|
|
87
|
+
createdUserId: signUp?.createdUserId,
|
|
88
|
+
email: signUp?.emailAddress,
|
|
89
|
+
timestamp: new Date().toISOString(),
|
|
90
|
+
});
|
|
75
91
|
}
|
|
76
|
-
}, [
|
|
92
|
+
}, [isSignUpLoaded, signUp, handlePostSignUp]);
|
|
77
93
|
|
|
78
94
|
const isAdmin = isSignedIn && !!user?.businessAdminId && user?.userRole === "admin";
|
|
79
95
|
|
|
80
|
-
if (authLoading) {
|
|
81
|
-
return <div>Loading...</div>;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
if (error) {
|
|
85
|
-
return <div className="text-red-500">Error: {error}</div>;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
96
|
return (
|
|
89
|
-
<footer className="w-full bg-
|
|
97
|
+
<footer className="w-full bg-gray-600 text-gray-300 border-t border-gray-700">
|
|
90
98
|
<style jsx>{`
|
|
91
|
-
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700;800&display=swap');
|
|
92
|
-
|
|
93
99
|
:root {
|
|
94
|
-
--
|
|
95
|
-
--
|
|
96
|
-
--
|
|
97
|
-
--
|
|
98
|
-
--blue-700: #1D4ED8;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
* {
|
|
102
|
-
font-family: 'Inter', sans-serif;
|
|
100
|
+
--jubilee: #F47C7C;
|
|
101
|
+
--exuberant-blue: #FF69B4;
|
|
102
|
+
--modern-purple: #D946EF;
|
|
103
|
+
--brown-accent: #8B4513;
|
|
103
104
|
}
|
|
104
105
|
|
|
105
106
|
.glassmorphism {
|
|
106
107
|
background: rgba(255, 255, 255, 0.08);
|
|
107
108
|
backdrop-filter: blur(10px);
|
|
108
109
|
-webkit-backdrop-filter: blur(10px);
|
|
109
|
-
border:
|
|
110
|
-
|
|
110
|
+
border: 2px solid transparent;
|
|
111
|
+
border-image: linear-gradient(45deg, var(--exuberant-blue), var(--jubilee), var(--modern-purple)) 1;
|
|
112
|
+
box-shadow: 0 16px 48px rgba(0, 0, 0, 0.1);
|
|
111
113
|
}
|
|
112
114
|
|
|
113
115
|
.modal-glassmorphism {
|
|
@@ -115,139 +117,65 @@ export default function Footer() {
|
|
|
115
117
|
backdrop-filter: blur(10px);
|
|
116
118
|
-webkit-backdrop-filter: blur(10px);
|
|
117
119
|
border: 2px solid transparent;
|
|
118
|
-
border-image: linear-gradient(45deg, var(--blue
|
|
120
|
+
border-image: linear-gradient(45deg, var(--exuberant-blue), var(--jubilee), var(--modern-purple)) 1;
|
|
119
121
|
box-shadow: 0 16px 48px rgba(0, 0, 0, 0.1);
|
|
120
122
|
border-radius: 2rem;
|
|
121
|
-
|
|
122
|
-
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
@supports not (backdrop-filter: blur(10px)) {
|
|
126
|
+
.glassmorphism,
|
|
127
|
+
.modal-glassmorphism {
|
|
128
|
+
background: rgba(255, 255, 255, 0.2);
|
|
129
|
+
}
|
|
123
130
|
}
|
|
124
131
|
|
|
125
132
|
.gradient-text {
|
|
126
|
-
background: linear-gradient(
|
|
133
|
+
background: linear-gradient(45deg, var(--exuberant-blue), var(--jubilee), var(--modern-purple));
|
|
127
134
|
-webkit-background-clip: text;
|
|
128
135
|
background-clip: text;
|
|
129
136
|
color: transparent;
|
|
130
137
|
}
|
|
131
138
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
justify-content: center;
|
|
136
|
-
padding: 0.75rem;
|
|
137
|
-
border-radius: 0.5rem;
|
|
138
|
-
background: rgba(255, 255, 255, 0.1);
|
|
139
|
-
transition: color 0.2s ease, transform 0.2s ease;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
.contact-icon:hover {
|
|
143
|
-
color: var(--blue-500);
|
|
144
|
-
transform: scale(1.1);
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
.cl-signIn-root,
|
|
148
|
-
.cl-signUp-root {
|
|
149
|
-
background: rgba(17, 24, 39, 0.95);
|
|
150
|
-
border: 1px solid #374151;
|
|
151
|
-
border-radius: 0.5rem;
|
|
152
|
-
color: white;
|
|
153
|
-
font-family: 'Inter', sans-serif;
|
|
154
|
-
max-height: 80vh;
|
|
155
|
-
overflow-y: auto;
|
|
156
|
-
max-width: 90vw;
|
|
157
|
-
box-sizing: border-box;
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
.cl-button {
|
|
161
|
-
background: var(--blue-500);
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
.cl-button:hover {
|
|
165
|
-
background: var(--blue-600);
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
.admin-menu-container {
|
|
169
|
-
position: relative;
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
@media (max-width: 640px) {
|
|
173
|
-
.cl-signIn-root,
|
|
174
|
-
.cl-signUp-root {
|
|
175
|
-
max-width: 95vw;
|
|
176
|
-
max-height: 80vh;
|
|
177
|
-
overflow-y: auto;
|
|
178
|
-
padding: 0.5rem;
|
|
139
|
+
@media (max-width: 768px) {
|
|
140
|
+
.mobile-contact {
|
|
141
|
+
display: flex;
|
|
179
142
|
}
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
.cl-signUp-root .cl-main {
|
|
183
|
-
font-size: 0.9rem;
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
.cl-signIn-root .cl-headerTitle,
|
|
187
|
-
.cl-signUp-root .cl-headerTitle {
|
|
188
|
-
font-size: 1.25rem;
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
.cl-signIn-root .cl-formFieldInput,
|
|
192
|
-
.cl-signUp-root .cl-formFieldInput {
|
|
193
|
-
padding: 0.5rem;
|
|
194
|
-
font-size: 0.9rem;
|
|
195
|
-
background: #1f2937;
|
|
196
|
-
color: #ffffff;
|
|
197
|
-
border: 1px solid #4b5563;
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
.cl-button {
|
|
201
|
-
padding: 0.5rem;
|
|
202
|
-
font-size: 0.9rem;
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
.modal-glassmorphism {
|
|
206
|
-
backdrop-filter: none;
|
|
207
|
-
background: rgba(255, 255, 255, 0.2);
|
|
208
|
-
padding: 1rem;
|
|
209
|
-
max-height: 85vh;
|
|
143
|
+
.desktop-contact {
|
|
144
|
+
display: none;
|
|
210
145
|
}
|
|
211
146
|
}
|
|
212
147
|
|
|
213
|
-
@
|
|
214
|
-
.
|
|
215
|
-
|
|
216
|
-
|
|
148
|
+
@media (min-width: 769px) {
|
|
149
|
+
.mobile-contact {
|
|
150
|
+
display: none;
|
|
151
|
+
}
|
|
152
|
+
.desktop-contact {
|
|
153
|
+
display: flex;
|
|
217
154
|
}
|
|
218
155
|
}
|
|
219
156
|
`}</style>
|
|
220
157
|
|
|
221
|
-
<div className="w-full px-4 sm:px-6 lg:px-
|
|
222
|
-
<div className="grid grid-cols-1
|
|
223
|
-
<div className="flex flex-col items-center
|
|
158
|
+
<div className="w-full px-4 sm:px-6 lg:px-24 py-12 sm:py-16 glassmorphism">
|
|
159
|
+
<div className="grid grid-cols-1 lg:grid-cols-3 gap-8 sm:gap-12">
|
|
160
|
+
<div className="flex flex-col items-center lg:items-start">
|
|
224
161
|
<Link href="/" className="flex items-center space-x-4 mb-6">
|
|
225
162
|
<Image
|
|
226
163
|
src="/images/test.png"
|
|
227
164
|
alt="DevVista Kit Logo"
|
|
228
165
|
width={64}
|
|
229
166
|
height={64}
|
|
230
|
-
className="h-20 w-
|
|
167
|
+
className="h-20 w-60 transition-transform duration-300 ease-in-out transform hover:scale-105"
|
|
231
168
|
quality={80}
|
|
232
169
|
loading="lazy"
|
|
233
170
|
/>
|
|
234
|
-
<div>
|
|
235
|
-
<span className="text-lg sm:text-xl 2xl:text-2xl font-extrabold text-blue-500 uppercase tracking-tight">
|
|
236
|
-
DevVista's
|
|
237
|
-
</span>
|
|
238
|
-
<br />
|
|
239
|
-
<span className="text-2xl sm:text-3xl 2xl:text-4xl font-extrabold text-blue-500 uppercase tracking-tight">
|
|
240
|
-
Kit
|
|
241
|
-
</span>
|
|
242
|
-
</div>
|
|
243
171
|
</Link>
|
|
244
|
-
<p className="text-sm sm:text-base
|
|
245
|
-
|
|
172
|
+
<p className="text-sm sm:text-base lg:text-lg text-gray-300 text-center lg:text-left font-medium">
|
|
173
|
+
The Official DevVista Kit
|
|
246
174
|
</p>
|
|
247
175
|
</div>
|
|
248
176
|
|
|
249
177
|
<div className="flex flex-col items-center">
|
|
250
|
-
<h3 className="text-lg sm:text-xl
|
|
178
|
+
<h3 className="text-lg sm:text-xl lg:text-2xl font-bold gradient-text mb-6 uppercase tracking-tight">
|
|
251
179
|
Quick Links
|
|
252
180
|
</h3>
|
|
253
181
|
<ul className="grid grid-cols-2 gap-x-4 gap-y-3 text-center">
|
|
@@ -255,7 +183,7 @@ export default function Footer() {
|
|
|
255
183
|
<li key={link.href}>
|
|
256
184
|
<Link
|
|
257
185
|
href={link.href}
|
|
258
|
-
className="text-sm sm:text-base
|
|
186
|
+
className="text-sm sm:text-base lg:text-lg font-medium uppercase text-gray-300 hover:text-amber-400 transition-all"
|
|
259
187
|
>
|
|
260
188
|
{link.label}
|
|
261
189
|
</Link>
|
|
@@ -264,83 +192,116 @@ export default function Footer() {
|
|
|
264
192
|
</ul>
|
|
265
193
|
</div>
|
|
266
194
|
|
|
267
|
-
<div className="flex flex-col items-center
|
|
268
|
-
<h3 className="text-lg sm:text-xl
|
|
195
|
+
<div className="flex flex-col items-center">
|
|
196
|
+
<h3 className="text-lg sm:text-xl lg:text-2xl font-bold gradient-text mb-6 uppercase tracking-tight">
|
|
269
197
|
Reach Out
|
|
270
198
|
</h3>
|
|
271
|
-
<ul className="flex
|
|
199
|
+
<ul className="mobile-contact flex flex-wrap justify-center gap-4 mb-6 lg:hidden">
|
|
272
200
|
<li>
|
|
273
|
-
<a
|
|
274
|
-
|
|
201
|
+
<a
|
|
202
|
+
href="mailto:test@gmail.com"
|
|
203
|
+
className="text-gray-300 hover:text-amber-400 transition-all"
|
|
204
|
+
aria-label="Email DevVista"
|
|
205
|
+
>
|
|
206
|
+
<Mail className="h-6 w-6" />
|
|
275
207
|
</a>
|
|
276
208
|
</li>
|
|
277
209
|
<li>
|
|
278
|
-
<a
|
|
279
|
-
|
|
210
|
+
<a
|
|
211
|
+
href="tel:+13154875931"
|
|
212
|
+
className="text-gray-300 hover:text-amber-400 transition-all"
|
|
213
|
+
aria-label="Call Devvista"
|
|
214
|
+
>
|
|
215
|
+
<Phone className="h-6 w-6" />
|
|
280
216
|
</a>
|
|
281
217
|
</li>
|
|
282
218
|
<li>
|
|
283
219
|
<a
|
|
284
|
-
href="https://
|
|
285
|
-
className="
|
|
286
|
-
aria-label="View
|
|
287
|
-
target="_blank"
|
|
288
|
-
rel="noopener noreferrer"
|
|
220
|
+
href="https://maps.app.goo.gl/aTvx3qA7r7vL3fGi8"
|
|
221
|
+
className="text-gray-300 hover:text-amber-400 transition-all"
|
|
222
|
+
aria-label="View Devvista on Google Maps"
|
|
289
223
|
>
|
|
290
|
-
<MapPin className="h-6 w-6
|
|
224
|
+
<MapPin className="h-6 w-6" />
|
|
291
225
|
</a>
|
|
292
226
|
</li>
|
|
293
227
|
<li>
|
|
294
228
|
<a
|
|
295
|
-
href="https://
|
|
296
|
-
className="
|
|
297
|
-
aria-label="Visit
|
|
298
|
-
target="_blank"
|
|
299
|
-
rel="noopener noreferrer"
|
|
229
|
+
href="https://facebook.com"
|
|
230
|
+
className="text-gray-300 hover:text-amber-400 transition-all"
|
|
231
|
+
aria-label="Visit Devvista on Facebook"
|
|
300
232
|
>
|
|
301
|
-
<Facebook className="h-6 w-6
|
|
233
|
+
<Facebook className="h-6 w-6" />
|
|
302
234
|
</a>
|
|
303
235
|
</li>
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
236
|
+
<li>
|
|
237
|
+
<a
|
|
238
|
+
href="https://x.com"
|
|
239
|
+
className="text-gray-300 hover:text-amber-400 transition-all"
|
|
240
|
+
aria-label="Visit Devvista on X"
|
|
241
|
+
>
|
|
242
|
+
<X className="h-6 w-6" />
|
|
243
|
+
</a>
|
|
308
244
|
</li>
|
|
309
|
-
<li
|
|
310
|
-
<
|
|
311
|
-
|
|
312
|
-
|
|
245
|
+
<li>
|
|
246
|
+
<a
|
|
247
|
+
href="https://linkedin.com"
|
|
248
|
+
className="text-gray-300 hover:text-amber-400 transition-all"
|
|
249
|
+
aria-label="Visit DevVista on LinkedIn"
|
|
250
|
+
>
|
|
251
|
+
<Linkedin className="h-6 w-6" />
|
|
313
252
|
</a>
|
|
314
253
|
</li>
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
254
|
+
</ul>
|
|
255
|
+
<ul className="desktop-contact flex-wrap justify-center gap-4 mb-6 hidden lg:flex">
|
|
256
|
+
<li>
|
|
257
|
+
<a
|
|
258
|
+
href="mailto:test@gmail.com"
|
|
259
|
+
className="flex items-center text-sm sm:text-base lg:text-lg font-medium text-gray-300 hover:text-amber-400 transition-all"
|
|
260
|
+
>
|
|
261
|
+
<Mail className="h-5 w-5 mr-2" />
|
|
262
|
+
test@gmail.com
|
|
319
263
|
</a>
|
|
320
264
|
</li>
|
|
321
|
-
<li
|
|
322
|
-
<
|
|
323
|
-
|
|
324
|
-
|
|
265
|
+
<li>
|
|
266
|
+
<a
|
|
267
|
+
href="tel:+13154875931"
|
|
268
|
+
className="flex items-center text-sm sm:text-base lg:text-lg font-medium text-gray-300 hover:text-amber-400 transition-all"
|
|
269
|
+
>
|
|
270
|
+
<Phone className="h-5 w-5 mr-2" />
|
|
271
|
+
(315) 487-5931
|
|
325
272
|
</a>
|
|
326
273
|
</li>
|
|
327
|
-
<li
|
|
328
|
-
<Facebook className="h-4 w-4 sm:h-5 sm:w-5 text-blue-500" />
|
|
274
|
+
<li>
|
|
329
275
|
<a
|
|
330
|
-
href="https://
|
|
331
|
-
className="text-sm sm:text-base
|
|
332
|
-
target="_blank"
|
|
333
|
-
rel="noopener noreferrer"
|
|
276
|
+
href="https://maps.app.goo.gl/aTvx3qA7r7vL3fGi8"
|
|
277
|
+
className="flex items-center text-sm sm:text-base lg:text-lg font-medium text-gray-300 hover:text-amber-400 transition-all"
|
|
334
278
|
>
|
|
335
|
-
|
|
279
|
+
<MapPin className="h-5 w-5 mr-2" />
|
|
280
|
+
123 Vista Road, Syracuse, NY
|
|
336
281
|
</a>
|
|
337
282
|
</li>
|
|
338
283
|
</ul>
|
|
284
|
+
<ul className="space-y-3 text-center">
|
|
285
|
+
<li className="text-sm sm:text-base lg:text-lg text-stone-100 font-medium opacity-90">
|
|
286
|
+
123 Vista Road Syracuse, NY, Syracuse, NY 13219
|
|
287
|
+
</li>
|
|
288
|
+
<li className="text-sm sm:text-base lg:text-lg text-stone-100 font-medium opacity-90">
|
|
289
|
+
<strong style={{ color: "var(--brown-accent)" }}>Summer Hours</strong> (Mar 1 – Dec 31):<br />
|
|
290
|
+
Mon–Fri: 8:00AM – 5:00PM
|
|
291
|
+
<br />
|
|
292
|
+
<strong style={{ color: "var(--brown-accent)" }}>Winter Hours</strong> (Jan 1 – Feb 28):<br />
|
|
293
|
+
Mon–Fri: 9:00AM – 4:00PM
|
|
294
|
+
<br />
|
|
295
|
+
<hr className="my-2 border-stone-400 opacity-50 w-3/4 mx-auto" />
|
|
296
|
+
Sat: 9:00AM – 2:00PM
|
|
297
|
+
<br />
|
|
298
|
+
Sun: Closed
|
|
299
|
+
</li>
|
|
300
|
+
</ul>
|
|
339
301
|
</div>
|
|
340
302
|
</div>
|
|
341
303
|
|
|
342
|
-
|
|
343
|
-
<div className="flex justify-center 2xl:justify-start mt-8 space-x-4 admin-menu-container">
|
|
304
|
+
<div className="desktop-auth flex justify-center lg:justify-start mt-8 space-x-4 admin-menu-container">
|
|
344
305
|
{!authLoading && (
|
|
345
306
|
<SignedIn>
|
|
346
307
|
<div className="flex items-center space-x-2">
|
|
@@ -358,6 +319,9 @@ export default function Footer() {
|
|
|
358
319
|
</SettingsButton>
|
|
359
320
|
)}
|
|
360
321
|
</div>
|
|
322
|
+
{error && (
|
|
323
|
+
<p className="text-red-500 text-sm mt-2">{error}</p>
|
|
324
|
+
)}
|
|
361
325
|
</SignedIn>
|
|
362
326
|
)}
|
|
363
327
|
{!authLoading && (
|
|
@@ -380,11 +344,10 @@ export default function Footer() {
|
|
|
380
344
|
)}
|
|
381
345
|
</div>
|
|
382
346
|
|
|
383
|
-
|
|
384
|
-
<div className="mt-8 pt-6 border-t border-gray-700 relative">
|
|
347
|
+
<div className="mt-8 pt-6 border-t border-gray-800 relative">
|
|
385
348
|
<div className="flex justify-center items-center w-full mx-auto max-w-full">
|
|
386
|
-
<p className="text-sm sm:text-base
|
|
387
|
-
© {new Date().getFullYear()} DevVista
|
|
349
|
+
<p className="text-sm sm:text-base lg:text-lg text-gray-300 font-medium text-center">
|
|
350
|
+
© {new Date().getFullYear()} DevVista. All rights reserved.
|
|
388
351
|
</p>
|
|
389
352
|
</div>
|
|
390
353
|
</div>
|
|
@@ -414,7 +377,7 @@ export default function Footer() {
|
|
|
414
377
|
>
|
|
415
378
|
<X className="h-6 w-6" />
|
|
416
379
|
</button>
|
|
417
|
-
<SignIn routing="hash" />
|
|
380
|
+
<SignIn routing="hash" afterSignInUrl="/" />
|
|
418
381
|
</motion.div>
|
|
419
382
|
</motion.div>
|
|
420
383
|
)}
|
|
@@ -441,7 +404,7 @@ export default function Footer() {
|
|
|
441
404
|
>
|
|
442
405
|
<X className="h-6 w-6" />
|
|
443
406
|
</button>
|
|
444
|
-
<SignUp routing="hash" />
|
|
407
|
+
<SignUp routing="hash" afterSignUpUrl="/" />
|
|
445
408
|
</motion.div>
|
|
446
409
|
</motion.div>
|
|
447
410
|
)}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
// src/components/AdminMenu.tsx
|
|
2
1
|
"use client";
|
|
3
2
|
|
|
4
3
|
import Link from "next/link";
|
|
@@ -11,6 +10,7 @@ interface AdminMenuProps {
|
|
|
11
10
|
}
|
|
12
11
|
|
|
13
12
|
const menuItems = [
|
|
13
|
+
{ href: "/admin-profile", label: "Admin Profile" },
|
|
14
14
|
{ href: "/analytics", label: "Analytics" },
|
|
15
15
|
{ href: "/blog", label: "Blog" },
|
|
16
16
|
{ href: "/adRequest", label: "Ad Requests" },
|