Merge version_2_1781620726483 into main #2
@@ -1,284 +1,36 @@
|
||||
import AboutMediaOverlay from '@/components/sections/about/AboutMediaOverlay';
|
||||
import ContactCta from '@/components/sections/contact/ContactCta';
|
||||
import FeaturesImageBento from '@/components/sections/features/FeaturesImageBento';
|
||||
import FeaturesTaggedCards from '@/components/sections/features/FeaturesTaggedCards';
|
||||
import HeroOverlayMarquee from '@/components/sections/hero/HeroOverlayMarquee';
|
||||
import MetricsFeatureCards from '@/components/sections/metrics/MetricsFeatureCards';
|
||||
import PricingLayeredCards from '@/components/sections/pricing/PricingLayeredCards';
|
||||
import TestimonialColumnMarqueeCards from '@/components/sections/testimonial/TestimonialColumnMarqueeCards';
|
||||
import { Award, Users, Zap } 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 FeaturesSection from './HomePage/sections/Features';
|
||||
import ProductsSection from './HomePage/sections/Products';
|
||||
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">
|
||||
<HeroOverlayMarquee
|
||||
tag="Jakarta's Premier Academy"
|
||||
title="Master the Art of Coffee"
|
||||
description="Transform your passion into a professional career with hands-on training at BARISTA.ID Academy Jakarta."
|
||||
primaryButton={{
|
||||
text: "Explore Courses",
|
||||
href: "#courses",
|
||||
}}
|
||||
secondaryButton={{
|
||||
text: "Contact Us",
|
||||
href: "#contact",
|
||||
}}
|
||||
items={[
|
||||
{
|
||||
text: "Professional Certification",
|
||||
icon: Award,
|
||||
},
|
||||
{
|
||||
text: "Hands-on Experience",
|
||||
icon: Zap,
|
||||
},
|
||||
{
|
||||
text: "Industry Experts",
|
||||
icon: Users,
|
||||
},
|
||||
]}
|
||||
imageSrc="http://img.b2bpic.net/free-photo/close-up-hand-holding-coffee-cup_23-2148865587.jpg"
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<>
|
||||
<HeroSection />
|
||||
|
||||
<div id="about" data-section="about">
|
||||
<SectionErrorBoundary name="about">
|
||||
<AboutMediaOverlay
|
||||
tag="Our Philosophy"
|
||||
title="Where Passion Meets Craft"
|
||||
description="BARISTA.ID Academy Jakarta provides a unique environment for aspiring baristas to learn the science and art of specialty coffee under the guidance of industry masters."
|
||||
imageSrc="http://img.b2bpic.net/free-photo/cappuccino-bar_23-2147798085.jpg?_wi=1"
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<AboutSection />
|
||||
|
||||
<div id="features" data-section="features">
|
||||
<SectionErrorBoundary name="features">
|
||||
<FeaturesTaggedCards
|
||||
tag="Curriculum"
|
||||
title="Specialized Training Paths"
|
||||
description="We offer comprehensive courses designed for every skill level, from hobbyist to professional barista."
|
||||
items={[
|
||||
{
|
||||
tag: "Beginner",
|
||||
title: "Fundamentals of Coffee",
|
||||
description: "Master extraction basics and machine operation.",
|
||||
primaryButton: {
|
||||
text: "Join Class",
|
||||
href: "#",
|
||||
},
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/close-up-hands-preparing-drink-with-milk_23-2148865605.jpg",
|
||||
},
|
||||
{
|
||||
tag: "Advanced",
|
||||
title: "Latte Art & Design",
|
||||
description: "Perfect your pours with creative techniques.",
|
||||
primaryButton: {
|
||||
text: "Join Class",
|
||||
href: "#",
|
||||
},
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/medium-shot-barista-wearing-mask_23-2148892846.jpg",
|
||||
},
|
||||
{
|
||||
tag: "Pro",
|
||||
title: "Advanced Roasting",
|
||||
description: "Understand bean profiles and complex roasting.",
|
||||
primaryButton: {
|
||||
text: "Join Class",
|
||||
href: "#",
|
||||
},
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/girl-drinking-hot-tea-mulled-wine_329181-5782.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<FeaturesSection />
|
||||
|
||||
<div id="products" data-section="products">
|
||||
<SectionErrorBoundary name="products">
|
||||
<FeaturesImageBento
|
||||
tag="Shop Equipment"
|
||||
title="Professional Tools"
|
||||
description="Essential gear for your coffee journey."
|
||||
items={[
|
||||
{
|
||||
title: "Filter Kits",
|
||||
description: "Manual brewing essentials",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/coffee-maker-machine-table_23-2148937230.jpg",
|
||||
},
|
||||
{
|
||||
title: "Precision Grinders",
|
||||
description: "Professional output",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/antique-coffee-grinder-with-coffee-beans_1232-1356.jpg",
|
||||
},
|
||||
{
|
||||
title: "Milk Frothers",
|
||||
description: "Easy texture",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/cocoa-close-up-picture-womans-hands-pouring-cocoa-into-glass_259150-58656.jpg",
|
||||
},
|
||||
{
|
||||
title: "Leather Aprons",
|
||||
description: "Pro durability",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/side-view-male-making-coffee_23-2148366603.jpg",
|
||||
},
|
||||
{
|
||||
title: "House Beans",
|
||||
description: "Roasted in Jakarta",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/roasted-coffee-beans-coffee-bean-shaped-cookies_114579-6544.jpg",
|
||||
},
|
||||
{
|
||||
title: "Brewing Kits",
|
||||
description: "Complete setup",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/view-process-making-pressed-coffee_23-2149709932.jpg",
|
||||
},
|
||||
{
|
||||
title: "Tampers",
|
||||
description: "Precision extraction",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/ordered-composition-baking-tools_23-2150096552.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<ProductsSection />
|
||||
|
||||
<div id="pricing" data-section="pricing">
|
||||
<SectionErrorBoundary name="pricing">
|
||||
<PricingLayeredCards
|
||||
tag="Our Plans"
|
||||
title="Invest in Your Career"
|
||||
description="Choose a program tailored to your ambition."
|
||||
plans={[
|
||||
{
|
||||
tag: "Standard",
|
||||
price: "Rp 2.500.000",
|
||||
description: "Fundamentals Course",
|
||||
primaryButton: {
|
||||
text: "Enroll",
|
||||
href: "#",
|
||||
},
|
||||
features: [
|
||||
"Machine Basics",
|
||||
"Espresso Science",
|
||||
"Manual Brew",
|
||||
],
|
||||
},
|
||||
{
|
||||
tag: "Elite",
|
||||
price: "Rp 4.500.000",
|
||||
description: "Advanced Professional",
|
||||
primaryButton: {
|
||||
text: "Enroll",
|
||||
href: "#",
|
||||
},
|
||||
features: [
|
||||
"Advanced Latte Art",
|
||||
"Roasting Basics",
|
||||
"Shop Management",
|
||||
],
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<PricingSection />
|
||||
|
||||
<div id="metrics" data-section="metrics">
|
||||
<SectionErrorBoundary name="metrics">
|
||||
<MetricsFeatureCards
|
||||
tag="Our Success"
|
||||
title="Impact in Numbers"
|
||||
description="We are proud of the community we've built in the heart of Jakarta."
|
||||
metrics={[
|
||||
{
|
||||
value: "500+",
|
||||
title: "Certified Graduates",
|
||||
features: [
|
||||
"Success in industry",
|
||||
"High employability",
|
||||
],
|
||||
},
|
||||
{
|
||||
value: "10+",
|
||||
title: "Expert Instructors",
|
||||
features: [
|
||||
"Years of experience",
|
||||
"Award-winning",
|
||||
],
|
||||
},
|
||||
{
|
||||
value: "95%",
|
||||
title: "Job Placement",
|
||||
features: [
|
||||
"Career support",
|
||||
"Networking",
|
||||
],
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<MetricsSection />
|
||||
|
||||
<div id="testimonials" data-section="testimonials">
|
||||
<SectionErrorBoundary name="testimonials">
|
||||
<TestimonialColumnMarqueeCards
|
||||
tag="Testimonials"
|
||||
title="Our Graduate Success"
|
||||
description="Hear from students who built their dream careers with us."
|
||||
testimonials={[
|
||||
{
|
||||
name: "Andi S.",
|
||||
role: "Head Barista",
|
||||
quote: "The academy changed my life. I went from novice to lead barista in months.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/small-business-owner-drinking-coffee_23-2149458139.jpg",
|
||||
},
|
||||
{
|
||||
name: "Budi W.",
|
||||
role: "Cafe Owner",
|
||||
quote: "Practical, hands-on, and industry focused. Best investment ever.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/close-up-portrait-happy-businesswoman-white-blouse-smiling-cheerfully-as-sitting-cafe_197531-23018.jpg",
|
||||
},
|
||||
{
|
||||
name: "Citra L.",
|
||||
role: "Roaster",
|
||||
quote: "The roasting program at BARISTA.ID is unmatched in Jakarta.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/close-up-barista-smelling-coffee_23-2148865616.jpg",
|
||||
},
|
||||
{
|
||||
name: "Deni P.",
|
||||
role: "Junior Barista",
|
||||
quote: "I feel confident at the espresso bar thanks to the instructors here.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/enthusiastic-young-asian-woman-barista-apron-looking-amazed-clap-hands-smiling-standing_1258-199218.jpg",
|
||||
},
|
||||
{
|
||||
name: "Eka M.",
|
||||
role: "Lead Trainer",
|
||||
quote: "Outstanding environment for professional growth in coffee arts.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/young-barista-black-working-suit-with-ingredients-coffee-equipment-brown-coffee-seeds-white_140725-14674.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<TestimonialsSection />
|
||||
|
||||
<div id="contact" data-section="contact">
|
||||
<SectionErrorBoundary name="contact">
|
||||
<ContactCta
|
||||
tag="Enroll Now"
|
||||
text="Start your journey at BARISTA.ID Academy Jakarta today. Limited slots per intake."
|
||||
primaryButton={{
|
||||
text: "Register Now",
|
||||
href: "#",
|
||||
}}
|
||||
secondaryButton={{
|
||||
text: "Contact Support",
|
||||
href: "#",
|
||||
}}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<ContactSection />
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
21
src/pages/HomePage/sections/About.tsx
Normal file
21
src/pages/HomePage/sections/About.tsx
Normal file
@@ -0,0 +1,21 @@
|
||||
// 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 AboutMediaOverlay from '@/components/sections/about/AboutMediaOverlay';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function AboutSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="about" data-section="about">
|
||||
<SectionErrorBoundary name="about">
|
||||
<AboutMediaOverlay
|
||||
tag="Filosofi Kami"
|
||||
title="Tempat Bertemunya Gairah dan Keahlian"
|
||||
description="BARISTA.ID Academy Jakarta menyediakan lingkungan yang unik bagi calon barista untuk mempelajari ilmu dan seni kopi spesialti di bawah bimbingan para ahli industri."
|
||||
imageSrc="http://img.b2bpic.net/free-photo/cappuccino-bar_23-2147798085.jpg?_wi=1"
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
27
src/pages/HomePage/sections/Contact.tsx
Normal file
27
src/pages/HomePage/sections/Contact.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 "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="Enroll Now"
|
||||
text="Start your journey at BARISTA.ID Academy Jakarta today. Limited slots per intake."
|
||||
primaryButton={{
|
||||
text: "Register Now",
|
||||
href: "#",
|
||||
}}
|
||||
secondaryButton={{
|
||||
text: "Contact Support",
|
||||
href: "#",
|
||||
}}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
21
src/pages/HomePage/sections/Features.tsx
Normal file
21
src/pages/HomePage/sections/Features.tsx
Normal file
@@ -0,0 +1,21 @@
|
||||
// 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 FeaturesTaggedCards from '@/components/sections/features/FeaturesTaggedCards';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function FeaturesSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="features" data-section="features">
|
||||
<SectionErrorBoundary name="features">
|
||||
<FeaturesTaggedCards
|
||||
tag="Kurikulum"
|
||||
title="Jalur Pelatihan Khusus"
|
||||
description="Kami menawarkan kursus komprehensif yang dirancang untuk setiap tingkat keahlian, dari penghobi hingga barista profesional."
|
||||
items={[{"description":"Kuasai dasar-dasar ekstraksi dan pengoperasian mesin.","tag":"Pemula","primaryButton":{"text":"Ikuti Kelas","href":"#"},"imageSrc":"http://img.b2bpic.net/free-photo/close-up-hands-preparing-drink-with-milk_23-2148865605.jpg","title":"Dasar-dasar Kopi"},{"title":"Seni & Desain Latte","imageSrc":"http://img.b2bpic.net/free-photo/medium-shot-barista-wearing-mask_23-2148892846.jpg","tag":"Lanjutan","primaryButton":{"text":"Ikuti Kelas","href":"#"},"description":"Sempurnakan tuangan Anda dengan teknik kreatif."},{"title":"Pemanggangan Lanjutan","imageSrc":"http://img.b2bpic.net/free-photo/girl-drinking-hot-tea-mulled-wine_329181-5782.jpg","description":"Pahami profil biji kopi dan pemanggangan kompleks.","tag":"Pro","primaryButton":{"href":"#","text":"Ikuti Kelas"}}]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
53
src/pages/HomePage/sections/Hero.tsx
Normal file
53
src/pages/HomePage/sections/Hero.tsx
Normal file
@@ -0,0 +1,53 @@
|
||||
import { Coffee, Star, Award } from "lucide-react";
|
||||
import Button from "@/components/ui/Button";
|
||||
import TextAnimation from "@/components/ui/TextAnimation";
|
||||
import ImageOrVideo from "@/components/ui/ImageOrVideo";
|
||||
import Tag from "@/components/ui/Tag";
|
||||
|
||||
export default function HeroSection() {
|
||||
return (
|
||||
<div data-webild-section="HeroCentered">
|
||||
<section aria-label="Hero section" className="relative overflow-hidden">
|
||||
<div className="absolute -z-10 w-[600px] h-[600px] rounded-full bg-primary-cta/10 blur-3xl top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2" />
|
||||
|
||||
<div className="flex flex-col items-center gap-8 mx-auto w-content-width text-center">
|
||||
<div className="flex flex-wrap justify-center gap-3">
|
||||
<Tag text="Artisanal Coffee" icon={Coffee} />
|
||||
<Tag text="Expert Baristas" icon={Star} />
|
||||
<Tag text="Certified Academy" icon={Award} />
|
||||
</div>
|
||||
|
||||
<TextAnimation
|
||||
text="BARISTA.ID Academy Jakarta"
|
||||
variant="fade-blur"
|
||||
gradientText={true}
|
||||
tag="h1"
|
||||
className="md:max-w-9/10 text-6xl md:text-7xl lg:text-8xl leading-[1.1] font-bold tracking-tight text-balance"
|
||||
/>
|
||||
|
||||
<TextAnimation
|
||||
text="Master the art of artisanal coffee. Join the premier barista academy in Jakarta and elevate your brewing skills to a professional level."
|
||||
variant="fade-blur"
|
||||
gradientText={false}
|
||||
tag="p"
|
||||
className="md:max-w-7/10 text-lg md:text-xl leading-snug text-muted-foreground text-balance"
|
||||
/>
|
||||
|
||||
<div className="flex flex-wrap justify-center gap-3 mt-2 md:mt-4">
|
||||
<Button text="Explore Courses" href="#courses" variant="primary" />
|
||||
<Button text="About Us" href="#about" variant="secondary" animationDelay={0.1} />
|
||||
</div>
|
||||
|
||||
<div className="w-full mt-8 p-px card rounded-xl overflow-hidden">
|
||||
<div className="relative w-full aspect-video rounded-lg overflow-hidden">
|
||||
<ImageOrVideo
|
||||
imageSrc="http://img.b2bpic.net/free-photo/cappuccino-bar_23-2147798085.jpg?_wi=2"
|
||||
className="absolute inset-0 w-full h-full object-cover"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
46
src/pages/HomePage/sections/Metrics.tsx
Normal file
46
src/pages/HomePage/sections/Metrics.tsx
Normal file
@@ -0,0 +1,46 @@
|
||||
// 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="Our Success"
|
||||
title="Impact in Numbers"
|
||||
description="We are proud of the community we've built in the heart of Jakarta."
|
||||
metrics={[
|
||||
{
|
||||
value: "500+",
|
||||
title: "Certified Graduates",
|
||||
features: [
|
||||
"Success in industry",
|
||||
"High employability",
|
||||
],
|
||||
},
|
||||
{
|
||||
value: "10+",
|
||||
title: "Expert Instructors",
|
||||
features: [
|
||||
"Years of experience",
|
||||
"Award-winning",
|
||||
],
|
||||
},
|
||||
{
|
||||
value: "95%",
|
||||
title: "Job Placement",
|
||||
features: [
|
||||
"Career support",
|
||||
"Networking",
|
||||
],
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
50
src/pages/HomePage/sections/Pricing.tsx
Normal file
50
src/pages/HomePage/sections/Pricing.tsx
Normal file
@@ -0,0 +1,50 @@
|
||||
// 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 PricingLayeredCards from '@/components/sections/pricing/PricingLayeredCards';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function PricingSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="pricing" data-section="pricing">
|
||||
<SectionErrorBoundary name="pricing">
|
||||
<PricingLayeredCards
|
||||
tag="Our Plans"
|
||||
title="Invest in Your Career"
|
||||
description="Choose a program tailored to your ambition."
|
||||
plans={[
|
||||
{
|
||||
tag: "Standard",
|
||||
price: "Rp 2.500.000",
|
||||
description: "Fundamentals Course",
|
||||
primaryButton: {
|
||||
text: "Enroll",
|
||||
href: "#",
|
||||
},
|
||||
features: [
|
||||
"Machine Basics",
|
||||
"Espresso Science",
|
||||
"Manual Brew",
|
||||
],
|
||||
},
|
||||
{
|
||||
tag: "Elite",
|
||||
price: "Rp 4.500.000",
|
||||
description: "Advanced Professional",
|
||||
primaryButton: {
|
||||
text: "Enroll",
|
||||
href: "#",
|
||||
},
|
||||
features: [
|
||||
"Advanced Latte Art",
|
||||
"Roasting Basics",
|
||||
"Shop Management",
|
||||
],
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
57
src/pages/HomePage/sections/Products.tsx
Normal file
57
src/pages/HomePage/sections/Products.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 "products" section.
|
||||
|
||||
import React from 'react';
|
||||
import FeaturesImageBento from '@/components/sections/features/FeaturesImageBento';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function ProductsSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="products" data-section="products">
|
||||
<SectionErrorBoundary name="products">
|
||||
<FeaturesImageBento
|
||||
tag="Shop Equipment"
|
||||
title="Professional Tools"
|
||||
description="Essential gear for your coffee journey."
|
||||
items={[
|
||||
{
|
||||
title: "Filter Kits",
|
||||
description: "Manual brewing essentials",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/coffee-maker-machine-table_23-2148937230.jpg",
|
||||
},
|
||||
{
|
||||
title: "Precision Grinders",
|
||||
description: "Professional output",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/antique-coffee-grinder-with-coffee-beans_1232-1356.jpg",
|
||||
},
|
||||
{
|
||||
title: "Milk Frothers",
|
||||
description: "Easy texture",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/cocoa-close-up-picture-womans-hands-pouring-cocoa-into-glass_259150-58656.jpg",
|
||||
},
|
||||
{
|
||||
title: "Leather Aprons",
|
||||
description: "Pro durability",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/side-view-male-making-coffee_23-2148366603.jpg",
|
||||
},
|
||||
{
|
||||
title: "House Beans",
|
||||
description: "Roasted in Jakarta",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/roasted-coffee-beans-coffee-bean-shaped-cookies_114579-6544.jpg",
|
||||
},
|
||||
{
|
||||
title: "Brewing Kits",
|
||||
description: "Complete setup",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/view-process-making-pressed-coffee_23-2149709932.jpg",
|
||||
},
|
||||
{
|
||||
title: "Tampers",
|
||||
description: "Precision extraction",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/ordered-composition-baking-tools_23-2150096552.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
52
src/pages/HomePage/sections/Testimonials.tsx
Normal file
52
src/pages/HomePage/sections/Testimonials.tsx
Normal file
@@ -0,0 +1,52 @@
|
||||
// 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 TestimonialColumnMarqueeCards from '@/components/sections/testimonial/TestimonialColumnMarqueeCards';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function TestimonialsSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="testimonials" data-section="testimonials">
|
||||
<SectionErrorBoundary name="testimonials">
|
||||
<TestimonialColumnMarqueeCards
|
||||
tag="Testimonials"
|
||||
title="Our Graduate Success"
|
||||
description="Hear from students who built their dream careers with us."
|
||||
testimonials={[
|
||||
{
|
||||
name: "Andi S.",
|
||||
role: "Head Barista",
|
||||
quote: "The academy changed my life. I went from novice to lead barista in months.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/small-business-owner-drinking-coffee_23-2149458139.jpg",
|
||||
},
|
||||
{
|
||||
name: "Budi W.",
|
||||
role: "Cafe Owner",
|
||||
quote: "Practical, hands-on, and industry focused. Best investment ever.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/close-up-portrait-happy-businesswoman-white-blouse-smiling-cheerfully-as-sitting-cafe_197531-23018.jpg",
|
||||
},
|
||||
{
|
||||
name: "Citra L.",
|
||||
role: "Roaster",
|
||||
quote: "The roasting program at BARISTA.ID is unmatched in Jakarta.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/close-up-barista-smelling-coffee_23-2148865616.jpg",
|
||||
},
|
||||
{
|
||||
name: "Deni P.",
|
||||
role: "Junior Barista",
|
||||
quote: "I feel confident at the espresso bar thanks to the instructors here.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/enthusiastic-young-asian-woman-barista-apron-looking-amazed-clap-hands-smiling-standing_1258-199218.jpg",
|
||||
},
|
||||
{
|
||||
name: "Eka M.",
|
||||
role: "Lead Trainer",
|
||||
quote: "Outstanding environment for professional growth in coffee arts.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/young-barista-black-working-suit-with-ingredients-coffee-equipment-brown-coffee-seeds-white_140725-14674.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user