24 Commits

Author SHA1 Message Date
7bec83ca9b Merge version_13_1781431871625 into main
Merge version_13_1781431871625 into main
2026-06-14 10:11:15 +00:00
185ec8b229 Update theme colors 2026-06-14 10:11:12 +00:00
6c37c658cf Merge version_12_1781431867701 into main
Merge version_12_1781431867701 into main
2026-06-14 10:11:11 +00:00
a5af4a00b0 Update theme colors 2026-06-14 10:11:08 +00:00
6cd09a5242 Merge version_11_1781431858733 into main
Merge version_11_1781431858733 into main
2026-06-14 10:11:02 +00:00
591e403089 Update theme colors 2026-06-14 10:10:59 +00:00
1964d424a6 Merge version_10_1781431612861 into main
Merge version_10_1781431612861 into main
2026-06-14 10:08:31 +00:00
kudinDmitriyUp
96cf4a96e7 Bob AI: <ATTACHED_BLOCKS>
The user attached the section/component ca
2026-06-14 10:07:51 +00:00
93c74b59d1 Merge version_9_1781431447390 into main
Merge version_9_1781431447390 into main
2026-06-14 10:04:11 +00:00
9a5b086e4d Update theme colors 2026-06-14 10:04:08 +00:00
221dc8e1cb Merge version_8_1781431441718 into main
Merge version_8_1781431441718 into main
2026-06-14 10:04:05 +00:00
6eb4fe2ec8 Update theme colors 2026-06-14 10:04:02 +00:00
3e0a20faba Merge version_7_1781431437357 into main
Merge version_7_1781431437357 into main
2026-06-14 10:04:00 +00:00
ae5fafee55 Update theme colors 2026-06-14 10:03:57 +00:00
af53d7852e Merge version_6_1781431385393 into main
Merge version_6_1781431385393 into main
2026-06-14 10:03:08 +00:00
3ea0a01d60 Update theme colors 2026-06-14 10:03:05 +00:00
23fe2f3376 Merge version_5_1781431379464 into main
Merge version_5_1781431379464 into main
2026-06-14 10:03:03 +00:00
4c1d7bb5f8 Update theme colors 2026-06-14 10:03:00 +00:00
cdcedf4c63 Merge version_4_1781431374668 into main
Merge version_4_1781431374668 into main
2026-06-14 10:02:58 +00:00
31ba7352b5 Merge version_3_1781431366248 into main
Merge version_3_1781431366248 into main
2026-06-14 10:02:49 +00:00
407f16f22f Merge version_2_1781431346788 into main
Merge version_2_1781431346788 into main
2026-06-14 10:02:30 +00:00
377f0c257b Merge version_1_1781430989203 into main
Merge version_1_1781430989203 into main
2026-06-14 09:58:12 +00:00
a0087b39ad Merge version_1_1781430989203 into main
Merge version_1_1781430989203 into main
2026-06-14 09:57:42 +00:00
3220308473 Merge version_1_1781430989203 into main
Merge version_1_1781430989203 into main
2026-06-14 09:56:53 +00:00
9 changed files with 200 additions and 124 deletions

View File

