4 Commits

Author SHA1 Message Date
1d9b6761ac Update src/app/layout.tsx 2026-03-08 05:14:58 +00:00
158ab106a8 Update src/app/page.tsx 2026-03-08 05:14:06 +00:00
f130209cd1 Update src/app/layout.tsx 2026-03-08 05:14:06 +00:00
1b34d4981f Merge version_1 into main
Merge version_1 into main
2026-03-08 05:00:26 +00:00
2 changed files with 85 additions and 60 deletions

View File

@@ -1,48 +1,38 @@
import type { Metadata } from "next"; import type { Metadata } from "next";
import { Halant } from "next/font/google";
import { Inter } from "next/font/google"; import { Inter } from "next/font/google";
import "./globals.css"; import "./globals.css";
import { ServiceWrapper } from "@/components/ServiceWrapper";
import Tag from "@/tag/Tag";
const halant = Halant({
variable: "--font-halant", subsets: ["latin"],
weight: ["300", "400", "500", "600", "700"],
});
const inter = Inter({ const inter = Inter({
variable: "--font-inter", subsets: ["latin"], variable: "--font-inter", subsets: ["latin"],
}); });
export const metadata: Metadata = { export const metadata: Metadata = {
title: "MG Junk Removal | Professional Hauling Services", description: "Fast, reliable junk removal for residential, commercial, and construction debris. Damage-free guarantee. Transparent pricing. Quote in 15 minutes.", keywords: "junk removal, debris hauling, residential cleanup, commercial junk removal, construction cleanup, professional hauling", robots: { title: "MG Junk Removal | Professional Service, Transparent Pricing", description: "Fast, reliable junk removal with upfront pricing and zero damage guarantee. Same-day quotes and professional crews."};
index: true,
follow: true,
},
openGraph: {
title: "MG Junk Removal | Professional Hauling Services", description: "Fast, reliable junk removal for residential, commercial, and construction debris. Damage-free guarantee. Transparent pricing. Quote in 15 minutes.", type: "website", siteName: "MG Junk Removal", images: [
{
url: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AeF2nBkuTBNPSJvZN5m49LNtNg/uploaded-1772945874277-vt9q76uj.png", alt: "Professional junk removal truck"},
],
},
twitter: {
card: "summary_large_image", title: "MG Junk Removal | Professional Hauling Services", description: "Fast, reliable junk removal for residential, commercial, and construction debris. Damage-free guarantee.", images: ["https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AeF2nBkuTBNPSJvZN5m49LNtNg/uploaded-1772945874277-vt9q76uj.png"],
},
};
export default function RootLayout({ export default function RootLayout({
children, children,
}: Readonly<{ }: {
children: React.ReactNode; children: React.ReactNode;
}>) { }) {
return ( return (
<html lang="en" suppressHydrationWarning> <html lang="en" suppressHydrationWarning>
<ServiceWrapper> <head>
<body <script
className={`${halant.variable} ${inter.variable} antialiased`} dangerouslySetInnerHTML={{
> __html: `
<Tag /> try {
{children} if (localStorage.theme === 'dark' || (!('theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
document.documentElement.classList.add('dark')
} else {
document.documentElement.classList.remove('dark')
}
} catch (e) {}
`,
}}
/>
</head>
<body className={`${inter.variable} antialiased`} suppressHydrationWarning>
{children}
<script <script
dangerouslySetInnerHTML={{ dangerouslySetInnerHTML={{
@@ -1411,7 +1401,6 @@ export default function RootLayout({
}} }}
/> />
</body> </body>
</ServiceWrapper>
</html> </html>
); );
} }

View File

@@ -10,8 +10,55 @@ import TestimonialCardFifteen from "@/components/sections/testimonial/Testimonia
import ContactSplit from "@/components/sections/contact/ContactSplit"; import ContactSplit from "@/components/sections/contact/ContactSplit";
import FooterMedia from "@/components/sections/footer/FooterMedia"; import FooterMedia from "@/components/sections/footer/FooterMedia";
import { Truck, CheckCircle, Shield, Award, Clock, Star, Phone } from "lucide-react"; import { Truck, CheckCircle, Shield, Award, Clock, Star, Phone } from "lucide-react";
import { useState } from "react";
export default function LandingPage() { export default function LandingPage() {
const [formData, setFormData] = useState({ email: "", name: "" });
const [submissionStatus, setSubmissionStatus] = useState<"idle" | "loading" | "success" | "error">("idle");
const [confirmationCode, setConfirmationCode] = useState<string | null>(null);
const generateConfirmationCode = (): string => {
return Math.floor(100000 + Math.random() * 900000).toString();
};
const handleQuoteSubmit = async (email: string) => {
setFormData(prev => ({ ...prev, email }));
setSubmissionStatus("loading");
try {
const code = generateConfirmationCode();
setConfirmationCode(code);
// Extract first name from email if not already set
const firstName = formData.name || email.split("@")[0].split(".")[0];
const response = await fetch("https://formspree.io/f/xjkbygyp", {
method: "POST", headers: {
"Accept": "application/json", "Content-Type": "application/json"},
body: JSON.stringify({
email: email,
name: firstName,
message: `Quote Request from ${firstName}. Confirmation Code: ${code}`,
_subject: `MG Junk Removal Quote Request - ${code}`,
}),
});
if (response.ok) {
setSubmissionStatus("success");
// Reset form after 3 seconds
setTimeout(() => {
setFormData({ email: "", name: "" });
setSubmissionStatus("idle");
}, 3000);
} else {
setSubmissionStatus("error");
}
} catch (error) {
console.error("Form submission error:", error);
setSubmissionStatus("error");
}
};
return ( return (
<ThemeProvider <ThemeProvider
defaultButtonVariant="bounce-effect" defaultButtonVariant="bounce-effect"
@@ -58,16 +105,13 @@ export default function LandingPage() {
testimonials={[ testimonials={[
{ {
name: "James Mitchell", handle: "Homeowner, Detroit MI", testimonial: "Fastest quote I've ever gotten. They showed up on time, worked efficiently, and left zero damage.", rating: 5, name: "James Mitchell", handle: "Homeowner, Detroit MI", testimonial: "Fastest quote I've ever gotten. They showed up on time, worked efficiently, and left zero damage.", rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/closeup-handsome-young-office-worker-glasses-suit-smiling-camera-looking-happy-white_1258-173667.jpg" imageSrc: "http://img.b2bpic.net/free-photo/closeup-handsome-young-office-worker-glasses-suit-smiling-camera-looking-happy-white_1258-173667.jpg"},
},
{ {
name: "Sarah Chen", handle: "Property Manager, Chicago IL", testimonial: "Professional team. Bilingual support. Firm pricing. Exactly what we needed for our commercial properties.", rating: 5, name: "Sarah Chen", handle: "Property Manager, Chicago IL", testimonial: "Professional team. Bilingual support. Firm pricing. Exactly what we needed for our commercial properties.", rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/young-attractive-businesswoman_93675-133773.jpg" imageSrc: "http://img.b2bpic.net/free-photo/young-attractive-businesswoman_93675-133773.jpg"},
},
{ {
name: "Marcus Johnson", handle: "Contractor, Atlanta GA", testimonial: "Same-day availability for construction debris. Reliable, fast, and reasonably priced.", rating: 5, name: "Marcus Johnson", handle: "Contractor, Atlanta GA", testimonial: "Same-day availability for construction debris. Reliable, fast, and reasonably priced.", rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/solar-panels-industry-technician-high-tech-factory-inspection-quality-control-production_482257-132256.jpg" imageSrc: "http://img.b2bpic.net/free-photo/solar-panels-industry-technician-high-tech-factory-inspection-quality-control-production_482257-132256.jpg"},
},
]} ]}
testimonialRotationInterval={5000} testimonialRotationInterval={5000}
/> />
@@ -82,14 +126,11 @@ export default function LandingPage() {
tagAnimation="slide-up" tagAnimation="slide-up"
features={[ features={[
{ {
id: "01", title: "Schedule", description: "Book online or call. Same-day or next-day availability. No long wait times.", imageSrc: "http://img.b2bpic.net/free-vector/medical-booking-application_23-2148558680.jpg", imageAlt: "Easy scheduling interface" id: "01", title: "Schedule", description: "Book online or call. Same-day or next-day availability. No long wait times.", imageSrc: "http://img.b2bpic.net/free-vector/medical-booking-application_23-2148558680.jpg", imageAlt: "Easy scheduling interface"},
},
{ {
id: "02", title: "Upfront Quote", description: "15-minute phone assessment. Firm pricing. No hidden fees or surprises.", imageSrc: "http://img.b2bpic.net/free-vector/hand-drawn-bankruptcy-concept_23-2148493435.jpg", imageAlt: "Transparent pricing consultation" id: "02", title: "Upfront Quote", description: "15-minute phone assessment. Firm pricing. No hidden fees or surprises.", imageSrc: "http://img.b2bpic.net/free-vector/hand-drawn-bankruptcy-concept_23-2148493435.jpg", imageAlt: "Transparent pricing consultation"},
},
{ {
id: "03", title: "Professional Haul", description: "Expert crew. Careful loading. Full cleanup. Damage-free guarantee.", imageSrc: "http://img.b2bpic.net/free-photo/african-american-activist-volunteering-tidy-forest-ecosystem_482257-93953.jpg", imageAlt: "Professional junk removal team at work" id: "03", title: "Professional Haul", description: "Expert crew. Careful loading. Full cleanup. Damage-free guarantee.", imageSrc: "http://img.b2bpic.net/free-photo/african-american-activist-volunteering-tidy-forest-ecosystem_482257-93953.jpg", imageAlt: "Professional junk removal team at work"},
},
]} ]}
gridVariant="three-columns-all-equal-width" gridVariant="three-columns-all-equal-width"
animationType="slide-up" animationType="slide-up"
@@ -149,23 +190,17 @@ export default function LandingPage() {
author="Robert Williams, Homeowner" author="Robert Williams, Homeowner"
avatars={[ avatars={[
{ {
src: "http://img.b2bpic.net/free-photo/handsome-business-man-wearing-suit-looking-camera-smiling-broadly-with-happy-face-standing-white-background_141793-54115.jpg", alt: "Customer testimonial avatar 1" src: "http://img.b2bpic.net/free-photo/handsome-business-man-wearing-suit-looking-camera-smiling-broadly-with-happy-face-standing-white-background_141793-54115.jpg", alt: "Customer testimonial avatar 1"},
},
{ {
src: "http://img.b2bpic.net/free-photo/portrait-young-attractive-woman-elegant-hotel-cafeteria_657883-403.jpg", alt: "Customer testimonial avatar 2" src: "http://img.b2bpic.net/free-photo/portrait-young-attractive-woman-elegant-hotel-cafeteria_657883-403.jpg", alt: "Customer testimonial avatar 2"},
},
{ {
src: "http://img.b2bpic.net/free-photo/close-up-portrait-young-bearded-man-white-shirt-jacket-posing-camera-with-broad-smile-isolated-gray_171337-629.jpg", alt: "Customer testimonial avatar 3" src: "http://img.b2bpic.net/free-photo/close-up-portrait-young-bearded-man-white-shirt-jacket-posing-camera-with-broad-smile-isolated-gray_171337-629.jpg", alt: "Customer testimonial avatar 3"},
},
{ {
src: "http://img.b2bpic.net/free-vector/man-avatar-collection_24908-60247.jpg", alt: "Customer testimonial avatar 4" src: "http://img.b2bpic.net/free-vector/man-avatar-collection_24908-60247.jpg", alt: "Customer testimonial avatar 4"},
},
{ {
src: "http://img.b2bpic.net/free-photo/young-beautiful-stylish-woman-with-natural-curly-hairstyle-smiling-positive-emotion-happy-isolated-white-background-summer-fashion-trend-hipster-style-looking-camera-green-vest_285396-2925.jpg", alt: "Customer testimonial avatar 5" src: "http://img.b2bpic.net/free-photo/young-beautiful-stylish-woman-with-natural-curly-hairstyle-smiling-positive-emotion-happy-isolated-white-background-summer-fashion-trend-hipster-style-looking-camera-green-vest_285396-2925.jpg", alt: "Customer testimonial avatar 5"},
},
{ {
src: "http://img.b2bpic.net/free-photo/smart-looking-teacher_53876-23045.jpg", alt: "Customer testimonial avatar 6" src: "http://img.b2bpic.net/free-photo/smart-looking-teacher_53876-23045.jpg", alt: "Customer testimonial avatar 6"},
},
]} ]}
ratingAnimation="slide-up" ratingAnimation="slide-up"
avatarsAnimation="slide-up" avatarsAnimation="slide-up"
@@ -176,8 +211,8 @@ export default function LandingPage() {
<div id="contact" data-section="contact"> <div id="contact" data-section="contact">
<ContactSplit <ContactSplit
tag="Get Started" tag="Get Started"
title="Your Quote Awaits" title={confirmationCode ? `Welcome! Your Code: ${confirmationCode}` : "Your Quote Awaits"}
description="Fill out our quick assessment form or call us directly. Response guaranteed within 15 minutes during business hours." description={confirmationCode ? `Thanks for reaching out! We've sent a confirmation email to ${formData.email}. Our team will contact you within 15 minutes.` : "Fill out our quick assessment form or call us directly. Response guaranteed within 15 minutes during business hours."}
tagIcon={Phone} tagIcon={Phone}
tagAnimation="slide-up" tagAnimation="slide-up"
background={{ variant: "sparkles-gradient" }} background={{ variant: "sparkles-gradient" }}
@@ -186,9 +221,10 @@ export default function LandingPage() {
imageAlt="MG Junk Removal team ready to help" imageAlt="MG Junk Removal team ready to help"
mediaAnimation="opacity" mediaAnimation="opacity"
mediaPosition="right" mediaPosition="right"
inputPlaceholder="your@email.com" inputPlaceholder={submissionStatus === "success" ? "Quote request submitted!" : "your@email.com"}
buttonText="Get Quote" buttonText={submissionStatus === "loading" ? "Sending..." : "Get Quote"}
termsText="We respect your privacy. Unsubscribe at any time. By submitting, you agree to our Terms and Conditions." termsText="We respect your privacy. Unsubscribe at any time. By submitting, you agree to our Terms and Conditions."
onSubmit={handleQuoteSubmit}
/> />
</div> </div>