4 Commits

Author SHA1 Message Date
a0bdf02c94 Merge version_2_1781515991120 into main
Merge version_2_1781515991120 into main
2026-06-15 09:44:54 +00:00
kudinDmitriyUp
aeb80e953a Bob AI: Changed navbar to inline layout to show all links horizontal 2026-06-15 09:44:12 +00:00
kudinDmitriyUp
c9c60ba545 Bob AI: Changed navbar to NavbarFloating to show links horizontally 2026-06-15 09:34:04 +00:00
6890a72064 Merge version_1_1781515750776 into main
Merge version_1_1781515750776 into main
2026-06-15 09:30:15 +00:00
10 changed files with 392 additions and 291 deletions

View File

@@ -1,5 +1,5 @@
import FooterSimpleCard from '@/components/sections/footer/FooterSimpleCard';
import NavbarFloatingLogo from '@/components/ui/NavbarFloatingLogo';
import NavbarInline from '@/components/ui/NavbarInline';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
import SiteBackgroundSlot from "@/components/ui/SiteBackgroundSlot";
import { Outlet } from 'react-router-dom';
@@ -34,9 +34,8 @@ export default function Layout() {
<StyleProvider buttonVariant="elastic" siteBackground="floatingGradient" heroBackground="gradientBars">
<SiteBackgroundSlot />
<SectionErrorBoundary name="navbar">
<NavbarFloatingLogo
<NavbarInline
logo="Backdoor Shop & Garage"
logoImageSrc="http://img.b2bpic.net/free-vector/retro-color-skateboarding-labels-logos-stickers-set-emblem-badge-print-extreme-urban-vector-illustration_1284-46314.jpg"
ctaButton={{
text: "Visit Store", href: "#garage"}}
navItems={navItems} />

View File

@@ -1,300 +1,36 @@
import AboutTextSplit from '@/components/sections/about/AboutTextSplit';
import ContactCta from '@/components/sections/contact/ContactCta';
import FeaturesImageBento from '@/components/sections/features/FeaturesImageBento';
import FeaturesRevealCards from '@/components/sections/features/FeaturesRevealCards';
import HeroSplit from '@/components/sections/hero/HeroSplit';
import PricingMediaCards from '@/components/sections/pricing/PricingMediaCards';
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 ManifestoSection from './HomePage/sections/Manifesto';
import CategoriesSection from './HomePage/sections/Categories';
import CommunitySection from './HomePage/sections/Community';
import ProductsSection from './HomePage/sections/Products';
import SocialSection from './HomePage/sections/Social';
import GarageSection from './HomePage/sections/Garage';
import NewsletterSection from './HomePage/sections/Newsletter';
export default function HomePage(): React.JSX.Element {
return (
<>
<div id="hero" data-section="hero">
<SectionErrorBoundary name="hero">
<HeroSplit
tag="Since 2010 · Espinho"
title="Born by the Ocean. Built for the Street."
description="Premium surf, skate, and streetwear. Same-day dispatch and next-day delivery across Portugal."
primaryButton={{
text: "Shop Now",
href: "#products",
}}
secondaryButton={{
text: "Visit the Garage",
href: "#garage",
}}
imageSrc="http://img.b2bpic.net/free-photo/view-skateboard-with-wheels-outdoors_23-2150407572.jpg"
/>
</SectionErrorBoundary>
</div>
<>
<HeroSection />
<div id="manifesto" data-section="manifesto">
<SectionErrorBoundary name="manifesto">
<AboutTextSplit
title="We Are Backdoor"
descriptions={[
"Backdoor isn't just a shop. It's where Espinho's surf and skate community shops, breathes, and builds.",
"We've been moving fast and caring deeply since day one. Our mission is to keep you connected to the waves and the street, with zero compromises.",
]}
/>
</SectionErrorBoundary>
</div>
<ManifestoSection />
<div id="categories" data-section="categories">
<SectionErrorBoundary name="categories">
<FeaturesImageBento
tag="Explore the Collection"
title="Categories Curated for You"
description="From board to asphalt, we curate the best."
items={[
{
title: "Surf",
description: "Hardgoods & wetsuits",
imageSrc: "http://img.b2bpic.net/free-photo/skateboards-stack-with-blue-background_23-2148849208.jpg",
},
{
title: "Skate",
description: "Decks & hardware",
imageSrc: "http://img.b2bpic.net/free-photo/closeup-skateboard-ramp_23-2147678183.jpg",
},
{
title: "Streetwear",
description: "Latest drops",
imageSrc: "http://img.b2bpic.net/free-photo/black-model-posing_23-2148171747.jpg",
},
{
title: "Garage",
description: "Hardware & mods",
imageSrc: "http://img.b2bpic.net/free-photo/man-standing-with-surfboard-sea-shore_23-2148021726.jpg",
},
{
title: "Accessories",
description: "Essential gear",
imageSrc: "http://img.b2bpic.net/free-photo/view-skateboard-with-wheels_23-2150583913.jpg",
},
{
title: "New Arrivals",
description: "Shop fresh",
imageSrc: "http://img.b2bpic.net/free-photo/front-view-friends-taking-selfie-night_23-2150204415.jpg",
},
{
title: "Community",
description: "Join the crew",
imageSrc: "http://img.b2bpic.net/free-photo/shallow-focus-shot-attractive-female-posing-seashore-spain-while-holding-surfboard_181624-31751.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
<CategoriesSection />
<div id="community" data-section="community">
<SectionErrorBoundary name="community">
<FeaturesRevealCards
tag="Why Backdoor"
title="Built for Speed & Trust"
description="We don't just sell, we live the culture."
items={[
{
title: "Expedição no próprio dia",
description: "Enviamos o que compras hoje, ainda hoje.",
imageSrc: "http://img.b2bpic.net/free-photo/business-launching-rocket-ship-icon_53876-71300.jpg",
},
{
title: "Entrega no dia seguinte",
description: "Rápido e sem surpresas na tua morada.",
imageSrc: "http://img.b2bpic.net/free-photo/medium-shot-delivery-guy-with-mask_23-2149035871.jpg",
},
{
title: "Atendimento humano",
description: "Somos reais, prontos para ajudar.",
imageSrc: "http://img.b2bpic.net/free-photo/valentine-day-heart-3d-illustration-design_460848-9092.jpg",
},
{
title: "Coleção curada",
description: "Só as melhores marcas do mercado.",
imageSrc: "http://img.b2bpic.net/free-photo/hearing-sense-telephone-collage_23-2149848102.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
<CommunitySection />
<div id="products" data-section="products">
<SectionErrorBoundary name="products">
<PricingMediaCards
tag="Featured"
title="Shop the Edit"
description="Our most popular gear right now."
plans={[
{
tag: "Surf",
price: "€89",
period: "Equipment",
features: [
"Durable",
"Classic",
],
primaryButton: {
text: "Quick Add",
href: "#",
},
imageSrc: "http://img.b2bpic.net/free-photo/aerial-view-orange-skateboard-ground_53876-42823.jpg",
},
{
tag: "Skate",
price: "€65",
period: "Hardware",
features: [
"Street Ready",
"Fresh",
],
primaryButton: {
text: "Quick Add",
href: "#",
},
imageSrc: "http://img.b2bpic.net/free-photo/girl-sitting-skateboard-skate-park_181624-26453.jpg",
},
{
tag: "Street",
price: "€45",
period: "Apparel",
features: [
"Limited",
"Premium",
],
primaryButton: {
text: "Quick Add",
href: "#",
},
imageSrc: "http://img.b2bpic.net/free-photo/person-keeping-skateboard-edge_23-2147678162.jpg",
},
{
tag: "Surf",
price: "€120",
period: "Technical",
features: [
"Pro Tech",
"Fast",
],
primaryButton: {
text: "Quick Add",
href: "#",
},
imageSrc: "http://img.b2bpic.net/free-photo/stylish-woman-wearing-medical-mask-outside_23-2148777597.jpg",
},
{
tag: "Skate",
price: "€35",
period: "Essentials",
features: [
"Quality",
"Cool",
],
primaryButton: {
text: "Quick Add",
href: "#",
},
imageSrc: "http://img.b2bpic.net/free-photo/stylish-arabian-muslim-boy-with-originally-hair-posed-streets-against-flags-different-countries_627829-3206.jpg",
},
{
tag: "Street",
price: "€55",
period: "Apparel",
features: [
"Graphic",
"Heavy",
],
primaryButton: {
text: "Quick Add",
href: "#",
},
imageSrc: "http://img.b2bpic.net/free-photo/side-view-teenager-with-skateboard-outdoors_23-2148758456.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
<ProductsSection />
<div id="social" data-section="social">
<SectionErrorBoundary name="social">
<TestimonialMarqueeOverlayCards
tag="Feedback"
title="What They Say"
description="Community-driven approval ratings."
testimonials={[
{
name: "Nuno Silva",
role: "Local Surf",
company: "Espinho",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/shallow-focus-shot-attractive-female-holding-surfboard-middle-road-spain_181624-26673.jpg",
},
{
name: "Ana Rita",
role: "Skater",
company: "Porto",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/portrait-happy-pleased-africanamerican-girl-wearing-white-tshirt-showing-okay-signs-praise_1258-131001.jpg",
},
{
name: "Pedro Costa",
role: "Community",
company: "Espinho",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/outdoor-portrait-romantic-woman-with-flying-hair-is-standing-sandy-beach-with-closed-eyes-happy-smile-blue-sky-background_291650-1891.jpg",
},
{
name: "Sara Mendes",
role: "Frequent Shopper",
company: "Lisboa",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/beautiful-african-american-woman-cafe_273609-5292.jpg",
},
{
name: "João Pereira",
role: "Pro Skater",
company: "Vila Nova",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/shy-charming-woman-with-curly-hair-wearing-denim-shirt-listening-music_291650-819.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
<SocialSection />
<div id="garage" data-section="garage">
<SectionErrorBoundary name="garage">
<AboutTextSplit
title="The Garage in Espinho"
descriptions={[
"Come find us. The door is always open. Located in the heart of Espinho, this is where we work and play.",
"Swing by for the latest drops, gear tips, or just to catch up on the local surf forecast.",
]}
primaryButton={{
text: "Directions",
href: "https://maps.google.com",
}}
/>
</SectionErrorBoundary>
</div>
<GarageSection />
<div id="newsletter" data-section="newsletter">
<SectionErrorBoundary name="newsletter">
<ContactCta
tag="Community"
text="Be the first to know. New drops, local events, and no spam."
primaryButton={{
text: "Subscribe",
href: "#",
}}
secondaryButton={{
text: "Contact Us",
href: "#",
}}
/>
</SectionErrorBoundary>
</div>
<NewsletterSection />
</>
);
}

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 "categories" section.
import React from 'react';
import FeaturesImageBento from '@/components/sections/features/FeaturesImageBento';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function CategoriesSection(): React.JSX.Element {
return (
<div id="categories" data-section="categories">
<SectionErrorBoundary name="categories">
<FeaturesImageBento
tag="Explore the Collection"
title="Categories Curated for You"
description="From board to asphalt, we curate the best."
items={[
{
title: "Surf",
description: "Hardgoods & wetsuits",
imageSrc: "http://img.b2bpic.net/free-photo/skateboards-stack-with-blue-background_23-2148849208.jpg",
},
{
title: "Skate",
description: "Decks & hardware",
imageSrc: "http://img.b2bpic.net/free-photo/closeup-skateboard-ramp_23-2147678183.jpg",
},
{
title: "Streetwear",
description: "Latest drops",
imageSrc: "http://img.b2bpic.net/free-photo/black-model-posing_23-2148171747.jpg",
},
{
title: "Garage",
description: "Hardware & mods",
imageSrc: "http://img.b2bpic.net/free-photo/man-standing-with-surfboard-sea-shore_23-2148021726.jpg",
},
{
title: "Accessories",
description: "Essential gear",
imageSrc: "http://img.b2bpic.net/free-photo/view-skateboard-with-wheels_23-2150583913.jpg",
},
{
title: "New Arrivals",
description: "Shop fresh",
imageSrc: "http://img.b2bpic.net/free-photo/front-view-friends-taking-selfie-night_23-2150204415.jpg",
},
{
title: "Community",
description: "Join the crew",
imageSrc: "http://img.b2bpic.net/free-photo/shallow-focus-shot-attractive-female-posing-seashore-spain-while-holding-surfboard_181624-31751.jpg",
},
]}
/>
</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 "community" section.
import React from 'react';
import FeaturesRevealCards from '@/components/sections/features/FeaturesRevealCards';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function CommunitySection(): React.JSX.Element {
return (
<div id="community" data-section="community">
<SectionErrorBoundary name="community">
<FeaturesRevealCards
tag="Why Backdoor"
title="Built for Speed & Trust"
description="We don't just sell, we live the culture."
items={[
{
title: "Expedição no próprio dia",
description: "Enviamos o que compras hoje, ainda hoje.",
imageSrc: "http://img.b2bpic.net/free-photo/business-launching-rocket-ship-icon_53876-71300.jpg",
},
{
title: "Entrega no dia seguinte",
description: "Rápido e sem surpresas na tua morada.",
imageSrc: "http://img.b2bpic.net/free-photo/medium-shot-delivery-guy-with-mask_23-2149035871.jpg",
},
{
title: "Atendimento humano",
description: "Somos reais, prontos para ajudar.",
imageSrc: "http://img.b2bpic.net/free-photo/valentine-day-heart-3d-illustration-design_460848-9092.jpg",
},
{
title: "Coleção curada",
description: "Só as melhores marcas do mercado.",
imageSrc: "http://img.b2bpic.net/free-photo/hearing-sense-telephone-collage_23-2149848102.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,26 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "garage" section.
import React from 'react';
import AboutTextSplit from '@/components/sections/about/AboutTextSplit';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function GarageSection(): React.JSX.Element {
return (
<div id="garage" data-section="garage">
<SectionErrorBoundary name="garage">
<AboutTextSplit
title="The Garage in Espinho"
descriptions={[
"Come find us. The door is always open. Located in the heart of Espinho, this is where we work and play.",
"Swing by for the latest drops, gear tips, or just to catch up on the local surf forecast.",
]}
primaryButton={{
text: "Directions",
href: "https://maps.google.com",
}}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,29 @@
// 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 HeroSplit from '@/components/sections/hero/HeroSplit';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function HeroSection(): React.JSX.Element {
return (
<div id="hero" data-section="hero">
<SectionErrorBoundary name="hero">
<HeroSplit
tag="Since 2010 · Espinho"
title="Born by the Ocean. Built for the Street."
description="Premium surf, skate, and streetwear. Same-day dispatch and next-day delivery across Portugal."
primaryButton={{
text: "Shop Now",
href: "#products",
}}
secondaryButton={{
text: "Visit the Garage",
href: "#garage",
}}
imageSrc="http://img.b2bpic.net/free-photo/view-skateboard-with-wheels-outdoors_23-2150407572.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 "manifesto" section.
import React from 'react';
import AboutTextSplit from '@/components/sections/about/AboutTextSplit';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function ManifestoSection(): React.JSX.Element {
return (
<div id="manifesto" data-section="manifesto">
<SectionErrorBoundary name="manifesto">
<AboutTextSplit
title="We Are Backdoor"
descriptions={[
"Backdoor isn't just a shop. It's where Espinho's surf and skate community shops, breathes, and builds.",
"We've been moving fast and caring deeply since day one. Our mission is to keep you connected to the waves and the street, with zero compromises.",
]}
/>
</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 "newsletter" section.
import React from 'react';
import ContactCta from '@/components/sections/contact/ContactCta';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function NewsletterSection(): React.JSX.Element {
return (
<div id="newsletter" data-section="newsletter">
<SectionErrorBoundary name="newsletter">
<ContactCta
tag="Community"
text="Be the first to know. New drops, local events, and no spam."
primaryButton={{
text: "Subscribe",
href: "#",
}}
secondaryButton={{
text: "Contact Us",
href: "#",
}}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,106 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "products" section.
import React from 'react';
import PricingMediaCards from '@/components/sections/pricing/PricingMediaCards';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function ProductsSection(): React.JSX.Element {
return (
<div id="products" data-section="products">
<SectionErrorBoundary name="products">
<PricingMediaCards
tag="Featured"
title="Shop the Edit"
description="Our most popular gear right now."
plans={[
{
tag: "Surf",
price: "€89",
period: "Equipment",
features: [
"Durable",
"Classic",
],
primaryButton: {
text: "Quick Add",
href: "#",
},
imageSrc: "http://img.b2bpic.net/free-photo/aerial-view-orange-skateboard-ground_53876-42823.jpg",
},
{
tag: "Skate",
price: "€65",
period: "Hardware",
features: [
"Street Ready",
"Fresh",
],
primaryButton: {
text: "Quick Add",
href: "#",
},
imageSrc: "http://img.b2bpic.net/free-photo/girl-sitting-skateboard-skate-park_181624-26453.jpg",
},
{
tag: "Street",
price: "€45",
period: "Apparel",
features: [
"Limited",
"Premium",
],
primaryButton: {
text: "Quick Add",
href: "#",
},
imageSrc: "http://img.b2bpic.net/free-photo/person-keeping-skateboard-edge_23-2147678162.jpg",
},
{
tag: "Surf",
price: "€120",
period: "Technical",
features: [
"Pro Tech",
"Fast",
],
primaryButton: {
text: "Quick Add",
href: "#",
},
imageSrc: "http://img.b2bpic.net/free-photo/stylish-woman-wearing-medical-mask-outside_23-2148777597.jpg",
},
{
tag: "Skate",
price: "€35",
period: "Essentials",
features: [
"Quality",
"Cool",
],
primaryButton: {
text: "Quick Add",
href: "#",
},
imageSrc: "http://img.b2bpic.net/free-photo/stylish-arabian-muslim-boy-with-originally-hair-posed-streets-against-flags-different-countries_627829-3206.jpg",
},
{
tag: "Street",
price: "€55",
period: "Apparel",
features: [
"Graphic",
"Heavy",
],
primaryButton: {
text: "Quick Add",
href: "#",
},
imageSrc: "http://img.b2bpic.net/free-photo/side-view-teenager-with-skateboard-outdoors_23-2148758456.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 "social" section.
import React from 'react';
import TestimonialMarqueeOverlayCards from '@/components/sections/testimonial/TestimonialMarqueeOverlayCards';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function SocialSection(): React.JSX.Element {
return (
<div id="social" data-section="social">
<SectionErrorBoundary name="social">
<TestimonialMarqueeOverlayCards
tag="Feedback"
title="What They Say"
description="Community-driven approval ratings."
testimonials={[
{
name: "Nuno Silva",
role: "Local Surf",
company: "Espinho",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/shallow-focus-shot-attractive-female-holding-surfboard-middle-road-spain_181624-26673.jpg",
},
{
name: "Ana Rita",
role: "Skater",
company: "Porto",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/portrait-happy-pleased-africanamerican-girl-wearing-white-tshirt-showing-okay-signs-praise_1258-131001.jpg",
},
{
name: "Pedro Costa",
role: "Community",
company: "Espinho",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/outdoor-portrait-romantic-woman-with-flying-hair-is-standing-sandy-beach-with-closed-eyes-happy-smile-blue-sky-background_291650-1891.jpg",
},
{
name: "Sara Mendes",
role: "Frequent Shopper",
company: "Lisboa",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/beautiful-african-american-woman-cafe_273609-5292.jpg",
},
{
name: "João Pereira",
role: "Pro Skater",
company: "Vila Nova",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/shy-charming-woman-with-curly-hair-wearing-denim-shirt-listening-music_291650-819.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
);
}