@@ -5,15 +5,15 @@
:root {
/* @colorThemes/lightTheme/grayNavyBlue */
--background: #f6f0e9;
--card: #efe7dd;
--foreground: #2b180a;
--primary-cta: #2b180a;
--primary-cta-text: #f6f0e9;
--secondary-cta: #efe7dd;
--secondary-cta-text: #2b180a;
--accent: #94877c;
--background-accent: #afa094;
--background: #0a0a0a;
--card: #1a1a1a;
--foreground: #ffffffe6;
--primary-cta: #e6e6e6;
--primary-cta-text: #0a0a0a;
--secondary-cta: #1a1a1a;
--secondary-cta-text: #ffffffe6;
--accent: #737373;
--background-accent: #737373;
/* @layout/border-radius/rounded */
--radius: 1rem;

View File

@@ -1,126 +1,33 @@
import AboutTextSplit from '@/components/sections/about/AboutTextSplit';
import ContactCta from '@/components/sections/contact/ContactCta';
import FaqTwoColumn from '@/components/sections/faq/FaqTwoColumn';
import FeaturesMediaCarousel from '@/components/sections/features/FeaturesMediaCarousel';
import HeroSplitVerticalMarquee from '@/components/sections/hero/HeroSplitVerticalMarquee';
import TeamListCards from '@/components/sections/team/TeamListCards';
import TestimonialMarqueeCards from '@/components/sections/testimonial/TestimonialMarqueeCards';
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 ServicesSection from './HomePage/sections/Services';
import TeamSection from './HomePage/sections/Team';
import ReviewsSection from './HomePage/sections/Reviews';
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 2024"
title="Cristaux Barber-Shop: Your Style, Our Expertise."
description="Experience professional grooming in the heart of Montendre. From classic cuts to precision beard trims, we define gentlemanly style."
primaryButton={{ text: "Book an Appointment", href: "tel:0780149717" }}
secondaryButton={{ text: "View Location", href: "https://maps.google.com" }}
leftItems={[
{ imageSrc: "http://img.b2bpic.net/free-photo/photo-metal-texture-pattern_58702-13629.jpg" },
{ imageSrc: "http://img.b2bpic.net/free-photo/flat-lay-composition-shaving-objects_23-2148121964.jpg" },
{ imageSrc: "http://img.b2bpic.net/free-photo/comfortable-old-fashioned-chair-rustic-antique-elegance-indoors-generated-by-ai_188544-29043.jpg" }
]}
rightItems={[
{ imageSrc: "http://img.b2bpic.net/free-photo/barber-equipment-working-surface-by-mirror-barbershop_627829-8282.jpg" },
{ imageSrc: "http://img.b2bpic.net/free-photo/luxury-armchairs-barber-shop_140725-7720.jpg" },
{ imageSrc: "http://img.b2bpic.net/free-photo/background-from-old-boards-with-bright-patterns-wall-old-barn-bright-sun-weathered-sunbleached-wooden-boards-with-remnants-old-blue-white-paint_166373-2101.jpg" }
]}
/>
</SectionErrorBoundary>
</div>
<>
<HeroSection />
<div id="about" data-section="about">
<SectionErrorBoundary name="about">
<AboutTextSplit
title="About Cristaux Barber-Shop"
descriptions={[
"Located at 4 Av. de Royan, we are committed to providing Montendre with the finest men's grooming services. Our shop combines tradition with modern precision for every client.", "Our team takes pride in cleanliness, friendliness, and high-quality results. Whether you need a simple cleanup or a full style overhaul, you are in safe hands here."
]}
primaryButton={{ text: "Call us now", href: "tel:0780149717" }}
/>
</SectionErrorBoundary>
</div>
<AboutSection />
<div id="services" data-section="services">
<SectionErrorBoundary name="services">
<FeaturesMediaCarousel
tag="Services"
title="Professional Grooming Services"
description="Premium care for your hair and beard."
items={[
{ title: "Precision Haircut", description: "Classic and modern cuts.", buttonIcon: "Scissors", imageSrc: "http://img.b2bpic.net/free-photo/close-up-man-hairdresser-shop_23-2149220595.jpg" },
{ title: "Beard Trim", description: "Expert shaping and care.", buttonIcon: "Zap", imageSrc: "http://img.b2bpic.net/free-photo/from-hands-shaving-neck_23-2147778916.jpg" },
{ title: "Hot Towel Shave", description: "Luxury grooming experience.", buttonIcon: "Sparkles", imageSrc: "http://img.b2bpic.net/free-photo/overhead-view-foam-bowl-shaving-brush-razor-white-folded-napkin-against-wooden-textured-backdrop_23-2148088537.jpg" },
{ title: "Hair Styling", description: "Professional styling finishes.", buttonIcon: "Star", imageSrc: "http://img.b2bpic.net/free-photo/woman-holding-her-client-s-head-side-view_23-2148353446.jpg" },
{ title: "Scalp Treatment", description: "Refreshing scalp care.", buttonIcon: "Award", imageSrc: "http://img.b2bpic.net/free-photo/lovely-overjoyed-woman-domestic-wear-has-healthy-skin-clenches-fists-from-happiness_273609-37082.jpg" },
{ title: "Full Grooming", description: "Comprehensive care package.", buttonIcon: "CheckCircle", imageSrc: "http://img.b2bpic.net/free-photo/close-up-man-selfcare-products_23-2149313012.jpg" }
]}
/>
</SectionErrorBoundary>
</div>
<ServicesSection />
<div id="team" data-section="team">
<SectionErrorBoundary name="team">
<TeamListCards
tag="Our Team"
title="Meet the Barbers"
description="Skilled professionals dedicated to your perfect look."
groups={[
{
title: "The Team", members: [
{ name: "The Master Barber", role: "Senior Stylist", detail: "10+ years of expertise in classic grooming and modern fade techniques.", imageSrc: "http://img.b2bpic.net/free-photo/positive-bearded-black-male-with-tattoo-cross-arms-dressed-white-shirt_613910-15917.jpg" }
]
}
]}
/>
</SectionErrorBoundary>
</div>
<TeamSection />
<div id="reviews" data-section="reviews">
<SectionErrorBoundary name="reviews">
<TestimonialMarqueeCards
tag="Testimonials"
title="What our clients say"
description="Rated 4.5/5 stars by our valued community."
testimonials={[
{ name: "John Edgar", role: "Traveler", quote: "Best haircut I've had in months of traveling Europe. Listened to exactly what I wanted.", imageSrc: "http://img.b2bpic.net/free-photo/portrait-smiling-young-man-isolated-white-background_23-2148056445.jpg" },
{ name: "Stephen Course", role: "Local Client", quote: "Excellent work, clean shop. Friendly bilingual staff made everything easy.", imageSrc: "http://img.b2bpic.net/free-photo/professional-girl-hairdresser-makes-client-haircut-girl-is-sitting-mask-beauty-salon_343596-4457.jpg" },
{ name: "Haithem", role: "Regular", quote: "Excellent 5/5, highly recommended.", imageSrc: "http://img.b2bpic.net/free-photo/side-view-makeup-artist-applying-powder-model_23-2147783866.jpg" },
{ name: "Client Four", role: "Local", quote: "Great atmosphere and consistent quality every visit.", imageSrc: "http://img.b2bpic.net/free-photo/close-up-portrait-blue-eyed-redhead-full-throttle-bearded-male-grey-background_613910-9289.jpg" },
{ name: "Client Five", role: "Regular", quote: "Super nice barber, always a pleasure to visit.", imageSrc: "http://img.b2bpic.net/free-photo/excited-young-male-barber-wearing-glasses-red-shirt-barber-apron-holding-barbering-tools-looking-camera-showing-thumb-up-isolated-blue-background_141793-138548.jpg" }
]}
/>
</SectionErrorBoundary>
</div>
<ReviewsSection />
<div id="faq" data-section="faq">
<SectionErrorBoundary name="faq">
<FaqTwoColumn
tag="FAQ"
title="Common Questions"
description="Get the answers you need."
items={[
{ question: "Do I need an appointment?", answer: "We recommend booking ahead, especially for weekends. Please call 07 80 14 97 17." },
{ question: "Where are you located?", answer: "We are located at 4 Av. de Royan, 17130 Montendre." },
{ question: "Do you speak English?", answer: "Yes, we are happy to assist in English." }
]}
/>
</SectionErrorBoundary>
</div>
<FaqSection />
<div id="contact" data-section="contact">
<SectionErrorBoundary name="contact">
<ContactCta
tag="Visit Us"
text="Ready for your next cut? Book your spot today."
primaryButton={{ text: "Book Now", href: "tel:0780149717" }}
secondaryButton={{ text: "Directions", href: "https://maps.google.com/?q=4+Av.+de+Royan,17130+Montendre" }}
/>
</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="About Cristaux Barber-Shop"
descriptions={[
"Located at 4 Av. de Royan, we are committed to providing Montendre with the finest men's grooming services. Our shop combines tradition with modern precision for every client.", "Our team takes pride in cleanliness, friendliness, and high-quality results. Whether you need a simple cleanup or a full style overhaul, you are in safe hands here."
]}
primaryButton={{ text: "Call us now", href: "tel:0780149717" }}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,21 @@
// 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="Visit Us"
text="Ready for your next cut? Book your spot today."
primaryButton={{ text: "Book Now", href: "tel:0780149717" }}
secondaryButton={{ text: "Directions", href: "https://maps.google.com/?q=4+Av.+de+Royan,17130+Montendre" }}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,25 @@
// 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 FaqTwoColumn from '@/components/sections/faq/FaqTwoColumn';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function FaqSection(): React.JSX.Element {
return (
<div id="faq" data-section="faq">
<SectionErrorBoundary name="faq">
<FaqTwoColumn
tag="FAQ"
title="Common Questions"
description="Get the answers you need."
items={[
{ question: "Do I need an appointment?", answer: "We recommend booking ahead, especially for weekends. Please call 07 80 14 97 17." },
{ question: "Where are you located?", answer: "We are located at 4 Av. de Royan, 17130 Montendre." },
{ question: "Do you speak English?", answer: "Yes, we are happy to assist in English." }
]}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,19 @@
// Created by add_section_from_catalog (HeroBillboardCarousel).
import React from 'react';
import HeroBillboardCarousel from '@/components/sections/hero/HeroBillboardCarousel';
export default function HeroSection(): React.JSX.Element {
return (
<div data-webild-section="hero" id="hero">
<HeroBillboardCarousel
title="Cristaux Barber-Shop: Your Style, Our Expertise."
items={[{"imageSrc":"http://img.b2bpic.net/free-photo/photo-metal-texture-pattern_58702-13629.jpg"},{"imageSrc":"http://img.b2bpic.net/free-photo/flat-lay-composition-shaving-objects_23-2148121964.jpg"},{"imageSrc":"http://img.b2bpic.net/free-photo/comfortable-old-fashioned-chair-rustic-antique-elegance-indoors-generated-by-ai_188544-29043.jpg"},{"imageSrc":"http://img.b2bpic.net/free-photo/barber-equipment-working-surface-by-mirror-barbershop_627829-8282.jpg"},{"imageSrc":"http://img.b2bpic.net/free-photo/luxury-armchairs-barber-shop_140725-7720.jpg"}]}
primaryButton={{"href":"tel:0780149717","text":"Book an Appointment"}}
secondaryButton={{"href":"https://maps.google.com","text":"View Location"}}
tag="Since 2024"
description="Experience professional grooming in the heart of Montendre. From classic cuts to precision beard trims, we define gentlemanly style."
/>
</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 "reviews" section.
import React from 'react';
import TestimonialMarqueeCards from '@/components/sections/testimonial/TestimonialMarqueeCards';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function ReviewsSection(): React.JSX.Element {
return (
<div id="reviews" data-section="reviews">
<SectionErrorBoundary name="reviews">
<TestimonialMarqueeCards
tag="Testimonials"
title="What our clients say"
description="Rated 4.5/5 stars by our valued community."
testimonials={[
{ name: "John Edgar", role: "Traveler", quote: "Best haircut I've had in months of traveling Europe. Listened to exactly what I wanted.", imageSrc: "http://img.b2bpic.net/free-photo/portrait-smiling-young-man-isolated-white-background_23-2148056445.jpg" },
{ name: "Stephen Course", role: "Local Client", quote: "Excellent work, clean shop. Friendly bilingual staff made everything easy.", imageSrc: "http://img.b2bpic.net/free-photo/professional-girl-hairdresser-makes-client-haircut-girl-is-sitting-mask-beauty-salon_343596-4457.jpg" },
{ name: "Haithem", role: "Regular", quote: "Excellent 5/5, highly recommended.", imageSrc: "http://img.b2bpic.net/free-photo/side-view-makeup-artist-applying-powder-model_23-2147783866.jpg" },
{ name: "Client Four", role: "Local", quote: "Great atmosphere and consistent quality every visit.", imageSrc: "http://img.b2bpic.net/free-photo/close-up-portrait-blue-eyed-redhead-full-throttle-bearded-male-grey-background_613910-9289.jpg" },
{ name: "Client Five", role: "Regular", quote: "Super nice barber, always a pleasure to visit.", imageSrc: "http://img.b2bpic.net/free-photo/excited-young-male-barber-wearing-glasses-red-shirt-barber-apron-holding-barbering-tools-looking-camera-showing-thumb-up-isolated-blue-background_141793-138548.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 "services" section.
import React from 'react';
import FeaturesMediaCarousel from '@/components/sections/features/FeaturesMediaCarousel';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function ServicesSection(): React.JSX.Element {
return (
<div id="services" data-section="services">
<SectionErrorBoundary name="services">
<FeaturesMediaCarousel
tag="Services"
title="Professional Grooming Services"
description="Premium care for your hair and beard."
items={[
{ title: "Precision Haircut", description: "Classic and modern cuts.", buttonIcon: "Scissors", imageSrc: "http://img.b2bpic.net/free-photo/close-up-man-hairdresser-shop_23-2149220595.jpg" },
{ title: "Beard Trim", description: "Expert shaping and care.", buttonIcon: "Zap", imageSrc: "http://img.b2bpic.net/free-photo/from-hands-shaving-neck_23-2147778916.jpg" },
{ title: "Hot Towel Shave", description: "Luxury grooming experience.", buttonIcon: "Sparkles", imageSrc: "http://img.b2bpic.net/free-photo/overhead-view-foam-bowl-shaving-brush-razor-white-folded-napkin-against-wooden-textured-backdrop_23-2148088537.jpg" },
{ title: "Hair Styling", description: "Professional styling finishes.", buttonIcon: "Star", imageSrc: "http://img.b2bpic.net/free-photo/woman-holding-her-client-s-head-side-view_23-2148353446.jpg" },
{ title: "Scalp Treatment", description: "Refreshing scalp care.", buttonIcon: "Award", imageSrc: "http://img.b2bpic.net/free-photo/lovely-overjoyed-woman-domestic-wear-has-healthy-skin-clenches-fists-from-happiness_273609-37082.jpg" },
{ title: "Full Grooming", description: "Comprehensive care package.", buttonIcon: "CheckCircle", imageSrc: "http://img.b2bpic.net/free-photo/close-up-man-selfcare-products_23-2149313012.jpg" }
]}
/>
</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 "team" section.
import React from 'react';
import TeamListCards from '@/components/sections/team/TeamListCards';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function TeamSection(): React.JSX.Element {
return (
<div id="team" data-section="team">
<SectionErrorBoundary name="team">
<TeamListCards
tag="Our Team"
title="Meet the Barbers"
description="Skilled professionals dedicated to your perfect look."
groups={[
{
title: "The Team", members: [
{ name: "The Master Barber", role: "Senior Stylist", detail: "10+ years of expertise in classic grooming and modern fade techniques.", imageSrc: "http://img.b2bpic.net/free-photo/positive-bearded-black-male-with-tattoo-cross-arms-dressed-white-shirt_613910-15917.jpg" }
]
}
]}
/>
</SectionErrorBoundary>
</div>
);
}