42 Commits

Author SHA1 Message Date
1d9349c15d Update src/app/page.tsx 2026-03-06 00:18:00 +00:00
e92f8bfe99 Update src/app/layout.tsx 2026-03-06 00:18:00 +00:00
51e34f4b29 Merge version_6 into main
Merge version_6 into main
2026-03-06 00:15:00 +00:00
812ca9ef84 Update src/app/page.tsx 2026-03-06 00:14:56 +00:00
55ed7a7d9f Merge version_6 into main
Merge version_6 into main
2026-03-06 00:13:13 +00:00
605f8bdf62 Update src/app/page.tsx 2026-03-06 00:13:09 +00:00
87bec05b7e Merge version_6 into main
Merge version_6 into main
2026-03-06 00:11:32 +00:00
43c9bc334a Update src/app/page.tsx 2026-03-06 00:11:28 +00:00
13e2614fdb Update src/app/layout.tsx 2026-03-06 00:11:27 +00:00
4a6a6f1a7f Merge version_6 into main
Merge version_6 into main
2026-03-06 00:09:40 +00:00
fbe218e325 Update src/app/page.tsx 2026-03-06 00:09:36 +00:00
52b726e20a Merge version_6 into main
Merge version_6 into main
2026-03-06 00:07:54 +00:00
3124ddf4bf Update src/app/page.tsx 2026-03-06 00:07:50 +00:00
a3a623d06a Merge version_6 into main
Merge version_6 into main
2026-03-06 00:06:07 +00:00
21bec54d83 Update src/app/page.tsx 2026-03-06 00:06:03 +00:00
9dbcf34068 Merge version_6 into main
Merge version_6 into main
2026-03-06 00:04:21 +00:00
d43a1af899 Update src/app/page.tsx 2026-03-06 00:04:11 +00:00
203283c134 Merge version_6 into main
Merge version_6 into main
2026-03-06 00:02:25 +00:00
fa437999a3 Update src/app/page.tsx 2026-03-06 00:02:21 +00:00
18959feb6a Merge version_6 into main
Merge version_6 into main
2026-03-06 00:00:38 +00:00
4a97a8eaf9 Update src/app/page.tsx 2026-03-06 00:00:34 +00:00
43bee4235f Update src/app/layout.tsx 2026-03-06 00:00:34 +00:00
e14e26ec5b Merge version_3 into main
Merge version_3 into main
2026-03-05 23:57:45 +00:00
abc34c7bb7 Update theme fonts 2026-03-05 23:57:41 +00:00
67adf66cd9 Update theme fonts 2026-03-05 23:57:41 +00:00
70055d040a Switch to version 3: modified src/app/page.tsx 2026-03-05 23:56:07 +00:00
53692691ca Switch to version 4: modified src/app/page.tsx 2026-03-05 23:56:00 +00:00
4c56d54f72 Switch to version 4: modified src/app/layout.tsx 2026-03-05 23:56:00 +00:00
3ed757eeb7 Merge version_5 into main
Merge version_5 into main
2026-03-05 23:06:34 +00:00
6ecb80f5f1 Update src/app/page.tsx 2026-03-05 23:06:29 +00:00
a91830f1d8 Merge version_5 into main
Merge version_5 into main
2026-03-05 23:04:50 +00:00
86f3a04a34 Update src/app/page.tsx 2026-03-05 23:04:46 +00:00
4493b29637 Update src/app/layout.tsx 2026-03-05 23:04:45 +00:00
7b760bc1de Merge version_4 into main
Merge version_4 into main
2026-03-05 22:56:24 +00:00
dc074890c8 Update src/app/page.tsx 2026-03-05 22:56:20 +00:00
84791df8f1 Merge version_4 into main
Merge version_4 into main
2026-03-05 22:54:36 +00:00
e08c865688 Update src/app/page.tsx 2026-03-05 22:54:32 +00:00
6ddaa22e34 Merge version_3 into main
Merge version_3 into main
2026-03-05 22:39:44 +00:00
f2bbaedad3 Update src/app/page.tsx 2026-03-05 22:39:40 +00:00
c1e013573a Update src/app/layout.tsx 2026-03-05 22:39:39 +00:00
4283aceccf Merge version_2 into main
Merge version_2 into main
2026-03-05 22:34:03 +00:00
2e59ee87a7 Merge version_2 into main
Merge version_2 into main
2026-03-05 22:33:13 +00:00
3 changed files with 219 additions and 98 deletions

