Compare commits
34 Commits
version_1_
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 743cb24413 | |||
|
|
a763ad758e | ||
| d88aeb1942 | |||
|
|
52835c41e3 | ||
|
|
327d7eeeda | ||
| 191c56ec88 | |||
|
|
e04b1414c2 | ||
| e6eaf0735b | |||
|
|
5070621b08 | ||
| 21ef96493a | |||
| fe53e76b41 | |||
| db09f5966c | |||
|
|
2fea80ea29 | ||
|
|
a82477d467 | ||
| 9a833e6263 | |||
| c3ee3df13c | |||
| fb585b5d81 | |||
| 776623b6ef | |||
| 821732252e | |||
| 43994331d6 | |||
| 8d2c771ecd | |||
| ca80d1ae0e | |||
| 999d1ad422 | |||
| 2050eba8f2 | |||
| 4d02521f1d | |||
| a796466363 | |||
| 795c8bc160 | |||
| 5939f86125 | |||
| e621338c8c | |||
| 06e393a7cd | |||
| d30cfcf201 | |||
| a08fd57949 | |||
| 0c663ba8e9 | |||
|
|
c8cb6c2f83 |
@@ -1,359 +1,31 @@
|
||||
import AboutFeaturesSplit from '@/components/sections/about/AboutFeaturesSplit';
|
||||
import ContactCta from '@/components/sections/contact/ContactCta';
|
||||
import FaqSimple from '@/components/sections/faq/FaqSimple';
|
||||
import FeaturesAttributeCards from '@/components/sections/features/FeaturesAttributeCards';
|
||||
import HeroBillboardCarousel from '@/components/sections/hero/HeroBillboardCarousel';
|
||||
import MetricsIconCards from '@/components/sections/metrics/MetricsIconCards';
|
||||
import TeamStackedCards from '@/components/sections/team/TeamStackedCards';
|
||||
import TestimonialRatingCards from '@/components/sections/testimonial/TestimonialRatingCards';
|
||||
import { Award, Clock, DollarSign, Droplet, Flame, Pizza, Star, Wheat } from "lucide-react";
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
// AUTO-GENERATED shell by per-section-migrate.
|
||||
// Section bodies live in ./<PageBase>/sections/<X>.tsx. Edit the section
|
||||
// files directly; this shell only fixes render order.
|
||||
|
||||
export default function HomePage() {
|
||||
import React from 'react';
|
||||
import HeroSection from './HomePage/sections/Hero';
|
||||
import AboutSection from './HomePage/sections/About';
|
||||
import MenuSection from './HomePage/sections/Menu';
|
||||
import MetricsSection from './HomePage/sections/Metrics';
|
||||
import TeamSection from './HomePage/sections/Team';
|
||||
import ReviewsSection from './HomePage/sections/Reviews';
|
||||
import FaqSection from './HomePage/sections/Faq';
|
||||
import ContactSection from './HomePage/sections/Contact';
|
||||
|
||||
|
||||
{/* webild-stub @2026-06-07T19:39:02.554Z: add a verified badge like an Instagram profile next to the name of the person inside of each testimonial card */}
|
||||
|
||||
export default function HomePage(): React.JSX.Element {
|
||||
return (
|
||||
<>
|
||||
<div id="hero" data-section="hero">
|
||||
<SectionErrorBoundary name="hero">
|
||||
<HeroBillboardCarousel
|
||||
tag="Taste of San Francisco"
|
||||
title="Authentic Pizza, Freshly Made Daily"
|
||||
description="Indulge in the finest pizzas crafted with passion and premium, locally-sourced ingredients. Experience the true flavor of San Francisco in every bite."
|
||||
primaryButton={{
|
||||
text: "Order Now",
|
||||
href: "#contact",
|
||||
}}
|
||||
secondaryButton={{
|
||||
text: "View Menu",
|
||||
href: "#menu",
|
||||
}}
|
||||
items={[
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/chef-kitchen-prepares-pizza_1157-21842.jpg",
|
||||
},
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/pizza-with-cheese-it-is-being-served_505751-3854.jpg",
|
||||
},
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/food-assortment-wooden-background_23-2148601637.jpg",
|
||||
},
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/top-view-delicious-cheese-pizza-with-seasonings-tomatoes-blue-background-italian-food-dough-cake-fast-food-photo-color_140725-140341.jpg",
|
||||
},
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/group-friends-eating-pizza-home-together_23-2150419422.jpg",
|
||||
},
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/pizza-with-tomato-slices-garlic-lemon-chili-pepper-corn-mint-leaves-pizza-board-gray-wooden-background-high-angle-view_176474-4612.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
|
||||
<div id="about" data-section="about">
|
||||
<SectionErrorBoundary name="about">
|
||||
<AboutFeaturesSplit
|
||||
tag="Our Story"
|
||||
title="Crafting Perfection, One Slice at a Time"
|
||||
description="Nestled in the heart of San Francisco, our pizza shop is more than just a restaurant – it's a testament to tradition and flavor. We believe in using only the freshest, high-quality ingredients, from our hand-kneaded dough to our rich, homemade sauce and premium toppings. Every pizza is a work of art, baked to golden perfection in our authentic brick oven."
|
||||
items={[
|
||||
{
|
||||
icon: Wheat,
|
||||
title: "Artisan Dough",
|
||||
description: "Hand-kneaded daily for the perfect crust.",
|
||||
},
|
||||
{
|
||||
icon: Droplet,
|
||||
title: "Fresh Ingredients",
|
||||
description: "Locally sourced vegetables and premium meats.",
|
||||
},
|
||||
{
|
||||
icon: Flame,
|
||||
title: "Brick Oven Baked",
|
||||
description: "For that irresistible smoky flavor and crispy finish.",
|
||||
},
|
||||
]}
|
||||
imageSrc="http://img.b2bpic.net/free-photo/baked-firewood-pizza-cooked-rustic-oven-generated-by-ai_188544-14066.jpg"
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
|
||||
<div id="menu" data-section="menu">
|
||||
<SectionErrorBoundary name="menu">
|
||||
<FeaturesAttributeCards
|
||||
tag="Our Delicious Selection"
|
||||
title="Irresistible Pizzas for Every Craving"
|
||||
description="Explore our diverse menu, from classic favorites to unique San Francisco-inspired creations. Each pizza is made with love and attention to detail, promising an unforgettable taste experience."
|
||||
items={[
|
||||
{
|
||||
title: "The Golden Gate Pepperoni",
|
||||
tags: "Classic, Meat",
|
||||
badge: "Popular",
|
||||
details: [
|
||||
{
|
||||
icon: DollarSign,
|
||||
label: "Price",
|
||||
value: "$24.99",
|
||||
},
|
||||
{
|
||||
icon: Clock,
|
||||
label: "Cook Time",
|
||||
value: "15 min",
|
||||
},
|
||||
],
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/top-view-delicious-baked-pineapple-papaya-pizza_23-2148753778.jpg",
|
||||
},
|
||||
{
|
||||
title: "Alcatraz Margherita",
|
||||
tags: "Vegetarian, Classic",
|
||||
badge: "Signature",
|
||||
details: [
|
||||
{
|
||||
icon: DollarSign,
|
||||
label: "Price",
|
||||
value: "$22.99",
|
||||
},
|
||||
{
|
||||
icon: Clock,
|
||||
label: "Cook Time",
|
||||
value: "12 min",
|
||||
},
|
||||
],
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/top-view-delicious-pizza-with-fresh-cheese_23-2150096954.jpg",
|
||||
},
|
||||
{
|
||||
title: "Fisherman's Wharf Veggie",
|
||||
tags: "Vegetarian, Fresh",
|
||||
badge: "Healthy",
|
||||
details: [
|
||||
{
|
||||
icon: DollarSign,
|
||||
label: "Price",
|
||||
value: "$26.99",
|
||||
},
|
||||
{
|
||||
icon: Clock,
|
||||
label: "Cook Time",
|
||||
value: "18 min",
|
||||
},
|
||||
],
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/pizza-with-fried-sausage-bell-pepper_141793-345.jpg",
|
||||
},
|
||||
{
|
||||
title: "Bay Breeze BBQ Chicken",
|
||||
tags: "Chicken, California",
|
||||
badge: "New",
|
||||
details: [
|
||||
{
|
||||
icon: DollarSign,
|
||||
label: "Price",
|
||||
value: "$28.99",
|
||||
},
|
||||
{
|
||||
icon: Clock,
|
||||
label: "Cook Time",
|
||||
value: "17 min",
|
||||
},
|
||||
],
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/april-fools-day-still-life-with-paper-pizza_23-2151358301.jpg",
|
||||
},
|
||||
{
|
||||
title: "Sourdough Supreme",
|
||||
tags: "Meat, Veggies",
|
||||
badge: "Big One",
|
||||
details: [
|
||||
{
|
||||
icon: DollarSign,
|
||||
label: "Price",
|
||||
value: "$29.99",
|
||||
},
|
||||
{
|
||||
icon: Clock,
|
||||
label: "Cook Time",
|
||||
value: "20 min",
|
||||
},
|
||||
],
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/pizza-table-green-color_58702-1317.jpg",
|
||||
},
|
||||
{
|
||||
title: "Chef's Daily Special",
|
||||
tags: "Seasonal, Unique",
|
||||
badge: "Limited",
|
||||
details: [
|
||||
{
|
||||
icon: DollarSign,
|
||||
label: "Price",
|
||||
value: "Varies",
|
||||
},
|
||||
{
|
||||
icon: Clock,
|
||||
label: "Cook Time",
|
||||
value: "20 min",
|
||||
},
|
||||
],
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/chef-white-uniform-prepare-pizzaa_1157-27034.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
|
||||
<div id="metrics" data-section="metrics">
|
||||
<SectionErrorBoundary name="metrics">
|
||||
<MetricsIconCards
|
||||
tag="Our Impact"
|
||||
title="A Taste of Our Success"
|
||||
description="More than just pizza, it's a legacy of flavor and satisfied customers."
|
||||
metrics={[
|
||||
{
|
||||
icon: Pizza,
|
||||
title: "Pizzas Baked",
|
||||
value: "50,000+",
|
||||
},
|
||||
{
|
||||
icon: Star,
|
||||
title: "Happy Customers",
|
||||
value: "10,000+",
|
||||
},
|
||||
{
|
||||
icon: Award,
|
||||
title: "Years Serving SF",
|
||||
value: "15+",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
|
||||
<div id="team" data-section="team">
|
||||
<SectionErrorBoundary name="team">
|
||||
<TeamStackedCards
|
||||
tag="Meet the Maestros"
|
||||
title="Our Passionate Pizza Crew"
|
||||
description="Behind every delicious pizza is a dedicated team committed to quality and a warm dining experience."
|
||||
members={[
|
||||
{
|
||||
name: "Chef Marco",
|
||||
role: "Head Pizzaiolo",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/italian-chef-is-putting-gourmet-freshly-made-pizza-stone-oven_613910-14121.jpg",
|
||||
},
|
||||
{
|
||||
name: "Sophia Rodriguez",
|
||||
role: "Assistant Chef",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/smiling-young-pretty-delivery-girl-red-uniform-cap-holding-pizza-packages_141793-31534.jpg",
|
||||
},
|
||||
{
|
||||
name: "David Kim",
|
||||
role: "Operations Manager",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/woman-looking-goodies-local-producer_23-2149110825.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
|
||||
<div id="reviews" data-section="reviews">
|
||||
<SectionErrorBoundary name="reviews">
|
||||
<TestimonialRatingCards
|
||||
tag="What Our Guests Say"
|
||||
title="Rave Reviews from Pizza Lovers"
|
||||
description="Our customers can't get enough of our authentic flavors and friendly service. Hear what they have to say!"
|
||||
testimonials={[
|
||||
{
|
||||
name: "Sarah J.",
|
||||
role: "Local Resident",
|
||||
quote: "The best pizza in San Francisco, hands down! The crust is perfect, and the toppings are always fresh. A must-try!",
|
||||
rating: 5,
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/attractive-hipster-dressed-leather-jacket-eating-vegan-burger_613910-16395.jpg",
|
||||
},
|
||||
{
|
||||
name: "Michael T.",
|
||||
role: "Food Blogger",
|
||||
quote: "An absolute culinary delight! Every slice is a journey of flavor. The Margherita is exceptional.",
|
||||
rating: 5,
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/medium-shot-friends-eating-pizza_23-2151231308.jpg",
|
||||
},
|
||||
{
|
||||
name: "Emily R.",
|
||||
role: "Tech Professional",
|
||||
quote: "Fast, friendly, and incredibly delicious. My go-to spot for pizza night. Highly recommend the BBQ Chicken!",
|
||||
rating: 4,
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/medium-shot-woman-eating-delicious-pizza_23-2150317035.jpg",
|
||||
},
|
||||
{
|
||||
name: "David L.",
|
||||
role: "Tourist",
|
||||
quote: "Stumbled upon this gem and was blown away. Truly authentic taste, felt like I was back in Italy!",
|
||||
rating: 5,
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/handsome-smiling-man-eat-salade-restaurant-waiting-woman-with-bouquet-roses_496169-302.jpg",
|
||||
},
|
||||
{
|
||||
name: "Jessica B.",
|
||||
role: "Student",
|
||||
quote: "Affordable and amazing quality. Perfect for a quick lunch or a relaxed dinner with friends. Loved the veggie options.",
|
||||
rating: 4,
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/front-view-family-eating-pizza-outdoors_23-2149931059.jpg",
|
||||
},
|
||||
{
|
||||
name: "Chris P.",
|
||||
role: "Artisan Baker",
|
||||
quote: "As a fellow baker, I appreciate the craftsmanship. The dough is expertly fermented, making for a superb crust.",
|
||||
rating: 5,
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/side-view-man-eating-pizza_23-2149454362.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
|
||||
<div id="faq" data-section="faq">
|
||||
<SectionErrorBoundary name="faq">
|
||||
<FaqSimple
|
||||
tag="Got Questions?"
|
||||
title="Frequently Asked Questions"
|
||||
description="Find quick answers to common queries about our menu, ordering, and services."
|
||||
items={[
|
||||
{
|
||||
question: "Do you offer gluten-free options?",
|
||||
answer: "Yes, we offer delicious gluten-free crust options for an additional charge. Please specify when ordering.",
|
||||
},
|
||||
{
|
||||
question: "What are your delivery hours?",
|
||||
answer: "We deliver from 11 AM to 9 PM, Tuesday through Sunday. Minimum order applies for delivery.",
|
||||
},
|
||||
{
|
||||
question: "Can I customize my pizza?",
|
||||
answer: "Absolutely! You can choose your crust, sauce, cheese, and a wide variety of fresh toppings to create your perfect pizza.",
|
||||
},
|
||||
{
|
||||
question: "Do you cater for events?",
|
||||
answer: "Yes, we offer catering services for events of all sizes. Please contact us directly for our catering menu and custom packages.",
|
||||
},
|
||||
{
|
||||
question: "Are reservations required for dining in?",
|
||||
answer: "While not strictly required, reservations are highly recommended, especially on weekends and for larger groups, to ensure you get a table.",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
|
||||
<div id="contact" data-section="contact">
|
||||
<SectionErrorBoundary name="contact">
|
||||
<ContactCta
|
||||
tag="Ready for a Slice?"
|
||||
text="Experience the best pizza in San Francisco. Order online or visit us today!"
|
||||
primaryButton={{
|
||||
text: "Order Online",
|
||||
href: "tel:+14155551234",
|
||||
}}
|
||||
secondaryButton={{
|
||||
text: "Get Directions",
|
||||
href: "https://maps.app.goo.gl/YourPizzaShopLocation",
|
||||
}}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<HeroSection />
|
||||
<AboutSection />
|
||||
<MenuSection />
|
||||
<MetricsSection />
|
||||
<TeamSection />
|
||||
<ReviewsSection />
|
||||
<FaqSection />
|
||||
<ContactSection />
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
66
src/pages/HomePage/sections/About.tsx
Normal file
66
src/pages/HomePage/sections/About.tsx
Normal file
@@ -0,0 +1,66 @@
|
||||
import React from 'react';
|
||||
import { Wheat, Droplet, Flame } from "lucide-react";
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
import Button from "@/components/ui/Button";
|
||||
import ImageOrVideo from "@/components/ui/ImageOrVideo";
|
||||
import Tag from "@/components/ui/Tag";
|
||||
|
||||
export default function AboutSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="about" data-webild-section="about" className="py-24 bg-background">
|
||||
<SectionErrorBoundary name="about">
|
||||
<div className="max-w-content-width mx-auto px-6">
|
||||
<div className="flex justify-center mb-12">
|
||||
<Tag text="Our Story" />
|
||||
</div>
|
||||
|
||||
<div className="grid grid-cols-1 lg:grid-cols-2 gap-8 items-stretch">
|
||||
<div className="bg-card rounded-3xl p-8 md:p-12 flex flex-col justify-center">
|
||||
<div className="flex flex-col">
|
||||
<div className="flex flex-col gap-4 border-b border-border pb-8 mb-8">
|
||||
<div className="w-12 h-12 rounded-full bg-primary-cta flex items-center justify-center text-primary-cta-text">
|
||||
<Wheat className="w-6 h-6" />
|
||||
</div>
|
||||
<div>
|
||||
<h3 className="text-xl font-bold text-foreground mb-2">Artisan Dough</h3>
|
||||
<p className="text-muted-foreground mb-4">Hand-kneaded daily for the perfect crust.</p>
|
||||
<Button text="Learn more" variant="secondary" className="w-fit" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="flex flex-col gap-4 border-b border-border pb-8 mb-8">
|
||||
<div className="w-12 h-12 rounded-full bg-primary-cta flex items-center justify-center text-primary-cta-text">
|
||||
<Droplet className="w-6 h-6" />
|
||||
</div>
|
||||
<div>
|
||||
<h3 className="text-xl font-bold text-foreground mb-2">Fresh Ingredients</h3>
|
||||
<p className="text-muted-foreground mb-4">Locally sourced vegetables and premium meats.</p>
|
||||
<Button text="Learn more" variant="secondary" className="w-fit" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="flex flex-col gap-4">
|
||||
<div className="w-12 h-12 rounded-full bg-primary-cta flex items-center justify-center text-primary-cta-text">
|
||||
<Flame className="w-6 h-6" />
|
||||
</div>
|
||||
<div>
|
||||
<h3 className="text-xl font-bold text-foreground mb-2">Brick Oven Baked</h3>
|
||||
<p className="text-muted-foreground mb-4">For that irresistible smoky flavor and crispy finish.</p>
|
||||
<Button text="Learn more" variant="secondary" className="w-fit" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="h-full min-h-[400px] lg:min-h-[600px] rounded-3xl overflow-hidden">
|
||||
<ImageOrVideo
|
||||
imageSrc="http://img.b2bpic.net/free-photo/baked-firewood-pizza-cooked-rustic-oven-generated-by-ai_188544-14066.jpg"
|
||||
className="w-full h-full object-cover"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
27
src/pages/HomePage/sections/Contact.tsx
Normal file
27
src/pages/HomePage/sections/Contact.tsx
Normal file
@@ -0,0 +1,27 @@
|
||||
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
|
||||
// file as the canonical source for the "contact" section.
|
||||
|
||||
import React from 'react';
|
||||
import ContactCta from '@/components/sections/contact/ContactCta';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function ContactSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="contact" data-section="contact">
|
||||
<SectionErrorBoundary name="contact">
|
||||
<ContactCta
|
||||
tag="Ready for a Slice?"
|
||||
text="Experience the best pizza in San Francisco. Order online or visit us today!"
|
||||
primaryButton={{
|
||||
text: "Order Online",
|
||||
href: "tel:+14155551234",
|
||||
}}
|
||||
secondaryButton={{
|
||||
text: "Get Directions",
|
||||
href: "https://maps.app.goo.gl/YourPizzaShopLocation",
|
||||
}}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
42
src/pages/HomePage/sections/Faq.tsx
Normal file
42
src/pages/HomePage/sections/Faq.tsx
Normal file
@@ -0,0 +1,42 @@
|
||||
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
|
||||
// file as the canonical source for the "faq" section.
|
||||
|
||||
import React from 'react';
|
||||
import FaqSimple from '@/components/sections/faq/FaqSimple';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function FaqSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="faq" data-section="faq">
|
||||
<SectionErrorBoundary name="faq">
|
||||
<FaqSimple
|
||||
tag="Got Questions?"
|
||||
title="Frequently Asked Questions"
|
||||
description="Find quick answers to common queries about our menu, ordering, and services."
|
||||
items={[
|
||||
{
|
||||
question: "Do you offer gluten-free options?",
|
||||
answer: "Yes, we offer delicious gluten-free crust options for an additional charge. Please specify when ordering.",
|
||||
},
|
||||
{
|
||||
question: "What are your delivery hours?",
|
||||
answer: "We deliver from 11 AM to 9 PM, Tuesday through Sunday. Minimum order applies for delivery.",
|
||||
},
|
||||
{
|
||||
question: "Can I customize my pizza?",
|
||||
answer: "Absolutely! You can choose your crust, sauce, cheese, and a wide variety of fresh toppings to create your perfect pizza.",
|
||||
},
|
||||
{
|
||||
question: "Do you cater for events?",
|
||||
answer: "Yes, we offer catering services for events of all sizes. Please contact us directly for our catering menu and custom packages.",
|
||||
},
|
||||
{
|
||||
question: "Are reservations required for dining in?",
|
||||
answer: "While not strictly required, reservations are highly recommended, especially on weekends and for larger groups, to ensure you get a table.",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
74
src/pages/HomePage/sections/Hero.tsx
Normal file
74
src/pages/HomePage/sections/Hero.tsx
Normal file
@@ -0,0 +1,74 @@
|
||||
import Button from "@/components/ui/Button";
|
||||
import HeroBackgroundSlot from "@/components/ui/HeroBackgroundSlot";
|
||||
import TextAnimation from "@/components/ui/TextAnimation";
|
||||
import ImageOrVideo from "@/components/ui/ImageOrVideo";
|
||||
|
||||
type HeroBillboardCarouselProps = {
|
||||
tag: string;
|
||||
title: string;
|
||||
description: string;
|
||||
primaryButton: { text: string; href: string };
|
||||
secondaryButton: { text: string; href: string };
|
||||
items: ({ imageSrc: string; videoSrc?: never } | { videoSrc: string; imageSrc?: never })[];
|
||||
};
|
||||
|
||||
const HeroInline = () => {
|
||||
const duplicated = [...[{"imageSrc":"http://img.b2bpic.net/free-photo/chef-kitchen-prepares-pizza_1157-21842.jpg"},{"imageSrc":"http://img.b2bpic.net/free-photo/pizza-with-cheese-it-is-being-served_505751-3854.jpg"},{"imageSrc":"http://img.b2bpic.net/free-photo/food-assortment-wooden-background_23-2148601637.jpg"},{"imageSrc":"http://img.b2bpic.net/free-photo/top-view-delicious-cheese-pizza-with-seasonings-tomatoes-blue-background-italian-food-dough-cake-fast-food-photo-color_140725-140341.jpg"},{"imageSrc":"http://img.b2bpic.net/free-photo/group-friends-eating-pizza-home-together_23-2150419422.jpg"},{"imageSrc":"http://img.b2bpic.net/free-photo/pizza-with-tomato-slices-garlic-lemon-chili-pepper-corn-mint-leaves-pizza-board-gray-wooden-background-high-angle-view_176474-4612.jpg"}], ...[{"imageSrc":"http://img.b2bpic.net/free-photo/chef-kitchen-prepares-pizza_1157-21842.jpg"},{"imageSrc":"http://img.b2bpic.net/free-photo/pizza-with-cheese-it-is-being-served_505751-3854.jpg"},{"imageSrc":"http://img.b2bpic.net/free-photo/food-assortment-wooden-background_23-2148601637.jpg"},{"imageSrc":"http://img.b2bpic.net/free-photo/top-view-delicious-cheese-pizza-with-seasonings-tomatoes-blue-background-italian-food-dough-cake-fast-food-photo-color_140725-140341.jpg"},{"imageSrc":"http://img.b2bpic.net/free-photo/group-friends-eating-pizza-home-together_23-2150419422.jpg"},{"imageSrc":"http://img.b2bpic.net/free-photo/pizza-with-tomato-slices-garlic-lemon-chili-pepper-corn-mint-leaves-pizza-board-gray-wooden-background-high-angle-view_176474-4612.jpg"}], ...[{"imageSrc":"http://img.b2bpic.net/free-photo/chef-kitchen-prepares-pizza_1157-21842.jpg"},{"imageSrc":"http://img.b2bpic.net/free-photo/pizza-with-cheese-it-is-being-served_505751-3854.jpg"},{"imageSrc":"http://img.b2bpic.net/free-photo/food-assortment-wooden-background_23-2148601637.jpg"},{"imageSrc":"http://img.b2bpic.net/free-photo/top-view-delicious-cheese-pizza-with-seasonings-tomatoes-blue-background-italian-food-dough-cake-fast-food-photo-color_140725-140341.jpg"},{"imageSrc":"http://img.b2bpic.net/free-photo/group-friends-eating-pizza-home-together_23-2150419422.jpg"},{"imageSrc":"http://img.b2bpic.net/free-photo/pizza-with-tomato-slices-garlic-lemon-chili-pepper-corn-mint-leaves-pizza-board-gray-wooden-background-high-angle-view_176474-4612.jpg"}], ...[{"imageSrc":"http://img.b2bpic.net/free-photo/chef-kitchen-prepares-pizza_1157-21842.jpg"},{"imageSrc":"http://img.b2bpic.net/free-photo/pizza-with-cheese-it-is-being-served_505751-3854.jpg"},{"imageSrc":"http://img.b2bpic.net/free-photo/food-assortment-wooden-background_23-2148601637.jpg"},{"imageSrc":"http://img.b2bpic.net/free-photo/top-view-delicious-cheese-pizza-with-seasonings-tomatoes-blue-background-italian-food-dough-cake-fast-food-photo-color_140725-140341.jpg"},{"imageSrc":"http://img.b2bpic.net/free-photo/group-friends-eating-pizza-home-together_23-2150419422.jpg"},{"imageSrc":"http://img.b2bpic.net/free-photo/pizza-with-tomato-slices-garlic-lemon-chili-pepper-corn-mint-leaves-pizza-board-gray-wooden-background-high-angle-view_176474-4612.jpg"}]];
|
||||
|
||||
return (
|
||||
<section
|
||||
aria-label="Hero section"
|
||||
className="relative flex flex-col items-center justify-center gap-8 md:gap-10 w-full min-h-svh pt-25 pb-20 md:pt-30"
|
||||
>
|
||||
<HeroBackgroundSlot />
|
||||
<div className="flex flex-col items-center gap-3 w-content-width mx-auto text-center">
|
||||
<div className="px-3 py-1 mb-1 text-sm card rounded w-fit">
|
||||
<p>{"Taste of San Francisco"}</p>
|
||||
</div>
|
||||
|
||||
<TextAnimation
|
||||
text={"Authentic Pizza, Freshly Made Daily"}
|
||||
variant="fade"
|
||||
gradientText={true}
|
||||
tag="h1"
|
||||
className="md:max-w-8/10 text-7xl 2xl:text-8xl leading-[1.15] font-semibold text-center text-balance"
|
||||
/>
|
||||
|
||||
<TextAnimation
|
||||
text={"Indulge in the finest pizzas crafted with passion and premium, locally-sourced ingredients. Experience the true flavor of San Francisco in every bite."}
|
||||
variant="fade"
|
||||
gradientText={false}
|
||||
tag="p"
|
||||
className="md:max-w-7/10 text-lg md:text-xl leading-snug text-balance"
|
||||
/>
|
||||
|
||||
<div className="flex flex-wrap justify-center gap-3 mt-2 md:mt-3">
|
||||
<Button text={{"text":"Order Now","href":"#contact"}.text} href={{"text":"Order Now","href":"#contact"}.href} variant="primary"/>
|
||||
<Button text={{"text":"View Menu","href":"#menu"}.text} href={{"text":"View Menu","href":"#menu"}.href} variant="secondary"animationDelay={0.1} />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="w-content-width mx-auto overflow-hidden mask-fade-x">
|
||||
<div className="flex w-max animate-marquee-horizontal" style={{ animationDuration: "60s" }}>
|
||||
{duplicated.map((item, i) => (
|
||||
<div key={i} className="shrink-0 w-60 md:w-75 2xl:w-80 aspect-4/5 mr-3 md:mr-5 p-2 xl:p-3 2xl:p-4 card rounded-lg overflow-hidden">
|
||||
<ImageOrVideo
|
||||
imageSrc={item.imageSrc}
|
||||
videoSrc={item.videoSrc}
|
||||
className="w-full h-full rounded-lg object-cover"
|
||||
/>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
};
|
||||
|
||||
export default function HeroSection() {
|
||||
return (
|
||||
<div data-webild-section="hero" id="hero">
|
||||
<HeroInline />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
131
src/pages/HomePage/sections/Menu.tsx
Normal file
131
src/pages/HomePage/sections/Menu.tsx
Normal file
@@ -0,0 +1,131 @@
|
||||
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
|
||||
// file as the canonical source for the "menu" section.
|
||||
|
||||
import React from 'react';
|
||||
import FeaturesAttributeCards from '@/components/sections/features/FeaturesAttributeCards';
|
||||
import { Award, Clock, DollarSign, Droplet, Flame, Pizza, Star, Wheat } from "lucide-react";
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function MenuSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="menu" data-section="menu">
|
||||
<SectionErrorBoundary name="menu">
|
||||
<FeaturesAttributeCards
|
||||
tag="Our Delicious Selection"
|
||||
title="Irresistible Pizzas for Every Craving"
|
||||
description="Explore our diverse menu, from classic favorites to unique San Francisco-inspired creations. Each pizza is made with love and attention to detail, promising an unforgettable taste experience."
|
||||
items={[
|
||||
{
|
||||
title: "The Golden Gate Pepperoni",
|
||||
tags: "Classic, Meat",
|
||||
badge: "Popular",
|
||||
details: [
|
||||
{
|
||||
icon: DollarSign,
|
||||
label: "Price",
|
||||
value: "$24.99",
|
||||
},
|
||||
{
|
||||
icon: Clock,
|
||||
label: "Cook Time",
|
||||
value: "15 min",
|
||||
},
|
||||
],
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/top-view-delicious-baked-pineapple-papaya-pizza_23-2148753778.jpg",
|
||||
},
|
||||
{
|
||||
title: "Alcatraz Margherita",
|
||||
tags: "Vegetarian, Classic",
|
||||
badge: "Signature",
|
||||
details: [
|
||||
{
|
||||
icon: DollarSign,
|
||||
label: "Price",
|
||||
value: "$22.99",
|
||||
},
|
||||
{
|
||||
icon: Clock,
|
||||
label: "Cook Time",
|
||||
value: "12 min",
|
||||
},
|
||||
],
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/top-view-delicious-pizza-with-fresh-cheese_23-2150096954.jpg",
|
||||
},
|
||||
{
|
||||
title: "Fisherman's Wharf Veggie",
|
||||
tags: "Vegetarian, Fresh",
|
||||
badge: "Healthy",
|
||||
details: [
|
||||
{
|
||||
icon: DollarSign,
|
||||
label: "Price",
|
||||
value: "$26.99",
|
||||
},
|
||||
{
|
||||
icon: Clock,
|
||||
label: "Cook Time",
|
||||
value: "18 min",
|
||||
},
|
||||
],
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/pizza-with-fried-sausage-bell-pepper_141793-345.jpg",
|
||||
},
|
||||
{
|
||||
title: "Bay Breeze BBQ Chicken",
|
||||
tags: "Chicken, California",
|
||||
badge: "New",
|
||||
details: [
|
||||
{
|
||||
icon: DollarSign,
|
||||
label: "Price",
|
||||
value: "$28.99",
|
||||
},
|
||||
{
|
||||
icon: Clock,
|
||||
label: "Cook Time",
|
||||
value: "17 min",
|
||||
},
|
||||
],
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/april-fools-day-still-life-with-paper-pizza_23-2151358301.jpg",
|
||||
},
|
||||
{
|
||||
title: "Sourdough Supreme",
|
||||
tags: "Meat, Veggies",
|
||||
badge: "Big One",
|
||||
details: [
|
||||
{
|
||||
icon: DollarSign,
|
||||
label: "Price",
|
||||
value: "$29.99",
|
||||
},
|
||||
{
|
||||
icon: Clock,
|
||||
label: "Cook Time",
|
||||
value: "20 min",
|
||||
},
|
||||
],
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/pizza-table-green-color_58702-1317.jpg",
|
||||
},
|
||||
{
|
||||
title: "Chef's Daily Special",
|
||||
tags: "Seasonal, Unique",
|
||||
badge: "Limited",
|
||||
details: [
|
||||
{
|
||||
icon: DollarSign,
|
||||
label: "Price",
|
||||
value: "Varies",
|
||||
},
|
||||
{
|
||||
icon: Clock,
|
||||
label: "Cook Time",
|
||||
value: "20 min",
|
||||
},
|
||||
],
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/chef-white-uniform-prepare-pizzaa_1157-27034.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
62
src/pages/HomePage/sections/Metrics.tsx
Normal file
62
src/pages/HomePage/sections/Metrics.tsx
Normal file
@@ -0,0 +1,62 @@
|
||||
import React from 'react';
|
||||
import { Pizza, Star, Award } from "lucide-react";
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
import Button from "@/components/ui/Button";
|
||||
import Tag from "@/components/ui/Tag";
|
||||
import Card from "@/components/ui/Card";
|
||||
import ScrollReveal from "@/components/ui/ScrollReveal";
|
||||
|
||||
export default function MetricsSection(): React.JSX.Element {
|
||||
const metrics = [
|
||||
{
|
||||
icon: Pizza,
|
||||
title: "Pizzas Baked",
|
||||
value: "50,000+",
|
||||
},
|
||||
{
|
||||
icon: Star,
|
||||
title: "Happy Customers",
|
||||
value: "10,000+",
|
||||
},
|
||||
{
|
||||
icon: Award,
|
||||
title: "Years Serving SF",
|
||||
value: "15+",
|
||||
},
|
||||
];
|
||||
|
||||
return (
|
||||
<div id="metrics" data-webild-section="metrics">
|
||||
<SectionErrorBoundary name="metrics">
|
||||
<section className="bg-background">
|
||||
<div className="max-w-content-width mx-auto px-6">
|
||||
<div className="text-center">
|
||||
<ScrollReveal variant="slide-up">
|
||||
<Tag text="Our Impact" className="mb-4" />
|
||||
<h2 className="text-4xl md:text-5xl font-bold text-foreground mb-6">A Taste of Our Success</h2>
|
||||
<p className="text-lg text-muted-foreground max-w-content-width mx-auto">
|
||||
More than just pizza, it's a legacy of flavor and satisfied customers.
|
||||
</p>
|
||||
</ScrollReveal>
|
||||
</div>
|
||||
|
||||
<div className="grid grid-cols-1 md:grid-cols-3 gap-8">
|
||||
{metrics.map((metric, index) => (
|
||||
<ScrollReveal key={index} variant="slide-up" delay={index * 0.1} className="h-full">
|
||||
<Card className="p-8 flex flex-col items-center text-center h-full">
|
||||
<div className="w-16 h-16 rounded-full bg-primary-cta/10 flex items-center justify-center mb-6 text-primary-cta">
|
||||
<metric.icon size={32} />
|
||||
</div>
|
||||
<h3 className="text-4xl font-bold text-foreground mb-2">{metric.value}</h3>
|
||||
<p className="text-lg text-muted-foreground mb-8 flex-grow">{metric.title}</p>
|
||||
<Button text="Contact" variant="secondary" className="w-full mt-auto" />
|
||||
</Card>
|
||||
</ScrollReveal>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
65
src/pages/HomePage/sections/Reviews.tsx
Normal file
65
src/pages/HomePage/sections/Reviews.tsx
Normal file
@@ -0,0 +1,65 @@
|
||||
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
|
||||
// file as the canonical source for the "reviews" section.
|
||||
|
||||
import React from 'react';
|
||||
import TestimonialRatingCards from '@/components/sections/testimonial/TestimonialRatingCards';
|
||||
import { BadgeCheck } from 'lucide-react';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function ReviewsSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="reviews" data-section="reviews">
|
||||
<SectionErrorBoundary name="reviews">
|
||||
<TestimonialRatingCards
|
||||
tag="What Our Guests Say"
|
||||
title="Rave Reviews from Pizza Lovers"
|
||||
description="Our customers can't get enough of our authentic flavors and friendly service. Hear what they have to say!"
|
||||
testimonials={[
|
||||
{
|
||||
name: (<span className="inline-flex items-center gap-1">Sarah J. <BadgeCheck className="w-4 h-4 fill-blue-500 text-white" /></span>) as unknown as string,
|
||||
role: "Local Resident",
|
||||
quote: "The best pizza in San Francisco, hands down! The crust is perfect, and the toppings are always fresh. A must-try!",
|
||||
rating: 5,
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/attractive-hipster-dressed-leather-jacket-eating-vegan-burger_613910-16395.jpg",
|
||||
},
|
||||
{
|
||||
name: (<span className="inline-flex items-center gap-1">Michael T. <BadgeCheck className="w-4 h-4 fill-blue-500 text-white" /></span>) as unknown as string,
|
||||
role: "Food Blogger",
|
||||
quote: "An absolute culinary delight! Every slice is a journey of flavor. The Margherita is exceptional.",
|
||||
rating: 5,
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/medium-shot-friends-eating-pizza_23-2151231308.jpg",
|
||||
},
|
||||
{
|
||||
name: (<span className="inline-flex items-center gap-1">Emily R. <BadgeCheck className="w-4 h-4 fill-blue-500 text-white" /></span>) as unknown as string,
|
||||
role: "Tech Professional",
|
||||
quote: "Fast, friendly, and incredibly delicious. My go-to spot for pizza night. Highly recommend the BBQ Chicken!",
|
||||
rating: 4,
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/medium-shot-woman-eating-delicious-pizza_23-2150317035.jpg",
|
||||
},
|
||||
{
|
||||
name: (<span className="inline-flex items-center gap-1">David L. <BadgeCheck className="w-4 h-4 fill-blue-500 text-white" /></span>) as unknown as string,
|
||||
role: "Tourist",
|
||||
quote: "Stumbled upon this gem and was blown away. Truly authentic taste, felt like I was back in Italy!",
|
||||
rating: 5,
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/handsome-smiling-man-eat-salade-restaurant-waiting-woman-with-bouquet-roses_496169-302.jpg",
|
||||
},
|
||||
{
|
||||
name: (<span className="inline-flex items-center gap-1">Jessica B. <BadgeCheck className="w-4 h-4 fill-blue-500 text-white" /></span>) as unknown as string,
|
||||
role: "Student",
|
||||
quote: "Affordable and amazing quality. Perfect for a quick lunch or a relaxed dinner with friends. Loved the veggie options.",
|
||||
rating: 4,
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/front-view-family-eating-pizza-outdoors_23-2149931059.jpg",
|
||||
},
|
||||
{
|
||||
name: (<span className="inline-flex items-center gap-1">Chris P. <BadgeCheck className="w-4 h-4 fill-blue-500 text-white" /></span>) as unknown as string,
|
||||
role: "Artisan Baker",
|
||||
quote: "As a fellow baker, I appreciate the craftsmanship. The dough is expertly fermented, making for a superb crust.",
|
||||
rating: 5,
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/side-view-man-eating-pizza_23-2149454362.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
76
src/pages/HomePage/sections/Team.tsx
Normal file
76
src/pages/HomePage/sections/Team.tsx
Normal file
@@ -0,0 +1,76 @@
|
||||
import React from 'react';
|
||||
import TeamStackedCards from '@/components/sections/team/TeamStackedCards';
|
||||
import Tag from '@/components/ui/Tag';
|
||||
import ImageOrVideo from '@/components/ui/ImageOrVideo';
|
||||
import ScrollReveal from '@/components/ui/ScrollReveal';
|
||||
|
||||
export default function TeamSection() {
|
||||
const members = [
|
||||
{
|
||||
name: "Chef Marco",
|
||||
role: "Head Pizzaiolo",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/italian-chef-is-putting-gourmet-freshly-made-pizza-stone-oven_613910-14121.jpg",
|
||||
},
|
||||
{
|
||||
name: "Sophia Rodriguez",
|
||||
role: "Assistant Chef",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/smiling-young-pretty-delivery-girl-red-uniform-cap-holding-pizza-packages_141793-31534.jpg",
|
||||
},
|
||||
{
|
||||
name: "David Kim",
|
||||
role: "Operations Manager",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/woman-looking-goodies-local-producer_23-2149110825.jpg",
|
||||
},
|
||||
];
|
||||
|
||||
return (
|
||||
<div id="team" data-webild-section="team">
|
||||
<div className="hidden">
|
||||
<TeamStackedCards
|
||||
tag="Meet the Maestros"
|
||||
title="Our Passionate Pizza Crew"
|
||||
description="Behind every delicious pizza is a dedicated team committed to quality and a warm dining experience."
|
||||
members={members}
|
||||
/>
|
||||
</div>
|
||||
<div className="bg-background">
|
||||
<div className="max-w-content-width mx-auto px-6">
|
||||
<ScrollReveal variant="slide-up">
|
||||
<div className="text-center">
|
||||
<Tag text="Meet the Maestros" className="mb-4" />
|
||||
<h2 className="text-4xl md:text-5xl font-bold text-foreground mb-4">Our Passionate Pizza Crew</h2>
|
||||
<p className="text-lg text-muted-foreground max-w-content-width mx-auto">
|
||||
Behind every delicious pizza is a dedicated team committed to quality and a warm dining experience.
|
||||
</p>
|
||||
</div>
|
||||
</ScrollReveal>
|
||||
|
||||
<div className="grid grid-cols-1 md:grid-cols-3 gap-8">
|
||||
{members.map((member, index) => (
|
||||
<ScrollReveal key={index} variant="slide-up" delay={index * 0.1}>
|
||||
<div className="group relative rounded-theme overflow-hidden bg-card border border-border">
|
||||
<div className="relative aspect-[4/5] overflow-hidden">
|
||||
<ImageOrVideo
|
||||
imageSrc={member.imageSrc}
|
||||
className="w-full h-full object-cover transition-transform duration-500 group-hover:scale-105"
|
||||
/>
|
||||
<div className="absolute top-4 left-4 z-10">
|
||||
<div className="flex items-center gap-2 px-3 py-1.5 rounded-full bg-white/20 backdrop-blur-md border border-white/30 shadow-sm">
|
||||
<span className="w-2 h-2 rounded-full bg-green-400 animate-pulse"></span>
|
||||
<span className="text-xs font-medium text-white drop-shadow-md">Active now</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="p-6 text-center">
|
||||
<h3 className="text-xl font-bold text-foreground mb-1">{member.name}</h3>
|
||||
<p className="text-sm text-muted-foreground">{member.role}</p>
|
||||
</div>
|
||||
</div>
|
||||
</ScrollReveal>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user