Bob AI: Added location and hours section with contact details

This commit is contained in:
kudinDmitriyUp
2026-06-15 12:44:10 +00:00
parent 86a4034d3a
commit 3aae5ec94a
10 changed files with 428 additions and 250 deletions

View File

@@ -1,262 +1,38 @@
import AboutText from '@/components/sections/about/AboutText';
import ContactCta from '@/components/sections/contact/ContactCta';
import FaqSplitMedia from '@/components/sections/faq/FaqSplitMedia';
import FeaturesRevealCardsBento from '@/components/sections/features/FeaturesRevealCardsBento';
import HeroBrand from '@/components/sections/hero/HeroBrand';
import MetricsMediaCards from '@/components/sections/metrics/MetricsMediaCards';
import PricingHighlightedCards from '@/components/sections/pricing/PricingHighlightedCards';
import TestimonialQuoteCards from '@/components/sections/testimonial/TestimonialQuoteCards';
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 SpecialsSection from './HomePage/sections/Specials';
import MetricsSection from './HomePage/sections/Metrics';
import TestimonialsSection from './HomePage/sections/Testimonials';
import FaqSection from './HomePage/sections/Faq';
import ContactSection from './HomePage/sections/Contact';
import LocationHoursSection from './HomePage/sections/LocationHours';export default function HomePage(): React.JSX.Element {
return (
<>
<div id="hero" data-section="hero">
<SectionErrorBoundary name="hero">
<HeroBrand
brand="The Signature Menu"
description="Experience hand-crafted culinary excellence in every bite. Discover our thoughtfully curated selection of seasonal dishes designed for the refined palate."
primaryButton={{
text: "View Menu",
href: "#menu",
}}
secondaryButton={{
text: "Reserve Now",
href: "#contact",
}}
imageSrc="http://img.b2bpic.net/free-photo/view-table-arrangement-by-wedding-planner_23-2150167206.jpg"
/>
</SectionErrorBoundary>
</div>
<>
<HeroSection />
<div id="about" data-section="about">
<SectionErrorBoundary name="about">
<AboutText
title="Our Culinary Philosophy"
primaryButton={{
text: "Our Story",
href: "#",
}}
/>
</SectionErrorBoundary>
</div>
<AboutSection />
<div id="menu" data-section="menu">
<SectionErrorBoundary name="menu">
<FeaturesRevealCardsBento
tag="Our Menu"
title="Discover Our Offerings"
description="Categories crafted for your palate."
items={[
{
title: "Appetizers",
description: "Small plates crafted to start your evening.",
href: "#",
imageSrc: "http://img.b2bpic.net/free-photo/top-view-shot-plate-with-red-caviar-servings-crispy-rusks-wooden-table-food-nutrition-eating-decoration-restaurant-cafe-cafeteria-menu-order-luxury-lifestyle-concept_7502-5805.jpg",
},
{
title: "Main Courses",
description: "Hearty, signature dishes prepared to perfection.",
href: "#",
imageSrc: "http://img.b2bpic.net/free-photo/top-view-delicious-potato-pies-with-pumpkin-inside-plate-grey-background-oven-bake-color-dish-dinner-slice_140725-99289.jpg",
},
{
title: "Pasta Corner",
description: "Authentic handmade Italian noodles.",
href: "#",
imageSrc: "http://img.b2bpic.net/free-photo/close-up-person-making-pasta-pan_23-2148296929.jpg",
},
{
title: "Fresh Sea",
description: "Locally caught seafood selections.",
href: "#",
imageSrc: "http://img.b2bpic.net/free-photo/various-salads-lettuce-carrot_141793-150.jpg",
},
{
title: "Desserts",
description: "Sweet finishers to satisfy the soul.",
href: "#",
imageSrc: "http://img.b2bpic.net/free-photo/top-view-little-creamy-cake-with-chocolate-cookies-dark-surface-biscuit-cake-sweet-pie-sugar-cookie_140725-118183.jpg",
},
{
title: "Artisan Breads",
description: "Freshly baked in-house daily.",
href: "#",
imageSrc: "http://img.b2bpic.net/free-photo/close-up-pastry-chef-preparing-food_23-2149039001.jpg",
},
{
title: "Signature Cocktails",
description: "Hand-mixed spirits and seasonal fusions.",
href: "#",
imageSrc: "http://img.b2bpic.net/free-photo/glass-with-champagne-new-year-anniversary_23-2148339613.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
<MenuSection />
<div id="specials" data-section="specials">
<SectionErrorBoundary name="specials">
<PricingHighlightedCards
tag="Daily Specials"
title="Today's Featured Pairings"
plans={[
{
tag: "Seasonal",
price: "$38",
description: "Fresh harvest tasting experience.",
features: [
"Starter",
"Entree",
"Wine Pair",
],
primaryButton: {
text: "Select",
href: "#",
},
},
{
tag: "Signature",
price: "$52",
description: "Our chef's finest creation.",
features: [
"3-Course",
"Signature Pairing",
"Dessert",
],
highlight: "Chef Choice",
primaryButton: {
text: "Select",
href: "#",
},
},
{
tag: "Brunch",
price: "$28",
description: "Weekend morning delicacies.",
features: [
"Main",
"Coffee",
"Pastry",
],
primaryButton: {
text: "Select",
href: "#",
},
},
]}
description="Explore our chef's current seasonal highlights."
/>
</SectionErrorBoundary>
</div>
<SpecialsSection />
<div id="metrics" data-section="metrics">
<SectionErrorBoundary name="metrics">
<MetricsMediaCards
tag="Our Stats"
title="Excellence in Numbers"
metrics={[
{
value: "15+",
title: "Years Experience",
description: "Culinary expertise since inception.",
imageSrc: "http://img.b2bpic.net/free-photo/black-background-with-cutlery_23-2149872585.jpg",
},
{
value: "200+",
title: "Seasonal Dishes",
description: "A rotating selection for you.",
imageSrc: "http://img.b2bpic.net/free-photo/beef-steak-served-with-yellow-mashed-puree-vegetables_140725-1492.jpg",
},
]}
description="Reflecting years of culinary passion."
/>
</SectionErrorBoundary>
</div>
<MetricsSection />
<div id="testimonials" data-section="testimonials">
<SectionErrorBoundary name="testimonials">
<TestimonialQuoteCards
tag="Feedback"
title="What Our Patrons Say"
testimonials={[
{
name: "Sarah J.",
role: "Foodie",
quote: "The best menu curation I've ever experienced in the city.",
imageSrc: "http://img.b2bpic.net/free-photo/couple-using-tablet-sitting-restaurant_23-2147826816.jpg",
},
{
name: "Michael R.",
role: "Local",
quote: "I always find something new and exciting to try.",
imageSrc: "http://img.b2bpic.net/free-photo/medium-shot-man-eating-salmon-bowl_23-2150427596.jpg",
},
{
name: "Emily D.",
role: "Guest",
quote: "A masterclass in culinary organization and presentation.",
imageSrc: "http://img.b2bpic.net/free-photo/medium-shot-smiley-kids-table_23-2149213368.jpg",
},
{
name: "David W.",
role: "Regular",
quote: "Consistent quality and always fresh options.",
imageSrc: "http://img.b2bpic.net/free-photo/positive-caucasian-business-male-taking-off-face-mask-virus-protection-show-his-smile-with-cheerful-get-well-fight-spread-covid-19-epidemic-health-ideas-concept_609648-1061.jpg",
},
{
name: "Anna P.",
role: "Diner",
quote: "I love how categorized and clean their menu is.",
imageSrc: "http://img.b2bpic.net/free-photo/happiness-leisure-lifestyle-concept-smiling-african-american-female-recreates-cafe-restaurant-eats-delicious-dessert-drinks-cocktail-happy-have-pleasant-conversation-with-interlocutor_273609-2194.jpg",
},
]}
description="Hear directly from those we serve."
/>
</SectionErrorBoundary>
</div>
<TestimonialsSection />
<div id="faq" data-section="faq">
<SectionErrorBoundary name="faq">
<FaqSplitMedia
tag="Questions"
title="Information & Services"
items={[
{
question: "Do you offer reservations?",
answer: "Yes, we accept bookings via our contact page.",
},
{
question: "Are there vegan options?",
answer: "Yes, our menu features many plant-based dishes.",
},
{
question: "Is parking available?",
answer: "We offer complimentary valet parking.",
},
]}
imageSrc="http://img.b2bpic.net/free-photo/chef-working-together-professional-kitchen_23-2149727963.jpg"
description="Common inquiries about our bistro experience."
/>
</SectionErrorBoundary>
</div>
<FaqSection />
<div id="contact" data-section="contact">
<SectionErrorBoundary name="contact">
<ContactCta
tag="Reserve"
text="Book your table now for a signature experience."
primaryButton={{
text: "Make Reservation",
href: "#",
}}
secondaryButton={{
text: "Get Directions",
href: "#",
}}
/>
</SectionErrorBoundary>
</div>
<ContactSection />
<LocationHoursSection />
</>
);
}

View 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="Our Culinary Philosophy"
primaryButton={{
text: "Our Story",
href: "#",
}}
/>
</SectionErrorBoundary>
</div>
);
}

View 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="Reserve"
text="Book your table now for a signature experience."
primaryButton={{
text: "Make Reservation",
href: "#",
}}
secondaryButton={{
text: "Get Directions",
href: "#",
}}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,35 @@
// 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 FaqSplitMedia from '@/components/sections/faq/FaqSplitMedia';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function FaqSection(): React.JSX.Element {
return (
<div id="faq" data-section="faq">
<SectionErrorBoundary name="faq">
<FaqSplitMedia
tag="Questions"
title="Information & Services"
items={[
{
question: "Do you offer reservations?",
answer: "Yes, we accept bookings via our contact page.",
},
{
question: "Are there vegan options?",
answer: "Yes, our menu features many plant-based dishes.",
},
{
question: "Is parking available?",
answer: "We offer complimentary valet parking.",
},
]}
imageSrc="http://img.b2bpic.net/free-photo/chef-working-together-professional-kitchen_23-2149727963.jpg"
description="Common inquiries about our bistro experience."
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,28 @@
// 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 HeroBrand from '@/components/sections/hero/HeroBrand';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function HeroSection(): React.JSX.Element {
return (
<div id="hero" data-section="hero">
<SectionErrorBoundary name="hero">
<HeroBrand
brand="The Signature Menu"
description="Experience hand-crafted culinary excellence in every bite. Discover our thoughtfully curated selection of seasonal dishes designed for the refined palate."
primaryButton={{
text: "View Menu",
href: "#menu",
}}
secondaryButton={{
text: "Reserve Now",
href: "#contact",
}}
imageSrc="http://img.b2bpic.net/free-photo/view-table-arrangement-by-wedding-planner_23-2150167206.jpg"
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,75 @@
import { MapPin, Clock, MessageCircle } from "lucide-react"
import TextAnimation from "@/components/ui/TextAnimation"
import ScrollReveal from "@/components/ui/ScrollReveal"
import Button from "@/components/ui/Button"
export default function LocationHoursSection() {
return (
<section className="relative w-full py-24 bg-background" data-webild-section="location-hours" id="location-hours">
<div className="w-content-width mx-auto px-6">
<div className="text-center max-w-2xl mx-auto mb-16">
<TextAnimation
variant="fade-blur"
tag="span"
text="Visit Us"
className="inline-block text-sm font-medium tracking-wider uppercase text-muted-foreground mb-4"
gradientText={false}
/>
<TextAnimation
variant="slide-up"
tag="h2"
text="Location & Hours"
className="text-4xl md:text-5xl font-bold text-foreground mb-6"
gradientText={false}
/>
<TextAnimation
variant="fade"
tag="p"
text="Plan your visit to Crave Kenya - Kilimani. We look forward to hosting you."
className="text-lg text-muted-foreground"
gradientText={false}
/>
</div>
<div className="grid grid-cols-1 md:grid-cols-3 gap-8">
<ScrollReveal variant="slide-up" delay={0.1}>
<div className="card p-8 rounded-theme flex flex-col items-center text-center h-full">
<div className="w-12 h-12 rounded-full bg-primary-cta/10 flex items-center justify-center mb-6 text-primary-cta">
<MapPin className="w-6 h-6" />
</div>
<h3 className="text-xl font-semibold text-foreground mb-3">Location</h3>
<p className="text-muted-foreground mb-6">Ring Rd Kilimani, Nairobi</p>
<div className="mt-auto">
<Button variant="secondary" text="Get Directions" href="https://maps.google.com/?q=Crave+Kenya+Kilimani" />
</div>
</div>
</ScrollReveal>
<ScrollReveal variant="slide-up" delay={0.2}>
<div className="card p-8 rounded-theme flex flex-col items-center text-center h-full">
<div className="w-12 h-12 rounded-full bg-primary-cta/10 flex items-center justify-center mb-6 text-primary-cta">
<Clock className="w-6 h-6" />
</div>
<h3 className="text-xl font-semibold text-foreground mb-3">Operating Hours</h3>
<p className="text-muted-foreground mb-2">Monday - Sunday</p>
<p className="text-foreground font-medium">6:00 AM 1:00 AM</p>
</div>
</ScrollReveal>
<ScrollReveal variant="slide-up" delay={0.3}>
<div className="card p-8 rounded-theme flex flex-col items-center text-center h-full">
<div className="w-12 h-12 rounded-full bg-primary-cta/10 flex items-center justify-center mb-6 text-primary-cta">
<MessageCircle className="w-6 h-6" />
</div>
<h3 className="text-xl font-semibold text-foreground mb-3">WhatsApp & Orders</h3>
<p className="text-muted-foreground mb-6">0756 600600</p>
<div className="mt-auto">
<Button variant="primary" text="WhatsApp Us" href="https://wa.me/254756600600" />
</div>
</div>
</ScrollReveal>
</div>
</div>
</section>
)
}

View File

@@ -0,0 +1,64 @@
// 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 FeaturesRevealCardsBento from '@/components/sections/features/FeaturesRevealCardsBento';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function MenuSection(): React.JSX.Element {
return (
<div id="menu" data-section="menu">
<SectionErrorBoundary name="menu">
<FeaturesRevealCardsBento
tag="Our Menu"
title="Discover Our Offerings"
description="Categories crafted for your palate."
items={[
{
title: "Appetizers",
description: "Small plates crafted to start your evening.",
href: "#",
imageSrc: "http://img.b2bpic.net/free-photo/top-view-shot-plate-with-red-caviar-servings-crispy-rusks-wooden-table-food-nutrition-eating-decoration-restaurant-cafe-cafeteria-menu-order-luxury-lifestyle-concept_7502-5805.jpg",
},
{
title: "Main Courses",
description: "Hearty, signature dishes prepared to perfection.",
href: "#",
imageSrc: "http://img.b2bpic.net/free-photo/top-view-delicious-potato-pies-with-pumpkin-inside-plate-grey-background-oven-bake-color-dish-dinner-slice_140725-99289.jpg",
},
{
title: "Pasta Corner",
description: "Authentic handmade Italian noodles.",
href: "#",
imageSrc: "http://img.b2bpic.net/free-photo/close-up-person-making-pasta-pan_23-2148296929.jpg",
},
{
title: "Fresh Sea",
description: "Locally caught seafood selections.",
href: "#",
imageSrc: "http://img.b2bpic.net/free-photo/various-salads-lettuce-carrot_141793-150.jpg",
},
{
title: "Desserts",
description: "Sweet finishers to satisfy the soul.",
href: "#",
imageSrc: "http://img.b2bpic.net/free-photo/top-view-little-creamy-cake-with-chocolate-cookies-dark-surface-biscuit-cake-sweet-pie-sugar-cookie_140725-118183.jpg",
},
{
title: "Artisan Breads",
description: "Freshly baked in-house daily.",
href: "#",
imageSrc: "http://img.b2bpic.net/free-photo/close-up-pastry-chef-preparing-food_23-2149039001.jpg",
},
{
title: "Signature Cocktails",
description: "Hand-mixed spirits and seasonal fusions.",
href: "#",
imageSrc: "http://img.b2bpic.net/free-photo/glass-with-champagne-new-year-anniversary_23-2148339613.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,34 @@
// 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 Stats"
title="Excellence in Numbers"
metrics={[
{
value: "15+",
title: "Years Experience",
description: "Culinary expertise since inception.",
imageSrc: "http://img.b2bpic.net/free-photo/black-background-with-cutlery_23-2149872585.jpg",
},
{
value: "200+",
title: "Seasonal Dishes",
description: "A rotating selection for you.",
imageSrc: "http://img.b2bpic.net/free-photo/beef-steak-served-with-yellow-mashed-puree-vegetables_140725-1492.jpg",
},
]}
description="Reflecting years of culinary passion."
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,65 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "specials" section.
import React from 'react';
import PricingHighlightedCards from '@/components/sections/pricing/PricingHighlightedCards';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function SpecialsSection(): React.JSX.Element {
return (
<div id="specials" data-section="specials">
<SectionErrorBoundary name="specials">
<PricingHighlightedCards
tag="Daily Specials"
title="Today's Featured Pairings"
plans={[
{
tag: "Seasonal",
price: "$38",
description: "Fresh harvest tasting experience.",
features: [
"Starter",
"Entree",
"Wine Pair",
],
primaryButton: {
text: "Select",
href: "#",
},
},
{
tag: "Signature",
price: "$52",
description: "Our chef's finest creation.",
features: [
"3-Course",
"Signature Pairing",
"Dessert",
],
highlight: "Chef Choice",
primaryButton: {
text: "Select",
href: "#",
},
},
{
tag: "Brunch",
price: "$28",
description: "Weekend morning delicacies.",
features: [
"Main",
"Coffee",
"Pastry",
],
primaryButton: {
text: "Select",
href: "#",
},
},
]}
description="Explore our chef's current seasonal highlights."
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,52 @@
// 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 TestimonialQuoteCards from '@/components/sections/testimonial/TestimonialQuoteCards';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function TestimonialsSection(): React.JSX.Element {
return (
<div id="testimonials" data-section="testimonials">
<SectionErrorBoundary name="testimonials">
<TestimonialQuoteCards
tag="Feedback"
title="What Our Patrons Say"
testimonials={[
{
name: "Sarah J.",
role: "Foodie",
quote: "The best menu curation I've ever experienced in the city.",
imageSrc: "http://img.b2bpic.net/free-photo/couple-using-tablet-sitting-restaurant_23-2147826816.jpg",
},
{
name: "Michael R.",
role: "Local",
quote: "I always find something new and exciting to try.",
imageSrc: "http://img.b2bpic.net/free-photo/medium-shot-man-eating-salmon-bowl_23-2150427596.jpg",
},
{
name: "Emily D.",
role: "Guest",
quote: "A masterclass in culinary organization and presentation.",
imageSrc: "http://img.b2bpic.net/free-photo/medium-shot-smiley-kids-table_23-2149213368.jpg",
},
{
name: "David W.",
role: "Regular",
quote: "Consistent quality and always fresh options.",
imageSrc: "http://img.b2bpic.net/free-photo/positive-caucasian-business-male-taking-off-face-mask-virus-protection-show-his-smile-with-cheerful-get-well-fight-spread-covid-19-epidemic-health-ideas-concept_609648-1061.jpg",
},
{
name: "Anna P.",
role: "Diner",
quote: "I love how categorized and clean their menu is.",
imageSrc: "http://img.b2bpic.net/free-photo/happiness-leisure-lifestyle-concept-smiling-african-american-female-recreates-cafe-restaurant-eats-delicious-dessert-drinks-cocktail-happy-have-pleasant-conversation-with-interlocutor_273609-2194.jpg",
},
]}
description="Hear directly from those we serve."
/>
</SectionErrorBoundary>
</div>
);
}