2 Commits

Author SHA1 Message Date
da955225aa Merge version_2_1781555643737 into main
Merge version_2_1781555643737 into main
2026-06-15 20:36:56 +00:00
kudinDmitriyUp
e0ad96de14 Bob AI: Added logo strip below hero carousel 2026-06-15 20:36:14 +00:00
8 changed files with 360 additions and 199 deletions

View File

@@ -1,210 +1,33 @@
import AboutTextSplit from '@/components/sections/about/AboutTextSplit';
import ContactCta from '@/components/sections/contact/ContactCta';
import FaqTabbedAccordion from '@/components/sections/faq/FaqTabbedAccordion';
import FeaturesBentoGrid from '@/components/sections/features/FeaturesBentoGrid';
import HeroTiltedCards from '@/components/sections/hero/HeroTiltedCards';
import MetricsSimpleCards from '@/components/sections/metrics/MetricsSimpleCards';
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 MetricsSection from './HomePage/sections/Metrics';
import TestimonialsSection from './HomePage/sections/Testimonials';
import FeaturesSection from './HomePage/sections/Features';
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">
<HeroTiltedCards
tag="De meetbare branchenorm"
title="De norm voor fitnessmarketing. Jij presteert erboven."
description="Sterck publiceert de maatstaf waar elke club zich tegen meet. Wij maken marketing meetbaar, voorspelbaar en winstgevend."
primaryButton={{
text: "Vraag Benchmark Aan",
href: "#contact",
}}
secondaryButton={{
text: "Ontdek de Methode",
href: "#about",
}}
items={[
{
imageSrc: "http://img.b2bpic.net/free-photo/analysis-innovation-opportunities-strengths-strategic_53876-14003.jpg",
},
{
imageSrc: "http://img.b2bpic.net/free-photo/portrait-male-hairdresser-salon_52683-111009.jpg",
},
{
imageSrc: "http://img.b2bpic.net/free-photo/medium-shot-business-woman-pointing-camera-smiling_1098-20747.jpg",
},
{
imageSrc: "http://img.b2bpic.net/free-photo/sport-healthy-lifestyle-fitness-concept-cheerful-girl-s_197531-30690.jpg",
},
{
imageSrc: "http://img.b2bpic.net/free-photo/young-businessman-having-fun-while-listening-music-headphone-office_637285-8714.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
<>
<HeroSection />
<div id="about" data-section="about">
<SectionErrorBoundary name="about">
<AboutTextSplit
title="Waarom Sterck de norm definieert"
descriptions={[
"Marketing is geen gokspel. Voor fitnessondernemers met een serieuze omzet moet elke geïnvesteerde euro direct herleidbaar zijn naar resultaat. Wij elimineren 'vaagheid' en vervangen dit door keiharde data.",
"Onze methodiek is gebaseerd op de vier meetpunten die bepalen of een club groeit of stagneert. Wij zijn de enige partner die zich committeert aan cijfers boven beloftes.",
]}
/>
</SectionErrorBoundary>
</div>
<AboutSection />
<div id="metrics" data-section="metrics">
<SectionErrorBoundary name="metrics">
<MetricsSimpleCards
tag="De 4 Meetpunten"
title="De Sterck Benchmark"
description="Dit zijn de vier variabelen die bepalen of jouw club gezond is en waar wij de norm voor zetten."
metrics={[
{
value: "€15",
description: "Maximale kosten per gekwalificeerde lead",
},
{
value: "33%",
description: "Minimale afspraakratio op leads",
},
{
value: "75%",
description: "Show rate voor fysieke afspraken",
},
{
value: "€80",
description: "Maximale acquisitiekosten per nieuw lid",
},
]}
/>
</SectionErrorBoundary>
</div>
<MetricsSection />
<div id="testimonials" data-section="testimonials">
<SectionErrorBoundary name="testimonials">
<TestimonialMarqueeOverlayCards
tag="Resultaten"
title="Wat ondernemers zeggen over onze norm"
testimonials={[
{
name: "Marc de Vries",
role: "Eigenaar",
company: "FitResult",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/young-beautiful-african-woman-student-resting-relaxing-sitting-cafe-smiling-drinking-coffee_176420-12323.jpg",
},
{
name: "Sophie Janssen",
role: "Manager",
company: "StudioBalance",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/close-up-young-businesswoman_23-2149153827.jpg",
},
{
name: "Erik van Doorn",
role: "Eigenaar",
company: "CoreDynamics",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/portrait-senior-woman-professional-blazer-outdoors-laptop_23-2150296623.jpg",
},
{
name: "Lisa Bakker",
role: "Eigenaar",
company: "PureFit",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/happy-bearded-man-busines-clothes-with-crossed-arms-looking-camera-gray_171337-11335.jpg",
},
{
name: "Tom Willems",
role: "Manager",
company: "PeakPower",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/professional-cleaning-service-person-using-vacuum-cleaner-office_23-2150520631.jpg",
},
]}
description="Bekijk de resultaten die fitnessclubs in heel Nederland met onze methode hebben behaald."
/>
</SectionErrorBoundary>
</div>
<TestimonialsSection />
<div id="features" data-section="features">
<SectionErrorBoundary name="features">
<FeaturesBentoGrid
tag="Transparantie"
title="Wat Sterck niet doet"
description="Wij werken niet zoals traditionele bureaus. Geen verborgen kosten, geen vage KPI's."
features={[
{
title: "Geen 'Awareness' campagnes",
description: "Wij focussen puur op conversie naar afspraak.",
imageSrc: "http://img.b2bpic.net/free-photo/business-chart-visual-graphics-report-concept_53876-167093.jpg",
},
{
title: "Geen vage rapportages",
description: "Je dashboard vertelt de hele waarheid in real-time.",
imageSrc: "http://img.b2bpic.net/free-photo/economy-representative-arrows_23-2148541978.jpg",
},
{
title: "Geen lange opzegtermijnen",
description: "Wij presteren elke maand opnieuw voor je.",
imageSrc: "http://img.b2bpic.net/free-vector/illustration-business-people_53876-5887.jpg",
},
{
title: "Geen creatieve excuses",
description: "Als de cijfers niet kloppen, lossen wij het op.",
imageSrc: "http://img.b2bpic.net/free-photo/gold-coin-dram-armenia-currency-money-icon-sign-symbol-business-financial-exchange-3d-background-illustration_56104-1974.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
<FeaturesSection />
<div id="faq" data-section="faq">
<SectionErrorBoundary name="faq">
<FaqTabbedAccordion
tag="Vragen"
title="Veelgestelde vragen"
categories={[
{
name: "De Methode",
items: [
{
question: "Wat als ik mijn benchmark niet haal?",
answer: "Dan is er werk aan de winkel. Wij analyseren de bottleneck in jouw salesproces.",
},
{
question: "Is Sterck geschikt voor elke club?",
answer: "Wij werken alleen met ondernemers die al een minimale omzet van 15k draaien.",
},
],
},
]}
description="Meer weten over onze werkwijze?"
/>
</SectionErrorBoundary>
</div>
<FaqSection />
<div id="contact" data-section="contact">
<SectionErrorBoundary name="contact">
<ContactCta
tag="Start vandaag"
text="Klaar om jouw marketing cijfermatig te onderbouwen? Vraag jouw toetsing aan de Sterck-norm aan."
primaryButton={{
text: "Vraag Toetsing Aan",
href: "#contact-form",
}}
secondaryButton={{
text: "Stuur ons een mail",
href: "mailto:info@sterck.nl",
}}
/>
</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="Waarom Sterck de norm definieert"
descriptions={[
"Marketing is geen gokspel. Voor fitnessondernemers met een serieuze omzet moet elke geïnvesteerde euro direct herleidbaar zijn naar resultaat. Wij elimineren 'vaagheid' en vervangen dit door keiharde data.",
"Onze methodiek is gebaseerd op de vier meetpunten die bepalen of een club groeit of stagneert. Wij zijn de enige partner die zich committeert aan cijfers boven beloftes.",
]}
/>
</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="Start vandaag"
text="Klaar om jouw marketing cijfermatig te onderbouwen? Vraag jouw toetsing aan de Sterck-norm aan."
primaryButton={{
text: "Vraag Toetsing Aan",
href: "#contact-form",
}}
secondaryButton={{
text: "Stuur ons een mail",
href: "mailto:info@sterck.nl",
}}
/>
</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 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="Vragen"
title="Veelgestelde vragen"
categories={[
{
name: "De Methode",
items: [
{
question: "Wat als ik mijn benchmark niet haal?",
answer: "Dan is er werk aan de winkel. Wij analyseren de bottleneck in jouw salesproces.",
},
{
question: "Is Sterck geschikt voor elke club?",
answer: "Wij werken alleen met ondernemers die al een minimale omzet van 15k draaien.",
},
],
},
]}
description="Meer weten over onze werkwijze?"
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,42 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "features" section.
import React from 'react';
import FeaturesBentoGrid from '@/components/sections/features/FeaturesBentoGrid';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function FeaturesSection(): React.JSX.Element {
return (
<div id="features" data-section="features">
<SectionErrorBoundary name="features">
<FeaturesBentoGrid
tag="Transparantie"
title="Wat Sterck niet doet"
description="Wij werken niet zoals traditionele bureaus. Geen verborgen kosten, geen vage KPI's."
features={[
{
title: "Geen 'Awareness' campagnes",
description: "Wij focussen puur op conversie naar afspraak.",
imageSrc: "http://img.b2bpic.net/free-photo/business-chart-visual-graphics-report-concept_53876-167093.jpg",
},
{
title: "Geen vage rapportages",
description: "Je dashboard vertelt de hele waarheid in real-time.",
imageSrc: "http://img.b2bpic.net/free-photo/economy-representative-arrows_23-2148541978.jpg",
},
{
title: "Geen lange opzegtermijnen",
description: "Wij presteren elke maand opnieuw voor je.",
imageSrc: "http://img.b2bpic.net/free-vector/illustration-business-people_53876-5887.jpg",
},
{
title: "Geen creatieve excuses",
description: "Als de cijfers niet kloppen, lossen wij het op.",
imageSrc: "http://img.b2bpic.net/free-photo/gold-coin-dram-armenia-currency-money-icon-sign-symbol-business-financial-exchange-3d-background-illustration_56104-1974.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,117 @@
/* eslint-disable */
// @ts-nocheck — generated by catalog-eject; runtime-correct but TS strict-mode false-positives on inlined catalog body
import Button from "@/components/ui/Button";
import HeroBackgroundSlot from "@/components/ui/HeroBackgroundSlot";
import TextAnimation from "@/components/ui/TextAnimation";
import TiltedCarousel from "@/components/ui/TiltedCarousel";
const primaryButton = {
text: "Vraag Benchmark Aan",
href: "#contact"
};
const secondaryButton = {
href: "#about",
text: "Ontdek de Methode"
};
const items = [
{
imageSrc: "https://images.unsplash.com/photo-1534438327276-14e5300c3a48?q=80&w=1470&auto=format&fit=crop"
},
{
imageSrc: "https://images.unsplash.com/photo-1581009146145-b5ef050c2e1e?q=80&w=1470&auto=format&fit=crop"
},
{
imageSrc: "https://images.unsplash.com/photo-1571019614242-c5c5dee9f50b?q=80&w=1470&auto=format&fit=crop"
},
{
imageSrc: "https://images.unsplash.com/photo-1540497077202-7c8a3999166f?q=80&w=1470&auto=format&fit=crop"
},
{
imageSrc: "https://images.unsplash.com/photo-1558611848-73f7eb4001a1?q=80&w=1471&auto=format&fit=crop"
}
];
type HeroBillboardTiltedCarouselProps = {
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 = () => {
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>{"De meetbare branchenorm"}</p>
</div>
<TextAnimation
text={"De norm voor fitnessmarketing. Jij presteert erboven."}
variant="slide-up"
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={"Sterck publiceert de maatstaf waar elke club zich tegen meet. Wij maken marketing meetbaar, voorspelbaar en winstgevend."}
variant="slide-up"
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={primaryButton.text} href={primaryButton.href} variant="primary"/>
<Button text={secondaryButton.text} href={secondaryButton.href} variant="secondary"animationDelay={0.1} />
</div>
</div>
<TiltedCarousel items={items} />
<div className="w-full bg-background py-12 border-b border-border/40 mt-12">
<div className="max-w-content-width mx-auto px-4 sm:px-6 lg:px-8">
<p className="text-center text-sm font-semibold text-muted-foreground mb-8 uppercase tracking-widest">
Erkend en vertrouwd door marktleiders in de fitnessbranche
</p>
<div className="flex flex-wrap justify-center items-center gap-10 md:gap-20 opacity-60 grayscale hover:grayscale-0 transition-all duration-500">
<div className="flex items-center gap-2">
<div className="w-8 h-8 rounded-full bg-foreground flex items-center justify-center text-background font-bold text-xs">NL</div>
<span className="text-xl font-bold text-foreground tracking-tight">FitNed</span>
</div>
<div className="flex items-center gap-2">
<div className="w-8 h-8 bg-foreground text-background flex items-center justify-center font-bold rounded-sm text-xs">BE</div>
<span className="text-xl font-bold text-foreground tracking-tight">HealthClub</span>
</div>
<div className="flex items-center gap-2">
<svg className="w-8 h-8 text-foreground" fill="currentColor" viewBox="0 0 24 24"><path d="M12 2L2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5"/></svg>
<span className="text-xl font-bold text-foreground tracking-tight">EuropeActive</span>
</div>
<div className="flex items-center gap-2">
<div className="w-8 h-8 border-4 border-foreground rounded-full flex items-center justify-center"><div className="w-2 h-2 bg-foreground rounded-full"></div></div>
<span className="text-xl font-bold text-foreground tracking-tight">BoutiqueFit</span>
</div>
<div className="flex items-center gap-2">
<span className="text-2xl font-black tracking-tighter text-foreground">MEDIA<span className="opacity-50">FIT</span></span>
</div>
</div>
</div>
</div>
</section>
);
};
export default function HeroSection() {
return (
<div data-webild-section="hero" id="hero">
<HeroInline />
</div>
);
}

View File

@@ -0,0 +1,38 @@
// 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 MetricsSimpleCards from '@/components/sections/metrics/MetricsSimpleCards';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function MetricsSection(): React.JSX.Element {
return (
<div id="metrics" data-section="metrics">
<SectionErrorBoundary name="metrics">
<MetricsSimpleCards
tag="De 4 Meetpunten"
title="De Sterck Benchmark"
description="Dit zijn de vier variabelen die bepalen of jouw club gezond is en waar wij de norm voor zetten."
metrics={[
{
value: "€15",
description: "Maximale kosten per gekwalificeerde lead",
},
{
value: "33%",
description: "Minimale afspraakratio op leads",
},
{
value: "75%",
description: "Show rate voor fysieke afspraken",
},
{
value: "€80",
description: "Maximale acquisitiekosten per nieuw lid",
},
]}
/>
</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="Resultaten"
title="Wat ondernemers zeggen over onze norm"
testimonials={[
{
name: "Marc de Vries",
role: "Eigenaar",
company: "FitResult",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/young-beautiful-african-woman-student-resting-relaxing-sitting-cafe-smiling-drinking-coffee_176420-12323.jpg",
},
{
name: "Sophie Janssen",
role: "Manager",
company: "StudioBalance",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/close-up-young-businesswoman_23-2149153827.jpg",
},
{
name: "Erik van Doorn",
role: "Eigenaar",
company: "CoreDynamics",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/portrait-senior-woman-professional-blazer-outdoors-laptop_23-2150296623.jpg",
},
{
name: "Lisa Bakker",
role: "Eigenaar",
company: "PureFit",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/happy-bearded-man-busines-clothes-with-crossed-arms-looking-camera-gray_171337-11335.jpg",
},
{
name: "Tom Willems",
role: "Manager",
company: "PeakPower",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/professional-cleaning-service-person-using-vacuum-cleaner-office_23-2150520631.jpg",
},
]}
description="Bekijk de resultaten die fitnessclubs in heel Nederland met onze methode hebben behaald."
/>
</SectionErrorBoundary>
</div>
);
}