View File

@@ -1,14 +1,11 @@
import type { Metadata } from "next"; import type { Metadata } from "next";
import { Manrope } from "next/font/google"; import { Raleway } from "next/font/google";
import "./styles/variables.css";
import "./globals.css"; import "./globals.css";
const manrope = Manrope({ const raleway = Raleway({ subsets: ["latin"] });
variable: "--font-manrope", subsets: ["latin"],
});
export const metadata: Metadata = { export const metadata: Metadata = {
title: "Taishan Construction | Premium Hardscape & Building Services Toronto", description: "Premium interlock driveways, patios, landscaping & construction services across the GTA. Free 3D design, expert installation, luxury results."}; title: "Taishan Construction - Premium Hardscape & Construction Services Toronto", description: "Premium landscaping and construction services across the GTA. Free 3D design, professional installation, material showroom."};
export default function RootLayout({ export default function RootLayout({
children, children,
@@ -17,9 +14,7 @@ export default function RootLayout({
}) { }) {
return ( return (
<html lang="en"> <html lang="en">
<body className={`${manrope.variable} antialiased`}> <body className={raleway.className}>{children}
{children}
<script <script
dangerouslySetInnerHTML={{ dangerouslySetInnerHTML={{
__html: ` __html: `

View File

@@ -11,8 +11,82 @@ import TestimonialCardTen from '@/components/sections/testimonial/TestimonialCar
import ContactFaq from '@/components/sections/contact/ContactFaq'; import ContactFaq from '@/components/sections/contact/ContactFaq';
import FooterBaseReveal from '@/components/sections/footer/FooterBaseReveal'; import FooterBaseReveal from '@/components/sections/footer/FooterBaseReveal';
import { Building2, Eye, CheckCircle2, Palette, Users, MessageCircle, Sparkles, ArrowRightLeft, Cog, Footprints, Home, Zap, Shield, Hammer, Trees, Droplet, Frame, Lightbulb, Crown, Phone } from 'lucide-react'; import { Building2, Eye, CheckCircle2, Palette, Users, MessageCircle, Sparkles, ArrowRightLeft, Cog, Footprints, Home, Zap, Shield, Hammer, Trees, Droplet, Frame, Lightbulb, Crown, Phone } from 'lucide-react';
import React, { useState } from 'react';
import Link from 'next/link';
interface BeforeAfterImagePair {
beforeSrc: string;
afterSrc: string;
title: string;
}
const BeforeAfterCard: React.FC<{
pair: BeforeAfterImagePair;
isHovered: boolean;
}> = ({ pair, isHovered }) => {
const [sliderPosition, setSliderPosition] = useState(50);
const handleMouseMove = (e: React.MouseEvent<HTMLDivElement>) => {
const rect = e.currentTarget.getBoundingClientRect();
const newPosition = ((e.clientX - rect.left) / rect.width) * 100;
setSliderPosition(Math.max(0, Math.min(100, newPosition)));
};
return (
<div
className="relative w-full h-64 rounded-lg overflow-hidden cursor-col-resize bg-gray-900"
onMouseMove={handleMouseMove}
onMouseLeave={() => setSliderPosition(50)}
>
<div className="absolute inset-0">
<img
src={pair.afterSrc}
alt="After"
className="w-full h-full object-cover"
/>
</div>
<div
className="absolute inset-0 overflow-hidden"
style={{ width: `${sliderPosition}%` }}
>
<img
src={pair.beforeSrc}
alt="Before"
className="w-full h-full object-cover"
style={{ width: `${(100 / sliderPosition) * 100}%` }}
/>
</div>
<div
className="absolute top-0 bottom-0 w-1 bg-white shadow-lg transition-colors"
style={{ left: `${sliderPosition}%`, transform: 'translateX(-50%)' }}
>
<div className="absolute top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 bg-white rounded-full p-2 shadow-lg">
<ArrowRightLeft size={16} className="text-gray-900" />
</div>
</div>
<div className="absolute bottom-0 left-0 right-0 bg-gradient-to-t from-black/80 to-transparent p-3">
<p className="text-white text-sm font-semibold">{pair.title}</p>
</div>
</div>
);
};
export default function LandingPage() { export default function LandingPage() {
const [servicesHoveredCard, setServicesHoveredCard] = useState<string | null>(null);
const [galleryHoveredCard, setGalleryHoveredCard] = useState<string | null>(null);
const beforeAfterPairs: BeforeAfterImagePair[] = [
{
beforeSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AXh5KliD4l7rWjrQZkOq7ZuPnH/uploaded-1772749929936-lbulq2e9.jpg?_wi=1", afterSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AXh5KliD4l7rWjrQZkOq7ZuPnH/uploaded-1772749929936-uklcyhsf.jpg?_wi=1", title: "Rendering vs. Completed Project"
},
{
beforeSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AXh5KliD4l7rWjrQZkOq7ZuPnH/uploaded-1772749929936-ok3joqnq.jpg?_wi=1", afterSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AXh5KliD4l7rWjrQZkOq7ZuPnH/uploaded-1772749929936-heyeujvs.jpg?_wi=1", title: "3D Design to Reality"
},
{
beforeSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AXh5KliD4l7rWjrQZkOq7ZuPnH/uploaded-1772749929936-uklcyhsf.jpg?_wi=2", afterSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AXh5KliD4l7rWjrQZkOq7ZuPnH/uploaded-1772749929936-lbulq2e9.jpg?_wi=2", title: "Luxury Interlock Installation"
}
];
return ( return (
<ThemeProvider <ThemeProvider
defaultButtonVariant="text-stagger" defaultButtonVariant="text-stagger"
@@ -134,95 +208,147 @@ export default function LandingPage() {
</div> </div>
<div id="services" data-section="services"> <div id="services" data-section="services">
<FeatureHoverPattern <div className="px-6 lg:px-12 py-16 lg:py-24">
title="Our Services" <div className="max-w-7xl mx-auto">
description="Premium construction and landscaping services for Toronto and the Greater Toronto Area. Each project is crafted with precision and built to last." <div className="mb-12">
tag="Complete Solutions" <p className="text-sm font-semibold uppercase tracking-wider text-primary-cta mb-2">Complete Solutions</p>
features={[ <h2 className="text-4xl lg:text-5xl font-bold mb-4">Our Services</h2>
{ <p className="text-lg text-foreground/80">Premium construction and landscaping services for Toronto and the Greater Toronto Area. Each project is crafted with precision and built to last.</p>
icon: Cog, </div>
title: "Interlock Driveways", description: "Professional interlock paving with premium materials and expert installation"
}, <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6 mb-12">
{ {[
icon: Palette, {
title: "Backyard Patios", description: "Custom patio designs transforming outdoor living spaces into luxury retreats" id: "interlock", icon: Cog,
}, title: "Interlock Driveways", description: "Professional interlock paving with premium materials and expert installation"
{ },
icon: Footprints, {
title: "Walkways", description: "Decorative and functional pathways connecting your property with style" id: "patios", icon: Palette,
}, title: "Backyard Patios", description: "Custom patio designs transforming outdoor living spaces into luxury retreats"
{ },
icon: Building2, {
title: "Retaining Walls", description: "Structural and aesthetic walls for landscaping and property management" id: "walkways", icon: Footprints,
}, title: "Walkways", description: "Decorative and functional pathways connecting your property with style"
{ },
icon: Home, {
title: "Natural Stone Porches", description: "Premium stone entry features creating impressive curb appeal" id: "retaining", icon: Building2,
}, title: "Retaining Walls", description: "Structural and aesthetic walls for landscaping and property management"
{ },
icon: Zap, {
title: "Landscape Lighting", description: "Professional outdoor lighting systems enhancing ambiance and security" id: "porches", icon: Home,
}, title: "Natural Stone Porches", description: "Premium stone entry features creating impressive curb appeal"
{ },
icon: Hammer, {
title: "Decks", description: "Custom wooden decks designed for durability and aesthetic appeal" id: "lighting", icon: Zap,
}, title: "Landscape Lighting", description: "Professional outdoor lighting systems enhancing ambiance and security"
{ }
icon: Shield, ].map((service) => (
title: "Fences", description: "Privacy fences and decorative fencing solutions for residential properties" <div
}, key={service.id}
{ className="relative group"
icon: Trees, onMouseEnter={() => setServicesHoveredCard(service.id)}
title: "Rock Beds & Landscaping", description: "Landscape design elements that enhance property value and curb appeal" onMouseLeave={() => setServicesHoveredCard(null)}
}, >
{ <div className="p-6 rounded-lg border border-accent/20 bg-card hover:border-primary-cta/40 transition-all duration-300">
icon: Droplet, <service.icon className="w-8 h-8 text-primary-cta mb-4" />
title: "Basement Waterproofing", description: "Professional waterproofing solutions protecting your foundation and home" <h3 className="text-xl font-semibold mb-2">{service.title}</h3>
}, <p className="text-foreground/70 text-sm">{service.description}</p>
{ </div>
icon: Frame, {servicesHoveredCard === service.id && (
title: "Interior Renovations", description: "Premium interior construction and renovation services for Toronto homes" <div className="absolute inset-0 rounded-lg bg-black/50 flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity duration-300 pointer-events-none">
} <div className="text-center text-white p-4">
]} <p className="font-semibold">See examples of this service</p>
animationType="slide-up" <p className="text-sm text-white/80">in our project gallery</p>
textboxLayout="default" </div>
useInvertedBackground={false} </div>
tagAnimation="slide-up" )}
cardTitleClassName="text-5xl font-bold mb-4" </div>
/> ))}
</div>
<div className="bg-card rounded-lg p-8 border border-accent/20">
<h3 className="text-2xl font-bold mb-6">Interlock Driveway Showcase</h3>
<p className="text-foreground/80 mb-8">Hover over the slider to see our photorealistic 3D renderings compared to actual completed projects:</p>
<div className="grid grid-cols-1 lg:grid-cols-3 gap-6">
{beforeAfterPairs.map((pair, index) => (
<BeforeAfterCard
key={index}
pair={pair}
isHovered={galleryHoveredCard === `service-${index}`}
/>
))}
</div>
</div>
</div>
</div>
</div> </div>
<div id="gallery" data-section="gallery"> <div id="gallery" data-section="gallery">
<BlogCardThree <div className="px-6 lg:px-12 py-16 lg:py-24">
title="Project Gallery" <div className="max-w-7xl mx-auto">
description="Explore our portfolio of premium hardscape and construction projects across the GTA." <div className="mb-12">
tag="Portfolio Showcase" <p className="text-sm font-semibold uppercase tracking-wider text-primary-cta mb-2">Portfolio Showcase</p>
tagAnimation="slide-up" <h2 className="text-4xl lg:text-5xl font-bold mb-4">Project Gallery</h2>
blogs={[ <p className="text-lg text-foreground/80">Explore our portfolio of premium hardscape and construction projects across the GTA.</p>
{ </div>
id: "project-1", category: "Premium Projects", title: "Luxury Residential Development", excerpt: "High-end construction showcasing precision craftsmanship and attention to detail", imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AXh5KliD4l7rWjrQZkOq7ZuPnH/uploaded-1772749929936-lbulq2e9.jpg?_wi=2", imageAlt: "Luxury residential project", authorName: "Taishan Team", authorAvatar: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AXh5KliD4l7rWjrQZkOq7ZuPnH/uploaded-1772749929936-heyeujvs.jpg", date: "2024"
}, <div className="grid grid-cols-1 md:grid-cols-2 gap-6">
{ {[
id: "project-2", category: "Premium Projects", title: "Contemporary Hardscape Design", excerpt: "Large format pavers with sophisticated layout and professional finishing", imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AXh5KliD4l7rWjrQZkOq7ZuPnH/uploaded-1772749929936-uklcyhsf.jpg?_wi=2", imageAlt: "Contemporary hardscape design", authorName: "Taishan Team", authorAvatar: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AXh5KliD4l7rWjrQZkOq7ZuPnH/uploaded-1772749929936-heyeujvs.jpg", date: "2024" {
}, id: "project-1", title: "Luxury Residential Development", category: "Premium Projects", beforeSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AXh5KliD4l7rWjrQZkOq7ZuPnH/uploaded-1772749929936-ok3joqnq.jpg?_wi=2", afterSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AXh5KliD4l7rWjrQZkOq7ZuPnH/uploaded-1772749929936-lbulq2e9.jpg?_wi=2", description: "High-end construction showcasing precision craftsmanship and attention to detail"
{ },
id: "project-3", category: "Premium Projects", title: "Luxury Outdoor Living Space", excerpt: "Complete outdoor transformation with premium materials and expert installation", imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AXh5KliD4l7rWjrQZkOq7ZuPnH/uploaded-1772749929936-ok3joqnq.jpg?_wi=2", imageAlt: "Luxury outdoor living space", authorName: "Taishan Team", authorAvatar: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AXh5KliD4l7rWjrQZkOq7ZuPnH/uploaded-1772749929936-heyeujvs.jpg", date: "2024" {
}, id: "project-2", title: "Contemporary Hardscape Design", category: "Premium Projects", beforeSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AXh5KliD4l7rWjrQZkOq7ZuPnH/uploaded-1772749929936-heyeujvs.jpg?_wi=2", afterSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AXh5KliD4l7rWjrQZkOq7ZuPnH/uploaded-1772749929936-uklcyhsf.jpg?_wi=2", description: "Large format pavers with sophisticated layout and professional finishing"
{ },
id: "project-4", category: "Premium Projects", title: "Premium Patio Entertainment Area", excerpt: "Multi-level design with integrated features and ambient lighting", imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AXh5KliD4l7rWjrQZkOq7ZuPnH/uploaded-1772749929936-lbulq2e9.jpg?_wi=3", imageAlt: "Premium patio area", authorName: "Taishan Team", authorAvatar: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AXh5KliD4l7rWjrQZkOq7ZuPnH/uploaded-1772749929936-heyeujvs.jpg", date: "2024" {
}, id: "project-3", title: "Luxury Outdoor Living Space", category: "Premium Projects", beforeSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AXh5KliD4l7rWjrQZkOq7ZuPnH/uploaded-1772749929936-lbulq2e9.jpg?_wi=3", afterSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AXh5KliD4l7rWjrQZkOq7ZuPnH/uploaded-1772749929936-ok3joqnq.jpg?_wi=3", description: "Complete outdoor transformation with premium materials and expert installation"
{ },
id: "project-5", category: "Premium Projects", title: "Natural Stone Entry Design", excerpt: "Custom stone work creating impressive curb appeal and property value", imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AXh5KliD4l7rWjrQZkOq7ZuPnH/uploaded-1772749929936-uklcyhsf.jpg?_wi=3", imageAlt: "Natural stone entry design", authorName: "Taishan Team", authorAvatar: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AXh5KliD4l7rWjrQZkOq7ZuPnH/uploaded-1772749929936-heyeujvs.jpg", date: "2024" {
}, id: "project-4", title: "Premium Patio Entertainment Area", category: "Premium Projects", beforeSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AXh5KliD4l7rWjrQZkOq7ZuPnH/uploaded-1772749929936-uklcyhsf.jpg?_wi=3", afterSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AXh5KliD4l7rWjrQZkOq7ZuPnH/uploaded-1772749929936-heyeujvs.jpg?_wi=3", description: "Multi-level design with integrated features and ambient lighting"
{ },
id: "project-6", category: "Premium Projects", title: "Professional Landscape Installation", excerpt: "Complete landscape design and installation enhancing property flow", imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AXh5KliD4l7rWjrQZkOq7ZuPnH/uploaded-1772749929936-ok3joqnq.jpg?_wi=3", imageAlt: "Professional landscape design", authorName: "Taishan Team", authorAvatar: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AXh5KliD4l7rWjrQZkOq7ZuPnH/uploaded-1772749929936-heyeujvs.jpg", date: "2024" {
} id: "project-5", title: "Natural Stone Entry Design", category: "Premium Projects", beforeSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AXh5KliD4l7rWjrQZkOq7ZuPnH/uploaded-1772749929936-ok3joqnq.jpg?_wi=4", afterSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AXh5KliD4l7rWjrQZkOq7ZuPnH/uploaded-1772749929936-uklcyhsf.jpg?_wi=4", description: "Custom stone work creating impressive curb appeal and property value"
]} },
animationType="slide-up" {
textboxLayout="default" id: "project-6", title: "Professional Landscape Installation", category: "Premium Projects", beforeSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AXh5KliD4l7rWjrQZkOq7ZuPnH/uploaded-1772749929936-lbulq2e9.jpg?_wi=4", afterSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AXh5KliD4l7rWjrQZkOq7ZuPnH/uploaded-1772749929936-ok3joqnq.jpg?_wi=4", description: "Complete landscape design and installation enhancing property flow"
useInvertedBackground={false} }
cardTitleClassName="text-5xl font-bold mb-4" ].map((project) => (
/> <div
key={project.id}
className="group"
onMouseEnter={() => setGalleryHoveredCard(project.id)}
onMouseLeave={() => setGalleryHoveredCard(null)}
>
<div className="rounded-lg overflow-hidden border border-accent/20">
{galleryHoveredCard === project.id ? (
<BeforeAfterCard
pair={{
beforeSrc: project.beforeSrc,
afterSrc: project.afterSrc,
title: project.title
}}
isHovered={true}
/>
) : (
<div className="h-64 relative overflow-hidden">
<img
src={project.afterSrc}
alt={project.title}
className="w-full h-full object-cover group-hover:scale-105 transition-transform duration-300"
/>
<div className="absolute inset-0 bg-gradient-to-t from-black/80 to-transparent p-4 flex flex-col justify-end">
<p className="text-xs text-white/70 mb-2">{project.category}</p>
<h3 className="text-lg font-semibold text-white">{project.title}</h3>
<p className="text-sm text-white/80 mt-2">{project.description}</p>
</div>
</div>
)}
</div>
</div>
))}
</div>
</div>
</div>
</div> </div>
<div id="showroom" data-section="showroom"> <div id="showroom" data-section="showroom">
@@ -322,7 +448,7 @@ export default function LandingPage() {
<div id="contact" data-section="contact"> <div id="contact" data-section="contact">
<ContactFaq <ContactFaq
ctaTitle="Ready to Transform Your Property?" ctaTitle="Ready to Transform Your Property?"
ctaDescription="Book a consultation and receive a free 3D preview of your project." ctaDescription="Start your project with a free consultation and photorealistic 3D rendering."
ctaButton={{ ctaButton={{
text: "Get Free 3D Design", href: "mailto:info@taishanconstruction.com?subject=Free%203D%20Design%20Consultation" text: "Get Free 3D Design", href: "mailto:info@taishanconstruction.com?subject=Free%203D%20Design%20Consultation"
}} }}

View File

@@ -11,7 +11,7 @@ html {
body { body {
background-color: var(--background); background-color: var(--background);
color: var(--foreground); color: var(--foreground);
font-family: var(--font-montserrat), sans-serif; font-family: var(--font-open-sans), sans-serif;
position: relative; position: relative;
min-height: 100vh; min-height: 100vh;
overscroll-behavior: none; overscroll-behavior: none;
@@ -24,5 +24,5 @@ h3,
h4, h4,
h5, h5,
h6 { h6 {
font-family: var(--font-montserrat), sans-serif; font-family: var(--font-inter), sans-serif;
} }