Compare commits
4 Commits
version_1_
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| a0bdf02c94 | |||
|
|
aeb80e953a | ||
|
|
c9c60ba545 | ||
| 6890a72064 |
@@ -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} />
|
||||
|
||||
@@ -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 />
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
57
src/pages/HomePage/sections/Categories.tsx
Normal file
57
src/pages/HomePage/sections/Categories.tsx
Normal 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>
|
||||
);
|
||||
}
|
||||
42
src/pages/HomePage/sections/Community.tsx
Normal file
42
src/pages/HomePage/sections/Community.tsx
Normal 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>
|
||||
);
|
||||
}
|
||||
26
src/pages/HomePage/sections/Garage.tsx
Normal file
26
src/pages/HomePage/sections/Garage.tsx
Normal 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>
|
||||
);
|
||||
}
|
||||
29
src/pages/HomePage/sections/Hero.tsx
Normal file
29
src/pages/HomePage/sections/Hero.tsx
Normal 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>
|
||||
);
|
||||
}
|
||||
22
src/pages/HomePage/sections/Manifesto.tsx
Normal file
22
src/pages/HomePage/sections/Manifesto.tsx
Normal 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>
|
||||
);
|
||||
}
|
||||
27
src/pages/HomePage/sections/Newsletter.tsx
Normal file
27
src/pages/HomePage/sections/Newsletter.tsx
Normal 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>
|
||||
);
|
||||
}
|
||||
106
src/pages/HomePage/sections/Products.tsx
Normal file
106
src/pages/HomePage/sections/Products.tsx
Normal 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>
|
||||
);
|
||||
}
|
||||
57
src/pages/HomePage/sections/Social.tsx
Normal file
57
src/pages/HomePage/sections/Social.tsx
Normal 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>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user