Merge version_2_1781563430051 into main #1

Merged
bender merged 1 commits from version_2_1781563430051 into main 2026-06-15 22:44:56 +00:00
10 changed files with 356 additions and 255 deletions

View File

@@ -5,13 +5,13 @@
:root {
/* @colorThemes/lightTheme/grayNavyBlue */
--background: #f5f4ef;
--card: #dad6cd;
--foreground: #2a2928;
--primary-cta: #2a2928;
--primary-cta-text: #f5f4ef;
--secondary-cta: #ecebea;
--secondary-cta-text: #2a2928;
--background: #1a1a1a;
--card: #262626;
--foreground: #eab308;
--primary-cta: #eab308;
--primary-cta-text: #1a1a1a;
--secondary-cta: #333333;
--secondary-cta-text: #eab308;
--accent: #ffffff;
--background-accent: #c6b180;

View File

@@ -1,260 +1,36 @@
import AboutTextSplit from '@/components/sections/about/AboutTextSplit';
import ContactCta from '@/components/sections/contact/ContactCta';
import FaqSplitMedia from '@/components/sections/faq/FaqSplitMedia';
import FeaturesDetailedCards from '@/components/sections/features/FeaturesDetailedCards';
import FeaturesImageBento from '@/components/sections/features/FeaturesImageBento';
import HeroBrand from '@/components/sections/hero/HeroBrand';
import MetricsFeatureCards from '@/components/sections/metrics/MetricsFeatureCards';
import TestimonialMarqueeOverlayCards from '@/components/sections/testimonial/TestimonialMarqueeOverlayCards';
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 SpecialtiesSection from './HomePage/sections/Specialties';
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">
<HeroBrand
brand="Vagabondo"
description="Cuisine Méditerranéenne au cœur du Kram. Fraîcheur et authenticité, servies avec passion."
primaryButton={{
text: "Découvrir la carte",
href: "#menu",
}}
secondaryButton={{
text: "Réserver une table",
href: "#contact",
}}
imageSrc="http://img.b2bpic.net/free-photo/cheese-plate-with-cheddar-smoked-white-cheese-walnut-grape-honey_140725-229.jpg"
/>
</SectionErrorBoundary>
</div>
<>
<HeroSection />
<div id="about" data-section="about">
<SectionErrorBoundary name="about">
<AboutTextSplit
title="Une table entre deux rives"
descriptions={[
"Au cœur du Kram, Vagabondo réunit la générosité tunisienne et la précision italienne. Pâtes fraîches, fruits de mer du jour, ojjas qui réchauffent et pizzas cuites avec soin.",
"Chaque plat est préparé à la commande, dans le respect des traditions, pour vous offrir une expérience culinaire comme à la maison.",
]}
/>
</SectionErrorBoundary>
</div>
<AboutSection />
<div id="menu" data-section="menu">
<SectionErrorBoundary name="menu">
<FeaturesImageBento
tag="Nos suggestions"
title="La Carte"
description="Explorez nos saveurs méditerranéennes."
items={[
{
title: "Fruits de Mer",
description: "Sélection du jour",
imageSrc: "http://img.b2bpic.net/free-photo/side-view-mushroom-pasta-dark-round_176474-3153.jpg",
},
{
title: "Pâtes Fraîches",
description: "Faits maison",
imageSrc: "http://img.b2bpic.net/free-photo/fries-rice-with-shrimp_74190-526.jpg",
},
{
title: "Pizzas au Four",
description: "Cuisson traditionnelle",
imageSrc: "http://img.b2bpic.net/free-photo/top-view-noodles-with-meat-grated-cheese-tomatoes_141793-12579.jpg",
},
{
title: "Filet de Bœuf",
description: "Origine sélectionnée",
imageSrc: "http://img.b2bpic.net/free-photo/top-view-delicious-pasta-meal-blue-plate-served-with-tomato-meat-dinner-tan-color-towel-its-ingredients_140725-142814.jpg",
},
{
title: "Entrées Chaudes",
description: "Antipasti Caldi",
imageSrc: "http://img.b2bpic.net/free-photo/people-having-dinner-luxurious-restaurants_23-2151081869.jpg",
},
{
title: "Risottos",
description: "Crémeux et savoureux",
imageSrc: "http://img.b2bpic.net/free-photo/fried-meat-mixed-with-vegetables-topped-with-sesame-seeds_140725-3631.jpg",
},
{
title: "Salades",
description: "Fraîcheur garantie",
imageSrc: "http://img.b2bpic.net/free-photo/top-view-cooked-italian-pasta-unusual-spiral-pasta-inside-plate-dark-space_140725-95519.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
<MenuSection />
<div id="specialties" data-section="specialties">
<SectionErrorBoundary name="specialties">
<FeaturesDetailedCards
tag="Nos Spécialités"
title="L'excellence Vagabondo"
description="Découvrez nos signatures culinaires incontournables."
items={[
{
title: "Ojja Fruits de Mer",
description: "Une alliance épicée et raffinée de fruits de mer frais.",
tags: [
"Spécialité",
],
imageSrc: "http://img.b2bpic.net/free-photo/top-view-bowl-with-shrimp-lemon_23-2148643600.jpg",
},
{
title: "Symphonie Fruits de Mer",
description: "Le plat ultime pour les amateurs de délices marins.",
tags: [
"Signature",
],
imageSrc: "http://img.b2bpic.net/free-photo/top-view-grilled-aubergine-salad-with-tomato-bell-pepper-onion-herbs_141793-2137.jpg",
},
{
title: "Ravioli Quattro Formaggi",
description: "Un mariage parfait de quatre fromages fondants.",
tags: [
"Italien",
],
imageSrc: "http://img.b2bpic.net/free-photo/side-view-fettuccini-alfredo-with-grilled-mushrooms-sauce-dill-plate_141793-4893.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
<SpecialtiesSection />
<div id="metrics" data-section="metrics">
<SectionErrorBoundary name="metrics">
<MetricsFeatureCards
tag="Notre Qualité"
title="Vagabondo en chiffres"
description="Engagés pour votre satisfaction quotidienne."
metrics={[
{
value: "3,8/5",
title: "Note Google",
features: [
"126 avis clients",
"Accueil chaleureux",
"Service de qualité",
],
},
{
value: "7j/7",
title: "Ouverture",
features: [
"Du mardi au dimanche",
"12h00 - 23h00",
"Sur place & à emporter",
],
},
{
value: "Le Kram",
title: "Emplacement",
features: [
"La Goulette Rd",
"Facile d'accès",
"Cuisine fraîche",
],
},
]}
/>
</SectionErrorBoundary>
</div>
<MetricsSection />
<div id="testimonials" data-section="testimonials">
<SectionErrorBoundary name="testimonials">
<TestimonialMarqueeOverlayCards
tag="Témoignages"
title="Ce qu'ils pensent de nous"
description="Vos retours sont notre plus belle récompense."
testimonials={[
{
name: "Blue Dream",
role: "Local Guide",
company: "Client fidèle",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/medium-shot-woman-holding-cup_23-2149005452.jpg",
},
{
name: "Sarah Ahmed",
role: "Habituée",
company: "Le Kram",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/portrait-waitress-standing-counter_1170-668.jpg",
},
{
name: "Jean Dupont",
role: "Gastronome",
company: "Voyageur",
rating: 4,
imageSrc: "http://img.b2bpic.net/free-photo/medium-shot-woman-having-fun-party_23-2150188405.jpg",
},
{
name: "Leila Ben",
role: "Critique",
company: "Local",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/smiling-young-lady-designer-sitting-indoors-night-holding-pencil_171337-15774.jpg",
},
{
name: "Omar K.",
role: "Client",
company: "Habitué",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/girl-takes-off-her-protective-medical-face-mask_1153-8487.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
<TestimonialsSection />
<div id="faq" data-section="faq">
<SectionErrorBoundary name="faq">
<FaqSplitMedia
tag="Info"
title="Questions fréquentes"
description="Tout savoir sur votre expérience Vagabondo."
items={[
{
question: "Quels sont vos horaires ?",
answer: "Nous sommes ouverts du mardi au dimanche, de 12h00 à 23h00.",
},
{
question: "Proposez-vous la vente à emporter ?",
answer: "Oui, tous nos plats sont disponibles à emporter.",
},
{
question: "Doit-on réserver ?",
answer: "Nous conseillons de réserver, surtout le week-end, via notre numéro de téléphone.",
},
{
question: "Où êtes-vous situés ?",
answer: "Nous sommes sur la route de La Goulette, au Kram, Tunisie.",
},
]}
imageSrc="http://img.b2bpic.net/free-photo/young-smiling-waiter-using-digital-tablet-while-communicating-with-couple-outdoor-cafe_637285-557.jpg"
/>
</SectionErrorBoundary>
</div>
<FaqSection />
<div id="contact" data-section="contact">
<SectionErrorBoundary name="contact">
<ContactCta
tag="Contact"
text="Prêt pour une expérience méditerranéenne ? Réservez votre table dès maintenant."
primaryButton={{
text: "+216 28 241 245",
href: "tel:+21628241245",
}}
secondaryButton={{
text: "Nous suivre sur Facebook",
href: "https://facebook.com",
}}
/>
</SectionErrorBoundary>
</div>
<ContactSection />
</>
);
}

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 AboutTextSplit from '@/components/sections/about/AboutTextSplit';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function AboutSection(): React.JSX.Element {
return (
<div id="about" data-section="about">
<SectionErrorBoundary name="about">
<AboutTextSplit
title="Une table entre deux rives"
descriptions={[
"Au cœur du Kram, Vagabondo réunit la générosité tunisienne et la précision italienne. Pâtes fraîches, fruits de mer du jour, ojjas qui réchauffent et pizzas cuites avec soin.",
"Chaque plat est préparé à la commande, dans le respect des traditions, pour vous offrir une expérience culinaire comme à la maison.",
]}
/>
</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="Contact"
text="Prêt pour une expérience méditerranéenne ? Réservez votre table dès maintenant."
primaryButton={{
text: "+216 28 241 245",
href: "tel:+21628241245",
}}
secondaryButton={{
text: "Nous suivre sur Facebook",
href: "https://facebook.com",
}}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,39 @@
// 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="Info"
title="Questions fréquentes"
description="Tout savoir sur votre expérience Vagabondo."
items={[
{
question: "Quels sont vos horaires ?",
answer: "Nous sommes ouverts du mardi au dimanche, de 12h00 à 23h00.",
},
{
question: "Proposez-vous la vente à emporter ?",
answer: "Oui, tous nos plats sont disponibles à emporter.",
},
{
question: "Doit-on réserver ?",
answer: "Nous conseillons de réserver, surtout le week-end, via notre numéro de téléphone.",
},
{
question: "Où êtes-vous situés ?",
answer: "Nous sommes sur la route de La Goulette, au Kram, Tunisie.",
},
]}
imageSrc="http://img.b2bpic.net/free-photo/young-smiling-waiter-using-digital-tablet-while-communicating-with-couple-outdoor-cafe_637285-557.jpg"
/>
</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="Vagabondo"
description="Cuisine Méditerranéenne au cœur du Kram. Fraîcheur et authenticité, servies avec passion."
primaryButton={{
text: "Découvrir la carte",
href: "#menu",
}}
secondaryButton={{
text: "Réserver une table",
href: "#contact",
}}
imageSrc="http://img.b2bpic.net/free-photo/cheese-plate-with-cheddar-smoked-white-cheese-walnut-grape-honey_140725-229.jpg"
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,57 @@
// 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="Nos suggestions"
title="La Carte"
description="Explorez nos saveurs méditerranéennes."
items={[
{
title: "Fruits de Mer",
description: "Sélection du jour",
imageSrc: "http://img.b2bpic.net/free-photo/side-view-mushroom-pasta-dark-round_176474-3153.jpg",
},
{
title: "Pâtes Fraîches",
description: "Faits maison",
imageSrc: "http://img.b2bpic.net/free-photo/fries-rice-with-shrimp_74190-526.jpg",
},
{
title: "Pizzas au Four",
description: "Cuisson traditionnelle",
imageSrc: "http://img.b2bpic.net/free-photo/top-view-noodles-with-meat-grated-cheese-tomatoes_141793-12579.jpg",
},
{
title: "Filet de Bœuf",
description: "Origine sélectionnée",
imageSrc: "http://img.b2bpic.net/free-photo/top-view-delicious-pasta-meal-blue-plate-served-with-tomato-meat-dinner-tan-color-towel-its-ingredients_140725-142814.jpg",
},
{
title: "Entrées Chaudes",
description: "Antipasti Caldi",
imageSrc: "http://img.b2bpic.net/free-photo/people-having-dinner-luxurious-restaurants_23-2151081869.jpg",
},
{
title: "Risottos",
description: "Crémeux et savoureux",
imageSrc: "http://img.b2bpic.net/free-photo/fried-meat-mixed-with-vegetables-topped-with-sesame-seeds_140725-3631.jpg",
},
{
title: "Salades",
description: "Fraîcheur garantie",
imageSrc: "http://img.b2bpic.net/free-photo/top-view-cooked-italian-pasta-unusual-spiral-pasta-inside-plate-dark-space_140725-95519.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,49 @@
// 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 MetricsFeatureCards from '@/components/sections/metrics/MetricsFeatureCards';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function MetricsSection(): React.JSX.Element {
return (
<div id="metrics" data-section="metrics">
<SectionErrorBoundary name="metrics">
<MetricsFeatureCards
tag="Notre Qualité"
title="Vagabondo en chiffres"
description="Engagés pour votre satisfaction quotidienne."
metrics={[
{
value: "3,8/5",
title: "Note Google",
features: [
"126 avis clients",
"Accueil chaleureux",
"Service de qualité",
],
},
{
value: "7j/7",
title: "Ouverture",
features: [
"Du mardi au dimanche",
"12h00 - 23h00",
"Sur place & à emporter",
],
},
{
value: "Le Kram",
title: "Emplacement",
features: [
"La Goulette Rd",
"Facile d'accès",
"Cuisine fraîche",
],
},
]}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,46 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "specialties" section.
import React from 'react';
import FeaturesDetailedCards from '@/components/sections/features/FeaturesDetailedCards';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function SpecialtiesSection(): React.JSX.Element {
return (
<div id="specialties" data-section="specialties">
<SectionErrorBoundary name="specialties">
<FeaturesDetailedCards
tag="Nos Spécialités"
title="L'excellence Vagabondo"
description="Découvrez nos signatures culinaires incontournables."
items={[
{
title: "Ojja Fruits de Mer",
description: "Une alliance épicée et raffinée de fruits de mer frais.",
tags: [
"Spécialité",
],
imageSrc: "http://img.b2bpic.net/free-photo/top-view-bowl-with-shrimp-lemon_23-2148643600.jpg",
},
{
title: "Symphonie Fruits de Mer",
description: "Le plat ultime pour les amateurs de délices marins.",
tags: [
"Signature",
],
imageSrc: "http://img.b2bpic.net/free-photo/top-view-grilled-aubergine-salad-with-tomato-bell-pepper-onion-herbs_141793-2137.jpg",
},
{
title: "Ravioli Quattro Formaggi",
description: "Un mariage parfait de quatre fromages fondants.",
tags: [
"Italien",
],
imageSrc: "http://img.b2bpic.net/free-photo/side-view-fettuccini-alfredo-with-grilled-mushrooms-sauce-dill-plate_141793-4893.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,57 @@
// 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 TestimonialMarqueeOverlayCards from '@/components/sections/testimonial/TestimonialMarqueeOverlayCards';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function TestimonialsSection(): React.JSX.Element {
return (
<div id="testimonials" data-section="testimonials">
<SectionErrorBoundary name="testimonials">
<TestimonialMarqueeOverlayCards
tag="Témoignages"
title="Ce qu'ils pensent de nous"
description="Vos retours sont notre plus belle récompense."
testimonials={[
{
name: "Blue Dream",
role: "Local Guide",
company: "Client fidèle",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/medium-shot-woman-holding-cup_23-2149005452.jpg",
},
{
name: "Sarah Ahmed",
role: "Habituée",
company: "Le Kram",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/portrait-waitress-standing-counter_1170-668.jpg",
},
{
name: "Jean Dupont",
role: "Gastronome",
company: "Voyageur",
rating: 4,
imageSrc: "http://img.b2bpic.net/free-photo/medium-shot-woman-having-fun-party_23-2150188405.jpg",
},
{
name: "Leila Ben",
role: "Critique",
company: "Local",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/smiling-young-lady-designer-sitting-indoors-night-holding-pencil_171337-15774.jpg",
},
{
name: "Omar K.",
role: "Client",
company: "Habitué",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/girl-takes-off-her-protective-medical-face-mask_1153-8487.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
);
}