@devvistatech/devvista-kit 0.0.10 → 0.0.12
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/CHANGELOG.md +12 -12
- package/LICENSE +6 -6
- package/README.md +15 -15
- package/app/about/page.tsx +298 -298
- package/app/adRequest/page.tsx +549 -549
- package/app/analytics/page.tsx +346 -346
- package/app/api/about/route.ts +306 -306
- package/app/api/adRequest/route.ts +567 -567
- package/app/api/analytics/[reportType]/route.ts +337 -337
- package/app/api/bio/route.ts +313 -313
- package/app/api/blog/route.ts +306 -306
- package/app/api/chat/route.ts +14 -14
- package/app/api/contact/route.ts +409 -409
- package/app/api/contacts/route.ts +224 -224
- package/app/api/files/route.ts +429 -429
- package/app/api/gallery-data/route.ts +735 -735
- package/app/api/schedule/route.ts +455 -455
- package/app/api/sync-user/route.ts +131 -131
- package/app/api/trial-request/route.ts +297 -297
- package/app/blog/[id]/page.tsx +288 -288
- package/app/blog/page.tsx +216 -216
- package/app/contact/page.tsx +284 -284
- package/app/faq/page.tsx +191 -191
- package/app/gallery/page.tsx +315 -315
- package/app/globals.css +58 -58
- package/app/layout.tsx +110 -110
- package/app/not-found.tsx +20 -20
- package/app/page.tsx +338 -338
- package/app/schedule/page.tsx +660 -660
- package/bin/init.js +219 -219
- package/components/addOns/functional/BioEditor.tsx +446 -446
- package/components/addOns/functional/CalendlyWidget.tsx +107 -107
- package/components/addOns/functional/ClassList.tsx +145 -145
- package/components/addOns/functional/ClassPopup.tsx +398 -398
- package/components/addOns/functional/ContactForm.tsx +284 -284
- package/components/addOns/functional/FileUploader.tsx +294 -294
- package/components/addOns/functional/ImageDescCarousel.tsx +730 -730
- package/components/addOns/functional/NewUserAnalytics.tsx +100 -100
- package/components/addOns/functional/ScheduleCarousel.tsx +171 -171
- package/components/addOns/functional/aboutSections/AboutSection.tsx +544 -544
- package/components/addOns/functional/aboutSections/constants/aboutSection.ts +65 -65
- package/components/addOns/functional/blogSections/BlogDashboard.tsx +184 -184
- package/components/addOns/functional/blogSections/BlogFormPopUp.tsx +554 -554
- package/components/addOns/functional/blogSections/BlogList.tsx +148 -148
- package/components/addOns/functional/blogSections/BlogSidebar.tsx +58 -58
- package/components/addOns/functional/blogSections/constants/blogDashboard.ts +28 -28
- package/components/addOns/functional/blogSections/constants/blogFormPopUp.ts +97 -97
- package/components/addOns/functional/blogSections/constants/blogList.ts +22 -22
- package/components/addOns/functional/blogSections/constants/blogSidebar.ts +15 -15
- package/components/addOns/functional/contactsDashboard/ContactsDashboard.tsx +366 -366
- package/components/addOns/functional/contactsDashboard/constants/contactsDashboard.ts +70 -70
- package/components/addOns/functional/galleries/GalleryComplex.tsx +836 -836
- package/components/addOns/functional/galleries/GallerySimple.tsx +509 -509
- package/components/addOns/functional/galleries/constants/galleryComplex.ts +106 -106
- package/components/addOns/functional/galleries/constants/gallerySimple.ts +76 -76
- package/components/addOns/functional/schedules/ScheduleGridOne.tsx +262 -262
- package/components/addOns/functional/schedules/ScheduleGridTwo.tsx +294 -294
- package/components/addOns/functional/schedules/ScheduleGridTwoBasic.tsx +288 -288
- package/components/addOns/functional/schedules/SchedulerForm.tsx +428 -428
- package/components/addOns/functional/schedules/constants/ScheduleGridTwo.ts +40 -40
- package/components/addOns/functional/schedules/constants/ScheduleGridTwoBasic.ts +40 -40
- package/components/addOns/functional/schedules/constants/SchedulerForm.ts +65 -65
- package/components/addOns/functional/schedules/constants/scheduleGridOne.ts +54 -54
- package/components/addOns/non-functional/AnnouncementBanner.tsx +46 -46
- package/components/addOns/non-functional/FeaturesSection.tsx +62 -62
- package/components/addOns/non-functional/Heros/HeroSection.tsx +142 -142
- package/components/addOns/non-functional/IconBubble.tsx +49 -49
- package/components/addOns/non-functional/SampleCarousel.tsx +204 -204
- package/components/addOns/non-functional/Testimonials.tsx +334 -334
- package/components/addOns/non-functional/ThreeSetGallery.tsx +63 -63
- package/components/addOns/non-functional/aboutSections/AboutSection.tsx +62 -62
- package/components/addOns/non-functional/aboutSections/constants/aboutSection.ts +24 -24
- package/components/addOns/non-functional/imageCarousels/ProductSlider.tsx +117 -117
- package/components/addOns/non-functional/imageCarousels/ProgramCarousel.tsx +232 -232
- package/components/addOns/non-functional/imageCarousels/constants/programCarousel.ts +39 -39
- package/components/addOns/non-functional/imageCarousels/constants/programSlider.ts +36 -36
- package/components/addOns/non-functional/spinner.tsx +21 -21
- package/components/footers/footer.tsx +453 -453
- package/components/navBars/navbar.tsx +310 -310
- package/components/other/accordion.tsx +58 -58
- package/components/other/admin-menu.tsx +68 -68
- package/components/other/alert-dialog.tsx +141 -141
- package/components/other/alert.tsx +59 -59
- package/components/other/aspect-ratio.tsx +7 -7
- package/components/other/avatar.tsx +50 -50
- package/components/other/badge.tsx +36 -36
- package/components/other/breadcrumb.tsx +115 -115
- package/components/other/button.tsx +738 -738
- package/components/other/calendar.tsx +66 -66
- package/components/other/card.tsx +86 -86
- package/components/other/carousel.tsx +274 -274
- package/components/other/chart.tsx +363 -363
- package/components/other/checkbox.tsx +30 -30
- package/components/other/collapsible.tsx +11 -11
- package/components/other/command.tsx +155 -155
- package/components/other/context-menu.tsx +200 -200
- package/components/other/dialog.tsx +122 -122
- package/components/other/drawer.tsx +118 -118
- package/components/other/dropdown-menu.tsx +200 -200
- package/components/other/form.tsx +179 -179
- package/components/other/hover-card.tsx +29 -29
- package/components/other/input-otp.tsx +71 -71
- package/components/other/input.tsx +25 -25
- package/components/other/label.tsx +26 -26
- package/components/other/menubar.tsx +236 -236
- package/components/other/mobile-icon.tsx +21 -21
- package/components/other/navigation-menu.tsx +128 -128
- package/components/other/pagination.tsx +117 -117
- package/components/other/popover.tsx +31 -31
- package/components/other/progress.tsx +28 -28
- package/components/other/radio-group.tsx +44 -44
- package/components/other/resizable.tsx +45 -45
- package/components/other/scroll-area.tsx +48 -48
- package/components/other/select.tsx +160 -160
- package/components/other/separator.tsx +31 -31
- package/components/other/sheet.tsx +140 -140
- package/components/other/skeleton.tsx +15 -15
- package/components/other/slider.tsx +28 -28
- package/components/other/social-icons.tsx +39 -39
- package/components/other/sonner.tsx +31 -31
- package/components/other/switch.tsx +29 -29
- package/components/other/table.tsx +117 -117
- package/components/other/tabs.tsx +55 -55
- package/components/other/textarea.tsx +24 -24
- package/components/other/toast.tsx +122 -122
- package/components/other/toaster.tsx +35 -35
- package/components/other/toggle-group.tsx +61 -61
- package/components/other/toggle.tsx +45 -45
- package/components/other/tooltip.tsx +30 -30
- package/components/theme-provider.tsx +8 -8
- package/components/types.ts +49 -49
- package/hooks/use-toast.ts +188 -188
- package/lib/auth-context.tsx +130 -130
- package/lib/constants/about.ts +34 -34
- package/lib/constants/adRequest.ts +113 -113
- package/lib/constants/contact.ts +40 -40
- package/lib/constants/faq.ts +34 -34
- package/lib/constants/gallery.ts +42 -42
- package/lib/constants/page.ts +69 -69
- package/lib/constants/schedule.ts +71 -71
- package/lib/google-analytics.tsx +97 -97
- package/lib/verify-user.ts +117 -117
- package/middleware.ts +42 -42
- package/netlify.toml +5 -5
- package/next.config.js +10 -10
- package/package.json +115 -115
- package/tailwind.config.ts +89 -89
- package/tsconfig.json +23 -23
- package/dist/.next/types/app/api/about/route.js +0 -52
- package/dist/.next/types/app/api/blog/route.js +0 -52
- package/dist/.next/types/app/api/files/route.js +0 -52
- package/dist/.next/types/app/api/schedule/route.js +0 -52
- package/dist/.next/types/app/api/sync-user/route.js +0 -52
- package/dist/.next/types/app/layout.js +0 -22
- package/dist/.next/types/app/page.js +0 -22
- package/dist/app/about/page.jsx +0 -258
- package/dist/app/adRequest/page.jsx +0 -531
- package/dist/app/analytics/page.jsx +0 -298
- package/dist/app/api/about/route.js +0 -285
- package/dist/app/api/adRequest/route.js +0 -440
- package/dist/app/api/analytics/[reportType]/route.js +0 -357
- package/dist/app/api/bio/route.js +0 -293
- package/dist/app/api/blog/route.js +0 -366
- package/dist/app/api/chat/route.js +0 -58
- package/dist/app/api/contact/route.js +0 -163
- package/dist/app/api/contacts/route.js +0 -234
- package/dist/app/api/files/route.js +0 -444
- package/dist/app/api/gallery-data/route.js +0 -719
- package/dist/app/api/schedule/route.js +0 -461
- package/dist/app/api/sync-user/route.js +0 -186
- package/dist/app/api/trial-request/route.js +0 -165
- package/dist/app/blog/[id]/page.jsx +0 -312
- package/dist/app/blog/page.jsx +0 -210
- package/dist/app/constants/about.js +0 -32
- package/dist/app/constants/adRequest.js +0 -113
- package/dist/app/constants/contact.js +0 -40
- package/dist/app/constants/faq.js +0 -36
- package/dist/app/constants/gallery.js +0 -42
- package/dist/app/constants/page.js +0 -69
- package/dist/app/constants/schedule.js +0 -71
- package/dist/app/contact/page.jsx +0 -119
- package/dist/app/faq/page.jsx +0 -97
- package/dist/app/gallery/page.jsx +0 -281
- package/dist/app/layout.jsx +0 -45
- package/dist/app/not-found.jsx +0 -14
- package/dist/app/page.jsx +0 -324
- package/dist/app/schedule/page.jsx +0 -500
- package/dist/components/addOns/functional/BioEditor.jsx +0 -187
- package/dist/components/addOns/functional/CalendlyWidget.jsx +0 -61
- package/dist/components/addOns/functional/ClassList.jsx +0 -158
- package/dist/components/addOns/functional/ClassPopup.jsx +0 -300
- package/dist/components/addOns/functional/ContactForm.jsx +0 -219
- package/dist/components/addOns/functional/FileUploader.jsx +0 -222
- package/dist/components/addOns/functional/ImageDescCarousel.jsx +0 -491
- package/dist/components/addOns/functional/NewUserAnalytics.jsx +0 -71
- package/dist/components/addOns/functional/ScheduleCarousel.jsx +0 -68
- package/dist/components/addOns/functional/aboutSections/AboutSection.jsx +0 -372
- package/dist/components/addOns/functional/aboutSections/constants/aboutSection.js +0 -65
- package/dist/components/addOns/functional/blogSections/BlogDashboard.jsx +0 -111
- package/dist/components/addOns/functional/blogSections/BlogFormPopUp.jsx +0 -465
- package/dist/components/addOns/functional/blogSections/BlogList.jsx +0 -170
- package/dist/components/addOns/functional/blogSections/BlogSidebar.jsx +0 -35
- package/dist/components/addOns/functional/blogSections/constants/blogDashboard.js +0 -28
- package/dist/components/addOns/functional/blogSections/constants/blogFormPopUp.js +0 -97
- package/dist/components/addOns/functional/blogSections/constants/blogList.js +0 -22
- package/dist/components/addOns/functional/blogSections/constants/blogSidebar.js +0 -15
- package/dist/components/addOns/functional/contactsDashboard/ContactsDashboard.jsx +0 -355
- package/dist/components/addOns/functional/contactsDashboard/constants/contactsDashboard.js +0 -70
- package/dist/components/addOns/functional/galleries/GalleryComplex.jsx +0 -605
- package/dist/components/addOns/functional/galleries/GallerySimple.jsx +0 -363
- package/dist/components/addOns/functional/galleries/constants/galleryComplex.js +0 -106
- package/dist/components/addOns/functional/galleries/constants/gallerySimple.js +0 -76
- package/dist/components/addOns/functional/schedules/ScheduleGridOne.jsx +0 -167
- package/dist/components/addOns/functional/schedules/ScheduleGridTwo.jsx +0 -100
- package/dist/components/addOns/functional/schedules/ScheduleGridTwoBasic.jsx +0 -97
- package/dist/components/addOns/functional/schedules/SchedulerForm.jsx +0 -188
- package/dist/components/addOns/functional/schedules/constants/ScheduleGridTwo.js +0 -40
- package/dist/components/addOns/functional/schedules/constants/ScheduleGridTwoBasic.js +0 -40
- package/dist/components/addOns/functional/schedules/constants/SchedulerForm.js +0 -65
- package/dist/components/addOns/functional/schedules/constants/scheduleGridOne.js +0 -54
- package/dist/components/addOns/non-functional/AnnouncementBanner.jsx +0 -24
- package/dist/components/addOns/non-functional/FeaturesSection.jsx +0 -38
- package/dist/components/addOns/non-functional/HeroSection.jsx +0 -71
- package/dist/components/addOns/non-functional/Heros/HeroSection.jsx +0 -71
- package/dist/components/addOns/non-functional/IconBubble.jsx +0 -36
- package/dist/components/addOns/non-functional/SampleCarousel.jsx +0 -114
- package/dist/components/addOns/non-functional/Testimonials.jsx +0 -177
- package/dist/components/addOns/non-functional/ThreeSetGallery.jsx +0 -40
- package/dist/components/addOns/non-functional/aboutSections/AboutSection.jsx +0 -35
- package/dist/components/addOns/non-functional/aboutSections/constants/aboutSection.js +0 -24
- package/dist/components/addOns/non-functional/imageCarousels/ProductSlider.jsx +0 -80
- package/dist/components/addOns/non-functional/imageCarousels/ProgramCarousel.jsx +0 -155
- package/dist/components/addOns/non-functional/imageCarousels/constants/programCarousel.js +0 -39
- package/dist/components/addOns/non-functional/imageCarousels/constants/programSlider.js +0 -36
- package/dist/components/addOns/non-functional/spinner.jsx +0 -13
- package/dist/components/footers/footer.jsx +0 -217
- package/dist/components/navBars/navbar.jsx +0 -159
- package/dist/components/other/accordion.jsx +0 -40
- package/dist/components/other/admin-menu.jsx +0 -34
- package/dist/components/other/alert-dialog.jsx +0 -64
- package/dist/components/other/alert.jsx +0 -41
- package/dist/components/other/aspect-ratio.jsx +0 -4
- package/dist/components/other/avatar.jsx +0 -31
- package/dist/components/other/badge.jsx +0 -32
- package/dist/components/other/breadcrumb.jsx +0 -57
- package/dist/components/other/button.jsx +0 -322
- package/dist/components/other/calendar.jsx +0 -43
- package/dist/components/other/card.jsx +0 -44
- package/dist/components/other/carousel.jsx +0 -140
- package/dist/components/other/chart.jsx +0 -182
- package/dist/components/other/checkbox.jsx +0 -26
- package/dist/components/other/collapsible.jsx +0 -6
- package/dist/components/other/command.jsx +0 -68
- package/dist/components/other/context-menu.jsx +0 -88
- package/dist/components/other/dialog.jsx +0 -60
- package/dist/components/other/drawer.jsx +0 -60
- package/dist/components/other/dropdown-menu.jsx +0 -90
- package/dist/components/other/form.jsx +0 -89
- package/dist/components/other/hover-card.jsx +0 -23
- package/dist/components/other/input-otp.jsx +0 -46
- package/dist/components/other/input.jsx +0 -19
- package/dist/components/other/label.jsx +0 -23
- package/dist/components/other/login-popup.jsx +0 -1
- package/dist/components/other/menubar.jsx +0 -96
- package/dist/components/other/mobile-icon.jsx +0 -11
- package/dist/components/other/navigation-menu.jsx +0 -62
- package/dist/components/other/pagination.jsx +0 -63
- package/dist/components/other/popover.jsx +0 -25
- package/dist/components/other/progress.jsx +0 -23
- package/dist/components/other/radio-group.jsx +0 -31
- package/dist/components/other/resizable.jsx +0 -29
- package/dist/components/other/scroll-area.jsx +0 -36
- package/dist/components/other/select.jsx +0 -83
- package/dist/components/other/separator.jsx +0 -21
- package/dist/components/other/sheet.jsx +0 -74
- package/dist/components/other/signup-popup.jsx +0 -1
- package/dist/components/other/skeleton.jsx +0 -17
- package/dist/components/other/slider.jsx +0 -26
- package/dist/components/other/social-icons.jsx +0 -15
- package/dist/components/other/sonner.jsx +0 -27
- package/dist/components/other/switch.jsx +0 -23
- package/dist/components/other/table.jsx +0 -56
- package/dist/components/other/tabs.jsx +0 -32
- package/dist/components/other/textarea.jsx +0 -19
- package/dist/components/other/toast.jsx +0 -58
- package/dist/components/other/toaster.jsx +0 -31
- package/dist/components/other/toggle-group.jsx +0 -41
- package/dist/components/other/toggle.jsx +0 -39
- package/dist/components/other/tooltip.jsx +0 -24
- package/dist/components/theme-provider.jsx +0 -18
- package/dist/components/types.js +0 -1
- package/dist/hooks/use-toast.js +0 -135
- package/dist/lib/auth-context.jsx +0 -144
- package/dist/lib/constants/about.js +0 -32
- package/dist/lib/constants/adRequest.js +0 -113
- package/dist/lib/constants/contact.js +0 -40
- package/dist/lib/constants/faq.js +0 -36
- package/dist/lib/constants/gallery.js +0 -42
- package/dist/lib/constants/page.js +0 -69
- package/dist/lib/constants/schedule.js +0 -71
- package/dist/lib/google-analytics.jsx +0 -148
- package/dist/lib/utils.js +0 -9
- package/dist/lib/verify-user.js +0 -142
- package/dist/middleware.js +0 -37
- package/dist/tailwind.config.js +0 -86
- package/dist/tsconfig.tsbuildinfo +0 -1
|
@@ -1,454 +1,454 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import Link from "next/link";
|
|
4
|
-
import Image from "next/image";
|
|
5
|
-
import { Mail, Phone, MapPin, Facebook, LogIn, UserPlus, X, Settings, LogOut } from "lucide-react";
|
|
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";
|
|
9
|
-
import { motion, AnimatePresence } from "framer-motion";
|
|
10
|
-
import AdminMenu from "../other/admin-menu";
|
|
11
|
-
import { SignInButton, SignUpButton, SignOutButton, SettingsButton } from "../other/button";
|
|
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
|
-
const baseLinks = [
|
|
23
|
-
{ href: "/", label: "Home" },
|
|
24
|
-
{ href: "/about", label: "About" },
|
|
25
|
-
{ href: "/contact", label: "Contact" },
|
|
26
|
-
{ href: "/gallery", label: "Gallery" },
|
|
27
|
-
{ href: "/schedule", label: "Schedule & Rates" },
|
|
28
|
-
{ href: "/faq", label: "FAQ" },
|
|
29
|
-
];
|
|
30
|
-
|
|
31
|
-
export default function Footer() {
|
|
32
|
-
const { isSignedIn } = useAuth();
|
|
33
|
-
const { user, authLoading, checkSession } = useStrapiAuth();
|
|
34
|
-
const [isLoginOpen, setIsLoginOpen] = useState(false);
|
|
35
|
-
const [isSignupOpen, setIsSignupOpen] = useState(false);
|
|
36
|
-
const [isAdminMenuOpen, setIsAdminMenuOpen] = useState(false);
|
|
37
|
-
const [error, setError] = useState<string | null>(null);
|
|
38
|
-
|
|
39
|
-
useEffect(() => {
|
|
40
|
-
if (isSignedIn) {
|
|
41
|
-
setIsLoginOpen(false);
|
|
42
|
-
setIsSignupOpen(false);
|
|
43
|
-
setIsAdminMenuOpen(false);
|
|
44
|
-
}
|
|
45
|
-
}, [isSignedIn]);
|
|
46
|
-
|
|
47
|
-
useEffect(() => {
|
|
48
|
-
if (isLoginOpen || isSignupOpen || isAdminMenuOpen) {
|
|
49
|
-
document.body.style.overflow = "hidden";
|
|
50
|
-
} else {
|
|
51
|
-
document.body.style.overflow = "auto";
|
|
52
|
-
}
|
|
53
|
-
return () => {
|
|
54
|
-
document.body.style.overflow = "auto";
|
|
55
|
-
};
|
|
56
|
-
}, [isLoginOpen, isSignupOpen, isAdminMenuOpen]);
|
|
57
|
-
|
|
58
|
-
useEffect(() => {
|
|
59
|
-
const event = new CustomEvent("modalStateChange", {
|
|
60
|
-
detail: { isOpen: isLoginOpen || isSignupOpen || isAdminMenuOpen },
|
|
61
|
-
});
|
|
62
|
-
window.dispatchEvent(event);
|
|
63
|
-
}, [isLoginOpen, isSignupOpen, isAdminMenuOpen]);
|
|
64
|
-
|
|
65
|
-
useEffect(() => {
|
|
66
|
-
if (!authLoading) {
|
|
67
|
-
if (isSignedIn && !user) {
|
|
68
|
-
checkSession().catch((err) => {
|
|
69
|
-
console.error("Footer: Failed to sync user data", err);
|
|
70
|
-
setError("Failed to load user data. Please try logging out and back in.");
|
|
71
|
-
});
|
|
72
|
-
} else {
|
|
73
|
-
setError(null);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
}, [isSignedIn, user, authLoading, checkSession]);
|
|
77
|
-
|
|
78
|
-
const isAdmin = isSignedIn && !!user?.businessAdminId && user?.userRole === "admin";
|
|
79
|
-
|
|
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
|
-
return (
|
|
89
|
-
<footer className="w-full bg-[#2D2D2D] text-gray-300 border-t border-gray-700">
|
|
90
|
-
<style jsx>{`
|
|
91
|
-
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700;800&display=swap');
|
|
92
|
-
|
|
93
|
-
:root {
|
|
94
|
-
--caviar: #2D2D2D;
|
|
95
|
-
--natural-white: #F7F7F7;
|
|
96
|
-
--blue-500: #3B82F6;
|
|
97
|
-
--blue-600: #2563EB;
|
|
98
|
-
--blue-700: #1D4ED8;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
* {
|
|
102
|
-
font-family: 'Inter', sans-serif;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
.glassmorphism {
|
|
106
|
-
background: rgba(255, 255, 255, 0.08);
|
|
107
|
-
backdrop-filter: blur(10px);
|
|
108
|
-
-webkit-backdrop-filter: blur(10px);
|
|
109
|
-
border: 1px solid rgba(255, 255, 255, 0.2);
|
|
110
|
-
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1);
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
.modal-glassmorphism {
|
|
114
|
-
background: rgba(255, 255, 255, 0.08);
|
|
115
|
-
backdrop-filter: blur(10px);
|
|
116
|
-
-webkit-backdrop-filter: blur(10px);
|
|
117
|
-
border: 2px solid transparent;
|
|
118
|
-
border-image: linear-gradient(45deg, var(--blue-500), var(--blue-600), var(--blue-700)) 1;
|
|
119
|
-
box-shadow: 0 16px 48px rgba(0, 0, 0, 0.1);
|
|
120
|
-
border-radius: 2rem;
|
|
121
|
-
max-height: 90vh;
|
|
122
|
-
overflow: hidden;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
.gradient-text {
|
|
126
|
-
background: linear-gradient(90deg, var(--blue-500), var(--blue-600));
|
|
127
|
-
-webkit-background-clip: text;
|
|
128
|
-
background-clip: text;
|
|
129
|
-
color: transparent;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
.contact-icon {
|
|
133
|
-
display: inline-flex;
|
|
134
|
-
align-items: center;
|
|
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;
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
.cl-signIn-root .cl-main,
|
|
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;
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
@supports not (backdrop-filter: blur(10px)) {
|
|
214
|
-
.glassmorphism,
|
|
215
|
-
.modal-glassmorphism {
|
|
216
|
-
background: rgba(255, 255, 255, 0.2);
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
`}</style>
|
|
220
|
-
|
|
221
|
-
<div className="w-full px-4 sm:px-6 lg:px-8 2xl:px-24 py-12 sm:py-16 glassmorphism">
|
|
222
|
-
<div className="grid grid-cols-1 2xl:grid-cols-3 gap-8 sm:gap-12">
|
|
223
|
-
<div className="flex flex-col items-center 2xl:items-start">
|
|
224
|
-
<Link href="/" className="flex items-center space-x-4 mb-6">
|
|
225
|
-
<Image
|
|
226
|
-
src="/images/test.png"
|
|
227
|
-
alt="DevVista Kit Logo"
|
|
228
|
-
width={64}
|
|
229
|
-
height={64}
|
|
230
|
-
className="h-20 w-20 rounded-full shadow-md transition-transform duration-300 ease-in-out transform hover:scale-105"
|
|
231
|
-
quality={80}
|
|
232
|
-
loading="lazy"
|
|
233
|
-
/>
|
|
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
|
-
</Link>
|
|
244
|
-
<p className="text-sm sm:text-base 2xl:text-lg text-gray-400 text-center 2xl:text-left font-medium">
|
|
245
|
-
The Official DevVista Kit
|
|
246
|
-
</p>
|
|
247
|
-
</div>
|
|
248
|
-
|
|
249
|
-
<div className="flex flex-col items-center">
|
|
250
|
-
<h3 className="text-lg sm:text-xl 2xl:text-2xl font-bold gradient-text mb-6 uppercase tracking-tight">
|
|
251
|
-
Quick Links
|
|
252
|
-
</h3>
|
|
253
|
-
<ul className="grid grid-cols-2 gap-x-4 gap-y-3 text-center">
|
|
254
|
-
{baseLinks.map((link) => (
|
|
255
|
-
<li key={link.href}>
|
|
256
|
-
<Link
|
|
257
|
-
href={link.href}
|
|
258
|
-
className="text-sm sm:text-base 2xl:text-lg font-medium uppercase text-gray-300 hover:text-blue-400 transition-all"
|
|
259
|
-
>
|
|
260
|
-
{link.label}
|
|
261
|
-
</Link>
|
|
262
|
-
</li>
|
|
263
|
-
))}
|
|
264
|
-
</ul>
|
|
265
|
-
</div>
|
|
266
|
-
|
|
267
|
-
<div className="flex flex-col items-center 2xl:items-end">
|
|
268
|
-
<h3 className="text-lg sm:text-xl 2xl:text-2xl font-bold gradient-text mb-6 uppercase tracking-tight">
|
|
269
|
-
Reach Out
|
|
270
|
-
</h3>
|
|
271
|
-
<ul className="flex space-x-4 2xl:hidden">
|
|
272
|
-
<li>
|
|
273
|
-
<a href="tel:3154154043" className="contact-icon text-gray-300" aria-label="Call 123-456-7892">
|
|
274
|
-
<Phone className="h-6 w-6 sm:h-8 sm:w-8 text-blue-500" />
|
|
275
|
-
</a>
|
|
276
|
-
</li>
|
|
277
|
-
<li>
|
|
278
|
-
<a href="mailto:devvistainfo@gmail.com" className="contact-icon text-gray-300" aria-label="Email devvistainfo@gmail.com">
|
|
279
|
-
<Mail className="h-6 w-6 sm:h-8 sm:w-8 text-blue-500" />
|
|
280
|
-
</a>
|
|
281
|
-
</li>
|
|
282
|
-
<li>
|
|
283
|
-
<a
|
|
284
|
-
href="https://www.google.com/maps/place/215+W+Manlius+St,+East+Syracuse,+NY+13057"
|
|
285
|
-
className="contact-icon text-gray-300"
|
|
286
|
-
aria-label="View 123 Syracuse, NY 12345 on Google Maps"
|
|
287
|
-
target="_blank"
|
|
288
|
-
rel="noopener noreferrer"
|
|
289
|
-
>
|
|
290
|
-
<MapPin className="h-6 w-6 sm:h-8 sm:w-8 text-blue-500" />
|
|
291
|
-
</a>
|
|
292
|
-
</li>
|
|
293
|
-
<li>
|
|
294
|
-
<a
|
|
295
|
-
href="https://www.facebook.com/"
|
|
296
|
-
className="contact-icon text-gray-300"
|
|
297
|
-
aria-label="Visit our Facebook page"
|
|
298
|
-
target="_blank"
|
|
299
|
-
rel="noopener noreferrer"
|
|
300
|
-
>
|
|
301
|
-
<Facebook className="h-6 w-6 sm:h-8 sm:w-8 text-blue-500" />
|
|
302
|
-
</a>
|
|
303
|
-
</li>
|
|
304
|
-
</ul>
|
|
305
|
-
<ul className="space-y-3 text-center 2xl:text-right hidden 2xl:block">
|
|
306
|
-
<li className="text-sm sm:text-base 2xl:text-lg text-gray-300 font-medium">
|
|
307
|
-
123 Syracuse, NY 12345
|
|
308
|
-
</li>
|
|
309
|
-
<li className="flex items-center justify-center 2xl:justify-end space-x-3">
|
|
310
|
-
<Phone className="h-4 w-4 sm:h-5 sm:w-5 text-blue-500" />
|
|
311
|
-
<a href="tel:3152145466" className="text-sm sm:text-base 2xl:text-lg text-gray-300 font-medium hover:text-blue-400 transition-all">
|
|
312
|
-
123-456-7891
|
|
313
|
-
</a>
|
|
314
|
-
</li>
|
|
315
|
-
<li className="flex items-center justify-center 2xl:justify-end space-x-3">
|
|
316
|
-
<Phone className="h-4 w-4 sm:h-5 sm:w-5 text-blue-500" />
|
|
317
|
-
<a href="tel:3154154043" className="text-sm sm:text-base 2xl:text-lg text-gray-300 font-medium hover:text-blue-400 transition-all">
|
|
318
|
-
123-456-7892
|
|
319
|
-
</a>
|
|
320
|
-
</li>
|
|
321
|
-
<li className="flex items-center justify-center 2xl:justify-end space-x-3">
|
|
322
|
-
<Mail className="h-4 w-4 sm:h-5 sm:w-5 text-blue-500" />
|
|
323
|
-
<a href="mailto:devvistainfo@gmail.com" className="text-sm sm:text-base 2xl:text-lg text-gray-300 font-medium hover:text-blue-400 transition-all">
|
|
324
|
-
devvistainfo@gmail.com
|
|
325
|
-
</a>
|
|
326
|
-
</li>
|
|
327
|
-
<li className="flex items-center justify-center 2xl:justify-end space-x-3">
|
|
328
|
-
<Facebook className="h-4 w-4 sm:h-5 sm:w-5 text-blue-500" />
|
|
329
|
-
<a
|
|
330
|
-
href="https://www.facebook.com/"
|
|
331
|
-
className="text-sm sm:text-base 2xl:text-lg text-gray-300 font-medium hover:text-blue-400 transition-all"
|
|
332
|
-
target="_blank"
|
|
333
|
-
rel="noopener noreferrer"
|
|
334
|
-
>
|
|
335
|
-
Facebook
|
|
336
|
-
</a>
|
|
337
|
-
</li>
|
|
338
|
-
</ul>
|
|
339
|
-
</div>
|
|
340
|
-
</div>
|
|
341
|
-
|
|
342
|
-
{/* Authentication Buttons Moved Above the Bordered Div */}
|
|
343
|
-
<div className="flex justify-center 2xl:justify-start mt-8 space-x-4 admin-menu-container">
|
|
344
|
-
{!authLoading && (
|
|
345
|
-
<SignedIn>
|
|
346
|
-
<div className="flex items-center space-x-2">
|
|
347
|
-
<ClerkSignOutButton redirectUrl="/">
|
|
348
|
-
<SignOutButton size="sm" aria-label="Logout">
|
|
349
|
-
Logout
|
|
350
|
-
</SignOutButton>
|
|
351
|
-
</ClerkSignOutButton>
|
|
352
|
-
{isAdmin && (
|
|
353
|
-
<SettingsButton
|
|
354
|
-
size="sm"
|
|
355
|
-
onClick={() => setIsAdminMenuOpen(true)}
|
|
356
|
-
aria-label="Admin Menu"
|
|
357
|
-
>
|
|
358
|
-
</SettingsButton>
|
|
359
|
-
)}
|
|
360
|
-
</div>
|
|
361
|
-
</SignedIn>
|
|
362
|
-
)}
|
|
363
|
-
{!authLoading && (
|
|
364
|
-
<SignedOut>
|
|
365
|
-
<SignInButton
|
|
366
|
-
size="sm"
|
|
367
|
-
onClick={() => setIsLoginOpen(true)}
|
|
368
|
-
aria-label="Login"
|
|
369
|
-
>
|
|
370
|
-
Login
|
|
371
|
-
</SignInButton>
|
|
372
|
-
<SignUpButton
|
|
373
|
-
size="sm"
|
|
374
|
-
onClick={() => setIsSignupOpen(true)}
|
|
375
|
-
aria-label="Sign Up"
|
|
376
|
-
>
|
|
377
|
-
Sign Up
|
|
378
|
-
</SignUpButton>
|
|
379
|
-
</SignedOut>
|
|
380
|
-
)}
|
|
381
|
-
</div>
|
|
382
|
-
|
|
383
|
-
{/* Bordered Div Now Only Contains Copyright Text */}
|
|
384
|
-
<div className="mt-8 pt-6 border-t border-gray-700 relative">
|
|
385
|
-
<div className="flex justify-center items-center w-full mx-auto max-w-full">
|
|
386
|
-
<p className="text-sm sm:text-base 2xl:text-lg text-gray-400 font-medium text-center">
|
|
387
|
-
© {new Date().getFullYear()} DevVista Kit. All rights reserved.
|
|
388
|
-
</p>
|
|
389
|
-
</div>
|
|
390
|
-
</div>
|
|
391
|
-
</div>
|
|
392
|
-
|
|
393
|
-
<AnimatePresence>
|
|
394
|
-
{isLoginOpen && (
|
|
395
|
-
<motion.div
|
|
396
|
-
initial={{ opacity: 0 }}
|
|
397
|
-
animate={{ opacity: 1 }}
|
|
398
|
-
exit={{ opacity: 0 }}
|
|
399
|
-
className="fixed inset-0 bg-black/90 flex items-center justify-center z-[10000] p-4 isolate"
|
|
400
|
-
onClick={() => setIsLoginOpen(false)}
|
|
401
|
-
>
|
|
402
|
-
<motion.div
|
|
403
|
-
initial={{ scale: 0.9, y: 20 }}
|
|
404
|
-
animate={{ scale: 1, y: 0 }}
|
|
405
|
-
exit={{ scale: 0.9, y: 20 }}
|
|
406
|
-
transition={{ type: "spring", damping: 25, stiffness: 300 }}
|
|
407
|
-
className="relative max-w-md w-full mx-4 modal-glassmorphism"
|
|
408
|
-
onClick={(e) => e.stopPropagation()}
|
|
409
|
-
>
|
|
410
|
-
<button
|
|
411
|
-
onClick={() => setIsLoginOpen(false)}
|
|
412
|
-
className="absolute right-2 md:right-14 top-2 z-50 text-gray-600 hover:text-white hover:bg-gray-700/50 rounded-full p-3 transition-all duration-200 w-12 h-12 flex items-center justify-center"
|
|
413
|
-
aria-label="Close login modal"
|
|
414
|
-
>
|
|
415
|
-
<X className="h-6 w-6" />
|
|
416
|
-
</button>
|
|
417
|
-
<SignIn routing="hash" />
|
|
418
|
-
</motion.div>
|
|
419
|
-
</motion.div>
|
|
420
|
-
)}
|
|
421
|
-
{isSignupOpen && (
|
|
422
|
-
<motion.div
|
|
423
|
-
initial={{ opacity: 0 }}
|
|
424
|
-
animate={{ opacity: 1 }}
|
|
425
|
-
exit={{ opacity: 0 }}
|
|
426
|
-
className="fixed inset-0 bg-black/90 flex items-center justify-center z-[10000] p-4 isolate"
|
|
427
|
-
onClick={() => setIsSignupOpen(false)}
|
|
428
|
-
>
|
|
429
|
-
<motion.div
|
|
430
|
-
initial={{ scale: 0.9, y: 20 }}
|
|
431
|
-
animate={{ scale: 1, y: 0 }}
|
|
432
|
-
exit={{ scale: 0.9, y: 20 }}
|
|
433
|
-
transition={{ type: "spring", damping: 25, stiffness: 300 }}
|
|
434
|
-
className="relative max-w-md w-full mx-4 modal-glassmorphism"
|
|
435
|
-
onClick={(e) => e.stopPropagation()}
|
|
436
|
-
>
|
|
437
|
-
<button
|
|
438
|
-
onClick={() => setIsSignupOpen(false)}
|
|
439
|
-
className="absolute right-2 md:right-14 top-2 z-50 text-gray-600 hover:text-white hover:bg-gray-700/50 rounded-full p-3 transition-all duration-200 w-12 h-12 flex items-center justify-center"
|
|
440
|
-
aria-label="Close signup modal"
|
|
441
|
-
>
|
|
442
|
-
<X className="h-6 w-6" />
|
|
443
|
-
</button>
|
|
444
|
-
<SignUp routing="hash" />
|
|
445
|
-
</motion.div>
|
|
446
|
-
</motion.div>
|
|
447
|
-
)}
|
|
448
|
-
{isAdminMenuOpen && isAdmin && (
|
|
449
|
-
<AdminMenu onClose={() => setIsAdminMenuOpen(false)} />
|
|
450
|
-
)}
|
|
451
|
-
</AnimatePresence>
|
|
452
|
-
</footer>
|
|
453
|
-
);
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import Link from "next/link";
|
|
4
|
+
import Image from "next/image";
|
|
5
|
+
import { Mail, Phone, MapPin, Facebook, LogIn, UserPlus, X, Settings, LogOut } from "lucide-react";
|
|
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";
|
|
9
|
+
import { motion, AnimatePresence } from "framer-motion";
|
|
10
|
+
import AdminMenu from "../other/admin-menu";
|
|
11
|
+
import { SignInButton, SignUpButton, SignOutButton, SettingsButton } from "../other/button";
|
|
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
|
+
const baseLinks = [
|
|
23
|
+
{ href: "/", label: "Home" },
|
|
24
|
+
{ href: "/about", label: "About" },
|
|
25
|
+
{ href: "/contact", label: "Contact" },
|
|
26
|
+
{ href: "/gallery", label: "Gallery" },
|
|
27
|
+
{ href: "/schedule", label: "Schedule & Rates" },
|
|
28
|
+
{ href: "/faq", label: "FAQ" },
|
|
29
|
+
];
|
|
30
|
+
|
|
31
|
+
export default function Footer() {
|
|
32
|
+
const { isSignedIn } = useAuth();
|
|
33
|
+
const { user, authLoading, checkSession } = useStrapiAuth();
|
|
34
|
+
const [isLoginOpen, setIsLoginOpen] = useState(false);
|
|
35
|
+
const [isSignupOpen, setIsSignupOpen] = useState(false);
|
|
36
|
+
const [isAdminMenuOpen, setIsAdminMenuOpen] = useState(false);
|
|
37
|
+
const [error, setError] = useState<string | null>(null);
|
|
38
|
+
|
|
39
|
+
useEffect(() => {
|
|
40
|
+
if (isSignedIn) {
|
|
41
|
+
setIsLoginOpen(false);
|
|
42
|
+
setIsSignupOpen(false);
|
|
43
|
+
setIsAdminMenuOpen(false);
|
|
44
|
+
}
|
|
45
|
+
}, [isSignedIn]);
|
|
46
|
+
|
|
47
|
+
useEffect(() => {
|
|
48
|
+
if (isLoginOpen || isSignupOpen || isAdminMenuOpen) {
|
|
49
|
+
document.body.style.overflow = "hidden";
|
|
50
|
+
} else {
|
|
51
|
+
document.body.style.overflow = "auto";
|
|
52
|
+
}
|
|
53
|
+
return () => {
|
|
54
|
+
document.body.style.overflow = "auto";
|
|
55
|
+
};
|
|
56
|
+
}, [isLoginOpen, isSignupOpen, isAdminMenuOpen]);
|
|
57
|
+
|
|
58
|
+
useEffect(() => {
|
|
59
|
+
const event = new CustomEvent("modalStateChange", {
|
|
60
|
+
detail: { isOpen: isLoginOpen || isSignupOpen || isAdminMenuOpen },
|
|
61
|
+
});
|
|
62
|
+
window.dispatchEvent(event);
|
|
63
|
+
}, [isLoginOpen, isSignupOpen, isAdminMenuOpen]);
|
|
64
|
+
|
|
65
|
+
useEffect(() => {
|
|
66
|
+
if (!authLoading) {
|
|
67
|
+
if (isSignedIn && !user) {
|
|
68
|
+
checkSession().catch((err) => {
|
|
69
|
+
console.error("Footer: Failed to sync user data", err);
|
|
70
|
+
setError("Failed to load user data. Please try logging out and back in.");
|
|
71
|
+
});
|
|
72
|
+
} else {
|
|
73
|
+
setError(null);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}, [isSignedIn, user, authLoading, checkSession]);
|
|
77
|
+
|
|
78
|
+
const isAdmin = isSignedIn && !!user?.businessAdminId && user?.userRole === "admin";
|
|
79
|
+
|
|
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
|
+
return (
|
|
89
|
+
<footer className="w-full bg-[#2D2D2D] text-gray-300 border-t border-gray-700">
|
|
90
|
+
<style jsx>{`
|
|
91
|
+
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700;800&display=swap');
|
|
92
|
+
|
|
93
|
+
:root {
|
|
94
|
+
--caviar: #2D2D2D;
|
|
95
|
+
--natural-white: #F7F7F7;
|
|
96
|
+
--blue-500: #3B82F6;
|
|
97
|
+
--blue-600: #2563EB;
|
|
98
|
+
--blue-700: #1D4ED8;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
* {
|
|
102
|
+
font-family: 'Inter', sans-serif;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
.glassmorphism {
|
|
106
|
+
background: rgba(255, 255, 255, 0.08);
|
|
107
|
+
backdrop-filter: blur(10px);
|
|
108
|
+
-webkit-backdrop-filter: blur(10px);
|
|
109
|
+
border: 1px solid rgba(255, 255, 255, 0.2);
|
|
110
|
+
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
.modal-glassmorphism {
|
|
114
|
+
background: rgba(255, 255, 255, 0.08);
|
|
115
|
+
backdrop-filter: blur(10px);
|
|
116
|
+
-webkit-backdrop-filter: blur(10px);
|
|
117
|
+
border: 2px solid transparent;
|
|
118
|
+
border-image: linear-gradient(45deg, var(--blue-500), var(--blue-600), var(--blue-700)) 1;
|
|
119
|
+
box-shadow: 0 16px 48px rgba(0, 0, 0, 0.1);
|
|
120
|
+
border-radius: 2rem;
|
|
121
|
+
max-height: 90vh;
|
|
122
|
+
overflow: hidden;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
.gradient-text {
|
|
126
|
+
background: linear-gradient(90deg, var(--blue-500), var(--blue-600));
|
|
127
|
+
-webkit-background-clip: text;
|
|
128
|
+
background-clip: text;
|
|
129
|
+
color: transparent;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
.contact-icon {
|
|
133
|
+
display: inline-flex;
|
|
134
|
+
align-items: center;
|
|
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;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
.cl-signIn-root .cl-main,
|
|
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;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
@supports not (backdrop-filter: blur(10px)) {
|
|
214
|
+
.glassmorphism,
|
|
215
|
+
.modal-glassmorphism {
|
|
216
|
+
background: rgba(255, 255, 255, 0.2);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
`}</style>
|
|
220
|
+
|
|
221
|
+
<div className="w-full px-4 sm:px-6 lg:px-8 2xl:px-24 py-12 sm:py-16 glassmorphism">
|
|
222
|
+
<div className="grid grid-cols-1 2xl:grid-cols-3 gap-8 sm:gap-12">
|
|
223
|
+
<div className="flex flex-col items-center 2xl:items-start">
|
|
224
|
+
<Link href="/" className="flex items-center space-x-4 mb-6">
|
|
225
|
+
<Image
|
|
226
|
+
src="/images/test.png"
|
|
227
|
+
alt="DevVista Kit Logo"
|
|
228
|
+
width={64}
|
|
229
|
+
height={64}
|
|
230
|
+
className="h-20 w-20 rounded-full shadow-md transition-transform duration-300 ease-in-out transform hover:scale-105"
|
|
231
|
+
quality={80}
|
|
232
|
+
loading="lazy"
|
|
233
|
+
/>
|
|
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
|
+
</Link>
|
|
244
|
+
<p className="text-sm sm:text-base 2xl:text-lg text-gray-400 text-center 2xl:text-left font-medium">
|
|
245
|
+
The Official DevVista Kit
|
|
246
|
+
</p>
|
|
247
|
+
</div>
|
|
248
|
+
|
|
249
|
+
<div className="flex flex-col items-center">
|
|
250
|
+
<h3 className="text-lg sm:text-xl 2xl:text-2xl font-bold gradient-text mb-6 uppercase tracking-tight">
|
|
251
|
+
Quick Links
|
|
252
|
+
</h3>
|
|
253
|
+
<ul className="grid grid-cols-2 gap-x-4 gap-y-3 text-center">
|
|
254
|
+
{baseLinks.map((link) => (
|
|
255
|
+
<li key={link.href}>
|
|
256
|
+
<Link
|
|
257
|
+
href={link.href}
|
|
258
|
+
className="text-sm sm:text-base 2xl:text-lg font-medium uppercase text-gray-300 hover:text-blue-400 transition-all"
|
|
259
|
+
>
|
|
260
|
+
{link.label}
|
|
261
|
+
</Link>
|
|
262
|
+
</li>
|
|
263
|
+
))}
|
|
264
|
+
</ul>
|
|
265
|
+
</div>
|
|
266
|
+
|
|
267
|
+
<div className="flex flex-col items-center 2xl:items-end">
|
|
268
|
+
<h3 className="text-lg sm:text-xl 2xl:text-2xl font-bold gradient-text mb-6 uppercase tracking-tight">
|
|
269
|
+
Reach Out
|
|
270
|
+
</h3>
|
|
271
|
+
<ul className="flex space-x-4 2xl:hidden">
|
|
272
|
+
<li>
|
|
273
|
+
<a href="tel:3154154043" className="contact-icon text-gray-300" aria-label="Call 123-456-7892">
|
|
274
|
+
<Phone className="h-6 w-6 sm:h-8 sm:w-8 text-blue-500" />
|
|
275
|
+
</a>
|
|
276
|
+
</li>
|
|
277
|
+
<li>
|
|
278
|
+
<a href="mailto:devvistainfo@gmail.com" className="contact-icon text-gray-300" aria-label="Email devvistainfo@gmail.com">
|
|
279
|
+
<Mail className="h-6 w-6 sm:h-8 sm:w-8 text-blue-500" />
|
|
280
|
+
</a>
|
|
281
|
+
</li>
|
|
282
|
+
<li>
|
|
283
|
+
<a
|
|
284
|
+
href="https://www.google.com/maps/place/215+W+Manlius+St,+East+Syracuse,+NY+13057"
|
|
285
|
+
className="contact-icon text-gray-300"
|
|
286
|
+
aria-label="View 123 Syracuse, NY 12345 on Google Maps"
|
|
287
|
+
target="_blank"
|
|
288
|
+
rel="noopener noreferrer"
|
|
289
|
+
>
|
|
290
|
+
<MapPin className="h-6 w-6 sm:h-8 sm:w-8 text-blue-500" />
|
|
291
|
+
</a>
|
|
292
|
+
</li>
|
|
293
|
+
<li>
|
|
294
|
+
<a
|
|
295
|
+
href="https://www.facebook.com/"
|
|
296
|
+
className="contact-icon text-gray-300"
|
|
297
|
+
aria-label="Visit our Facebook page"
|
|
298
|
+
target="_blank"
|
|
299
|
+
rel="noopener noreferrer"
|
|
300
|
+
>
|
|
301
|
+
<Facebook className="h-6 w-6 sm:h-8 sm:w-8 text-blue-500" />
|
|
302
|
+
</a>
|
|
303
|
+
</li>
|
|
304
|
+
</ul>
|
|
305
|
+
<ul className="space-y-3 text-center 2xl:text-right hidden 2xl:block">
|
|
306
|
+
<li className="text-sm sm:text-base 2xl:text-lg text-gray-300 font-medium">
|
|
307
|
+
123 Syracuse, NY 12345
|
|
308
|
+
</li>
|
|
309
|
+
<li className="flex items-center justify-center 2xl:justify-end space-x-3">
|
|
310
|
+
<Phone className="h-4 w-4 sm:h-5 sm:w-5 text-blue-500" />
|
|
311
|
+
<a href="tel:3152145466" className="text-sm sm:text-base 2xl:text-lg text-gray-300 font-medium hover:text-blue-400 transition-all">
|
|
312
|
+
123-456-7891
|
|
313
|
+
</a>
|
|
314
|
+
</li>
|
|
315
|
+
<li className="flex items-center justify-center 2xl:justify-end space-x-3">
|
|
316
|
+
<Phone className="h-4 w-4 sm:h-5 sm:w-5 text-blue-500" />
|
|
317
|
+
<a href="tel:3154154043" className="text-sm sm:text-base 2xl:text-lg text-gray-300 font-medium hover:text-blue-400 transition-all">
|
|
318
|
+
123-456-7892
|
|
319
|
+
</a>
|
|
320
|
+
</li>
|
|
321
|
+
<li className="flex items-center justify-center 2xl:justify-end space-x-3">
|
|
322
|
+
<Mail className="h-4 w-4 sm:h-5 sm:w-5 text-blue-500" />
|
|
323
|
+
<a href="mailto:devvistainfo@gmail.com" className="text-sm sm:text-base 2xl:text-lg text-gray-300 font-medium hover:text-blue-400 transition-all">
|
|
324
|
+
devvistainfo@gmail.com
|
|
325
|
+
</a>
|
|
326
|
+
</li>
|
|
327
|
+
<li className="flex items-center justify-center 2xl:justify-end space-x-3">
|
|
328
|
+
<Facebook className="h-4 w-4 sm:h-5 sm:w-5 text-blue-500" />
|
|
329
|
+
<a
|
|
330
|
+
href="https://www.facebook.com/"
|
|
331
|
+
className="text-sm sm:text-base 2xl:text-lg text-gray-300 font-medium hover:text-blue-400 transition-all"
|
|
332
|
+
target="_blank"
|
|
333
|
+
rel="noopener noreferrer"
|
|
334
|
+
>
|
|
335
|
+
Facebook
|
|
336
|
+
</a>
|
|
337
|
+
</li>
|
|
338
|
+
</ul>
|
|
339
|
+
</div>
|
|
340
|
+
</div>
|
|
341
|
+
|
|
342
|
+
{/* Authentication Buttons Moved Above the Bordered Div */}
|
|
343
|
+
<div className="flex justify-center 2xl:justify-start mt-8 space-x-4 admin-menu-container">
|
|
344
|
+
{!authLoading && (
|
|
345
|
+
<SignedIn>
|
|
346
|
+
<div className="flex items-center space-x-2">
|
|
347
|
+
<ClerkSignOutButton redirectUrl="/">
|
|
348
|
+
<SignOutButton size="sm" aria-label="Logout">
|
|
349
|
+
Logout
|
|
350
|
+
</SignOutButton>
|
|
351
|
+
</ClerkSignOutButton>
|
|
352
|
+
{isAdmin && (
|
|
353
|
+
<SettingsButton
|
|
354
|
+
size="sm"
|
|
355
|
+
onClick={() => setIsAdminMenuOpen(true)}
|
|
356
|
+
aria-label="Admin Menu"
|
|
357
|
+
>
|
|
358
|
+
</SettingsButton>
|
|
359
|
+
)}
|
|
360
|
+
</div>
|
|
361
|
+
</SignedIn>
|
|
362
|
+
)}
|
|
363
|
+
{!authLoading && (
|
|
364
|
+
<SignedOut>
|
|
365
|
+
<SignInButton
|
|
366
|
+
size="sm"
|
|
367
|
+
onClick={() => setIsLoginOpen(true)}
|
|
368
|
+
aria-label="Login"
|
|
369
|
+
>
|
|
370
|
+
Login
|
|
371
|
+
</SignInButton>
|
|
372
|
+
<SignUpButton
|
|
373
|
+
size="sm"
|
|
374
|
+
onClick={() => setIsSignupOpen(true)}
|
|
375
|
+
aria-label="Sign Up"
|
|
376
|
+
>
|
|
377
|
+
Sign Up
|
|
378
|
+
</SignUpButton>
|
|
379
|
+
</SignedOut>
|
|
380
|
+
)}
|
|
381
|
+
</div>
|
|
382
|
+
|
|
383
|
+
{/* Bordered Div Now Only Contains Copyright Text */}
|
|
384
|
+
<div className="mt-8 pt-6 border-t border-gray-700 relative">
|
|
385
|
+
<div className="flex justify-center items-center w-full mx-auto max-w-full">
|
|
386
|
+
<p className="text-sm sm:text-base 2xl:text-lg text-gray-400 font-medium text-center">
|
|
387
|
+
© {new Date().getFullYear()} DevVista Kit. All rights reserved.
|
|
388
|
+
</p>
|
|
389
|
+
</div>
|
|
390
|
+
</div>
|
|
391
|
+
</div>
|
|
392
|
+
|
|
393
|
+
<AnimatePresence>
|
|
394
|
+
{isLoginOpen && (
|
|
395
|
+
<motion.div
|
|
396
|
+
initial={{ opacity: 0 }}
|
|
397
|
+
animate={{ opacity: 1 }}
|
|
398
|
+
exit={{ opacity: 0 }}
|
|
399
|
+
className="fixed inset-0 bg-black/90 flex items-center justify-center z-[10000] p-4 isolate"
|
|
400
|
+
onClick={() => setIsLoginOpen(false)}
|
|
401
|
+
>
|
|
402
|
+
<motion.div
|
|
403
|
+
initial={{ scale: 0.9, y: 20 }}
|
|
404
|
+
animate={{ scale: 1, y: 0 }}
|
|
405
|
+
exit={{ scale: 0.9, y: 20 }}
|
|
406
|
+
transition={{ type: "spring", damping: 25, stiffness: 300 }}
|
|
407
|
+
className="relative max-w-md w-full mx-4 modal-glassmorphism"
|
|
408
|
+
onClick={(e) => e.stopPropagation()}
|
|
409
|
+
>
|
|
410
|
+
<button
|
|
411
|
+
onClick={() => setIsLoginOpen(false)}
|
|
412
|
+
className="absolute right-2 md:right-14 top-2 z-50 text-gray-600 hover:text-white hover:bg-gray-700/50 rounded-full p-3 transition-all duration-200 w-12 h-12 flex items-center justify-center"
|
|
413
|
+
aria-label="Close login modal"
|
|
414
|
+
>
|
|
415
|
+
<X className="h-6 w-6" />
|
|
416
|
+
</button>
|
|
417
|
+
<SignIn routing="hash" />
|
|
418
|
+
</motion.div>
|
|
419
|
+
</motion.div>
|
|
420
|
+
)}
|
|
421
|
+
{isSignupOpen && (
|
|
422
|
+
<motion.div
|
|
423
|
+
initial={{ opacity: 0 }}
|
|
424
|
+
animate={{ opacity: 1 }}
|
|
425
|
+
exit={{ opacity: 0 }}
|
|
426
|
+
className="fixed inset-0 bg-black/90 flex items-center justify-center z-[10000] p-4 isolate"
|
|
427
|
+
onClick={() => setIsSignupOpen(false)}
|
|
428
|
+
>
|
|
429
|
+
<motion.div
|
|
430
|
+
initial={{ scale: 0.9, y: 20 }}
|
|
431
|
+
animate={{ scale: 1, y: 0 }}
|
|
432
|
+
exit={{ scale: 0.9, y: 20 }}
|
|
433
|
+
transition={{ type: "spring", damping: 25, stiffness: 300 }}
|
|
434
|
+
className="relative max-w-md w-full mx-4 modal-glassmorphism"
|
|
435
|
+
onClick={(e) => e.stopPropagation()}
|
|
436
|
+
>
|
|
437
|
+
<button
|
|
438
|
+
onClick={() => setIsSignupOpen(false)}
|
|
439
|
+
className="absolute right-2 md:right-14 top-2 z-50 text-gray-600 hover:text-white hover:bg-gray-700/50 rounded-full p-3 transition-all duration-200 w-12 h-12 flex items-center justify-center"
|
|
440
|
+
aria-label="Close signup modal"
|
|
441
|
+
>
|
|
442
|
+
<X className="h-6 w-6" />
|
|
443
|
+
</button>
|
|
444
|
+
<SignUp routing="hash" />
|
|
445
|
+
</motion.div>
|
|
446
|
+
</motion.div>
|
|
447
|
+
)}
|
|
448
|
+
{isAdminMenuOpen && isAdmin && (
|
|
449
|
+
<AdminMenu onClose={() => setIsAdminMenuOpen(false)} />
|
|
450
|
+
)}
|
|
451
|
+
</AnimatePresence>
|
|
452
|
+
</footer>
|
|
453
|
+
);
|
|
454
454
|
}
|