3 Commits

Author SHA1 Message Date
kudinDmitriyUp
c7ebf6a9c0 Bob AI: Update services section to use FeaturesAlternatingSplit with 2026-06-19 22:00:51 +00:00
6a66ed9203 Merge version_3_1781906243642 into main
Merge version_3_1781906243642 into main
2026-06-19 21:57:30 +00:00
cc9368590e Merge version_2_1781906235730 into main
Merge version_2_1781906235730 into main
2026-06-19 21:57:19 +00:00
8 changed files with 280 additions and 227 deletions

View File

@@ -1,238 +1,33 @@
import AboutTextSplit from '@/components/sections/about/AboutTextSplit';
import ContactCta from '@/components/sections/contact/ContactCta';
import FeaturesBorderGlow from '@/components/sections/features/FeaturesBorderGlow';
import HeroCenteredLogos from '@/components/sections/hero/HeroCenteredLogos';
import MetricsFeatureCards from '@/components/sections/metrics/MetricsFeatureCards';
import PricingSplitCards from '@/components/sections/pricing/PricingSplitCards';
import TestimonialMarqueeOverlayCards from '@/components/sections/testimonial/TestimonialMarqueeOverlayCards';
import { CheckCircle } from "lucide-react";
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 PricingSection from './HomePage/sections/Pricing';
import MetricsSection from './HomePage/sections/Metrics';
import TestimonialsSection from './HomePage/sections/Testimonials';
import ContactSection from './HomePage/sections/Contact';
export default function HomePage(): React.JSX.Element {
return (
<>
<div id="hero" data-section="hero">
<SectionErrorBoundary name="hero">
<HeroCenteredLogos
avatarsSrc={[
"http://img.b2bpic.net/free-photo/bright-shot-beautiful-happy-girl-with-healthy-dark-skin-broad-smile_273609-43673.jpg",
"http://img.b2bpic.net/free-photo/person-putiing-make-up_23-2149224007.jpg",
"http://img.b2bpic.net/free-photo/big-happiness-beautiful-woman_329181-1147.jpg",
"http://img.b2bpic.net/free-photo/specialist-male-doctor-looking-away_23-2148525080.jpg",
"http://img.b2bpic.net/free-photo/smiley-doctor-wearing-white-coat-front-view_23-2149844581.jpg",
]}
avatarText="Junte-se a centenas de sorrisos satisfeitos"
title="O Seu Sorriso, a Nossa Prioridade em Luanda"
description="Clínica Dentária Duilina: excelência em cuidados odontológicos com tecnologia de ponta e um atendimento acolhedor no coração de Talatona."
primaryButton={{
text: "Marcar Consulta Agora",
href: "tel:+244928978498",
}}
secondaryButton={{
text: "Ver Serviços",
href: "#services",
}}
names={[
"Ana",
"Pedro",
"Maria",
"João",
"Cláudia",
]}
imageSrc="http://img.b2bpic.net/free-photo/portrait-male-working-nurse_23-2150829835.jpg"
/>
</SectionErrorBoundary>
</div>
<>
<HeroSection />
<div id="about" data-section="about">
<SectionErrorBoundary name="about">
<AboutTextSplit
title="Sobre Nós"
descriptions={[
"Localizados na Av. Talatona, em Luanda, somos uma equipa dedicada à saúde oral com o objetivo de oferecer tratamentos personalizados, seguros e eficazes.",
"Combinamos técnicas avançadas com um ambiente relaxante, garantindo que cada visita seja uma experiência positiva e confiável para toda a família.",
]}
/>
</SectionErrorBoundary>
</div>
<AboutSection />
<div id="services" data-section="services">
<SectionErrorBoundary name="services">
<FeaturesBorderGlow
tag="Os Nossos Serviços"
title="Cuidado Completo para o Seu Sorriso"
description="Oferecemos uma gama completa de tratamentos para manter a saúde e beleza dos seus dentes."
features={[
{
icon: CheckCircle,
title: "Limpeza Dentária",
description: "Remoção de tártaro e placa para uma higiene oral profunda.",
},
{
icon: CheckCircle,
title: "Ortodontia",
description: "Alinhamento dentário com aparelhos de última geração.",
},
{
icon: CheckCircle,
title: "Implantes",
description: "Soluções permanentes para repor dentes em falta com máxima naturalidade.",
},
{
icon: CheckCircle,
title: "Branqueamento",
description: "Sorriso mais brilhante com tratamentos estéticos seguros.",
},
{
icon: CheckCircle,
title: "Extracções",
description: "Procedimentos precisos e confortáveis para saúde oral.",
},
{
icon: CheckCircle,
title: "Consultas de Rotina",
description: "Avaliações periódicas para prevenir problemas e manter a saúde.",
},
]}
/>
</SectionErrorBoundary>
</div>
<ServicesSection />
<div id="pricing" data-section="pricing">
<SectionErrorBoundary name="pricing">
<PricingSplitCards
tag="Planos"
title="Investir na sua saúde oral"
description="Preços claros e justos para um serviço de qualidade superior."
plans={[
{
tag: "Rotina",
price: "Consulte",
period: "/consulta",
description: "Check-up completo e limpeza simples.",
primaryButton: {
text: "Marcar",
href: "tel:+244928978498",
},
featuresTitle: "O que inclui",
features: [
"Avaliação",
"Limpeza",
"Radiografia panorâmica",
],
},
{
tag: "Estética",
price: "Consulte",
period: "/tratamento",
description: "Branqueamento e estética avançada.",
primaryButton: {
text: "Marcar",
href: "tel:+244928978498",
},
featuresTitle: "Benefícios",
features: [
"Branqueamento",
"Polimento",
"Avaliação estética",
],
},
]}
/>
</SectionErrorBoundary>
</div>
<PricingSection />
<div id="metrics" data-section="metrics">
<SectionErrorBoundary name="metrics">
<MetricsFeatureCards
tag="Números"
title="Confiança em números"
description="Dados que demonstram o nosso compromisso."
metrics={[
{
value: "+1000",
title: "Pacientes Satisfeitos",
features: [
"Atendimento personalizado",
"Qualidade reconhecida",
],
},
{
value: "10",
title: "Anos de Experiência",
features: [
"Expertise clínica",
"Tecnologia avançada",
],
},
]}
/>
</SectionErrorBoundary>
</div>
<MetricsSection />
<div id="testimonials" data-section="testimonials">
<SectionErrorBoundary name="testimonials">
<TestimonialMarqueeOverlayCards
tag="Testemunhos"
title="O que dizem os nossos pacientes"
description="A confiança dos nossos pacientes é a nossa maior recompensa."
testimonials={[
{
name: "Joana Manuel",
role: "Empresária",
company: "Luanda",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/happy-african-woman-with-golden-earrings_23-2148747982.jpg",
},
{
name: "Carlos Silva",
role: "Advogado",
company: "Luanda",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/handsome-bearded-african-american-businessman-brown-classic-jacket-isolated-dark-background_613910-6597.jpg",
},
{
name: "Maria Pedro",
role: "Professora",
company: "Luanda",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/close-up-smiley-woman-chair_23-2149093346.jpg",
},
{
name: "António Kamba",
role: "Engenheiro",
company: "Luanda",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/female-doctor-having-her-arms-crossed_23-2148525094.jpg",
},
{
name: "Luísa Fernanda",
role: "Estudante",
company: "Luanda",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/young-nurse-feeling-happy-about-good-news-she-has-received-while-working-hospital_637285-4972.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
<TestimonialsSection />
<div id="contact" data-section="contact">
<SectionErrorBoundary name="contact">
<ContactCta
tag="Contacte-nos"
text="Estamos abertos de segunda a sexta, das 8:00 às 19:00. Av. Talatona, Luanda. Ligue agora e marque a sua consulta."
primaryButton={{
text: "Ligar: +244 928 978 498",
href: "tel:+244928978498",
}}
secondaryButton={{
text: "WhatsApp",
href: "https://wa.me/244928978498",
}}
/>
</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="Sobre Nós"
descriptions={[
"Localizados na Av. Talatona, em Luanda, somos uma equipa dedicada à saúde oral com o objetivo de oferecer tratamentos personalizados, seguros e eficazes.",
"Combinamos técnicas avançadas com um ambiente relaxante, garantindo que cada visita seja uma experiência positiva e confiável para toda a família.",
]}
/>
</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="Contacte-nos"
text="Estamos abertos de segunda a sexta, das 8:00 às 19:00. Av. Talatona, Luanda. Ligue agora e marque a sua consulta."
primaryButton={{
text: "Ligar: +244 928 978 498",
href: "tel:+244928978498",
}}
secondaryButton={{
text: "WhatsApp",
href: "https://wa.me/244928978498",
}}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,43 @@
// 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 HeroCenteredLogos from '@/components/sections/hero/HeroCenteredLogos';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function HeroSection(): React.JSX.Element {
return (
<div id="hero" data-section="hero">
<SectionErrorBoundary name="hero">
<HeroCenteredLogos
avatarsSrc={[
"http://img.b2bpic.net/free-photo/bright-shot-beautiful-happy-girl-with-healthy-dark-skin-broad-smile_273609-43673.jpg",
"http://img.b2bpic.net/free-photo/person-putiing-make-up_23-2149224007.jpg",
"http://img.b2bpic.net/free-photo/big-happiness-beautiful-woman_329181-1147.jpg",
"http://img.b2bpic.net/free-photo/specialist-male-doctor-looking-away_23-2148525080.jpg",
"http://img.b2bpic.net/free-photo/smiley-doctor-wearing-white-coat-front-view_23-2149844581.jpg",
]}
avatarText="Junte-se a centenas de sorrisos satisfeitos"
title="O Seu Sorriso, a Nossa Prioridade em Luanda"
description="Clínica Dentária Duilina: excelência em cuidados odontológicos com tecnologia de ponta e um atendimento acolhedor no coração de Talatona."
primaryButton={{
text: "Marcar Consulta Agora",
href: "tel:+244928978498",
}}
secondaryButton={{
text: "Ver Serviços",
href: "#services",
}}
names={[
"Ana",
"Pedro",
"Maria",
"João",
"Cláudia",
]}
imageSrc="http://img.b2bpic.net/free-photo/portrait-male-working-nurse_23-2150829835.jpg"
/>
</SectionErrorBoundary>
</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 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="Números"
title="Confiança em números"
description="Dados que demonstram o nosso compromisso."
metrics={[
{
value: "+1000",
title: "Pacientes Satisfeitos",
features: [
"Atendimento personalizado",
"Qualidade reconhecida",
],
},
{
value: "10",
title: "Anos de Experiência",
features: [
"Expertise clínica",
"Tecnologia avançada",
],
},
]}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,54 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "pricing" section.
import React from 'react';
import PricingSplitCards from '@/components/sections/pricing/PricingSplitCards';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function PricingSection(): React.JSX.Element {
return (
<div id="pricing" data-section="pricing">
<SectionErrorBoundary name="pricing">
<PricingSplitCards
tag="Planos"
title="Investir na sua saúde oral"
description="Preços claros e justos para um serviço de qualidade superior."
plans={[
{
tag: "Rotina",
price: "Consulte",
period: "/consulta",
description: "Check-up completo e limpeza simples.",
primaryButton: {
text: "Marcar",
href: "tel:+244928978498",
},
featuresTitle: "O que inclui",
features: [
"Avaliação",
"Limpeza",
"Radiografia panorâmica",
],
},
{
tag: "Estética",
price: "Consulte",
period: "/tratamento",
description: "Branqueamento e estética avançada.",
primaryButton: {
text: "Marcar",
href: "tel:+244928978498",
},
featuresTitle: "Benefícios",
features: [
"Branqueamento",
"Polimento",
"Avaliação estética",
],
},
]}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,17 @@
// Created by add_section_from_catalog (FeaturesAlternatingSplit).
import React from 'react';
import FeaturesAlternatingSplit from '@/components/sections/features/FeaturesAlternatingSplit';
export default function ServicesSection(): React.JSX.Element {
return (
<div data-webild-section="services" id="services">
<FeaturesAlternatingSplit
items={[{"imageSrc":"https://images.unsplash.com/photo-1580281658626-ee379f3cce93?auto=format&fit=crop&w=800&q=80","title":"Limpeza Dentária","description":"Remoção de tártaro e placa para uma higiene oral profunda."},{"imageSrc":"https://images.unsplash.com/photo-1506869640319-caa1c88ce4af?auto=format&fit=crop&w=800&q=80","title":"Ortodontia","description":"Alinhamento dentário com aparelhos de última geração."},{"description":"Soluções permanentes para repor dentes em falta com máxima naturalidade.","title":"Implantes","imageSrc":"https://images.unsplash.com/photo-1573496359142-b8d87734a5a2?auto=format&fit=crop&w=800&q=80"},{"imageSrc":"https://images.unsplash.com/photo-1531384441138-2736e62e0919?auto=format&fit=crop&w=800&q=80","description":"Sorriso mais brilhante com tratamentos estéticos seguros.","title":"Branqueamento"},{"title":"Extracções","description":"Procedimentos precisos e confortáveis para saúde oral.","imageSrc":"https://images.unsplash.com/photo-1651008376811-b90baee60c1f?auto=format&fit=crop&w=800&q=80"},{"title":"Consultas de Rotina","description":"Avaliações periódicas para prevenir problemas e manter a saúde.","imageSrc":"https://images.unsplash.com/photo-1622253692010-333f2da6031d?auto=format&fit=crop&w=800&q=80"}]}
description="Oferecemos uma gama completa de tratamentos para manter a saúde e beleza dos seus dentes."
tag="Os Nossos Serviços"
title="Cuidado Completo para o Seu Sorriso"
/>
</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="Testemunhos"
title="O que dizem os nossos pacientes"
description="A confiança dos nossos pacientes é a nossa maior recompensa."
testimonials={[
{
name: "Joana Manuel",
role: "Empresária",
company: "Luanda",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/happy-african-woman-with-golden-earrings_23-2148747982.jpg",
},
{
name: "Carlos Silva",
role: "Advogado",
company: "Luanda",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/handsome-bearded-african-american-businessman-brown-classic-jacket-isolated-dark-background_613910-6597.jpg",
},
{
name: "Maria Pedro",
role: "Professora",
company: "Luanda",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/close-up-smiley-woman-chair_23-2149093346.jpg",
},
{
name: "António Kamba",
role: "Engenheiro",
company: "Luanda",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/female-doctor-having-her-arms-crossed_23-2148525094.jpg",
},
{
name: "Luísa Fernanda",
role: "Estudante",
company: "Luanda",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/young-nurse-feeling-happy-about-good-news-she-has-received-while-working-hospital_637285-4972.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
);
}