Merge version_2_1781624814065 into main #1
@@ -1,227 +1,33 @@
|
||||
import AboutText from '@/components/sections/about/AboutText';
|
||||
import ContactCta from '@/components/sections/contact/ContactCta';
|
||||
import FaqTabbedAccordion from '@/components/sections/faq/FaqTabbedAccordion';
|
||||
import FeaturesImageBento from '@/components/sections/features/FeaturesImageBento';
|
||||
import HeroSplitVerticalMarquee from '@/components/sections/hero/HeroSplitVerticalMarquee';
|
||||
import MetricsMediaCards from '@/components/sections/metrics/MetricsMediaCards';
|
||||
import TestimonialRatingCards from '@/components/sections/testimonial/TestimonialRatingCards';
|
||||
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. Non-block content (wrappers, non-inlinable sections) is
|
||||
// preserved inline; extracted section blocks become <XSection/> refs.
|
||||
|
||||
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 TestimonialsSection from './HomePage/sections/Testimonials';
|
||||
import FaqSection from './HomePage/sections/Faq';
|
||||
import ContactSection from './HomePage/sections/Contact';
|
||||
|
||||
export default function HomePage(): React.JSX.Element {
|
||||
return (
|
||||
<>
|
||||
<div id="hero" data-section="hero">
|
||||
<SectionErrorBoundary name="hero">
|
||||
<HeroSplitVerticalMarquee
|
||||
tag="Since 1995"
|
||||
title="A Culinary Journey"
|
||||
description="Experience fine dining at its best with our seasonal ingredients and refined service."
|
||||
primaryButton={{
|
||||
text: "Book a Table",
|
||||
href: "#contact",
|
||||
}}
|
||||
secondaryButton={{
|
||||
text: "Explore Menu",
|
||||
href: "#menu",
|
||||
}}
|
||||
leftItems={[
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/restaurant-hall-with-round-square-tables-some-chairs-plants_140725-8030.jpg",
|
||||
},
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/fried-chicken-isolated-white_628469-378.jpg",
|
||||
},
|
||||
]}
|
||||
rightItems={[
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/top-view-fresh-cabbage-salad-inside-plate-dark-background_140725-136872.jpg",
|
||||
},
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/wedding-table-number-decoration_23-2149433859.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<>
|
||||
<HeroSection />
|
||||
|
||||
<div id="about" data-section="about">
|
||||
<SectionErrorBoundary name="about">
|
||||
<AboutText
|
||||
title="Crafted with passion, served with elegance."
|
||||
primaryButton={{
|
||||
text: "Our Story",
|
||||
href: "#about",
|
||||
}}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<AboutSection />
|
||||
|
||||
<div id="menu" data-section="menu">
|
||||
<SectionErrorBoundary name="menu">
|
||||
<FeaturesImageBento
|
||||
tag="Our Menu"
|
||||
title="Signature Creations"
|
||||
description="Hand-picked favorites prepared daily by our chefs."
|
||||
items={[
|
||||
{
|
||||
title: "Appetizers",
|
||||
description: "Delicate starters",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/front-view-cooked-squashes-designed-meal-inside-plate-grey-space_140725-83769.jpg",
|
||||
},
|
||||
{
|
||||
title: "Fresh Salads",
|
||||
description: "Farm-fresh ingredients",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/vegetable-salad-bowl-wooden-table_23-2148080140.jpg",
|
||||
},
|
||||
{
|
||||
title: "Steak",
|
||||
description: "Perfectly grilled cuts",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/top-view-vegetable-meal-with-cutlery-table-food-meal-restaurant-dinner_140725-28355.jpg",
|
||||
},
|
||||
{
|
||||
title: "Seafood",
|
||||
description: "Fresh daily catch",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/top-view-grilled-prawns-garnished-with-pickles-flowers_140725-1464.jpg",
|
||||
},
|
||||
{
|
||||
title: "Pasta",
|
||||
description: "Authentic artisan pasta",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/selective-focus-shot-delicious-unique-dish-beautifully-designed-served_181624-19185.jpg",
|
||||
},
|
||||
{
|
||||
title: "Desserts",
|
||||
description: "Sweet indulgence",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/top-view-from-afar-tasty-dessert-plate-pieces-cake-with-strawberries-chocolate-bowls-sweets-strawberries-cup-tea-with-lemon_140725-112021.jpg",
|
||||
},
|
||||
{
|
||||
title: "Wine",
|
||||
description: "Exclusive vintage selection",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/front-view-romantic-dinner-table_23-2148060311.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<MenuSection />
|
||||
|
||||
<div id="metrics" data-section="metrics">
|
||||
<SectionErrorBoundary name="metrics">
|
||||
<MetricsMediaCards
|
||||
tag="Our Success"
|
||||
title="Numbers behind the taste"
|
||||
description="Consistency is the foundation of our long-standing reputation."
|
||||
metrics={[
|
||||
{
|
||||
value: "25+",
|
||||
title: "Years in business",
|
||||
description: "Decades of culinary excellence",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/new-normal-time-coronavirus_637285-7876.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<MetricsSection />
|
||||
|
||||
<div id="testimonials" data-section="testimonials">
|
||||
<SectionErrorBoundary name="testimonials">
|
||||
<TestimonialRatingCards
|
||||
tag="Guest Stories"
|
||||
title="Heartfelt feedback"
|
||||
description="Hear what our patrons say about their experience."
|
||||
testimonials={[
|
||||
{
|
||||
name: "Alice M.",
|
||||
role: "Food Blogger",
|
||||
quote: "The best dining experience I've had in years.",
|
||||
rating: 5,
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/pov-businessman-attending-videocall-meeting-office-using-online-videoconference-talk-consultant-about-financial-strategy-company-employee-chatting-remote-teleconference-close-up_482257-40929.jpg",
|
||||
},
|
||||
{
|
||||
name: "John D.",
|
||||
role: "Chef",
|
||||
quote: "Technique and flavors are absolutely spot on.",
|
||||
rating: 5,
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/cheerful-asian-female-entrepreneur-sitting-table-cafe_1262-17235.jpg",
|
||||
},
|
||||
{
|
||||
name: "Sarah P.",
|
||||
role: "Regular",
|
||||
quote: "A true hidden gem in the heart of the city.",
|
||||
rating: 4,
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/medium-shot-smiley-people-bistro_23-2149366429.jpg",
|
||||
},
|
||||
{
|
||||
name: "Michael L.",
|
||||
role: "Local",
|
||||
quote: "Impeccable service and amazing pasta.",
|
||||
rating: 5,
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/close-up-young-handsome-modern-man-wearing-glasses-denim-jacket-yellow-background-with-happy-face-standing-smiling-with-confident-smile-showing-teeth_839833-30354.jpg",
|
||||
},
|
||||
{
|
||||
name: "Jessica R.",
|
||||
role: "Visitor",
|
||||
quote: "I love the warm atmosphere and unique menu.",
|
||||
rating: 5,
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/pleased-female-entrepreneur-trendy-sunglasses-denim-jacke_197531-31011.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<TestimonialsSection />
|
||||
|
||||
<div id="faq" data-section="faq">
|
||||
<SectionErrorBoundary name="faq">
|
||||
<FaqTabbedAccordion
|
||||
tag="Common Questions"
|
||||
title="Helpful Info"
|
||||
description="Everything you need to know about your visit."
|
||||
categories={[
|
||||
{
|
||||
name: "Reservations",
|
||||
items: [
|
||||
{
|
||||
question: "Do I need a reservation?",
|
||||
answer: "Highly recommended on weekends.",
|
||||
},
|
||||
{
|
||||
question: "What's the cancellation policy?",
|
||||
answer: "24-hour notice requested.",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Dietary",
|
||||
items: [
|
||||
{
|
||||
question: "Do you offer gluten-free?",
|
||||
answer: "Yes, we have many gluten-free options.",
|
||||
},
|
||||
{
|
||||
question: "Can I bring kids?",
|
||||
answer: "Absolutely, families are welcome.",
|
||||
},
|
||||
],
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<FaqSection />
|
||||
|
||||
<div id="contact" data-section="contact">
|
||||
<SectionErrorBoundary name="contact">
|
||||
<ContactCta
|
||||
tag="Ready to visit?"
|
||||
text="Reserve your table today and taste our seasonal signature dishes."
|
||||
primaryButton={{
|
||||
text: "Book Now",
|
||||
href: "#",
|
||||
}}
|
||||
secondaryButton={{
|
||||
text: "Contact Us",
|
||||
href: "mailto:hello@bistro.com",
|
||||
}}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<ContactSection />
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
22
src/pages/HomePage/sections/About.tsx
Normal file
22
src/pages/HomePage/sections/About.tsx
Normal file
@@ -0,0 +1,22 @@
|
||||
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
|
||||
// file as the canonical source for the "about" section.
|
||||
|
||||
import React from 'react';
|
||||
import AboutText from '@/components/sections/about/AboutText';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function AboutSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="about" data-section="about">
|
||||
<SectionErrorBoundary name="about">
|
||||
<AboutText
|
||||
title="Crafted with passion, served with elegance."
|
||||
primaryButton={{
|
||||
text: "Our Story",
|
||||
href: "#about",
|
||||
}}
|
||||
/>
|
||||
</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 to visit?"
|
||||
text="Reserve your table today and taste our seasonal signature dishes."
|
||||
primaryButton={{
|
||||
text: "Book Now",
|
||||
href: "#",
|
||||
}}
|
||||
secondaryButton={{
|
||||
text: "Contact Us",
|
||||
href: "mailto:hello@bistro.com",
|
||||
}}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
48
src/pages/HomePage/sections/Faq.tsx
Normal file
48
src/pages/HomePage/sections/Faq.tsx
Normal file
@@ -0,0 +1,48 @@
|
||||
// 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 FaqTabbedAccordion from '@/components/sections/faq/FaqTabbedAccordion';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function FaqSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="faq" data-section="faq">
|
||||
<SectionErrorBoundary name="faq">
|
||||
<FaqTabbedAccordion
|
||||
tag="Common Questions"
|
||||
title="Helpful Info"
|
||||
description="Everything you need to know about your visit."
|
||||
categories={[
|
||||
{
|
||||
name: "Reservations",
|
||||
items: [
|
||||
{
|
||||
question: "Do I need a reservation?",
|
||||
answer: "Highly recommended on weekends.",
|
||||
},
|
||||
{
|
||||
question: "What's the cancellation policy?",
|
||||
answer: "24-hour notice requested.",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Dietary",
|
||||
items: [
|
||||
{
|
||||
question: "Do you offer gluten-free?",
|
||||
answer: "Yes, we have many gluten-free options.",
|
||||
},
|
||||
{
|
||||
question: "Can I bring kids?",
|
||||
answer: "Absolutely, families are welcome.",
|
||||
},
|
||||
],
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
30
src/pages/HomePage/sections/Hero.tsx
Normal file
30
src/pages/HomePage/sections/Hero.tsx
Normal file
@@ -0,0 +1,30 @@
|
||||
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
|
||||
// file as the canonical source for the "hero" section.
|
||||
|
||||
import React from 'react';
|
||||
import HeroSplitVerticalMarquee from '@/components/sections/hero/HeroSplitVerticalMarquee';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function HeroSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="hero" data-section="hero">
|
||||
<SectionErrorBoundary name="hero">
|
||||
<HeroSplitVerticalMarquee
|
||||
tag="Since 1995"
|
||||
title="A Culinary Journey"
|
||||
description="Experience fine dining at its best with our seasonal ingredients and refined service."
|
||||
primaryButton={{
|
||||
text: "Book a Table",
|
||||
href: "#contact",
|
||||
}}
|
||||
secondaryButton={{
|
||||
text: "Explore Menu",
|
||||
href: "#menu",
|
||||
}}
|
||||
leftItems={[{"imageSrc":"https://images.unsplash.com/photo-1514933651103-005eec06c04b?q=80&w=2874&auto=format&fit=crop"},{"imageSrc":"https://images.unsplash.com/photo-1550966871-3ed3cdb5ed0c?q=80&w=2940&auto=format&fit=crop"}]}
|
||||
rightItems={[{"imageSrc":"https://images.unsplash.com/photo-1544148103-0773bf10d330?q=80&w=2940&auto=format&fit=crop"},{"imageSrc":"https://images.unsplash.com/photo-1559339352-11d035aa65de?q=80&w=2874&auto=format&fit=crop"}]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
21
src/pages/HomePage/sections/Menu.tsx
Normal file
21
src/pages/HomePage/sections/Menu.tsx
Normal file
@@ -0,0 +1,21 @@
|
||||
// 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 FeaturesImageBento from '@/components/sections/features/FeaturesImageBento';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function MenuSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="menu" data-section="menu">
|
||||
<SectionErrorBoundary name="menu">
|
||||
<FeaturesImageBento
|
||||
tag="Our Menu"
|
||||
title="Signature Creations"
|
||||
description="Hand-picked favorites prepared daily by our chefs."
|
||||
items={[{"title":"Appetizers","description":"Delicate starters","imageSrc":"https://images.unsplash.com/photo-1546069901-ba9599a7e63c?q=80&w=2680&auto=format&fit=crop"},{"imageSrc":"https://images.unsplash.com/photo-1512621776951-a57141f2eefd?q=80&w=2940&auto=format&fit=crop","description":"Farm-fresh ingredients","title":"Fresh Salads"},{"description":"Perfectly grilled cuts","title":"Steak","imageSrc":"https://images.unsplash.com/photo-1544025162-d76694265947?q=80&w=2938&auto=format&fit=crop"},{"description":"Fresh daily catch","title":"Seafood","imageSrc":"https://images.unsplash.com/photo-1559742811-822873691df8?q=80&w=2787&auto=format&fit=crop"},{"title":"Pasta","description":"Authentic artisan pasta","imageSrc":"https://images.unsplash.com/photo-1473093295043-cdd812d0e601?q=80&w=2940&auto=format&fit=crop"},{"title":"Desserts","description":"Sweet indulgence","imageSrc":"https://images.unsplash.com/photo-1551024601-bec78aea704b?q=80&w=2864&auto=format&fit=crop"},{"description":"Exclusive vintage selection","title":"Wine","imageSrc":"https://images.unsplash.com/photo-1510812431401-41d2bd2722f3?q=80&w=2940&auto=format&fit=crop"}]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
21
src/pages/HomePage/sections/Metrics.tsx
Normal file
21
src/pages/HomePage/sections/Metrics.tsx
Normal file
@@ -0,0 +1,21 @@
|
||||
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
|
||||
// file as the canonical source for the "metrics" section.
|
||||
|
||||
import React from 'react';
|
||||
import MetricsMediaCards from '@/components/sections/metrics/MetricsMediaCards';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function MetricsSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="metrics" data-section="metrics">
|
||||
<SectionErrorBoundary name="metrics">
|
||||
<MetricsMediaCards
|
||||
tag="Our Success"
|
||||
title="Numbers behind the taste"
|
||||
description="Consistency is the foundation of our long-standing reputation."
|
||||
metrics={[{"imageSrc":"https://images.unsplash.com/photo-1550966871-3ed3cdb5ed0c?q=80&w=2940&auto=format&fit=crop","description":"Decades of culinary excellence","value":"25+","title":"Years in business"}]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
21
src/pages/HomePage/sections/Testimonials.tsx
Normal file
21
src/pages/HomePage/sections/Testimonials.tsx
Normal file
@@ -0,0 +1,21 @@
|
||||
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
|
||||
// file as the canonical source for the "testimonials" section.
|
||||
|
||||
import React from 'react';
|
||||
import TestimonialRatingCards from '@/components/sections/testimonial/TestimonialRatingCards';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function TestimonialsSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="testimonials" data-section="testimonials">
|
||||
<SectionErrorBoundary name="testimonials">
|
||||
<TestimonialRatingCards
|
||||
tag="Guest Stories"
|
||||
title="Heartfelt feedback"
|
||||
description="Hear what our patrons say about their experience."
|
||||
testimonials={[{"imageSrc":"https://images.unsplash.com/photo-1534528741775-53994a69daeb?q=80&w=2864&auto=format&fit=crop","quote":"The best dining experience I've had in years.","rating":5,"name":"Alice M.","role":"Food Blogger"},{"quote":"Technique and flavors are absolutely spot on.","imageSrc":"https://images.unsplash.com/photo-1506794778202-cad84cf45f1d?q=80&w=2787&auto=format&fit=crop","rating":5,"name":"John D.","role":"Chef"},{"role":"Regular","quote":"A true hidden gem in the heart of the city.","imageSrc":"https://images.unsplash.com/photo-1494790108377-be9c29b29330?q=80&w=2787&auto=format&fit=crop","name":"Sarah P.","rating":4},{"rating":5,"name":"Michael L.","imageSrc":"https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?q=80&w=2787&auto=format&fit=crop","quote":"Impeccable service and amazing pasta.","role":"Local"},{"role":"Visitor","quote":"I love the warm atmosphere and unique menu.","imageSrc":"https://images.unsplash.com/photo-1531746020798-e6953c6e8e04?q=80&w=2864&auto=format&fit=crop","rating":5,"name":"Jessica R."}]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user