4 Commits

Author SHA1 Message Date
679180f948 Merge version_2_1782489113020 into main
Merge version_2_1782489113020 into main
2026-06-26 15:53:48 +00:00
kudinDmitriyUp
c70a6eb817 Bob AI: Apply premium black and gold theme 2026-06-26 15:53:03 +00:00
3c272801e8 Merge version_1_1782484928432 into main
Merge version_1_1782484928432 into main
2026-06-26 14:58:47 +00:00
0010fd0bf3 Merge version_1_1782484928432 into main
Merge version_1_1782484928432 into main
2026-06-26 14:58:04 +00:00
9 changed files with 285 additions and 196 deletions

View File

@@ -5,15 +5,15 @@
:root {
/* @colorThemes/lightTheme/grayNavyBlue */
--background: #f5faff;
--card: #ffffff;
--foreground: #001122;
--primary-cta: #15479c;
--primary-cta-text: #f5faff;
--background: #111111;
--card: #1a1a1a;
--foreground: #ffffff;
--primary-cta: #d4af37;
--primary-cta-text: #111111;
--secondary-cta: #ffffff;
--secondary-cta-text: #001122;
--accent: #a8cce8;
--background-accent: #7ba3cf;
--secondary-cta-text: #111111;
--accent: #a3a3a3;
--background-accent: #222222;
/* @layout/border-radius/rounded */
--radius: 1.5rem;

View File

@@ -1,199 +1,33 @@
import AboutTestimonial from '@/components/sections/about/AboutTestimonial';
import ContactCta from '@/components/sections/contact/ContactCta';
import FeaturesComparison from '@/components/sections/features/FeaturesComparison';
import FeaturesRevealCardsBento from '@/components/sections/features/FeaturesRevealCardsBento';
import HeroBrand from '@/components/sections/hero/HeroBrand';
import MetricsFeatureCards from '@/components/sections/metrics/MetricsFeatureCards';
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 SobreSection from './HomePage/sections/Sobre';
import MenuSection from './HomePage/sections/Menu';
import GaleriaSection from './HomePage/sections/Galeria';
import AvaliacoesSection from './HomePage/sections/Avaliacoes';
import LocalSection from './HomePage/sections/Local';
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="Saigon Flavours"
description="Autêntica comida vietnamita no coração do Porto. Frescura, tradição e sabores vibrantes à sua mesa."
primaryButton={{
text: "Reservar Mesa",
href: "tel:+351933088259",
}}
secondaryButton={{
text: "Ver Menu",
href: "#menu",
}}
imageSrc="http://img.b2bpic.net/free-photo/seafood-with-sliced-lime_140725-3707.jpg"
/>
</SectionErrorBoundary>
</div>
<>
<HeroSection />
<div id="sobre" data-section="sobre">
<SectionErrorBoundary name="sobre">
<AboutTestimonial
tag="Sobre Nós"
quote="Uma pequena viagem familiar de Hanói até ao Porto. Utilizamos ingredientes frescos e receitas ancestrais para lhe oferecer o sabor real do Vietname."
author="Família Saigon Flavours"
role="Fundadores"
imageSrc="http://img.b2bpic.net/free-photo/young-women-new-york-city-daytime_23-2149488492.jpg"
/>
</SectionErrorBoundary>
</div>
<SobreSection />
<div id="menu" data-section="menu">
<SectionErrorBoundary name="menu">
<FeaturesRevealCardsBento
tag="Menu de Destaques"
title="Sabores Imperdíveis"
description="Do clássico Pho ao Bun Bo, explore os nossos pratos de assinatura."
items={[
{
title: "Pho Bo",
description: "Sopa tradicional aromática com carne de vaca.",
href: "#",
imageSrc: "http://img.b2bpic.net/free-photo/bowl-caesar-salad-served-with-bread-sticks_140725-5979.jpg",
},
{
title: "Bun Bo",
description: "Salada de massa de arroz com carne e ervas.",
href: "#",
imageSrc: "http://img.b2bpic.net/free-photo/delicious-thai-food-still-life_23-2149508968.jpg",
},
{
title: "Spring Rolls",
description: "Rolinhos crocantes com molho especial.",
href: "#",
imageSrc: "http://img.b2bpic.net/free-photo/stir-fried-shrimp-noodles-black-bowl_84443-85686.jpg",
},
{
title: "Grelhados",
description: "Carne grelhada ao estilo vietnamita com arroz.",
href: "#",
imageSrc: "http://img.b2bpic.net/free-photo/healthy-breakfast-buddha-bowl-with-rice-mango-avocado-salmon-fresh-salad-with-tomatoes-avocado-arugula-seeds-salmon-salmon-sandwich-with-avocado-creame-cheese-microgreen-healt_2829-19999.jpg",
},
{
title: "Mango Sticky Rice",
description: "Sobremesa clássica de manga e arroz doce.",
href: "#",
imageSrc: "http://img.b2bpic.net/free-photo/thai-sweet-sticky-rice-with-durian-dessert_1150-23439.jpg",
},
{
title: "Papaya Salad",
description: "Salada fresca de papaia verde crocante.",
href: "#",
imageSrc: "http://img.b2bpic.net/free-photo/bowl-with-salmon-rice-fresh-vegetables-poke-top-view-banner_127032-2416.jpg",
},
{
title: "Café Vietnamita",
description: "Café tradicional com leite condensado.",
href: "#",
imageSrc: "http://img.b2bpic.net/free-photo/cool-breakfast-composition_23-2147658656.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
<MenuSection />
<div id="galeria" data-section="galeria">
<SectionErrorBoundary name="galeria">
<FeaturesComparison
tag="Experiência"
title="Mais que Comida, uma Experiência"
description="O ambiente perfeito para desfrutar da culinária autêntica vietnamita."
negativeItems={[
"Comida industrial",
"Ambiente frio",
"Pressa",
]}
positiveItems={[
"Ingredientes frescos",
"Ambiente acolhedor",
"Tradição familiar",
]}
/>
</SectionErrorBoundary>
</div>
<GaleriaSection />
<div id="avaliacoes" data-section="avaliacoes">
<SectionErrorBoundary name="avaliacoes">
<TestimonialMarqueeCards
tag="Avaliações"
title="O que dizem os nossos clientes (4.7 ⭐ no Google)"
description="Obrigado por nos escolherem como o vosso refúgio asiático no Porto."
testimonials={[
{
name: "Maria Silva",
role: "Cliente Local",
quote: "Melhor Pho que já comi no Porto!",
imageSrc: "http://img.b2bpic.net/free-photo/young-happy-woman-talking-waitress-cafe_637285-8070.jpg",
},
{
name: "John Doe",
role: "Turista",
quote: "Authentic taste and cozy vibes.",
imageSrc: "http://img.b2bpic.net/free-photo/indoor-shot-beautiful-happy-student-girl-blue-sweatshirt-using-wireless-headphones-having-online-examination-sitting-home-people-education-learning-technology-electronic-gadgets_343059-1924.jpg",
},
{
name: "Pedro Costa",
role: "Foodie",
quote: "Ingredientes super frescos, recomendo vivamente.",
imageSrc: "http://img.b2bpic.net/free-photo/front-view-cute-girl-looking-away_23-2148436134.jpg",
},
{
name: "Ana Santos",
role: "Frequente",
quote: "Ambiente fantástico e comida divina.",
imageSrc: "http://img.b2bpic.net/free-photo/high-angle-dining-table-arrangement_23-2150312219.jpg",
},
{
name: "Carlos M.",
role: "Foodie",
quote: "O Bun Bo é simplesmente inesquecível.",
imageSrc: "http://img.b2bpic.net/free-photo/thrilled-confident-manager-business-attire-celebrates-victorious-milestone_482257-111932.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
<AvaliacoesSection />
<div id="local" data-section="local">
<SectionErrorBoundary name="local">
<MetricsFeatureCards
tag="Localização"
title="Visite-nos no Porto"
description="R. de Mouzinho da Silveira 221, 4050-421 Porto."
metrics={[
{
value: "Seg-Dom",
title: "Horários",
features: [
"Seg: 12-16/18-22h30",
"Ter: 12-21h",
"Qua: Fechado",
"Qui-Dom: 12-16/18-22h30",
],
},
]}
/>
</SectionErrorBoundary>
</div>
<LocalSection />
<div id="contact" data-section="contact">
<SectionErrorBoundary name="contact">
<ContactCta
tag="Reservas"
text="Pronto para provar os sabores de Saigon?"
primaryButton={{
text: "WhatsApp",
href: "https://wa.me/351933088259",
}}
secondaryButton={{
text: "Ligar",
href: "tel:+351933088259",
}}
/>
</SectionErrorBoundary>
</div>
<ContactSection />
</>
);
}

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 "avaliacoes" section.
import React from 'react';
import TestimonialMarqueeCards from '@/components/sections/testimonial/TestimonialMarqueeCards';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function AvaliacoesSection(): React.JSX.Element {
return (
<div id="avaliacoes" data-section="avaliacoes">
<SectionErrorBoundary name="avaliacoes">
<TestimonialMarqueeCards
tag="Avaliações"
title="O que dizem os nossos clientes (4.7 ⭐ no Google)"
description="Obrigado por nos escolherem como o vosso refúgio asiático no Porto."
testimonials={[
{
name: "Maria Silva",
role: "Cliente Local",
quote: "Melhor Pho que já comi no Porto!",
imageSrc: "http://img.b2bpic.net/free-photo/young-happy-woman-talking-waitress-cafe_637285-8070.jpg",
},
{
name: "John Doe",
role: "Turista",
quote: "Authentic taste and cozy vibes.",
imageSrc: "http://img.b2bpic.net/free-photo/indoor-shot-beautiful-happy-student-girl-blue-sweatshirt-using-wireless-headphones-having-online-examination-sitting-home-people-education-learning-technology-electronic-gadgets_343059-1924.jpg",
},
{
name: "Pedro Costa",
role: "Foodie",
quote: "Ingredientes super frescos, recomendo vivamente.",
imageSrc: "http://img.b2bpic.net/free-photo/front-view-cute-girl-looking-away_23-2148436134.jpg",
},
{
name: "Ana Santos",
role: "Frequente",
quote: "Ambiente fantástico e comida divina.",
imageSrc: "http://img.b2bpic.net/free-photo/high-angle-dining-table-arrangement_23-2150312219.jpg",
},
{
name: "Carlos M.",
role: "Foodie",
quote: "O Bun Bo é simplesmente inesquecível.",
imageSrc: "http://img.b2bpic.net/free-photo/thrilled-confident-manager-business-attire-celebrates-victorious-milestone_482257-111932.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 "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="Reservas"
text="Pronto para provar os sabores de Saigon?"
primaryButton={{
text: "WhatsApp",
href: "https://wa.me/351933088259",
}}
secondaryButton={{
text: "Ligar",
href: "tel:+351933088259",
}}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,30 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "galeria" section.
import React from 'react';
import FeaturesComparison from '@/components/sections/features/FeaturesComparison';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function GaleriaSection(): React.JSX.Element {
return (
<div id="galeria" data-section="galeria">
<SectionErrorBoundary name="galeria">
<FeaturesComparison
tag="Experiência"
title="Mais que Comida, uma Experiência"
description="O ambiente perfeito para desfrutar da culinária autêntica vietnamita."
negativeItems={[
"Comida industrial",
"Ambiente frio",
"Pressa",
]}
positiveItems={[
"Ingredientes frescos",
"Ambiente acolhedor",
"Tradição familiar",
]}
/>
</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="Saigon Flavours"
description="Autêntica comida vietnamita no coração do Porto. Frescura, tradição e sabores vibrantes à sua mesa."
primaryButton={{
text: "Reservar Mesa",
href: "tel:+351933088259",
}}
secondaryButton={{
text: "Ver Menu",
href: "#menu",
}}
imageSrc="http://img.b2bpic.net/free-photo/seafood-with-sliced-lime_140725-3707.jpg"
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,32 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "local" section.
import React from 'react';
import MetricsFeatureCards from '@/components/sections/metrics/MetricsFeatureCards';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function LocalSection(): React.JSX.Element {
return (
<div id="local" data-section="local">
<SectionErrorBoundary name="local">
<MetricsFeatureCards
tag="Localização"
title="Visite-nos no Porto"
description="R. de Mouzinho da Silveira 221, 4050-421 Porto."
metrics={[
{
value: "Seg-Dom",
title: "Horários",
features: [
"Seg: 12-16/18-22h30",
"Ter: 12-21h",
"Qua: Fechado",
"Qui-Dom: 12-16/18-22h30",
],
},
]}
/>
</SectionErrorBoundary>
</div>
);
}

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="Menu de Destaques"
title="Sabores Imperdíveis"
description="Do clássico Pho ao Bun Bo, explore os nossos pratos de assinatura."
items={[
{
title: "Pho Bo",
description: "Sopa tradicional aromática com carne de vaca.",
href: "#",
imageSrc: "http://img.b2bpic.net/free-photo/bowl-caesar-salad-served-with-bread-sticks_140725-5979.jpg",
},
{
title: "Bun Bo",
description: "Salada de massa de arroz com carne e ervas.",
href: "#",
imageSrc: "http://img.b2bpic.net/free-photo/delicious-thai-food-still-life_23-2149508968.jpg",
},
{
title: "Spring Rolls",
description: "Rolinhos crocantes com molho especial.",
href: "#",
imageSrc: "http://img.b2bpic.net/free-photo/stir-fried-shrimp-noodles-black-bowl_84443-85686.jpg",
},
{
title: "Grelhados",
description: "Carne grelhada ao estilo vietnamita com arroz.",
href: "#",
imageSrc: "http://img.b2bpic.net/free-photo/healthy-breakfast-buddha-bowl-with-rice-mango-avocado-salmon-fresh-salad-with-tomatoes-avocado-arugula-seeds-salmon-salmon-sandwich-with-avocado-creame-cheese-microgreen-healt_2829-19999.jpg",
},
{
title: "Mango Sticky Rice",
description: "Sobremesa clássica de manga e arroz doce.",
href: "#",
imageSrc: "http://img.b2bpic.net/free-photo/thai-sweet-sticky-rice-with-durian-dessert_1150-23439.jpg",
},
{
title: "Papaya Salad",
description: "Salada fresca de papaia verde crocante.",
href: "#",
imageSrc: "http://img.b2bpic.net/free-photo/bowl-with-salmon-rice-fresh-vegetables-poke-top-view-banner_127032-2416.jpg",
},
{
title: "Café Vietnamita",
description: "Café tradicional com leite condensado.",
href: "#",
imageSrc: "http://img.b2bpic.net/free-photo/cool-breakfast-composition_23-2147658656.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
);
}

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 "sobre" section.
import React from 'react';
import AboutTestimonial from '@/components/sections/about/AboutTestimonial';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function SobreSection(): React.JSX.Element {
return (
<div id="sobre" data-section="sobre">
<SectionErrorBoundary name="sobre">
<AboutTestimonial
tag="Sobre Nós"
quote="Uma pequena viagem familiar de Hanói até ao Porto. Utilizamos ingredientes frescos e receitas ancestrais para lhe oferecer o sabor real do Vietname."
author="Família Saigon Flavours"
role="Fundadores"
imageSrc="http://img.b2bpic.net/free-photo/young-women-new-york-city-daytime_23-2149488492.jpg"
/>
</SectionErrorBoundary>
</div>
);
}